oc-codex-multi-auth 6.19.0 → 6.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +15 -12
  2. package/config/README.md +8 -8
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +473 -145
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/account-display.d.ts.map +1 -1
  7. package/dist/lib/account-display.js +3 -1
  8. package/dist/lib/account-display.js.map +1 -1
  9. package/dist/lib/accounts/persistence.d.ts +25 -1
  10. package/dist/lib/accounts/persistence.d.ts.map +1 -1
  11. package/dist/lib/accounts/persistence.js +105 -2
  12. package/dist/lib/accounts/persistence.js.map +1 -1
  13. package/dist/lib/accounts/rate-limits.d.ts +22 -0
  14. package/dist/lib/accounts/rate-limits.d.ts.map +1 -1
  15. package/dist/lib/accounts/rate-limits.js +25 -0
  16. package/dist/lib/accounts/rate-limits.js.map +1 -1
  17. package/dist/lib/accounts/rotation.d.ts +22 -23
  18. package/dist/lib/accounts/rotation.d.ts.map +1 -1
  19. package/dist/lib/accounts/rotation.js +62 -37
  20. package/dist/lib/accounts/rotation.js.map +1 -1
  21. package/dist/lib/accounts/stale-state.d.ts +32 -0
  22. package/dist/lib/accounts/stale-state.d.ts.map +1 -1
  23. package/dist/lib/accounts/stale-state.js +86 -1
  24. package/dist/lib/accounts/stale-state.js.map +1 -1
  25. package/dist/lib/accounts/state.d.ts +6 -0
  26. package/dist/lib/accounts/state.d.ts.map +1 -1
  27. package/dist/lib/accounts/state.js +15 -1
  28. package/dist/lib/accounts/state.js.map +1 -1
  29. package/dist/lib/accounts/warm-recovery.d.ts +8 -0
  30. package/dist/lib/accounts/warm-recovery.d.ts.map +1 -0
  31. package/dist/lib/accounts/warm-recovery.js +70 -0
  32. package/dist/lib/accounts/warm-recovery.js.map +1 -0
  33. package/dist/lib/accounts/warm-request.d.ts +2 -0
  34. package/dist/lib/accounts/warm-request.d.ts.map +1 -1
  35. package/dist/lib/accounts/warm-request.js +4 -2
  36. package/dist/lib/accounts/warm-request.js.map +1 -1
  37. package/dist/lib/accounts.d.ts +1 -1
  38. package/dist/lib/accounts.d.ts.map +1 -1
  39. package/dist/lib/accounts.js +2 -2
  40. package/dist/lib/accounts.js.map +1 -1
  41. package/dist/lib/auth/login-runner.d.ts +3 -0
  42. package/dist/lib/auth/login-runner.d.ts.map +1 -1
  43. package/dist/lib/auth/login-runner.js +35 -0
  44. package/dist/lib/auth/login-runner.js.map +1 -1
  45. package/dist/lib/circuit-breaker.d.ts +5 -0
  46. package/dist/lib/circuit-breaker.d.ts.map +1 -1
  47. package/dist/lib/circuit-breaker.js +23 -6
  48. package/dist/lib/circuit-breaker.js.map +1 -1
  49. package/dist/lib/codex-reset.d.ts +7 -1
  50. package/dist/lib/codex-reset.d.ts.map +1 -1
  51. package/dist/lib/codex-reset.js +9 -2
  52. package/dist/lib/codex-reset.js.map +1 -1
  53. package/dist/lib/codex-usage.d.ts +16 -6
  54. package/dist/lib/codex-usage.d.ts.map +1 -1
  55. package/dist/lib/codex-usage.js +68 -23
  56. package/dist/lib/codex-usage.js.map +1 -1
  57. package/dist/lib/config.d.ts +2 -1
  58. package/dist/lib/config.d.ts.map +1 -1
  59. package/dist/lib/config.js +38 -14
  60. package/dist/lib/config.js.map +1 -1
  61. package/dist/lib/parallel-probe.d.ts.map +1 -1
  62. package/dist/lib/parallel-probe.js +5 -2
  63. package/dist/lib/parallel-probe.js.map +1 -1
  64. package/dist/lib/quota-notifications.d.ts.map +1 -1
  65. package/dist/lib/quota-notifications.js +10 -1
  66. package/dist/lib/quota-notifications.js.map +1 -1
  67. package/dist/lib/request/fetch-helpers.d.ts +24 -0
  68. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  69. package/dist/lib/request/fetch-helpers.js +88 -38
  70. package/dist/lib/request/fetch-helpers.js.map +1 -1
  71. package/dist/lib/request/response-handler.d.ts.map +1 -1
  72. package/dist/lib/request/response-handler.js +85 -43
  73. package/dist/lib/request/response-handler.js.map +1 -1
  74. package/dist/lib/rotation.d.ts +1 -1
  75. package/dist/lib/schemas.d.ts +9 -0
  76. package/dist/lib/schemas.d.ts.map +1 -1
  77. package/dist/lib/schemas.js +3 -0
  78. package/dist/lib/schemas.js.map +1 -1
  79. package/dist/lib/storage/flagged.d.ts.map +1 -1
  80. package/dist/lib/storage/flagged.js +5 -0
  81. package/dist/lib/storage/flagged.js.map +1 -1
  82. package/dist/lib/storage/load-save.d.ts +1 -0
  83. package/dist/lib/storage/load-save.d.ts.map +1 -1
  84. package/dist/lib/storage/load-save.js +11 -0
  85. package/dist/lib/storage/load-save.js.map +1 -1
  86. package/dist/lib/storage/migrations.d.ts +21 -0
  87. package/dist/lib/storage/migrations.d.ts.map +1 -1
  88. package/dist/lib/storage/migrations.js.map +1 -1
  89. package/dist/lib/storage/normalize.d.ts.map +1 -1
  90. package/dist/lib/storage/normalize.js +93 -1
  91. package/dist/lib/storage/normalize.js.map +1 -1
  92. package/dist/lib/storage/state.d.ts +1 -0
  93. package/dist/lib/storage/state.d.ts.map +1 -1
  94. package/dist/lib/storage/state.js +12 -0
  95. package/dist/lib/storage/state.js.map +1 -1
  96. package/dist/lib/tools/codex-doctor.d.ts.map +1 -1
  97. package/dist/lib/tools/codex-doctor.js +8 -66
  98. package/dist/lib/tools/codex-doctor.js.map +1 -1
  99. package/dist/lib/tools/codex-health.d.ts.map +1 -1
  100. package/dist/lib/tools/codex-health.js +7 -1
  101. package/dist/lib/tools/codex-health.js.map +1 -1
  102. package/dist/lib/tools/codex-limits.d.ts.map +1 -1
  103. package/dist/lib/tools/codex-limits.js +13 -1
  104. package/dist/lib/tools/codex-limits.js.map +1 -1
  105. package/dist/lib/tools/codex-list.d.ts.map +1 -1
  106. package/dist/lib/tools/codex-list.js +14 -1
  107. package/dist/lib/tools/codex-list.js.map +1 -1
  108. package/dist/lib/tools/codex-reset.d.ts.map +1 -1
  109. package/dist/lib/tools/codex-reset.js +40 -1
  110. package/dist/lib/tools/codex-reset.js.map +1 -1
  111. package/dist/lib/tools/codex-status.d.ts.map +1 -1
  112. package/dist/lib/tools/codex-status.js +6 -1
  113. package/dist/lib/tools/codex-status.js.map +1 -1
  114. package/dist/lib/tools/codex-warm.d.ts +2 -1
  115. package/dist/lib/tools/codex-warm.d.ts.map +1 -1
  116. package/dist/lib/tools/codex-warm.js +48 -5
  117. package/dist/lib/tools/codex-warm.js.map +1 -1
  118. package/dist/lib/tools/doctor-repair.d.ts +10 -0
  119. package/dist/lib/tools/doctor-repair.d.ts.map +1 -0
  120. package/dist/lib/tools/doctor-repair.js +86 -0
  121. package/dist/lib/tools/doctor-repair.js.map +1 -0
  122. package/dist/lib/tools/index.d.ts +4 -1
  123. package/dist/lib/tools/index.d.ts.map +1 -1
  124. package/dist/lib/tools/index.js.map +1 -1
  125. package/dist/lib/tui-quota-cache.d.ts.map +1 -1
  126. package/dist/lib/tui-quota-cache.js +3 -1
  127. package/dist/lib/tui-quota-cache.js.map +1 -1
  128. package/dist/tui.d.ts +4 -1
  129. package/dist/tui.d.ts.map +1 -1
  130. package/dist/tui.js +24 -14
  131. package/dist/tui.js.map +1 -1
  132. package/package.json +1 -1
  133. package/scripts/install-oc-codex-multi-auth-core.js +168 -11
