spiracha 1.3.2 → 1.4.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 (160) hide show
  1. package/AGENTS.md +7 -1
  2. package/README.md +6 -0
  3. package/apps/ui/AGENTS.md +8 -0
  4. package/apps/ui/README.md +10 -3
  5. package/apps/ui/dist/client/assets/analytics-DK2jdvmI.js +1 -0
  6. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-DmD0sN8X.js +7 -0
  7. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-KAcXtNxI.js +1 -0
  8. package/apps/ui/dist/client/assets/antigravity-keychain-panel-BRHVjFAM.js +1 -0
  9. package/apps/ui/dist/client/assets/antigravity._workspaceKey-ByitGWki.js +1 -0
  10. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CGV7amas.js +1 -0
  11. package/apps/ui/dist/client/assets/antigravity.index-DEEkjlZa.js +1 -0
  12. package/apps/ui/dist/client/assets/antigravity.index-DgW25FEV.js +1 -0
  13. package/apps/ui/dist/client/assets/badge-DfWvPfKF.js +1 -0
  14. package/apps/ui/dist/client/assets/checkbox-CdHitXWQ.js +1 -0
  15. package/apps/ui/dist/client/assets/createServerFn-CgRRVpBH.js +3 -0
  16. package/apps/ui/dist/client/assets/cursor-threads._composerId-CmBFclK8.js +1 -0
  17. package/apps/ui/dist/client/assets/cursor-threads._composerId-Ti2gTm63.js +1 -0
  18. package/apps/ui/dist/client/assets/cursor._workspaceKey-CaAZjGmm.js +1 -0
  19. package/apps/ui/dist/client/assets/cursor._workspaceKey-DzD_c6j9.js +1 -0
  20. package/apps/ui/dist/client/assets/cursor.index-CrnMwDCi.js +1 -0
  21. package/apps/ui/dist/client/assets/cursor.index-PkCFVcl4.js +2 -0
  22. package/apps/ui/dist/client/assets/{data-table-Cj-v-uyB.js → data-table-Br78_dk3.js} +2 -2
  23. package/apps/ui/dist/client/assets/delete-confirm-dialog-BHRmyLHr.js +11 -0
  24. package/apps/ui/dist/client/assets/dist-B9pyYCVU.js +1 -0
  25. package/apps/ui/dist/client/assets/dist-BhZOxAPP.js +1 -0
  26. package/apps/ui/dist/client/assets/dist-DvMS2965.js +1 -0
  27. package/apps/ui/dist/client/assets/download-Bf0QJKD3.js +1 -0
  28. package/apps/ui/dist/client/assets/dropdown-menu-Dy5cLzTy.js +1 -0
  29. package/apps/ui/dist/client/assets/es2015-BkCWttyM.js +41 -0
  30. package/apps/ui/dist/client/assets/export-dialog-C86SYHJn.js +1 -0
  31. package/apps/ui/dist/client/assets/formatters-BM9kB7ed.js +1 -0
  32. package/apps/ui/dist/client/assets/index-CPvAP-jk.js +149 -0
  33. package/apps/ui/dist/client/assets/jsx-runtime-DGeXAQPT.js +1 -0
  34. package/apps/ui/dist/client/assets/metric-card-Dplm0ZiM.js +1 -0
  35. package/apps/ui/dist/client/assets/page-header-Cwa3p6Tl.js +1 -0
  36. package/apps/ui/dist/client/assets/projects._project-Ckf6muWZ.js +1 -0
  37. package/apps/ui/dist/client/assets/projects._project-DSDwH4NF.js +1 -0
  38. package/apps/ui/dist/client/assets/projects.index-DEfhWqa8.js +1 -0
  39. package/apps/ui/dist/client/assets/projects.index-V5ibNZII.js +3 -0
  40. package/apps/ui/dist/client/assets/react-dom-DL96Jor4.js +1 -0
  41. package/apps/ui/dist/client/assets/refresh-ccw-BgKjOiA6.js +1 -0
  42. package/apps/ui/dist/client/assets/reload-error-panel-AHqu0akK.js +1 -0
  43. package/apps/ui/dist/client/assets/routes-Df2tgpyd.js +1 -0
  44. package/apps/ui/dist/client/assets/scroll-text-fM0sMOB3.js +1 -0
  45. package/apps/ui/dist/client/assets/select-Bf2GwfPR.js +1 -0
  46. package/apps/ui/dist/client/assets/settings-5VQIzME0.js +1 -0
  47. package/apps/ui/dist/client/assets/sqlite-error-B6uZjUe8.js +1 -0
  48. package/apps/ui/dist/client/assets/styles-BhRkXgwB.css +1 -0
  49. package/apps/ui/dist/client/assets/tabs-OO4VU5KR.js +7 -0
  50. package/apps/ui/dist/client/assets/text-filter-DVAZySUS.js +2 -0
  51. package/apps/ui/dist/client/assets/threads._threadId-BB9tTsV4.js +1 -0
  52. package/apps/ui/dist/client/assets/threads._threadId-BgDhFj2I.js +1 -0
  53. package/apps/ui/dist/client/assets/useMutation-CC_B7uy5.js +1 -0
  54. package/apps/ui/dist/client/assets/useQuery-C5By6WKU.js +1 -0
  55. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CRW2kqj0.js +232 -0
  56. package/apps/ui/dist/server/assets/analytics-CYP_LT5Y.js +16 -0
  57. package/apps/ui/dist/server/assets/{analytics-CBNOYZwJ.js → analytics-CtpOMVMO.js} +13 -6
  58. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-BtexWY-K.js +613 -0
  59. package/apps/ui/dist/server/assets/{antigravity-conversations._conversationId-BIdYNy68.js → antigravity-conversations._conversationId-zMrR6v6R.js} +2 -2
  60. package/apps/ui/dist/server/assets/{antigravity-db-D9gW1D8G.js → antigravity-db-Bh8_U9uw.js} +11 -7
  61. package/apps/ui/dist/server/assets/{antigravity-keychain-panel-DcLyBBwd.js → antigravity-keychain-panel-CC7FLmAK.js} +1 -1
  62. package/apps/ui/dist/server/assets/{antigravity-queries-CgQhlQ7J.js → antigravity-queries-CGrJO9Vr.js} +6 -6
  63. package/apps/ui/dist/server/assets/{antigravity-server-DFUx4Khk.js → antigravity-server-CHRjVFqN.js} +11 -11
  64. package/apps/ui/dist/server/assets/{antigravity._workspaceKey-DnSlSC-C.js → antigravity._workspaceKey-B0QeYUOh.js} +2 -2
  65. package/apps/ui/dist/server/assets/{antigravity._workspaceKey-D42ixtzp.js → antigravity._workspaceKey-C3kP-qyN.js} +5 -5
  66. package/apps/ui/dist/server/assets/{antigravity.index-DZVT-cac.js → antigravity.index-CPCYkqCi.js} +2 -2
  67. package/apps/ui/dist/server/assets/{codex-queries-eOJGfHQj.js → codex-queries-CtgeZ7VL.js} +16 -14
  68. package/apps/ui/dist/server/assets/{codex-server-nrETIF--.js → codex-server-CNXSJuc2.js} +105 -120
  69. package/apps/ui/dist/server/assets/concurrency-VXtYvlGh.js +18 -0
  70. package/apps/ui/dist/server/assets/{createServerRpc-BtXIw2iP.js → createServerRpc-CF_DEwnm.js} +1 -1
  71. package/apps/ui/dist/server/assets/{createSsrRpc-COf5Zuye.js → createSsrRpc-C754NPki.js} +1 -1
  72. package/apps/ui/dist/server/assets/{cursor-db-B7agkAvM.js → cursor-db-cYZEU3WQ.js} +194 -7
  73. package/apps/ui/dist/server/assets/{cursor-queries-BMhuJeUO.js → cursor-queries-NCIM0Nat.js} +13 -11
  74. package/apps/ui/dist/server/assets/{cursor-recovery-9bJLs7vG.js → cursor-recovery-nq-kR62j.js} +1 -1
  75. package/apps/ui/dist/server/assets/{cursor-server-BgylIFgn.js → cursor-server-C3q7hrp-.js} +70 -41
  76. package/apps/ui/dist/server/assets/{cursor-threads._composerId-DXffY_CK.js → cursor-threads._composerId-BPJFWfJj.js} +2 -2
  77. package/apps/ui/dist/server/assets/cursor-threads._composerId-BkMMTQ3v.js +582 -0
  78. package/apps/ui/dist/server/assets/{cursor._workspaceKey-BP2J1x_x.js → cursor._workspaceKey-C5PdTaKB.js} +2 -2
  79. package/apps/ui/dist/server/assets/{cursor._workspaceKey-BQd0e-Pd.js → cursor._workspaceKey-Ckj7apKI.js} +11 -9
  80. package/apps/ui/dist/server/assets/{cursor.index-CQVxtCm8.js → cursor.index-DkWT-mxw.js} +2 -2
  81. package/apps/ui/dist/server/assets/{delete-confirm-dialog-PCD7S0_M.js → delete-confirm-dialog-BcBNCxWB.js} +5 -1
  82. package/apps/ui/dist/server/assets/empty-plugin-adapters-B3lHh1La.js +5 -0
  83. package/apps/ui/dist/server/assets/{export-dialog-DaPlOGFT.js → export-dialog-BItjWgkZ.js} +53 -11
  84. package/apps/ui/dist/server/assets/{projects._project-DUN3iWfg.js → projects._project-Bpbc3C-L.js} +5 -3
  85. package/apps/ui/dist/server/assets/{projects._project-Dim9Y0kD.js → projects._project-CvZho6EQ.js} +42 -12
  86. package/apps/ui/dist/server/assets/{projects.index-DjSQK5dm.js → projects.index-BkLiF2FF.js} +21 -7
  87. package/apps/ui/dist/server/assets/projects.index-DesYXwfi.js +14 -0
  88. package/apps/ui/dist/server/assets/route-search-ts4W9MJ9.js +38 -0
  89. package/apps/ui/dist/server/assets/{router-DrDgc-LD.js → router-6m-ihwqA.js} +78 -62
  90. package/apps/ui/dist/server/assets/{routes-B-GlEe2C.js → routes-Bsact1uB.js} +2 -2
  91. package/apps/ui/dist/server/assets/{routes-CNHAUMwo.js → routes-BzkJgq4W.js} +2 -2
  92. package/apps/ui/dist/server/assets/start-CI_0bSiY.js +4 -0
  93. package/apps/ui/dist/server/assets/tabs-CGA13IZM.js +502 -0
  94. package/apps/ui/dist/server/assets/{threads._threadId-CJzm4KrZ.js → threads._threadId-Bs0yuqO9.js} +2 -2
  95. package/apps/ui/dist/server/assets/threads._threadId-D2GYkVn6.js +639 -0
  96. package/apps/ui/dist/server/assets/ui-export-files-BHLX9bhN.js +83 -0
  97. package/apps/ui/dist/server/server.js +340 -218
  98. package/package.json +9 -9
  99. package/src/lib/antigravity-db.ts +20 -13
  100. package/src/lib/codex-analytics.ts +118 -18
  101. package/src/lib/codex-browser-db.ts +1 -25
  102. package/src/lib/codex-browser-export.ts +9 -69
  103. package/src/lib/cursor-db.ts +318 -7
  104. package/src/lib/cursor-exporter.ts +2 -2
  105. package/src/lib/ui-cache.ts +14 -1
  106. package/src/spiracha.ts +20 -1
  107. package/apps/ui/dist/client/assets/analytics-B_hYz65v.js +0 -1
  108. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-qiyygB7e.js +0 -1
  109. package/apps/ui/dist/client/assets/antigravity-conversations._conversationId-z1SQC2Kg.js +0 -1
  110. package/apps/ui/dist/client/assets/antigravity-keychain-panel-dYuRWtCf.js +0 -1
  111. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CliqUr7o.js +0 -1
  112. package/apps/ui/dist/client/assets/antigravity._workspaceKey-CnoBzyX6.js +0 -1
  113. package/apps/ui/dist/client/assets/antigravity.index-CakfZz_E.js +0 -1
  114. package/apps/ui/dist/client/assets/antigravity.index-DY7M1KhG.js +0 -1
  115. package/apps/ui/dist/client/assets/badge-aHE9ETVe.js +0 -1
  116. package/apps/ui/dist/client/assets/checkbox-DN3XnJaA.js +0 -1
  117. package/apps/ui/dist/client/assets/cursor-threads._composerId-BMQyx8qG.js +0 -1
  118. package/apps/ui/dist/client/assets/cursor-threads._composerId-BTlaA-tV.js +0 -1
  119. package/apps/ui/dist/client/assets/cursor._workspaceKey-CrgrfevV.js +0 -1
  120. package/apps/ui/dist/client/assets/cursor._workspaceKey-bYS2syGL.js +0 -1
  121. package/apps/ui/dist/client/assets/cursor.index-CTqZMPYU.js +0 -1
  122. package/apps/ui/dist/client/assets/cursor.index-Clsz4E_e.js +0 -2
  123. package/apps/ui/dist/client/assets/delete-confirm-dialog-DTpzBiNK.js +0 -11
  124. package/apps/ui/dist/client/assets/dist-BNAn99Pu.js +0 -1
  125. package/apps/ui/dist/client/assets/download-P3Rp23Ad.js +0 -1
  126. package/apps/ui/dist/client/assets/dropdown-menu-3qB5j9nt.js +0 -1
  127. package/apps/ui/dist/client/assets/es2015-Dwm_turD.js +0 -41
  128. package/apps/ui/dist/client/assets/export-dialog-CazdrASq.js +0 -1
  129. package/apps/ui/dist/client/assets/formatters-BdnWuM1z.js +0 -1
  130. package/apps/ui/dist/client/assets/index-BVFnfS78.js +0 -22
  131. package/apps/ui/dist/client/assets/json-panel-DLkS30sQ.js +0 -1
  132. package/apps/ui/dist/client/assets/metadata-section-jnIkB7dB.js +0 -1
  133. package/apps/ui/dist/client/assets/metric-card-CBZuWLzQ.js +0 -1
  134. package/apps/ui/dist/client/assets/page-header-CnD21cPn.js +0 -1
  135. package/apps/ui/dist/client/assets/projects._project-BLszwvYL.js +0 -1
  136. package/apps/ui/dist/client/assets/projects._project-DvLxYbvk.js +0 -1
  137. package/apps/ui/dist/client/assets/projects.index-COn8woBR.js +0 -1
  138. package/apps/ui/dist/client/assets/projects.index-DYs98skV.js +0 -3
  139. package/apps/ui/dist/client/assets/refresh-ccw-BDrYXjtD.js +0 -1
  140. package/apps/ui/dist/client/assets/reload-error-panel-DLAg0AW2.js +0 -1
  141. package/apps/ui/dist/client/assets/routes-BtF5-coe.js +0 -1
  142. package/apps/ui/dist/client/assets/scroll-text-CqaFm9by.js +0 -1
  143. package/apps/ui/dist/client/assets/select-DbnpwqL6.js +0 -1
  144. package/apps/ui/dist/client/assets/settings-CGX3VleN.js +0 -1
  145. package/apps/ui/dist/client/assets/styles-Ch0r3kMZ.css +0 -1
  146. package/apps/ui/dist/client/assets/text-document-panel-DPleOmmq.js +0 -1
  147. package/apps/ui/dist/client/assets/text-filter-7M6wRo-t.js +0 -2
  148. package/apps/ui/dist/client/assets/threads._threadId-D5w76IB-.js +0 -7
  149. package/apps/ui/dist/client/assets/threads._threadId-Dx85sI9P.js +0 -1
  150. package/apps/ui/dist/client/assets/useMutation-MZ3Hr9h9.js +0 -1
  151. package/apps/ui/dist/client/assets/useQuery-Cb4V0AT0.js +0 -1
  152. package/apps/ui/dist/server/assets/__23tanstack-start-plugin-adapters-BzCA6dXo.js +0 -5
  153. package/apps/ui/dist/server/assets/_tanstack-start-manifest_v-CBbkUXw6.js +0 -227
  154. package/apps/ui/dist/server/assets/antigravity-conversations._conversationId-B9Rm4EXh.js +0 -212
  155. package/apps/ui/dist/server/assets/cursor-threads._composerId-BsxFKzoJ.js +0 -218
  156. package/apps/ui/dist/server/assets/json-panel-RYsxWFae.js +0 -16
  157. package/apps/ui/dist/server/assets/metadata-section-D6Lbc7D6.js +0 -54
  158. package/apps/ui/dist/server/assets/start-HeKLHD9b.js +0 -4
  159. package/apps/ui/dist/server/assets/text-document-panel-D8JbQWAn.js +0 -23
  160. package/apps/ui/dist/server/assets/threads._threadId-DODTYddm.js +0 -1052
