reeval 0.0.1

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 (213) hide show
  1. package/LICENSE +202 -0
  2. package/THIRD_PARTY_NOTICES.md +2160 -0
  3. package/assets/package.json +9 -0
  4. package/assets/pnpm-lock.yaml +1336 -0
  5. package/dist/agent-DVHkx8aT.js +532 -0
  6. package/dist/agent-DVHkx8aT.js.map +1 -0
  7. package/dist/analysis-CxSCt1YY.js +16 -0
  8. package/dist/analysis-CxSCt1YY.js.map +1 -0
  9. package/dist/assemble-B-nmz8oH.js +695 -0
  10. package/dist/assemble-B-nmz8oH.js.map +1 -0
  11. package/dist/assemble-CmRVDZ2Q.js +2 -0
  12. package/dist/attempt-BdRQ9jKX.js +176 -0
  13. package/dist/attempt-BdRQ9jKX.js.map +1 -0
  14. package/dist/bridge/index.mjs +1911 -0
  15. package/dist/bridge/package.json +13 -0
  16. package/dist/bridge/pnpm-lock.yaml +1041 -0
  17. package/dist/bridge/pnpm-workspace.yaml +2 -0
  18. package/dist/budget-DBUrH4jX.js +8 -0
  19. package/dist/budget-DBUrH4jX.js.map +1 -0
  20. package/dist/cli--CQ3Iy9q.js +1865 -0
  21. package/dist/cli--CQ3Iy9q.js.map +1 -0
  22. package/dist/cli-spec-DKAu09Gi.js +478 -0
  23. package/dist/cli-spec-DKAu09Gi.js.map +1 -0
  24. package/dist/cli.d.ts +1 -0
  25. package/dist/cli.js +8 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/colors-QV9dFVhN.js +34 -0
  28. package/dist/colors-QV9dFVhN.js.map +1 -0
  29. package/dist/command-BSJzHMtP.js +280 -0
  30. package/dist/command-BSJzHMtP.js.map +1 -0
  31. package/dist/command-CEm8PZ1N.js +1043 -0
  32. package/dist/command-CEm8PZ1N.js.map +1 -0
  33. package/dist/command-D-jnQWVG.js +673 -0
  34. package/dist/command-D-jnQWVG.js.map +1 -0
  35. package/dist/command-DQAvbG7d.js +432 -0
  36. package/dist/command-DQAvbG7d.js.map +1 -0
  37. package/dist/commands-A4udfyKZ.js +2 -0
  38. package/dist/commands-CF8mOfiu.js +207 -0
  39. package/dist/commands-CF8mOfiu.js.map +1 -0
  40. package/dist/config-Cuj0kVYj.js +415 -0
  41. package/dist/config-Cuj0kVYj.js.map +1 -0
  42. package/dist/context-loi9OCZv.js +106 -0
  43. package/dist/context-loi9OCZv.js.map +1 -0
  44. package/dist/core-tLN-z1Be.js +96 -0
  45. package/dist/core-tLN-z1Be.js.map +1 -0
  46. package/dist/db-Cjj2ZsfQ.js +2 -0
  47. package/dist/db-DxDzMhtB.js +827 -0
  48. package/dist/db-DxDzMhtB.js.map +1 -0
  49. package/dist/debug-D24NOQH1.js +89 -0
  50. package/dist/debug-D24NOQH1.js.map +1 -0
  51. package/dist/debug-SEmW4w8f.js +2 -0
  52. package/dist/dist-BZXYHN2X.js +1673 -0
  53. package/dist/dist-BZXYHN2X.js.map +1 -0
  54. package/dist/docker-DQDZWXF9.js +20 -0
  55. package/dist/docker-DQDZWXF9.js.map +1 -0
  56. package/dist/docker-DnWAVdEm.js +2 -0
  57. package/dist/docker-oSbCExHL.js +153 -0
  58. package/dist/docker-oSbCExHL.js.map +1 -0
  59. package/dist/doctor-CxlH1pDM.js +525 -0
  60. package/dist/doctor-CxlH1pDM.js.map +1 -0
  61. package/dist/egress-73SQfKdx.js +619 -0
  62. package/dist/egress-73SQfKdx.js.map +1 -0
  63. package/dist/env-BQqj93gu.js +21 -0
  64. package/dist/env-BQqj93gu.js.map +1 -0
  65. package/dist/environment-Mz7wvrtD.js +552 -0
  66. package/dist/environment-Mz7wvrtD.js.map +1 -0
  67. package/dist/errors-C9w_ud7g.js +160 -0
  68. package/dist/errors-C9w_ud7g.js.map +1 -0
  69. package/dist/errors-CSxfJ4qu.js +11 -0
  70. package/dist/errors-CSxfJ4qu.js.map +1 -0
  71. package/dist/files--6CEUXm7.js +2 -0
  72. package/dist/files-BLlrhU4-.js +62 -0
  73. package/dist/files-BLlrhU4-.js.map +1 -0
  74. package/dist/files-Bd25OAQH.js +2 -0
  75. package/dist/files-BvHCFWgD.js +2 -0
  76. package/dist/files-D2-qn_Dl.js +275 -0
  77. package/dist/files-D2-qn_Dl.js.map +1 -0
  78. package/dist/files-bF2fPuT9.js +99 -0
  79. package/dist/files-bF2fPuT9.js.map +1 -0
  80. package/dist/git-D6hMeieS.js +44 -0
  81. package/dist/git-D6hMeieS.js.map +1 -0
  82. package/dist/harness-ls5aX1UO.js +131 -0
  83. package/dist/harness-ls5aX1UO.js.map +1 -0
  84. package/dist/harness.d.ts +74 -0
  85. package/dist/harness.js +2 -0
  86. package/dist/header-DzFDoMCI.js +78 -0
  87. package/dist/header-DzFDoMCI.js.map +1 -0
  88. package/dist/ids-Bp6ut7ZD.js +49 -0
  89. package/dist/ids-Bp6ut7ZD.js.map +1 -0
  90. package/dist/images-Cc1-coFc.js +286 -0
  91. package/dist/images-Cc1-coFc.js.map +1 -0
  92. package/dist/index.d.ts +97 -0
  93. package/dist/index.js +1959 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/init-CFljS8BJ.js +344 -0
  96. package/dist/init-CFljS8BJ.js.map +1 -0
  97. package/dist/init-z2ZPn9Tj.js +2 -0
  98. package/dist/invocations-rXktgSAn.js +157 -0
  99. package/dist/invocations-rXktgSAn.js.map +1 -0
  100. package/dist/jiti-BOLXpKyG.js +46 -0
  101. package/dist/jiti-BOLXpKyG.js.map +1 -0
  102. package/dist/judge-D8Uf4dA9.js +146 -0
  103. package/dist/judge-D8Uf4dA9.js.map +1 -0
  104. package/dist/judge.d.ts +21 -0
  105. package/dist/judge.js +19 -0
  106. package/dist/judge.js.map +1 -0
  107. package/dist/live-Bs3LReMV.js +98 -0
  108. package/dist/live-Bs3LReMV.js.map +1 -0
  109. package/dist/matchers-DyLvm7EG.js +374 -0
  110. package/dist/matchers-DyLvm7EG.js.map +1 -0
  111. package/dist/model-BdO79gWz.js +44 -0
  112. package/dist/model-BdO79gWz.js.map +1 -0
  113. package/dist/model-CDL98xue.js +725 -0
  114. package/dist/model-CDL98xue.js.map +1 -0
  115. package/dist/model-v-0_Ik7S.js +2 -0
  116. package/dist/node-kG64XxdE.js +506 -0
  117. package/dist/node-kG64XxdE.js.map +1 -0
  118. package/dist/opencode-providers-DZuD_oYt.js +3149 -0
  119. package/dist/opencode-providers-DZuD_oYt.js.map +1 -0
  120. package/dist/options-CAQhu--C.js +452 -0
  121. package/dist/options-CAQhu--C.js.map +1 -0
  122. package/dist/patch-BkKje4cp.js +69 -0
  123. package/dist/patch-BkKje4cp.js.map +1 -0
  124. package/dist/paths-CBvm6pap.js +72 -0
  125. package/dist/paths-CBvm6pap.js.map +1 -0
  126. package/dist/plan-gwk6dJ8c.js +237 -0
  127. package/dist/plan-gwk6dJ8c.js.map +1 -0
  128. package/dist/preflight-BtubXKQ8.js +2 -0
  129. package/dist/preflight-BypZMNBG.js +185 -0
  130. package/dist/preflight-BypZMNBG.js.map +1 -0
  131. package/dist/prepare-Cwv0bHs_.js +3 -0
  132. package/dist/prepare-D6Uzcubb.js +213 -0
  133. package/dist/prepare-D6Uzcubb.js.map +1 -0
  134. package/dist/provenance-Dfb8YY5Y.js +129 -0
  135. package/dist/provenance-Dfb8YY5Y.js.map +1 -0
  136. package/dist/provider-BDbNOQhQ.js +2 -0
  137. package/dist/provider-CmAYTQQs.js +14 -0
  138. package/dist/provider-CmAYTQQs.js.map +1 -0
  139. package/dist/providers-2p3ylMHI.js +107 -0
  140. package/dist/providers-2p3ylMHI.js.map +1 -0
  141. package/dist/providers-BUOxitcT.js +2 -0
  142. package/dist/query-CFATHZmV.js +91 -0
  143. package/dist/query-CFATHZmV.js.map +1 -0
  144. package/dist/query-DR4m6CXf.js +2 -0
  145. package/dist/record-DQ8wzyco.js +99 -0
  146. package/dist/record-DQ8wzyco.js.map +1 -0
  147. package/dist/redact-C4fL_bZP.js +167 -0
  148. package/dist/redact-C4fL_bZP.js.map +1 -0
  149. package/dist/results-CeXb8Wde.js +37 -0
  150. package/dist/results-CeXb8Wde.js.map +1 -0
  151. package/dist/root-CFDjpWuc.js +110 -0
  152. package/dist/root-CFDjpWuc.js.map +1 -0
  153. package/dist/sandbox-By2gkdkC.js +133 -0
  154. package/dist/sandbox-By2gkdkC.js.map +1 -0
  155. package/dist/sandbox.d.ts +41 -0
  156. package/dist/sandbox.js +2 -0
  157. package/dist/server-Bi61uiY0.js +350 -0
  158. package/dist/server-Bi61uiY0.js.map +1 -0
  159. package/dist/server-CsSBL8NC.js +2 -0
  160. package/dist/source-BXzrmof5.js +2 -0
  161. package/dist/source-Bsfa3LZH.js +40 -0
  162. package/dist/source-Bsfa3LZH.js.map +1 -0
  163. package/dist/src-55j1zNHH.js +3 -0
  164. package/dist/src-AEwxd1UP.js +602 -0
  165. package/dist/src-AEwxd1UP.js.map +1 -0
  166. package/dist/src-BDwSuyIo.js +3 -0
  167. package/dist/src-BQyMiWri.js +490 -0
  168. package/dist/src-BQyMiWri.js.map +1 -0
  169. package/dist/src-C-LHyTSV.js +3 -0
  170. package/dist/src-Cmp-7YrD.js +1136 -0
  171. package/dist/src-Cmp-7YrD.js.map +1 -0
  172. package/dist/src-D0RdqpNb.js +252 -0
  173. package/dist/src-D0RdqpNb.js.map +1 -0
  174. package/dist/src-D8KYzxBX.js +793 -0
  175. package/dist/src-D8KYzxBX.js.map +1 -0
  176. package/dist/src-DEgff9Z7.js +4 -0
  177. package/dist/src-DXx_29pq.js +567 -0
  178. package/dist/src-DXx_29pq.js.map +1 -0
  179. package/dist/src-DwwiVLqv.js +2937 -0
  180. package/dist/src-DwwiVLqv.js.map +1 -0
  181. package/dist/src-N7E_mfcZ.js +2 -0
  182. package/dist/src-W9g-y5X5.js +3 -0
  183. package/dist/src-daS0wKH2.js +3 -0
  184. package/dist/state-Cyw3QTsN.js +2 -0
  185. package/dist/state-DZ7eqb1F.js +167 -0
  186. package/dist/state-DZ7eqb1F.js.map +1 -0
  187. package/dist/stats-BNAHlNMD.js +114 -0
  188. package/dist/stats-BNAHlNMD.js.map +1 -0
  189. package/dist/studio-app/assets/index-D6XyfFSH.js +58 -0
  190. package/dist/studio-app/assets/index-xwzWdcE_.css +2 -0
  191. package/dist/studio-app/favicon.svg +1 -0
  192. package/dist/studio-app/index.html +15 -0
  193. package/dist/summary-D7Ttky0z.js +166 -0
  194. package/dist/summary-D7Ttky0z.js.map +1 -0
  195. package/dist/text-gEcKjAyp.js +29 -0
  196. package/dist/text-gEcKjAyp.js.map +1 -0
  197. package/dist/types-C5vI3g1C.js +9 -0
  198. package/dist/types-C5vI3g1C.js.map +1 -0
  199. package/dist/types-DLec-6Cx.d.ts +1535 -0
  200. package/dist/usage-DsYUqIUM.js +24 -0
  201. package/dist/usage-DsYUqIUM.js.map +1 -0
  202. package/dist/view/index.d.ts +645 -0
  203. package/dist/view/index.js +8 -0
  204. package/dist/views-BrHOv6wg.js +220 -0
  205. package/dist/views-BrHOv6wg.js.map +1 -0
  206. package/dist/views-CwCWLWqo.js +3 -0
  207. package/dist/worker-entry-DnYkANPG.js +506 -0
  208. package/dist/worker-entry-DnYkANPG.js.map +1 -0
  209. package/dist/workspace-C2S0Z6gl.js +327 -0
  210. package/dist/workspace-C2S0Z6gl.js.map +1 -0
  211. package/dist/workspace-CyoXG6CY.js +2 -0
  212. package/docker/Dockerfile +19 -0
  213. package/package.json +79 -0
