niceeval 0.16.3-canary.99 → 0.17.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.
- package/dist/cli/bootstrap.cjs +7 -1
- package/dist/cli/bootstrap.cjs.map +1 -1
- package/dist/cli/project-configuration.cjs +8 -11
- package/dist/cli/project-configuration.cjs.map +1 -1
- package/dist/expect/index.cjs.map +1 -1
- package/dist/expect/index.d.cts +2 -1
- package/dist/expect/index.d.mts +2 -1
- package/dist/expect/index.d.ts +2 -1
- package/dist/experiment/host/cli/contribution.cjs +6 -11
- package/dist/experiment/host/cli/contribution.cjs.map +1 -1
- package/dist/experiment/host/cli/contribution.d.cts +0 -16
- package/dist/experiment/host/cli/contribution.d.mts +0 -16
- package/dist/experiment/host/cli/contribution.d.ts +0 -16
- package/dist/experiment/host/operations.cjs +3 -3
- package/dist/experiment/host/operations.cjs.map +1 -1
- package/dist/experiment/host/types.cjs.map +1 -1
- package/dist/experiment/host/types.d.cts +0 -4
- package/dist/experiment/host/types.d.mts +0 -4
- package/dist/experiment/host/types.d.ts +0 -4
- package/dist/fresh-import.cjs +2 -2
- package/dist/fresh-import.cjs.map +1 -1
- package/dist/fresh-import.d.cts +3 -3
- package/dist/fresh-import.d.mts +3 -3
- package/dist/fresh-import.d.ts +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/inspection/codec.cjs.map +1 -1
- package/dist/inspection/codec.d.cts +1 -1
- package/dist/inspection/codec.d.mts +1 -1
- package/dist/inspection/codec.d.ts +1 -1
- package/dist/inspection/facts.cjs +66 -9
- package/dist/inspection/facts.cjs.map +1 -1
- package/dist/inspection/facts.d.cts +4 -0
- package/dist/inspection/facts.d.mts +4 -0
- package/dist/inspection/facts.d.ts +4 -0
- package/dist/inspection/facts.js +4 -2
- package/dist/inspection/index.cjs +1 -3
- package/dist/inspection/index.cjs.map +1 -1
- package/dist/inspection/index.d.cts +1 -1
- package/dist/inspection/index.d.mts +1 -1
- package/dist/inspection/index.d.ts +1 -1
- package/dist/inspection/index.js +44 -48
- package/dist/inspection/limits.cjs +3 -1
- package/dist/inspection/limits.cjs.map +1 -1
- package/dist/inspection/limits.d.cts +2 -0
- package/dist/inspection/limits.d.mts +2 -0
- package/dist/inspection/limits.d.ts +2 -0
- package/dist/inspection/limits.js +6 -4
- package/dist/inspection/project-source.cjs +4 -1
- package/dist/inspection/project-source.cjs.map +1 -1
- package/dist/inspection/protocol.cjs +10 -18
- package/dist/inspection/protocol.cjs.map +1 -1
- package/dist/inspection/protocol.d.cts +111 -173
- package/dist/inspection/protocol.d.mts +111 -173
- package/dist/inspection/protocol.d.ts +111 -173
- package/dist/inspection/public.mjs +73 -109
- package/dist/inspection/results.cjs +12 -48
- package/dist/inspection/results.cjs.map +1 -1
- package/dist/inspection/results.d.cts +124 -122
- package/dist/inspection/results.d.mts +124 -122
- package/dist/inspection/results.d.ts +124 -122
- package/dist/inspection/results.js +16 -20
- package/dist/inspection/select.cjs +80 -117
- package/dist/inspection/select.cjs.map +1 -1
- package/dist/inspection/source.cjs +14 -15
- package/dist/inspection/source.cjs.map +1 -1
- package/dist/inspection/source.d.cts +6 -3
- package/dist/inspection/source.d.mts +6 -3
- package/dist/inspection/source.d.ts +6 -3
- package/dist/inspection/trace.cjs +1 -1
- package/dist/inspection/trace.cjs.map +1 -1
- package/dist/load-config.cjs +17 -11
- package/dist/load-config.cjs.map +1 -1
- package/dist/load-config.d.cts +3 -2
- package/dist/load-config.d.mts +3 -2
- package/dist/load-config.d.ts +3 -2
- package/dist/o11y/adapter-usage-projection.cjs +5 -1
- package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
- package/dist/o11y/adapter-usage-projection.d.cts +109 -1
- package/dist/o11y/adapter-usage-projection.d.mts +109 -1
- package/dist/o11y/adapter-usage-projection.d.ts +109 -1
- package/dist/o11y/cache-read.cjs +113 -0
- package/dist/o11y/cache-read.cjs.map +1 -0
- package/dist/o11y/cache-read.d.cts +80 -0
- package/dist/o11y/cache-read.d.mts +80 -0
- package/dist/o11y/cache-read.d.ts +80 -0
- package/dist/o11y/cache-read.js +8 -0
- package/dist/o11y/cache-read.js.map +1 -0
- package/dist/o11y/eval-usage.cjs +22 -1
- package/dist/o11y/eval-usage.cjs.map +1 -1
- package/dist/o11y/eval-usage.d.cts +9 -1
- package/dist/o11y/eval-usage.d.mts +9 -1
- package/dist/o11y/eval-usage.d.ts +9 -1
- package/dist/record/host/sqlite-host.cjs +188 -53
- package/dist/record/host/sqlite-host.cjs.map +1 -1
- package/dist/record/host/sqlite-host.d.cts +37 -1
- package/dist/record/host/sqlite-host.d.mts +37 -1
- package/dist/record/host/sqlite-host.d.ts +37 -1
- package/dist/record/host/sqlite-host.js +16 -8
- package/dist/record/maintenance/runtime.cjs +3 -3
- package/dist/record/maintenance/runtime.cjs.map +1 -1
- package/dist/record/sqlite/admission-repository.cjs +18 -18
- package/dist/record/sqlite/admission-repository.cjs.map +1 -1
- package/dist/record/sqlite/case-repository.cjs +6 -6
- package/dist/record/sqlite/case-repository.cjs.map +1 -1
- package/dist/record/sqlite/coordination-repository.cjs +25 -25
- package/dist/record/sqlite/coordination-repository.cjs.map +1 -1
- package/dist/record/sqlite/current-schema.cjs +115 -111
- package/dist/record/sqlite/current-schema.cjs.map +1 -1
- package/dist/record/sqlite/current-schema.d.cts +3 -3
- package/dist/record/sqlite/current-schema.d.mts +3 -3
- package/dist/record/sqlite/current-schema.d.ts +3 -3
- package/dist/record/sqlite/database.cjs +56 -53
- package/dist/record/sqlite/database.cjs.map +1 -1
- package/dist/record/sqlite/index.cjs +3 -1
- package/dist/record/sqlite/index.cjs.map +1 -1
- package/dist/record/sqlite/index.d.cts +5 -2
- package/dist/record/sqlite/index.d.mts +5 -2
- package/dist/record/sqlite/index.d.ts +5 -2
- package/dist/record/sqlite/legacy-schema-018.cjs +443 -0
- package/dist/record/sqlite/legacy-schema-018.cjs.map +1 -0
- package/dist/record/sqlite/legacy-schema-018.d.cts +6 -0
- package/dist/record/sqlite/legacy-schema-018.d.mts +6 -0
- package/dist/record/sqlite/legacy-schema-018.d.ts +6 -0
- package/dist/record/sqlite/legacy-schema-018.js +6 -0
- package/dist/record/sqlite/legacy-schema-018.js.map +1 -0
- package/dist/record/sqlite/migration.cjs +105 -46
- package/dist/record/sqlite/migration.cjs.map +1 -1
- package/dist/record/sqlite/migration.d.cts +2 -1
- package/dist/record/sqlite/migration.d.mts +2 -1
- package/dist/record/sqlite/migration.d.ts +2 -1
- package/dist/record/sqlite/portable-capture.cjs +13 -13
- package/dist/record/sqlite/portable-capture.cjs.map +1 -1
- package/dist/record/sqlite/registry-repository.cjs +22 -22
- package/dist/record/sqlite/registry-repository.cjs.map +1 -1
- package/dist/record/sqlite/schema.cjs +10 -2
- package/dist/record/sqlite/schema.cjs.map +1 -1
- package/dist/record/sqlite/schema.d.cts +4 -1
- package/dist/record/sqlite/schema.d.mts +4 -1
- package/dist/record/sqlite/schema.d.ts +4 -1
- package/dist/record/sqlite/schema.js +20 -14
- package/dist/record/sqlite/storage-worker.cjs +1 -1
- package/dist/record/sqlite/storage-worker.cjs.map +1 -1
- package/dist/record/sqlite/storage.cjs +316 -232
- package/dist/record/sqlite/storage.cjs.map +1 -1
- package/dist/record/sqlite/storage.d.cts +10 -2
- package/dist/record/sqlite/storage.d.mts +10 -2
- package/dist/record/sqlite/storage.d.ts +10 -2
- package/dist/record/sqlite/storage.js +54 -50
- package/dist/record/sqlite/types.cjs +1 -1
- package/dist/record/sqlite/types.cjs.map +1 -1
- package/dist/record/sqlite/types.d.cts +13 -1
- package/dist/record/sqlite/types.d.mts +13 -1
- package/dist/record/sqlite/types.d.ts +13 -1
- package/dist/run/cli/contribution.cjs +17 -12
- package/dist/run/cli/contribution.cjs.map +1 -1
- package/dist/run/host/lifecycle-adapter.cjs +1 -1
- package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
- package/dist/run/storage/owner-identity.cjs +78 -16
- package/dist/run/storage/owner-identity.cjs.map +1 -1
- package/dist/run/storage/owner-identity.d.cts +2 -1
- package/dist/run/storage/owner-identity.d.mts +2 -1
- package/dist/run/storage/owner-identity.d.ts +2 -1
- package/dist/run/storage/sqlite.cjs +55 -55
- package/dist/run/storage/sqlite.cjs.map +1 -1
- package/dist/runner/accept.cjs +12 -42
- package/dist/runner/accept.cjs.map +1 -1
- package/dist/runner/accept.d.cts +2 -3
- package/dist/runner/accept.d.mts +2 -3
- package/dist/runner/accept.d.ts +2 -3
- package/dist/runner/adapter-usage.cjs +2 -2
- package/dist/runner/adapter-usage.cjs.map +1 -1
- package/dist/runner/adoption.cjs +14 -26
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/adoption.d.cts +5 -13
- package/dist/runner/adoption.d.mts +5 -13
- package/dist/runner/adoption.d.ts +5 -13
- package/dist/runner/adoption.js +2 -4
- package/dist/runner/record.cjs +24 -18
- package/dist/runner/record.cjs.map +1 -1
- package/dist/runner/rename-experiment.cjs +5 -7
- package/dist/runner/rename-experiment.cjs.map +1 -1
- package/dist/runner/reuse-plan.cjs +37 -18
- package/dist/runner/reuse-plan.cjs.map +1 -1
- package/dist/runner/reuse-plan.d.cts +4 -1
- package/dist/runner/reuse-plan.d.mts +4 -1
- package/dist/runner/reuse-plan.d.ts +4 -1
- package/dist/runner/setup-prefix-plan.cjs +17 -12
- package/dist/runner/setup-prefix-plan.cjs.map +1 -1
- package/dist/runner/setup-prefix-plan.d.cts +0 -2
- package/dist/runner/setup-prefix-plan.d.mts +0 -2
- package/dist/runner/setup-prefix-plan.d.ts +0 -2
- package/dist/runner/setup-prefix-plan.js +8 -12
- package/dist/sandbox/backend.cjs +10 -1
- package/dist/sandbox/backend.cjs.map +1 -1
- package/dist/sandbox/backend.d.cts +16 -8
- package/dist/sandbox/backend.d.mts +16 -8
- package/dist/sandbox/backend.d.ts +16 -8
- package/dist/sandbox/backend.js +28 -26
- package/dist/sandbox/docker.cjs +7 -1
- package/dist/sandbox/docker.cjs.map +1 -1
- package/dist/sandbox/e2b-cache-repository.cjs +13 -3
- package/dist/sandbox/e2b-cache-repository.cjs.map +1 -1
- package/dist/sandbox/e2b-cache-repository.d.cts +3 -0
- package/dist/sandbox/e2b-cache-repository.d.mts +3 -0
- package/dist/sandbox/e2b-cache-repository.d.ts +3 -0
- package/dist/sandbox/e2b-cache-repository.js +16 -12
- package/dist/sandbox/e2b.cjs +2 -2
- package/dist/sandbox/e2b.cjs.map +1 -1
- package/dist/sandbox/incus/materialize.cjs +1 -1
- package/dist/sandbox/incus/materialize.cjs.map +1 -1
- package/dist/show/contribution.cjs +3 -3
- package/dist/show/contribution.cjs.map +1 -1
- package/dist/show/model.cjs +14 -13
- package/dist/show/model.cjs.map +1 -1
- package/dist/show/model.d.cts +7 -7
- package/dist/show/model.d.mts +7 -7
- package/dist/show/model.d.ts +7 -7
- package/dist/show/render.cjs +14 -0
- package/dist/show/render.cjs.map +1 -1
- package/dist/user-database/storage-worker.cjs +13 -3
- package/dist/user-database/storage-worker.cjs.map +1 -1
- package/dist/view/app-dist/.vite/manifest.json +2 -2
- package/dist/view/app-dist/assets/{index-CmVoXbwG.js → index-B3ijZRph.js} +17 -17
- package/dist/view/app-dist/assets/{quality-cost-scatter-BuLISaH4.js → quality-cost-scatter-B--DfJ9s.js} +1 -1
- package/dist/view/app-dist/index.html +1 -1
- package/dist/view/application-runtime.cjs +8 -0
- package/dist/view/application-runtime.cjs.map +1 -0
- package/dist/view/application-runtime.d.cts +9 -0
- package/dist/view/application-runtime.d.mts +9 -0
- package/dist/view/application-runtime.d.ts +9 -0
- package/dist/view/application-runtime.js +6 -0
- package/dist/view/application-runtime.js.map +1 -0
- package/dist/view/cli/contribution.cjs +5 -2
- package/dist/view/cli/contribution.cjs.map +1 -1
- package/dist/view/cli/contribution.d.cts +2 -1
- package/dist/view/cli/contribution.d.mts +2 -1
- package/dist/view/cli/contribution.d.ts +2 -1
- package/dist/view/function-runtime.mjs +1019 -456
- package/dist/view/http-protocol.d.cts +1 -9
- package/dist/view/http-protocol.d.mts +1 -9
- package/dist/view/http-protocol.d.ts +1 -9
- package/dist/view/inspection-host.cjs +39 -30
- package/dist/view/inspection-host.cjs.map +1 -1
- package/dist/view/inspection-host.d.cts +7545 -2
- package/dist/view/inspection-host.d.mts +7545 -2
- package/dist/view/inspection-host.d.ts +7545 -2
- package/dist/view/server.cjs +8 -5
- package/dist/view/server.cjs.map +1 -1
- package/dist/view/server.d.cts +4 -2
- package/dist/view/server.d.mts +4 -2
- package/dist/view/server.d.ts +4 -2
- package/docs-site/zh/reference/cli.mdx +1 -2
- package/docs-site/zh/tutorials/control-run-cost.mdx +61 -0
- package/docs-site/zh/tutorials/niceeval-taste-application.mdx +21 -0
- package/package.json +1 -1
package/dist/view/server.cjs
CHANGED
|
@@ -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 =
|
|
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 {
|
package/dist/view/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":";;AA8DA,wCAkBC;AAhFD,6CAA2D;AAC3D,qCAA2C;AAC3C,+CAAyC;AACzC,yCAAiG;AAEjG,yCAAkD;AAClD,mCAAgD;AAEhD,6DAA6D;AAC7D,yDAAkL;AAwClL,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AACvD,MAAM,uBAAuB,GAAG,iNAAiN,CAAC;AAClP,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACjC,eAAe,EAAE,mBAAmB;IACpC,MAAM,EAAE,UAAU;IAClB,yBAAyB,EAAE,uBAAuB;IAClD,iBAAiB,EAAE,aAAa;IAChC,wBAAwB,EAAE,SAAS;CACtC,CAAC,CAAC;AACH,MAAM,cAAc,GAAG,8QAA8Q,CAAC;AACtS,MAAM,gBAAgB,GAAG,ubAAub,CAAC;AACjd,MAAM,oBAAoB,GAAG,eAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,eAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1E,8FAA8F;AAC9F,SAAgB,cAAc,CAAC,KAM9B;IACG,OAAO,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,cAAc,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACpK,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,SAAS,CAAC,SAAS,GAAG,aAAa,IAAI,EAAE,CAAC;QAC1C,SAAS,CAAC,MAAM,GAAG,UAAU,SAAS,CAAC,SAAS,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,MAAM,CAAC;YACjB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC;YACnF,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC;SACnC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,YAAY,CAAC,MAAc,EAAE,UAAkB,EAAE,MAAyB;IAC/E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM;QACtB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1C,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC;IACtB,OAAO,GAAG,CAAC,IAAI,CAAC;AACpB,CAAC;AACD,SAAS,aAAa,CAAC,OAAuB,EAAE,cAAuB,EAAE,aAA6B;IAClG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,SAAS,GAAoB;QAC/B,MAAM,EAAE,SAA8B;QACtC,OAAO;QACP,UAAU,EAAE,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QACjD,aAAa,EAAE,GAAG,qBAAqB,GAAG,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC3E,OAAO,EAAE,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC9C,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE;QAC3G,cAAc;QACd,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;QACzD,kBAAkB,EAAE,KAAK;QACzB,MAAM,EAAE,KAAK;QACb,cAAc,EAAE,CAAC;QACjB,OAAO,EAAE,IAAI,GAAG,EAAE;KACrB,CAAC;IACF,SAAS,CAAC,MAAM,GAAG,IAAA,wBAAY,EAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAClD,SAAS,CAAC,cAAc,IAAI,CAAC,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,SAAS,CAAC,cAAc,IAAI,CAAC,CAAC;YAC9B,IAAI,SAAS,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;gBACjC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,OAAO;oBACnC,OAAO,EAAE,CAAC;gBACd,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC9B,CAAC;QACL,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;QACzC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,SAAS,YAAY,CAAC,SAA0B,EAAE,OAAwB,EAAE,QAAwB;IAChG,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1F,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;QAC7C,OAAO;IACX,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;QAC/C,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,6BAA6B,CAAC,CAAC;QACvD,OAAO;IACX,CAAC;IACD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;QACvC,OAAO;IACX,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;QACxC,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjD,OAAO;IACX,CAAC;IACD,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;YAClF,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QACrG,CAAC;aACI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,yBAAyB,EAAE,CAAC;YAC7G,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,gCAAgC,EAAE;gBACrG,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;aAChE,CAAC,CAAC;QACP,CAAC;aACI,CAAC;YACF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;QACxD,CAAC;QACD,OAAO;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QAClC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,+BAA+B,CAAC,CAAC;QACzD,OAAO;IACX,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YACxB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7C,KAAK,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO;IACX,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,+BAA+B,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YACzB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,KAAK,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO;IACX,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,8BAA8B,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YACzB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC7B,OAAO;QACX,KAAK,WAAW,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO;IACX,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB,EAAE,CAAC;QAC3C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YACzB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC7B,OAAO;QACX,KAAK,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnD,OAAO;IACX,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACxD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACtE,OAAO;IACX,CAAC;IACD,KAAK,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC/F,IAAI,CAAC,QAAQ,CAAC,WAAW;YACrB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;;YAEtF,QAAQ,CAAC,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACP,CAAC;AACD,KAAK,UAAU,eAAe,CAAC,SAA0B,EAAE,QAAwB,EAAE,OAAgB;IACjG,IAAI,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACtD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QAC/D,CAAC;aACI,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,CAAC;YACjE,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACpB,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;gBACjD,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,QAAQ,KAAK,SAAS;oBACnD,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;oBACzC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC;aACnE,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IACD,MAAM,CAAC;QACH,IAAI,OAAO;YACP,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACjC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;YAClC,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,6CAA6C,EAAE,UAAU,EAAE,OAAO;SAC7E,CAAC,CAAC,CAAC;IACxC,CAAC;AACL,CAAC;AACD,SAAS,iBAAiB,CAAC,SAA0B;IACjD,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS;QACjC,OAAO,SAAS,CAAC,SAAS,CAAC;IAC/B,MAAM,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,cAAc;QACjD,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;QAC1B,IAAI,SAAS,CAAC,MAAM;YAChB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACxC,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;YACvC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1D,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACvD,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC;QACvC,OAAO,UAAU,CAAC;IACtB,CAAC,CAAC,EAAE,CAAC;IACL,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;IAChC,KAAK,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1F,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,SAAS,UAAU,CAAC,SAA0B,EAAE,UAA0B;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC;QACjB,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,oBAAoB,EAAE,UAAU,CAAC,oBAAoB;QACrD,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;QAClC,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;QACxF,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;QAC/F,gBAAgB,EAAE,SAAS,CAAC,cAAc;QAC1C,KAAK,EAAE,UAAU,CAAC,YAAY,KAAK,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;KAChJ,CAAC,CAAC;AACP,CAAC;AACD,KAAK,UAAU,WAAW,CAAC,SAA0B,EAAE,OAAwB,EAAE,QAAwB;IACrG,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,EAAE;QACR,OAAO,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAA,gDAA6B,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,eAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QACzB,OAAO,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;IAC5C,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QACrF,OAAO,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,eAAe,CAAC,uBAAuB,EAAE,iDAAiD,CAAC,CAAC,CAAC;IAChI,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;IACxC,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACtC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9B,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5G,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC9D,CAAC;AACD,KAAK,UAAU,eAAe,CAAC,SAA0B,EAAE,OAAwB,EAAE,QAAwB;IACzG,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,EAAE;QACR,OAAO,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAA,8CAA2B,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,eAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QACzB,OAAO,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3E,IAAI,UAAU,KAAK,SAAS;QACxB,OAAO,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,eAAe,CAAC,2BAA2B,EAAE,4CAA4C,CAAC,CAAC,CAAC;IAC/H,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACpC,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAA,0CAAqB,EAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,CAAC;QACH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;YAClC,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,wDAAwD,EAAE,UAAU,EAAE,OAAO;SACxF,CAAC,CAAC,CAAC;IACxC,CAAC;YACO,CAAC;QACL,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;AACL,CAAC;AACD,KAAK,UAAU,UAAU,CAAC,UAA0B,EAAE,QAAgB,EAAE,OAAwB,EAAE,QAAwB;IACtH,MAAM,IAAI,GAAG,UAAU,CAAC;IACxB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC1C,OAAO;IACX,CAAC;IACD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE;QACpB,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,GAAG,cAAc;KACpB,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,QAAQ,CAAC,GAAG,EAAE,CAAC;QACf,OAAO;IACX,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,0BAAgB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AACD,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,QAAgB,EAAE,MAA0B;IAIlF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,SAAS;QACtB,OAAO,SAAS,CAAC;IACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,SAAS;QACnB,OAAO,KAAK,CAAC;IACjB,IAAI,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAA,mBAAO,EAAC,KAAK,CAAC,KAAK,EAAE;QAC9F,OAAO,SAAS,CAAC;IACrB,OAAO,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AACD,SAAS,gBAAgB,CAAC,QAAgB;IACtC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACD,OAAO,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,CAAC;QACH,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAChF,OAAO,SAAS,CAAC;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC;QAC1E,OAAO,SAAS,CAAC;IACrB,OAAO,QAAQ,CAAC;AACpB,CAAC;AACD,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,QAAgB;IAIzD,MAAM,IAAI,GAAG,IAAA,mBAAO,EAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAA,mBAAO,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,eAAG,EAAE,CAAC;QACjC,OAAO,SAAS,CAAC;IACrB,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAA,gBAAK,EAAC,IAAI,CAAC,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;YAClD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC9C,CAAC,CAAC,SAAS,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,EAAE,CAAC;QACX,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,QAAQ;YACtF,OAAO,SAAS,CAAC;QACrB,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AACD,SAAS,kBAAkB,CAAC,SAA0B,EAAE,OAAwB,EAAE,QAAwB;IACtG,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,OAAO;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,+BAA+B,CAAC,CAAC;QACzD,OAAO;IACX,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACjC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;QAC1B,IAAI,KAAK,GAAG,IAAI;YACZ,OAAO,CAAC,OAAO,EAAE,CAAC;;YAElB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;QACrB,IAAI,KAAK,GAAG,IAAI;YACZ,OAAO;QACX,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAC;QAC1E,CAAC;QACD,MAAM,CAAC;YACH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,+BAA+B,CAAC,CAAC;YACzD,OAAO;QACX,CAAC;QACD,MAAM,OAAO,GAAG,eAAM,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACvG,IAAI,eAAM,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,+BAA+B,CAAC,CAAC;YACzD,OAAO;QACX,CAAC;QACD,IAAI,SAAS,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/F,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,uCAAuC,CAAC,CAAC;YACjE,OAAO;QACX,CAAC;QACD,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,2BAA2B,EAAE;YACjD,YAAY,EAAE,GAAG,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,OAAO,qCAAqC;SACrG,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;QACvB,IAAI,CAAC,QAAQ,CAAC,WAAW;YACrB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,2BAA2B,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,iBAAiB,CAAC,SAA0B,EAAE,OAAwB;IAC3E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IAC7E,OAAO,OAAO,KAAK,SAAS,IAAI,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;AAC1E,CAAC;AACD,SAAS,UAAU,CAAC,SAA0B,EAAE,OAAwB,EAAE,QAAQ,GAAG,KAAK;IACtF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS;QACpB,OAAO,MAAM,KAAK,SAAS,CAAC,MAAM,CAAC;IACvC,IAAI,QAAQ;QACR,OAAO,KAAK,CAAC;IACjB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpD,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,aAAa,IAAI,SAAS,KAAK,MAAM,CAAC;AAC1F,CAAC;AACD,SAAS,UAAU,CAAC,OAAwB;IACxC,IAAI,CAAC;QACD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,CAAC;QACH,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC;AACD,SAAS,WAAW,CAAC,MAA0B,EAAE,IAAY;IACzD,IAAI,MAAM,KAAK,SAAS;QACpB,OAAO,SAAS,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,SAAS,KAAK,IAAI;YAClB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,SAAS,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU,IAAI,IAAA,6BAAe,EAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACpG,CAAC;AACD,SAAS,MAAM,CAAC,MAAc,EAAE,IAAY;IACxC,OAAO,eAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9B,MAAM,OAAO,GAAG,GAAS,EAAE;YACvB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzC,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE;YACnC,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,GAAS,EAAE;YAC3B,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAClD,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,kCAAkC,CAAC,CAAC;gBACtE,CAAC,CAAC,eAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACjC,OAAO,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,cAAc,CAAC,SAA0B;IAC9C,OAAO,eAAM,CAAC,OAAO,CAAC,GAAG,EAAE;QACvB,IAAI,SAAS,CAAC,MAAM;YAChB,OAAO,eAAM,CAAC,IAAI,CAAC;QACvB,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;QACxB,OAAO,eAAM,CAAC,QAAQ,CAAO,CAAC,MAAM,EAAE,EAAE;YACpC,qEAAqE;YACrE,uEAAuE;YACvE,qEAAqE;YACrE,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,MAAM,MAAM,GAAG,GAAS,EAAE;gBACtB,IAAI,SAAS;oBACT,OAAO;gBACX,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM,WAAW,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC3E,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAC1C,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBACpC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;gBACjF,CAAC;gBACD,KAAK,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;oBACvC,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO;wBAClC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACrB,MAAM,CAAC,eAAM,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;YACF,IAAI,CAAC;gBACD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBACxB,IAAI,SAAS,CAAC,cAAc,KAAK,CAAC;wBAC9B,MAAM,EAAE,CAAC;;wBAET,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC;YACP,CAAC;YACD,MAAM,CAAC;gBACH,MAAM,EAAE,CAAC;YACb,CAAC;YACD,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YACxC,mEAAmE;YACnE,qEAAqE;YACrE,4DAA4D;YAC5D,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACvC,OAAO,eAAM,CAAC,IAAI,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,cAAc,CAAC,SAA0B,EAAE,EAAU;IAC1D,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,KAAK,EAAE;QAC3C,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;IACnC,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,KAAK,EAAE;QAC9C,OAAO,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;IACrC,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,SAAS,YAAY,CAAC,SAA0B,EAAE,UAA0B;IACxE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxH,CAAC;AACD,SAAS,YAAY,CAAC,SAA0B,EAAE,UAA0B;IACxE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC/D,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC;AACD,SAAS,eAAe,CAAC,SAA0B,EAAE,UAA0B;IAC3E,IAAI,UAAU,CAAC,YAAY,KAAK,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY;QAChE,UAAU,CAAC,YAAY,KAAK,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY;QACnE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACvD,KAAK,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;AACL,CAAC;AACD,SAAS,eAAe,CAAC,SAA0B,EAAE,UAA0B;IAC3E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACvD,KAAK,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;AACL,CAAC;AACD,SAAS,gBAAgB,CAAC,SAA0B,EAAE,UAA0B;IAC5E,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC;QACpD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AACtD,CAAC;AACD,SAAS,SAAS,CAAC,OAAwB,EAAE,QAAwB;IACjE,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,kBAAkB;QACtD,OAAO,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,cAAc,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC1F,OAAO,KAAK,CAAC;AACjB,CAAC;AASD,SAAS,YAAY,CAAC,OAAwB;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,KAAe,EAAQ,EAAE;YACrC,IAAI,OAAO;gBACP,OAAO;YACX,OAAO,GAAG,IAAI,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACjC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;YACzB,IAAI,IAAI,GAAG,uCAAoB;gBAC3B,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;;gBAEvF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;YACrB,IAAI,OAAO;gBACP,OAAO;YACX,IAAI,CAAC;gBACD,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,EAAE,CAAC,CAAC;YAC/F,CAAC;YACD,MAAM,CAAC;gBACH,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;YAC1F,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9H,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,cAAc,CAAC,MAAc;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;AACtH,CAAC;AACD,SAAS,eAAe,CAAC,IAA2D,EAAE,MAAc;IAChG,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAC7E,CAAC;AACD,SAAS,cAAc,CAAC,MAAc;IAClC,OAAO,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/E,CAAC;AACD,SAAS,gBAAgB,CAAC,QAAwB,EAAE,KAAa;IAC7D,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AACD,SAAS,QAAQ,CAAC,QAAwB,EAAE,MAAc,EAAE,KAAc;IACtE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACtE,CAAC;AACD,SAAS,QAAQ,CAAC,QAAwB,EAAE,MAAc,EAAE,IAAY,EAAE,UAA4C,EAAE;IACpH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC;AACD,SAAS,IAAI,CAAC,QAAwB,EAAE,MAAc,EAAE,IAAyB,EAAE,WAAmB,EAAE,UAA4C,EAAE;IAClJ,IAAI,QAAQ,CAAC,SAAS;QAClB,OAAO;IACX,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE;QACvB,cAAc,EAAE,WAAW;QAC3B,gBAAgB,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAC9F,GAAG,cAAc;QACjB,GAAG,OAAO;KACb,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AACD,SAAS,SAAS,CAAC,IAAY;IAC3B,QAAQ,IAAA,mBAAO,EAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAClC,KAAK,OAAO,CAAC,CAAC,OAAO,0BAA0B,CAAC;QAChD,KAAK,MAAM,CAAC,CAAC,OAAO,yBAAyB,CAAC;QAC9C,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC,CAAC,OAAO,gCAAgC,CAAC;QACrD,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC;QACxC,KAAK,OAAO,CAAC,CAAC,OAAO,iCAAiC,CAAC;QACvD,KAAK,MAAM,CAAC,CAAC,OAAO,eAAe,CAAC;QACpC,KAAK,MAAM,CAAC,CAAC,OAAO,WAAW,CAAC;QAChC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC,CAAC,OAAO,YAAY,CAAC;QAClC,KAAK,OAAO,CAAC,CAAC,OAAO,YAAY,CAAC;QAClC,KAAK,MAAM,CAAC,CAAC,OAAO,cAAc,CAAC;QACnC,KAAK,QAAQ,CAAC,CAAC,OAAO,YAAY,CAAC;QACnC,OAAO,CAAC,CAAC,OAAO,0BAA0B,CAAC;IAC/C,CAAC;AACL,CAAC;AACD,SAAS,SAAS,CAAC,SAAuC,EAAE,MAAc;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,oBAA6B,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AACrF,CAAC","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"]}
|
package/dist/view/server.d.cts
CHANGED
|
@@ -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: () =>
|
|
16
|
-
readonly build: () =>
|
|
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;
|
package/dist/view/server.d.mts
CHANGED
|
@@ -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: () =>
|
|
16
|
-
readonly build: () =>
|
|
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;
|
package/dist/view/server.d.ts
CHANGED
|
@@ -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: () =>
|
|
16
|
-
readonly build: () =>
|
|
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 |
|
|
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,64 @@ 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
|
+
t.check(t.usage.cacheRead.rate("planner"), atLeast(0.6)).gate();
|
|
119
|
+
// 不区分用途时,检查所有已登记调用的合计。
|
|
120
|
+
t.check(t.usage.cacheRead.rate(), atLeast(0.6)).gate();
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
读取率是同组调用的 **缓存读取 token 总量 / 含缓存输入 token 总量**,包括失败调用与重试。它不是逐次百分比的平均值。每次调用优先使用 `inputTotalTokens`;没有独立总量时,必须同时提供 `inputTokens`、`cacheReadTokens`、`cacheWriteTokens` 三个互斥桶。
|
|
124
|
+
|
|
125
|
+
`cacheRead.total` 给出整个 Attempt 的结果,`modelSlots` 按用途分组,`models` 进一步按真实 `provider` 和 `model` 分组。未知身份保持 `null`,不会用配置值补齐。`coveredCalls / recordedCalls` 表示已登记调用的输入覆盖率;`collectionComplete` 单独表示采集是否完整。
|
|
126
|
+
|
|
127
|
+
缺失输入、未 seal、partial seal、unknown 调用状态、空组或零分母均返回 `unavailable`,`reasons` 列出原因。缺失不按零处理;完整且有正输入总量的零缓存读取率才是数值 0。旧账本没有明确的生产者完整性声明时,也返回不可判定。
|
|
128
|
+
|
|
129
|
+
使用 `niceeval show <Attempt locator> --usage` 或 View 查看读取率、覆盖情况与原因;脚本通过 `attempt.usage` 的 `usage.cacheRead` 读取相同报告。已有 `recordUsage` 调用无需改名,但必须登记缓存 token,并在采集完成后诚实 seal。无需迁移历史结果文件。
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
槽位名来自 Experiment 的 `models` 键,不是框架内置名单。`model` 单模型简写对应 `default`。
|
|
133
|
+
传入未声明的槽位会在调用处报错,并列出可用名称。已声明但完整记录中没有调用的槽位返回 `slot-has-no-calls`;采集不完整时仍返回 `collection-incomplete`。
|
|
134
|
+
Eval 可以被多个 Experiment 复用,因此此入口在运行回调里校验槽位,不在定义期检查动态字符串。
|
|
135
|
+
|
|
136
|
+
### 登记命令行 Agent 的用量
|
|
137
|
+
|
|
138
|
+
Adapter 应按外部回执记录真实调用,并将 `modelSlot` 设为 Experiment 声明的用途,例如 `mind`。
|
|
139
|
+
同一请求的流式增量和最终回执不能各登记一次;先按请求 ID 合并,收到最终回执后再登记。
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
// 单次 Claude 请求的最终 usage;字段缺失时保留 null。
|
|
143
|
+
ctx.recordUsage({
|
|
144
|
+
callId: requestId,
|
|
145
|
+
modelSlot: "mind",
|
|
146
|
+
provider: observedProvider,
|
|
147
|
+
model: observedModel,
|
|
148
|
+
status: observedStatus,
|
|
149
|
+
inputTokens: usage.input_tokens ?? null,
|
|
150
|
+
cacheReadTokens: usage.cache_read_input_tokens ?? null,
|
|
151
|
+
cacheWriteTokens: usage.cache_creation_input_tokens ?? null,
|
|
152
|
+
outputTokens: usage.output_tokens ?? null,
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Claude 的 `input_tokens` 是未命中缓存的输入桶,含缓存总量需加上读取和写入桶,见 [Claude 缓存用量说明](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)。
|
|
157
|
+
Codex 的 usage 若提供含缓存的 `input_tokens`,应映射到 `inputTotalTokens`,`cached_input_tokens` 映射到 `cacheReadTokens`,不要再把缓存加进总量。
|
|
158
|
+
不能仅因命令成功退出就认定全部模型调用都已被记录;需核对所用 CLI 版本输出的是逐请求、Turn 还是会话合计。
|
|
159
|
+
|
|
160
|
+
只有会话总量时,不要把多次物理调用伪装成一次调用,也不要把合计与明细同时登记。
|
|
161
|
+
当前 `recordUsage` 的单位是物理调用;将会话合计保存在统计附件中,并声明 `partial`,缓存判据会诚实地显示不可判定。
|
|
162
|
+
完全没有 usage 时同样声明 `partial`,不要填零或声明完整空账本:
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
ctx.sealUsage({ state: "partial", reason: "usage-not-exposed" });
|
|
166
|
+
// 只提供会话总量、不能证明逐调用完整性时:
|
|
167
|
+
// ctx.sealUsage({ state: "partial", reason: "session-totals-only" });
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
确实拿到全部物理调用的最终记录后,再调用 `ctx.sealUsage({ state: "complete" })`。
|
|
@@ -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` 是核验过的非负业务时间。
|