@@ -1,8 +1,10 @@
1
1
  import { t as createServerFn } from "../server.js";
2
- import { t as createServerRpc } from "./createServerRpc-BtXIw2iP.js";
3
- import { t as isRetryableSqliteError } from "./sqlite-error-LZDrnxdd.js";
2
+ import { t as createServerRpc } from "./createServerRpc-CF_DEwnm.js";
4
3
  import { a as cleanInlineTitle, c as formatInlineLiteral, d as readJsonlObjects, h as renderSection, i as cleanExtractedText, l as formatModelLabel, m as renderMetadataBlock, n as asObject, o as createExportWriteStream, p as renderDocumentTitle, r as asString, s as finalizeExportWriteStream, t as asNumber, u as getPortablePathBasename } from "./shared-CPRNYIql.js";
4
+ import { t as mapWithConcurrency } from "./concurrency-VXtYvlGh.js";
5
+ import { t as isRetryableSqliteError } from "./sqlite-error-LZDrnxdd.js";
5
6
  import { t as applyPathTransforms } from "./path-transforms-DL2IwtYd.js";
7
+ import { a as sanitizeExportFileName, n as ensureUiExportDir, o as zipExportDirectory, r as getExportMimeType, s as zipExportFile, t as buildUiExportDownloadUrl } from "./ui-export-files-BHLX9bhN.js";
6
8
  import { finished } from "node:stream/promises";
