@funnycode/myclaude 0.1.94 → 0.1.96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/myclaude.js CHANGED
@@ -4,8 +4,8 @@
4
4
  // MACRO - build-time constants (injected by build.ts)
5
5
  // MACRO injected by build script
6
6
  globalThis.MACRO = {
7
- VERSION: "0.1.94",
8
- BUILD_TIME: "2026-07-18T06:27:57.445Z",
7
+ VERSION: "0.1.96",
8
+ BUILD_TIME: "2026-07-18T10:50:58.819Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -117484,7 +117484,7 @@ var package_default;
117484
117484
  var init_package = __esm(() => {
117485
117485
  package_default = {
117486
117486
  name: "@funnycode/myclaude",
117487
- version: "0.1.94",
117487
+ version: "0.1.96",
117488
117488
  private: false,
117489
117489
  description: "An open-source AI coding assistant in your terminal - powered by Claude",
117490
117490
  license: "MIT",
@@ -210146,214 +210146,6 @@ var init_postSamplingHooks = __esm(() => {
210146
210146
  postSamplingHooks = [];
210147
210147
  });
210148
210148
 
210149
- // node_modules/async-mutex/index.mjs
210150
- class Semaphore {
210151
- constructor(_value, _cancelError = E_CANCELED) {
210152
- this._value = _value;
210153
- this._cancelError = _cancelError;
210154
- this._queue = [];
210155
- this._weightedWaiters = [];
210156
- }
210157
- acquire(weight = 1, priority = 0) {
210158
- if (weight <= 0)
210159
- throw new Error(`invalid weight ${weight}: must be positive`);
210160
- return new Promise((resolve25, reject2) => {
210161
- const task = { resolve: resolve25, reject: reject2, weight, priority };
210162
- const i3 = findIndexFromEnd(this._queue, (other) => priority <= other.priority);
210163
- if (i3 === -1 && weight <= this._value) {
210164
- this._dispatchItem(task);
210165
- } else {
210166
- this._queue.splice(i3 + 1, 0, task);
210167
- }
210168
- });
210169
- }
210170
- runExclusive(callback_1) {
210171
- return __awaiter$2(this, arguments, undefined, function* (callback, weight = 1, priority = 0) {
210172
- const [value, release] = yield this.acquire(weight, priority);
210173
- try {
210174
- return yield callback(value);
210175
- } finally {
210176
- release();
210177
- }
210178
- });
210179
- }
210180
- waitForUnlock(weight = 1, priority = 0) {
210181
- if (weight <= 0)
210182
- throw new Error(`invalid weight ${weight}: must be positive`);
210183
- if (this._couldLockImmediately(weight, priority)) {
210184
- return Promise.resolve();
210185
- } else {
210186
- return new Promise((resolve25) => {
210187
- if (!this._weightedWaiters[weight - 1])
210188
- this._weightedWaiters[weight - 1] = [];
210189
- insertSorted(this._weightedWaiters[weight - 1], { resolve: resolve25, priority });
210190
- });
210191
- }
210192
- }
210193
- isLocked() {
210194
- return this._value <= 0;
210195
- }
210196
- getValue() {
210197
- return this._value;
210198
- }
210199
- setValue(value) {
210200
- this._value = value;
210201
- this._dispatchQueue();
210202
- }
210203
- release(weight = 1) {
210204
- if (weight <= 0)
210205
- throw new Error(`invalid weight ${weight}: must be positive`);
210206
- this._value += weight;
210207
- this._dispatchQueue();
210208
- }
210209
- cancel() {
210210
- this._queue.forEach((entry) => entry.reject(this._cancelError));
210211
- this._queue = [];
210212
- }
210213
- _dispatchQueue() {
210214
- this._drainUnlockWaiters();
210215
- while (this._queue.length > 0 && this._queue[0].weight <= this._value) {
210216
- this._dispatchItem(this._queue.shift());
210217
- this._drainUnlockWaiters();
210218
- }
210219
- }
210220
- _dispatchItem(item) {
210221
- const previousValue = this._value;
210222
- this._value -= item.weight;
210223
- item.resolve([previousValue, this._newReleaser(item.weight)]);
210224
- }
210225
- _newReleaser(weight) {
210226
- let called = false;
210227
- return () => {
210228
- if (called)
210229
- return;
210230
- called = true;
210231
- this.release(weight);
210232
- };
210233
- }
210234
- _drainUnlockWaiters() {
210235
- if (this._queue.length === 0) {
210236
- for (let weight = this._value;weight > 0; weight--) {
210237
- const waiters = this._weightedWaiters[weight - 1];
210238
- if (!waiters)
210239
- continue;
210240
- waiters.forEach((waiter) => waiter.resolve());
210241
- this._weightedWaiters[weight - 1] = [];
210242
- }
210243
- } else {
210244
- const queuedPriority = this._queue[0].priority;
210245
- for (let weight = this._value;weight > 0; weight--) {
210246
- const waiters = this._weightedWaiters[weight - 1];
210247
- if (!waiters)
210248
- continue;
210249
- const i3 = waiters.findIndex((waiter) => waiter.priority <= queuedPriority);
210250
- (i3 === -1 ? waiters : waiters.splice(0, i3)).forEach((waiter) => waiter.resolve());
210251
- }
210252
- }
210253
- }
210254
- _couldLockImmediately(weight, priority) {
210255
- return (this._queue.length === 0 || this._queue[0].priority < priority) && weight <= this._value;
210256
- }
210257
- }
210258
- function insertSorted(a2, v2) {
210259
- const i3 = findIndexFromEnd(a2, (other) => v2.priority <= other.priority);
210260
- a2.splice(i3 + 1, 0, v2);
210261
- }
210262
- function findIndexFromEnd(a2, predicate) {
210263
- for (let i3 = a2.length - 1;i3 >= 0; i3--) {
210264
- if (predicate(a2[i3])) {
210265
- return i3;
210266
- }
210267
- }
210268
- return -1;
210269
- }
210270
-
210271
- class Mutex {
210272
- constructor(cancelError) {
210273
- this._semaphore = new Semaphore(1, cancelError);
210274
- }
210275
- acquire() {
210276
- return __awaiter$1(this, arguments, undefined, function* (priority = 0) {
210277
- const [, releaser] = yield this._semaphore.acquire(1, priority);
210278
- return releaser;
210279
- });
210280
- }
210281
- runExclusive(callback, priority = 0) {
210282
- return this._semaphore.runExclusive(() => callback(), 1, priority);
210283
- }
210284
- isLocked() {
210285
- return this._semaphore.isLocked();
210286
- }
210287
- waitForUnlock(priority = 0) {
210288
- return this._semaphore.waitForUnlock(1, priority);
210289
- }
210290
- release() {
210291
- if (this._semaphore.isLocked())
210292
- this._semaphore.release();
210293
- }
210294
- cancel() {
210295
- return this._semaphore.cancel();
210296
- }
210297
- }
210298
- var E_TIMEOUT, E_ALREADY_LOCKED, E_CANCELED, __awaiter$2 = function(thisArg, _arguments, P2, generator) {
210299
- function adopt(value) {
210300
- return value instanceof P2 ? value : new P2(function(resolve25) {
210301
- resolve25(value);
210302
- });
210303
- }
210304
- return new (P2 || (P2 = Promise))(function(resolve25, reject2) {
210305
- function fulfilled(value) {
210306
- try {
210307
- step(generator.next(value));
210308
- } catch (e) {
210309
- reject2(e);
210310
- }
210311
- }
210312
- function rejected(value) {
210313
- try {
210314
- step(generator["throw"](value));
210315
- } catch (e) {
210316
- reject2(e);
210317
- }
210318
- }
210319
- function step(result) {
210320
- result.done ? resolve25(result.value) : adopt(result.value).then(fulfilled, rejected);
210321
- }
210322
- step((generator = generator.apply(thisArg, _arguments || [])).next());
210323
- });
210324
- }, __awaiter$1 = function(thisArg, _arguments, P2, generator) {
210325
- function adopt(value) {
210326
- return value instanceof P2 ? value : new P2(function(resolve25) {
210327
- resolve25(value);
210328
- });
210329
- }
210330
- return new (P2 || (P2 = Promise))(function(resolve25, reject2) {
210331
- function fulfilled(value) {
210332
- try {
210333
- step(generator.next(value));
210334
- } catch (e) {
210335
- reject2(e);
210336
- }
210337
- }
210338
- function rejected(value) {
210339
- try {
210340
- step(generator["throw"](value));
210341
- } catch (e) {
210342
- reject2(e);
210343
- }
210344
- }
210345
- function step(result) {
210346
- result.done ? resolve25(result.value) : adopt(result.value).then(fulfilled, rejected);
210347
- }
210348
- step((generator = generator.apply(thisArg, _arguments || [])).next());
210349
- });
210350
- };
210351
- var init_async_mutex = __esm(() => {
210352
- E_TIMEOUT = new Error("timeout while waiting for mutex to become available");
210353
- E_ALREADY_LOCKED = new Error("mutex already locked");
210354
- E_CANCELED = new Error("request for lock canceled");
210355
- });
210356
-
210357
210149
  // src/services/api/dumpPrompts.ts
210358
210150
  import { createHash as createHash5 } from "crypto";
210359
210151
  import { promises as fs11 } from "fs";
@@ -210366,34 +210158,24 @@ function enqueueDumpRequest(agentIdOrSessionId, callback) {
210366
210158
  dumpRequestQueue.set(agentIdOrSessionId, []);
210367
210159
  }
210368
210160
  dumpRequestQueue.get(agentIdOrSessionId).push(callback);
210369
- processQueue(agentIdOrSessionId);
210161
+ if (!processingFlags.has(agentIdOrSessionId)) {
210162
+ processingFlags.add(agentIdOrSessionId);
210163
+ processQueue(agentIdOrSessionId);
210164
+ }
210370
210165
  }
210371
210166
  async function processQueue(agentIdOrSessionId) {
210372
- const mapRelease = await dumpRequestMapMutex.acquire();
210373
- let mutex = dumpRequestMutexes.get(agentIdOrSessionId);
210374
- if (!mutex) {
210375
- mutex = new Mutex;
210376
- dumpRequestMutexes.set(agentIdOrSessionId, mutex);
210377
- }
210378
- mapRelease();
210379
- const release = await mutex.acquire();
210380
210167
  try {
210381
- const queue = dumpRequestQueue.get(agentIdOrSessionId);
210382
- if (!queue || queue.length === 0) {
210383
- dumpRequestQueue.delete(agentIdOrSessionId);
210384
- dumpRequestMutexes.delete(agentIdOrSessionId);
210385
- return;
210386
- }
210387
- const callback = queue.shift();
210388
- await callback();
210389
- if (queue.length > 0) {
210390
- setImmediate(() => processQueue(agentIdOrSessionId));
210391
- } else {
210392
- dumpRequestQueue.delete(agentIdOrSessionId);
210393
- dumpRequestMutexes.delete(agentIdOrSessionId);
210168
+ while (true) {
210169
+ const queue = dumpRequestQueue.get(agentIdOrSessionId);
210170
+ if (!queue || queue.length === 0) {
210171
+ break;
210172
+ }
210173
+ const callback = queue.shift();
210174
+ await callback();
210394
210175
  }
210395
210176
  } finally {
210396
- release();
210177
+ dumpRequestQueue.delete(agentIdOrSessionId);
210178
+ processingFlags.delete(agentIdOrSessionId);
210397
210179
  }
210398
210180
  }
210399
210181
  function clearDumpState(agentIdOrSessionId) {
@@ -210582,28 +210364,28 @@ function createDumpPromptsFetch(agentIdOrSessionId) {
210582
210364
  } catch {}
210583
210365
  }
210584
210366
  })().catch((err2) => {
210585
- logForDebugging(`dumpPrompts.response handler unhandled rejection: ${err2}`, { level: "error" });
210367
+ try {
210368
+ logForDebugging(`dumpPrompts.response handler unhandled rejection: ${err2}`, { level: "error" });
210369
+ } catch {}
210586
210370
  });
210587
210371
  }
210588
210372
  return response;
210589
210373
  };