@@ -0,0 +1,350 @@
1
+ import { i as redactSecrets } from "./redact-C4fL_bZP.js";
2
+ import { a as parseDataPath, r as artifactType, t as RUN_ID } from "./paths-CBvm6pap.js";
3
+ import { s as recordFileName } from "./ids-Bp6ut7ZD.js";
4
+ import { l as parseDebugLog, u as parseNdjson } from "./debug-D24NOQH1.js";
5
+ import { i as parseAttemptKey, t as attemptDebugDir } from "./files-BLlrhU4-.js";
6
+ import { a as sortAnalyses } from "./analysis-CxSCt1YY.js";
7
+ import { g as indexFiles } from "./model-CDL98xue.js";
8
+ import { a as readableDebugRequest } from "./record-DQ8wzyco.js";
9
+ import { c as readableLiveProgress, i as isFinished, n as LIVE_FILE } from "./live-Bs3LReMV.js";
10
+ import { c as recordFile, f as scratchDir } from "./files-D2-qn_Dl.js";
11
+ import { n as resolveFile, t as listHeaders } from "./source-Bsfa3LZH.js";
12
+ import { createReadStream, existsSync } from "node:fs";
13
+ import { hostname } from "node:os";
14
+ import { extname, join, resolve, sep } from "node:path";
15
+ import { randomBytes, timingSafeEqual } from "node:crypto";
16
+ import { Readable } from "node:stream";
17
+ import { readFile, readdir, realpath, stat } from "node:fs/promises";
18
+ import { Hono } from "hono";
19
+ import { getCookie, setCookie } from "hono/cookie";
20
+ import { streamSSE } from "hono/streaming";
21
+ const stagingRoot = (root) => join(root, ".reeval", "staging");
22
+ /** Whether the process that wrote `progress` is gone, when it ran on this host. */
23
+ function exited(progress) {
24
+ if (progress.host !== hostname()) return false;
25
+ try {
26
+ process.kill(progress.pid, 0);
27
+ return false;
28
+ } catch (error) {
29
+ return error.code === "ESRCH";
30
+ }
31
+ }
32
+ async function readProgress(root, runId) {
33
+ const text = await readFile(join(stagingRoot(root), runId, LIVE_FILE), "utf8").catch(() => null);
34
+ if (text === null) return null;
35
+ try {
36
+ const progress = readableLiveProgress(JSON.parse(text));
37
+ return progress?.runId === runId ? progress : null;
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+ const landed = (source, runId) => [source.historyDir, scratchDir(source.root)].some((dir) => existsSync(recordFile(dir, runId)));
43
+ /**
44
+ * Every run in progress, newest first; one whose record has landed isn't, and one whose process
45
+ * exited or went quiet is `stopped`. A progress file that can't be read is left out.
46
+ */
47
+ async function listLive(source, options = {}) {
48
+ if (!source.scratch) return [];
49
+ const now = options.now ?? Date.now();
50
+ const staleMs = options.staleMs ?? 15e3;
51
+ const names = await readdir(stagingRoot(source.root)).catch(() => []);
52
+ const runs = [];
53
+ for (const runId of names.filter((n) => RUN_ID.test(n)).sort().reverse()) {
54
+ const progress = await readProgress(source.root, runId);
55
+ if (!progress || landed(source, runId)) continue;
56
+ const quiet = now - Date.parse(progress.heartbeatAt) > staleMs;
57
+ const { schemaVersion: _, pid: __, host: ___, heartbeatAt: ____, ...run } = progress;
58
+ runs.push({
59
+ ...run,
60
+ state: quiet || exited(progress) ? "stopped" : progress.phase
61
+ });
62
+ }
63
+ return runs;
64
+ }
65
+ /**
66
+ * A finished attempt's transcript, as `transcript.jsonl` has it, from the record its worker staged;
67
+ * null for an attempt that isn't live and finished, or a file outside the run's staging directory.
68
+ */
69
+ async function liveTranscript(source, runId, key) {
70
+ if (!source.scratch || !RUN_ID.test(runId)) return null;
71
+ const attempt = (await readProgress(source.root, runId))?.attempts.find((a) => a.key === key);
72
+ if (!attempt || !isFinished(attempt.status)) return null;
73
+ const base = join(stagingRoot(source.root), runId);
74
+ try {
75
+ const [realBase, real] = await Promise.all([realpath(base), realpath(join(base, "evals", recordFileName(key)))]);
76
+ if (!real.startsWith(realBase + sep)) return null;
77
+ const record = JSON.parse(await readFile(real, "utf8"));
78
+ const { transcriptLines } = await import("./assemble-CmRVDZ2Q.js");
79
+ return redactSecrets(transcriptLines(record));
80
+ } catch {
81
+ return null;
82
+ }
83
+ }
84
+ /** Calls `onChange` with the live runs whenever they change, checking every `pollMs`. */
85
+ function watchLive(source, onChange, pollMs = 400) {
86
+ let signature = "";
87
+ let busy = false;
88
+ const check = async () => {
89
+ if (busy) return;
90
+ busy = true;
91
+ try {
92
+ const runs = await listLive(source);
93
+ const next = JSON.stringify(runs);
94
+ if (next !== signature) {
95
+ const first = signature === "";
96
+ signature = next;
97
+ if (!first) onChange(runs);
98
+ }
99
+ } finally {
100
+ busy = false;
101
+ }
102
+ };
103
+ check();
104
+ const poll = setInterval(() => void check(), pollMs);
105
+ poll.unref();
106
+ return () => clearInterval(poll);
107
+ }
108
+ //#endregion
109
+ //#region src/studio/server.ts
110
+ const COOKIE = "reeval_studio_token";
111
+ const newToken = () => randomBytes(32).toString("base64url");
112
+ /** Every name a browser may use to reach a server bound to `host:port`. */
113
+ function allowedHosts(host, port) {
114
+ const names = /* @__PURE__ */ new Set([
115
+ "127.0.0.1",
116
+ "localhost",
117
+ "[::1]"
118
+ ]);
119
+ names.add(host.includes(":") && !host.startsWith("[") ? `[${host}]` : host);
120
+ return [...names].map((name) => `${name}:${port}`);
121
+ }
122
+ const APP_TYPES = {
123
+ ".html": "text/html; charset=utf-8",
124
+ ".js": "text/javascript; charset=utf-8",
125
+ ".css": "text/css; charset=utf-8",
126
+ ".svg": "image/svg+xml",
127
+ ".png": "image/png",
128
+ ".ico": "image/x-icon",
129
+ ".woff2": "font/woff2",
130
+ ".json": "application/json; charset=utf-8"
131
+ };
132
+ const APP_CSP = [
133
+ "default-src 'self'",
134
+ "script-src 'self'",
135
+ "style-src 'self' 'unsafe-inline'",
136
+ "img-src 'self' data:",
137
+ "connect-src 'self'",
138
+ "font-src 'self'",
139
+ "object-src 'none'",
140
+ "base-uri 'none'",
141
+ "form-action 'none'",
142
+ "frame-ancestors 'none'"
143
+ ].join("; ");
144
+ const sameToken = (a, b) => {
145
+ const x = Buffer.from(a);
146
+ const y = Buffer.from(b);
147
+ return x.length === y.length && timingSafeEqual(x, y);
148
+ };
149
+ /** The request path relative to the root, percent-decoded exactly once; null if malformed. */
150
+ function requestPath(url) {
151
+ let path;
152
+ try {
153
+ path = decodeURIComponent(new URL(url).pathname);
154
+ } catch {
155
+ return null;
156
+ }
157
+ if (path.includes("\0") || path.includes("\\")) return null;
158
+ return path.replace(/^\/+/, "");
159
+ }
160
+ async function sendFile(c, file, headers) {
161
+ const info = await stat(file);
162
+ const etag = `W/"${info.size.toString(16)}-${Math.floor(info.mtimeMs).toString(16)}"`;
163
+ const common = {
164
+ ...headers,
165
+ ETag: etag,
166
+ "Content-Length": String(info.size)
167
+ };
168
+ if (c.req.header("if-none-match") === etag) return c.body(null, 304, { ETag: etag });
169
+ if (c.req.method === "HEAD") return c.body(null, 200, common);
170
+ const body = Readable.toWeb(createReadStream(file));
171
+ return c.body(body, 200, common);
172
+ }
173
+ /** The studio's local HTTP app: read-only, GET only, behind a Host check and a session token. */
174
+ function createStudioApp(options) {
175
+ const { source, token, hosts } = options;
176
+ const maxClients = options.maxEventClients ?? 16;
177
+ let clients = 0;
178
+ const app = new Hono();
179
+ app.use("*", async (c, next) => {
180
+ c.header("Referrer-Policy", "no-referrer");
181
+ c.header("X-Content-Type-Options", "nosniff");
182
+ c.header("Cross-Origin-Resource-Policy", "same-origin");
183
+ if (c.req.method !== "GET" && c.req.method !== "HEAD") return c.text("Method not allowed", 405, { Allow: "GET, HEAD" });
184
+ const host = c.req.header("host") ?? "";
185
+ if (hosts.length && !hosts.includes(host)) return c.text("Unknown host", 403);
186
+ const origin = c.req.header("origin");
187
+ if (origin && hosts.length && !hosts.some((h) => origin === `http://${h}`)) return c.text("Cross-origin requests are not allowed", 403);
188
+ if (token === null) return next();
189
+ const url = new URL(c.req.url);
190
+ const offered = url.searchParams.get("token");
191
+ if (offered !== null) {
192
+ if (!sameToken(offered, token)) return c.text("Wrong studio token", 401);
193
+ setCookie(c, COOKIE, token, {
194
+ httpOnly: true,
195
+ sameSite: "Strict",
196
+ path: "/"
197
+ });
198
+ url.searchParams.delete("token");
199
+ return c.redirect(`${url.pathname}${url.search}${url.hash}`, 302);
200
+ }
201
+ const cookie = getCookie(c, COOKIE);
202
+ if (!cookie || !sameToken(cookie, token)) return c.text("This studio needs its session token. Open the full URL that reeval studio printed.", 401);
203
+ return next();
204
+ });
205
+ app.get("/api/events", (c) => {
206
+ if (!options.subscribe) return c.text("Live updates are off", 404);
207
+ if (clients >= maxClients) return c.text("Too many live clients", 503);
208
+ const subscribe = options.subscribe;
209
+ clients++;
210
+ return streamSSE(c, async (stream) => {
211
+ let id = 0;
212
+ const unsubscribe = subscribe((event) => {
213
+ const data = event.type === "run.progress" ? JSON.stringify({ runs: event.runs }) : "{}";
214
+ stream.writeSSE({
215
+ event: event.type,
216
+ data,
217
+ id: String(++id)
218
+ });
219
+ });
220
+ const closed = new Promise((resolve) => stream.onAbort(resolve));
221
+ await stream.writeSSE({
222
+ event: "ready",
223
+ data: "{}",
224
+ id: String(id)
225
+ });
226
+ const ping = setInterval(() => void stream.writeSSE({
227
+ event: "ping",
228
+ data: "{}"
229
+ }), 25e3);
230
+ await closed;
231
+ clearInterval(ping);
232
+ unsubscribe();
233
+ clients--;
234
+ });
235
+ });
236
+ app.get("/api/live", async (c) => {
237
+ const index = { runs: await listLive(source) };
238
+ return c.json(index, 200, { "Cache-Control": "no-cache" });
239
+ });
240
+ app.get("/api/live/:runId/transcript", async (c) => {
241
+ const text = await liveTranscript(source, c.req.param("runId"), c.req.query("attempt") ?? "");
242
+ if (text === null) return c.text("No transcript for this attempt yet", 404);
243
+ return c.body(text, 200, {
244
+ "Cache-Control": "no-cache",
245
+ "Content-Type": "text/plain; charset=utf-8",
246
+ "Content-Security-Policy": "sandbox"
247
+ });
248
+ });
249
+ const debugDir = (runId, key) => {
250
+ const attempt = key ? parseAttemptKey(key) : null;
251
+ if (!RUN_ID.test(runId) || !attempt) return null;
252
+ return attemptDebugDir(source.root, runId, attempt.evalId, attempt.cell, attempt.n);
253
+ };
254
+ const readText = (path) => readFile(path, "utf8").catch(() => null);
255
+ app.get("/api/debug/:runId", async (c) => {
256
+ const dir = debugDir(c.req.param("runId"), c.req.query("attempt"));
257
+ const log = dir && await readText(join(dir, "debug.log"));
258
+ if (!dir || log === null) return c.json(null, 200, { "Cache-Control": "no-cache" });
259
+ const view = {
260
+ lines: parseDebugLog(log),
261
+ requests: parseNdjson(await readText(join(dir, "requests.ndjson")) ?? "").map(readableDebugRequest),
262
+ trace: (await stat(join(dir, "trace.ndjson")).catch(() => null))?.isFile() ?? false
263
+ };
264
+ return c.json(view, 200, { "Cache-Control": "no-cache" });
265
+ });
266
+ app.get("/api/debug/:runId/trace", async (c) => {
267
+ const dir = debugDir(c.req.param("runId"), c.req.query("attempt"));
268
+ const file = dir && join(dir, "trace.ndjson");
269
+ if (!file || !(await stat(file).catch(() => null))?.isFile()) return c.text("No trace for this attempt", 404);
270
+ return sendFile(c, file, {
271
+ "Cache-Control": "no-cache",
272
+ "Content-Type": "text/plain; charset=utf-8",
273
+ "Content-Security-Policy": "sandbox"
274
+ });
275
+ });
276
+ app.get("*", async (c) => {
277
+ const path = requestPath(c.req.url);
278
+ if (path === null) return c.text("Bad path", 400);
279
+ const target = parseDataPath(path);
280
+ if (target) {
281
+ const noStore = { "Cache-Control": "no-cache" };
282
+ if (target.kind === "studio") {
283
+ const info = {
284
+ mode: "live",
285
+ es: options.es,
286
+ project: options.project,
287
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
288
+ features: {
289
+ live: !!options.subscribe,
290
+ scratch: source.scratch,
291
+ artifacts: true,
292
+ debug: true
293
+ }
294
+ };
295
+ return c.json(info, 200, noStore);
296
+ }
297
+ if (target.kind === "manifest" || target.kind === "shard") {
298
+ const body = indexFiles(await listHeaders(source)).get(path);
299
+ if (body === void 0) return c.json([], 200, noStore);
300
+ return c.json(body, 200, noStore);
301
+ }
302
+ if (target.kind === "analysis") {
303
+ const { listAnalyses } = await import("./files-Bd25OAQH.js");
304
+ const entries = await listAnalyses(source.root, [source.historyDir], target.runId, true);
305
+ const index = {
306
+ runId: target.runId,
307
+ entries: sortAnalyses(entries)
308
+ };
309
+ return c.json(index, 200, noStore);
310
+ }
311
+ const file = await resolveFile(source, target);
312
+ if (!file) return c.text("Not found", 404);
313
+ if (target.kind === "record") return sendFile(c, file, {
314
+ ...noStore,
315
+ "Content-Type": APP_TYPES[".json"]
316
+ });
317
+ return sendFile(c, file, {
318
+ ...noStore,
319
+ "Content-Type": artifactType(file),
320
+ "Content-Security-Policy": "sandbox"
321
+ });
322
+ }
323
+ if (path.startsWith("data/") || path.startsWith("api/")) return c.text("Not found", 404);
324
+ return serveApp(c, options.appDir, path);
325
+ });
326
+ return app;
327
+ }
328
+ const APP_FILE = /^(?:assets\/)?[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
329
+ async function serveApp(c, dir, path) {
330
+ const appDir = resolve(dir);
331
+ const name = path === "" ? "index.html" : path;
332
+ if (!APP_FILE.test(name) || name.includes("..")) return c.text("Not found", 404);
333
+ const file = join(appDir, ...name.split("/"));
334
+ if (!file.startsWith(appDir + sep)) return c.text("Not found", 404);
335
+ try {
336
+ if (!(await stat(file)).isFile()) return c.text("Not found", 404);
337
+ } catch {
338
+ return c.text("Not found", 404);
339
+ }
340
+ const hashed = name.startsWith("assets/");
341
+ return sendFile(c, file, {
342
+ "Content-Type": APP_TYPES[extname(file)] ?? "application/octet-stream",
343
+ "Cache-Control": hashed ? "public, max-age=31536000, immutable" : "no-cache",
344
+ ...name === "index.html" ? { "Content-Security-Policy": APP_CSP } : {}
345
+ });
346
+ }
347
+ //#endregion
348
+ export { watchLive as a, newToken as i, allowedHosts as n, createStudioApp as r, COOKIE as t };
349
+
350
+ //# sourceMappingURL=server-Bi61uiY0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-Bi61uiY0.js","names":[],"sources":["../src/studio/live.ts","../src/studio/server.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwBA,MAAa,eAAe,SAAiB,KAAK,MAAM,WAAW,SAAS;;AAK5E,SAAS,OAAO,UAAiC;CAC/C,IAAI,SAAS,SAAS,SAAS,GAAG,OAAO;CACzC,IAAI;EACF,QAAQ,KAAK,SAAS,KAAK,CAAC;EAC5B,OAAO;CACT,SAAS,OAAO;EACd,OAAQ,MAAgC,SAAS;CACnD;AACF;AAEA,eAAe,aAAa,MAAc,OAA6C;CACrF,MAAM,OAAO,MAAM,SAAS,KAAK,YAAY,IAAI,GAAG,OAAO,SAAS,GAAG,MAAM,CAAC,CAAC,YAAY,IAAI;CAC/F,IAAI,SAAS,MAAM,OAAO;CAC1B,IAAI;EACF,MAAM,WAAW,qBAAqB,KAAK,MAAM,IAAI,CAAC;EACtD,OAAO,UAAU,UAAU,QAAQ,WAAW;CAChD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,MAAM,UAAU,QAAsB,UACpC,CAAC,OAAO,YAAY,WAAW,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ,WAAW,WAAW,KAAK,KAAK,CAAC,CAAC;;;;;AAM/F,eAAsB,SACpB,QACA,UAAuB,CAAC,GACJ;CACpB,IAAI,CAAC,OAAO,SAAS,OAAO,CAAC;CAC7B,MAAM,MAAM,QAAQ,OAAO,KAAK,IAAI;CACpC,MAAM,UAAU,QAAQ,WAAA;CACxB,MAAM,QAAQ,MAAM,QAAQ,YAAY,OAAO,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAa;CAChF,MAAM,OAAkB,CAAC;CACzB,KAAK,MAAM,SAAS,MACjB,QAAQ,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,CAC7B,KAAK,CAAC,CACN,QAAQ,GAAG;EACZ,MAAM,WAAW,MAAM,aAAa,OAAO,MAAM,KAAK;EACtD,IAAI,CAAC,YAAY,OAAO,QAAQ,KAAK,GAAG;EACxC,MAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,WAAW,IAAI;EACvD,MAAM,EAAE,eAAe,GAAG,KAAK,IAAI,MAAM,KAAK,aAAa,MAAM,GAAG,QAAQ;EAC5E,KAAK,KAAK;GAAE,GAAG;GAAK,OAAO,SAAS,OAAO,QAAQ,IAAI,YAAY,SAAS;EAAM,CAAC;CACrF;CACA,OAAO;AACT;;;;;AAMA,eAAsB,eACpB,QACA,OACA,KACwB;CACxB,IAAI,CAAC,OAAO,WAAW,CAAC,OAAO,KAAK,KAAK,GAAG,OAAO;CAEnD,MAAM,WAAU,MADO,aAAa,OAAO,MAAM,KAAK,EAAA,EAC5B,SAAS,MAAM,MAAM,EAAE,QAAQ,GAAG;CAC5D,IAAI,CAAC,WAAW,CAAC,WAAW,QAAQ,MAAM,GAAG,OAAO;CACpD,MAAM,OAAO,KAAK,YAAY,OAAO,IAAI,GAAG,KAAK;CACjD,IAAI;EACF,MAAM,CAAC,UAAU,QAAQ,MAAM,QAAQ,IAAI,CACzC,SAAS,IAAI,GACb,SAAS,KAAK,MAAM,SAAS,eAAe,GAAG,CAAC,CAAC,CACnD,CAAC;EACD,IAAI,CAAC,KAAK,WAAW,WAAW,GAAG,GAAG,OAAO;EAC7C,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,MAAM,MAAM,CAAC;EACtD,MAAM,EAAE,oBAAoB,MAAM,OAAO;EACzC,OAAO,cAAc,gBAAgB,MAAM,CAAC;CAC9C,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,UAAU,QAAsB,UAAqC,SAAS,KAAK;CACjG,IAAI,YAAY;CAChB,IAAI,OAAO;CACX,MAAM,QAAQ,YAAY;EACxB,IAAI,MAAM;EACV,OAAO;EACP,IAAI;GACF,MAAM,OAAO,MAAM,SAAS,MAAM;GAClC,MAAM,OAAO,KAAK,UAAU,IAAI;GAChC,IAAI,SAAS,WAAW;IACtB,MAAM,QAAQ,cAAc;IAC5B,YAAY;IACZ,IAAI,CAAC,OAAO,SAAS,IAAI;GAC3B;EACF,UAAU;GACR,OAAO;EACT;CACF;CACA,MAAW;CACX,MAAM,OAAO,kBAAkB,KAAK,MAAM,GAAG,MAAM;CACnD,KAAK,MAAM;CACX,aAAa,cAAc,IAAI;AACjC;;;ACvGA,MAAa,SAAS;AAoBtB,MAAa,iBAAiB,YAAY,EAAE,CAAC,CAAC,SAAS,WAAW;;AAGlE,SAAgB,aAAa,MAAc,MAAwB;CACjE,MAAM,wBAAQ,IAAI,IAAI;EAAC;EAAa;EAAa;CAAO,CAAC;CACzD,MAAM,IAAI,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,KAAK,KAAK,IAAI;CAC1E,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,SAAS,GAAG,KAAK,GAAG,MAAM;AACnD;AAEA,MAAM,YAAoC;CACxC,SAAS;CACT,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,SAAS;AACX;AAEA,MAAM,UAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,IAAI;AAEX,MAAM,aAAa,GAAW,MAAc;CAC1C,MAAM,IAAI,OAAO,KAAK,CAAC;CACvB,MAAM,IAAI,OAAO,KAAK,CAAC;CACvB,OAAO,EAAE,WAAW,EAAE,UAAU,gBAAgB,GAAG,CAAC;AACtD;;AAGA,SAAS,YAAY,KAA4B;CAC/C,IAAI;CACJ,IAAI;EACF,OAAO,mBAAmB,IAAI,IAAI,GAAG,CAAC,CAAC,QAAQ;CACjD,QAAQ;EACN,OAAO;CACT;CACA,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,OAAO;CACvD,OAAO,KAAK,QAAQ,QAAQ,EAAE;AAChC;AAEA,eAAe,SACb,GACA,MACA,SACmB;CACnB,MAAM,OAAO,MAAM,KAAK,IAAI;CAC5B,MAAM,OAAO,MAAM,KAAK,KAAK,SAAS,EAAE,EAAE,GAAG,KAAK,MAAM,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;CACnF,MAAM,SAAS;EAAE,GAAG;EAAS,MAAM;EAAM,kBAAkB,OAAO,KAAK,IAAI;CAAE;CAC7E,IAAI,EAAE,IAAI,OAAO,eAAe,MAAM,MAAM,OAAO,EAAE,KAAK,MAAM,KAAK,EAAE,MAAM,KAAK,CAAC;CACnF,IAAI,EAAE,IAAI,WAAW,QAAQ,OAAO,EAAE,KAAK,MAAM,KAAK,MAAM;CAC5D,MAAM,OAAO,SAAS,MAAM,iBAAiB,IAAI,CAAC;CAClD,OAAO,EAAE,KAAK,MAAM,KAAK,MAAM;AACjC;;AAGA,SAAgB,gBAAgB,SAA8B;CAC5D,MAAM,EAAE,QAAQ,OAAO,UAAU;CACjC,MAAM,aAAa,QAAQ,mBAAmB;CAC9C,IAAI,UAAU;CACd,MAAM,MAAM,IAAI,KAAK;CAErB,IAAI,IAAI,KAAK,OAAO,GAAG,SAAS;EAC9B,EAAE,OAAO,mBAAmB,aAAa;EACzC,EAAE,OAAO,0BAA0B,SAAS;EAC5C,EAAE,OAAO,gCAAgC,aAAa;EACtD,IAAI,EAAE,IAAI,WAAW,SAAS,EAAE,IAAI,WAAW,QAC7C,OAAO,EAAE,KAAK,sBAAsB,KAAK,EAAE,OAAO,YAAY,CAAC;EAEjE,MAAM,OAAO,EAAE,IAAI,OAAO,MAAM,KAAK;EACrC,IAAI,MAAM,UAAU,CAAC,MAAM,SAAS,IAAI,GAAG,OAAO,EAAE,KAAK,gBAAgB,GAAG;EAC5E,MAAM,SAAS,EAAE,IAAI,OAAO,QAAQ;EACpC,IAAI,UAAU,MAAM,UAAU,CAAC,MAAM,MAAM,MAAM,WAAW,UAAU,GAAG,GACvE,OAAO,EAAE,KAAK,yCAAyC,GAAG;EAE5D,IAAI,UAAU,MAAM,OAAO,KAAK;EAChC,MAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;EAC7B,MAAM,UAAU,IAAI,aAAa,IAAI,OAAO;EAC5C,IAAI,YAAY,MAAM;GACpB,IAAI,CAAC,UAAU,SAAS,KAAK,GAAG,OAAO,EAAE,KAAK,sBAAsB,GAAG;GACvE,UAAU,GAAG,QAAQ,OAAO;IAAE,UAAU;IAAM,UAAU;IAAU,MAAM;GAAI,CAAC;GAC7E,IAAI,aAAa,OAAO,OAAO;GAC/B,OAAO,EAAE,SAAS,GAAG,IAAI,WAAW,IAAI,SAAS,IAAI,QAAQ,GAAG;EAClE;EACA,MAAM,SAAS,UAAU,GAAG,MAAM;EAClC,IAAI,CAAC,UAAU,CAAC,UAAU,QAAQ,KAAK,GACrC,OAAO,EAAE,KACP,sFACA,GACF;EAEF,OAAO,KAAK;CACd,CAAC;CAED,IAAI,IAAI,gBAAgB,MAAM;EAC5B,IAAI,CAAC,QAAQ,WAAW,OAAO,EAAE,KAAK,wBAAwB,GAAG;EACjE,IAAI,WAAW,YAAY,OAAO,EAAE,KAAK,yBAAyB,GAAG;EACrE,MAAM,YAAY,QAAQ;EAC1B;EACA,OAAO,UAAU,GAAG,OAAO,WAAW;GACpC,IAAI,KAAK;GACT,MAAM,cAAc,WAAW,UAAU;IACvC,MAAM,OAAO,MAAM,SAAS,iBAAiB,KAAK,UAAU,EAAE,MAAM,MAAM,KAAK,CAAC,IAAI;IACpF,OAAY,SAAS;KAAE,OAAO,MAAM;KAAM;KAAM,IAAI,OAAO,EAAE,EAAE;IAAE,CAAC;GACpE,CAAC;GACD,MAAM,SAAS,IAAI,SAAe,YAAY,OAAO,QAAQ,OAAO,CAAC;GACrE,MAAM,OAAO,SAAS;IAAE,OAAO;IAAS,MAAM;IAAM,IAAI,OAAO,EAAE;GAAE,CAAC;GACpE,MAAM,OAAO,kBAAkB,KAAK,OAAO,SAAS;IAAE,OAAO;IAAQ,MAAM;GAAK,CAAC,GAAG,IAAM;GAC1F,MAAM;GACN,cAAc,IAAI;GAClB,YAAY;GACZ;EACF,CAAC;CACH,CAAC;CAGD,IAAI,IAAI,aAAa,OAAO,MAAM;EAChC,MAAM,QAAmB,EAAE,MAAM,MAAM,SAAS,MAAM,EAAE;EACxD,OAAO,EAAE,KAAK,OAAO,KAAK,EAAE,iBAAiB,WAAW,CAAC;CAC3D,CAAC;CACD,IAAI,IAAI,+BAA+B,OAAO,MAAM;EAClD,MAAM,OAAO,MAAM,eAAe,QAAQ,EAAE,IAAI,MAAM,OAAO,GAAG,EAAE,IAAI,MAAM,SAAS,KAAK,EAAE;EAC5F,IAAI,SAAS,MAAM,OAAO,EAAE,KAAK,sCAAsC,GAAG;EAC1E,OAAO,EAAE,KAAK,MAAM,KAAK;GACvB,iBAAiB;GACjB,gBAAgB;GAChB,2BAA2B;EAC7B,CAAC;CACH,CAAC;CAGD,MAAM,YAAY,OAAe,QAA4B;EAC3D,MAAM,UAAU,MAAM,gBAAgB,GAAG,IAAI;EAC7C,IAAI,CAAC,OAAO,KAAK,KAAK,KAAK,CAAC,SAAS,OAAO;EAC5C,OAAO,gBAAgB,OAAO,MAAM,OAAO,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,CAAC;CACpF;CACA,MAAM,YAAY,SAAiB,SAAS,MAAM,MAAM,CAAC,CAAC,YAAY,IAAI;CAC1E,IAAI,IAAI,qBAAqB,OAAO,MAAM;EACxC,MAAM,MAAM,SAAS,EAAE,IAAI,MAAM,OAAO,GAAG,EAAE,IAAI,MAAM,SAAS,CAAC;EACjE,MAAM,MAAM,OAAQ,MAAM,SAAS,KAAK,KAAA,WAAc,CAAC;EAEvD,IAAI,CAAC,OAAO,QAAQ,MAAM,OAAO,EAAE,KAAK,MAAM,KAAK,EAAE,iBAAiB,WAAW,CAAC;EAClF,MAAM,OAAkB;GACtB,OAAO,cAAc,GAAG;GACxB,UAAU,YAA2B,MAAM,SAAS,KAAK,KAAA,iBAAkB,CAAC,KAAM,EAAE,CAAC,CAAC,IACpF,oBACF;GACA,QAAQ,MAAM,KAAK,KAAK,KAAA,cAAe,CAAC,CAAC,CAAC,YAAY,IAAI,EAAA,EAAI,OAAO,KAAK;EAC5E;EACA,OAAO,EAAE,KAAK,MAAM,KAAK,EAAE,iBAAiB,WAAW,CAAC;CAC1D,CAAC;CACD,IAAI,IAAI,2BAA2B,OAAO,MAAM;EAC9C,MAAM,MAAM,SAAS,EAAE,IAAI,MAAM,OAAO,GAAG,EAAE,IAAI,MAAM,SAAS,CAAC;EACjE,MAAM,OAAO,OAAO,KAAK,KAAA,cAAe;EACxC,IAAI,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,YAAY,IAAI,EAAA,EAAI,OAAO,GACzD,OAAO,EAAE,KAAK,6BAA6B,GAAG;EAEhD,OAAO,SAAS,GAAG,MAAM;GACvB,iBAAiB;GACjB,gBAAgB;GAChB,2BAA2B;EAC7B,CAAC;CACH,CAAC;CAED,IAAI,IAAI,KAAK,OAAO,MAAM;EACxB,MAAM,OAAO,YAAY,EAAE,IAAI,GAAG;EAClC,IAAI,SAAS,MAAM,OAAO,EAAE,KAAK,YAAY,GAAG;EAChD,MAAM,SAAS,cAAc,IAAI;EACjC,IAAI,QAAQ;GACV,MAAM,UAAU,EAAE,iBAAiB,WAAW;GAC9C,IAAI,OAAO,SAAS,UAAU;IAC5B,MAAM,OAAmB;KACvB,MAAM;KACN,IAAI,QAAQ;KACZ,SAAS,QAAQ;KACjB,8BAAa,IAAI,KAAK,EAAA,CAAE,YAAY;KACpC,UAAU;MACR,MAAM,CAAC,CAAC,QAAQ;MAChB,SAAS,OAAO;MAChB,WAAW;MACX,OAAO;KACT;IACF;IACA,OAAO,EAAE,KAAK,MAAM,KAAK,OAAO;GAClC;GACA,IAAI,OAAO,SAAS,cAAc,OAAO,SAAS,SAAS;IAEzD,MAAM,OADQ,WAAW,MAAM,YAAY,MAAM,CAChC,CAAC,CAAC,IAAI,IAAI;IAC3B,IAAI,SAAS,KAAA,GAAW,OAAO,EAAE,KAAK,CAAC,GAAG,KAAK,OAAO;IACtD,OAAO,EAAE,KAAK,MAAM,KAAK,OAAO;GAClC;GACA,IAAI,OAAO,SAAS,YAAY;IAC9B,MAAM,EAAE,iBAAiB,MAAM,OAAO;IACtC,MAAM,UAAU,MAAM,aAAa,OAAO,MAAM,CAAC,OAAO,UAAU,GAAG,OAAO,OAAO,IAAI;IACvF,MAAM,QAAuB;KAAE,OAAO,OAAO;KAAO,SAAS,aAAa,OAAO;IAAE;IACnF,OAAO,EAAE,KAAK,OAAO,KAAK,OAAO;GACnC;GACA,MAAM,OAAO,MAAM,YAAY,QAAQ,MAAM;GAC7C,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,aAAa,GAAG;GACzC,IAAI,OAAO,SAAS,UAClB,OAAO,SAAS,GAAG,MAAM;IAAE,GAAG;IAAS,gBAAgB,UAAU;GAAmB,CAAC;GAEvF,OAAO,SAAS,GAAG,MAAM;IACvB,GAAG;IACH,gBAAgB,aAAa,IAAI;IACjC,2BAA2B;GAC7B,CAAC;EACH;EACA,IAAI,KAAK,WAAW,OAAO,KAAK,KAAK,WAAW,MAAM,GAAG,OAAO,EAAE,KAAK,aAAa,GAAG;EACvF,OAAO,SAAS,GAAG,QAAQ,QAAQ,IAAI;CACzC,CAAC;CAED,OAAO;AACT;AAEA,MAAM,WAAW;AAEjB,eAAe,SAAS,GAAY,KAAa,MAAiC;CAChF,MAAM,SAAS,QAAQ,GAAG;CAC1B,MAAM,OAAO,SAAS,KAAK,eAAe;CAC1C,IAAI,CAAC,SAAS,KAAK,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,OAAO,EAAE,KAAK,aAAa,GAAG;CAC/E,MAAM,OAAO,KAAK,QAAQ,GAAG,KAAK,MAAM,GAAG,CAAC;CAC5C,IAAI,CAAC,KAAK,WAAW,SAAS,GAAG,GAAG,OAAO,EAAE,KAAK,aAAa,GAAG;CAClE,IAAI;EACF,IAAI,EAAE,MAAM,KAAK,IAAI,EAAA,CAAG,OAAO,GAAG,OAAO,EAAE,KAAK,aAAa,GAAG;CAClE,QAAQ;EACN,OAAO,EAAE,KAAK,aAAa,GAAG;CAChC;CACA,MAAM,SAAS,KAAK,WAAW,SAAS;CACxC,OAAO,SAAS,GAAG,MAAM;EACvB,gBAAgB,UAAU,QAAQ,IAAI,MAAM;EAC5C,iBAAiB,SAAS,wCAAwC;EAClE,GAAI,SAAS,eAAe,EAAE,2BAA2B,QAAQ,IAAI,CAAC;CACxE,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ import { n as allowedHosts } from "./server-Bi61uiY0.js";
2
+ export { allowedHosts };
@@ -0,0 +1,2 @@
1
+ import { t as listHeaders } from "./source-Bsfa3LZH.js";
2
+ export { listHeaders };
@@ -0,0 +1,40 @@
1
+ import { c as recordFile, d as runDir, f as scratchDir, i as listRuns } from "./files-D2-qn_Dl.js";
2
+ import { join, sep } from "node:path";
3
+ import { realpath, stat } from "node:fs/promises";
4
+ //#region src/studio/source.ts
5
+ /** Recorded runs, plus scratch runs that weren't recorded when enabled; oldest first. */
6
+ async function listHeaders(source) {
7
+ const kept = await listRuns(source.root, source.historyDir, true);
8
+ if (!source.scratch) return kept;
9
+ const ids = new Set(kept.map((e) => e.runId));
10
+ const scratch = await listRuns(source.root, scratchDir(source.root), false);
11
+ return [...kept, ...scratch.filter((e) => !ids.has(e.runId))].sort((a, b) => a.runId < b.runId ? -1 : 1);
12
+ }
13
+ const dirsOf = (source) => source.scratch ? [source.historyDir, scratchDir(source.root)] : [source.historyDir];
14
+ async function inside(base, path) {
15
+ try {
16
+ const [realBase, real] = await Promise.all([realpath(base), realpath(path)]);
17
+ if (!real.startsWith(realBase + sep)) return null;
18
+ return (await stat(real)).isFile() ? real : null;
19
+ } catch {
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * The file a record or artifact path names, or null. A run resolves to the history folder first,
25
+ * then `.reeval/runs/`; the real path must stay inside that run's directory, so symlinks can't escape.
26
+ */
27
+ async function resolveFile(source, target) {
28
+ for (const dir of dirsOf(source)) {
29
+ const record = await inside(dir, recordFile(dir, target.runId));
30
+ if (!record) continue;
31
+ if (target.kind === "record") return record;
32
+ const artifacts = runDir(dir, target.runId);
33
+ return inside(artifacts, join(artifacts, ...target.segments));
34
+ }
35
+ return null;
36
+ }
37
+ //#endregion
38
+ export { resolveFile as n, listHeaders as t };
39
+
40
+ //# sourceMappingURL=source-Bsfa3LZH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-Bsfa3LZH.js","names":[],"sources":["../src/studio/source.ts"],"mappings":";;;;;AAcA,eAAsB,YAAY,QAA+C;CAC/E,MAAM,OAAO,MAAM,SAAS,OAAO,MAAM,OAAO,YAAY,IAAI;CAChE,IAAI,CAAC,OAAO,SAAS,OAAO;CAC5B,MAAM,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC;CAC5C,MAAM,UAAU,MAAM,SAAS,OAAO,MAAM,WAAW,OAAO,IAAI,GAAG,KAAK;CAC1E,OAAO,CAAC,GAAG,MAAM,GAAG,QAAQ,QAAQ,MAAM,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,MACrE,EAAE,QAAQ,EAAE,QAAQ,KAAK,CAC3B;AACF;AAEA,MAAM,UAAU,WACd,OAAO,UAAU,CAAC,OAAO,YAAY,WAAW,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,UAAU;AAEpF,eAAe,OAAO,MAAc,MAAsC;CACxE,IAAI;EACF,MAAM,CAAC,UAAU,QAAQ,MAAM,QAAQ,IAAI,CAAC,SAAS,IAAI,GAAG,SAAS,IAAI,CAAC,CAAC;EAC3E,IAAI,CAAC,KAAK,WAAW,WAAW,GAAG,GAAG,OAAO;EAC7C,QAAQ,MAAM,KAAK,IAAI,EAAA,CAAG,OAAO,IAAI,OAAO;CAC9C,QAAQ;EACN,OAAO;CACT;AACF;;;;;AAMA,eAAsB,YACpB,QACA,QACwB;CACxB,KAAK,MAAM,OAAO,OAAO,MAAM,GAAG;EAChC,MAAM,SAAS,MAAM,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,CAAC;EAC9D,IAAI,CAAC,QAAQ;EACb,IAAI,OAAO,SAAS,UAAU,OAAO;EACrC,MAAM,YAAY,OAAO,KAAK,OAAO,KAAK;EAC1C,OAAO,OAAO,WAAW,KAAK,WAAW,GAAG,OAAO,QAAQ,CAAC;CAC9D;CACA,OAAO;AACT"}
@@ -0,0 +1,3 @@
1
+ import "./state-DZ7eqb1F.js";
2
+ import { d as createCodex } from "./src-AEwxd1UP.js";
3
+ export { createCodex };