@@ -1 +1 @@
1
- {"version":3,"file":"account-display.js","sourceRoot":"","sources":["../../lib/account-display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC5D,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IACjC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,GAAG,MAAM,MAAM,MAAM,EAAE,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAyB,EACzB,SAAkB;IAElB,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"account-display.js","sourceRoot":"","sources":["../../lib/account-display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC5D,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IACjC,qEAAqE;IACrE,wDAAwD;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,GAAG,MAAM,MAAM,MAAM,EAAE,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAyB,EACzB,SAAkB;IAElB,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3D,CAAC"}
@@ -6,6 +6,7 @@
6
6
  * *lifecycle* (when to save, how to flush before exit, how to dispose the
7
7
  * shutdown hook) rather than the serialization shape itself.
8
8
  */
9
+ import { type AccountMetadataV3 } from "../storage.js";
9
10
  import type { AccountState } from "./state.js";
10
11
  export declare class AccountPersistence {
11
12
  private readonly state;
@@ -18,6 +19,7 @@ export declare class AccountPersistence {
18
19
  * further write degrades to {@link mergeVolatileState}.
19
20
  */
20
21
  private disposed;
22
+ private externalReloadSnapshot?;
21
23
  constructor(state: AccountState);
22
24
  saveToDisk(): Promise<void>;
23
25
  /**
@@ -35,6 +37,28 @@ export declare class AccountPersistence {
35
37
  * self-correcting from the next response's quota headers.
36
38
  */
37
39
  private mergeVolatileState;
40
+ /**
41
+ * Keep a `codex-doctor --fix` quota-stamp clear that landed on disk after
42
+ * this process loaded its snapshot.
43
+ *
44
+ * The #218 monotonic merge is one-directional by design: it adopts longer
45
+ * stamps so a stale process cannot wipe out a fresh week-long block, but
46
+ * that same direction resurrects a stamp a doctor verification just
47
+ * cleared — this process still holds the stamp in memory and writes it
48
+ * back verbatim on its next save. The doctor clear cannot distinguish
49
+ * "stale snapshot" from "new evidence" through values alone, so it dates
50
+ * its clear (`quotaExhaustedClearedAt`) and every authoritative stamp
51
+ * write dates itself (`quotaExhaustedStampAt`). A stamp at least as old
52
+ * as the clear stays cleared; a newer stamp (real 429/poller evidence
53
+ * recorded after the clear) wins and is kept.
54
+ *
55
+ * Stamps without provenance (`quotaExhaustedStampAt` undefined — written
56
+ * by pre-upgrade builds or hand-edited files) are treated as predating
57
+ * the clear, so the tombstone stays effective across mixed-version pools.
58
+ * The cost of a wrongly-suppressed legacy stamp is one upstream 429 that
59
+ * immediately re-stamps the account.
60
+ */
61
+ private applyDiskQuotaClearTombstones;
38
62
  /**
39
63
  * Merges still-active rate-limit blocks from `disk` into `outgoing`, keeping
40
64
  * whichever block runs longer per quota key.
@@ -110,6 +134,6 @@ export declare class AccountPersistence {
110
134
  * it clears its own slot when it runs, so a manager whose shutdown flush has
111
135
  * already fired must still be marked here.
112
136
  */
113
- disposeShutdownHandler(): void;
137
+ disposeShutdownHandler(externalReload?: boolean, clearedSnapshots?: readonly AccountMetadataV3[]): void;
114
138
  }
115
139
  //# sourceMappingURL=persistence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../lib/accounts/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,qBAAa,kBAAkB;IAWlB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAVlC,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,eAAe,CAAsC;IAC7D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAS;gBAEI,KAAK,EAAE,YAAY;IAE1C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2EjC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IA+C1B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,yBAAyB;IAkCjC;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAuDjC;;;;;;;;OAQG;IACH,mBAAmB,CAAC,OAAO,SAAM,GAAG,IAAI;IA0BlC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvC;;;;;;OAMG;IACH,OAAO,CAAC,6BAA6B;IAoCrC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,sBAAsB,IAAI,IAAI;CAM9B"}
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../lib/accounts/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAEN,KAAK,iBAAiB,EAEtB,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,qBAAa,kBAAkB;IAalB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAZlC,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,eAAe,CAAsC;IAC7D;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,sBAAsB,CAAC,CACiE;gBAEnE,KAAK,EAAE,YAAY;IAE1C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+EjC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IAyE1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,6BAA6B;IA2BrC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,yBAAyB;IAoDjC;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAuDjC;;;;;;;;OAQG;IACH,mBAAmB,CAAC,OAAO,SAAM,GAAG,IAAI;IA0BlC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvC;;;;;;OAMG;IACH,OAAO,CAAC,6BAA6B;IAoCrC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,sBAAsB,CAAC,cAAc,UAAQ,EAAE,gBAAgB,CAAC,EAAE,SAAS,iBAAiB,EAAE,GAAG,IAAI;CAsBrG"}
@@ -30,6 +30,7 @@ export class AccountPersistence {
30
30
  * further write degrades to {@link mergeVolatileState}.
31
31
  */
32
32
  disposed = false;
33
+ externalReloadSnapshot;
33
34
  constructor(state) {
34
35
  this.state = state;
35
36
  }
@@ -67,6 +68,9 @@ export class AccountPersistence {
67
68
  rateLimitResetTimes: Object.keys(account.rateLimitResetTimes).length > 0
68
69
  ? { ...account.rateLimitResetTimes }
69
70
  : undefined,
71
+ quotaExhaustedUntil: account.quotaExhaustedUntil,
72
+ quotaExhaustedStampAt: account.quotaExhaustedStampAt,
73
+ quotaExhaustedClearedAt: account.quotaExhaustedClearedAt,
70
74
  coolingDownUntil: account.coolingDownUntil,
71
75
  cooldownReason: account.cooldownReason,
72
76
  })),
@@ -98,6 +102,7 @@ export class AccountPersistence {
98
102
  // ids the refresh token participates in the identity key, and
99
103
  // adopting a rotated token would change which disk record this
100
104
  // account matches.
105
+ this.applyDiskQuotaClearTombstones(storage, current);
101
106
  this.adoptLongerDiskRateLimits(storage, current);
102
107
  this.adoptNewerDiskCredentials(storage, current);
103
108
  }
@@ -130,12 +135,15 @@ export class AccountPersistence {
130
135
  const mine = mineByIdentity.get(getWorkspaceIdentityKey(record));
131
136
  if (!mine)
132
137
  return record;
138
+ const superseded = this.externalReloadSnapshot?.get(getWorkspaceIdentityKey(record));
133
139
  const merged = { ...record };
134
140
  // Longest-block-wins per quota key, matching adoptLongerDiskRateLimits.
135
141
  // Only blocks still in the future are carried, so an entry this
136
142
  // manager never pruned cannot resurrect an expired block.
137
143
  let resets;
138
144
  for (const [key, mineReset] of Object.entries(mine.rateLimitResetTimes ?? {})) {
145
+ if (superseded && mineReset === superseded.rateLimitResetTimes?.[key])
146
+ continue;
139
147
  if (typeof mineReset !== "number" || !Number.isFinite(mineReset) || mineReset <= now) {
140
148
  continue;
141
149
  }
@@ -146,12 +154,32 @@ export class AccountPersistence {
146
154
  }
147
155
  if (resets)
148
156
  merged.rateLimitResetTimes = resets;
149
- if (typeof mine.coolingDownUntil === "number" &&
157
+ if ((!superseded || mine.coolingDownUntil !== superseded.coolingDownUntil) &&
158
+ typeof mine.coolingDownUntil === "number" &&
150
159
  mine.coolingDownUntil > now &&
151
160
  mine.coolingDownUntil > (record.coolingDownUntil ?? 0)) {
152
161
  merged.coolingDownUntil = mine.coolingDownUntil;
153
162
  merged.cooldownReason = mine.cooldownReason;
154
163
  }
164
+ // Account-wide quota exhaustion is monotonic like the per-family
165
+ // blocks: keep whichever side's stamp runs longer. A doctor-clear
166
+ // tombstone on the disk record outranks a snapshot stamp that was
167
+ // not written after the clear (see applyDiskQuotaClearTombstones);
168
+ // a stamp that IS newer displaces the tombstone.
169
+ const diskClearedAt = record.quotaExhaustedClearedAt;
170
+ const mineStampIsNewerThanClear = typeof diskClearedAt !== "number" ||
171
+ (typeof mine.quotaExhaustedStampAt === "number" &&
172
+ mine.quotaExhaustedStampAt > diskClearedAt);
173
+ if ((!superseded || mine.quotaExhaustedUntil !== superseded.quotaExhaustedUntil ||
174
+ mine.quotaExhaustedStampAt !== superseded.quotaExhaustedStampAt) &&
175
+ typeof mine.quotaExhaustedUntil === "number" &&
176
+ mine.quotaExhaustedUntil > now &&
177
+ mine.quotaExhaustedUntil > (record.quotaExhaustedUntil ?? 0) &&
178
+ mineStampIsNewerThanClear) {
179
+ merged.quotaExhaustedUntil = mine.quotaExhaustedUntil;
180
+ merged.quotaExhaustedStampAt = mine.quotaExhaustedStampAt;
181
+ delete merged.quotaExhaustedClearedAt;
182
+ }
155
183
  if (typeof mine.lastUsed === "number" && mine.lastUsed > (record.lastUsed ?? 0)) {
156
184
  merged.lastUsed = mine.lastUsed;
157
185
  merged.lastSwitchReason = mine.lastSwitchReason ?? record.lastSwitchReason;
@@ -160,6 +188,49 @@ export class AccountPersistence {
160
188
  }),
161
189
  };
162
190
  }
191
+ /**
192
+ * Keep a `codex-doctor --fix` quota-stamp clear that landed on disk after
193
+ * this process loaded its snapshot.
194
+ *
195
+ * The #218 monotonic merge is one-directional by design: it adopts longer
196
+ * stamps so a stale process cannot wipe out a fresh week-long block, but
197
+ * that same direction resurrects a stamp a doctor verification just
198
+ * cleared — this process still holds the stamp in memory and writes it
199
+ * back verbatim on its next save. The doctor clear cannot distinguish
200
+ * "stale snapshot" from "new evidence" through values alone, so it dates
201
+ * its clear (`quotaExhaustedClearedAt`) and every authoritative stamp
202
+ * write dates itself (`quotaExhaustedStampAt`). A stamp at least as old
203
+ * as the clear stays cleared; a newer stamp (real 429/poller evidence
204
+ * recorded after the clear) wins and is kept.
205
+ *
206
+ * Stamps without provenance (`quotaExhaustedStampAt` undefined — written
207
+ * by pre-upgrade builds or hand-edited files) are treated as predating
208
+ * the clear, so the tombstone stays effective across mixed-version pools.
209
+ * The cost of a wrongly-suppressed legacy stamp is one upstream 429 that
210
+ * immediately re-stamps the account.
211
+ */
212
+ applyDiskQuotaClearTombstones(outgoing, disk) {
213
+ const diskByIdentity = new Map();
214
+ for (const record of disk.accounts) {
215
+ diskByIdentity.set(getWorkspaceIdentityKey(record), record);
216
+ }
217
+ for (const mine of outgoing.accounts) {
218
+ if (!mine)
219
+ continue;
220
+ const theirs = diskByIdentity.get(getWorkspaceIdentityKey(mine));
221
+ const clearedAt = theirs?.quotaExhaustedClearedAt;
222
+ if (typeof clearedAt !== "number" ||
223
+ !Number.isFinite(clearedAt) ||
224
+ mine.quotaExhaustedUntil === undefined) {
225
+ continue;
226
+ }
227
+ if ((mine.quotaExhaustedStampAt ?? 0) > clearedAt)
228
+ continue;
229
+ delete mine.quotaExhaustedUntil;
230
+ delete mine.quotaExhaustedStampAt;
231
+ mine.quotaExhaustedClearedAt = clearedAt;
232
+ }
233
+ }
163
234
  /**
164
235
  * Merges still-active rate-limit blocks from `disk` into `outgoing`, keeping
165
236
  * whichever block runs longer per quota key.
@@ -190,6 +261,21 @@ export class AccountPersistence {
190
261
  if (!mine)
191
262
  continue;
192
263
  const theirs = diskByIdentity.get(getWorkspaceIdentityKey(mine));
264
+ // Adopt a longer on-disk quota-exhaustion stamp for the same reason the
265
+ // per-family blocks below are adopted (#218): a second process may have
266
+ // recorded a week-long block after this one loaded. Handled before the
267
+ // `theirResets` guard so a disk record carrying only a quota stamp is
268
+ // not skipped. The stamp's provenance travels with it, and a freshly
269
+ // adopted stamp displaces any tombstone (stamp writers never set both).
270
+ const theirQuota = theirs?.quotaExhaustedUntil;
271
+ if (typeof theirQuota === "number" &&
272
+ Number.isFinite(theirQuota) &&
273
+ theirQuota > now &&
274
+ theirQuota > (mine.quotaExhaustedUntil ?? 0)) {
275
+ mine.quotaExhaustedUntil = theirQuota;
276
+ mine.quotaExhaustedStampAt = theirs?.quotaExhaustedStampAt;
277
+ delete mine.quotaExhaustedClearedAt;
278
+ }
193
279
  const theirResets = theirs?.rateLimitResetTimes;
194
280
  if (!theirResets)
195
281
  continue;
@@ -378,7 +464,24 @@ export class AccountPersistence {
378
464
  * it clears its own slot when it runs, so a manager whose shutdown flush has
379
465
  * already fired must still be marked here.
380
466
  */
381
- disposeShutdownHandler() {
467
+ disposeShutdownHandler(externalReload = false, clearedSnapshots) {
468
+ if (clearedSnapshots) {
469
+ this.externalReloadSnapshot = new Map(clearedSnapshots.map((account) => [
470
+ getWorkspaceIdentityKey(account),
471
+ { ...account, rateLimitResetTimes: { ...account.rateLimitResetTimes } },
472
+ ]));
473
+ }
474
+ if (externalReload) {
475
+ // Only evidence acquired after an external reload may be saved by an
476
+ // in-flight request holding this superseded manager.
477
+ this.externalReloadSnapshot = new Map(this.state.accounts.map((account) => [
478
+ getWorkspaceIdentityKey(account),
479
+ { ...account, rateLimitResetTimes: { ...account.rateLimitResetTimes } },
480
+ ]));
481
+ if (this.saveDebounceTimer)
482
+ clearTimeout(this.saveDebounceTimer);
483
+ this.saveDebounceTimer = null;
484
+ }
382
485
  this.disposed = true;
383
486
  if (!this.shutdownHandler)
384
487
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../lib/accounts/persistence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../lib/accounts/persistence.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,28 @@ export interface RateLimitedEntity {
16
16
  rateLimitResetTimes: RateLimitState;
17
17
  }
18
18
  export declare function clearExpiredRateLimits(entity: RateLimitedEntity): void;
19
+ export interface QuotaExhaustibleEntity {
20
+ /** Ms epoch until which this account's shared subscription quota is spent. */
21
+ quotaExhaustedUntil?: number;
22
+ /** When the stamp was written; see AccountMetadataV3. */
23
+ quotaExhaustedStampAt?: number;
24
+ }
25
+ /**
26
+ * Whether an account's shared subscription quota is currently spent.
27
+ *
28
+ * This is an ACCOUNT-WIDE block sourced from the `/wham/usage`
29
+ * primary/secondary window, deliberately distinct from the per-family /
30
+ * per-model transient blocks tracked in {@link RateLimitState}. Read sites
31
+ * report it separately so a 30-second 429 is never conflated with a week-long
32
+ * subscription-quota exhaustion.
33
+ */
34
+ export declare function isQuotaExhausted(entity: QuotaExhaustibleEntity, now?: number): boolean;
35
+ /**
36
+ * Drop an elapsed (or non-finite) quota-exhaustion stamp so it does not leak
37
+ * into snapshots or persistence, mirroring {@link clearExpiredRateLimits} for
38
+ * the per-family map.
39
+ */
40
+ export declare function clearExpiredQuotaExhaustion(entity: QuotaExhaustibleEntity, now?: number): void;
19
41
  export declare function isRateLimitedForQuotaKey(entity: RateLimitedEntity, key: QuotaKey): boolean;
20
42
  export declare function isRateLimitedForFamily(entity: RateLimitedEntity, family: ModelFamily, model?: string | null): boolean;
21
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limits.d.ts","sourceRoot":"","sources":["../../../lib/accounts/rate-limits.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC;AACvC,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,GAAG,YAAY,IAAI,MAAM,EAAE,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;AAE5E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAO9E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAKhF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED,MAAM,WAAW,cAAc;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IACjC,mBAAmB,EAAE,cAAc,CAAC;CACpC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAStE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAG1F;AAED,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAYT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAUjD"}
1
+ {"version":3,"file":"rate-limits.d.ts","sourceRoot":"","sources":["../../../lib/accounts/rate-limits.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC;AACvC,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,GAAG,YAAY,IAAI,MAAM,EAAE,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;AAE5E,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAO9E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,CAKhF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED,MAAM,WAAW,cAAc;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IACjC,mBAAmB,EAAE,cAAc,CAAC;CACpC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAStE;AAED,MAAM,WAAW,sBAAsB;IACtC,8EAA8E;IAC9E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,sBAAsB,EAC9B,GAAG,GAAE,MAAgB,GACnB,OAAO,CAGT;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,sBAAsB,EAC9B,GAAG,GAAE,MAAgB,GACnB,IAAI,CAMN;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAG1F;AAED,wBAAgB,sBAAsB,CACrC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAYT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAUjD"}
@@ -37,6 +37,31 @@ export function clearExpiredRateLimits(entity) {
37
37
  }
38
38
  }
39
39
  }
40
+ /**
41
+ * Whether an account's shared subscription quota is currently spent.
42
+ *
43
+ * This is an ACCOUNT-WIDE block sourced from the `/wham/usage`
44
+ * primary/secondary window, deliberately distinct from the per-family /
45
+ * per-model transient blocks tracked in {@link RateLimitState}. Read sites
46
+ * report it separately so a 30-second 429 is never conflated with a week-long
47
+ * subscription-quota exhaustion.
48
+ */
49
+ export function isQuotaExhausted(entity, now = nowMs()) {
50
+ const until = entity.quotaExhaustedUntil;
51
+ return typeof until === "number" && Number.isFinite(until) && now < until;
52
+ }
53
+ /**
54
+ * Drop an elapsed (or non-finite) quota-exhaustion stamp so it does not leak
55
+ * into snapshots or persistence, mirroring {@link clearExpiredRateLimits} for
56
+ * the per-family map.
57
+ */
58
+ export function clearExpiredQuotaExhaustion(entity, now = nowMs()) {
59
+ const until = entity.quotaExhaustedUntil;
60
+ if (until !== undefined && (!Number.isFinite(until) || now >= until)) {
61
+ delete entity.quotaExhaustedUntil;
62
+ delete entity.quotaExhaustedStampAt;
63
+ }
64
+ }
40
65
  export function isRateLimitedForQuotaKey(entity, key) {
41
66
  const resetTime = entity.rateLimitResetTimes[key];
42
67
  return resetTime !== undefined && nowMs() < resetTime;
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limits.js","sourceRoot":"","sources":["../../../lib/accounts/rate-limits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rate-limits.js","sourceRoot":"","sources":["../../../lib/accounts/rate-limits.ts"],"names":[],"mappings":"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"}
@@ -35,16 +35,25 @@ export declare class AccountRotation {
35
35
  * Health/token/freshness-weighted selection. The historical default.
36
36
  *
37
37
  * When at least one account is selectable this returns the best-scoring one.
38
- * When NONE is — every account disabled, rate-limited or cooling down —
39
- * `selectHybridAccount` deliberately falls back to the least-recently-used
40
- * account instead of returning null, because retrying a blocked account
41
- * beats refusing to send anything (a single-account pool has nowhere to fail
42
- * over to, and a persisted block can outlive the limit that caused it).
38
+ * When NONE is — every account disabled, rate-limited, quota-exhausted or
39
+ * cooling down — `selectHybridAccount` deliberately falls back to the
40
+ * least-recently-used account instead of returning null, because retrying a
41
+ * blocked account beats refusing to send anything (a single-account pool has
42
+ * nowhere to fail over to, and a persisted block can outlive the limit that
43
+ * caused it).
43
44
  *
44
45
  * So a returned account is NOT a promise that it is selectable. Callers that
45
46
  * need that guarantee must consult `getSelectionExplainability`, which is
46
47
  * what `codex-doctor` does. {@link getCurrentOrNextForFamilySticky} and
47
48
  * {@link getCurrentOrNextForFamily} return null in the same situation.
49
+ *
50
+ * The request path overrides this last-resort behavior: when the fallback
51
+ * account is marked ineligible in the selection explainability, the request
52
+ * loop discards it instead of sending it upstream, so an all-blocked pool
53
+ * waits out (or fails on) the block rather than retrying it — which is also
54
+ * what allows model fallback to degrade the model when every account is
55
+ * blocked. The last-resort retry still applies to callers that do not
56
+ * re-check eligibility (for example `codex-doctor` probing).
48
57
  */
49
58
  getCurrentOrNextForFamilyHybrid(family: ModelFamily, model?: string | null, options?: HybridSelectionOptions, preferredAccountIds?: readonly string[], strictPreferredPool?: boolean, excludedIndices?: ReadonlySet<number>): ManagedAccount | null;
50
59
  /**
@@ -106,27 +115,17 @@ export declare class AccountRotation {
106
115
  * Block an account until a quota window the backend reported as fully spent
107
116
  * resets (issue #218).
108
117
  *
109
- * Differs from {@link markRateLimitedWithReason} in taking an ABSOLUTE reset
110
- * stamp, so a week-long weekly-quota block is never rebuilt from a capped or
111
- * backed-off retry delay. Like every writer it goes through
112
- * {@link extendRateLimitReset}, so it neither shortens an existing block nor
113
- * can be shortened by a later one.
114
- *
115
- * The block rides on the same persisted `rateLimitResetTimes` map as server
116
- * 429s, so it survives restarts and is shared with other processes through
117
- * the accounts file, and it expires on its own via `clearExpiredRateLimits`.
118
- *
119
- * Because that write is monotonic and persisted, it is also unforgiving: a
120
- * reset stamp further out than any real window would strand the account for
121
- * as long as it claims, with nothing in the product able to walk it back. The
122
- * upper bound below is the same guard `parseQuotaResetAtMs` applies to the
123
- * headers, repeated here because this is the method that makes a block
124
- * permanent — the lower bound on the next line has always been checked for
125
- * the same reason.
118
+ * Primary/secondary subscription windows are account-wide, irrespective of
119
+ * the request's family/model. Keep their absolute reset monotonically in
120
+ * `quotaExhaustedUntil`, persisted separately from transient server 429s and
121
+ * expired by `clearExpiredQuotaExhaustion`. Legacy family/model arguments
122
+ * remain accepted, but cannot narrow the subscription block's scope.
123
+ * Reject implausible timestamps using the parser's horizon guard so a bad
124
+ * header cannot strand an account indefinitely.
126
125
  *
127
126
  * @returns true when a new (or longer) block was written.
128
127
  */
129
- markQuotaExhausted(account: ManagedAccount, resetAtMs: number, family: ModelFamily, model?: string | null): boolean;
128
+ markQuotaExhausted(account: ManagedAccount, resetAtMs: number, _family: ModelFamily, _model?: string | null): boolean;
130
129
  markAccountCoolingDown(account: ManagedAccount, cooldownMs: number, reason: CooldownReason): void;
131
130
  /**
132
131
  * Mark every in-memory account sharing a refresh token as cooling down.
@@ -1 +1 @@
1
- {"version":3,"file":"rotation.d.ts","sourceRoot":"","sources":["../../../lib/accounts/rotation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAKN,KAAK,sBAAsB,EAC3B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAIN,KAAK,eAAe,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,qBAAa,eAAe;IACf,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,YAAY;IAEhD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,6BAA6B;IAwBrC,OAAO,CAAC,iBAAiB;IAOzB,yBAAyB,CACxB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,EACvC,mBAAmB,UAAQ,EAC3B,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACnC,cAAc,GAAG,IAAI;IA8BxB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,GAAG,IAAI;IAoBnF;;;;;;;;;;;;;;OAcG;IACH,+BAA+B,CAC9B,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,sBAAsB,EAChC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,EACvC,mBAAmB,UAAQ,EAC3B,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACnC,cAAc,GAAG,IAAI;IAkExB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,+BAA+B,CAC9B,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,EACvC,mBAAmB,UAAQ,EAC3B,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GACnC,cAAc,GAAG,IAAI;IA4CxB,aAAa,CACZ,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IAKP,eAAe,CACd,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IAMP,aAAa,CACZ,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IAKP,YAAY,CACX,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO;IAKV;;;;OAIG;IACH,WAAW,CACV,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO;IAKV,eAAe,CACd,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IAIP;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,oBAAoB;IAiB5B,yBAAyB,CACxB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,eAAe,EACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IAyBP;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,kBAAkB,CACjB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO;IAgBV,sBAAsB,CACrB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,GACpB,IAAI;IAMP;;;OAGG;IACH,uCAAuC,CACtC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,GACpB,MAAM;IAUT,uBAAuB,CACtB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM;CA0DT"}
1
+ {"version":3,"file":"rotation.d.ts","sourceRoot":"","sources":["../../../lib/accounts/rotation.ts"],"names":[],"mappings":"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"}