210590
210374
  }
210591
- var MAX_CACHED_REQUESTS = 5, cachedApiRequests, dumpState, dumpRequestQueue, dumpRequestMutexes, dumpRequestMapMutex;
210375
+ var MAX_CACHED_REQUESTS = 5, cachedApiRequests, dumpState, dumpRequestQueue, processingFlags;
210592
210376
  var init_dumpPrompts = __esm(() => {
210593
210377
  init_state();
210594
210378
  init_envUtils();
210595
210379
  init_slowOperations();
210596
210380
  init_debug();
210597
210381
  init_log3();
210598
- init_async_mutex();
210599
210382
  if (process.env.USER_TYPE === "ant" && process.env.DUMP_PROMPTS === "1") {
210600
210383
  logForDebugging("DUMP_PROMPTS is enabled. This will write full API payloads (including system prompts, user messages, and tool definitions) to the filesystem. This is intended for debugging only and should NOT be used in production.", { level: "warn" });
210601
210384
  }
210602
210385
  cachedApiRequests = [];
210603
210386
  dumpState = new Map;
210604
210387
  dumpRequestQueue = new Map;
210605
- dumpRequestMutexes = new Map;
210606
- dumpRequestMapMutex = new Mutex;
210388
+ processingFlags = new Set;
210607
210389
  });
210608
210390
 
210609
210391
  // src/utils/abortController.ts
@@ -301137,6 +300919,214 @@ var init_gracefulShutdown = __esm(() => {
301137
300919
  };
301138
300920
  });
301139
300921
 
