niceeval 0.16.2 → 0.17.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 (258) hide show
  1. package/dist/cli/bootstrap.cjs +7 -1
  2. package/dist/cli/bootstrap.cjs.map +1 -1
  3. package/dist/cli/project-configuration.cjs +8 -11
  4. package/dist/cli/project-configuration.cjs.map +1 -1
  5. package/dist/expect/index.cjs.map +1 -1
  6. package/dist/expect/index.d.cts +1 -0
  7. package/dist/expect/index.d.mts +1 -0
  8. package/dist/expect/index.d.ts +1 -0
  9. package/dist/experiment/host/cli/contribution.cjs +6 -11
  10. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  11. package/dist/experiment/host/cli/contribution.d.cts +0 -16
  12. package/dist/experiment/host/cli/contribution.d.mts +0 -16
  13. package/dist/experiment/host/cli/contribution.d.ts +0 -16
  14. package/dist/experiment/host/operations.cjs +3 -3
  15. package/dist/experiment/host/operations.cjs.map +1 -1
  16. package/dist/experiment/host/types.cjs.map +1 -1
  17. package/dist/experiment/host/types.d.cts +0 -4
  18. package/dist/experiment/host/types.d.mts +0 -4
  19. package/dist/experiment/host/types.d.ts +0 -4
  20. package/dist/fresh-import.cjs +2 -2
  21. package/dist/fresh-import.cjs.map +1 -1
  22. package/dist/fresh-import.d.cts +3 -3
  23. package/dist/fresh-import.d.mts +3 -3
  24. package/dist/fresh-import.d.ts +3 -3
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +1 -0
  27. package/dist/index.d.mts +1 -0
  28. package/dist/index.d.ts +1 -0
  29. package/dist/inspection/codec.cjs.map +1 -1
  30. package/dist/inspection/codec.d.cts +1 -1
  31. package/dist/inspection/codec.d.mts +1 -1
  32. package/dist/inspection/codec.d.ts +1 -1
  33. package/dist/inspection/facts.cjs +66 -9
  34. package/dist/inspection/facts.cjs.map +1 -1
  35. package/dist/inspection/facts.d.cts +4 -0
  36. package/dist/inspection/facts.d.mts +4 -0
  37. package/dist/inspection/facts.d.ts +4 -0
  38. package/dist/inspection/facts.js +4 -2
  39. package/dist/inspection/index.cjs +1 -3
  40. package/dist/inspection/index.cjs.map +1 -1
  41. package/dist/inspection/index.d.cts +1 -1
  42. package/dist/inspection/index.d.mts +1 -1
  43. package/dist/inspection/index.d.ts +1 -1
  44. package/dist/inspection/index.js +44 -48
  45. package/dist/inspection/limits.cjs +3 -1
  46. package/dist/inspection/limits.cjs.map +1 -1
  47. package/dist/inspection/limits.d.cts +2 -0
  48. package/dist/inspection/limits.d.mts +2 -0
  49. package/dist/inspection/limits.d.ts +2 -0
  50. package/dist/inspection/limits.js +6 -4
  51. package/dist/inspection/project-source.cjs +4 -1
  52. package/dist/inspection/project-source.cjs.map +1 -1
  53. package/dist/inspection/protocol.cjs +10 -18
  54. package/dist/inspection/protocol.cjs.map +1 -1
  55. package/dist/inspection/protocol.d.cts +111 -173
  56. package/dist/inspection/protocol.d.mts +111 -173
  57. package/dist/inspection/protocol.d.ts +111 -173
  58. package/dist/inspection/public.mjs +73 -109
  59. package/dist/inspection/results.cjs +12 -48
  60. package/dist/inspection/results.cjs.map +1 -1
  61. package/dist/inspection/results.d.cts +124 -122
  62. package/dist/inspection/results.d.mts +124 -122
  63. package/dist/inspection/results.d.ts +124 -122
  64. package/dist/inspection/results.js +16 -20
  65. package/dist/inspection/select.cjs +80 -117
  66. package/dist/inspection/select.cjs.map +1 -1
  67. package/dist/inspection/source.cjs +14 -15
  68. package/dist/inspection/source.cjs.map +1 -1
  69. package/dist/inspection/source.d.cts +6 -3
  70. package/dist/inspection/source.d.mts +6 -3
  71. package/dist/inspection/source.d.ts +6 -3
  72. package/dist/inspection/trace.cjs +1 -1
  73. package/dist/inspection/trace.cjs.map +1 -1
  74. package/dist/load-config.cjs +17 -11
  75. package/dist/load-config.cjs.map +1 -1
  76. package/dist/load-config.d.cts +3 -2
  77. package/dist/load-config.d.mts +3 -2
  78. package/dist/load-config.d.ts +3 -2
  79. package/dist/o11y/adapter-usage-projection.cjs +5 -1
  80. package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
  81. package/dist/o11y/adapter-usage-projection.d.cts +109 -1
  82. package/dist/o11y/adapter-usage-projection.d.mts +109 -1
  83. package/dist/o11y/adapter-usage-projection.d.ts +109 -1
  84. package/dist/o11y/cache-read.cjs +113 -0
  85. package/dist/o11y/cache-read.cjs.map +1 -0
  86. package/dist/o11y/cache-read.d.cts +80 -0
  87. package/dist/o11y/cache-read.d.mts +80 -0
  88. package/dist/o11y/cache-read.d.ts +80 -0
  89. package/dist/o11y/cache-read.js +8 -0
  90. package/dist/o11y/cache-read.js.map +1 -0
  91. package/dist/o11y/eval-usage.cjs +4 -1
  92. package/dist/o11y/eval-usage.cjs.map +1 -1
  93. package/dist/o11y/eval-usage.d.cts +4 -1
  94. package/dist/o11y/eval-usage.d.mts +4 -1
  95. package/dist/o11y/eval-usage.d.ts +4 -1
  96. package/dist/record/host/sqlite-host.cjs +188 -53
  97. package/dist/record/host/sqlite-host.cjs.map +1 -1
  98. package/dist/record/host/sqlite-host.d.cts +37 -1
  99. package/dist/record/host/sqlite-host.d.mts +37 -1
  100. package/dist/record/host/sqlite-host.d.ts +37 -1
  101. package/dist/record/host/sqlite-host.js +16 -8
  102. package/dist/record/maintenance/runtime.cjs +3 -3
  103. package/dist/record/maintenance/runtime.cjs.map +1 -1
  104. package/dist/record/sqlite/admission-repository.cjs +18 -18
  105. package/dist/record/sqlite/admission-repository.cjs.map +1 -1
  106. package/dist/record/sqlite/case-repository.cjs +6 -6
  107. package/dist/record/sqlite/case-repository.cjs.map +1 -1
  108. package/dist/record/sqlite/coordination-repository.cjs +25 -25
  109. package/dist/record/sqlite/coordination-repository.cjs.map +1 -1
  110. package/dist/record/sqlite/current-schema.cjs +115 -111
  111. package/dist/record/sqlite/current-schema.cjs.map +1 -1
  112. package/dist/record/sqlite/current-schema.d.cts +3 -3
  113. package/dist/record/sqlite/current-schema.d.mts +3 -3
  114. package/dist/record/sqlite/current-schema.d.ts +3 -3
  115. package/dist/record/sqlite/database.cjs +56 -53
  116. package/dist/record/sqlite/database.cjs.map +1 -1
  117. package/dist/record/sqlite/index.cjs +3 -1
  118. package/dist/record/sqlite/index.cjs.map +1 -1
  119. package/dist/record/sqlite/index.d.cts +5 -2
  120. package/dist/record/sqlite/index.d.mts +5 -2
  121. package/dist/record/sqlite/index.d.ts +5 -2
  122. package/dist/record/sqlite/legacy-schema-018.cjs +443 -0
  123. package/dist/record/sqlite/legacy-schema-018.cjs.map +1 -0
  124. package/dist/record/sqlite/legacy-schema-018.d.cts +6 -0
  125. package/dist/record/sqlite/legacy-schema-018.d.mts +6 -0
  126. package/dist/record/sqlite/legacy-schema-018.d.ts +6 -0
  127. package/dist/record/sqlite/legacy-schema-018.js +6 -0
  128. package/dist/record/sqlite/legacy-schema-018.js.map +1 -0
  129. package/dist/record/sqlite/migration.cjs +105 -46
  130. package/dist/record/sqlite/migration.cjs.map +1 -1
  131. package/dist/record/sqlite/migration.d.cts +2 -1
  132. package/dist/record/sqlite/migration.d.mts +2 -1
  133. package/dist/record/sqlite/migration.d.ts +2 -1
  134. package/dist/record/sqlite/portable-capture.cjs +13 -13
  135. package/dist/record/sqlite/portable-capture.cjs.map +1 -1
  136. package/dist/record/sqlite/registry-repository.cjs +22 -22
  137. package/dist/record/sqlite/registry-repository.cjs.map +1 -1
  138. package/dist/record/sqlite/schema.cjs +10 -2
  139. package/dist/record/sqlite/schema.cjs.map +1 -1
  140. package/dist/record/sqlite/schema.d.cts +4 -1
  141. package/dist/record/sqlite/schema.d.mts +4 -1
  142. package/dist/record/sqlite/schema.d.ts +4 -1
  143. package/dist/record/sqlite/schema.js +20 -14
  144. package/dist/record/sqlite/storage-worker.cjs +1 -1
  145. package/dist/record/sqlite/storage-worker.cjs.map +1 -1
  146. package/dist/record/sqlite/storage.cjs +316 -232
  147. package/dist/record/sqlite/storage.cjs.map +1 -1
  148. package/dist/record/sqlite/storage.d.cts +10 -2
  149. package/dist/record/sqlite/storage.d.mts +10 -2
  150. package/dist/record/sqlite/storage.d.ts +10 -2
  151. package/dist/record/sqlite/storage.js +54 -50
  152. package/dist/record/sqlite/types.cjs +1 -1
  153. package/dist/record/sqlite/types.cjs.map +1 -1
  154. package/dist/record/sqlite/types.d.cts +13 -1
  155. package/dist/record/sqlite/types.d.mts +13 -1
  156. package/dist/record/sqlite/types.d.ts +13 -1
  157. package/dist/run/cli/contribution.cjs +17 -12
  158. package/dist/run/cli/contribution.cjs.map +1 -1
  159. package/dist/run/host/lifecycle-adapter.cjs +1 -1
  160. package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
  161. package/dist/run/storage/owner-identity.cjs +78 -16
  162. package/dist/run/storage/owner-identity.cjs.map +1 -1
  163. package/dist/run/storage/owner-identity.d.cts +2 -1
  164. package/dist/run/storage/owner-identity.d.mts +2 -1
  165. package/dist/run/storage/owner-identity.d.ts +2 -1
  166. package/dist/run/storage/sqlite.cjs +55 -55
  167. package/dist/run/storage/sqlite.cjs.map +1 -1
  168. package/dist/runner/accept.cjs +12 -42
  169. package/dist/runner/accept.cjs.map +1 -1
  170. package/dist/runner/accept.d.cts +2 -3
  171. package/dist/runner/accept.d.mts +2 -3
  172. package/dist/runner/accept.d.ts +2 -3
  173. package/dist/runner/adapter-usage.cjs +2 -2
  174. package/dist/runner/adapter-usage.cjs.map +1 -1
  175. package/dist/runner/adoption.cjs +14 -26
  176. package/dist/runner/adoption.cjs.map +1 -1
  177. package/dist/runner/adoption.d.cts +5 -13
  178. package/dist/runner/adoption.d.mts +5 -13
  179. package/dist/runner/adoption.d.ts +5 -13
  180. package/dist/runner/adoption.js +2 -4
  181. package/dist/runner/record.cjs +24 -18
  182. package/dist/runner/record.cjs.map +1 -1
  183. package/dist/runner/rename-experiment.cjs +5 -7
  184. package/dist/runner/rename-experiment.cjs.map +1 -1
  185. package/dist/runner/reuse-plan.cjs +37 -18
  186. package/dist/runner/reuse-plan.cjs.map +1 -1
  187. package/dist/runner/reuse-plan.d.cts +4 -1
  188. package/dist/runner/reuse-plan.d.mts +4 -1
  189. package/dist/runner/reuse-plan.d.ts +4 -1
  190. package/dist/runner/setup-prefix-plan.cjs +17 -12
  191. package/dist/runner/setup-prefix-plan.cjs.map +1 -1
  192. package/dist/runner/setup-prefix-plan.d.cts +0 -2
  193. package/dist/runner/setup-prefix-plan.d.mts +0 -2
  194. package/dist/runner/setup-prefix-plan.d.ts +0 -2
  195. package/dist/runner/setup-prefix-plan.js +8 -12
  196. package/dist/sandbox/backend.cjs +10 -1
  197. package/dist/sandbox/backend.cjs.map +1 -1
  198. package/dist/sandbox/backend.d.cts +16 -8
  199. package/dist/sandbox/backend.d.mts +16 -8
  200. package/dist/sandbox/backend.d.ts +16 -8
  201. package/dist/sandbox/backend.js +28 -26
  202. package/dist/sandbox/docker.cjs +7 -1
  203. package/dist/sandbox/docker.cjs.map +1 -1
  204. package/dist/sandbox/e2b-cache-repository.cjs +13 -3
  205. package/dist/sandbox/e2b-cache-repository.cjs.map +1 -1
  206. package/dist/sandbox/e2b-cache-repository.d.cts +3 -0
  207. package/dist/sandbox/e2b-cache-repository.d.mts +3 -0
  208. package/dist/sandbox/e2b-cache-repository.d.ts +3 -0
  209. package/dist/sandbox/e2b-cache-repository.js +16 -12
  210. package/dist/sandbox/e2b.cjs +2 -2
  211. package/dist/sandbox/e2b.cjs.map +1 -1
  212. package/dist/sandbox/incus/materialize.cjs +1 -1
  213. package/dist/sandbox/incus/materialize.cjs.map +1 -1
  214. package/dist/show/contribution.cjs +3 -3
  215. package/dist/show/contribution.cjs.map +1 -1
  216. package/dist/show/model.cjs +14 -13
  217. package/dist/show/model.cjs.map +1 -1
  218. package/dist/show/model.d.cts +7 -7
  219. package/dist/show/model.d.mts +7 -7
  220. package/dist/show/model.d.ts +7 -7
  221. package/dist/show/render.cjs +14 -0
  222. package/dist/show/render.cjs.map +1 -1
  223. package/dist/user-database/storage-worker.cjs +13 -3
  224. package/dist/user-database/storage-worker.cjs.map +1 -1
  225. package/dist/view/app-dist/.vite/manifest.json +2 -2
  226. package/dist/view/app-dist/assets/{index-CmVoXbwG.js → index-B3ijZRph.js} +17 -17
  227. package/dist/view/app-dist/assets/{quality-cost-scatter-BuLISaH4.js → quality-cost-scatter-B--DfJ9s.js} +1 -1
  228. package/dist/view/app-dist/index.html +1 -1
  229. package/dist/view/application-runtime.cjs +8 -0
  230. package/dist/view/application-runtime.cjs.map +1 -0
  231. package/dist/view/application-runtime.d.cts +9 -0
  232. package/dist/view/application-runtime.d.mts +9 -0
  233. package/dist/view/application-runtime.d.ts +9 -0
  234. package/dist/view/application-runtime.js +6 -0
  235. package/dist/view/application-runtime.js.map +1 -0
  236. package/dist/view/cli/contribution.cjs +5 -2
  237. package/dist/view/cli/contribution.cjs.map +1 -1
  238. package/dist/view/cli/contribution.d.cts +2 -1
  239. package/dist/view/cli/contribution.d.mts +2 -1
  240. package/dist/view/cli/contribution.d.ts +2 -1
  241. package/dist/view/function-runtime.mjs +1019 -456
  242. package/dist/view/http-protocol.d.cts +1 -9
  243. package/dist/view/http-protocol.d.mts +1 -9
  244. package/dist/view/http-protocol.d.ts +1 -9
  245. package/dist/view/inspection-host.cjs +39 -30
  246. package/dist/view/inspection-host.cjs.map +1 -1
  247. package/dist/view/inspection-host.d.cts +7545 -2
  248. package/dist/view/inspection-host.d.mts +7545 -2
  249. package/dist/view/inspection-host.d.ts +7545 -2
  250. package/dist/view/server.cjs +8 -5
  251. package/dist/view/server.cjs.map +1 -1
  252. package/dist/view/server.d.cts +4 -2
  253. package/dist/view/server.d.mts +4 -2
  254. package/dist/view/server.d.ts +4 -2
  255. package/docs-site/zh/reference/cli.mdx +1 -2
  256. package/docs-site/zh/tutorials/control-run-cost.mdx +22 -0
  257. package/docs-site/zh/tutorials/niceeval-taste-application.mdx +21 -0
  258. package/package.json +1 -1