7
9
  import { z } from "zod";
8
10
  import { Database } from "bun:sqlite";
@@ -373,6 +375,16 @@ var toCachePath = (key) => {
373
375
  var hashCacheKeyParts = (...parts) => {
374
376
  return createHash("sha1").update(parts.join("|")).digest("hex");
375
377
  };
378
+ var hashCacheKeyPartsIterable = (parts) => {
379
+ const hash = createHash("sha1");
380
+ for (const part of parts) {
381
+ hash.update(String(part.length));
382
+ hash.update(":");
383
+ hash.update(part);
384
+ hash.update(";");
385
+ }
386
+ return hash.digest("hex");
387
+ };
376
388
  var getFileFingerprint = async (filePath) => {
377
389
  const metadata = await stat(filePath);
378
390
  return `${filePath}:${metadata.size}:${metadata.mtimeMs}`;
@@ -390,7 +402,8 @@ var getCachedJson = async (key) => {
390
402
  return null;
391
403
  }
392
404
  if (parsed && typeof parsed === "object" && "version" in parsed && parsed.version === CACHE_ENVELOPE_VERSION && "value" in parsed) return parsed.value;
393
- return parsed;
405
+ await rm(filePath, { force: true });
406
+ return null;
394
407
  };
395
408
  var setCachedJson = async (key, value) => {
396
409
  await ensureCacheDir();
@@ -492,20 +505,6 @@ var isPromiseLike = (value) => {
492
505
  if (typeof value !== "object" && typeof value !== "function" || value === null) return false;
493
506
  return "then" in value && typeof value.then === "function";
494
507
  };
495
- var mapWithConcurrency = async (values, limit, mapper) => {
496
- const results = new Array(values.length);
497
- let nextIndex = 0;
498
- const worker = async () => {
499
- while (true) {
500
- const currentIndex = nextIndex;
501
- nextIndex += 1;
502
- if (currentIndex >= values.length) return;
503
- results[currentIndex] = await mapper(values[currentIndex], currentIndex);
504
- }
505
- };
506
- await Promise.all(Array.from({ length: Math.min(limit, values.length) }, () => worker()));
507
- return results;
508
- };
509
508
  var openReadonlyDb = (dbPath, busyTimeoutMs) => {
510
509
  const db = new Database(dbPath, { readonly: true });
511
510
  try {
@@ -833,8 +832,11 @@ var listScopedThreads = (dbPath, projectName) => {
833
832
  var invalidateCodexUiCaches = async () => {
834
833
  await invalidateCacheByPrefix("analytics-", "thread-");
835
834
  };
836
- //#endregion
837
- //#region ../../src/lib/codex-analytics.ts
835
+ var resolveAnalyticsTranscriptConcurrency = (configuredValue = process.env.SPIRACHA_ANALYTICS_TRANSCRIPT_CONCURRENCY) => {
836
+ const parsed = Number(configuredValue);
837
+ if (!Number.isInteger(parsed) || parsed < 1) return 8;
838
+ return parsed;
839
+ };
838
840
  var roundToTwoDecimals = (value) => {
839
841
  return Number(value.toFixed(2));
840
842
  };
@@ -870,20 +872,68 @@ var buildModelsByTokens = (threads) => {
870
872
  return left.model.localeCompare(right.model);
871
873
  });
872
874
  };
873
- var buildAnalyticsCacheKey = async (dbPath, threads, project) => {
874
- const dbFingerprint = await getFileFingerprint(dbPath);
875
- const rolloutFingerprints = await Promise.all(threads.map((thread) => getFileFingerprint(thread.rollout_path)));
876
- return `analytics-${hashCacheKeyParts(dbFingerprint, project ?? "all", ...rolloutFingerprints)}`;
875
+ var timestampSignature = (thread) => {
876
+ return String(thread.updated_at_ms ?? thread.updated_at * 1e3);
877
+ };
878
+ var threadMetadataCacheKeyParts = (thread) => [
879
+ thread.id,
880
+ thread.rollout_path,
881
+ timestampSignature(thread),
882
+ String(thread.created_at_ms ?? thread.created_at * 1e3),
883
+ String(thread.tokens_used),
884
+ String(thread.archived),
885
+ String(thread.archived_at ?? ""),
886
+ thread.cwd,
887
+ thread.model ?? "",
888
+ thread.model_provider,
889
+ thread.cli_version,
890
+ thread.title,
891
+ thread.preview
892
+ ];
893
+ var buildCodexAnalyticsCacheKey = (dbPath, threads, project) => {
894
+ return `analytics-${hashCacheKeyPartsIterable((function* () {
895
+ yield "v2";
896
+ yield dbPath;
897
+ yield project ?? "all";
898
+ yield String(threads.length);
899
+ for (const thread of threads) yield* threadMetadataCacheKeyParts(thread);
900
+ })())}`;
901
+ };
902
+ var buildThreadAnalyticsCacheKey = (thread) => {
903
+ return `thread-analytics-${hashCacheKeyParts("v1", ...threadMetadataCacheKeyParts(thread))}`;
904
+ };
905
+ var parseThreadAnalyticsFile = async (sessionFile) => {
906
+ const toolNames = [];
907
+ let hasWebSearch = false;
908
+ for await (const parsed of readJsonlObjects(sessionFile)) {
909
+ if (parsed.type !== "response_item") continue;
910
+ const payload = asObject(parsed.payload);
911
+ if (!payload) continue;
912
+ const payloadType = asString(payload.type);
913
+ if (payloadType === "function_call") {
914
+ toolNames.push(asString(payload.name) ?? "unknown");
915
+ continue;
916
+ }
917
+ if (payloadType === "web_search_call" || payloadType === "web_search_end") hasWebSearch = true;
918
+ }
919
+ return {
920
+ hasWebSearch,
921
+ toolNames
922
+ };
923
+ };
924
+ var getCachedThreadAnalytics = async (thread) => {
925
+ return withCachedJson(buildThreadAnalyticsCacheKey(thread), () => parseThreadAnalyticsFile(thread.rollout_path));
877
926
  };
878
- var computeCodexAnalytics = async (threads) => {
927
+ var computeCodexAnalyticsFromThreads = async (threads, options = {}) => {
879
928
  const totalTokens = threads.reduce((sum, thread) => sum + thread.tokens_used, 0);
880
929
  const projectNames = new Set(threads.map((thread) => getPortablePathBasename(thread.cwd)).filter(Boolean));
881
930
  const toolUsage = /* @__PURE__ */ new Map();
882
- const transcripts = await Promise.all(threads.map((thread) => getCachedParsedCodexTranscript(thread.rollout_path)));
883
931
  let threadsWithWebSearch = 0;
884
- for (const transcript of transcripts) {
885
- if (transcript.stats.webSearchEventCount > 0) threadsWithWebSearch += 1;
886
- for (const event of transcript.events) if (event.kind === "tool_call") incrementCount(toolUsage, event.name);
932
+ const loadThreadAnalytics = options.loadThreadAnalytics ?? getCachedThreadAnalytics;
933
+ const threadAnalytics = await mapWithConcurrency(threads, options.transcriptConcurrency ?? resolveAnalyticsTranscriptConcurrency(), (thread) => loadThreadAnalytics(thread));
934
+ for (const analytics of threadAnalytics) {
935
+ if (analytics.hasWebSearch) threadsWithWebSearch += 1;
936
+ for (const toolName of analytics.toolNames) incrementCount(toolUsage, toolName);
887
937
  }
888
938
  return {
889
939
  modelsByTokens: buildModelsByTokens(threads),
@@ -904,7 +954,7 @@ var computeCodexAnalytics = async (threads) => {
904
954
  };
905
955
  var getCodexAnalytics = async (input) => {
906
956
  const threads = listScopedThreads(input.dbPath, input.project);
907
- return withCachedJson(await buildAnalyticsCacheKey(input.dbPath, threads, input.project), async () => computeCodexAnalytics(threads));
957
+ return withCachedJson(buildCodexAnalyticsCacheKey(input.dbPath, threads, input.project), async () => computeCodexAnalyticsFromThreads(threads, { transcriptConcurrency: input.transcriptConcurrency }));
908
958
  };
909
959
  //#endregion
910
960
  //#region ../../src/lib/codex-exporter-db.ts
@@ -1388,47 +1438,20 @@ var extractContentPart = (value) => {
1388
1438
  if (type === "input_image") return "[Image attached]";
1389
1439
  return text ?? "";
1390
1440
  };
1391
- var UI_EXPORT_URL_PREFIX = "/__exports/";
1392
- var DEFAULT_UI_EXPORT_DIR = path.join(os.tmpdir(), "spiracha-ui-exports");
1393
- var DEFAULT_EXPORT_MAX_AGE_MS = 1440 * 60 * 1e3;
1394
- var getUiExportDir = () => {
1395
- return process.env["SPIRACHA_UI_EXPORT_DIR"]?.trim() || DEFAULT_UI_EXPORT_DIR;
1396
- };
1397
- var ensureUiExportDir = async () => {
1398
- const exportDir = getUiExportDir();
1399
- await mkdir(exportDir, { recursive: true });
1400
- await purgeStaleUiExports(exportDir);
1401
- return exportDir;
1402
- };
1403
- var buildUiExportDownloadUrl = (filePath) => {
1404
- return `${UI_EXPORT_URL_PREFIX}${encodeURIComponent(path.basename(filePath))}`;
1405
- };
1406
- var purgeStaleUiExports = async (exportDir = getUiExportDir(), maxAgeMs = DEFAULT_EXPORT_MAX_AGE_MS) => {
1407
- const entries = await readdir(exportDir, { withFileTypes: true });
1408
- const cutoff = Date.now() - maxAgeMs;
1409
- await Promise.all(entries.filter((entry) => entry.isFile()).map(async (entry) => {
1410
- const filePath = path.join(exportDir, entry.name);
1411
- if ((await stat(filePath)).mtimeMs >= cutoff) return;
1412
- await rm(filePath, { force: true });
1413
- }));
1414
- };
1415
1441
  //#endregion
1416
1442
  //#region ../../src/lib/codex-browser-export.ts
1417
1443
  var LARGE_BROWSER_EXPORT_THRESHOLD_BYTES = 128 * 1024 * 1024;
1418
- var toSanitizedFileName = (value) => {
1419
- return value.replace(/[<>:"/\\|?*\u0000-\u001f]/gu, " ").replace(/\.\.+/gu, " ").replace(/\s+/gu, " ").trim();
1420
- };
1421
1444
  var formatReadableExportDate = (value) => {
1422
1445
  const date = new Date(value);
1423
1446
  return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, "0")}-${String(date.getUTCDate()).padStart(2, "0")}-${String(date.getUTCHours()).padStart(2, "0")}${String(date.getUTCMinutes()).padStart(2, "0")}`;
1424
1447
  };
1425
1448
  var buildExportBaseName = (thread) => {
1426
- return `${toSanitizedFileName(getPortablePathBasename(thread.cwd) || "thread") || "thread"}-${formatReadableExportDate(thread.updated_at_ms ?? thread.updated_at * 1e3)}-${thread.id.slice(0, 8)}`;
1449
+ return `${sanitizeExportFileName(getPortablePathBasename(thread.cwd) || "thread") || "thread"}-${formatReadableExportDate(thread.updated_at_ms ?? thread.updated_at * 1e3)}-${thread.id.slice(0, 8)}`;
1427
1450
  };
1428
1451
  var buildBatchExportBaseName = (threads) => {
1429
1452
  const firstThread = threads[0];
1430
1453
  if (!firstThread) throw new Error("No threads selected for export");
1431
- return `${toSanitizedFileName(getPortablePathBasename(firstThread.cwd) || "threads") || "threads"}-${formatReadableExportDate(Math.max(...threads.map((thread) => thread.updated_at_ms ?? thread.updated_at * 1e3)))}-threads-${threads.length}`;
1454
+ return `${sanitizeExportFileName(getPortablePathBasename(firstThread.cwd) || "threads") || "threads"}-${formatReadableExportDate(Math.max(...threads.map((thread) => thread.updated_at_ms ?? thread.updated_at * 1e3)))}-threads-${threads.length}`;
1432
1455
  };
1433
1456
  var buildUniqueArchivePath = (exportDir, exportBaseName) => {
1434
1457
  return path.join(exportDir, `${exportBaseName}-${randomUUID()}.zip`);
@@ -1457,9 +1480,6 @@ var toDownloadOptions = (input) => {
1457
1480
  threadIds: [input.threadId]
1458
1481
  };
1459
1482
  };
1460
- var getMimeType = (outputFormat) => {
1461
- return outputFormat === "md" ? "text/markdown; charset=utf-8" : "text/plain; charset=utf-8";
1462
- };
1463
1483
  var resolvePublicExportDir = async (publicExportDir) => {
1464
1484
  if (publicExportDir) {
1465
1485
  await ensureDirectory(publicExportDir);
@@ -1483,14 +1503,13 @@ var getRolloutSnapshot = async (rolloutPath) => {
1483
1503
  var logExportEvent = (level, event, details) => {
1484
1504
  console[level](`[spiracha:export] ${event}`, details);
1485
1505
  };
1486
- var logRolloutChangeIfDetected = (threadId, rolloutPath, beforeSnapshot, afterSnapshot) => {
1506
+ var logRolloutChangeIfDetected = (threadId, beforeSnapshot, afterSnapshot) => {
1487
1507
  if (beforeSnapshot.mtimeMs === afterSnapshot.mtimeMs && beforeSnapshot.sizeBytes === afterSnapshot.sizeBytes) return;
1488
1508
  logExportEvent("warn", "rollout_changed_during_export", {
1489
1509
  afterMtimeMs: afterSnapshot.mtimeMs,
1490
1510
  afterSizeBytes: afterSnapshot.sizeBytes,
1491
1511
  beforeMtimeMs: beforeSnapshot.mtimeMs,
1492
1512
  beforeSizeBytes: beforeSnapshot.sizeBytes,
1493
- rolloutPath,
1494
1513
  threadId
1495
1514
  });
1496
1515
  };
@@ -1507,50 +1526,13 @@ var cleanupExportWorkspace = async (workspacePath) => {
1507
1526
  });
1508
1527
  }
1509
1528
  };
1510
- var zipExportFile = async (sourcePath, zipPath) => {
1511
- const proc = Bun.spawn([
1512
- "zip",
1513
- "-9",
1514
- "-j",
1515
- zipPath,
1516
- sourcePath
1517
- ], {
1518
- stderr: "pipe",
1519
- stdout: "pipe"
1520
- });
1521
- const [stdoutText, stderrText, exitCode] = await Promise.all([
1522
- new Response(proc.stdout).text(),
1523
- new Response(proc.stderr).text(),
1524
- proc.exited
1525
- ]);
1526
- if (exitCode !== 0) throw new Error(`zip failed (${exitCode}): ${(stderrText || stdoutText).trim()}`);
1527
- };
1528
- var zipExportDirectory = async (sourceDirectory, zipPath) => {
1529
- const proc = Bun.spawn([
1530
- "zip",
1531
- "-9",
1532
- "-r",
1533
- zipPath,
1534
- "."
1535
- ], {
1536
- cwd: sourceDirectory,
1537
- stderr: "pipe",
1538
- stdout: "pipe"
1539
- });
1540
- const [stdoutText, stderrText, exitCode] = await Promise.all([
1541
- new Response(proc.stdout).text(),
1542
- new Response(proc.stderr).text(),
1543
- proc.exited
1544
- ]);
1545
- if (exitCode !== 0) throw new Error(`zip failed (${exitCode}): ${(stderrText || stdoutText).trim()}`);
1546
- };
1547
1529
  var renderCodexThreadDownload = async (input) => {
1548
1530
  const startedAt = Date.now();
1549
1531
  const browseData = getThreadBrowseData(input.dbPath, input.threadId);
1550
1532
  const extension = input.outputFormat === "md" ? "md" : "txt";
1551
1533
  const fileBaseName = buildExportBaseName(browseData.thread);
1552
1534
  const fileName = `${fileBaseName}.${extension}`;
1553
- const mimeType = getMimeType(input.outputFormat);
1535
+ const mimeType = getExportMimeType(input.outputFormat);
1554
1536
  const transform = (text) => input.pathDisplaySettings ? applyPathTransforms(text, {
1555
1537
  ...input.pathDisplaySettings,
1556
1538
  projectPath: browseData.thread.cwd
@@ -1558,12 +1540,11 @@ var renderCodexThreadDownload = async (input) => {
1558
1540
  const rolloutSnapshotBefore = await getRolloutSnapshot(browseData.thread.rollout_path);
1559
1541
  logExportEvent("info", "single_start", {
1560
1542
  fileName,
1561
- rolloutPath: browseData.thread.rollout_path,
1562
1543
  sizeBytes: rolloutSnapshotBefore.sizeBytes,
1563
1544
  threadId: input.threadId
1564
1545
  });
1565
1546
  try {
1566
- if (rolloutSnapshotBefore.sizeBytes > (input.largeExportThresholdBytes ?? LARGE_BROWSER_EXPORT_THRESHOLD_BYTES)) {
1547
+ if (input.zipArchive || rolloutSnapshotBefore.sizeBytes > (input.largeExportThresholdBytes ?? LARGE_BROWSER_EXPORT_THRESHOLD_BYTES)) {
1567
1548
  const exportBaseName = fileBaseName;
1568
1549
  const exportDir = await resolvePublicExportDir(input.publicExportDir);
1569
1550
  const workspaceDir = await createExportWorkspace(exportDir, exportBaseName);
@@ -1582,7 +1563,7 @@ var renderCodexThreadDownload = async (input) => {
1582
1563
  await cleanupExportWorkspace(workspaceDir);
1583
1564
  }
1584
1565
  const rolloutSnapshotAfter = await getRolloutSnapshot(browseData.thread.rollout_path);
1585
- logRolloutChangeIfDetected(input.threadId, browseData.thread.rollout_path, rolloutSnapshotBefore, rolloutSnapshotAfter);
1566
+ logRolloutChangeIfDetected(input.threadId, rolloutSnapshotBefore, rolloutSnapshotAfter);
1586
1567
  const zipStat = await Bun.file(zipPath).stat();
1587
1568
  logExportEvent("info", "single_zip_ready", {
1588
1569
  downloadUrl: buildUiExportDownloadUrl(zipPath),
@@ -1608,7 +1589,7 @@ var renderCodexThreadDownload = async (input) => {
1608
1589
  }, toDownloadOptions(input));
1609
1590
  if (!content) throw new Error(`Thread ${input.threadId} produced no exportable content`);
1610
1591
  const rolloutSnapshotAfter = await getRolloutSnapshot(browseData.thread.rollout_path);
1611
- logRolloutChangeIfDetected(input.threadId, browseData.thread.rollout_path, rolloutSnapshotBefore, rolloutSnapshotAfter);
1592
+ logRolloutChangeIfDetected(input.threadId, rolloutSnapshotBefore, rolloutSnapshotAfter);
1612
1593
  logExportEvent("info", "single_inline_ready", {
1613
1594
  durationMs: Date.now() - startedAt,
1614
1595
  fileName,
@@ -1677,7 +1658,7 @@ var renderCodexThreadsDownload = async (input) => {
1677
1658
  threadIds: [entry.thread.id]
1678
1659
  }, savedPath, transform)) throw new Error(`Thread ${entry.thread.id} produced no exportable content`);
1679
1660
  const rolloutSnapshotAfter = await getRolloutSnapshot(entry.thread.rollout_path);
1680
- logRolloutChangeIfDetected(entry.thread.id, entry.thread.rollout_path, rolloutSnapshotBefore, rolloutSnapshotAfter);
1661
+ logRolloutChangeIfDetected(entry.thread.id, rolloutSnapshotBefore, rolloutSnapshotAfter);
1681
1662
  }
1682
1663
  await zipExportDirectory(bundleDirectory, zipPath);
1683
1664
  } catch (error) {
@@ -1863,7 +1844,8 @@ var exportSchema = z.object({
1863
1844
  includeTools: z.boolean(),
1864
1845
  outputFormat: z.enum(["md", "txt"]),
1865
1846
  redactUsername: z.boolean(),
1866
- threadId: z.string().min(1)
1847
+ threadId: z.string().min(1),
1848
+ zipArchive: z.boolean().default(false)
1867
1849
  });
1868
1850
  var exportThreadsSchema = z.object({
1869
1851
  convertToProjectRoot: z.boolean(),
@@ -1872,7 +1854,8 @@ var exportThreadsSchema = z.object({
1872
1854
  includeTools: z.boolean(),
1873
1855
  outputFormat: z.enum(["md", "txt"]),
1874
1856
  redactUsername: z.boolean(),
1875
- threadIds: z.array(z.string().min(1)).min(1)
1857
+ threadIds: z.array(z.string().min(1)).min(1),
1858
+ zipArchive: z.boolean().default(true)
1876
1859
  });
1877
1860
  var getDbPath = () => process.env.SPIRACHA_CODEX_DB?.trim() || resolveCodexThreadDbPath();
1878
1861
  var isMissingFileError = (error) => {
@@ -1899,7 +1882,7 @@ var listProjectThreadsFn_createServerFn_handler = createServerRpc({
1899
1882
  name: "listProjectThreadsFn",
1900
1883
  filename: "src/lib/codex-server.ts"
1901
1884
  }, (opts) => listProjectThreadsFn.__executeServer(opts));
1902
- var listProjectThreadsFn = createServerFn({ method: "GET" }).inputValidator(projectSchema).handler(listProjectThreadsFn_createServerFn_handler, async ({ data }) => {
1885
+ var listProjectThreadsFn = createServerFn({ method: "GET" }).validator(projectSchema).handler(listProjectThreadsFn_createServerFn_handler, async ({ data }) => {
1903
1886
  return listProjectThreads(getDbPath(), data.project);
1904
1887
  });
1905
1888
  var getThreadSnapshotFn_createServerFn_handler = createServerRpc({
@@ -1907,7 +1890,7 @@ var getThreadSnapshotFn_createServerFn_handler = createServerRpc({
1907
1890
  name: "getThreadSnapshotFn",
1908
1891
  filename: "src/lib/codex-server.ts"
1909
1892
  }, (opts) => getThreadSnapshotFn.__executeServer(opts));
1910
- var getThreadSnapshotFn = createServerFn({ method: "GET" }).inputValidator(threadSchema).handler(getThreadSnapshotFn_createServerFn_handler, async ({ data }) => {
1893
+ var getThreadSnapshotFn = createServerFn({ method: "GET" }).validator(threadSchema).handler(getThreadSnapshotFn_createServerFn_handler, async ({ data }) => {
1911
1894
  const browseData = getThreadBrowseData(getDbPath(), data.threadId);
1912
1895
  const rollout = await getThreadRolloutLoadState(browseData.thread.rollout_path);
1913
1896
  let transcript = null;
@@ -1931,7 +1914,7 @@ var getThreadTranscriptFn_createServerFn_handler = createServerRpc({
1931
1914
  name: "getThreadTranscriptFn",
1932
1915
  filename: "src/lib/codex-server.ts"
1933
1916
  }, (opts) => getThreadTranscriptFn.__executeServer(opts));
1934
- var getThreadTranscriptFn = createServerFn({ method: "GET" }).inputValidator(threadSchema).handler(getThreadTranscriptFn_createServerFn_handler, async ({ data }) => {
1917
+ var getThreadTranscriptFn = createServerFn({ method: "GET" }).validator(threadSchema).handler(getThreadTranscriptFn_createServerFn_handler, async ({ data }) => {
1935
1918
  return getCachedThreadTranscriptPreview(getThreadBrowseData(getDbPath(), data.threadId).thread.rollout_path);
1936
1919
  });
1937
1920
  var getAnalyticsFn_createServerFn_handler = createServerRpc({
@@ -1939,7 +1922,7 @@ var getAnalyticsFn_createServerFn_handler = createServerRpc({
1939
1922
  name: "getAnalyticsFn",
1940
1923
  filename: "src/lib/codex-server.ts"
1941
1924
  }, (opts) => getAnalyticsFn.__executeServer(opts));
1942
- var getAnalyticsFn = createServerFn({ method: "GET" }).inputValidator(analyticsSchema).handler(getAnalyticsFn_createServerFn_handler, async ({ data }) => {
1925
+ var getAnalyticsFn = createServerFn({ method: "GET" }).validator(analyticsSchema).handler(getAnalyticsFn_createServerFn_handler, async ({ data }) => {
1943
1926
  return getCodexAnalytics({
1944
1927
  dbPath: getDbPath(),
1945
1928
  project: data.project
@@ -1950,7 +1933,7 @@ var exportThreadFn_createServerFn_handler = createServerRpc({
1950
1933
  name: "exportThreadFn",
1951
1934
  filename: "src/lib/codex-server.ts"
1952
1935
  }, (opts) => exportThreadFn.__executeServer(opts));
1953
- var exportThreadFn = createServerFn({ method: "POST" }).inputValidator(exportSchema).handler(exportThreadFn_createServerFn_handler, async ({ data }) => {
1936
+ var exportThreadFn = createServerFn({ method: "POST" }).validator(exportSchema).handler(exportThreadFn_createServerFn_handler, async ({ data }) => {
1954
1937
  return renderCodexThreadDownload({
1955
1938
  dbPath: getDbPath(),
1956
1939
  includeCommentary: data.includeCommentary,
@@ -1961,7 +1944,8 @@ var exportThreadFn = createServerFn({ method: "POST" }).inputValidator(exportSch
1961
1944
  convertToProjectRoot: data.convertToProjectRoot,
1962
1945
  redactUsername: data.redactUsername
1963
1946
  },
1964
- threadId: data.threadId
1947
+ threadId: data.threadId,
1948
+ zipArchive: data.zipArchive
1965
1949
  });
1966
1950
  });
1967
1951
  var exportThreadsFn_createServerFn_handler = createServerRpc({
@@ -1969,7 +1953,7 @@ var exportThreadsFn_createServerFn_handler = createServerRpc({
1969
1953
  name: "exportThreadsFn",
1970
1954
  filename: "src/lib/codex-server.ts"
1971
1955
  }, (opts) => exportThreadsFn.__executeServer(opts));
1972
- var exportThreadsFn = createServerFn({ method: "POST" }).inputValidator(exportThreadsSchema).handler(exportThreadsFn_createServerFn_handler, async ({ data }) => {
1956
+ var exportThreadsFn = createServerFn({ method: "POST" }).validator(exportThreadsSchema).handler(exportThreadsFn_createServerFn_handler, async ({ data }) => {
1973
1957
  return renderCodexThreadsDownload({
1974
1958
  dbPath: getDbPath(),
1975
1959
  includeCommentary: data.includeCommentary,
@@ -1980,7 +1964,8 @@ var exportThreadsFn = createServerFn({ method: "POST" }).inputValidator(exportTh
1980
1964
  convertToProjectRoot: data.convertToProjectRoot,
1981
1965
  redactUsername: data.redactUsername
1982
1966
  },
1983
- threadIds: data.threadIds
1967
+ threadIds: data.threadIds,
1968
+ zipArchive: data.zipArchive
1984
1969
  });
1985
1970
  });
1986
1971
  var deleteThreadFn_createServerFn_handler = createServerRpc({
@@ -1988,7 +1973,7 @@ var deleteThreadFn_createServerFn_handler = createServerRpc({
1988
1973
  name: "deleteThreadFn",
1989
1974
  filename: "src/lib/codex-server.ts"
1990
1975
  }, (opts) => deleteThreadFn.__executeServer(opts));
1991
- var deleteThreadFn = createServerFn({ method: "POST" }).inputValidator(deleteThreadSchema).handler(deleteThreadFn_createServerFn_handler, async ({ data }) => {
1976
+ var deleteThreadFn = createServerFn({ method: "POST" }).validator(deleteThreadSchema).handler(deleteThreadFn_createServerFn_handler, async ({ data }) => {
1992
1977
  return deleteCodexThread(getDbPath(), data.threadId, { deleteSessionFiles: data.deleteSessionFiles });
1993
1978
  });
1994
1979
  var deleteThreadsFn_createServerFn_handler = createServerRpc({
@@ -1996,7 +1981,7 @@ var deleteThreadsFn_createServerFn_handler = createServerRpc({
1996
1981
  name: "deleteThreadsFn",
1997
1982
  filename: "src/lib/codex-server.ts"
1998
1983
  }, (opts) => deleteThreadsFn.__executeServer(opts));
1999
- var deleteThreadsFn = createServerFn({ method: "POST" }).inputValidator(deleteThreadsSchema).handler(deleteThreadsFn_createServerFn_handler, async ({ data }) => {
1984
+ var deleteThreadsFn = createServerFn({ method: "POST" }).validator(deleteThreadsSchema).handler(deleteThreadsFn_createServerFn_handler, async ({ data }) => {
2000
1985
  return deleteCodexThreads(getDbPath(), data.threadIds, { deleteSessionFiles: data.deleteSessionFiles });
2001
1986
  });
2002
1987
  var deleteProjectFn_createServerFn_handler = createServerRpc({
@@ -2004,7 +1989,7 @@ var deleteProjectFn_createServerFn_handler = createServerRpc({
2004
1989
  name: "deleteProjectFn",
2005
1990
  filename: "src/lib/codex-server.ts"
2006
1991
  }, (opts) => deleteProjectFn.__executeServer(opts));
2007
- var deleteProjectFn = createServerFn({ method: "POST" }).inputValidator(deleteProjectSchema).handler(deleteProjectFn_createServerFn_handler, async ({ data }) => {
1992
+ var deleteProjectFn = createServerFn({ method: "POST" }).validator(deleteProjectSchema).handler(deleteProjectFn_createServerFn_handler, async ({ data }) => {
2008
1993
  return deleteCodexProject(getDbPath(), data.project, { deleteSessionFiles: data.deleteSessionFiles });
2009
1994
  });
2010
1995
  var recoverProjectThreadsFn_createServerFn_handler = createServerRpc({
@@ -2012,7 +1997,7 @@ var recoverProjectThreadsFn_createServerFn_handler = createServerRpc({
2012
1997
  name: "recoverProjectThreadsFn",
2013
1998
  filename: "src/lib/codex-server.ts"
2014
1999
  }, (opts) => recoverProjectThreadsFn.__executeServer(opts));
2015
- var recoverProjectThreadsFn = createServerFn({ method: "POST" }).inputValidator(projectSchema).handler(recoverProjectThreadsFn_createServerFn_handler, async ({ data }) => {
2000
+ var recoverProjectThreadsFn = createServerFn({ method: "POST" }).validator(projectSchema).handler(recoverProjectThreadsFn_createServerFn_handler, async ({ data }) => {
2016
2001
  return recoverCodexProjectThreads(getDbPath(), data.project);
2017
2002
  });
2018
2003
  //#endregion
@@ -0,0 +1,18 @@
1
+ //#region ../../src/lib/concurrency.ts
2
+ var mapWithConcurrency = async (values, limit, mapper) => {
3
+ if (values.length === 0) return [];
4
+ const workerLimit = Math.max(1, Number.isFinite(limit) ? Math.floor(limit) : 1);
5
+ const results = new Array(values.length);
6
+ let nextIndex = 0;
7
+ const worker = async () => {
8
+ while (nextIndex < values.length) {
9
+ const currentIndex = nextIndex;
10
+ nextIndex += 1;
11
+ results[currentIndex] = await mapper(values[currentIndex], currentIndex);
12
+ }
13
+ };
14
+ await Promise.all(Array.from({ length: Math.min(workerLimit, values.length) }, () => worker()));
15
+ return results;
16
+ };
17
+ //#endregion
18
+ export { mapWithConcurrency as t };
@@ -1,5 +1,5 @@
1
1
  import { n as TSS_SERVER_FUNCTION } from "../server.js";
2
- //#region ../../node_modules/.bun/@tanstack+start-server-core@1.169.3/node_modules/@tanstack/start-server-core/dist/esm/createServerRpc.js
2
+ //#region ../../node_modules/.bun/@tanstack+start-server-core@1.169.14/node_modules/@tanstack/start-server-core/dist/esm/createServerRpc.js
3
3
  var createServerRpc = (serverFnMeta, splitImportFn) => {
4
4
  const url = "/_serverFn/" + serverFnMeta.id;
5
5
  return Object.assign(splitImportFn, {
@@ -1,5 +1,5 @@
1
1
  import { n as TSS_SERVER_FUNCTION, r as getServerFnById } from "../server.js";
2
- //#region ../../node_modules/.bun/@tanstack+start-server-core@1.169.3/node_modules/@tanstack/start-server-core/dist/esm/createSsrRpc.js
2
+ //#region ../../node_modules/.bun/@tanstack+start-server-core@1.169.14/node_modules/@tanstack/start-server-core/dist/esm/createSsrRpc.js
3
3
  var createSsrRpc = (functionId) => {
4
4
  const url = "/_serverFn/" + functionId;
5
5
  const serverFnMeta = { id: functionId };