300922
+ // node_modules/async-mutex/index.mjs
300923
+ class Semaphore {
300924
+ constructor(_value, _cancelError = E_CANCELED) {
300925
+ this._value = _value;
300926
+ this._cancelError = _cancelError;
300927
+ this._queue = [];
300928
+ this._weightedWaiters = [];
300929
+ }
300930
+ acquire(weight = 1, priority = 0) {
300931
+ if (weight <= 0)
300932
+ throw new Error(`invalid weight ${weight}: must be positive`);
300933
+ return new Promise((resolve28, reject2) => {
300934
+ const task = { resolve: resolve28, reject: reject2, weight, priority };
300935
+ const i3 = findIndexFromEnd(this._queue, (other) => priority <= other.priority);
300936
+ if (i3 === -1 && weight <= this._value) {
300937
+ this._dispatchItem(task);
300938
+ } else {
300939
+ this._queue.splice(i3 + 1, 0, task);
300940
+ }
300941
+ });
300942
+ }
300943
+ runExclusive(callback_1) {
300944
+ return __awaiter$2(this, arguments, undefined, function* (callback, weight = 1, priority = 0) {
300945
+ const [value, release] = yield this.acquire(weight, priority);
300946
+ try {
300947
+ return yield callback(value);
300948
+ } finally {
300949
+ release();
300950
+ }
300951
+ });
300952
+ }
300953
+ waitForUnlock(weight = 1, priority = 0) {
300954
+ if (weight <= 0)
300955
+ throw new Error(`invalid weight ${weight}: must be positive`);
300956
+ if (this._couldLockImmediately(weight, priority)) {
300957
+ return Promise.resolve();
300958
+ } else {
300959
+ return new Promise((resolve28) => {
300960
+ if (!this._weightedWaiters[weight - 1])
300961
+ this._weightedWaiters[weight - 1] = [];
300962
+ insertSorted(this._weightedWaiters[weight - 1], { resolve: resolve28, priority });
300963
+ });
300964
+ }
300965
+ }
300966
+ isLocked() {
300967
+ return this._value <= 0;
300968
+ }
300969
+ getValue() {
300970
+ return this._value;
300971
+ }
300972
+ setValue(value) {
300973
+ this._value = value;
300974
+ this._dispatchQueue();
300975
+ }
300976
+ release(weight = 1) {
300977
+ if (weight <= 0)
300978
+ throw new Error(`invalid weight ${weight}: must be positive`);
300979
+ this._value += weight;
300980
+ this._dispatchQueue();
300981
+ }
300982
+ cancel() {
300983
+ this._queue.forEach((entry) => entry.reject(this._cancelError));
300984
+ this._queue = [];
300985
+ }
300986
+ _dispatchQueue() {
300987
+ this._drainUnlockWaiters();
300988
+ while (this._queue.length > 0 && this._queue[0].weight <= this._value) {
300989
+ this._dispatchItem(this._queue.shift());
300990
+ this._drainUnlockWaiters();
300991
+ }
300992
+ }
300993
+ _dispatchItem(item) {
300994
+ const previousValue = this._value;
300995
+ this._value -= item.weight;
300996
+ item.resolve([previousValue, this._newReleaser(item.weight)]);
300997
+ }
300998
+ _newReleaser(weight) {
300999
+ let called = false;
301000
+ return () => {
301001
+ if (called)
301002
+ return;
301003
+ called = true;
301004
+ this.release(weight);
301005
+ };
301006
+ }
301007
+ _drainUnlockWaiters() {
301008
+ if (this._queue.length === 0) {
301009
+ for (let weight = this._value;weight > 0; weight--) {
301010
+ const waiters = this._weightedWaiters[weight - 1];
301011
+ if (!waiters)
301012
+ continue;
301013
+ waiters.forEach((waiter) => waiter.resolve());
301014
+ this._weightedWaiters[weight - 1] = [];
301015
+ }
301016
+ } else {
301017
+ const queuedPriority = this._queue[0].priority;
301018
+ for (let weight = this._value;weight > 0; weight--) {
301019
+ const waiters = this._weightedWaiters[weight - 1];
301020
+ if (!waiters)
301021
+ continue;
301022
+ const i3 = waiters.findIndex((waiter) => waiter.priority <= queuedPriority);
301023
+ (i3 === -1 ? waiters : waiters.splice(0, i3)).forEach((waiter) => waiter.resolve());
301024
+ }
301025
+ }
301026
+ }
301027
+ _couldLockImmediately(weight, priority) {
301028
+ return (this._queue.length === 0 || this._queue[0].priority < priority) && weight <= this._value;
301029
+ }
301030
+ }
301031
+ function insertSorted(a2, v2) {
301032
+ const i3 = findIndexFromEnd(a2, (other) => v2.priority <= other.priority);
301033
+ a2.splice(i3 + 1, 0, v2);
301034
+ }
301035
+ function findIndexFromEnd(a2, predicate) {
301036
+ for (let i3 = a2.length - 1;i3 >= 0; i3--) {
301037
+ if (predicate(a2[i3])) {
301038
+ return i3;
301039
+ }
301040
+ }
301041
+ return -1;
301042
+ }
301043
+
301044
+ class Mutex {
301045
+ constructor(cancelError) {
301046
+ this._semaphore = new Semaphore(1, cancelError);
301047
+ }
301048
+ acquire() {
301049
+ return __awaiter$1(this, arguments, undefined, function* (priority = 0) {
301050
+ const [, releaser] = yield this._semaphore.acquire(1, priority);
301051
+ return releaser;
301052
+ });
301053
+ }
301054
+ runExclusive(callback, priority = 0) {
301055
+ return this._semaphore.runExclusive(() => callback(), 1, priority);
301056
+ }
301057
+ isLocked() {
301058
+ return this._semaphore.isLocked();
301059
+ }
301060
+ waitForUnlock(priority = 0) {
301061
+ return this._semaphore.waitForUnlock(1, priority);
301062
+ }
301063
+ release() {
301064
+ if (this._semaphore.isLocked())
301065
+ this._semaphore.release();
301066
+ }
301067
+ cancel() {
301068
+ return this._semaphore.cancel();
301069
+ }
301070
+ }
301071
+ var E_TIMEOUT, E_ALREADY_LOCKED, E_CANCELED, __awaiter$2 = function(thisArg, _arguments, P2, generator) {
301072
+ function adopt(value) {
301073
+ return value instanceof P2 ? value : new P2(function(resolve28) {
301074
+ resolve28(value);
301075
+ });
301076
+ }
301077
+ return new (P2 || (P2 = Promise))(function(resolve28, reject2) {
301078
+ function fulfilled(value) {
301079
+ try {
301080
+ step(generator.next(value));
301081
+ } catch (e) {
301082
+ reject2(e);
301083
+ }
301084
+ }
301085
+ function rejected(value) {
301086
+ try {
301087
+ step(generator["throw"](value));
301088
+ } catch (e) {
301089
+ reject2(e);
301090
+ }
301091
+ }
301092
+ function step(result) {
301093
+ result.done ? resolve28(result.value) : adopt(result.value).then(fulfilled, rejected);
301094
+ }
301095
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
301096
+ });
301097
+ }, __awaiter$1 = function(thisArg, _arguments, P2, generator) {
301098
+ function adopt(value) {
301099
+ return value instanceof P2 ? value : new P2(function(resolve28) {
301100
+ resolve28(value);
301101
+ });
301102
+ }
301103
+ return new (P2 || (P2 = Promise))(function(resolve28, reject2) {
301104
+ function fulfilled(value) {
301105
+ try {
301106
+ step(generator.next(value));
301107
+ } catch (e) {
301108
+ reject2(e);
301109
+ }
301110
+ }
301111
+ function rejected(value) {
301112
+ try {
301113
+ step(generator["throw"](value));
301114
+ } catch (e) {
301115
+ reject2(e);
301116
+ }
301117
+ }
301118
+ function step(result) {
301119
+ result.done ? resolve28(result.value) : adopt(result.value).then(fulfilled, rejected);
301120
+ }
301121
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
301122
+ });
301123
+ };
301124
+ var init_async_mutex = __esm(() => {
301125
+ E_TIMEOUT = new Error("timeout while waiting for mutex to become available");
301126
+ E_ALREADY_LOCKED = new Error("mutex already locked");
301127
+ E_CANCELED = new Error("request for lock canceled");
301128
+ });
301129
+
301140
301130
  // src/services/api/grove.ts
