iterate 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -82
- package/dist/{next/api.d.ts → api.d.ts} +197 -33
- package/dist/{next/app-server.d.ts → app-server.d.ts} +7 -0
- package/dist/{next/app-server.mjs → app-server.mjs} +17 -15
- package/dist/app-server.mjs.map +1 -0
- package/dist/{next/app-session.mjs → app-session.mjs} +12 -15
- package/dist/app-session.mjs.map +1 -0
- package/dist/{next/app.mjs → app.mjs} +53 -14
- package/dist/app.mjs.map +1 -0
- package/dist/{next/client → client}/live-state.d.ts +11 -11
- package/dist/client/oauth.d.ts +17 -0
- package/dist/{next/client → client}/react.d.ts +10 -42
- package/dist/{next/client → client}/socket.d.ts +1 -0
- package/dist/client.mjs +156 -4
- package/dist/client.mjs.map +1 -0
- package/dist/{next/expression.d.ts → expression.d.ts} +11 -69
- package/dist/{next/expression.mjs → expression.mjs} +11 -109
- package/dist/expression.mjs.map +1 -0
- package/dist/lib-BWr-5mFO.mjs +36 -0
- package/dist/lib-BWr-5mFO.mjs.map +1 -0
- package/dist/{next/lib.d.ts → lib.d.ts} +16 -2
- package/dist/{next/lib.mjs → lib.mjs} +32 -3
- package/dist/lib.mjs.map +1 -0
- package/dist/node.d.ts +15 -3
- package/dist/node.mjs +36 -174
- package/dist/node.mjs.map +1 -1
- package/dist/{next/oauth-scopes.mjs → oauth-scopes.mjs} +1 -1
- package/dist/oauth-scopes.mjs.map +1 -0
- package/dist/{next/oauth.mjs → oauth.mjs} +14 -2
- package/dist/oauth.mjs.map +1 -0
- package/dist/principal.d.ts +8 -0
- package/dist/principal.mjs +8 -0
- package/dist/principal.mjs.map +1 -0
- package/dist/project-ingress.d.ts +58 -0
- package/dist/project-ingress.mjs +104 -0
- package/dist/project-ingress.mjs.map +1 -0
- package/dist/{next/react.mjs → react.mjs} +12 -12
- package/dist/react.mjs.map +1 -0
- package/dist/sdk/auth.d.ts +25 -0
- package/dist/sdk/index.d.ts +155 -0
- package/dist/sdk/record-pipelined-steps.d.ts +19 -0
- package/dist/sdk.mjs +245 -2
- package/dist/sdk.mjs.map +1 -0
- package/dist/{next/stream → stream}/processor.d.ts +28 -23
- package/dist/{next/stream → stream}/processor.mjs +48 -25
- package/dist/stream/processor.mjs.map +1 -0
- package/dist/{next/stream → stream}/run.d.ts +9 -6
- package/dist/{next/stream → stream}/run.mjs +13 -8
- package/dist/stream/run.mjs.map +1 -0
- package/dist/stream/test-support.d.ts +45 -0
- package/dist/stream/test-support.mjs +196 -0
- package/dist/stream/test-support.mjs.map +1 -0
- package/package.json +65 -219
- package/THIRD_PARTY_NOTICES.md +0 -55
- package/bin/iterate.js +0 -94
- package/dist/api-url-B6404M82.mjs +0 -17
- package/dist/api-url-B6404M82.mjs.map +0 -1
- package/dist/app-ref-BipL0feU.mjs +0 -35
- package/dist/app-ref-BipL0feU.mjs.map +0 -1
- package/dist/app-ref-C1CrgXqX.mjs +0 -7
- package/dist/app-ref-C1CrgXqX.mjs.map +0 -1
- package/dist/app-ref-DYai_om1.mjs +0 -7
- package/dist/app-ref-DYai_om1.mjs.map +0 -1
- package/dist/cli-D0c-pDL_.mjs +0 -1010
- package/dist/cli-D0c-pDL_.mjs.map +0 -1
- package/dist/client.d.ts +0 -3
- package/dist/cloudflare-BTm90gQ4.mjs +0 -951
- package/dist/cloudflare-BTm90gQ4.mjs.map +0 -1
- package/dist/contract-s4FW4eES.mjs +0 -309
- package/dist/contract-s4FW4eES.mjs.map +0 -1
- package/dist/document-review/index.d.ts +0 -5
- package/dist/document-review/types.d.ts +0 -107
- package/dist/document-review.mjs +0 -7015
- package/dist/document-review.mjs.map +0 -1
- package/dist/durable-object-processor-durability-CNsTjAJS.mjs +0 -205
- package/dist/durable-object-processor-durability-CNsTjAJS.mjs.map +0 -1
- package/dist/idempotency-DleloJNt.mjs +0 -28
- package/dist/idempotency-DleloJNt.mjs.map +0 -1
- package/dist/index.d.mts +0 -5
- package/dist/index.mjs +0 -8
- package/dist/index.mjs.map +0 -1
- package/dist/itx/api-url.d.ts +0 -6
- package/dist/itx/itx-node-client.d.ts +0 -65
- package/dist/itx/itx-session.d.ts +0 -215
- package/dist/itx/owned-rpc-session.d.ts +0 -14
- package/dist/itx/query-client.d.ts +0 -10
- package/dist/itx-api.generated.d.ts +0 -6195
- package/dist/itx-session-sjud8GiT.mjs +0 -534
- package/dist/itx-session-sjud8GiT.mjs.map +0 -1
- package/dist/live-state-BJNqOwFw.mjs +0 -299
- package/dist/live-state-BJNqOwFw.mjs.map +0 -1
- package/dist/next/app-server.mjs.map +0 -1
- package/dist/next/app-session.mjs.map +0 -1
- package/dist/next/app.mjs.map +0 -1
- package/dist/next/client/oauth.d.ts +0 -12
- package/dist/next/client.mjs +0 -156
- package/dist/next/client.mjs.map +0 -1
- package/dist/next/expression.mjs.map +0 -1
- package/dist/next/lib.mjs.map +0 -1
- package/dist/next/oauth-scopes.mjs.map +0 -1
- package/dist/next/oauth.mjs.map +0 -1
- package/dist/next/principal.d.ts +0 -64
- package/dist/next/principal.mjs +0 -98
- package/dist/next/principal.mjs.map +0 -1
- package/dist/next/project-ingress.d.ts +0 -37
- package/dist/next/project-ingress.mjs +0 -75
- package/dist/next/project-ingress.mjs.map +0 -1
- package/dist/next/react.mjs.map +0 -1
- package/dist/next/sdk/auth.d.ts +0 -5
- package/dist/next/sdk/index.d.ts +0 -112
- package/dist/next/sdk.mjs +0 -139
- package/dist/next/sdk.mjs.map +0 -1
- package/dist/next/stream/processor.mjs.map +0 -1
- package/dist/next/stream/run.mjs.map +0 -1
- package/dist/next-node.d.ts +0 -15
- package/dist/next-node.mjs +0 -51
- package/dist/next-node.mjs.map +0 -1
- package/dist/processor-host-capabilities-BMFH3KTM.mjs +0 -56
- package/dist/processor-host-capabilities-BMFH3KTM.mjs.map +0 -1
- package/dist/processors/cloudflare.d.ts +0 -3
- package/dist/processors/durable-object-processor-durability.d.ts +0 -79
- package/dist/processors/event-consumption-metrics.d.ts +0 -82
- package/dist/processors/idempotency.d.ts +0 -13
- package/dist/processors/index.d.ts +0 -12
- package/dist/processors/processor-contracts.d.ts +0 -342
- package/dist/processors/processor-facet.d.ts +0 -186
- package/dist/processors/processor-host-capabilities.d.ts +0 -60
- package/dist/processors/prompt-sections.d.ts +0 -17
- package/dist/processors/rpc-types.d.ts +0 -515
- package/dist/processors/schemas.d.ts +0 -102
- package/dist/processors/stream-handle.d.ts +0 -45
- package/dist/processors/stream-processor-keepalive.d.ts +0 -95
- package/dist/processors/stream-processor-registry.d.ts +0 -233
- package/dist/processors/stream-processor-runner.d.ts +0 -289
- package/dist/processors/stream-processor.d.ts +0 -339
- package/dist/processors/stream-runtime-metrics.d.ts +0 -107
- package/dist/processors/testing.d.ts +0 -302
- package/dist/processors-BoNyeBfQ.mjs +0 -10
- package/dist/processors-BoNyeBfQ.mjs.map +0 -1
- package/dist/processors-cloudflare.mjs +0 -3
- package/dist/processors-testing.mjs +0 -435
- package/dist/processors-testing.mjs.map +0 -1
- package/dist/processors.mjs +0 -52
- package/dist/processors.mjs.map +0 -1
- package/dist/protocol-DnK_f2m6.mjs +0 -251
- package/dist/protocol-DnK_f2m6.mjs.map +0 -1
- package/dist/sdk/capnweb/index.d.ts +0 -2
- package/dist/sdk/capnweb/live-state/compact.d.ts +0 -5
- package/dist/sdk/capnweb/live-state/diff.d.ts +0 -41
- package/dist/sdk/capnweb/live-state/engine.d.ts +0 -44
- package/dist/sdk/capnweb/live-state/index.d.ts +0 -41
- package/dist/sdk/capnweb/live-state/protocol.d.ts +0 -87
- package/dist/sdk/capnweb/live-state/retain.d.ts +0 -23
- package/dist/sdk/capnweb/live-state/store.d.ts +0 -20
- package/dist/sdk/capnweb/live-state/types.d.ts +0 -11
- package/dist/sdk/capnweb/react.d.ts +0 -45
- package/dist/sdk/capnweb/react.mjs +0 -316
- package/dist/sdk/capnweb/react.mjs.map +0 -1
- package/dist/sdk/capnweb.mjs +0 -4
- package/dist/sdk/itx/react.d.ts +0 -191
- package/dist/sdk/itx/react.mjs +0 -383
- package/dist/sdk/itx/react.mjs.map +0 -1
- package/dist/sdk-DMB-IM11.mjs +0 -933
- package/dist/sdk-DMB-IM11.mjs.map +0 -1
- package/dist/sdk.d.ts +0 -339
- package/dist/serve-itx.d.ts +0 -46
- package/dist/starter-apps/flake-dashboard/app-ref.d.ts +0 -31
- package/dist/starter-apps/flake-dashboard/configured-worker.mjs +0 -1055
- package/dist/starter-apps/flake-dashboard/configured-worker.mjs.map +0 -1
- package/dist/starter-apps/flake-dashboard/contract.d.ts +0 -4839
- package/dist/starter-apps/flake-dashboard/contract.mjs +0 -2
- package/dist/starter-apps/flake-dashboard/index.d.ts +0 -17
- package/dist/starter-apps/flake-dashboard/index.mjs +0 -56
- package/dist/starter-apps/flake-dashboard/index.mjs.map +0 -1
- package/dist/starter-apps/flake-dashboard/worker.d.ts +0 -4607
- package/dist/starter-apps/github-ai-linter/ai-linter.d.ts +0 -8914
- package/dist/starter-apps/github-ai-linter/configured-worker.mjs +0 -17987
- package/dist/starter-apps/github-ai-linter/configured-worker.mjs.map +0 -1
- package/dist/starter-apps/github-ai-linter/contract.d.ts +0 -9193
- package/dist/starter-apps/github-ai-linter/index.d.ts +0 -10
- package/dist/starter-apps/github-ai-linter/index.mjs +0 -36
- package/dist/starter-apps/github-ai-linter/index.mjs.map +0 -1
- package/dist/starter-apps/github-ai-linter/prompt.d.ts +0 -13
- package/dist/starter-apps/github-ai-linter/review-bot.d.ts +0 -808
- package/dist/starter-apps/github-ai-linter/rules.d.ts +0 -34
- package/dist/starter-apps/github-ai-linter/worker-ref.d.ts +0 -19
- package/dist/starter-apps/github-ai-linter/worker.d.ts +0 -19
- package/dist/starter-apps/github-ai-linter/worker.mjs +0 -947
- package/dist/starter-apps/github-ai-linter/worker.mjs.map +0 -1
- package/dist/starter-apps/guestbook/app-ref.d.ts +0 -27
- package/dist/starter-apps/guestbook/client.d.ts +0 -7
- package/dist/starter-apps/guestbook/client.mjs +0 -59
- package/dist/starter-apps/guestbook/configured-worker.mjs +0 -205
- package/dist/starter-apps/guestbook/configured-worker.mjs.map +0 -1
- package/dist/starter-apps/guestbook/index.d.ts +0 -9
- package/dist/starter-apps/guestbook/index.mjs +0 -31
- package/dist/starter-apps/guestbook/index.mjs.map +0 -1
- package/dist/starter-apps/guestbook/processor.d.ts +0 -2267
- package/dist/starter-apps/guestbook/worker.d.ts +0 -26
- package/dist/starter-apps/guestbook/worker.mjs +0 -191
- package/dist/starter-apps/guestbook/worker.mjs.map +0 -1
- package/dist/starter-apps/media/configured-worker.mjs +0 -577
- package/dist/starter-apps/media/configured-worker.mjs.map +0 -1
- package/dist/starter-apps/media/index.mjs +0 -36
- package/dist/starter-apps/media/index.mjs.map +0 -1
- package/dist/starter-apps/media/ref.mjs +0 -20
- package/dist/starter-apps/media/ref.mjs.map +0 -1
- package/dist/starter-apps/media/worker.mjs +0 -579
- package/dist/starter-apps/media/worker.mjs.map +0 -1
- package/dist/starter-apps/notes/configured-worker.mjs +0 -6134
- package/dist/starter-apps/notes/configured-worker.mjs.map +0 -1
- package/dist/starter-apps/notes/index.mjs +0 -23
- package/dist/starter-apps/notes/index.mjs.map +0 -1
- package/dist/starter-apps/notes/ref.mjs +0 -21
- package/dist/starter-apps/notes/ref.mjs.map +0 -1
- package/dist/starter-apps/notes/worker.mjs +0 -427
- package/dist/starter-apps/notes/worker.mjs.map +0 -1
- package/dist/starter-apps/todo/client.mjs +0 -59
- package/dist/starter-apps/todo/configured-worker.mjs +0 -2864
- package/dist/starter-apps/todo/configured-worker.mjs.map +0 -1
- package/dist/starter-apps/todo/index.d.ts +0 -8
- package/dist/starter-apps/todo/index.mjs +0 -29
- package/dist/starter-apps/todo/index.mjs.map +0 -1
- package/dist/stream-processor-keepalive-DAQTP6m3.mjs +0 -2082
- package/dist/stream-processor-keepalive-DAQTP6m3.mjs.map +0 -1
- package/dist/usingCtx-mZx5nsAW.mjs +0 -11800
- package/dist/usingCtx-mZx5nsAW.mjs.map +0 -1
- package/dist/worker-ref-DZxPDmb_.mjs +0 -390
- package/dist/worker-ref-DZxPDmb_.mjs.map +0 -1
- package/dist/worker.d.mts +0 -33
- package/dist/worker.mjs +0 -18
- package/dist/worker.mjs.map +0 -1
- package/menubar/Iterate.entitlements +0 -12
- package/menubar/Iterate.swift +0 -914
- package/menubar/IterateIcon.swift +0 -145
- package/menubar/README.md +0 -28
- package/menubar/build-menubar-app.sh +0 -59
- /package/dist/{next/api.mjs → api.mjs} +0 -0
- /package/dist/{next/app-session.d.ts → app-session.d.ts} +0 -0
- /package/dist/{next/app.d.ts → app.d.ts} +0 -0
- /package/dist/{next/oauth-scopes.d.ts → oauth-scopes.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configured-worker.mjs","names":["core._isoDateTime","z\n .object","z.string","z.enum","z.iso.datetime","z.number","z\n .array","z.object","z.array","z.url","z.number","z.enum","z.object","z.string","z.array","z.discriminatedUnion","z.literal","z.record","z\n .array","z\n .record","z\n .array","z\n .object","z.iso.datetime","z\n .object","#ingestCheckRunFlakeArtifacts","#appendTolerantOfSettledRace","#liveRender"],"sources":["../../../../../node_modules/.pnpm/zod@4.5.4_patch_hash=bf04bb1ec1f0b9f31a7416bf98f83d3451e5011852877ca0ac19c12fcb3129b5/node_modules/zod/v4/classic/iso.js","../../../src/starter-apps/flake-dashboard/app-ref.ts","../../../../shared/src/test-support/flake-suite-summary.ts","../../../src/starter-apps/flake-dashboard/contract.ts","../../../src/starter-apps/flake-dashboard/worker.ts"],"sourcesContent":["import * as core from \"../core/index.js\";\nimport { ZodISODate, ZodISODateTime, ZodISODuration, ZodISOTime } from \"./schemas.js\";\nexport { ZodISODate, ZodISODateTime, ZodISODuration, ZodISOTime } from \"./schemas.js\";\nexport function datetime(params) {\n return core._isoDateTime(ZodISODateTime, params);\n}\nexport function date(params) {\n return core._isoDate(ZodISODate, params);\n}\nexport function time(params) {\n return core._isoTime(ZodISOTime, params);\n}\nexport function duration(params) {\n return core._isoDuration(ZodISODuration, params);\n}\n","// The flake dashboard's physical identity and creation facts.\nimport type { StreamEventInput } from \"../../processors/index.ts\";\nimport type { StatefulDynamicWorkerRef } from \"../../sdk.ts\";\n\nexport const flakesStreamPath = \"/flakes\";\n\nexport const flakeDashboardWorkerRef = {\n className: \"FlakeDashboardApp\",\n durableWorkerKey: \"app-flake-dashboard\",\n path: \"/\",\n source: {\n createWorker: {\n entryPoint: \"node_modules/iterate/dist/starter-apps/flake-dashboard/configured-worker.mjs\",\n files: {\n include: [\"package.json\"],\n repoPath: \"/repos/config\",\n type: \"repo\",\n },\n },\n },\n type: \"stateful\",\n} satisfies StatefulDynamicWorkerRef;\n\n/**\n * The dashboard's birth certificate. Idempotency-keyed so every caller — the\n * worker's lazy initialization AND the CI reporter script, whichever appends\n * first — may offer it; the config values are immutable birth facts.\n */\nexport function flakeDashboardCreationEvents(config: {\n repository: { owner: string; repo: string };\n issueTitle: string;\n defaultBranch: string;\n}): StreamEventInput[] {\n return [\n {\n type: \"events.iterate.com/flakes/created\",\n payload: { config },\n idempotencyKey: \"flakes/created\",\n },\n ];\n}\n","import { z } from \"zod\";\n\n/** A full CI suite publishes this even when its flake record list is empty. */\nexport const FlakeSuiteSummary = z\n .object({\n headSha: z.string().min(1),\n branch: z.string(),\n status: z.enum([\"complete\", \"incomplete\"]),\n startedAt: z.iso.datetime(),\n finishedAt: z.iso.datetime(),\n testCount: z.number().int().nonnegative(),\n // Older artifacts have only counts and cannot advance per-test pass streaks.\n tests: z\n .array(\n z.object({\n name: z.string().min(1),\n outcome: z.enum([\"pass\", \"fail\", \"skip\"]),\n }),\n )\n .optional(),\n unknownFlakeCount: z.number().int().nonnegative(),\n failedCount: z.number().int().nonnegative(),\n diagnostics: z.array(z.string()),\n runUrl: z.url(),\n })\n .refine(\n (summary) =>\n summary.status !== \"complete\" ||\n (summary.testCount > 0 && !!summary.branch && summary.diagnostics.length === 0),\n \"A complete suite needs executed tests and no missing-result diagnostics\",\n );\n","import { FlakeSuiteSummary } from \"@iterate-com/shared/test-support/flake-suite-summary\";\nimport { z } from \"zod\";\nimport { defineProcessorContract } from \"../../processors/index.ts\";\n\nexport { FlakeSuiteSummary } from \"@iterate-com/shared/test-support/flake-suite-summary\";\n\nexport const flakeEventTypes = {\n created: \"events.iterate.com/flakes/created\",\n runRecorded: \"events.iterate.com/flakes/run-recorded\",\n transitionProposed: \"events.iterate.com/flakes/transition-proposed\",\n dashboardRenderSettled: \"events.iterate.com/flakes/dashboard-render-settled\",\n} as const;\n\nconst StreamOffset = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);\n\n/**\n * One `createFlake` test outcome. Mirrors `FlakeRecord` in\n * `@iterate-com/shared/test-support/flake-test` — the wrapper writes these\n * lines to `FLAKE_RECORD_DIR` and CI ships them here verbatim.\n */\nexport const FlakeOutcome = z.enum([\n \"pass\",\n \"flake-fail\",\n \"unexpected-error\",\n \"pinned-fail\",\n \"unexpected-pass\",\n \"retried-pass\",\n]);\n\n/**\n * Which wrapper (or reporter) produced a record: createFlake, createFailing,\n * or the telemetry reporters' retried-pass records for tests nobody has\n * classified yet. Old events predate the field — they were all createFlake.\n */\nexport const FlakeKind = z.enum([\"flake\", \"failing\", \"unknown\"]);\n\nexport const FlakeRecord = z.object({\n name: z.string().min(1).max(1_000),\n kind: FlakeKind.default(\"flake\"),\n outcome: FlakeOutcome,\n // Optional: kind \"unknown\" records carry error samples instead of a pattern.\n pattern: z.string().min(1).max(2_000).optional(),\n durationMs: z.number().nonnegative(),\n at: z.string().min(1),\n error: z.string().max(4_000).optional(),\n});\n\nexport const FlakeDashboardConfig = z.object({\n repository: z.object({\n owner: z.string().min(1),\n repo: z.string().min(1),\n }),\n issueTitle: z.string().min(1).max(200),\n defaultBranch: z.string().min(1),\n});\n\nconst FlakeRunRecorded = z.object({\n runId: z.string().min(1).max(200),\n suite: z.string().min(1).max(200),\n branch: z.string().min(1).max(500),\n commit: z.string().min(1).max(100),\n records: z.array(FlakeRecord).max(10_000),\n // Historical events have records only; they cannot certify a complete suite.\n summary: FlakeSuiteSummary.optional(),\n});\n\nconst MainSuiteRun = z.object({\n runId: z.string(),\n commit: z.string(),\n summary: FlakeSuiteSummary,\n});\n\nexport const FlakeTransition = z.enum([\"unwrap\", \"switch-to-failing\", \"unwrap-failing\"]);\n\nconst FlakeTransitionProposed = z.object({\n testName: z.string().min(1),\n transition: FlakeTransition,\n evidence: z.object({\n consecutiveRuns: z.number().int().positive(),\n firstAt: z.string().min(1),\n lastAt: z.string().min(1),\n }),\n});\n\nconst FlakeDashboardRenderResult = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"succeeded\"),\n issueNumber: z.number().int().positive(),\n issueUrl: z.string().url(),\n }),\n z.object({\n status: z.literal(\"failed\"),\n error: z.string().min(1).max(8_000),\n }),\n]);\n\n/**\n * A run of consecutive same-outcome recorded runs on the default branch.\n * `unexpected-error` outcomes and outcome changes reset it. The streak is the\n * whole input to transition proposals, so it lives in reduced state rather\n * than being recomputed from history.\n */\nconst DefaultBranchStreak = z.object({\n // Any outcome except unexpected-error, which resets the streak instead.\n outcome: FlakeOutcome,\n runs: z.number().int().positive(),\n firstAt: z.string().min(1),\n lastAt: z.string().min(1),\n});\n\nconst TrackedTest = z.object({\n /** Latest record's kind wins: adopting an unknown flake into createFlake migrates its row. */\n kind: FlakeKind.default(\"flake\"),\n /** Empty for kind \"unknown\" — those rows show error samples instead. */\n pattern: z.string().default(\"\"),\n suites: z.array(z.string()).default([]),\n /**\n * Per suite, the offset of the newest run-recorded event (any branch) whose\n * records included this test. Compared against the suite's\n * `recentRunOffsets` window at render time: a test absent from all of its\n * suite's last few ingested runs is retired from the table — hidden, not\n * deleted, so a transient absence self-heals on the next record.\n */\n lastSeenOffset: z.record(z.string(), StreamOffset).default({}),\n /**\n * The latest (up to) 10 outcomes on any branch, ordered by test time — the\n * render's emoji streak bar, each entry carrying the commit that produced\n * it so the square can link straight to that commit's checks. All branches,\n * like the counts, for debugging PR failures too. The numeric\n * defaultBranchStreak below stays main-only and carries the\n * transition-threshold counts past what 10 entries can show.\n */\n recent: z\n .array(z.object({ outcome: FlakeOutcome, commit: z.string().min(1).max(100), at: z.string() }))\n .max(10)\n .default([]),\n /** Keyed by outcome value (\"pass\", \"pinned-fail\", …). */\n counts: z.record(z.string(), z.number().int().nonnegative()).default({}),\n /**\n * The last few error samples worth showing (retried-pass and\n * unexpected-error records) — for unknown flakes these are the copy-paste\n * material for the createFlake pattern.\n */\n recentErrors: z\n .array(z.object({ error: z.string().max(4_000), commit: z.string(), at: z.string() }))\n .max(3)\n .default([]),\n lastFlakeAt: z.string().nullable().default(null),\n firstRecordedAt: z.string(),\n lastRecordedAt: z.string(),\n defaultBranchStreak: DefaultBranchStreak.nullable().default(null),\n /** Older retry evidence cannot undo a wrapper observed on main in this suite. */\n lastMainWrapperAt: z.record(z.string(), z.string()).default({}),\n /**\n * One entry per proposal already made, keyed `${transition}:${streak.firstAt}`\n * — a streak proposes at most once however long it grows.\n */\n proposed: z.array(z.string()).default([]),\n});\n\nexport const FlakeDashboardState = z.object({\n birthCertificate: z.object({ config: FlakeDashboardConfig }).nullable().default(null),\n tests: z.record(z.string(), TrackedTest).default({}),\n /**\n * Main-only unknowns, isolated by suite. Healthy rows are hidden, retaining\n * their streak so late failures can correct an apparent recovery.\n */\n unknownFlakes: z\n .record(\n z.string(),\n z.record(\n z.string(),\n z.object({\n record: FlakeRecord,\n passStreak: z.number().int().nonnegative(),\n /** Newest run that actually contained this test, including skips. */\n lastRunAt: z.string(),\n recent: z\n .array(z.object({ outcome: FlakeOutcome, commit: z.string(), at: z.string() }))\n .max(10),\n }),\n ),\n )\n .default({}),\n mainRuns: z\n .record(\n z.string(),\n z.object({\n latest: MainSuiteRun,\n complete: MainSuiteRun.nullable(),\n // Keep the last full test list even if a newer legacy summary has only counts.\n inventory: z\n .object({ startedAt: z.iso.datetime(), names: z.array(z.string()) })\n .nullable()\n .default(null),\n }),\n )\n .default({}),\n /**\n * The newest three ingested results across all branches retire absent\n * tracked tests. This preserves visibility during partial PR runs. Unknown\n * flakes retire after 20 main passes, wrapper adoption, or proven absence\n * from their suite's full main inventory.\n */\n suites: z\n .record(z.string(), z.object({ recentRunOffsets: z.array(StreamOffset).max(3).default([]) }))\n .default({}),\n /**\n * Offset of the newest reduced DATA event (created / run-recorded /\n * transition-proposed). Render settlements deliberately do not bump it —\n * that is what stops a settled render from demanding another render.\n */\n lastDataOffset: StreamOffset.default(0),\n render: z\n .object({\n throughOffset: StreamOffset,\n issueNumber: z.number().int().positive().nullable(),\n issueUrl: z.string().nullable(),\n })\n .nullable()\n .default(null),\n});\n\n/**\n * Suggest unwrapping createFlake after 20 consecutive main passes, regardless\n * of elapsed time. Unknown flakes retire automatically at the same count.\n * Propose createFailing after 25 matched failures over >=2 days.\n * Tunable constants. Sentinel tests are excluded from proposals entirely —\n * they are designed to flake.\n */\nexport const flakeTransitionThresholds = {\n unwrap: { runs: 20, minSpanMs: 0 },\n \"switch-to-failing\": { runs: 25, minSpanMs: 2 * 24 * 60 * 60 * 1000 },\n // A pin that keeps passing unexpectedly looks fixed: propose deleting the\n // createFailing wrapper after a sustained streak.\n \"unwrap-failing\": { runs: 10, minSpanMs: 2 * 24 * 60 * 60 * 1000 },\n} as const;\n\n/**\n * The exact shape of a delivered event this app ingests: a platform-verified\n * GitHub webhook for a COMPLETED check_run on a connection stream. This\n * repo's test suites run on Depot CI, whose jobs are GitHub check runs (NOT\n * GitHub Actions workflow runs — `workflow_run` never fires for them). Zod\n * strips the rest of GitHub's (huge) payload; only these fields are read.\n */\nexport const CheckRunWebhookEvent = z.object({\n type: z.literal(\"events.iterate.com/github/webhook-received\"),\n path: z.string().regex(/^\\/integrations\\/github\\/[^/]+$/),\n payload: z.object({\n delivery: z.object({ name: z.literal(\"check_run\") }),\n body: z.object({\n action: z.literal(\"completed\"),\n check_run: z.object({\n // Cancelled/skipped checks upload no fresh artifacts worth scanning.\n conclusion: z.enum([\"success\", \"failure\"]),\n head_sha: z.string().min(1),\n check_suite: z.object({ head_branch: z.string().nullish() }).optional(),\n }),\n repository: z.object({\n name: z.string().min(1),\n owner: z.object({ login: z.string().min(1) }),\n default_branch: z.string().nullish(),\n }),\n }),\n }),\n});\n\nexport const FlakeDashboardProcessorContract = defineProcessorContract({\n slug: \"flake-dashboard\",\n version: \"0.8.0\",\n description:\n \"Folds createFlake test outcomes reported by CI into per-test flake stats, renders the GitHub 'Flake dashboard' issue, and proposes data-provable lifecycle transitions.\",\n stateSchema: FlakeDashboardState,\n events: {\n [flakeEventTypes.created]: {\n description:\n \"The flake dashboard exists: target repository, issue title, and which branch counts for transitions.\",\n payloadSchema: z.object({ config: FlakeDashboardConfig }),\n examples: [\n {\n description: \"The dogfood dashboard for this repo.\",\n payload: {\n config: {\n repository: { owner: \"iterate\", repo: \"iterate\" },\n issueTitle: \"Flake dashboard\",\n defaultBranch: \"main\",\n },\n },\n },\n ],\n },\n [flakeEventTypes.runRecorded]: {\n description:\n \"One CI run+suite's createFlake outcomes, appended by the CI reporter script (never by this processor). Idempotency-keyed on run+suite so CI retries cannot double-count.\",\n payloadSchema: FlakeRunRecorded,\n },\n [flakeEventTypes.transitionProposed]: {\n description:\n \"A test's default-branch streak crossed a lifecycle threshold; downstream automation (an agent) should open the unwrap / switch-to-failing PR. The file-edit guard (a streak is only trustworthy if the test file did not change during it) is applied by that agent, which can read git history — the fold cannot.\",\n payloadSchema: FlakeTransitionProposed,\n },\n [flakeEventTypes.dashboardRenderSettled]: {\n description:\n \"Terminal fact for one dashboard render attempt: the GitHub issue reached (or the error), and the data offset it covered.\",\n payloadSchema: z.object({\n throughOffset: StreamOffset,\n result: FlakeDashboardRenderResult,\n }),\n },\n },\n consumes: [...Object.values(flakeEventTypes)],\n emits: [flakeEventTypes.transitionProposed, flakeEventTypes.dashboardRenderSettled],\n});\n\nexport type FlakeDashboardProcessorContract = typeof FlakeDashboardProcessorContract;\nexport type FlakeDashboardState = z.infer<typeof FlakeDashboardState>;\nexport type FlakeRecord = z.infer<typeof FlakeRecord>;\nexport type FlakeDashboardRenderResult = z.infer<typeof FlakeDashboardRenderResult>;\n","import type { z } from \"zod\";\nimport {\n isIdempotencyConflict,\n StreamProcessor,\n type EmittedInput,\n type ProcessEventArgs,\n type ReduceArgs,\n} from \"../../processors/index.ts\";\nimport {\n StreamProcessorDurableObject,\n type ProcessorHostDeps,\n type Project,\n type StreamEvent,\n} from \"../../sdk.ts\";\nimport { flakeDashboardCreationEvents, flakesStreamPath } from \"./app-ref.ts\";\nimport {\n FlakeDashboardProcessorContract,\n flakeEventTypes,\n FlakeRecord,\n FlakeSuiteSummary,\n flakeTransitionThresholds,\n CheckRunWebhookEvent,\n type FlakeDashboardRenderResult,\n type FlakeDashboardState,\n} from \"./contract.ts\";\n\nconst ARTIFACT_PREFIX = \"flake-records-\";\n\n/**\n * Where a project's CI artifacts live. Supplied by the config worker\n * (FlakeDashboardApp.create's config) — the starter app itself carries no\n * organization identity. secretPath names a project secret holding a\n * Depot org API read token.\n */\nexport interface DepotIngestionConfig {\n orgId: string;\n secretPath: string;\n}\nconst MAX_ARTIFACT_BYTES = 5 * 1024 * 1024;\n\n/**\n * The whole app is this worker: everything is processEvent and reduce.\n * `FlakeDashboardApp.processEvent` ingests workflow_run webhooks (CI's\n * credential-free reporting signal) into run-recorded events and wakes the\n * processor for /flakes events; `FlakeDashboardProcessor.reduce` folds them;\n * the processor's own processEvent drives the issue render and transition\n * proposals. No HTTP is served.\n */\nexport class FlakeDashboardApp extends StreamProcessorDurableObject<FlakeDashboardState> {\n protected readonly streamPath = flakesStreamPath;\n protected readonly recovery = true;\n\n protected createProcessor(deps: ProcessorHostDeps) {\n return new FlakeDashboardProcessor({\n ...deps,\n renderDashboard: async (state) => {\n using itx = await this.env.ITX.get();\n return await renderFlakeDashboardIssue(itx, state);\n },\n });\n }\n\n /**\n * Every flake-relevant event lands here — the same override point the\n * platform's own delivery uses (widened public so the config worker can\n * forward events over RPC). A /flakes event is a wake hint: catch-up\n * re-reads committed events from the stream and owns validation, ordering,\n * checkpointing, and dedupe.\n */\n override async processEvent(\n event: StreamEvent,\n options?: { depot?: DepotIngestionConfig },\n ): Promise<void> {\n const webhook = CheckRunWebhookEvent.safeParse(event);\n if (webhook.success) {\n if (!options?.depot) {\n // Platform-direct delivery, or a config worker mounted without CI\n // ingestion: nothing to pull from.\n return;\n }\n // Telemetry must never wedge event delivery: a throw from ingestion\n // would fail the delivery batch and retry the same poisoned webhook\n // forever, stalling every app behind it. Any failure — Depot down, an\n // unreadable zip — logs and drops this run's records.\n try {\n await this.#ingestCheckRunFlakeArtifacts(webhook.data, options.depot);\n } catch (error) {\n console.error(\n `[flake-ingest] ingestion failed for sha ${webhook.data.payload.body.check_run.head_sha} (records dropped):`,\n error,\n );\n }\n return;\n }\n if (event.path !== flakesStreamPath) return;\n const registry = await this.registry();\n await registry.catchUp(\"flake-dashboard\");\n }\n\n /**\n * Artifact-pull ingestion for flake telemetry. This repo's suites run on\n * Depot CI, so a completed check_run is the signal: resolve the Depot run\n * by commit sha, list its `flake-records-<suite>` artifacts, fetch each\n * via a short-lived signed URL, and append one run-recorded event per\n * artifact to /flakes. CI holds no iterate credential; the Depot read\n * token is a platform-held project secret. Any check_run completing on the\n * same Depot run re-scans it — repeated appends dedupe on the\n * run+attempt+suite idempotency key, so redeliveries and sibling checks\n * are harmless.\n */\n async #ingestCheckRunFlakeArtifacts(\n webhook: (typeof CheckRunWebhookEvent)[\"_output\"],\n depot: DepotIngestionConfig,\n ): Promise<void> {\n const { check_run: checkRun, repository } = webhook.payload.body;\n const params = { owner: repository.owner.login, repo: repository.name };\n using itx = await this.env.ITX.get();\n const token = await itx.secrets.get(depot.secretPath).reveal();\n\n const depotRpc = async <T>(method: string, body: unknown): Promise<T> => {\n const response = await fetch(`https://api.depot.dev/depot.ci.v1.CIService/${method}`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${token}`,\n \"x-depot-org\": depot.orgId,\n },\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n throw new Error(`depot ${method} failed: HTTP ${response.status} ${await response.text()}`);\n }\n // Connect's JSON protocol returns the response message as a plain JSON\n // object; the assertion states which message this method returns — the\n // fields read below are checked for presence before use.\n return (await response.json()) as T;\n };\n\n // sha matches either the run's merge sha or its head sha, so PR-triggered\n // and push-triggered runs both resolve.\n // Connect's JSON protocol emits proto3 canonical camelCase field names\n // (verified against the live API) — snake_case reads come back undefined.\n // No run-status filter: Depot groups every workflow for a sha into one\n // run, whose status settles only after the LAST check completes — and the\n // check_run webhook for that last check arrives before the flip. A\n // finished/failed filter therefore permanently skipped the artifacts of\n // whichever check completed last (in practice the slow preview check,\n // i.e. the specs and preview-e2e suites — seen live on prd, run\n // rs7dwp1l27). A completed check's own artifacts are always uploaded\n // before its check_run event fires, so an in-progress run is safe to\n // scan; the conclusion gate already excludes cancelled/skipped checks and\n // the run+attempt+suite keys dedupe rescans.\n const runs = await depotRpc<{ runs?: { runId: string }[] }>(\"ListRuns\", {\n repo: `${params.owner}/${params.repo}`,\n sha: checkRun.head_sha,\n pageSize: 10,\n });\n for (const run of runs.runs || []) {\n const listed = await depotRpc<{\n artifacts?: {\n artifactId: string;\n name: string;\n sizeBytes?: string | number;\n attempt?: number;\n }[];\n }>(\"ListArtifacts\", { runId: run.runId, pageSize: 100 });\n const flakeArtifacts = (listed.artifacts || []).filter((artifact) =>\n artifact.name.startsWith(ARTIFACT_PREFIX),\n );\n if (flakeArtifacts.length === 0) continue;\n\n const stream = itx.streams.get(flakesStreamPath);\n // Idempotency-keyed birth: whoever ingests first births the dashboard,\n // pinned to the repository the records came from. A same-key/different-\n // body conflict also means already born — it must not abort the record\n // appends below (a poisoned birth key on prd once silently dropped\n // every CI run's records this way).\n try {\n await stream.append(\n ...flakeDashboardCreationEvents({\n repository: params,\n issueTitle: \"Flake dashboard\",\n defaultBranch: repository.default_branch || \"main\",\n }),\n );\n } catch (error) {\n if (!isIdempotencyConflict(error)) throw error;\n }\n\n for (const artifact of flakeArtifacts) {\n if (Number(artifact.sizeBytes || 0) > MAX_ARTIFACT_BYTES) {\n console.warn(\n `[flake-ingest] skipping oversized artifact ${artifact.name} (${artifact.sizeBytes} bytes)`,\n );\n continue;\n }\n const suite = artifact.name.slice(ARTIFACT_PREFIX.length);\n const download = await depotRpc<{ url?: string }>(\"GetArtifactDownloadURL\", {\n artifactId: artifact.artifactId,\n });\n if (!download.url) {\n console.warn(`[flake-ingest] no download url for artifact ${artifact.name}`);\n continue;\n }\n const zipResponse = await fetch(download.url);\n if (!zipResponse.ok) {\n throw new Error(`artifact download failed: HTTP ${zipResponse.status}`);\n }\n const files = await unzip(new Uint8Array(await zipResponse.arrayBuffer()));\n const malformedRecords: string[] = [];\n const records = Object.entries(files)\n .filter(([name]) => name.endsWith(\".jsonl\"))\n .flatMap(([name, bytes]) =>\n new TextDecoder()\n .decode(bytes)\n .split(\"\\n\")\n .filter((line) => line.trim() !== \"\")\n .flatMap((line) => {\n // Keep valid history, but a torn record prevents a clean snapshot.\n let json: unknown;\n try {\n json = JSON.parse(line);\n } catch {\n malformedRecords.push(`Malformed record in ${name}`);\n return [];\n }\n const parsed = FlakeRecord.safeParse(json);\n if (!parsed.success) {\n malformedRecords.push(`Malformed record in ${name}`);\n return [];\n }\n return [parsed.data];\n }),\n );\n const summaryBytes = Object.entries(files).find(\n ([name]) => name === \"suite-summary.json\" || name.endsWith(\"/suite-summary.json\"),\n )?.[1];\n let summary: z.infer<typeof FlakeSuiteSummary> | undefined;\n if (summaryBytes) {\n try {\n summary = FlakeSuiteSummary.parse(JSON.parse(new TextDecoder().decode(summaryBytes)));\n } catch {\n // Its provenance and test inventory cannot be trusted. Keep the\n // previous suite state and continue ingesting independent artifacts.\n console.error(\n `[flake-ingest] invalid suite-summary.json in ${artifact.name}; skipping artifact`,\n );\n continue;\n }\n }\n if (\n summary &&\n summary.unknownFlakeCount !== records.filter((record) => record.kind === \"unknown\").length\n ) {\n malformedRecords.push(\"Unknown flake records do not match the full runner result\");\n }\n if (summary?.tests && summary.tests.length !== summary.testCount) {\n malformedRecords.push(\"Per-test results do not match the full runner test count\");\n }\n if (summary && malformedRecords.length > 0) {\n summary.status = \"incomplete\";\n summary.diagnostics.push(...new Set(malformedRecords));\n }\n if (records.length === 0 && !summary) continue;\n\n const runId = `${run.runId}-${artifact.attempt || 1}`;\n try {\n await stream.append({\n type: \"events.iterate.com/flakes/run-recorded\",\n idempotencyKey: `flakes/run:${runId}:${suite}`,\n payload: {\n runId,\n suite,\n branch: summary ? summary.branch : checkRun.check_suite?.head_branch || \"unknown\",\n commit: summary ? summary.headSha : checkRun.head_sha,\n records,\n summary,\n },\n });\n } catch (error) {\n // Same key, different body: the run+attempt+suite is already\n // ingested (a sibling check_run racing this one) — the first\n // committed fact wins.\n if (!isIdempotencyConflict(error)) throw error;\n }\n console.log(\n `[flake-ingest] ingested ${records.length} records from ${artifact.name} (run ${runId})`,\n );\n }\n }\n }\n\n /** Internal RPC surface used by smoke checks and debugging. */\n async getState(): Promise<FlakeDashboardState> {\n const registry = await this.registry();\n await registry.catchUp(\"flake-dashboard\");\n return (await this.snapshot()).state;\n }\n}\n\ntype FlakeDashboardProcessorDeps = {\n /**\n * Upsert the GitHub dashboard issue from folded state. Injected so the\n * harness tests run against a fake; the worker builds the real one over\n * itx's GitHub integration. Throwing settles the render as failed.\n */\n renderDashboard: (\n state: FlakeDashboardState,\n ) => Promise<Extract<FlakeDashboardRenderResult, { status: \"succeeded\" }>>;\n};\n\n/**\n * One instance runs on the project's `/flakes` stream. CI appends\n * `run-recorded` events; this processor folds them into per-test stats, owns\n * the GitHub issue render as its durable obligation, and proposes lifecycle\n * transitions when a default-branch streak crosses a threshold.\n */\nexport class FlakeDashboardProcessor extends StreamProcessor<\n FlakeDashboardProcessorContract,\n FlakeDashboardProcessorDeps\n> {\n readonly contract = FlakeDashboardProcessorContract;\n\n /**\n * Runtime-only render attempt guard. The render-settled stream event is the\n * durable truth: after an eviction this is false and the next caught-up\n * pass re-drives any still-unrendered data.\n */\n #liveRender = false;\n\n protected override reduce({\n event,\n state,\n }: ReduceArgs<FlakeDashboardProcessorContract>): FlakeDashboardState {\n switch (event.type) {\n case flakeEventTypes.created:\n if (state.birthCertificate !== null) return state;\n return { ...state, birthCertificate: event.payload, lastDataOffset: event.offset };\n\n case flakeEventTypes.runRecorded: {\n const config = state.birthCertificate?.config;\n if (config === undefined) return state;\n const onDefaultBranch = event.payload.branch === config.defaultBranch;\n const { summary, suite, runId, commit, records } = event.payload;\n const tests = { ...state.tests };\n for (const record of event.payload.records) {\n const existing = tests[record.name];\n const runAt = summary?.startedAt || record.at;\n const wrapperAt = existing?.lastMainWrapperAt[suite];\n const unknownAt = state.unknownFlakes[suite]?.[record.name]?.lastRunAt;\n const staleKind =\n existing &&\n onDefaultBranch &&\n (record.kind === \"unknown\"\n ? wrapperAt && runAt < wrapperAt\n : unknownAt && runAt < unknownAt);\n const kind = staleKind ? existing.kind : record.kind;\n const counts = { ...existing?.counts };\n counts[record.outcome] = (counts[record.outcome] || 0) + 1;\n const streak = existing?.defaultBranchStreak || null;\n const nextStreak =\n !onDefaultBranch || staleKind\n ? streak\n : record.outcome === \"unexpected-error\"\n ? null\n : streak && streak.outcome === record.outcome\n ? { ...streak, runs: streak.runs + 1, lastAt: record.at }\n : { outcome: record.outcome, runs: 1, firstAt: record.at, lastAt: record.at };\n const flakeStruck = record.outcome === \"flake-fail\" || record.outcome === \"retried-pass\";\n // Error samples worth keeping: an unknown flake's evidence, or an\n // unexpected error anywhere. A matched flake-fail / pinned-fail is\n // already described by the pattern.\n const errorSample =\n record.error !== undefined &&\n (record.outcome === \"retried-pass\" || record.outcome === \"unexpected-error\")\n ? { error: record.error, commit: event.payload.commit, at: record.at }\n : null;\n tests[record.name] = {\n kind,\n pattern: staleKind ? existing.pattern : record.pattern || existing?.pattern || \"\",\n suites: existing?.suites.includes(event.payload.suite)\n ? existing.suites\n : [...(existing?.suites || []), event.payload.suite],\n lastSeenOffset: { ...existing?.lastSeenOffset, [event.payload.suite]: event.offset },\n recent: [\n ...(existing?.recent || []),\n { outcome: record.outcome, commit: event.payload.commit, at: record.at },\n ]\n .sort((a, b) => Date.parse(a.at) - Date.parse(b.at))\n .slice(-10),\n counts,\n recentErrors: errorSample\n ? [...(existing?.recentErrors || []), errorSample]\n .sort((a, b) => Date.parse(a.at) - Date.parse(b.at))\n .slice(-3)\n : existing?.recentErrors || [],\n lastFlakeAt:\n flakeStruck &&\n (!existing?.lastFlakeAt || Date.parse(record.at) > Date.parse(existing.lastFlakeAt))\n ? record.at\n : existing?.lastFlakeAt || null,\n // Dates the test's CURRENT kind (Failures render it as \"pinned\n // since\"): a flake that later becomes a pin restarts the clock.\n firstRecordedAt:\n existing && existing.kind === kind ? existing.firstRecordedAt : record.at,\n lastRecordedAt:\n existing && Date.parse(existing.lastRecordedAt) > Date.parse(record.at)\n ? existing.lastRecordedAt\n : record.at,\n defaultBranchStreak: nextStreak,\n lastMainWrapperAt:\n onDefaultBranch && record.kind !== \"unknown\"\n ? {\n ...existing?.lastMainWrapperAt,\n [suite]: wrapperAt && wrapperAt > runAt ? wrapperAt : runAt,\n }\n : existing?.lastMainWrapperAt || {},\n proposed: existing?.proposed || [],\n };\n }\n const suites = {\n ...state.suites,\n [event.payload.suite]: {\n recentRunOffsets: [\n ...(state.suites[event.payload.suite]?.recentRunOffsets || []),\n ...((\n event.payload.summary\n ? event.payload.summary.status === \"complete\"\n : event.payload.records.length > 0\n )\n ? [event.offset]\n : []),\n ].slice(-3),\n },\n };\n const mainRuns = { ...state.mainRuns };\n const previousInventory = mainRuns[suite]?.inventory || null;\n const inventory =\n onDefaultBranch &&\n summary?.status === \"complete\" &&\n summary.tests &&\n (!previousInventory || summary.startedAt >= previousInventory.startedAt)\n ? {\n startedAt: summary.startedAt,\n names: [...new Set(summary.tests.map((test) => test.name))],\n }\n : previousInventory;\n const unknownFlakes = { ...state.unknownFlakes };\n if (onDefaultBranch) {\n const unknowns = { ...unknownFlakes[suite] };\n const recordedNames = new Set(records.map((record) => record.name));\n const results = new Map<string, \"pass\" | \"fail\" | \"skip\">();\n for (const test of summary?.tests || []) {\n // A shared title across projects/workspaces gets one vote per run.\n // Every instance must pass; any failure breaks the streak.\n const previous = results.get(test.name);\n results.set(\n test.name,\n previous === \"fail\" || test.outcome === \"fail\"\n ? \"fail\"\n : previous === \"skip\" || test.outcome === \"skip\"\n ? \"skip\"\n : \"pass\",\n );\n }\n if (summary) {\n for (const [name, test] of Object.entries(unknowns)) {\n if (recordedNames.has(name)) continue;\n const wrapperAt = tests[name]?.lastMainWrapperAt[suite];\n if (wrapperAt && summary.startedAt < wrapperAt) continue;\n const outcome = results.get(name);\n if (!outcome) continue;\n const pass = outcome === \"pass\" && summary.status === \"complete\";\n const fail = outcome === \"fail\";\n // Late passes cannot advance a streak. Late failures still break\n // it: a newer incomplete result is not evidence of recovery.\n if (!fail && summary.startedAt <= test.lastRunAt) continue;\n const passStreak = fail ? 0 : test.passStreak + Number(pass);\n unknowns[name] = {\n ...test,\n passStreak,\n lastRunAt: summary.startedAt > test.lastRunAt ? summary.startedAt : test.lastRunAt,\n recent:\n pass || fail\n ? test.recent\n .concat({\n outcome: pass ? \"pass\" : \"unexpected-error\",\n commit,\n at: summary.startedAt,\n })\n .sort((a, b) => Date.parse(a.at) - Date.parse(b.at))\n .slice(-10)\n : test.recent,\n };\n }\n }\n for (const record of records) {\n const previous = unknowns[record.name];\n const lastRunAt = summary?.startedAt || record.at;\n const wrapperAt = tests[record.name]?.lastMainWrapperAt[suite];\n if (record.kind === \"unknown\" && wrapperAt && lastRunAt < wrapperAt) continue;\n if (record.kind !== \"unknown\") {\n if (previous && lastRunAt <= previous.lastRunAt) continue;\n // Wrapping the test on main moves it to Flakes/Failures.\n delete unknowns[record.name];\n continue;\n }\n // A retry is evidence even if the rest of its suite was interrupted.\n unknowns[record.name] = {\n record:\n previous && Date.parse(previous.record.at) > Date.parse(record.at)\n ? previous.record\n : record,\n passStreak: 0,\n lastRunAt:\n previous && previous.lastRunAt > lastRunAt ? previous.lastRunAt : lastRunAt,\n recent: [\n ...(previous?.recent || []),\n { outcome: record.outcome, commit, at: record.at },\n ]\n .sort((a, b) => Date.parse(a.at) - Date.parse(b.at))\n .slice(-10),\n };\n }\n if (inventory) {\n const names = new Set(inventory.names);\n for (const [name, test] of Object.entries(unknowns)) {\n // A newer observation can reintroduce a deleted test. An older\n // delayed retry cannot undo its absence from a full main run.\n if (test.lastRunAt <= inventory.startedAt && !names.has(name)) delete unknowns[name];\n }\n }\n unknownFlakes[suite] = unknowns;\n }\n if (onDefaultBranch && summary) {\n const previous = mainRuns[suite];\n // Per-test evidence is folded above; don't duplicate it in snapshots.\n const incoming = { runId, commit, summary: { ...summary, tests: undefined } };\n mainRuns[suite] = {\n inventory,\n latest:\n !previous || summary.startedAt >= previous.latest.summary.startedAt\n ? incoming\n : previous.latest,\n complete:\n summary.status === \"complete\" &&\n (!previous?.complete || summary.startedAt >= previous.complete.summary.startedAt)\n ? incoming\n : previous?.complete || null,\n };\n }\n return { ...state, tests, suites, mainRuns, unknownFlakes, lastDataOffset: event.offset };\n }\n\n case flakeEventTypes.transitionProposed: {\n const test = state.tests[event.payload.testName];\n if (test === undefined) return { ...state, lastDataOffset: event.offset };\n const marker = `${event.payload.transition}:${event.payload.evidence.firstAt}`;\n return {\n ...state,\n tests: {\n ...state.tests,\n [event.payload.testName]: {\n ...test,\n proposed: test.proposed.includes(marker) ? test.proposed : [...test.proposed, marker],\n },\n },\n lastDataOffset: event.offset,\n };\n }\n\n case flakeEventTypes.dashboardRenderSettled: {\n // Deliberately does NOT bump lastDataOffset — a settled render must\n // not itself demand another render.\n if (event.payload.result.status !== \"succeeded\") return state;\n return {\n ...state,\n render: {\n throughOffset: event.payload.throughOffset,\n issueNumber: event.payload.result.issueNumber,\n issueUrl: event.payload.result.issueUrl,\n },\n };\n }\n }\n }\n\n protected override processEvent(\n args: ProcessEventArgs<FlakeDashboardProcessorContract>,\n ): undefined {\n const { append, blockProcessorWhile, delivery, event, runInBackground, state } = args;\n\n // Transition proposals are short durable appends that must land before\n // the processor advances past the run that crossed the threshold.\n if (event?.type === flakeEventTypes.runRecorded) {\n for (const [testName, test] of Object.entries(state.tests)) {\n // Sentinels are designed to flake: their streaks prove the pipeline\n // works and must never propose lifecycle changes.\n if (isSentinel(testName)) continue;\n const streak = test.defaultBranchStreak;\n if (streak === null) continue;\n const transition =\n streak.outcome === \"pass\"\n ? \"unwrap\"\n : streak.outcome === \"flake-fail\"\n ? \"switch-to-failing\"\n : streak.outcome === \"unexpected-pass\"\n ? \"unwrap-failing\"\n : null;\n if (transition === null) continue;\n const threshold = flakeTransitionThresholds[transition];\n const spanMs = Date.parse(streak.lastAt) - Date.parse(streak.firstAt);\n if (streak.runs < threshold.runs || spanMs < threshold.minSpanMs) continue;\n const marker = `${transition}:${streak.firstAt}`;\n if (test.proposed.includes(marker)) continue;\n blockProcessorWhile(() =>\n this.#appendTolerantOfSettledRace(append, {\n type: flakeEventTypes.transitionProposed,\n // The streak's firstAt keys the proposal: as the streak keeps\n // growing, later runs re-derive the same key with fresher\n // evidence and lose the idempotency race below — one proposal\n // per streak.\n idempotencyKey: this.idempotencyKey(`transition:${testName}:${marker}`),\n payload: {\n testName,\n transition,\n evidence: {\n consecutiveRuns: streak.runs,\n firstAt: streak.firstAt,\n lastAt: streak.lastAt,\n },\n },\n }),\n );\n }\n }\n\n // Behind head, newer data (or an already-settled render) may exist in an\n // unseen page; rendering from partial state would thrash the issue.\n if (!delivery.caughtUp) return;\n if (state.birthCertificate === null) return;\n if (state.lastDataOffset <= (state.render?.throughOffset || 0)) return;\n if (this.#liveRender) return;\n\n const throughOffset = state.lastDataOffset;\n this.#liveRender = true;\n // A dropped attempt is recovered from the still-unrendered comparison on\n // the next caught-up/revival pass; the issue upsert itself is idempotent\n // (one issue, body overwritten), so a settle-append that never landed\n // only costs one redundant render.\n runInBackground(async () => {\n let result: FlakeDashboardRenderResult;\n try {\n result = await this.deps.renderDashboard(state);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result = { status: \"failed\", error: message.slice(0, 8_000) || \"Unknown render failure.\" };\n }\n try {\n await this.#appendTolerantOfSettledRace(append, {\n type: flakeEventTypes.dashboardRenderSettled,\n // The status is part of the key: a failed settlement must not claim\n // the offset's only key, or a retried render's SUCCESS at the same\n // offset would idempotency-conflict forever and the offset could\n // never be marked rendered.\n idempotencyKey: this.idempotencyKey(`dashboard-render:${throughOffset}:${result.status}`),\n payload: { throughOffset, result },\n });\n } finally {\n this.#liveRender = false;\n }\n });\n }\n\n /**\n * Growing streaks and overlapping render attempts can race on one\n * processor-owned key with fresher bodies. The first committed fact wins;\n * a same-key/different-body rejection means the work is already settled.\n */\n async #appendTolerantOfSettledRace(\n append: ProcessEventArgs<FlakeDashboardProcessorContract>[\"append\"],\n event: EmittedInput<FlakeDashboardProcessorContract>,\n ): Promise<void> {\n try {\n await append(event);\n } catch (error) {\n if (!isIdempotencyConflict(error)) throw error;\n }\n }\n}\n\nconst DASHBOARD_MARKER = \"<!-- iterate-flake-dashboard -->\";\n\n/**\n * Upsert the GitHub \"Flake dashboard\" issue from folded state. Mechanical by\n * design (the AI-linter publication stance): all decisions were made when the\n * events reduced. The processor is the single writer, so a plain body\n * overwrite is race-free; the marker plus remembered issue number make the\n * upsert idempotent across retried renders.\n */\nasync function renderFlakeDashboardIssue(\n itx: Project,\n state: FlakeDashboardState,\n): Promise<Extract<FlakeDashboardRenderResult, { status: \"succeeded\" }>> {\n const config = state.birthCertificate?.config;\n if (config === undefined) throw new Error(\"Flake dashboard has no birth certificate.\");\n\n const repos = await itx.repos.list();\n const links = await Promise.all(\n repos.map(async ({ path }) => (await itx.repos.get(path).processor.snapshot()).state.github),\n );\n const link = links.find(\n (candidate) =>\n candidate !== null &&\n candidate.owner === config.repository.owner &&\n candidate.repo === config.repository.repo,\n );\n if (link === null || link === undefined) {\n throw new Error(\n `No linked GitHub connection for ${config.repository.owner}/${config.repository.repo}; ` +\n \"link a repo to that repository before the dashboard can render.\",\n );\n }\n const octokit = itx.integrations.github.get(link.connection).octokit;\n const params = { owner: config.repository.owner, repo: config.repository.repo };\n const body = renderBody(state);\n\n const rememberedIssueNumber = state.render?.issueNumber || null;\n if (rememberedIssueNumber !== null) {\n const updated = await octokit.rest.issues.update({\n ...params,\n issue_number: rememberedIssueNumber,\n body,\n title: config.issueTitle,\n });\n return {\n status: \"succeeded\",\n issueNumber: rememberedIssueNumber,\n issueUrl: updated.data.html_url,\n };\n }\n\n // First render (or state predating a remembered number): find by marker\n // before creating — the marker, not the title, is authority, so a human\n // opening a same-titled issue cannot capture the dashboard.\n const issues = await octokit.paginate(\"GET /repos/{owner}/{repo}/issues\", {\n ...params,\n state: \"open\",\n per_page: 100,\n });\n const existing = issues.find((issue) => issue.body?.includes(DASHBOARD_MARKER) === true);\n if (existing !== undefined) {\n await octokit.rest.issues.update({\n ...params,\n issue_number: existing.number,\n body,\n title: config.issueTitle,\n });\n return { status: \"succeeded\", issueNumber: existing.number, issueUrl: existing.html_url };\n }\n const created = await octokit.rest.issues.create({\n ...params,\n title: config.issueTitle,\n body,\n });\n return { status: \"succeeded\", issueNumber: created.data.number, issueUrl: created.data.html_url };\n}\n\n// One map across kinds, honest per section: green = the expected thing\n// happened (a pass, or a pin passing unexpectedly — worth a look), red = the\n// tracked failure struck (a flake, a held pin, a retried-pass), ❌ = an\n// unexpected error that proves nothing.\nconst OUTCOME_EMOJI = {\n pass: \"🟩\",\n \"unexpected-pass\": \"🟩\",\n \"flake-fail\": \"🟥\",\n \"pinned-fail\": \"🟥\",\n \"retried-pass\": \"🟥\",\n \"unexpected-error\": \"❌\",\n} as const;\n\n/**\n * The deliberate canary flakes are identified by naming convention — every\n * suite's sentinel test contains this phrase (\"flake sentinel\",\n * \"flake sentinel (specs)\", …). A convention beats a record flag: it needs no\n * wire-format field and holds for all historical records.\n */\nfunction isSentinel(testName: string): boolean {\n return testName.includes(\"flake sentinel\");\n}\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\n/** \"Sep 4, 7:16am\" (UTC) — ISO timestamps read like log spam in the table. */\nfunction shortDate(iso: string) {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return iso;\n const hours = date.getUTCHours();\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n return `${MONTHS[date.getUTCMonth()]} ${date.getUTCDate()}, ${hours % 12 || 12}:${minutes}${hours >= 12 ? \"pm\" : \"am\"}`;\n}\n\n/** Exported for tests: the table is a pure projection of folded state. */\nexport function renderBody(state: FlakeDashboardState): string {\n const tests = Object.entries(state.tests).sort(([a], [b]) => a.localeCompare(b));\n const lastRecordedAt = [\n ...tests.map(([, test]) => test.lastRecordedAt),\n ...Object.values(state.mainRuns).map((result) => result.latest.summary.finishedAt),\n ]\n .sort()\n .at(-1);\n // Tracked tests remain visible while present in the last three ingested\n // results for their suite. Unknowns use their main pass streaks below.\n // History remains in the event log and folded counts after a row disappears.\n const tracked = tests.filter(([, test]) => test.kind !== \"unknown\");\n const visible = tracked.filter(([, test]) =>\n Object.entries(test.lastSeenOffset).some(([suite, seen]) => {\n const windowStart = state.suites[suite]?.recentRunOffsets[0];\n return windowStart === undefined || seen >= windowStart;\n }),\n );\n const retiredCount = tracked.length - visible.length;\n const config = state.birthCertificate?.config;\n\n const count = (test: (typeof tests)[number][1], outcome: string) => test.counts[outcome] || 0;\n const row = ([name, test]: (typeof tests)[number]) => {\n const runs = Object.values(test.counts).reduce((total, n) => total + n, 0);\n // Lines inside a cell are <br>-separated; a literal | or backtick in a\n // pattern or error would end the cell or the code span, and a raw newline\n // (playwright timeout messages carry a call log) would split the table\n // row — so all three render collapsed/escaped.\n const pattern = `/${test.pattern}/`\n .replaceAll(/\\s+/gu, \" \")\n .replaceAll(\"`\", \"'\")\n .replaceAll(\"|\", \"\\\\|\");\n const info = [\n `pattern: \\`${pattern}\\``,\n `suites: ${test.suites.join(\", \")}`,\n ...(test.proposed.length === 0\n ? []\n : [`proposed: ${test.proposed.map((p) => p.split(\":\")[0]).join(\", \")}`]),\n ].join(\"<br>\");\n const gated = count(test, \"pass\") + count(test, \"flake-fail\");\n const stats = (\n test.kind === \"failing\"\n ? [\n `runs: ${runs}`,\n `pin held: ${count(test, \"pinned-fail\")}`,\n `unexpected passes: ${count(test, \"unexpected-pass\")}`,\n `pinned since: ${shortDate(test.firstRecordedAt)}`,\n ]\n : [\n `runs: ${runs}`,\n `flake rate: ${gated === 0 ? \"—\" : `${Math.round((count(test, \"flake-fail\") / gated) * 100)}%`}`,\n `last flake: ${test.lastFlakeAt ? shortDate(test.lastFlakeAt) : \"never\"}`,\n ]\n ).join(\"<br>\");\n // Tests only exist after birth, so config is always set here; the plain\n // emoji fallback keeps the render total rather than throwing over a link.\n const squares = test.recent\n .map((entry) => {\n const emoji = OUTCOME_EMOJI[entry.outcome];\n if (config === undefined) return emoji;\n const { owner, repo } = config.repository;\n return `[${emoji}](https://github.com/${owner}/${repo}/commit/${entry.commit})`;\n })\n .join(\"\");\n const streak = [\n squares || \"—\",\n ...(test.defaultBranchStreak === null || config === undefined\n ? []\n : [\n `${test.defaultBranchStreak.runs}× ${test.defaultBranchStreak.outcome} (${config.defaultBranch})`,\n ]),\n ].join(\"<br>\");\n return [`\\`${name}\\``, info, stats, streak].join(\" | \");\n };\n\n const sections = [\n {\n title: \"Flakes\",\n legend: `_createFlake-wrapped: 🟩 passed · 🟥 the known flake struck · ❌ failed differently than expected. Suggest removing the wrapper after ${flakeTransitionThresholds.unwrap.runs} consecutive main passes, with no minimum elapsed time._`,\n tests: visible.filter(([name, test]) => test.kind === \"flake\" && !isSentinel(name)),\n },\n {\n title: \"Failures\",\n legend:\n \"_createFailing pins: 🟥 the pinned bug is present · 🟩 passed unexpectedly — the bug may be fixed · ❌ failed differently than expected._\",\n tests: visible.filter(([, test]) => test.kind === \"failing\"),\n },\n {\n title: \"Sentinels\",\n legend:\n \"_Deliberate canary flakes proving the recording pipeline works: 🟩 passed · 🟥 the known flake struck · ❌ failed differently than expected._\",\n tests: visible.filter(([name, test]) => test.kind === \"flake\" && isSentinel(name)),\n },\n ].filter((section) => section.tests.length > 0);\n\n return [\n DASHBOARD_MARKER,\n \"Test health, folded from CI-reported runs: [`createFlake`](https://github.com/iterate/iterate/blob/main/packages/shared/src/test-support/flake-test.ts) wraps, [`createFailing`](https://github.com/iterate/iterate/blob/main/packages/shared/src/test-support/failing-test.ts) pins, and unclassified flaky tests caught by CI retries. Maintained automatically — edits to this body will be overwritten. Squares show the last 10 outcomes, oldest→newest, and link to their commits. Wrapped tests show all branches; unknown flakes show main only. Lifecycle streak counts use main only.\",\n ...sections.filter((section) => section.title !== \"Sentinels\").flatMap(renderSection),\n ...renderUnknownFlakes(state),\n ...sections.filter((section) => section.title === \"Sentinels\").flatMap(renderSection),\n \"\",\n `_Last recorded outcome: ${lastRecordedAt || \"none\"}._`,\n ...(retiredCount === 0\n ? []\n : [\n `_${retiredCount} retired ${retiredCount === 1 ? \"test\" : \"tests\"} hidden (absent from the last 3 runs of their suite)._`,\n ]),\n ].join(\"\\n\");\n\n function renderSection(section: (typeof sections)[number]) {\n const collapsed = section.title === \"Failures\" || section.title === \"Sentinels\";\n const suiteCounts = new Map<string, number>();\n for (const [, test] of section.tests) {\n for (const suite of test.suites) suiteCounts.set(suite, (suiteCounts.get(suite) || 0) + 1);\n }\n const summary = [\n `${section.tests.length} ${section.tests.length === 1 ? \"test\" : \"tests\"}`,\n ...[...suiteCounts]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([suite, count]) => `${suite}: ${count}`),\n ].join(\" · \");\n return [\n \"\",\n `## ${section.title}`,\n \"\",\n ...(collapsed ? [\"<details>\", `<summary>${summary}</summary>`, \"\"] : []),\n section.legend,\n \"\",\n \"test | info | stats | streak\",\n \"--- | --- | --- | ---\",\n ...section.tests.map(row),\n ...(collapsed ? [\"\", \"</details>\"] : []),\n ];\n }\n}\n\nfunction renderUnknownFlakes(state: FlakeDashboardState): string[] {\n const suites = [\n ...new Set([...Object.keys(state.suites), ...Object.keys(state.mainRuns)]),\n ].sort();\n const escape = (text: string) =>\n text.replaceAll(/\\s+/gu, \" \").replaceAll(/([\\\\`*_[\\]|<>])/gu, \"\\\\$1\");\n const rows = suites.flatMap((suite) =>\n Object.entries(state.unknownFlakes[suite] || {})\n .filter(([, test]) => test.passStreak < flakeTransitionThresholds.unwrap.runs)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([, test]) => {\n const record = test.record;\n const config = state.birthCertificate!.config;\n const squares = test.recent\n .map(\n ({ outcome, commit }) =>\n `[${OUTCOME_EMOJI[outcome]}](https://github.com/${config.repository.owner}/${config.repository.repo}/commit/${commit})`,\n )\n .join(\"\");\n return [\n escape(record.name),\n `\\`${(record.error || \"No error sample recorded\").replaceAll(/\\s+/gu, \" \").replaceAll(\"`\", \"'\").replaceAll(\"|\", \"\\\\|\").slice(0, 300)}\\``,\n escape(suite),\n `${squares}<br>${test.passStreak}/${flakeTransitionThresholds.unwrap.runs} consecutive passes`,\n ].join(\" | \");\n }),\n );\n const completeCount = suites.filter((suite) => state.mainRuns[suite]?.complete).length;\n return [\n \"\",\n \"## Unknown flakes\",\n \"\",\n `_Any main retry adds a test here. Remove it after ${flakeTransitionThresholds.unwrap.runs} consecutive main passes, wrapper adoption, or absence from a complete main run's full test list. Failures reset the streak. Skips and incomplete results cannot advance it or prove deletion. 🟩 passed · 🟥 needed a retry · ❌ failed. PR results do not affect this table._`,\n \"\",\n ...suites.map((suite) => {\n const result = state.mainRuns[suite];\n if (!result) return `- **${escape(suite)}:** awaiting a complete main result.`;\n const complete = result.complete;\n const incomplete =\n result.latest.summary.status === \"incomplete\"\n ? ` Latest attempt [${result.latest.commit.slice(0, 7)}](${result.latest.summary.runUrl}) incomplete: ${escape(result.latest.summary.diagnostics.join(\"; \"))}.`\n : \"\";\n if (!complete) return `- **${escape(suite)}:** awaiting a complete main result.${incomplete}`;\n return `- **${escape(suite)}:** [${complete.commit.slice(0, 7)}](${complete.summary.runUrl}) · ${shortDate(complete.summary.finishedAt)} UTC · ${complete.summary.testCount} tests · ${complete.summary.failedCount} failed.${incomplete}`;\n }),\n \"\",\n ...(rows.length > 0\n ? [\"test | first failure | suite | streak (main)\", \"--- | --- | --- | ---\", ...rows]\n : [\n completeCount === 0\n ? \"_Awaiting the first complete main results._\"\n : \"_No active unknown flakes. Passing streaks are evidence of stability, not proof that the root cause is fixed._\",\n ]),\n ];\n}\n\n/**\n * Minimal zip reader on the runtime's own DecompressionStream — deliberately\n * not a dependency. The format surface is narrow by construction: one\n * producer (GitHub's artifact service), a 5MB size cap upstream, and reading\n * via the central directory (sizes come from there, so streaming-writer data\n * descriptors don't matter). No zip64 — impossible under the size cap — and\n * anything unexpected throws, which ingestion treats as a logged drop.\n */\nasync function unzip(bytes: Uint8Array): Promise<Record<string, Uint8Array>> {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n // The end-of-central-directory record sits at the tail, behind an optional\n // comment (max 64KB): scan backwards for its signature.\n let eocd = -1;\n for (let i = bytes.length - 22; i >= Math.max(0, bytes.length - 22 - 65535); i--) {\n if (view.getUint32(i, true) === 0x06054b50) {\n eocd = i;\n break;\n }\n }\n if (eocd < 0) throw new Error(\"not a zip: no end-of-central-directory record\");\n const entryCount = view.getUint16(eocd + 10, true);\n const files: Record<string, Uint8Array> = {};\n let offset = view.getUint32(eocd + 16, true);\n for (let i = 0; i < entryCount; i++) {\n if (view.getUint32(offset, true) !== 0x02014b50) {\n throw new Error(\"corrupt zip: bad central directory entry signature\");\n }\n const method = view.getUint16(offset + 10, true);\n const compressedSize = view.getUint32(offset + 20, true);\n const nameLength = view.getUint16(offset + 28, true);\n const extraLength = view.getUint16(offset + 30, true);\n const commentLength = view.getUint16(offset + 32, true);\n const localHeaderOffset = view.getUint32(offset + 42, true);\n const name = new TextDecoder().decode(bytes.subarray(offset + 46, offset + 46 + nameLength));\n // The local header's name/extra lengths can differ from the central\n // directory's, so the data offset comes from the local header itself.\n const localNameLength = view.getUint16(localHeaderOffset + 26, true);\n const localExtraLength = view.getUint16(localHeaderOffset + 28, true);\n const dataStart = localHeaderOffset + 30 + localNameLength + localExtraLength;\n // slice (not subarray): a copy backed by a plain ArrayBuffer, which both\n // the DOM and Workers Response typings accept without assertions.\n const data = bytes.slice(dataStart, dataStart + compressedSize);\n if (method === 0) {\n files[name] = data;\n } else if (method === 8) {\n const inflated = new Response(data).body!.pipeThrough(new DecompressionStream(\"deflate-raw\"));\n files[name] = new Uint8Array(await new Response(inflated).arrayBuffer());\n } else {\n throw new Error(`unsupported zip compression method ${method} for ${name}`);\n }\n offset += 46 + nameLength + extraLength + commentLength;\n }\n return files;\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|