@@ -24,7 +24,7 @@ const SessionRequestSchema = effect_1.Schema.Struct({ credential: effect_1.Schem
24
24
  /** Scope-owned, loopback-only transport for Vite assets and a validated Record generation. */
25
25
  function openViewServer(input) {
26
26
  return effect_1.Effect.gen(function* () {
27
- const resources = yield* effect_1.Effect.acquireRelease(effect_1.Effect.sync(() => makeResources(input.initial, input.refreshEnabled === true, input.refreshSource)), closeResources);
27
+ const resources = yield* effect_1.Effect.acquireRelease(effect_1.Effect.sync(() => makeResources(input.runtime, input.initial, input.refreshEnabled === true, input.refreshSource)), closeResources);
28
28
  const port = yield* listen(resources.server, input.port);
29
29
  resources.authority = `127.0.0.1:${port}`;
30
30
  resources.origin = `http://${resources.authority}`;
@@ -42,9 +42,10 @@ function viewEntryUrl(origin, credential, runIds) {
42
42
  url.hash = credential;
43
43
  return url.href;
44
44
  }
45
- function makeResources(initial, refreshEnabled, refreshSource) {
45
+ function makeResources(runtime, initial, refreshEnabled, refreshSource) {
46
46
  const sockets = new Set();
47
47
  const resources = {
48
+ runtime,
48
49
  server: undefined,
49
50
  sockets,
50
51
  credential: (0, node_crypto_1.randomBytes)(32).toString("base64url"),
@@ -158,7 +159,9 @@ async function serveGeneration(resources, response, refresh) {
158
159
  sendJson(response, 200, descriptor(resources, generation));
159
160
  }
160
161
  else {
161
- const identity = await resources.refreshSource?.cutoffIdentity();
162
+ const identity = resources.refreshSource === undefined
163
+ ? undefined
164
+ : await resources.runtime.run(resources.refreshSource.cutoffIdentity());
162
165
  sendJson(response, 200, {
163
166
  ...descriptor(resources, resources.state.current),
164
167
  stale: resources.state.stale || (identity === undefined
@@ -184,7 +187,7 @@ function prepareGeneration(resources) {
184
187
  const preparing = (async () => {
185
188
  if (resources.closed)
186
189
  throw new Error("View is closing.");
187
- const generation = await source.build();
190
+ const generation = await resources.runtime.run(source.build());
188
191
  if (resources.closed) {
189
192
  await retireGeneration(resources, generation);
190
193
  throw new Error("View is closing.");
@@ -241,7 +244,7 @@ async function serveInspection(resources, request, response) {
241
244
  return sendJson(response, 404, generationError("view-generation-not-found", "The requested generation is not available."));
242
245
  acquireLease(resources, generation);
243
246
  try {
244
- const document = await (0, inspection_host_ts_1.inspectViewGeneration)(generation, decoded.success.request);
247
+ const document = await resources.runtime.run((0, inspection_host_ts_1.inspectViewGeneration)(generation, decoded.success.request));
245
248
  sendJson(response, 200, document);
246
249
  }
247
250
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { extname, resolve, sep } from \"node:path\";\nimport { Effect, Result, Schema } from \"effect\";\nimport type * as Scope from \"effect/Scope\";\nimport { inspectViewGeneration } from \"./inspection-host.ts\";\nimport { VIEW_HTTP_BODY_LIMIT, decodeGenerationCommitRequest, decodeViewInspectionRequest, type ViewGenerationDescriptor, type ViewHttpErrorDocument, } from \"./http-protocol.ts\";\nimport type { ViewGeneration } from \"./revision.ts\";\nexport interface ViewServerError {\n readonly code: \"view-server-failed\";\n readonly operation: \"listen\" | \"close\";\n readonly reason: string;\n}\nexport interface ViewServer {\n readonly origin: string;\n readonly readyUrl: string;\n readonly close: Effect.Effect<void>;\n}\ninterface RefreshSource {\n readonly cutoffIdentity: () => Promise<string>;\n readonly build: () => Promise<ViewGeneration>;\n}\ninterface ServerState {\n current: ViewGeneration;\n candidate?: ViewGeneration;\n stale: boolean;\n readonly leases: Map<string, number>;\n readonly retired: Set<string>;\n}\ninterface ServerResources {\n server: Server;\n readonly sockets: Set<Socket>;\n readonly credential: string;\n readonly sessionCookie: string;\n readonly session: string;\n readonly state: ServerState;\n readonly refreshEnabled: boolean;\n readonly refreshSource?: RefreshSource;\n preparing?: Promise<ViewGeneration>;\n authority?: string;\n origin?: string;\n credentialConsumed: boolean;\n closed: boolean;\n activeRequests: number;\n readonly drained: Set<() => void>;\n}\nconst SESSION_COOKIE_PREFIX = \"niceeval_view_session_\";\nconst CONTENT_SECURITY_POLICY = \"default-src 'none'; script-src 'self'; connect-src 'self'; style-src-elem 'self' 'sha256-nzTgYzXYDNe6BAHiiI7NNlfK8n/auuOAhh2t92YvuXo='; style-src-attr 'unsafe-inline'; base-uri 'none'; frame-ancestors 'none'\";\nconst COMMON_HEADERS = Object.freeze({\n \"cache-control\": \"private, no-store\",\n pragma: \"no-cache\",\n \"content-security-policy\": CONTENT_SECURITY_POLICY,\n \"referrer-policy\": \"no-referrer\",\n \"x-content-type-options\": \"nosniff\",\n});\nconst BOOTSTRAP_HTML = \"<!doctype html><html><head><meta charset=\\\"utf-8\\\"><meta name=\\\"referrer\\\" content=\\\"no-referrer\\\"><title>Opening NiceEval view</title><script src=\\\"/_niceeval/bootstrap.js\\\" defer></script></head><body><main role=\\\"status\\\">Opening NiceEval view…</main></body></html>\";\nconst BOOTSTRAP_SCRIPT = \"(()=>{const credential=location.hash.slice(1);history.replaceState(null,\\\"\\\",location.pathname+location.search);fetch(\\\"/_niceeval/session\\\",{method:\\\"POST\\\",credentials:\\\"same-origin\\\",headers:{\\\"content-type\\\":\\\"application/json\\\"},body:JSON.stringify({credential})}).then(response=>{if(!response.ok)throw new Error(\\\"unauthorized\\\");location.reload()}).catch(()=>{document.body.textContent=\\\"NiceEval view authorization failed\\\"})})()\";\nconst SessionRequestSchema = Schema.Struct({ credential: Schema.String });\n/** Scope-owned, loopback-only transport for Vite assets and a validated Record generation. */\nexport function openViewServer(input: {\n readonly initial: ViewGeneration;\n readonly port: number;\n readonly refreshEnabled?: boolean;\n readonly refreshSource?: RefreshSource;\n readonly initialRunIds: readonly string[];\n}): Effect.Effect<ViewServer, ViewServerError, Scope.Scope> {\n return Effect.gen(function* () {\n const resources = yield* Effect.acquireRelease(Effect.sync(() => makeResources(input.initial, input.refreshEnabled === true, input.refreshSource)), closeResources);\n const port = yield* listen(resources.server, input.port);\n resources.authority = `127.0.0.1:${port}`;\n resources.origin = `http://${resources.authority}`;\n return Object.freeze({\n origin: resources.origin,\n readyUrl: viewEntryUrl(resources.origin, resources.credential, input.initialRunIds),\n close: closeResources(resources),\n });\n });\n}\nfunction viewEntryUrl(origin: string, credential: string, runIds: readonly string[]): string {\n const url = new URL(\"/\", origin);\n for (const runId of runIds)\n url.searchParams.append(\"run\", runId);\n url.hash = credential;\n return url.href;\n}\nfunction makeResources(initial: ViewGeneration, refreshEnabled: boolean, refreshSource?: RefreshSource): ServerResources {\n const sockets = new Set<Socket>();\n const resources: ServerResources = {\n server: undefined as unknown as Server,\n sockets,\n credential: randomBytes(32).toString(\"base64url\"),\n sessionCookie: `${SESSION_COOKIE_PREFIX}${randomBytes(16).toString(\"hex\")}`,\n session: randomBytes(32).toString(\"base64url\"),\n state: { current: initial, stale: false, leases: new Map([[initial.generationId, 0]]), retired: new Set() },\n refreshEnabled,\n ...(refreshSource === undefined ? {} : { refreshSource }),\n credentialConsumed: false,\n closed: false,\n activeRequests: 0,\n drained: new Set(),\n };\n resources.server = createServer((request, response) => {\n resources.activeRequests += 1;\n response.once(\"close\", () => {\n resources.activeRequests -= 1;\n if (resources.activeRequests === 0) {\n for (const resolve of resources.drained)\n resolve();\n resources.drained.clear();\n }\n });\n serveRequest(resources, request, response);\n });\n resources.server.on(\"connection\", (socket) => {\n sockets.add(socket);\n socket.once(\"close\", () => sockets.delete(socket));\n });\n return resources;\n}\nfunction serveRequest(resources: ServerResources, request: IncomingMessage, response: ServerResponse): void {\n if (resources.closed || resources.authority === undefined || resources.origin === undefined) {\n sendText(response, 503, \"view is not ready\");\n return;\n }\n if (request.headers.host !== resources.authority) {\n sendText(response, 403, \"view host is not authorized\");\n return;\n }\n const url = requestUrl(request);\n if (url === undefined) {\n sendText(response, 400, \"bad request\");\n return;\n }\n if (url.pathname === \"/_niceeval/session\") {\n exchangeCredential(resources, request, response);\n return;\n }\n if (!authorizedSession(resources, request)) {\n if ((request.method === \"GET\" || request.method === \"HEAD\") && url.pathname === \"/\") {\n send(response, 200, request.method === \"HEAD\" ? \"\" : BOOTSTRAP_HTML, \"text/html; charset=utf-8\");\n }\n else if ((request.method === \"GET\" || request.method === \"HEAD\") && url.pathname === \"/_niceeval/bootstrap.js\") {\n send(response, 200, request.method === \"HEAD\" ? \"\" : BOOTSTRAP_SCRIPT, \"text/javascript; charset=utf-8\", {\n \"content-length\": String(Buffer.byteLength(BOOTSTRAP_SCRIPT)),\n });\n }\n else {\n sendText(response, 401, \"view session is required\");\n }\n return;\n }\n if (!sameOrigin(resources, request)) {\n sendText(response, 403, \"view origin is not authorized\");\n return;\n }\n if (url.pathname === \"/_niceeval/generation\") {\n if (request.method !== \"GET\")\n return methodNotAllowed(response, \"GET\");\n void serveGeneration(resources, response, false);\n return;\n }\n if (url.pathname === \"/_niceeval/generation/refresh\") {\n if (request.method !== \"POST\")\n return methodNotAllowed(response, \"POST\");\n void serveGeneration(resources, response, true);\n return;\n }\n if (url.pathname === \"/_niceeval/generation/commit\") {\n if (request.method !== \"POST\")\n return methodNotAllowed(response, \"POST\");\n if (!exactJson(request, response))\n return;\n void serveCommit(resources, request, response);\n return;\n }\n if (url.pathname === \"/_niceeval/inspection\") {\n if (request.method !== \"POST\")\n return methodNotAllowed(response, \"POST\");\n if (!exactJson(request, response))\n return;\n void serveInspection(resources, request, response);\n return;\n }\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n sendText(response, 405, \"method not allowed\", { allow: \"GET, HEAD\" });\n return;\n }\n void serveAsset(resources.state.current, url.pathname, request, response).catch((cause: unknown) => {\n if (!response.headersSent)\n sendText(response, 500, cause instanceof Error ? cause.message : \"view asset failed\");\n else\n response.destroy(cause instanceof Error ? cause : undefined);\n });\n}\nasync function serveGeneration(resources: ServerResources, response: ServerResponse, refresh: boolean): Promise<void> {\n try {\n if (refresh) {\n const generation = await prepareGeneration(resources);\n sendJson(response, 200, descriptor(resources, generation));\n }\n else {\n const identity = await resources.refreshSource?.cutoffIdentity();\n sendJson(response, 200, {\n ...descriptor(resources, resources.state.current),\n stale: resources.state.stale || (identity === undefined\n ? resources.state.candidate !== undefined\n : identity !== resources.state.current.sourceCutoffIdentity),\n });\n }\n }\n catch {\n if (refresh)\n resources.state.stale = true;\n sendJson(response, 500, Object.freeze({\n code: \"view-inspection-failed\", reason: \"The View generation could not be refreshed.\", correction: \"retry\",\n } satisfies ViewHttpErrorDocument));\n }\n}\nfunction prepareGeneration(resources: ServerResources): Promise<ViewGeneration> {\n if (resources.preparing !== undefined)\n return resources.preparing;\n const source = resources.refreshSource;\n if (source === undefined || !resources.refreshEnabled)\n return Promise.resolve(resources.state.current);\n const preparing = (async () => {\n if (resources.closed)\n throw new Error(\"View is closing.\");\n const generation = await source.build();\n if (resources.closed) {\n await retireGeneration(resources, generation);\n throw new Error(\"View is closing.\");\n }\n if (resources.state.candidate !== undefined)\n retireCandidate(resources, resources.state.candidate);\n resources.state.leases.set(generation.generationId, 0);\n resources.state.candidate = generation;\n return generation;\n })();\n resources.preparing = preparing;\n void preparing.finally(() => { resources.preparing = undefined; }).catch(() => undefined);\n return preparing;\n}\nfunction descriptor(resources: ServerResources, generation: ViewGeneration): ViewGenerationDescriptor {\n return Object.freeze({\n generationId: generation.generationId,\n sourceCutoffIdentity: generation.sourceCutoffIdentity,\n targetMode: generation.target.kind,\n targetIdentity: generation.target.kind === \"current\" ? generation.target.identity : null,\n targetFailureReason: generation.target.kind === \"unavailable\" ? generation.target.reason : null,\n refreshSupported: resources.refreshEnabled,\n stale: generation.generationId === resources.state.current.generationId && (resources.state.candidate !== undefined || resources.state.stale),\n });\n}\nasync function serveCommit(resources: ServerResources, request: IncomingMessage, response: ServerResponse): Promise<void> {\n const body = await readJsonBody(request);\n if (!body.ok)\n return sendJson(response, body.status, body.error);\n const decoded = decodeGenerationCommitRequest(body.value);\n if (Result.isFailure(decoded))\n return sendJson(response, 400, requestInvalid(decoded.failure));\n const candidate = resources.state.candidate;\n if (candidate === undefined || candidate.generationId !== decoded.success.generationId) {\n return sendJson(response, 409, generationError(\"view-generation-stale\", \"The requested candidate is no longer available.\"));\n }\n const retired = resources.state.current;\n resources.state.current = candidate;\n resources.state.candidate = undefined;\n resources.state.stale = false;\n resources.state.leases.set(candidate.generationId, resources.state.leases.get(candidate.generationId) ?? 0);\n retireIfDrained(resources, retired);\n sendJson(response, 200, descriptor(resources, candidate));\n}\nasync function serveInspection(resources: ServerResources, request: IncomingMessage, response: ServerResponse): Promise<void> {\n const body = await readJsonBody(request);\n if (!body.ok)\n return sendJson(response, body.status, body.error);\n const decoded = decodeViewInspectionRequest(body.value);\n if (Result.isFailure(decoded))\n return sendJson(response, 400, requestInvalid(decoded.failure));\n const generation = findGeneration(resources, decoded.success.generationId);\n if (generation === undefined)\n return sendJson(response, 404, generationError(\"view-generation-not-found\", \"The requested generation is not available.\"));\n acquireLease(resources, generation);\n try {\n const document = await inspectViewGeneration(generation, decoded.success.request);\n sendJson(response, 200, document);\n }\n catch {\n sendJson(response, 500, Object.freeze({\n code: \"view-inspection-failed\", reason: \"Inspection could not be completed for this generation.\", correction: \"retry\",\n } satisfies ViewHttpErrorDocument));\n }\n finally {\n releaseLease(resources, generation);\n }\n}\nasync function serveAsset(generation: ViewGeneration, pathname: string, request: IncomingMessage, response: ServerResponse): Promise<void> {\n const data = generation;\n const file = await assetFile(data.appRoot, pathname, request.headers.accept);\n if (file === undefined) {\n sendText(response, 404, \"page not found\");\n return;\n }\n response.writeHead(200, {\n \"content-type\": mediaType(file.path),\n \"content-length\": String(file.size),\n ...COMMON_HEADERS,\n });\n if (request.method === \"HEAD\") {\n response.end();\n return;\n }\n const stream = createReadStream(file.path);\n stream.once(\"error\", (cause) => response.destroy(cause));\n stream.pipe(response);\n}\nasync function assetFile(appRoot: string, pathname: string, accept: string | undefined): Promise<{\n readonly path: string;\n readonly size: number;\n} | undefined> {\n const relative = safeRelativePath(pathname);\n if (relative === undefined)\n return undefined;\n const exact = relative.length === 0 ? \"index.html\" : relative;\n const found = await regularAsset(appRoot, exact);\n if (found !== undefined)\n return found;\n if (accept?.includes(\"text/html\") !== true || exact.startsWith(\"assets/\") || extname(exact) !== \"\")\n return undefined;\n return regularAsset(appRoot, \"index.html\");\n}\nfunction safeRelativePath(pathname: string): string | undefined {\n let decoded: string;\n try {\n decoded = decodeURIComponent(pathname);\n }\n catch {\n return undefined;\n }\n if (!decoded.startsWith(\"/\") || decoded.includes(\"\\\\\") || decoded.includes(\"\\u0000\"))\n return undefined;\n const relative = decoded.slice(1);\n if (relative.split(\"/\").some((segment) => segment === \".\" || segment === \"..\"))\n return undefined;\n return relative;\n}\nasync function regularAsset(appRoot: string, relative: string): Promise<{\n readonly path: string;\n readonly size: number;\n} | undefined> {\n const root = resolve(appRoot);\n const path = resolve(root, relative);\n if (!path.startsWith(`${root}${sep}`))\n return undefined;\n try {\n const metadata = await lstat(path);\n return metadata.isFile() && !metadata.isSymbolicLink()\n ? Object.freeze({ path, size: metadata.size })\n : undefined;\n }\n catch (cause) {\n if (typeof cause === \"object\" && cause !== null && Reflect.get(cause, \"code\") === \"ENOENT\")\n return undefined;\n throw cause;\n }\n}\nfunction exchangeCredential(resources: ServerResources, request: IncomingMessage, response: ServerResponse): void {\n if (request.method !== \"POST\") {\n sendText(response, 405, \"method not allowed\", { allow: \"POST\" });\n return;\n }\n if (!sameOrigin(resources, request, true)) {\n sendText(response, 403, \"view origin is not authorized\");\n return;\n }\n let bytes = 0;\n const chunks: Buffer[] = [];\n request.on(\"data\", (chunk: Buffer) => {\n bytes += chunk.byteLength;\n if (bytes > 1024)\n request.destroy();\n else\n chunks.push(chunk);\n });\n request.once(\"end\", () => {\n if (bytes > 1024)\n return;\n let value: unknown;\n try {\n value = JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown;\n }\n catch {\n sendText(response, 400, \"credential request is invalid\");\n return;\n }\n const decoded = Schema.decodeUnknownResult(SessionRequestSchema, { onExcessProperty: \"error\" })(value);\n if (Result.isFailure(decoded)) {\n sendText(response, 400, \"credential request is invalid\");\n return;\n }\n if (resources.credentialConsumed || !safeEqual(decoded.success.credential, resources.credential)) {\n sendText(response, 401, \"credential is invalid or already used\");\n return;\n }\n resources.credentialConsumed = true;\n send(response, 204, \"\", \"text/plain; charset=utf-8\", {\n \"set-cookie\": `${resources.sessionCookie}=${resources.session}; Path=/; HttpOnly; SameSite=Strict`,\n });\n });\n request.once(\"error\", () => {\n if (!response.headersSent)\n sendText(response, 400, \"credential request failed\");\n });\n}\nfunction authorizedSession(resources: ServerResources, request: IncomingMessage): boolean {\n const session = cookieValue(request.headers.cookie, resources.sessionCookie);\n return session !== undefined && safeEqual(session, resources.session);\n}\nfunction sameOrigin(resources: ServerResources, request: IncomingMessage, required = false): boolean {\n const origin = request.headers.origin;\n if (origin !== undefined)\n return origin === resources.origin;\n if (required)\n return false;\n const fetchSite = request.headers[\"sec-fetch-site\"];\n return fetchSite === undefined || fetchSite === \"same-origin\" || fetchSite === \"none\";\n}\nfunction requestUrl(request: IncomingMessage): URL | undefined {\n try {\n return new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n }\n catch {\n return undefined;\n }\n}\nfunction cookieValue(header: string | undefined, name: string): string | undefined {\n if (header === undefined)\n return undefined;\n for (const entry of header.split(\";\")) {\n const [candidate, ...value] = entry.trim().split(\"=\");\n if (candidate === name)\n return value.join(\"=\");\n }\n return undefined;\n}\nfunction safeEqual(left: string, right: string): boolean {\n const leftBytes = Buffer.from(left);\n const rightBytes = Buffer.from(right);\n return leftBytes.byteLength === rightBytes.byteLength && timingSafeEqual(leftBytes, rightBytes);\n}\nfunction listen(server: Server, port: number): Effect.Effect<number, ViewServerError> {\n return Effect.callback((resume) => {\n const cleanup = (): void => {\n server.off(\"error\", onError);\n server.off(\"listening\", onListening);\n };\n const onError = (cause: Error): void => {\n cleanup();\n resume(Effect.fail(viewError(\"listen\", cause.message)));\n };\n const onListening = (): void => {\n cleanup();\n const address = server.address();\n resume(address === null || typeof address === \"string\"\n ? Effect.fail(viewError(\"listen\", \"server did not expose a TCP port\"))\n : Effect.succeed(address.port));\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(port, \"127.0.0.1\");\n return Effect.sync(cleanup);\n });\n}\nfunction closeResources(resources: ServerResources): Effect.Effect<void> {\n return Effect.suspend(() => {\n if (resources.closed)\n return Effect.void;\n resources.closed = true;\n return Effect.callback<void>((resume) => {\n // `listening` is still false during the small bind-in-flight window.\n // Calling close unconditionally also cancels that pending listener; an\n // ERR_SERVER_NOT_RUNNING callback is an already-closed success here.\n let finishing = false;\n const finish = (): void => {\n if (finishing)\n return;\n finishing = true;\n const retirements = [retireGeneration(resources, resources.state.current)];\n if (resources.state.candidate !== undefined) {\n retirements.push(retireGeneration(resources, resources.state.candidate));\n }\n if (resources.preparing !== undefined) {\n retirements.push(resources.preparing.then(() => undefined, () => undefined));\n }\n void Promise.all(retirements).finally(() => {\n for (const socket of resources.sockets)\n socket.destroy();\n resume(Effect.void);\n });\n };\n try {\n resources.server.close(() => {\n if (resources.activeRequests === 0)\n finish();\n else\n resources.drained.add(finish);\n });\n }\n catch {\n finish();\n }\n resources.server.closeIdleConnections();\n // The browser may keep a polling connection alive while the CLI is\n // shutting down. Stop transport immediately; generation leases still\n // drain through each request's `finally` before retirement.\n resources.server.closeAllConnections();\n return Effect.void;\n });\n });\n}\nfunction findGeneration(resources: ServerResources, id: string): ViewGeneration | undefined {\n if (resources.state.current.generationId === id)\n return resources.state.current;\n if (resources.state.candidate?.generationId === id)\n return resources.state.candidate;\n return undefined;\n}\nfunction acquireLease(resources: ServerResources, generation: ViewGeneration): void {\n resources.state.leases.set(generation.generationId, (resources.state.leases.get(generation.generationId) ?? 0) + 1);\n}\nfunction releaseLease(resources: ServerResources, generation: ViewGeneration): void {\n const remaining = Math.max(0, (resources.state.leases.get(generation.generationId) ?? 1) - 1);\n resources.state.leases.set(generation.generationId, remaining);\n retireIfDrained(resources, generation);\n}\nfunction retireIfDrained(resources: ServerResources, generation: ViewGeneration): void {\n if (generation.generationId !== resources.state.current.generationId &&\n generation.generationId !== resources.state.candidate?.generationId &&\n resources.state.leases.get(generation.generationId) === 0) {\n resources.state.leases.delete(generation.generationId);\n void retireGeneration(resources, generation);\n }\n}\nfunction retireCandidate(resources: ServerResources, generation: ViewGeneration): void {\n if ((resources.state.leases.get(generation.generationId) ?? 0) === 0) {\n resources.state.leases.delete(generation.generationId);\n void retireGeneration(resources, generation);\n }\n}\nfunction retireGeneration(resources: ServerResources, generation: ViewGeneration): Promise<void> {\n if (resources.state.retired.has(generation.generationId))\n return Promise.resolve();\n resources.state.retired.add(generation.generationId);\n return generation.retire().catch(() => undefined);\n}\nfunction exactJson(request: IncomingMessage, response: ServerResponse): boolean {\n if (request.headers[\"content-type\"] === \"application/json\")\n return true;\n sendJson(response, 415, requestInvalid(\"Content-Type must be exactly application/json.\"));\n return false;\n}\ntype JsonBody = {\n readonly ok: true;\n readonly value: unknown;\n} | {\n readonly ok: false;\n readonly status: number;\n readonly error: ViewHttpErrorDocument;\n};\nfunction readJsonBody(request: IncomingMessage): Promise<JsonBody> {\n return new Promise((resolveBody) => {\n const chunks: Buffer[] = [];\n let size = 0;\n let settled = false;\n const finish = (value: JsonBody): void => {\n if (settled)\n return;\n settled = true;\n resolveBody(value);\n };\n request.on(\"data\", (chunk: Buffer) => {\n size += chunk.byteLength;\n if (size > VIEW_HTTP_BODY_LIMIT)\n finish({ ok: false, status: 413, error: requestInvalid(\"JSON body exceeds 64 KiB.\") });\n else\n chunks.push(chunk);\n });\n request.once(\"end\", () => {\n if (settled)\n return;\n try {\n finish({ ok: true, value: JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown });\n }\n catch {\n finish({ ok: false, status: 400, error: requestInvalid(\"Body must be valid JSON.\") });\n }\n });\n request.once(\"error\", () => finish({ ok: false, status: 400, error: requestInvalid(\"Request body could not be read.\") }));\n });\n}\nfunction requestInvalid(reason: string): ViewHttpErrorDocument {\n return Object.freeze({ code: \"view-request-invalid\", reason: sanitizeReason(reason), correction: \"fix-request\" });\n}\nfunction generationError(code: \"view-generation-not-found\" | \"view-generation-stale\", reason: string): ViewHttpErrorDocument {\n return Object.freeze({ code, reason, correction: \"refresh-generation\" });\n}\nfunction sanitizeReason(reason: string): string {\n return reason.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/gu, \" \").slice(0, 512);\n}\nfunction methodNotAllowed(response: ServerResponse, allow: string): void {\n sendText(response, 405, \"method not allowed\", { allow });\n}\nfunction sendJson(response: ServerResponse, status: number, value: unknown): void {\n send(response, status, JSON.stringify(value), \"application/json\");\n}\nfunction sendText(response: ServerResponse, status: number, body: string, headers: Readonly<Record<string, string>> = {}): void {\n send(response, status, body, \"text/plain; charset=utf-8\", headers);\n}\nfunction send(response: ServerResponse, status: number, body: string | Uint8Array, contentType: string, headers: Readonly<Record<string, string>> = {}): void {\n if (response.destroyed)\n return;\n response.writeHead(status, {\n \"content-type\": contentType,\n \"content-length\": String(typeof body === \"string\" ? Buffer.byteLength(body) : body.byteLength),\n ...COMMON_HEADERS,\n ...headers,\n });\n response.end(body);\n}\nfunction mediaType(path: string): string {\n switch (extname(path).toLowerCase()) {\n case \".html\": return \"text/html; charset=utf-8\";\n case \".css\": return \"text/css; charset=utf-8\";\n case \".js\":\n case \".mjs\": return \"text/javascript; charset=utf-8\";\n case \".wasm\": return \"application/wasm\";\n case \".json\": return \"application/json; charset=utf-8\";\n case \".svg\": return \"image/svg+xml\";\n case \".png\": return \"image/png\";\n case \".jpg\":\n case \".jpeg\": return \"image/jpeg\";\n case \".webp\": return \"image/webp\";\n case \".ico\": return \"image/x-icon\";\n case \".woff2\": return \"font/woff2\";\n default: return \"application/octet-stream\";\n }\n}\nfunction viewError(operation: ViewServerError[\"operation\"], reason: string): ViewServerError {\n return Object.freeze({ code: \"view-server-failed\" as const, operation, reason });\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { lstat } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { Socket } from \"node:net\";\nimport { extname, resolve, sep } from \"node:path\";\nimport { Effect, Result, Schema } from \"effect\";\nimport type * as Scope from \"effect/Scope\";\nimport { inspectViewGeneration } from \"./inspection-host.ts\";\nimport { VIEW_HTTP_BODY_LIMIT, decodeGenerationCommitRequest, decodeViewInspectionRequest, type ViewGenerationDescriptor, type ViewHttpErrorDocument, } from \"./http-protocol.ts\";\nimport type { ViewGeneration } from \"./revision.ts\";\nimport type { ViewApplicationRuntimeService } from \"./application-runtime.ts\";\nexport interface ViewServerError {\n readonly code: \"view-server-failed\";\n readonly operation: \"listen\" | \"close\";\n readonly reason: string;\n}\nexport interface ViewServer {\n readonly origin: string;\n readonly readyUrl: string;\n readonly close: Effect.Effect<void>;\n}\ninterface RefreshSource {\n readonly cutoffIdentity: () => Effect.Effect<string, unknown>;\n readonly build: () => Effect.Effect<ViewGeneration, unknown>;\n}\ninterface ServerState {\n current: ViewGeneration;\n candidate?: ViewGeneration;\n stale: boolean;\n readonly leases: Map<string, number>;\n readonly retired: Set<string>;\n}\ninterface ServerResources {\n readonly runtime: ViewApplicationRuntimeService;\n server: Server;\n readonly sockets: Set<Socket>;\n readonly credential: string;\n readonly sessionCookie: string;\n readonly session: string;\n readonly state: ServerState;\n readonly refreshEnabled: boolean;\n readonly refreshSource?: RefreshSource;\n preparing?: Promise<ViewGeneration>;\n authority?: string;\n origin?: string;\n credentialConsumed: boolean;\n closed: boolean;\n activeRequests: number;\n readonly drained: Set<() => void>;\n}\nconst SESSION_COOKIE_PREFIX = \"niceeval_view_session_\";\nconst CONTENT_SECURITY_POLICY = \"default-src 'none'; script-src 'self'; connect-src 'self'; style-src-elem 'self' 'sha256-nzTgYzXYDNe6BAHiiI7NNlfK8n/auuOAhh2t92YvuXo='; style-src-attr 'unsafe-inline'; base-uri 'none'; frame-ancestors 'none'\";\nconst COMMON_HEADERS = Object.freeze({\n \"cache-control\": \"private, no-store\",\n pragma: \"no-cache\",\n \"content-security-policy\": CONTENT_SECURITY_POLICY,\n \"referrer-policy\": \"no-referrer\",\n \"x-content-type-options\": \"nosniff\",\n});\nconst BOOTSTRAP_HTML = \"<!doctype html><html><head><meta charset=\\\"utf-8\\\"><meta name=\\\"referrer\\\" content=\\\"no-referrer\\\"><title>Opening NiceEval view</title><script src=\\\"/_niceeval/bootstrap.js\\\" defer></script></head><body><main role=\\\"status\\\">Opening NiceEval view…</main></body></html>\";\nconst BOOTSTRAP_SCRIPT = \"(()=>{const credential=location.hash.slice(1);history.replaceState(null,\\\"\\\",location.pathname+location.search);fetch(\\\"/_niceeval/session\\\",{method:\\\"POST\\\",credentials:\\\"same-origin\\\",headers:{\\\"content-type\\\":\\\"application/json\\\"},body:JSON.stringify({credential})}).then(response=>{if(!response.ok)throw new Error(\\\"unauthorized\\\");location.reload()}).catch(()=>{document.body.textContent=\\\"NiceEval view authorization failed\\\"})})()\";\nconst SessionRequestSchema = Schema.Struct({ credential: Schema.String });\n/** Scope-owned, loopback-only transport for Vite assets and a validated Record generation. */\nexport function openViewServer(input: {\n readonly runtime: ViewApplicationRuntimeService;\n readonly initial: ViewGeneration;\n readonly port: number;\n readonly refreshEnabled?: boolean;\n readonly refreshSource?: RefreshSource;\n readonly initialRunIds: readonly string[];\n}): Effect.Effect<ViewServer, ViewServerError, Scope.Scope> {\n return Effect.gen(function* () {\n const resources = yield* Effect.acquireRelease(Effect.sync(() => makeResources(input.runtime, input.initial, input.refreshEnabled === true, input.refreshSource)), closeResources);\n const port = yield* listen(resources.server, input.port);\n resources.authority = `127.0.0.1:${port}`;\n resources.origin = `http://${resources.authority}`;\n return Object.freeze({\n origin: resources.origin,\n readyUrl: viewEntryUrl(resources.origin, resources.credential, input.initialRunIds),\n close: closeResources(resources),\n });\n });\n}\nfunction viewEntryUrl(origin: string, credential: string, runIds: readonly string[]): string {\n const url = new URL(\"/\", origin);\n for (const runId of runIds)\n url.searchParams.append(\"run\", runId);\n url.hash = credential;\n return url.href;\n}\nfunction makeResources(runtime: ViewApplicationRuntimeService, initial: ViewGeneration, refreshEnabled: boolean, refreshSource?: RefreshSource): ServerResources {\n const sockets = new Set<Socket>();\n const resources: ServerResources = {\n runtime,\n server: undefined as unknown as Server,\n sockets,\n credential: randomBytes(32).toString(\"base64url\"),\n sessionCookie: `${SESSION_COOKIE_PREFIX}${randomBytes(16).toString(\"hex\")}`,\n session: randomBytes(32).toString(\"base64url\"),\n state: { current: initial, stale: false, leases: new Map([[initial.generationId, 0]]), retired: new Set() },\n refreshEnabled,\n ...(refreshSource === undefined ? {} : { refreshSource }),\n credentialConsumed: false,\n closed: false,\n activeRequests: 0,\n drained: new Set(),\n };\n resources.server = createServer((request, response) => {\n resources.activeRequests += 1;\n response.once(\"close\", () => {\n resources.activeRequests -= 1;\n if (resources.activeRequests === 0) {\n for (const resolve of resources.drained)\n resolve();\n resources.drained.clear();\n }\n });\n serveRequest(resources, request, response);\n });\n resources.server.on(\"connection\", (socket) => {\n sockets.add(socket);\n socket.once(\"close\", () => sockets.delete(socket));\n });\n return resources;\n}\nfunction serveRequest(resources: ServerResources, request: IncomingMessage, response: ServerResponse): void {\n if (resources.closed || resources.authority === undefined || resources.origin === undefined) {\n sendText(response, 503, \"view is not ready\");\n return;\n }\n if (request.headers.host !== resources.authority) {\n sendText(response, 403, \"view host is not authorized\");\n return;\n }\n const url = requestUrl(request);\n if (url === undefined) {\n sendText(response, 400, \"bad request\");\n return;\n }\n if (url.pathname === \"/_niceeval/session\") {\n exchangeCredential(resources, request, response);\n return;\n }\n if (!authorizedSession(resources, request)) {\n if ((request.method === \"GET\" || request.method === \"HEAD\") && url.pathname === \"/\") {\n send(response, 200, request.method === \"HEAD\" ? \"\" : BOOTSTRAP_HTML, \"text/html; charset=utf-8\");\n }\n else if ((request.method === \"GET\" || request.method === \"HEAD\") && url.pathname === \"/_niceeval/bootstrap.js\") {\n send(response, 200, request.method === \"HEAD\" ? \"\" : BOOTSTRAP_SCRIPT, \"text/javascript; charset=utf-8\", {\n \"content-length\": String(Buffer.byteLength(BOOTSTRAP_SCRIPT)),\n });\n }\n else {\n sendText(response, 401, \"view session is required\");\n }\n return;\n }\n if (!sameOrigin(resources, request)) {\n sendText(response, 403, \"view origin is not authorized\");\n return;\n }\n if (url.pathname === \"/_niceeval/generation\") {\n if (request.method !== \"GET\")\n return methodNotAllowed(response, \"GET\");\n void serveGeneration(resources, response, false);\n return;\n }\n if (url.pathname === \"/_niceeval/generation/refresh\") {\n if (request.method !== \"POST\")\n return methodNotAllowed(response, \"POST\");\n void serveGeneration(resources, response, true);\n return;\n }\n if (url.pathname === \"/_niceeval/generation/commit\") {\n if (request.method !== \"POST\")\n return methodNotAllowed(response, \"POST\");\n if (!exactJson(request, response))\n return;\n void serveCommit(resources, request, response);\n return;\n }\n if (url.pathname === \"/_niceeval/inspection\") {\n if (request.method !== \"POST\")\n return methodNotAllowed(response, \"POST\");\n if (!exactJson(request, response))\n return;\n void serveInspection(resources, request, response);\n return;\n }\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n sendText(response, 405, \"method not allowed\", { allow: \"GET, HEAD\" });\n return;\n }\n void serveAsset(resources.state.current, url.pathname, request, response).catch((cause: unknown) => {\n if (!response.headersSent)\n sendText(response, 500, cause instanceof Error ? cause.message : \"view asset failed\");\n else\n response.destroy(cause instanceof Error ? cause : undefined);\n });\n}\nasync function serveGeneration(resources: ServerResources, response: ServerResponse, refresh: boolean): Promise<void> {\n try {\n if (refresh) {\n const generation = await prepareGeneration(resources);\n sendJson(response, 200, descriptor(resources, generation));\n }\n else {\n const identity = resources.refreshSource === undefined\n ? undefined\n : await resources.runtime.run(resources.refreshSource.cutoffIdentity());\n sendJson(response, 200, {\n ...descriptor(resources, resources.state.current),\n stale: resources.state.stale || (identity === undefined\n ? resources.state.candidate !== undefined\n : identity !== resources.state.current.sourceCutoffIdentity),\n });\n }\n }\n catch {\n if (refresh)\n resources.state.stale = true;\n sendJson(response, 500, Object.freeze({\n code: \"view-inspection-failed\", reason: \"The View generation could not be refreshed.\", correction: \"retry\",\n } satisfies ViewHttpErrorDocument));\n }\n}\nfunction prepareGeneration(resources: ServerResources): Promise<ViewGeneration> {\n if (resources.preparing !== undefined)\n return resources.preparing;\n const source = resources.refreshSource;\n if (source === undefined || !resources.refreshEnabled)\n return Promise.resolve(resources.state.current);\n const preparing = (async () => {\n if (resources.closed)\n throw new Error(\"View is closing.\");\n const generation = await resources.runtime.run(source.build());\n if (resources.closed) {\n await retireGeneration(resources, generation);\n throw new Error(\"View is closing.\");\n }\n if (resources.state.candidate !== undefined)\n retireCandidate(resources, resources.state.candidate);\n resources.state.leases.set(generation.generationId, 0);\n resources.state.candidate = generation;\n return generation;\n })();\n resources.preparing = preparing;\n void preparing.finally(() => { resources.preparing = undefined; }).catch(() => undefined);\n return preparing;\n}\nfunction descriptor(resources: ServerResources, generation: ViewGeneration): ViewGenerationDescriptor {\n return Object.freeze({\n generationId: generation.generationId,\n sourceCutoffIdentity: generation.sourceCutoffIdentity,\n targetMode: generation.target.kind,\n targetIdentity: generation.target.kind === \"current\" ? generation.target.identity : null,\n targetFailureReason: generation.target.kind === \"unavailable\" ? generation.target.reason : null,\n refreshSupported: resources.refreshEnabled,\n stale: generation.generationId === resources.state.current.generationId && (resources.state.candidate !== undefined || resources.state.stale),\n });\n}\nasync function serveCommit(resources: ServerResources, request: IncomingMessage, response: ServerResponse): Promise<void> {\n const body = await readJsonBody(request);\n if (!body.ok)\n return sendJson(response, body.status, body.error);\n const decoded = decodeGenerationCommitRequest(body.value);\n if (Result.isFailure(decoded))\n return sendJson(response, 400, requestInvalid(decoded.failure));\n const candidate = resources.state.candidate;\n if (candidate === undefined || candidate.generationId !== decoded.success.generationId) {\n return sendJson(response, 409, generationError(\"view-generation-stale\", \"The requested candidate is no longer available.\"));\n }\n const retired = resources.state.current;\n resources.state.current = candidate;\n resources.state.candidate = undefined;\n resources.state.stale = false;\n resources.state.leases.set(candidate.generationId, resources.state.leases.get(candidate.generationId) ?? 0);\n retireIfDrained(resources, retired);\n sendJson(response, 200, descriptor(resources, candidate));\n}\nasync function serveInspection(resources: ServerResources, request: IncomingMessage, response: ServerResponse): Promise<void> {\n const body = await readJsonBody(request);\n if (!body.ok)\n return sendJson(response, body.status, body.error);\n const decoded = decodeViewInspectionRequest(body.value);\n if (Result.isFailure(decoded))\n return sendJson(response, 400, requestInvalid(decoded.failure));\n const generation = findGeneration(resources, decoded.success.generationId);\n if (generation === undefined)\n return sendJson(response, 404, generationError(\"view-generation-not-found\", \"The requested generation is not available.\"));\n acquireLease(resources, generation);\n try {\n const document = await resources.runtime.run(inspectViewGeneration(generation, decoded.success.request));\n sendJson(response, 200, document);\n }\n catch {\n sendJson(response, 500, Object.freeze({\n code: \"view-inspection-failed\", reason: \"Inspection could not be completed for this generation.\", correction: \"retry\",\n } satisfies ViewHttpErrorDocument));\n }\n finally {\n releaseLease(resources, generation);\n }\n}\nasync function serveAsset(generation: ViewGeneration, pathname: string, request: IncomingMessage, response: ServerResponse): Promise<void> {\n const data = generation;\n const file = await assetFile(data.appRoot, pathname, request.headers.accept);\n if (file === undefined) {\n sendText(response, 404, \"page not found\");\n return;\n }\n response.writeHead(200, {\n \"content-type\": mediaType(file.path),\n \"content-length\": String(file.size),\n ...COMMON_HEADERS,\n });\n if (request.method === \"HEAD\") {\n response.end();\n return;\n }\n const stream = createReadStream(file.path);\n stream.once(\"error\", (cause) => response.destroy(cause));\n stream.pipe(response);\n}\nasync function assetFile(appRoot: string, pathname: string, accept: string | undefined): Promise<{\n readonly path: string;\n readonly size: number;\n} | undefined> {\n const relative = safeRelativePath(pathname);\n if (relative === undefined)\n return undefined;\n const exact = relative.length === 0 ? \"index.html\" : relative;\n const found = await regularAsset(appRoot, exact);\n if (found !== undefined)\n return found;\n if (accept?.includes(\"text/html\") !== true || exact.startsWith(\"assets/\") || extname(exact) !== \"\")\n return undefined;\n return regularAsset(appRoot, \"index.html\");\n}\nfunction safeRelativePath(pathname: string): string | undefined {\n let decoded: string;\n try {\n decoded = decodeURIComponent(pathname);\n }\n catch {\n return undefined;\n }\n if (!decoded.startsWith(\"/\") || decoded.includes(\"\\\\\") || decoded.includes(\"\\u0000\"))\n return undefined;\n const relative = decoded.slice(1);\n if (relative.split(\"/\").some((segment) => segment === \".\" || segment === \"..\"))\n return undefined;\n return relative;\n}\nasync function regularAsset(appRoot: string, relative: string): Promise<{\n readonly path: string;\n readonly size: number;\n} | undefined> {\n const root = resolve(appRoot);\n const path = resolve(root, relative);\n if (!path.startsWith(`${root}${sep}`))\n return undefined;\n try {\n const metadata = await lstat(path);\n return metadata.isFile() && !metadata.isSymbolicLink()\n ? Object.freeze({ path, size: metadata.size })\n : undefined;\n }\n catch (cause) {\n if (typeof cause === \"object\" && cause !== null && Reflect.get(cause, \"code\") === \"ENOENT\")\n return undefined;\n throw cause;\n }\n}\nfunction exchangeCredential(resources: ServerResources, request: IncomingMessage, response: ServerResponse): void {\n if (request.method !== \"POST\") {\n sendText(response, 405, \"method not allowed\", { allow: \"POST\" });\n return;\n }\n if (!sameOrigin(resources, request, true)) {\n sendText(response, 403, \"view origin is not authorized\");\n return;\n }\n let bytes = 0;\n const chunks: Buffer[] = [];\n request.on(\"data\", (chunk: Buffer) => {\n bytes += chunk.byteLength;\n if (bytes > 1024)\n request.destroy();\n else\n chunks.push(chunk);\n });\n request.once(\"end\", () => {\n if (bytes > 1024)\n return;\n let value: unknown;\n try {\n value = JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown;\n }\n catch {\n sendText(response, 400, \"credential request is invalid\");\n return;\n }\n const decoded = Schema.decodeUnknownResult(SessionRequestSchema, { onExcessProperty: \"error\" })(value);\n if (Result.isFailure(decoded)) {\n sendText(response, 400, \"credential request is invalid\");\n return;\n }\n if (resources.credentialConsumed || !safeEqual(decoded.success.credential, resources.credential)) {\n sendText(response, 401, \"credential is invalid or already used\");\n return;\n }\n resources.credentialConsumed = true;\n send(response, 204, \"\", \"text/plain; charset=utf-8\", {\n \"set-cookie\": `${resources.sessionCookie}=${resources.session}; Path=/; HttpOnly; SameSite=Strict`,\n });\n });\n request.once(\"error\", () => {\n if (!response.headersSent)\n sendText(response, 400, \"credential request failed\");\n });\n}\nfunction authorizedSession(resources: ServerResources, request: IncomingMessage): boolean {\n const session = cookieValue(request.headers.cookie, resources.sessionCookie);\n return session !== undefined && safeEqual(session, resources.session);\n}\nfunction sameOrigin(resources: ServerResources, request: IncomingMessage, required = false): boolean {\n const origin = request.headers.origin;\n if (origin !== undefined)\n return origin === resources.origin;\n if (required)\n return false;\n const fetchSite = request.headers[\"sec-fetch-site\"];\n return fetchSite === undefined || fetchSite === \"same-origin\" || fetchSite === \"none\";\n}\nfunction requestUrl(request: IncomingMessage): URL | undefined {\n try {\n return new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n }\n catch {\n return undefined;\n }\n}\nfunction cookieValue(header: string | undefined, name: string): string | undefined {\n if (header === undefined)\n return undefined;\n for (const entry of header.split(\";\")) {\n const [candidate, ...value] = entry.trim().split(\"=\");\n if (candidate === name)\n return value.join(\"=\");\n }\n return undefined;\n}\nfunction safeEqual(left: string, right: string): boolean {\n const leftBytes = Buffer.from(left);\n const rightBytes = Buffer.from(right);\n return leftBytes.byteLength === rightBytes.byteLength && timingSafeEqual(leftBytes, rightBytes);\n}\nfunction listen(server: Server, port: number): Effect.Effect<number, ViewServerError> {\n return Effect.callback((resume) => {\n const cleanup = (): void => {\n server.off(\"error\", onError);\n server.off(\"listening\", onListening);\n };\n const onError = (cause: Error): void => {\n cleanup();\n resume(Effect.fail(viewError(\"listen\", cause.message)));\n };\n const onListening = (): void => {\n cleanup();\n const address = server.address();\n resume(address === null || typeof address === \"string\"\n ? Effect.fail(viewError(\"listen\", \"server did not expose a TCP port\"))\n : Effect.succeed(address.port));\n };\n server.once(\"error\", onError);\n server.once(\"listening\", onListening);\n server.listen(port, \"127.0.0.1\");\n return Effect.sync(cleanup);\n });\n}\nfunction closeResources(resources: ServerResources): Effect.Effect<void> {\n return Effect.suspend(() => {\n if (resources.closed)\n return Effect.void;\n resources.closed = true;\n return Effect.callback<void>((resume) => {\n // `listening` is still false during the small bind-in-flight window.\n // Calling close unconditionally also cancels that pending listener; an\n // ERR_SERVER_NOT_RUNNING callback is an already-closed success here.\n let finishing = false;\n const finish = (): void => {\n if (finishing)\n return;\n finishing = true;\n const retirements = [retireGeneration(resources, resources.state.current)];\n if (resources.state.candidate !== undefined) {\n retirements.push(retireGeneration(resources, resources.state.candidate));\n }\n if (resources.preparing !== undefined) {\n retirements.push(resources.preparing.then(() => undefined, () => undefined));\n }\n void Promise.all(retirements).finally(() => {\n for (const socket of resources.sockets)\n socket.destroy();\n resume(Effect.void);\n });\n };\n try {\n resources.server.close(() => {\n if (resources.activeRequests === 0)\n finish();\n else\n resources.drained.add(finish);\n });\n }\n catch {\n finish();\n }\n resources.server.closeIdleConnections();\n // The browser may keep a polling connection alive while the CLI is\n // shutting down. Stop transport immediately; generation leases still\n // drain through each request's `finally` before retirement.\n resources.server.closeAllConnections();\n return Effect.void;\n });\n });\n}\nfunction findGeneration(resources: ServerResources, id: string): ViewGeneration | undefined {\n if (resources.state.current.generationId === id)\n return resources.state.current;\n if (resources.state.candidate?.generationId === id)\n return resources.state.candidate;\n return undefined;\n}\nfunction acquireLease(resources: ServerResources, generation: ViewGeneration): void {\n resources.state.leases.set(generation.generationId, (resources.state.leases.get(generation.generationId) ?? 0) + 1);\n}\nfunction releaseLease(resources: ServerResources, generation: ViewGeneration): void {\n const remaining = Math.max(0, (resources.state.leases.get(generation.generationId) ?? 1) - 1);\n resources.state.leases.set(generation.generationId, remaining);\n retireIfDrained(resources, generation);\n}\nfunction retireIfDrained(resources: ServerResources, generation: ViewGeneration): void {\n if (generation.generationId !== resources.state.current.generationId &&\n generation.generationId !== resources.state.candidate?.generationId &&\n resources.state.leases.get(generation.generationId) === 0) {\n resources.state.leases.delete(generation.generationId);\n void retireGeneration(resources, generation);\n }\n}\nfunction retireCandidate(resources: ServerResources, generation: ViewGeneration): void {\n if ((resources.state.leases.get(generation.generationId) ?? 0) === 0) {\n resources.state.leases.delete(generation.generationId);\n void retireGeneration(resources, generation);\n }\n}\nfunction retireGeneration(resources: ServerResources, generation: ViewGeneration): Promise<void> {\n if (resources.state.retired.has(generation.generationId))\n return Promise.resolve();\n resources.state.retired.add(generation.generationId);\n return generation.retire().catch(() => undefined);\n}\nfunction exactJson(request: IncomingMessage, response: ServerResponse): boolean {\n if (request.headers[\"content-type\"] === \"application/json\")\n return true;\n sendJson(response, 415, requestInvalid(\"Content-Type must be exactly application/json.\"));\n return false;\n}\ntype JsonBody = {\n readonly ok: true;\n readonly value: unknown;\n} | {\n readonly ok: false;\n readonly status: number;\n readonly error: ViewHttpErrorDocument;\n};\nfunction readJsonBody(request: IncomingMessage): Promise<JsonBody> {\n return new Promise((resolveBody) => {\n const chunks: Buffer[] = [];\n let size = 0;\n let settled = false;\n const finish = (value: JsonBody): void => {\n if (settled)\n return;\n settled = true;\n resolveBody(value);\n };\n request.on(\"data\", (chunk: Buffer) => {\n size += chunk.byteLength;\n if (size > VIEW_HTTP_BODY_LIMIT)\n finish({ ok: false, status: 413, error: requestInvalid(\"JSON body exceeds 64 KiB.\") });\n else\n chunks.push(chunk);\n });\n request.once(\"end\", () => {\n if (settled)\n return;\n try {\n finish({ ok: true, value: JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown });\n }\n catch {\n finish({ ok: false, status: 400, error: requestInvalid(\"Body must be valid JSON.\") });\n }\n });\n request.once(\"error\", () => finish({ ok: false, status: 400, error: requestInvalid(\"Request body could not be read.\") }));\n });\n}\nfunction requestInvalid(reason: string): ViewHttpErrorDocument {\n return Object.freeze({ code: \"view-request-invalid\", reason: sanitizeReason(reason), correction: \"fix-request\" });\n}\nfunction generationError(code: \"view-generation-not-found\" | \"view-generation-stale\", reason: string): ViewHttpErrorDocument {\n return Object.freeze({ code, reason, correction: \"refresh-generation\" });\n}\nfunction sanitizeReason(reason: string): string {\n return reason.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/gu, \" \").slice(0, 512);\n}\nfunction methodNotAllowed(response: ServerResponse, allow: string): void {\n sendText(response, 405, \"method not allowed\", { allow });\n}\nfunction sendJson(response: ServerResponse, status: number, value: unknown): void {\n send(response, status, JSON.stringify(value), \"application/json\");\n}\nfunction sendText(response: ServerResponse, status: number, body: string, headers: Readonly<Record<string, string>> = {}): void {\n send(response, status, body, \"text/plain; charset=utf-8\", headers);\n}\nfunction send(response: ServerResponse, status: number, body: string | Uint8Array, contentType: string, headers: Readonly<Record<string, string>> = {}): void {\n if (response.destroyed)\n return;\n response.writeHead(status, {\n \"content-type\": contentType,\n \"content-length\": String(typeof body === \"string\" ? Buffer.byteLength(body) : body.byteLength),\n ...COMMON_HEADERS,\n ...headers,\n });\n response.end(body);\n}\nfunction mediaType(path: string): string {\n switch (extname(path).toLowerCase()) {\n case \".html\": return \"text/html; charset=utf-8\";\n case \".css\": return \"text/css; charset=utf-8\";\n case \".js\":\n case \".mjs\": return \"text/javascript; charset=utf-8\";\n case \".wasm\": return \"application/wasm\";\n case \".json\": return \"application/json; charset=utf-8\";\n case \".svg\": return \"image/svg+xml\";\n case \".png\": return \"image/png\";\n case \".jpg\":\n case \".jpeg\": return \"image/jpeg\";\n case \".webp\": return \"image/webp\";\n case \".ico\": return \"image/x-icon\";\n case \".woff2\": return \"font/woff2\";\n default: return \"application/octet-stream\";\n }\n}\nfunction viewError(operation: ViewServerError[\"operation\"], reason: string): ViewServerError {\n return Object.freeze({ code: \"view-server-failed\" as const, operation, reason });\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { Effect } from "effect";
2
2
  import type * as Scope from "effect/Scope";
3
3
  import type { ViewGeneration } from "./revision.cjs";
4
+ import type { ViewApplicationRuntimeService } from "./application-runtime.cjs";
4
5
  export interface ViewServerError {
5
6
  readonly code: "view-server-failed";
6
7
  readonly operation: "listen" | "close";
@@ -12,11 +13,12 @@ export interface ViewServer {
12
13
  readonly close: Effect.Effect<void>;
13
14
  }
14
15
  interface RefreshSource {
15
- readonly cutoffIdentity: () => Promise<string>;
16
- readonly build: () => Promise<ViewGeneration>;
16
+ readonly cutoffIdentity: () => Effect.Effect<string, unknown>;
17
+ readonly build: () => Effect.Effect<ViewGeneration, unknown>;
17
18
  }
18
19
  /** Scope-owned, loopback-only transport for Vite assets and a validated Record generation. */
19
20
  export declare function openViewServer(input: {
21
+ readonly runtime: ViewApplicationRuntimeService;
20
22
  readonly initial: ViewGeneration;
21
23
  readonly port: number;
22
24
  readonly refreshEnabled?: boolean;
@@ -1,6 +1,7 @@
1
1
  import { Effect } from "effect";
2
2
  import type * as Scope from "effect/Scope";
3
3
  import type { ViewGeneration } from "./revision.mjs";
4
+ import type { ViewApplicationRuntimeService } from "./application-runtime.mjs";
4
5
  export interface ViewServerError {
5
6
  readonly code: "view-server-failed";
6
7
  readonly operation: "listen" | "close";
@@ -12,11 +13,12 @@ export interface ViewServer {
12
13
  readonly close: Effect.Effect<void>;
13
14
  }
14
15
  interface RefreshSource {
15
- readonly cutoffIdentity: () => Promise<string>;
16
- readonly build: () => Promise<ViewGeneration>;
16
+ readonly cutoffIdentity: () => Effect.Effect<string, unknown>;
17
+ readonly build: () => Effect.Effect<ViewGeneration, unknown>;
17
18
  }
18
19
  /** Scope-owned, loopback-only transport for Vite assets and a validated Record generation. */
19
20
  export declare function openViewServer(input: {
21
+ readonly runtime: ViewApplicationRuntimeService;
20
22
  readonly initial: ViewGeneration;
21
23
  readonly port: number;
22
24
  readonly refreshEnabled?: boolean;
@@ -1,6 +1,7 @@
1
1
  import { Effect } from "effect";
2
2
  import type * as Scope from "effect/Scope";
3
3
  import type { ViewGeneration } from "./revision.js";
4
+ import type { ViewApplicationRuntimeService } from "./application-runtime.js";
4
5
  export interface ViewServerError {
5
6
  readonly code: "view-server-failed";
6
7
  readonly operation: "listen" | "close";
@@ -12,11 +13,12 @@ export interface ViewServer {
12
13
  readonly close: Effect.Effect<void>;
13
14
  }
14
15
  interface RefreshSource {
15
- readonly cutoffIdentity: () => Promise<string>;
16
- readonly build: () => Promise<ViewGeneration>;
16
+ readonly cutoffIdentity: () => Effect.Effect<string, unknown>;
17
+ readonly build: () => Effect.Effect<ViewGeneration, unknown>;
17
18
  }
18
19
  /** Scope-owned, loopback-only transport for Vite assets and a validated Record generation. */
19
20
  export declare function openViewServer(input: {
21
+ readonly runtime: ViewApplicationRuntimeService;
20
22
  readonly initial: ViewGeneration;
21
23
  readonly port: number;
22
24
  readonly refreshEnabled?: boolean;
@@ -116,7 +116,7 @@ niceeval view [--run <run-id>...] [--no-open] [--port <port>] [--json]
116
116
  | `--max-concurrency` | `niceeval exp` | number | 限制同时执行的 Attempt 数量。 |
117
117
  | `--max-build-concurrency` | `niceeval exp` | number | 限制同时准备 Sandbox build 的数量。 |
118
118
  | `--max-setup-prefix-concurrency` | `niceeval exp` | number | 限制同时准备 Sandbox setup prefix 的数量。 |
119
- | `--sandbox-setup-cache` | `niceeval exp` | string | 使用或绕过 Sandbox 准备缓存。 |
119
+ | `--sandbox-setup-cache` | `niceeval exp` | string | Use or bypass the Sandbox setup cache. |
120
120
  | `--timeout` | `niceeval exp` | number | 以毫秒设置每个 Attempt 的超时时间。 |
121
121
  | `--budget` | `niceeval exp` | number | 以美元设置本次 Invocation 的预算。 |
122
122
  | `--junit` | `niceeval exp` | string | 写出必需的 JUnit 报告。 |
@@ -125,7 +125,6 @@ niceeval view [--run <run-id>...] [--no-open] [--port <port>] [--json]
125
125
  | `--rerun`(单独使用为 `failed`) / `--rerun=failed\|all` / `--rerun failed\|all` | `niceeval exp` | `failed` \| `all` | 要求重新运行失败目标或全部目标。 |
126
126
  | `--keep-sandbox`(单独使用为 `failed`) / `--keep-sandbox=failed\|all` | `niceeval exp` | `failed` \| `all` | 保留 failed 或全部已结束 Attempt 的 Sandbox。 |
127
127
  | `--early-exit` / `--no-early-exit` | `niceeval exp` | boolean | 某次结果通过后停止该评估用例余下的 Attempt。 |
128
- | `--record` | `niceeval exp`、`niceeval accept` | string | 使用指定的 NiceEval Record root。 |
129
128
  | `--json` | `niceeval exp list` | boolean | 写出该命令的机器文档或事件流。 |
130
129
  | `--run` | `niceeval exp rename` | string[] | 选择要采用到目标 Experiment 的一个精确 Run;重复传入会被拒绝。 |
131
130
  | `--dry` | `niceeval exp rename` | boolean | 预览显式 Experiment 重命名。 |
@@ -107,3 +107,25 @@ Attempt 页面先显示应用和 Judge 的合计费用:
107
107
  - 只读到一部分记录时,调用 `ctx.sealUsage({ state: "partial", reason: "source-incomplete" })`。
108
108
 
109
109
  没有声明完整的空记录会显示为未知费用,不会显示成零。
110
+
111
+ ## 按模型用途检查缓存读取率
112
+
113
+ Headless Adapter 使用 `ctx.recordUsage` 登记真实调用,并在采集结束后调用 `ctx.sealUsage`。随后可以直接用 `t.usage.cacheRead` 设置缓存读取率门槛:
114
+
115
+ ```ts
116
+ import { atLeast } from "niceeval/expect";
117
+
118
+ const planner = t.usage.cacheRead.modelSlots.find(group => group.modelSlot === "planner");
119
+ t.check(
120
+ planner?.rate ?? { state: "unavailable", reason: "model-slot-not-recorded" },
121
+ atLeast(0.6),
122
+ ).gate();
123
+ ```
124
+
125
+ 读取率是同组调用的 **缓存读取 token 总量 / 含缓存输入 token 总量**,包括失败调用与重试。它不是逐次百分比的平均值。每次调用优先使用 `inputTotalTokens`;没有独立总量时,必须同时提供 `inputTokens`、`cacheReadTokens`、`cacheWriteTokens` 三个互斥桶。
126
+
127
+ `cacheRead.total` 给出整个 Attempt 的结果,`modelSlots` 按用途分组,`models` 进一步按真实 `provider` 和 `model` 分组。未知身份保持 `null`,不会用配置值补齐。`coveredCalls / recordedCalls` 表示已登记调用的输入覆盖率;`collectionComplete` 单独表示采集是否完整。
128
+
129
+ 缺失输入、未 seal、partial seal、unknown 调用状态、空组或零分母均返回 `unavailable`,`reasons` 列出原因。缺失不按零处理;完整且有正输入总量的零缓存读取率才是数值 0。旧账本没有明确的生产者完整性声明时,也返回不可判定。
130
+
131
+ 使用 `niceeval show <Attempt locator> --usage` 或 View 查看读取率、覆盖情况与原因;脚本通过 `attempt.usage` 的 `usage.cacheRead` 读取相同报告。已有 `recordUsage` 调用无需改名,但必须登记缓存 token,并在采集完成后诚实 seal。无需迁移历史结果文件。
@@ -123,6 +123,27 @@ Adapter 要提供已经关联好的事实,让组合条件判断的是同一个
123
123
 
124
124
  `observe(ctx)` 执行或等待这次客服任务,返回当前 Attempt 的只读事实。它用 `ctx.signal` 响应取消,按需登记释放连接的回调,并通过 `ctx.recordUsage` 上报用量。记录关联、协议解码和时间校验都在这里完成,不放进评估正文。
125
125
 
126
+ ### 避免汇总失败影响其它指标
127
+
128
+ 先把封存的原始记录交给 `ctx.attach`,等待归档回执,再用 `ctx.recordUsage` 登记已取得的物理调用并调用 `ctx.sealUsage`。最后计算延迟、分位数等派生指标。证据或用量来自独立来源时,分别完成接管,不要把“文件存在”当成“已归档”。
129
+
130
+ 只对能够明确归属于某个指标的已知汇总错误返回不可用材料:
131
+
132
+ ```ts
133
+ import type { NumericMaterial } from "niceeval/expect";
134
+
135
+ const latency: NumericMaterial = {
136
+ state: "unavailable",
137
+ reason: "summary-capacity-exceeded",
138
+ };
139
+ ```
140
+
141
+ 其它可信指标继续登记;未知异常继续抛出。不要把附件归档失败或用量采集失败也捕获成指标缺失。必要门槛缺失仍会使 Attempt 无法通过,但已登记的事实和已知分数会保留;持久保存以 Attempt 发布成功为准。
142
+
143
+ 大记录使用带背压的流读取。分行器缓存整行之前就要限制单行字节数,同时限制解压后的累计字节数和派生集合容量。压缩文件大小不能代替解压容量限制,流式输入也不能最终拼成无界字符串或数组。超限时明确返回受影响指标不可用,不能静默截取前缀;失败和取消都要关闭流、释放文件句柄。
144
+
145
+ `sealUsage` 的 partial reason 使用 1–128 字符的非秘密 ASCII 标识:首字符为字母或数字,其余允许字母、数字、点、下划线、冒号和连字符。例如 `ai-event-stream-incomplete`;不要填带空格的句子。
146
+
126
147
  完成状态要有证据:
127
148
 
128
149
  - 任务完成时,要有完成事件,`businessSeconds` 是核验过的非负业务时间。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "niceeval",
3
- "version": "0.16.2",
3
+ "version": "0.17.0",
4
4
  "description": "Agent-native eval tool — eval agents, services, functions, and coding-agent fixtures",
5
5
  "type": "module",
6
6
  "license": "MIT",