301141
301131
  function memoizeWithTTL(fn, ttlMs) {
301142
301132
  let lastCachedAt = 0;
@@ -342373,10 +342363,9 @@ async function appendSessionLogImpl(sessionId, entry, url3, headers) {
342373
342363
  lastUuidMap.set(sessionId, serverLastUuid);
342374
342364
  logForDebugging(`Session 409: adopting server lastUuid=${serverLastUuid} from header, retrying entry ${entry.uuid}`);
342375
342365
  } else {
342376
- const sequential2 = getOrCreateSequential(sessionId);
342377
342366
  let logs2 = null;
342378
342367
  try {
342379
- logs2 = await sequential2(sessionId, url3, headers, true);
342368
+ logs2 = await fetchSessionLogsFromUrl(sessionId, url3, headers);
342380
342369
  } catch (fetchError) {
342381
342370
  logError2(new Error(`Session 409: fetch failed for session ${sessionId}, entry ${entry.uuid}: ${fetchError instanceof Error ? fetchError.message : String(fetchError)}`));
342382
342371
  logForDiagnosticsNoPII("error", "session_persist_409_fetch_fail");
@@ -453787,17 +453776,36 @@ var init_FeedColumn = __esm(() => {
453787
453776
  // src/services/api/referral.ts
453788
453777
  async function fetchReferralEligibility(campaign = "claude_code_guest_pass") {
453789
453778
  const { accessToken, orgUUID } = await prepareApiRequest();
453779
+ const existingPromise = fetchInProgressMap.get(orgUUID);
453780
+ if (existingPromise) {
453781
+ logForDebugging(`Passes: Reusing in-flight eligibility fetch for org ${orgUUID}`);
453782
+ return existingPromise;
453783
+ }
453790
453784
  const headers = {
453791
453785
  ...getOAuthHeaders(accessToken),
453792
453786
  "x-organization-uuid": orgUUID
453793
453787
  };
453794
453788
  const url3 = `${getOauthConfig().BASE_API_URL}/api/oauth/organizations/${orgUUID}/referral/eligibility`;
453795
- const response = await axios_default.get(url3, {
453796
- headers,
453797
- params: { campaign },
453798
- timeout: 5000
453789
+ let resolvePromise;
453790
+ const promise3 = new Promise((resolve47) => {
453791
+ resolvePromise = resolve47;
453799
453792
  });
453800
- return response.data;
453793
+ fetchInProgressMap.set(orgUUID, promise3);
453794
+ (async () => {
453795
+ try {
453796
+ const response = await axios_default.get(url3, {
453797
+ headers,
453798
+ params: { campaign },
453799
+ timeout: 5000
453800
+ });
453801
+ resolvePromise(response.data);
453802
+ } catch (error49) {
453803
+ logError2(error49);
453804
+ fetchInProgressMap.delete(orgUUID);
453805
+ throw error49;
453806
+ }
453807
+ })();
453808
+ return promise3;
453801
453809
  }
453802
453810
  async function fetchReferralRedemptions(campaign = "claude_code_guest_pass") {
453803
453811
  const { accessToken, orgUUID } = await prepareApiRequest();
@@ -453877,41 +453885,26 @@ async function fetchAndStorePassesEligibility() {
453877
453885
  if (!orgId) {
453878
453886
  return null;
453879
453887
  }
453880
- const existingPromise = fetchInProgressMap.get(orgId);
453881
- if (existingPromise) {
453882
- logForDebugging(`Passes: Reusing in-flight eligibility fetch for org ${orgId}`);
453883
- return existingPromise;
453888
+ try {
453889
+ const response = await fetchReferralEligibility();
453890
+ const cacheEntry = {
453891
+ ...response,
453892
+ timestamp: Date.now()
453893
+ };
453894
+ saveGlobalConfig((current) => ({
453895
+ ...current,
453896
+ passesEligibilityCache: {
453897
+ ...current.passesEligibilityCache,
453898
+ [orgId]: cacheEntry
453899
+ }
453900
+ }));
453901
+ logForDebugging(`Passes eligibility cached for org ${orgId}: ${response.eligible}`);
453902
+ return response;
453903
+ } catch (error49) {
453904
+ logForDebugging("Failed to fetch and cache passes eligibility");
453905
+ logError2(error49);
453906
+ return null;
453884
453907
  }
453885
- let resolvePromise;
453886
- const promise3 = new Promise((resolve47) => {
453887
- resolvePromise = resolve47;
453888
- });
453889
- fetchInProgressMap.set(orgId, promise3);
453890
- (async () => {
453891
- try {
453892
- const response = await fetchReferralEligibility();
453893
- const cacheEntry = {
453894
- ...response,
453895
- timestamp: Date.now()
453896
- };
453897
- saveGlobalConfig((current) => ({
453898
- ...current,
453899
- passesEligibilityCache: {
453900
- ...current.passesEligibilityCache,
453901
- [orgId]: cacheEntry
453902
- }
453903
- }));
453904
- logForDebugging(`Passes eligibility cached for org ${orgId}: ${response.eligible}`);
453905
- resolvePromise(response);
453906
- } catch (error49) {
453907
- logForDebugging("Failed to fetch and cache passes eligibility");
453908
- logError2(error49);
453909
- resolvePromise(null);
453910
- } finally {
453911
- fetchInProgressMap.delete(orgId);
453912
- }
453913
- })();
453914
- return promise3;
453915
453908
  }
453916
453909
  async function getCachedOrFetchPassesEligibility() {
453917
453910
  if (!shouldCheckForPasses()) {
package/dist/myclaude.mjs CHANGED
@@ -4,8 +4,8 @@
4
4
  // MACRO - build-time constants (injected by build.ts)
5
5
  // MACRO injected by build script
6
6
  globalThis.MACRO = {
7
- VERSION: "0.1.94",
8
- BUILD_TIME: "2026-07-18T06:27:57.445Z",
7
+ VERSION: "0.1.96",
8
+ BUILD_TIME: "2026-07-18T10:50:58.819Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -117484,7 +117484,7 @@ var package_default;
117484
117484
  var init_package = __esm(() => {
117485
117485
  package_default = {
117486
117486
  name: "@funnycode/myclaude",
117487
- version: "0.1.94",
117487
+ version: "0.1.96",
117488
117488
  private: false,
117489
117489
  description: "An open-source AI coding assistant in your terminal - powered by Claude",
117490
117490
  license: "MIT",
@@ -210146,214 +210146,6 @@ var init_postSamplingHooks = __esm(() => {
210146
210146
  postSamplingHooks = [];
210147
210147
  });
210148
210148
 
210149
- // node_modules/async-mutex/index.mjs
210150
- class Semaphore {
210151
- constructor(_value, _cancelError = E_CANCELED) {
210152
- this._value = _value;
210153
- this._cancelError = _cancelError;
210154
- this._queue = [];
210155
- this._weightedWaiters = [];
210156
- }
210157
- acquire(weight = 1, priority = 0) {
210158
- if (weight <= 0)
210159
- throw new Error(`invalid weight ${weight}: must be positive`);
210160
- return new Promise((resolve25, reject2) => {
210161
- const task = { resolve: resolve25, reject: reject2, weight, priority };
210162
- const i3 = findIndexFromEnd(this._queue, (other) => priority <= other.priority);
210163
- if (i3 === -1 && weight <= this._value) {
210164
- this._dispatchItem(task);
210165
- } else {
210166
- this._queue.splice(i3 + 1, 0, task);
210167
- }
210168
- });
210169
- }
210170
- runExclusive(callback_1) {
210171
- return __awaiter$2(this, arguments, undefined, function* (callback, weight = 1, priority = 0) {
210172
- const [value, release] = yield this.acquire(weight, priority);
210173
- try {
210174
- return yield callback(value);
210175
- } finally {
210176
- release();
210177
- }
210178
- });
210179
- }
210180
- waitForUnlock(weight = 1, priority = 0) {
210181
- if (weight <= 0)
210182
- throw new Error(`invalid weight ${weight}: must be positive`);
210183
- if (this._couldLockImmediately(weight, priority)) {
210184
- return Promise.resolve();
210185
- } else {
210186
- return new Promise((resolve25) => {
210187
- if (!this._weightedWaiters[weight - 1])
210188
- this._weightedWaiters[weight - 1] = [];
210189
- insertSorted(this._weightedWaiters[weight - 1], { resolve: resolve25, priority });
210190
- });
210191
- }
210192
- }
210193
- isLocked() {
210194
- return this._value <= 0;
210195
- }
210196
- getValue() {
210197
- return this._value;
210198
- }
210199
- setValue(value) {
210200
- this._value = value;
210201
- this._dispatchQueue();
210202
- }
210203
- release(weight = 1) {
210204
- if (weight <= 0)
210205
- throw new Error(`invalid weight ${weight}: must be positive`);
210206
- this._value += weight;
210207
- this._dispatchQueue();
210208
- }
210209
- cancel() {
210210
- this._queue.forEach((entry) => entry.reject(this._cancelError));
210211
- this._queue = [];
210212
- }
210213
- _dispatchQueue() {
210214
- this._drainUnlockWaiters();
210215
- while (this._queue.length > 0 && this._queue[0].weight <= this._value) {
210216
- this._dispatchItem(this._queue.shift());
210217
- this._drainUnlockWaiters();
210218
- }
210219
- }
210220
- _dispatchItem(item) {
210221
- const previousValue = this._value;
210222
- this._value -= item.weight;
210223
- item.resolve([previousValue, this._newReleaser(item.weight)]);
210224
- }
210225
- _newReleaser(weight) {
210226
- let called = false;
210227
- return () => {
210228
- if (called)
210229
- return;
210230
- called = true;
210231
- this.release(weight);
210232
- };
210233
- }
210234
- _drainUnlockWaiters() {
210235
- if (this._queue.length === 0) {
210236
- for (let weight = this._value;weight > 0; weight--) {
210237
- const waiters = this._weightedWaiters[weight - 1];
210238
- if (!waiters)
210239
- continue;
210240
- waiters.forEach((waiter) => waiter.resolve());
210241
- this._weightedWaiters[weight - 1] = [];
210242
- }
210243
- } else {
210244
- const queuedPriority = this._queue[0].priority;
210245
- for (let weight = this._value;weight > 0; weight--) {
210246
- const waiters = this._weightedWaiters[weight - 1];
210247
- if (!waiters)
210248
- continue;
210249
- const i3 = waiters.findIndex((waiter) => waiter.priority <= queuedPriority);
210250
- (i3 === -1 ? waiters : waiters.splice(0, i3)).forEach((waiter) => waiter.resolve());
210251
- }
210252
- }
210253
- }
210254
- _couldLockImmediately(weight, priority) {
210255
- return (this._queue.length === 0 || this._queue[0].priority < priority) && weight <= this._value;
210256
- }
210257
- }
210258
- function insertSorted(a2, v2) {
210259
- const i3 = findIndexFromEnd(a2, (other) => v2.priority <= other.priority);
210260
- a2.splice(i3 + 1, 0, v2);
210261
- }
210262
- function findIndexFromEnd(a2, predicate) {
210263
- for (let i3 = a2.length - 1;i3 >= 0; i3--) {
210264
- if (predicate(a2[i3])) {
210265
- return i3;
210266
- }
210267
- }
210268
- return -1;
210269
- }
210270
-
210271
- class Mutex {
210272
- constructor(cancelError) {
210273
- this._semaphore = new Semaphore(1, cancelError);
210274
- }
210275
- acquire() {
210276
- return __awaiter$1(this, arguments, undefined, function* (priority = 0) {
210277
- const [, releaser] = yield this._semaphore.acquire(1, priority);
210278
- return releaser;
210279
- });
210280
- }
210281
- runExclusive(callback, priority = 0) {
210282
- return this._semaphore.runExclusive(() => callback(), 1, priority);
210283
- }
210284
- isLocked() {
210285
- return this._semaphore.isLocked();
210286
- }
210287
- waitForUnlock(priority = 0) {
210288
- return this._semaphore.waitForUnlock(1, priority);
210289
- }
210290
- release() {
210291
- if (this._semaphore.isLocked())
210292
- this._semaphore.release();
210293
- }
210294
- cancel() {
210295
- return this._semaphore.cancel();
210296
- }
210297
- }
210298
- var E_TIMEOUT, E_ALREADY_LOCKED, E_CANCELED, __awaiter$2 = function(thisArg, _arguments, P2, generator) {
210299
- function adopt(value) {
210300
- return value instanceof P2 ? value : new P2(function(resolve25) {
210301
- resolve25(value);
210302
- });
210303
- }
210304
- return new (P2 || (P2 = Promise))(function(resolve25, reject2) {
210305
- function fulfilled(value) {
210306
- try {
210307
- step(generator.next(value));
210308
- } catch (e) {
210309
- reject2(e);
210310
- }
210311
- }
210312
- function rejected(value) {
210313
- try {
210314
- step(generator["throw"](value));
210315
- } catch (e) {
210316
- reject2(e);
210317
- }
210318
- }
210319
- function step(result) {
210320
- result.done ? resolve25(result.value) : adopt(result.value).then(fulfilled, rejected);
210321
- }
210322
- step((generator = generator.apply(thisArg, _arguments || [])).next());
210323
- });
210324
- }, __awaiter$1 = function(thisArg, _arguments, P2, generator) {
210325
- function adopt(value) {
210326
- return value instanceof P2 ? value : new P2(function(resolve25) {
210327
- resolve25(value);
210328
- });
210329
- }
210330
- return new (P2 || (P2 = Promise))(function(resolve25, reject2) {
210331
- function fulfilled(value) {
210332
- try {
210333
- step(generator.next(value));
210334
- } catch (e) {
210335
- reject2(e);
210336
- }
210337
- }
210338
- function rejected(value) {
210339
- try {
210340
- step(generator["throw"](value));
210341
- } catch (e) {
210342
- reject2(e);
210343
- }
210344
- }
210345
- function step(result) {
210346
- result.done ? resolve25(result.value) : adopt(result.value).then(fulfilled, rejected);
210347
- }
210348
- step((generator = generator.apply(thisArg, _arguments || [])).next());
210349
- });
210350
- };
210351
- var init_async_mutex = __esm(() => {
210352
- E_TIMEOUT = new Error("timeout while waiting for mutex to become available");
210353
- E_ALREADY_LOCKED = new Error("mutex already locked");
210354
- E_CANCELED = new Error("request for lock canceled");
210355
- });
210356
-
210357
210149
  // src/services/api/dumpPrompts.ts
210358
210150
  import { createHash as createHash5 } from "crypto";
210359
210151
  import { promises as fs11 } from "fs";
@@ -210366,34 +210158,24 @@ function enqueueDumpRequest(agentIdOrSessionId, callback) {
210366
210158
  dumpRequestQueue.set(agentIdOrSessionId, []);
210367
210159
  }
210368
210160
  dumpRequestQueue.get(agentIdOrSessionId).push(callback);
210369
- processQueue(agentIdOrSessionId);
210161
+ if (!processingFlags.has(agentIdOrSessionId)) {
210162
+ processingFlags.add(agentIdOrSessionId);
210163
+ processQueue(agentIdOrSessionId);
210164
+ }
210370
210165
  }
210371
210166
  async function processQueue(agentIdOrSessionId) {
210372
- const mapRelease = await dumpRequestMapMutex.acquire();
210373
- let mutex = dumpRequestMutexes.get(agentIdOrSessionId);
210374
- if (!mutex) {
210375
- mutex = new Mutex;
210376
- dumpRequestMutexes.set(agentIdOrSessionId, mutex);
210377
- }
210378
- mapRelease();
210379
- const release = await mutex.acquire();
210380
210167
  try {
210381
- const queue = dumpRequestQueue.get(agentIdOrSessionId);
210382
- if (!queue || queue.length === 0) {
210383
- dumpRequestQueue.delete(agentIdOrSessionId);
210384
- dumpRequestMutexes.delete(agentIdOrSessionId);
210385
- return;
210386
- }
210387
- const callback = queue.shift();
210388
- await callback();
210389
- if (queue.length > 0) {
210390
- setImmediate(() => processQueue(agentIdOrSessionId));
210391
- } else {
210392
- dumpRequestQueue.delete(agentIdOrSessionId);
210393
- dumpRequestMutexes.delete(agentIdOrSessionId);
210168
+ while (true) {
210169
+ const queue = dumpRequestQueue.get(agentIdOrSessionId);
210170
+ if (!queue || queue.length === 0) {
210171
+ break;
210172
+ }
210173
+ const callback = queue.shift();
210174
+ await callback();
210394
210175
  }
210395
210176
  } finally {
210396
- release();
210177
+ dumpRequestQueue.delete(agentIdOrSessionId);
210178
+ processingFlags.delete(agentIdOrSessionId);
210397
210179
  }
210398
210180
  }
210399
210181
  function clearDumpState(agentIdOrSessionId) {
@@ -210582,28 +210364,28 @@ function createDumpPromptsFetch(agentIdOrSessionId) {
210582
210364
  } catch {}
210583
210365
  }
210584
210366
  })().catch((err2) => {
210585
- logForDebugging(`dumpPrompts.response handler unhandled rejection: ${err2}`, { level: "error" });
210367
+ try {
210368
+ logForDebugging(`dumpPrompts.response handler unhandled rejection: ${err2}`, { level: "error" });
210369
+ } catch {}
210586
210370
  });
210587
210371
  }
210588
210372
  return response;
210589
210373
  };
210590
210374
  }
210591
- var MAX_CACHED_REQUESTS = 5, cachedApiRequests, dumpState, dumpRequestQueue, dumpRequestMutexes, dumpRequestMapMutex;
210375
+ var MAX_CACHED_REQUESTS = 5, cachedApiRequests, dumpState, dumpRequestQueue, processingFlags;
210592
210376
  var init_dumpPrompts = __esm(() => {
210593
210377
  init_state();
210594
210378
  init_envUtils();
210595
210379
  init_slowOperations();
210596
210380
  init_debug();
210597
210381
  init_log3();
210598
- init_async_mutex();
210599
210382
  if (process.env.USER_TYPE === "ant" && process.env.DUMP_PROMPTS === "1") {
210600
210383
  logForDebugging("DUMP_PROMPTS is enabled. This will write full API payloads (including system prompts, user messages, and tool definitions) to the filesystem. This is intended for debugging only and should NOT be used in production.", { level: "warn" });
210601
210384
  }
210602
210385
  cachedApiRequests = [];
210603
210386
  dumpState = new Map;
210604
210387
  dumpRequestQueue = new Map;
210605
- dumpRequestMutexes = new Map;
210606
- dumpRequestMapMutex = new Mutex;
210388
+ processingFlags = new Set;
210607
210389
  });
210608
210390
 
210609
210391
  // src/utils/abortController.ts
@@ -301137,6 +300919,214 @@ var init_gracefulShutdown = __esm(() => {
301137
300919
  };
301138
300920
  });
301139
300921
 
300922
+ // node_modules/async-mutex/index.mjs
300923
+ class Semaphore {
300924
+ constructor(_value, _cancelError = E_CANCELED) {
300925
+ this._value = _value;
300926
+ this._cancelError = _cancelError;
300927
+ this._queue = [];
300928
+ this._weightedWaiters = [];
300929
+ }
300930
+ acquire(weight = 1, priority = 0) {
300931
+ if (weight <= 0)
300932
+ throw new Error(`invalid weight ${weight}: must be positive`);
300933
+ return new Promise((resolve28, reject2) => {
300934
+ const task = { resolve: resolve28, reject: reject2, weight, priority };
300935
+ const i3 = findIndexFromEnd(this._queue, (other) => priority <= other.priority);
300936
+ if (i3 === -1 && weight <= this._value) {
300937
+ this._dispatchItem(task);
300938
+ } else {
300939
+ this._queue.splice(i3 + 1, 0, task);
300940
+ }
300941
+ });
300942
+ }
300943
+ runExclusive(callback_1) {
300944
+ return __awaiter$2(this, arguments, undefined, function* (callback, weight = 1, priority = 0) {
300945
+ const [value, release] = yield this.acquire(weight, priority);
300946
+ try {
300947
+ return yield callback(value);
300948
+ } finally {
300949
+ release();
300950
+ }
300951
+ });
300952
+ }
300953
+ waitForUnlock(weight = 1, priority = 0) {
300954
+ if (weight <= 0)
300955
+ throw new Error(`invalid weight ${weight}: must be positive`);
300956
+ if (this._couldLockImmediately(weight, priority)) {
300957
+ return Promise.resolve();
300958
+ } else {
300959
+ return new Promise((resolve28) => {
300960
+ if (!this._weightedWaiters[weight - 1])
300961
+ this._weightedWaiters[weight - 1] = [];
300962
+ insertSorted(this._weightedWaiters[weight - 1], { resolve: resolve28, priority });
300963
+ });
300964
+ }
300965
+ }
300966
+ isLocked() {
300967
+ return this._value <= 0;
300968
+ }
300969
+ getValue() {
300970
+ return this._value;
300971
+ }
300972
+ setValue(value) {
300973
+ this._value = value;
300974
+ this._dispatchQueue();
300975
+ }
300976
+ release(weight = 1) {
300977
+ if (weight <= 0)
300978
+ throw new Error(`invalid weight ${weight}: must be positive`);
300979
+ this._value += weight;
300980
+ this._dispatchQueue();
300981
+ }
300982
+ cancel() {
300983
+ this._queue.forEach((entry) => entry.reject(this._cancelError));
300984
+ this._queue = [];
300985
+ }
300986
+ _dispatchQueue() {
300987
+ this._drainUnlockWaiters();
300988
+ while (this._queue.length > 0 && this._queue[0].weight <= this._value) {
300989
+ this._dispatchItem(this._queue.shift());
300990
+ this._drainUnlockWaiters();
300991
+ }
300992
+ }
300993
+ _dispatchItem(item) {
300994
+ const previousValue = this._value;
300995
+ this._value -= item.weight;
300996
+ item.resolve([previousValue, this._newReleaser(item.weight)]);
300997
+ }
300998
+ _newReleaser(weight) {
300999
+ let called = false;
301000
+ return () => {
301001
+ if (called)
301002
+ return;
301003
+ called = true;
301004
+ this.release(weight);
301005
+ };
301006
+ }
301007
+ _drainUnlockWaiters() {
301008
+ if (this._queue.length === 0) {
301009
+ for (let weight = this._value;weight > 0; weight--) {
301010
+ const waiters = this._weightedWaiters[weight - 1];
301011
+ if (!waiters)
301012
+ continue;
301013
+ waiters.forEach((waiter) => waiter.resolve());
301014
+ this._weightedWaiters[weight - 1] = [];
301015
+ }
301016
+ } else {
301017
+ const queuedPriority = this._queue[0].priority;
301018
+ for (let weight = this._value;weight > 0; weight--) {
301019
+ const waiters = this._weightedWaiters[weight - 1];
301020
+ if (!waiters)
301021
+ continue;
301022
+ const i3 = waiters.findIndex((waiter) => waiter.priority <= queuedPriority);
301023
+ (i3 === -1 ? waiters : waiters.splice(0, i3)).forEach((waiter) => waiter.resolve());
301024
+ }
301025
+ }
301026
+ }
301027
+ _couldLockImmediately(weight, priority) {
301028
+ return (this._queue.length === 0 || this._queue[0].priority < priority) && weight <= this._value;
301029
+ }
301030
+ }
301031
+ function insertSorted(a2, v2) {
301032
+ const i3 = findIndexFromEnd(a2, (other) => v2.priority <= other.priority);
301033
+ a2.splice(i3 + 1, 0, v2);
301034
+ }
301035
+ function findIndexFromEnd(a2, predicate) {
301036
+ for (let i3 = a2.length - 1;i3 >= 0; i3--) {
301037
+ if (predicate(a2[i3])) {
301038
+ return i3;
301039
+ }
301040
+ }
301041
+ return -1;
301042
+ }
301043
+
301044
+ class Mutex {
301045
+ constructor(cancelError) {
301046
+ this._semaphore = new Semaphore(1, cancelError);
301047
+ }
301048
+ acquire() {
301049
+ return __awaiter$1(this, arguments, undefined, function* (priority = 0) {
301050
+ const [, releaser] = yield this._semaphore.acquire(1, priority);
301051
+ return releaser;
301052
+ });
301053
+ }
301054
+ runExclusive(callback, priority = 0) {
301055
+ return this._semaphore.runExclusive(() => callback(), 1, priority);
301056
+ }
301057
+ isLocked() {
301058
+ return this._semaphore.isLocked();
301059
+ }
301060
+ waitForUnlock(priority = 0) {
301061
+ return this._semaphore.waitForUnlock(1, priority);
301062
+ }
301063
+ release() {
301064
+ if (this._semaphore.isLocked())
301065
+ this._semaphore.release();
301066
+ }
301067
+ cancel() {
301068
+ return this._semaphore.cancel();
301069
+ }
301070
+ }
301071
+ var E_TIMEOUT, E_ALREADY_LOCKED, E_CANCELED, __awaiter$2 = function(thisArg, _arguments, P2, generator) {
301072
+ function adopt(value) {
301073
+ return value instanceof P2 ? value : new P2(function(resolve28) {
301074
+ resolve28(value);
301075
+ });
301076
+ }
301077
+ return new (P2 || (P2 = Promise))(function(resolve28, reject2) {
301078
+ function fulfilled(value) {
301079
+ try {
301080
+ step(generator.next(value));
301081
+ } catch (e) {
301082
+ reject2(e);
301083
+ }
301084
+ }
301085
+ function rejected(value) {
301086
+ try {
301087
+ step(generator["throw"](value));
301088
+ } catch (e) {
301089
+ reject2(e);
301090
+ }
301091
+ }
301092
+ function step(result) {
301093
+ result.done ? resolve28(result.value) : adopt(result.value).then(fulfilled, rejected);
301094
+ }
301095
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
301096
+ });
301097
+ }, __awaiter$1 = function(thisArg, _arguments, P2, generator) {
301098
+ function adopt(value) {
301099
+ return value instanceof P2 ? value : new P2(function(resolve28) {
301100
+ resolve28(value);
301101
+ });
301102
+ }
301103
+ return new (P2 || (P2 = Promise))(function(resolve28, reject2) {
301104
+ function fulfilled(value) {
301105
+ try {
301106
+ step(generator.next(value));
301107
+ } catch (e) {
301108
+ reject2(e);
301109
+ }
301110
+ }
301111
+ function rejected(value) {
301112
+ try {
301113
+ step(generator["throw"](value));
301114
+ } catch (e) {
301115
+ reject2(e);
301116
+ }
301117
+ }
301118
+ function step(result) {
301119
+ result.done ? resolve28(result.value) : adopt(result.value).then(fulfilled, rejected);
301120
+ }
301121
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
301122
+ });
301123
+ };
301124
+ var init_async_mutex = __esm(() => {
301125
+ E_TIMEOUT = new Error("timeout while waiting for mutex to become available");
301126
+ E_ALREADY_LOCKED = new Error("mutex already locked");
301127
+ E_CANCELED = new Error("request for lock canceled");
301128
+ });
301129
+
301140
301130
  // src/services/api/grove.ts
301141
301131
  function memoizeWithTTL(fn, ttlMs) {
301142
301132
  let lastCachedAt = 0;
@@ -342373,10 +342363,9 @@ async function appendSessionLogImpl(sessionId, entry, url3, headers) {
342373
342363
  lastUuidMap.set(sessionId, serverLastUuid);
342374
342364
  logForDebugging(`Session 409: adopting server lastUuid=${serverLastUuid} from header, retrying entry ${entry.uuid}`);
342375
342365
  } else {
342376
- const sequential2 = getOrCreateSequential(sessionId);
342377
342366
  let logs2 = null;
342378
342367
  try {
342379
- logs2 = await sequential2(sessionId, url3, headers, true);
342368
+ logs2 = await fetchSessionLogsFromUrl(sessionId, url3, headers);
342380
342369
  } catch (fetchError) {
342381
342370
  logError2(new Error(`Session 409: fetch failed for session ${sessionId}, entry ${entry.uuid}: ${fetchError instanceof Error ? fetchError.message : String(fetchError)}`));
342382
342371
  logForDiagnosticsNoPII("error", "session_persist_409_fetch_fail");
@@ -453787,17 +453776,36 @@ var init_FeedColumn = __esm(() => {
453787
453776
  // src/services/api/referral.ts
453788
453777
  async function fetchReferralEligibility(campaign = "claude_code_guest_pass") {
453789
453778
  const { accessToken, orgUUID } = await prepareApiRequest();
453779
+ const existingPromise = fetchInProgressMap.get(orgUUID);
453780
+ if (existingPromise) {
453781
+ logForDebugging(`Passes: Reusing in-flight eligibility fetch for org ${orgUUID}`);
453782
+ return existingPromise;
453783
+ }
453790
453784
  const headers = {
453791
453785
  ...getOAuthHeaders(accessToken),
453792
453786
  "x-organization-uuid": orgUUID
453793
453787
  };
453794
453788
  const url3 = `${getOauthConfig().BASE_API_URL}/api/oauth/organizations/${orgUUID}/referral/eligibility`;
453795
- const response = await axios_default.get(url3, {
453796
- headers,
453797
- params: { campaign },
453798
- timeout: 5000
453789
+ let resolvePromise;
453790
+ const promise3 = new Promise((resolve47) => {
453791
+ resolvePromise = resolve47;
453799
453792
  });
453800
- return response.data;
453793
+ fetchInProgressMap.set(orgUUID, promise3);
453794
+ (async () => {
453795
+ try {
453796
+ const response = await axios_default.get(url3, {
453797
+ headers,
453798
+ params: { campaign },
453799
+ timeout: 5000
453800
+ });
453801
+ resolvePromise(response.data);
453802
+ } catch (error49) {
453803
+ logError2(error49);
453804
+ fetchInProgressMap.delete(orgUUID);
453805
+ throw error49;
453806
+ }
453807
+ })();
453808
+ return promise3;
453801
453809
  }
453802
453810
  async function fetchReferralRedemptions(campaign = "claude_code_guest_pass") {
453803
453811
  const { accessToken, orgUUID } = await prepareApiRequest();
@@ -453877,41 +453885,26 @@ async function fetchAndStorePassesEligibility() {
453877
453885
  if (!orgId) {
453878
453886
  return null;
453879
453887
  }
453880
- const existingPromise = fetchInProgressMap.get(orgId);
453881
- if (existingPromise) {
453882
- logForDebugging(`Passes: Reusing in-flight eligibility fetch for org ${orgId}`);
453883
- return existingPromise;
453888
+ try {
453889
+ const response = await fetchReferralEligibility();
453890
+ const cacheEntry = {
453891
+ ...response,
453892
+ timestamp: Date.now()
453893
+ };
453894
+ saveGlobalConfig((current) => ({
453895
+ ...current,
453896
+ passesEligibilityCache: {
453897
+ ...current.passesEligibilityCache,
453898
+ [orgId]: cacheEntry
453899
+ }
453900
+ }));
453901
+ logForDebugging(`Passes eligibility cached for org ${orgId}: ${response.eligible}`);
453902
+ return response;
453903
+ } catch (error49) {
453904
+ logForDebugging("Failed to fetch and cache passes eligibility");
453905
+ logError2(error49);
453906
+ return null;
453884
453907
  }
453885
- let resolvePromise;
453886
- const promise3 = new Promise((resolve47) => {
453887
- resolvePromise = resolve47;
453888
- });
453889
- fetchInProgressMap.set(orgId, promise3);
453890
- (async () => {
453891
- try {
453892
- const response = await fetchReferralEligibility();
453893
- const cacheEntry = {
453894
- ...response,
453895
- timestamp: Date.now()
453896
- };
453897
- saveGlobalConfig((current) => ({
453898
- ...current,
453899
- passesEligibilityCache: {
453900
- ...current.passesEligibilityCache,
453901
- [orgId]: cacheEntry
453902
- }
453903
- }));
453904
- logForDebugging(`Passes eligibility cached for org ${orgId}: ${response.eligible}`);
453905
- resolvePromise(response);
453906
- } catch (error49) {
453907
- logForDebugging("Failed to fetch and cache passes eligibility");
453908
- logError2(error49);
453909
- resolvePromise(null);
453910
- } finally {
453911
- fetchInProgressMap.delete(orgId);
453912
- }
453913
- })();
453914
- return promise3;
453915
453908
  }
453916
453909
  async function getCachedOrFetchPassesEligibility() {
453917
453910
  if (!shouldCheckForPasses()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funnycode/myclaude",
3
- "version": "0.1.94",
3
+ "version": "0.1.96",
4
4
  "private": false,
5
5
  "description": "An open-source AI coding assistant in your terminal - powered by Claude",
6
6
  "license": "MIT",