diff --git a/api/_lib/__tests__/ai-provider-response-limit.test.ts b/api/_lib/__tests__/ai-provider-response-limit.test.ts new file mode 100644 index 0000000..c49142e --- /dev/null +++ b/api/_lib/__tests__/ai-provider-response-limit.test.ts @@ -0,0 +1,162 @@ +// @vitest-environment node +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { APICallError, DownloadError, generateText } from 'ai'; +import { createOpenAI } from '@ai-sdk/openai'; + +const GATEWAY_BASE = 'https://fixture-gateway.example.invalid/v1'; +const FIXTURE_TEXT = 'Synthetic board response'; +const FIXTURE_ERROR = 'Synthetic gateway rejected the request'; + +// The upstream SDK's default is 2 GiB, not an application-sized memory cap. +// Advertise a larger response while delivering a small valid stream. This +// proves early header rejection/cancellation without allocating 2 GiB; it does +// not exercise the cumulative no-Content-Length threshold. +const DECLARED_OVER_LIMIT_BYTES = 2 * 1024 * 1024 * 1024 + 1; + +type Adapter = 'chat' | 'responses'; + +function successfulBody(adapter: Adapter) { + if (adapter === 'chat') { + return { + id: 'chat_fixture', + object: 'chat.completion', + created: 1, + model: 'fixture-model', + choices: [{ + index: 0, + message: { role: 'assistant', content: FIXTURE_TEXT }, + finish_reason: 'stop', + logprobs: null, + }], + usage: { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 }, + }; + } + + return { + id: 'response_fixture', + object: 'response', + created_at: 1, + model: 'fixture-model', + status: 'completed', + output: [{ + type: 'message', + id: 'message_fixture', + status: 'completed', + role: 'assistant', + content: [{ type: 'output_text', text: FIXTURE_TEXT, annotations: [] }], + }], + usage: { input_tokens: 1, output_tokens: 1, total_tokens: 2 }, + }; +} + +function createGatewayFixture(adapter: Adapter, { error = false, oversized = false } = {}) { + const body = error + ? { error: { message: FIXTURE_ERROR, type: 'fixture_error', code: 'fixture_error' } } + : successfulBody(adapter); + const bytes = new TextEncoder().encode(JSON.stringify(body)); + const streamState = { deliveredBytes: 0, cancelled: false, completed: false }; + let offset = 0; + const bodyStream = new ReadableStream({ + pull(controller) { + if (offset === bytes.length) { + streamState.completed = true; + controller.close(); + return; + } + const chunk = bytes.slice(offset, offset + 29); + offset += chunk.length; + streamState.deliveredBytes += chunk.length; + controller.enqueue(chunk); + }, + cancel() { + streamState.cancelled = true; + }, + }, { highWaterMark: 0 }); + + const expectedUrl = `${GATEWAY_BASE}/${adapter === 'chat' ? 'chat/completions' : 'responses'}`; + const fetchFixture = vi.fn(async (input, init) => { + const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url; + expect(url).toBe(expectedUrl); + expect(init?.method).toBe('POST'); + expect(JSON.parse(String(init?.body)).model).toBe('fixture-model'); + return new Response(bodyStream, { + status: error ? 400 : 200, + headers: { + 'content-type': 'application/json', + ...(oversized ? { 'content-length': String(DECLARED_OVER_LIMIT_BYTES) } : {}), + }, + }); + }); + const gateway = createOpenAI({ + baseURL: GATEWAY_BASE, + apiKey: 'synthetic-fixture-key', + fetch: fetchFixture, + }); + + return { + generate: () => generateText({ + // These are the same public adapter modes used by the command and board- + // template endpoints. No SDK parser/size helper or generation is mocked. + model: adapter === 'chat' ? gateway.chat('fixture-model') : gateway('fixture-model'), + prompt: 'Synthetic prompt; no real provider is contacted.', + maxRetries: 0, + }), + fetchFixture, + streamState, + bodyBytes: bytes.length, + }; +} + +beforeEach(() => { + vi.spyOn(globalThis, 'fetch').mockRejectedValue(new Error('Unexpected network request')); +}); + +afterEach(() => { + vi.restoreAllMocks(); +}); + +describe.each(['chat', 'responses'] as const)('actual OpenAI %s adapter response size guard', (adapter) => { + it('accepts ordinary successful streamed JSON', async () => { + const fixture = createGatewayFixture(adapter); + + const result = await fixture.generate(); + + expect(result.text).toBe(FIXTURE_TEXT); + expect(fixture.fetchFixture).toHaveBeenCalledTimes(1); + expect(fixture.streamState.deliveredBytes).toBe(fixture.bodyBytes); + expect(fixture.streamState.completed).toBe(true); + expect(globalThis.fetch).not.toHaveBeenCalled(); + }); + + it('preserves an ordinary streamed upstream JSON error', async () => { + const fixture = createGatewayFixture(adapter, { error: true }); + + await expect(fixture.generate()).rejects.toMatchObject({ + message: FIXTURE_ERROR, + statusCode: 400, + }); + + expect(fixture.fetchFixture).toHaveBeenCalledTimes(1); + expect(fixture.streamState.deliveredBytes).toBe(fixture.bodyBytes); + expect(fixture.streamState.completed).toBe(true); + expect(globalThis.fetch).not.toHaveBeenCalled(); + }); + + it.each([false, true])('rejects and cancels declared oversized streamed JSON before reading (error=%s)', async (error) => { + const fixture = createGatewayFixture(adapter, { error, oversized: true }); + + await expect(fixture.generate()).rejects.toSatisfy((caught: unknown) => { + expect(APICallError.isInstance(caught)).toBe(true); + const cause = (caught as APICallError).cause; + expect(DownloadError.isInstance(cause)).toBe(true); + expect((cause as DownloadError).message).toContain('exceeded maximum size'); + return true; + }); + + expect(fixture.fetchFixture).toHaveBeenCalledTimes(1); + expect(fixture.streamState.deliveredBytes).toBe(0); + expect(fixture.streamState.cancelled).toBe(true); + expect(fixture.streamState.completed).toBe(false); + expect(globalThis.fetch).not.toHaveBeenCalled(); + }); +}); diff --git a/docs/qa/v0.8/ai-response-limit/README.md b/docs/qa/v0.8/ai-response-limit/README.md new file mode 100644 index 0000000..ce2fe05 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/README.md @@ -0,0 +1,60 @@ +# AI provider JSON response-reader verification + +Baseline: `63efb43fe37ddc312a9b76b7ee1f875901389e7f` (PR #41), October 2, 2026. Candidate branch: `codex/gauntlet-ai-response-limit`. Changes are limited to root AI dependencies, one actual-adapter regression test, and this evidence. Application endpoints and MCP dependencies are unchanged. + +The application's authenticated command and board-template endpoints call `generateText` through OpenAI Chat and Responses adapters configured for the Vercel AI Gateway. Their old `@ai-sdk/provider-utils` JSON/error readers are affected by [GHSA-866g-f22w-33x8](https://github.com/advisories/GHSA-866g-f22w-33x8). The upstream response is not a request-selected URL; this verification does not establish attacker control of a production gateway response. + +The candidate preserves caret declarations for `ai` 6.0.214 and `@ai-sdk/openai` 3.0.77. Its lock resolves provider-utils 4.0.33, gateway 3.0.139, provider 3.0.12, OIDC 3.2.0 and eventsource-parser 3.1.1. These seven resolved package changes belong to the reviewed AI chain. No override or bulk dependency update is included. + +## What the patch bounds + +The [maintainer backport](https://github.com/vercel/ai/commit/b30e43a) routes successful JSON and error-body reads through the bounded response reader and cancels a body rejected by its declared size. The reader's default is **2 GiB** (`2147483648` bytes). This is the upstream SDK limit, not a small application memory cap. The public `createOpenAI` and `generateText` settings inspected for these versions provide no supported lower JSON-response byte limit; `experimental_download` concerns files in prompts. No custom runtime fetch wrapper is added. + +The test advertises `Content-Length: 2147483649` while supplying a small valid JSON body in a real chunked `ReadableStream`. The declaration intentionally exceeds the actual fixture body. It proves the early header check without allocating or transferring 2 GiB. It does not prove cumulative rejection for a response without that header, or that a function can safely buffer the SDK's default maximum. + +## Actual-adapter before and after + +[`ai-provider-response-limit.test.ts`](../../../../api/_lib/__tests__/ai-provider-response-limit.test.ts) uses the public `createOpenAI` and `generateText` path in both adapter modes used by the endpoints. Only transport is replaced with an injected synthetic gateway fetch. The SDK's parsers, error handlers, bounded reader and generation remain real. Global fetch rejects unexpected network use, retries are disabled, and every case verifies one injected fetch and no global fetch. + +| Gate | Baseline dependency tree | Candidate dependency tree | +| --- | --- | --- | +| Ordinary successful streamed JSON, Chat and Responses | 2 passed | 2 passed | +| Ordinary streamed JSON errors retain message and HTTP status | 2 passed | 2 passed | +| Declared oversized success is rejected before body consumption | 2 expected failures: ordinary generation resolved | 2 passed | +| Declared oversized error is rejected for size before consumption | 2 expected failures: no DownloadError cause | 2 passed | +| Total | 4 passed, 4 expected failures | 8 passed | + +All four candidate guard cases assert that an `APICallError` contains the SDK `DownloadError`, zero bytes were delivered, the unread stream was cancelled, and it did not complete. The ordinary controls consume all small fixture bytes and complete. The exact same test SHA-256 was used for both dependency trees. No fixture correction or test relaxation was needed between runs. + +Both trees were installed only in this isolated worktree with a private npm cache, no node_modules symlink, and install scripts disabled. Node 25.6.0, npm 11.8.0 and Vitest 4.1.4 were used. The focused command was identical apart from the report destination: + +```sh +npm ci --ignore-scripts --no-audit --no-fund --cache /private/tmp/zeroboard-ai-response-limit-npm-cache +./node_modules/.bin/vitest run api/_lib/__tests__/ai-provider-response-limit.test.ts --maxWorkers=1 --reporter=default --reporter=json --outputFile.json= +``` + +The baseline package files were copied from the base commit, and the prepared candidate package files were restored before its installation. [baseline.json](baseline.json) and [candidate.json](candidate.json) retain every case's result; [receipt.json](receipt.json) records source/lock hashes, exact installed versions and log hashes. Raw logs are retained outside the repository in `outputs/gauntlet/eleventh-ai-response-limit-*-test.log`. + +## Node 20 compatibility gates + +The next released gates used Node **20.20.2**, matching the root-provided CI runtime, with the same private candidate node_modules. All 33 cases across the new adapter regression, existing command-resolution tests and existing AI-assistant tests passed with one worker. Nonincremental app and API/node TypeScript checks and ESLint on the new test passed. + +The production build imported the original `vite.config.ts`, retaining its plugins and settings while assigning a private cache/output directory. It used disposable Supabase URL/public-key values, transformed 2,403 modules and completed in 11.54 seconds. It printed the existing Browserslist age notice and large-chunk advisory; no unrelated update or chunk refactor was made. Build artifact hashes and the exact commands are in [receipt.json](receipt.json). + +```sh +NODE20=/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node +$NODE20 node_modules/vitest/vitest.mjs run api/_lib/__tests__/ai-provider-response-limit.test.ts api/_lib/__tests__/resolve-commands.test.ts src/components/ai/__tests__/AIAssistant.test.tsx --maxWorkers=1 +$NODE20 node_modules/typescript/bin/tsc --project tsconfig.app.json --incremental false --noEmit +$NODE20 node_modules/typescript/bin/tsc --project tsconfig.node.json --incremental false --noEmit +$NODE20 node_modules/eslint/bin/eslint.js api/_lib/__tests__/ai-provider-response-limit.test.ts +``` + +[compatibility.json](compatibility.json) records all 33 case results. This candidate check supplements the unchanged Node 25 before/after proof above; the two runtime scopes remain explicit. + +## Refreshed production audit + +`npm audit --omit=dev --json` with the private cache removed exactly the four AI-family affected package nodes: `ai`, `@ai-sdk/openai`, `@ai-sdk/gateway` and `@ai-sdk/provider-utils`. The affected-node total fell from 10 to 6, with no added or changed remaining findings. [audit.json](audit.json) and [audit-diff.json](audit-diff.json) retain the public results and comparison. Audit exit code remains 1 because the existing Lodash, React Router and Resend/Svix/UUID findings remain; this is not a claim of zero production advisories. + +Those remaining package versions and application code are unchanged. The earlier source assessment found no application use of the affected Lodash template/path operations or UUID output-buffer APIs, no Framework/RSC/SSR router deployment, and no untrusted application navigation/redirect target matching the router advisories. Their findings are preserved for separate review rather than folded into this patch. The audit comparison establishes removal of the scoped AI advisory, not proof against every possible dependency exposure. + +Full unit, broad browser and MCP suites remain held for the separate shared-host gate. No live AI request, production credential, UI verification or deployment is claimed. diff --git a/docs/qa/v0.8/ai-response-limit/audit-diff.json b/docs/qa/v0.8/ai-response-limit/audit-diff.json new file mode 100644 index 0000000..1b85f13 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/audit-diff.json @@ -0,0 +1,40 @@ +{ + "before": { + "info": 0, + "low": 4, + "moderate": 3, + "high": 3, + "critical": 0, + "total": 10 + }, + "after": { + "info": 0, + "low": 0, + "moderate": 3, + "high": 3, + "critical": 0, + "total": 6 + }, + "removedPackageNodes": [ + "@ai-sdk/gateway", + "@ai-sdk/openai", + "@ai-sdk/provider-utils", + "ai" + ], + "addedPackageNodes": [], + "remainingChangedPackageNodes": [], + "remainingPackageNodes": [ + "lodash", + "react-router", + "react-router-dom", + "resend", + "svix", + "uuid" + ], + "packageHashes": { + "package.json": "d861c93b64a2d769a403d93ad1601d83e82bb31c01ea4e53cfb8b328b69ec18b", + "package-lock.json": "9c79e68c03958a2c5d40fda9a180ee705024295e1f8ccfc1acc9a77d7999ea95" + }, + "auditExitCode": 1, + "assessment": "The four AI-family nodes are removed; six existing unrelated package nodes remain. No new findings appeared. Prior source reachability assessment applies because the application and these packages are unchanged. The nonzero audit result is not a zero-vulnerability claim and does not negate the scoped AI advisory removal." +} diff --git a/docs/qa/v0.8/ai-response-limit/audit.json b/docs/qa/v0.8/ai-response-limit/audit.json new file mode 100644 index 0000000..ddc05c3 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/audit.json @@ -0,0 +1,386 @@ +{ + "auditReportVersion": 2, + "metadata": { + "vulnerabilities": { + "info": 0, + "low": 0, + "moderate": 3, + "high": 3, + "critical": 0, + "total": 6 + }, + "dependencies": { + "prod": 294, + "dev": 460, + "optional": 53, + "peer": 8, + "peerOptional": 0, + "total": 753 + } + }, + "vulnerabilities": { + "lodash": { + "name": "lodash", + "severity": "high", + "isDirect": false, + "via": [ + { + "source": 1115806, + "name": "lodash", + "dependency": "lodash", + "title": "lodash vulnerable to Code Injection via `_.template` imports key names", + "url": "https://github.com/advisories/GHSA-r5fr-rjxr-66jc", + "severity": "high", + "cwe": [ + "CWE-94" + ], + "cvss": { + "score": 8.1, + "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H" + }, + "range": ">=4.0.0 <=4.17.23" + }, + { + "source": 1115810, + "name": "lodash", + "dependency": "lodash", + "title": "lodash vulnerable to Prototype Pollution via array path bypass in `_.unset` and `_.omit`", + "url": "https://github.com/advisories/GHSA-f23m-r3pf-42rh", + "severity": "moderate", + "cwe": [ + "CWE-1321" + ], + "cvss": { + "score": 6.5, + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L" + }, + "range": "<=4.17.23" + }, + { + "source": 1120370, + "name": "lodash", + "dependency": "lodash", + "title": "Lodash has Prototype Pollution Vulnerability in `_.unset` and `_.omit` functions", + "url": "https://github.com/advisories/GHSA-xxjr-mmjv-4gpg", + "severity": "moderate", + "cwe": [ + "CWE-1321" + ], + "cvss": { + "score": 6.5, + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L" + }, + "range": ">=4.0.0 <=4.17.22" + } + ], + "effects": [], + "range": "<=4.17.23", + "nodes": [ + "node_modules/lodash" + ], + "fixAvailable": true + }, + "react-router": { + "name": "react-router", + "severity": "high", + "isDirect": false, + "via": [ + { + "source": 1120063, + "name": "react-router", + "dependency": "react-router", + "title": "React Router's vendored turbo-stream v2 allows arbitrary constructor invocation via TYPE_ERROR deserialization leading to Unauth RCE", + "url": "https://github.com/advisories/GHSA-49rj-9fvp-4h2h", + "severity": "high", + "cwe": [ + "CWE-502" + ], + "cvss": { + "score": 8.1, + "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H" + }, + "range": ">=7.0.0 <=7.14.1" + }, + { + "source": 1120066, + "name": "react-router", + "dependency": "react-router", + "title": "React Router vulnerable to XSS in unstable RSC redirect handling via javascript: redirect targets", + "url": "https://github.com/advisories/GHSA-8646-j5j9-6r62", + "severity": "high", + "cwe": [ + "CWE-79" + ], + "cvss": { + "score": 8, + "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:H/A:N" + }, + "range": ">=7.7.0 <7.13.2" + }, + { + "source": 1120069, + "name": "react-router", + "dependency": "react-router", + "title": "React Router vulnerable to DoS via unbounded path expansion in __manifest endpoint", + "url": "https://github.com/advisories/GHSA-8x6r-g9mw-2r78", + "severity": "high", + "cwe": [ + "CWE-400" + ], + "cvss": { + "score": 7.5, + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" + }, + "range": ">=7.0.0 <7.15.0" + }, + { + "source": 1120081, + "name": "react-router", + "dependency": "react-router", + "title": "React Router vulnerable to Denial of Service via reflected user input in single-fetch", + "url": "https://github.com/advisories/GHSA-rxv8-25v2-qmq8", + "severity": "high", + "cwe": [ + "CWE-770" + ], + "cvss": { + "score": 7.5, + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" + }, + "range": ">=7.0.0 <7.14.0" + }, + { + "source": 1120807, + "name": "react-router", + "dependency": "react-router", + "title": "React Router: Potential CSRF via PUT/PATCH/DELETE document requests", + "url": "https://github.com/advisories/GHSA-84g9-w2xq-vcv6", + "severity": "low", + "cwe": [ + "CWE-352" + ], + "cvss": { + "score": 3.1, + "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:L/A:N" + }, + "range": ">=7.12.0 <7.15.1" + }, + { + "source": 1124268, + "name": "react-router", + "dependency": "react-router", + "title": "React Router: Open redirect via backslash in and useNavigate (CVE-2025-68470 bypass)", + "url": "https://github.com/advisories/GHSA-wrjc-x8rr-h8h6", + "severity": "moderate", + "cwe": [ + "CWE-601" + ], + "cvss": { + "score": 0, + "vectorString": null + }, + "range": ">=6.0.0 <7.18.0" + }, + { + "source": 1124271, + "name": "react-router", + "dependency": "react-router", + "title": "React Router: RSCErrorHandler Missing Protocol Validation (XSS)", + "url": "https://github.com/advisories/GHSA-h8fp-f39c-q6mh", + "severity": "moderate", + "cwe": [ + "CWE-79" + ], + "cvss": { + "score": 6.9, + "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:C/C:H/I:L/A:N" + }, + "range": ">=7.11.0 <7.18.0" + }, + { + "source": 1124272, + "name": "react-router", + "dependency": "react-router", + "title": "React Router: Arbitrary Constructor Injection via deserializeErrors() in React Router SSR Hydration", + "url": "https://github.com/advisories/GHSA-337j-9hxr-rhxg", + "severity": "moderate", + "cwe": [ + "CWE-470" + ], + "cvss": { + "score": 6.1, + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N" + }, + "range": ">=6.4.0 <7.18.0" + }, + { + "source": 1124276, + "name": "react-router", + "dependency": "react-router", + "title": "React Router: Unauthenticated Denial of Service via Inefficient Route Matching", + "url": "https://github.com/advisories/GHSA-chx6-hx7r-mcp5", + "severity": "high", + "cwe": [ + "CWE-400", + "CWE-407" + ], + "cvss": { + "score": 0, + "vectorString": null + }, + "range": ">=7.0.0 <7.18.0" + }, + { + "source": 1136304, + "name": "react-router", + "dependency": "react-router", + "title": "React Router's same-origin redirect with path starting // causes open redirect via protocol-relative URL reinterpretation", + "url": "https://github.com/advisories/GHSA-2j2x-hqr9-3h42", + "severity": "moderate", + "cwe": [ + "CWE-601" + ], + "cvss": { + "score": 0, + "vectorString": null + }, + "range": ">=7.0.0 <7.14.1" + }, + { + "source": 1138769, + "name": "react-router", + "dependency": "react-router", + "title": "React Router: RSC Mode CSRF Bypass Allows Action Execution Before 400 Response", + "url": "https://github.com/advisories/GHSA-qwww-vcr4-c8h2", + "severity": "high", + "cwe": [ + "CWE-352" + ], + "cvss": { + "score": 0, + "vectorString": null + }, + "range": ">=7.12.0 <7.18.2" + }, + { + "source": 1193653, + "name": "react-router", + "dependency": "react-router", + "title": "React Router has stored XSS via unescaped Location header in prerendered redirect HTML", + "url": "https://github.com/advisories/GHSA-f22v-gfqf-p8f3", + "severity": "moderate", + "cwe": [ + "CWE-79" + ], + "cvss": { + "score": 5.4, + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N" + }, + "range": ">=7.5.1 <7.13.2" + } + ], + "effects": [ + "react-router-dom" + ], + "range": "6.0.0 - 7.18.1", + "nodes": [ + "node_modules/react-router" + ], + "fixAvailable": true + }, + "react-router-dom": { + "name": "react-router-dom", + "severity": "high", + "isDirect": true, + "via": [ + "react-router" + ], + "effects": [], + "range": "7.0.0-pre.0 - 7.14.1", + "nodes": [ + "node_modules/react-router-dom" + ], + "fixAvailable": true + }, + "resend": { + "name": "resend", + "severity": "moderate", + "isDirect": true, + "via": [ + "svix" + ], + "effects": [], + "range": "6.2.0-canary.0 - 6.12.2", + "nodes": [ + "node_modules/resend" + ], + "fixAvailable": true + }, + "svix": { + "name": "svix", + "severity": "moderate", + "isDirect": false, + "via": [ + "uuid" + ], + "effects": [ + "resend" + ], + "range": "1.68.0 - 1.91.1", + "nodes": [ + "node_modules/svix" + ], + "fixAvailable": true + }, + "uuid": { + "name": "uuid", + "severity": "moderate", + "isDirect": true, + "via": [ + { + "source": 1119441, + "name": "uuid", + "dependency": "uuid", + "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided", + "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq", + "severity": "moderate", + "cwe": [ + "CWE-787", + "CWE-1285" + ], + "cvss": { + "score": 7.5, + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N" + }, + "range": "<11.1.1" + }, + { + "source": 1119442, + "name": "uuid", + "dependency": "uuid", + "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided", + "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq", + "severity": "moderate", + "cwe": [ + "CWE-787", + "CWE-1285" + ], + "cvss": { + "score": 7.5, + "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N" + }, + "range": ">=13.0.0 <13.0.1" + } + ], + "effects": [ + "svix" + ], + "range": "<=11.1.0 || 13.0.0", + "nodes": [ + "node_modules/svix/node_modules/uuid", + "node_modules/uuid" + ], + "fixAvailable": true + } + } +} diff --git a/docs/qa/v0.8/ai-response-limit/baseline.json b/docs/qa/v0.8/ai-response-limit/baseline.json new file mode 100644 index 0000000..7a68289 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/baseline.json @@ -0,0 +1,54 @@ +{ + "phase": "baseline", + "totalTests": 8, + "passed": 4, + "failed": 4, + "exitCode": 1, + "success": false, + "cases": [ + { + "name": "actual OpenAI chat adapter response size guard accepts ordinary successful streamed JSON", + "status": "passed", + "durationMs": 44.45433300000002 + }, + { + "name": "actual OpenAI chat adapter response size guard preserves an ordinary streamed upstream JSON error", + "status": "passed", + "durationMs": 4.267000000000053 + }, + { + "name": "actual OpenAI chat adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=false)", + "status": "failed", + "durationMs": 8.715125000000057, + "failureSummary": "Error: promise resolved \"DefaultGenerateTextResult{ \u2026(3) }\" instead of rejecting" + }, + { + "name": "actual OpenAI chat adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=true)", + "status": "failed", + "durationMs": 2.8113329999999905, + "failureSummary": "Error: expected false to be true // Object.is equality" + }, + { + "name": "actual OpenAI responses adapter response size guard accepts ordinary successful streamed JSON", + "status": "passed", + "durationMs": 9.130917000000068 + }, + { + "name": "actual OpenAI responses adapter response size guard preserves an ordinary streamed upstream JSON error", + "status": "passed", + "durationMs": 1.52312500000005 + }, + { + "name": "actual OpenAI responses adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=false)", + "status": "failed", + "durationMs": 3.0439999999999827, + "failureSummary": "Error: promise resolved \"DefaultGenerateTextResult{ \u2026(3) }\" instead of rejecting" + }, + { + "name": "actual OpenAI responses adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=true)", + "status": "failed", + "durationMs": 1.5863330000000815, + "failureSummary": "Error: expected false to be true // Object.is equality" + } + ] +} diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/README.md b/docs/qa/v0.8/ai-response-limit/browser-integration/README.md new file mode 100644 index 0000000..1039e61 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/browser-integration/README.md @@ -0,0 +1,7 @@ +# Compiled integrated browser check + +The SDK candidate was merged with v0.8 at `44458fec` before building. This fresh, immutable compiled bundle passed 18 desktop/mobile AI draft and Timeline cases: Stay/Leave, hidden draft and sign-out retry, SDK account replacement, composing Enter, Timeline IME, recurring keyboard activation, and downgrade copy/no-write/close behavior. One worker, zero retries. + +The ten screenshots are actual disposable compiled browser fixtures. They show inherited UI behavior after the SDK integration, not a live provider response or production account. Root visually inspected both AI warning sizes and the desktop Timeline warning; the browser assertions check the behavior. + +An initial private preview command retained an extra npm separator and exited before test execution by selecting default `dist`. Its failed-start log is preserved. Correcting only that harness command allowed the single actual18-case gate to run. Source snapshots are equal before/after; the receipt records all41 immutable compiled artifact hashes and all screenshot/log/harness hashes. diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/after-browser-source.json b/docs/qa/v0.8/ai-response-limit/browser-integration/after-browser-source.json new file mode 100644 index 0000000..3718a72 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/browser-integration/after-browser-source.json @@ -0,0 +1,374 @@ +{ + ".claude-plugin/marketplace.json": "c50d34ff6091a4cd1a22f4809c2d7c5e21109ac92c77c5a77734cce9e2e5de9a", + ".env.example": "be86c3929ac827aaadf8f7d8e27b6ddff3fe3d375c581c8729bb1f8f62e85f8b", + ".github/CODEOWNERS": "0d49181962b1615a21af81bade5f6840129b4e3e906393e765979aa927442896", + ".github/ISSUE_TEMPLATE/bug_report.md": "d3bb803d32cb7d93caebc8cb2f78608cb1f947dce864b53ed2b5bcdee7a13091", + ".github/ISSUE_TEMPLATE/config.yml": "5ed05fbdc4516b94957bc161461d8889c4008afbe6f2ad344c6cb578b909c38e", + ".github/ISSUE_TEMPLATE/feature_request.md": "84ccab69e2f251ad4930cc86cf0a15cdbf6277982fa69270265ca741018b2a75", + ".github/pull_request_template.md": "eed0496b2c2a8c4ac7202299207f4a840e5c6d606f19cc278908ab85cad4d069", + ".github/workflows/ci.yml": "4446575d200e5f81f067c86b0d3c1f60b0e7fa43c9aaf7f09884b60df38307c2", + ".github/workflows/connector-ui.yml": "413d033267af14ff84401987a33e86d4232e7be96a1094f6bdc2c1c24f195781", + ".gitignore": "d207dbb3b0c8de6a3e85ef515b61728a2fa559dc387129458e7b816254a59214", + "CONTRIBUTING.md": "41d382190fb3617d1e25f5d0be017cc575a3aea92b91441fa4ef480124a286ec", + "LICENSE": "00898b990be80050d269061ce2432adbf3042d40f9bd692d350e735e3e92413d", + "README.md": "cfaed875cedf4aa025c3df25e82b0bcba646fe090d9ca0b2e5f8476f26d2ffca", + "SECURITY.md": "8e41f572376effc7792e0f5864573e3f5857460ec8c1a2ac8ae65d7950876b8b", + "UI-Design-References.md": "39a8c6d4f42441f493aaa5d6ed154bfa935fa9eb101cdc899b8f0b8b548683fd", + "api/_lib/__tests__/ai-provider-response-limit.test.ts": "9442ee496fa6a22374585abaf5365d497af454783d4b4af5a1db49eb30022d14", + "api/_lib/__tests__/connector-config.test.ts": "37773357e588dfe8048b20cfa120340f4168adf78aa3cf4a6399de2238e2d21c", + "api/_lib/__tests__/connector-readiness.test.ts": "3d48d9ff7b1f2d5c14062435150b4880e8836ca135b0e32569289c661243a142", + "api/_lib/__tests__/connector-sql.test.ts": "ee4fa4666c11c04071fa4fb73fde21cbd767eea65391290cd17733690f7781e8", + "api/_lib/__tests__/connector.test.ts": "f7f843c10132b4ea1c349595ba4d67d8e9bdefcdf8dd3c2a5c537ef1dd5ac743", + "api/_lib/__tests__/fixtures/database-leaf.pem": "dc523af50e63e6560330dbb85c8a1cee1aad67cdc20fc884df7a62b7e6367422", + "api/_lib/__tests__/fixtures/supabase-database-ca.pem": "700723581420dd1ac98fd7e9ac529f0ef210eadcaf87fc868a3ad7d114c2f3b7", + "api/_lib/__tests__/resolve-commands.test.ts": "55fdf398c9ade929a2547b59bf60c7ff2f1a0e3d59555912ae4a906638d37296", + "api/_lib/auth.ts": "c653507453b32b783f20aa3ab36185a0a60c1825184fc92e92be30fc1b1f7978", + "api/_lib/board-core.ts": "c52f49ff81456ef875d42ceee8bf2636d800672cd2fe1bd1231442f4d8a9ad57", + "api/_lib/connector-config.ts": "ba9638b60bef77511ec098f572d6fb7b1668b66931ad41474e78a2fbb658d789", + "api/_lib/connector-runtime.ts": "89f955901c3a7c849fb20e8f2356a1fc8099ddf3ce8251d71a067b05bfb592be", + "api/_lib/connector-sql.ts": "467174f4298ea29b177271c13de5d0ddbea18888f4002a7002b784322c886a0b", + "api/_lib/connector-vault.ts": "e1c78fc671f657d8f0bb93a2f1736d05136c6f43644ba270da0aa3cc31732711", + "api/_lib/resolve-commands.ts": "af04a344fe47c5a246f7d4a1a135dbac4335a9a65d9ea33803a16c02d620b36d", + "api/admin/check.ts": "7b9c9b29bd556682aef7491426d53f99ffaaaf9ad2151d486969ef95a8defa6c", + "api/admin/stats.ts": "fd903ae24cf4bcf92fc1ee4c69c77d70b9ed3c398f0ab76c393b16fcfe8841b1", + "api/ai/board-template.ts": "830c73fd8d5b0ad1203d960128bea631ca2067b929c4c20d0edd404febe310af", + "api/ai/command.ts": "eb6e0eaae0e55f54683af9f4fb7057c640f9849fdc5392065fc90099571bfc61", + "api/ai/usage.ts": "7f81b086ecbe8bac1edb015886bcc8d1a821ac1620178dbfa34dfe0860a17ab4", + "api/connector.ts": "b38719fa05e779d32b33f934466ebb8b67f6133896eb18f512ebf1389cac3562", + "api/feedback/submit.ts": "6d3a26d4fd13d8b9c90aa438a146eb758405704d19d857cf7767903dcfd420eb", + "api/invite/__tests__/send.test.ts": "27ce146ecb9bc779b0cec63d461b7f3cef424796b8fd0ec9ba19f1aac1899059", + "api/invite/send.ts": "b8c659c36303149abba7a55a2800c5325f23872692e62ebf06d5a1a345554a3b", + "api/stripe/check-subscription.ts": "397c8be5de31834422f45e1ee1b7b4e49ebba833a9be874f9e3bcf33e1669990", + "api/stripe/create-checkout.ts": "7caf5cc2ceb0176c1e18d40f678cc654301582f688876fcc2f8c535184f17674", + "api/stripe/create-portal.ts": "9f9fb52cf3abfe18e74b388e4bf2cd511ec9b734af749899f14fb2d19f210c95", + "api/stripe/webhook.ts": "ecf3c23e71ac19ffa8bfe996b431c68a7d8668fd8af468e0679aa86bd9477552", + "codex-plugin/README.md": "a17fdb6016b31f8a50b36d82b2cadce8923a7ece66831dca7236eb1ba533261d", + "codex-plugin/mcp.json": "d3a66fccfaed9a29691664ed797d4363bd19800439f47b8f38430f99c94d5a72", + "codex-plugin/plugin.json": "6046ee920eef812a3200611a8068ffc7abaea2c1f6e9d1d7fcc433fef7621f2b", + "codex-plugin/scripts/serve.mjs": "5a6da6b18d65a6f7723e3c3fd2584365a5c9622aa4723a5aeecfa8fddb75894c", + "codex-plugin/skills/meeting-actions/SKILL.md": "c5a624d0e80cffc4a8380cc6aae77954c482897c5b69f705089eb02305678a41", + "codex-plugin/skills/standup/SKILL.md": "c65087e2498114679ba4f7d89ec371f52e19d385b43b34339aa11e70ee79bb00", + "codex-plugin/skills/triage/SKILL.md": "630e3a0b17309776ccc5115db8b29119e4ea3a24060c20e50736e9ce7a364b6d", + "components.json": "22643b642f17cd817ec94d8439a272dac28119af0aebf8219a96ac1c2f4c61dd", + "eslint.config.js": "6f32697340de8096ec4166743f659cb36f1d48a4595d636f6c49fab904cb367d", + "index.html": "827dc4841dc88a4ecb32cadffd24cbc001f134bb564ef3ad329a7e58b1525dc6", + "info.md": "9c99671a0fe27f9c0e575560c886ae290651b8833b8e30d70a50d27c3e55209f", + "mcp-server/HOSTED.md": "5869513e66b9fc718c96247fb74458880c9fc5ff701963ddd49ba1515727f8a6", + "mcp-server/README.md": "b835faad804e5b25537f713b7333874b982d4e4b5fcf130c53339ead5dc79ad4", + "mcp-server/package-lock.json": "5abb726bb26520172082aae09ff06d83a449d2ab3c02687b540ad5fe1bd32df0", + "mcp-server/package.json": "253833b8c81e496dd83cb4ae414cc24303ef7d4277ccc87be082f8f8899fdb83", + "mcp-server/src/ai.ts": "b6fd6c20e2db4653a6f7737c657fd03b4d156351b4006f7b4058a4744e53eec1", + "mcp-server/src/auth.ts": "43db86173655eda0a1d17a70eb4f43c9a0db587db836ad8063571eaa5cf25ea6", + "mcp-server/src/board-data.ts": "bbac2dc43d1beb20f7cb07e028046d3df9eb87884d984fdba2c9d4f65657a034", + "mcp-server/src/calendar-date.ts": "e29d55f37227c348a7f07dc54c2d51012b584dd5669bc4fc51b302b1e5de9aad", + "mcp-server/src/config.ts": "e172d8d267c9bdeb05420732230142b006629a2ed222d3369bc0b4a4d2811ac5", + "mcp-server/src/credentials.ts": "cd40018ab4f837de3ce7ca7b3ca1a62f6ced8f2bcd6beed336622f5342bfe0e3", + "mcp-server/src/hosted-account.ts": "4166d8d443d9fe0fbe07a4d90a8cbc9f5e605f761c0f3621079af9d9b10d06cb", + "mcp-server/src/http-body.ts": "0b6fac7c3c468b5737547d7e4dbe34d951eebaf71d9f9fd8ccb35d673a9b8ba6", + "mcp-server/src/http.ts": "244d6fe6a62a6b9b4f06e023887a9a8db49d033b3fba2b91d66aa39868151766", + "mcp-server/src/index.ts": "a91c20cc06cb800858a3b5bbd4425862e69cee3d074bfc8d6b992c621395627b", + "mcp-server/src/meeting.ts": "a0d58f8cf758593cfc259c5546895ab06a75ea674a79933564d8c664f22041c3", + "mcp-server/src/node-client.ts": "9d0ad1e4fd4fcaca7dd4b9bbcdccc23665ffdfff6d65ab6937aa94a604f6706c", + "mcp-server/src/oauth-callback.ts": "7c92f10d5210c2db071e836e79278ae0bf62d7c7284ff96bd95b084e61e30a45", + "mcp-server/src/oauth-store.ts": "a336444c2a02ced5c818f9908ddc5eff45fa0340b51b1e310afd036312079f84", + "mcp-server/src/oauth.ts": "7fb75edb0c68d6508ce763aa70d10fc74c31a05556d81b0d0c7d19ad1006e575", + "mcp-server/src/openai-server.ts": "f26c16f3b48f13f7ce5f2f46cae69acd8ac58420c92e218008cceeacbb3b357d", + "mcp-server/src/plugin-entry.ts": "bae79087a43e5723e6b4d100ac890ec7ebeb2fcff1171c1e7557351a0faa1240", + "mcp-server/src/recurrence-identity.ts": "30f2394be11599dba905ac692fec74fa451e45ef95e242940f07a6cd0798546c", + "mcp-server/src/recurrence-schema.ts": "2aa27e54be366a7ccfd43f668ac0a9fafe2d58e0f2bc9bca4798cc1df302ffd8", + "mcp-server/src/recurrence.ts": "28fc66043d501d09f356d12d28d01a6d1cdcfdaee0a165eee0b7b286537fd0ac", + "mcp-server/src/server.ts": "4d9b396ff24ad3b419ceb75b1352d046650c0348a354625dc47b97b71ee50760", + "mcp-server/src/smoke.ts": "6cefbd9877482c5c4114e7cca08397e9b05c82645d79a884a0bfc194aa7484e6", + "mcp-server/src/supabase.ts": "4f56637739600a971d9fb63062912ad77c32299d266ea4bd36dcd7b26696b0bb", + "mcp-server/src/target-date-schema.ts": "cf725f2dda6bed0da5785437f84cd01fe75a4db639f3a759d8f4446eddbca0d6", + "mcp-server/src/types.ts": "ed528070f3146305f793c4925f86e2d1b3287a166fe24d9822fac5c6d020bec4", + "mcp-server/test/board-data.test.mjs": "15d89b8471b94772c36b8279eeabcc0b5446b0935295589f3c776f078275c8f2", + "mcp-server/test/calendar-date.test.mjs": "a96c0b4572b146fb44e503e9f68dcc617bc972b23289b68cb7bffb97a71b81f7", + "mcp-server/test/cli-options.test.mjs": "df8d29342a60a85de4ed4c7f18b5c5444be69e82afc3a3747fb08510c1973308", + "mcp-server/test/config-security.test.mjs": "55739babafb7ecd92bb9aefbdbd835a533e86f695d73793f8e91a3b800d73294", + "mcp-server/test/connector-cleanup.test.mjs": "cbf5e64d2f5566324de7718c6fd7f4aba12bfa7a3ced0426d693b4e8b90e917c", + "mcp-server/test/credentials-project.test.mjs": "9db0056669f6d76727aa363878f6ffffaa009f624cd5910aeba13e29cbdee98d", + "mcp-server/test/credentials.test.mjs": "bc7387a19b5aaa5f1144e79c72788780d1af30bbf37870902384e82573962a85", + "mcp-server/test/definer-privileges.test.mjs": "0f48d1074b8d4d6e229b2d2ed833d7e54ab795c6f8dcaeb91083e5be0ed7c58d", + "mcp-server/test/helpers/boards.mjs": "4db2e81d6d32d357a1b0a3b08d5f47350448a7b279b0a24811fcbfb0ad24adc4", + "mcp-server/test/live-protocol-smoke.mjs": "8c3fea7881f260ef72d000d51bc94fa55ff244f8da74fde29a8a22b80437f149", + "mcp-server/test/node-client.test.mjs": "e8eef2bc97c53cdfd78e8aa92ddb194d64f89094d31e5a480c244cc0ce55cb62", + "mcp-server/test/oauth-callback.test.mjs": "8b3038bf7b175f81ae95d277ef8434e9ffb93892f1fa6e94b496cc510e613baf", + "mcp-server/test/oauth-http.test.mjs": "113fd84cf937c87a3df65615a565562e809a89dcf69c3a16d596d5e87b59a9a6", + "mcp-server/test/oauth-store.test.mjs": "8f390fcdc2ca25d35e2841ac9d67a2e57e1126e227c2a62fa060f369d4c1e7d6", + "mcp-server/test/package.test.mjs": "64b779122fb5c2a6cddcf6e47d2d400ab3be25311d4f1af4979691c2ec9f42a1", + "mcp-server/test/plugin-launcher.test.mjs": "5994dde676bb72a8c3f14fc49b46359598692d8987dc9b9cba6f67cd310ad7f3", + "mcp-server/test/plugin.test.mjs": "3f4b9be227a016077864ae55d48f744d2dc860a274e48072e8ec1d28c6169572", + "mcp-server/test/protocol.test.mjs": "0093cd58058d97aa74b51c3323f83798752f3e627462a14465f6bc720363be79", + "mcp-server/test/recurrence.test.mjs": "7f20bb362198b4e38d01f37adc4e95ea4827d4d1de08fcb0dd355e1323a6fe48", + "mcp-server/test/rls.test.mjs": "6a607a808863e440ec82e3a5b989112815239624fc2defaedc4ac3cba018292f", + "mcp-server/test/schemas/mcp.schema.json": "6539175bfcdf43085855183e86da40ea94b166547a72b47ae9a0a390516d3acb", + "mcp-server/test/schemas/plugin.schema.json": "0a4aad95ce337878ad38802ebf0daa3fde76abe3f65400c86bcbb1ec0b3ab883", + "mcp-server/test/stdio-fixture.mjs": "2c402438d439037bd2820b546f7ba822771cf0fda93ab26cb59ec004af5c50de", + "mcp-server/test/stdio-plugin.test.mjs": "2efea624f29d9292d347bfe5bbc4053d84248ae9dec08d1c3eb422a6cce4dcfe", + "mcp-server/tsconfig.json": "78b489e258534bd41a05f1f5e430f22752615a2821150cef059d31699a16c6b7", + "media/.gitignore": "1151d360a55341695a33cc870b65d09ddf297a57ba5602d81fbf45e9709c35bf", + "media/README.md": "a87716fdb90ef00549974ff43c143658837b014784fd800dd3c7eaf05310a7dd", + "media/manifest.json": "5df56653895ce886d80ef19650c335d46e291124770b802442786f3d73e7a682", + "media/wrangler.jsonc": "578f3654b7a90c757dce52f42fbc6e8533999941d608937fa14c9d3625a470c7", + "package-lock.json": "9c79e68c03958a2c5d40fda9a180ee705024295e1f8ccfc1acc9a77d7999ea95", + "package.json": "d861c93b64a2d769a403d93ad1601d83e82bb31c01ea4e53cfb8b328b69ec18b", + "playwright.config.ts": "7a4d56457a21aa2eadbc539a9973fe86be51eeef4ffacd096201b08de3674e91", + "playwright.connector.config.ts": "274868ff19062170051b7a722c507e5dfa91fed28b2b94324c5b863c1e07ada9", + "plugin/.claude-plugin/plugin.json": "8d9ff6899c423e4feaf4986cefc97e6ed3e016113d63a337250cb37256d5f0c3", + "plugin/README.md": "101b1e61034fad200b75f58309ac81ea217ac02c01d38aa3363a658d07545b32", + "plugin/commands/zeroboard-standup.md": "22186398d99dac40d37ca357756a2144e2ec42e189dc7413d7ebd1e82e58e08f", + "plugin/commands/zeroboard-triage.md": "5ee5b8e06edcd018b8caa5357324601abe59ef1c74f4d00f53c044a0aee97edd", + "plugin/skills/transcript-to-cards/SKILL.md": "cf373a8bc45e2258b76ef86454324b43e2e0bb47e7e2cc8c17f39b44691aa874", + "postcss.config.js": "190c877db466995bf1482f4a16abd06e04a89ede3119341e2a86ff96e1737b27", + "public/android-chrome-192x192.png": "50117c38991d1f05eb547aa9fdd5310ddbc1c3c3191074974178cedba6f67b88", + "public/android-chrome-512x512.png": "8372cbeffa825e3add85147f032f25f27c394bdec8f25765ca172b904d1e26d8", + "public/apple-touch-icon.png": "bc8585046099cb1b4ed0def79c5c8965be7503da6abd47b2bb266d896b210cdc", + "public/favicon-16x16.png": "bfbf0d89f45777cd191e9469821d552a6fdd165caed3df063aaaa35069312864", + "public/favicon-32x32.png": "346c79ed3891dff343b7ea9ff401095dbe756c97f1c872408f87c242c3ecb597", + "public/favicon.ico": "b1a99af77445241f1676ddbf23fb12b3f7b59f0ca3ccda3158834b0179b31a15", + "public/logo/logo_color.svg": "471cfbd7f8e6c166e1f034b9a8a859f93b7dd0d4485a692addef37a25119ce23", + "public/logo/logo_dark_pointer.svg": "bfc85a05ebd3a97ea76a282a07ca486c9f2e781f0241fd5306995df6ec5c42cf", + "public/logo/logo_wordmark.svg": "d722e84c19e78e085cd2039c133dddc956263e7bdbfdd126da4afe03e94ba3ef", + "public/screenshots/ZeroBoardAI.gif": "10f5b724226fee0f709f004cc56328d847934a4d22677017f43e1e1430a566da", + "public/screenshots/ai-assist.png": "8dc1b38f769e288eadd1fa183083b81ac117bd7b9a1761bb24f63cd7d0a21a3e", + "public/screenshots/ai-plan-a-sprint.png": "3dd5b810495f077a2bd15b3d7203638b210ebe064f058636828e374d171584f6", + "public/screenshots/card-editor.png": "61675bb2019e0a35a6b4c260d19cf1b7bb8207576d3635c58ee03f75cbfafca2", + "public/screenshots/choose-background-color.png": "0c89279f420dbd38a8c38543ce878f46281cb1febe274cbf7fddfafb1bff24c3", + "public/screenshots/deploy-with-vercel.png": "d769ff3378e29b68f7f192c841b70b5c6ffba555907bc1d382c1514f3965a62b", + "public/screenshots/export-to-json.png": "86e7c25b6dc869b735ab5cf872f2fd59c0d8b178a475f9b7535705906ecba9ff", + "public/screenshots/kanban.png": "88d485f1d44566b0a8c15a510d0908faaaaac76d377815a8a441eec6787660ad", + "public/screenshots/save-as-template.png": "79b4c2c514e3e5337c0e548ea3182fb943335890032a9781fd2d239b879ba4c4", + "public/screenshots/sharing.png": "a1ecc503709eb34cdec2e56d5eff68499f27181a03d8e42225f699ec3499f8f2", + "public/screenshots/sign-in-auth.png": "f37d071428675266004e3567b546ebd6038c734e1c3a17554f33b5680e8895f8", + "public/screenshots/timeline.png": "9196b6a6bb5dc771e75e14eb92d77f850cb908911be409cb4c2856ffd0d09317", + "public/zeroboard-mcp-commercial.en.vtt": "0bae4a9b69406072773a28b19a7d4eb67c07a5bf4c2143dbc934e89f76542b09", + "scripts/e2e/ensure-test-user.mjs": "a61cec638ef049661419efb96e901f50825a9e0bbcc46d1ac939bfbadcea04dd", + "scripts/package-plugin.mjs": "7a303270b4e0621f932bb58fc1a110d990eaf41a24d11682da779318628a1e8a", + "src/App.css": "0cf674130f7841bd239f6803d7c5ac0a9e649e1fddf20330e5979d1f284e1119", + "src/App.tsx": "d5b6b777312d8bace0ab6b56d81ba74e405809f8aea25f00600f56cb7f5ec66f", + "src/components/ErrorBoundary.tsx": "73f32a0ff0a13f5096293e88bb8431d7fc32e55443b24b1ba92ebadd72f892c3", + "src/components/FallingCardsShower.tsx": "604c846b6a2fcfda8b7865d5992535ccf3f5f690d5f6edbef2d70402bf3101ba", + "src/components/KeyboardShortcutsHelp.tsx": "2d7a2e12a903eacbe1a6d257446d3ef1be77042cb0798975e95443c5b53cd7e7", + "src/components/__tests__/ErrorBoundary.test.tsx": "6f3d5a4ae28141fd698c2a1743e1ede75a496aab00df46c6b1f28e20cbcc8e23", + "src/components/ai/AIAssistant.tsx": "7def49c5a906a0c3d262db20ef464a10e2688b35872355a5180c892578073319", + "src/components/ai/__tests__/AIAssistant.test.tsx": "c6d345574b2e9d93b2f17a14103e8a331f412ee13b31cf10a1c0d937f6e2ac2d", + "src/components/auth/AuthProvider.tsx": "6e0b56f9549421ba7e0a2bcb5ca93d723f4e21e3f68fe50be8c5f2d363327c11", + "src/components/auth/AuthRedirect.tsx": "aa1d8ffc0b9296841a894d3d71bb42be59d7b4926bbef08fc72d41f2ee953ec4", + "src/components/auth/ProtectedRoute.tsx": "0daad38616a5ab643baf033eba7b62be87954e841c61ec848954e3545b152a17", + "src/components/auth/SignInModal.tsx": "6c69bf552d6dc269431c73bf2b869f8f16c8370ac49daddb6093997a6026e313", + "src/components/auth/UserProfile.tsx": "6e2d165f98de486abda166994cdc3075050c63621e2f19390f173ee8f42e1fee", + "src/components/auth/__tests__/AuthRedirect.test.tsx": "104a59beff2daebbd73b7ef3890e7ea4138ec3a202531a62991835d7a37ce7ed", + "src/components/auth/__tests__/SignInModal.test.tsx": "737e5a8126ae75ffefe2616fbe2c375b3cf92c4c40a2f613bb86e29d8fa88a27", + "src/components/auth/__tests__/signOut.test.tsx": "bd6566761bdae412fb6cf717b1f6bad76bc4bdc6d080a9512a5cf7a2c68e7273", + "src/components/auth/index.ts": "3480d4813664a322e16576cbacb8aa23875aeed1c7f487733e7df96a1c468166", + "src/components/billing/AIUpgradePrompt.tsx": "40c6a722fbb7feead1bce5ba30e9dcf0babc08cb13cf5d3fbb8d541de9c3e3c2", + "src/components/billing/ManageSubscription.tsx": "b71378699abd414f8b5d6bcf30344d4cf0e5343bd656f34896c241bb50469117", + "src/components/billing/UpgradeToProBanner.tsx": "a9c4863fac22b956983e63d0ad9e0c4337e1ef4659f099dccb24222dbb3257f3", + "src/components/board/ActiveCardEditor.tsx": "adf6a1ae9c6efc0f3722cc4b18e1e5334f28ef52e611908c167754cf4b35f76b", + "src/components/board/ArchiveView.tsx": "61e06ad7fb0bbda3f87300a9e332a125baf0283ab06c1b85ebd23954647ffd26", + "src/components/board/BackgroundPicker.tsx": "72d12e5f71d65fa5162bef7f06d206420ab27d53bde5a737321065f96fe4ebe7", + "src/components/board/BoardSelector.tsx": "1410f0d34aec8fbe30d76bdb6bd955c1d29b3d7bcd39527a24d461feebe62460", + "src/components/board/BoardSkeleton.tsx": "f7cbb710dbcd32da04e20602ab986754439b75edabfa97e52cb121e590f5060a", + "src/components/board/BoardSyncNotice.tsx": "3a6cbf60a658eb3cb13a38e8ba5df30006ac2a5d8ccc726bdb4f03965ef5a6ad", + "src/components/board/BoardTextDialog.tsx": "b561a3b8bb115075999c6b846b0a44cfa071e0b3ca4940142f9ae00ccade0baf", + "src/components/board/CardActionsMenu.tsx": "d69576b6ff9c836d92735cc00b2f1bcabf3b951bab663aa1f5517214803166e0", + "src/components/board/CardActivityFeed.tsx": "06c3fddec7cfbd26d53ca2fe1c8beb0be5f44a747c676ac425172e39e3dff542", + "src/components/board/CardEditor.tsx": "82a6fd8fb9f3469cfbd489479b267d892f085ef09f21ba265db7a8366fa65504", + "src/components/board/ClaudeResponseDialog.tsx": "bf8aee830655ab65f0b74ec1f08d734e0d659b9c90c625affd391c0c7ec1a3d1", + "src/components/board/CreateBoardDialog.tsx": "a9d3980bb19f1d6009b24391da6006bfc08c7dafd77dfcb74188cc0a660ed1dc", + "src/components/board/KanbanBoard.tsx": "6dbde3cc7299915f76a8c14b5080d27f23f4ab33d35a5405466cdde2d17602a8", + "src/components/board/KanbanCard.tsx": "e726502b71e1da0247d703261ef347a8553d0bf032d81fc0765140737d9aa107", + "src/components/board/KanbanColumn.tsx": "e72a04a00a8970302becdf57973181e576d6154f1f27d28bfca2905f75a55098", + "src/components/board/LabelPicker.tsx": "be2bd5840a1229ea8df4782543cbd667001063a00bc97220a61ac17b8ed50ae5", + "src/components/board/MobileBottomBar.tsx": "36f9657c9e43504a15a5c18a8548fd5f80374a569f005bf86f1f44b8b9611610", + "src/components/board/MobileColumnTabs.tsx": "b773c292e5ec0891ce6dfd0bf61b8a1ef3e804264bf6b2a99c7df464e53a1963", + "src/components/board/MobileSearchOverlay.tsx": "e06a2adb7729ff40485945c2dac52af1c05b56109375b9a6c510eb8f01ec0c6f", + "src/components/board/ReadOnlyBoard.tsx": "81cdac1ef3503b53c15d560873cb1d83e057d9dd2dea79159996553fdd96de39", + "src/components/board/ShareBoardDialog.tsx": "97f317e73429ea3777546bb8d1355909a4d94eb312b7487426538d568b2cd68a", + "src/components/board/TemplatePicker.tsx": "1a6569c9ea5d81125337ede40ac6152a1031d7c670c4efdc00c63c645758846c", + "src/components/board/ViewToggle.tsx": "dbf6c314c280b537609e9df7cd5996f0bb15dfb31957b4d26a6dd908017e8a03", + "src/components/board/__tests__/ActiveCardEditor.test.tsx": "4bdf7ae11d1beacf3ccd1ab15362de5f0a76d62eb73e6b1f2af3edc45aedaf73", + "src/components/board/__tests__/BoardSelector.test.tsx": "36ca55c8868c8e3b639e8e8d56eea2f5614ebad6cabd1960d2f7b8e057460e42", + "src/components/board/__tests__/BoardSyncNotice.test.tsx": "8656c60eda92de157ee5fc01878acf83e1fa1b4c68dca5be002ece6a5a3c6a48", + "src/components/board/__tests__/CardActivityFeed.test.tsx": "68d3ba8257d719bdfb867a4607183918301767d9a06ea4e7aae22e2a77f911cb", + "src/components/board/__tests__/CardEditor.test.tsx": "4933e8d8357eed11e715f16b73f28dfda1733fe18eaa120f4f616ef09654fdb6", + "src/components/board/__tests__/CreateBoardDialog.async.test.tsx": "c88bb74df7fe3c127555c83d338e4d179a216752ea329e6fdcf99b3a3ab0e62b", + "src/components/board/__tests__/KanbanCard.test.tsx": "8d10d9ddc8ec2715e6da5149c7bac8531696057cf04ab355956e242c4f6630c7", + "src/components/board/__tests__/ReadOnlyBoard.test.tsx": "88bd5c1fc39a85104c5750ee20bbe5d8218185437214e6e8e26c8e62afca98df", + "src/components/connectors/ConnectorSettings.tsx": "61c997d231f0cd0ec1f6b45ea9e3fac41d8882db4f76462059164e472c49d3bf", + "src/components/connectors/__tests__/connector-api.test.ts": "52fd593926568a845866e239b97ce967ec2692070f8b38983ddf7074922338f2", + "src/components/connectors/__tests__/connector-ownership.test.tsx": "c1d247164d4384bb7d84d9fa81290f6aae1b2b60e1e2be8caa1d0d2f335fb080", + "src/components/connectors/__tests__/connector-setup.test.ts": "7cd1a8207f788d7dfcbde8fe88271d3ec6da3f6ca14ec3c09a3d8551d914f1b2", + "src/components/connectors/__tests__/connector-ui.test.tsx": "d9eaf25e7a232c0e97d665dae44136611aa07137c3e29292211a6531823fbfb9", + "src/components/connectors/connector-api.ts": "63590ae57495e45bf78674b5e38bab4abfadcb7c79f2761c1137b42e0e16bd14", + "src/components/connectors/connector-setup.ts": "c0610bb44048169fb62097b5d3fae3c0bb89fbb887d270a5b195045c45ffb64c", + "src/components/layout/AppShell.tsx": "518baece9271608bb06e972d23640d8f78ad245cff6a3a0959c2283549a4f4ab", + "src/components/layout/AppToaster.tsx": "a8ff5d6eee6702bad159e26697ca2b1de9f781c40ab9f90f303a0e33245b5503", + "src/components/layout/Footer.tsx": "3e0238dce7c9a2cf68d1ca02eab93aff66286d0562da13d6c50e47ab16029b87", + "src/components/layout/LeaveBoardDialog.tsx": "a182fd75cbfbdf07b35d829dadda5acbb27b3eb34e2253b5cb0dc6a73dd76af5", + "src/components/layout/PublicHeader.tsx": "931a33d5ebd541d19e56ab25ec925ba373bae3ea9810544288200a7483dbbf58", + "src/components/layout/PublicLayout.tsx": "ec7902a3734d70d25206264342609610baf48a0d58237724cabc1a0e1c777a64", + "src/components/layout/__tests__/AppShell.test.tsx": "47c9c528666b60d5fcce98a5a79a49e5775c9b99b024bf70964887bc8dde9f68", + "src/components/timeline/TimelineView.tsx": "be2586c969c8bd1dc2923a3d1ce75021fc60d968a91b21643664c0d4981804e4", + "src/components/ui/accordion.tsx": "1e00288c7eee72380002164ea3ff7589df5d92f2f1b8c7aa5077596ef680acdb", + "src/components/ui/alert-dialog.tsx": "683cf8b6c3b0c29fb0e31f36e8c7794c63ab5b7ab431f7441ea2d478bbf9fe41", + "src/components/ui/alert.tsx": "49d8311589b810b106aada8ef7b13f70b2b1f68cfce4e1458b7f31a191f420e9", + "src/components/ui/aspect-ratio.tsx": "6a75117416aa89200cf31e8d61643b428e812f479caea857c80004b26d893e79", + "src/components/ui/avatar.tsx": "e637ab3522c01631eac2e456588ef301314e2bb7940ebf7cd96e698a868d47bc", + "src/components/ui/badge.tsx": "e7455feb113b38c59456ba29a9ec264b5ffa1daae8883866332ad637ffd57c31", + "src/components/ui/breadcrumb.tsx": "22f3f4c13ed1085c4131379bfccc6fb173a474f861636bc2736506820153aa08", + "src/components/ui/button-group.tsx": "ccbf09097f5ebf2eec86f1a96cb92e8dd39d251ebb5867394196c8b4fec68a5c", + "src/components/ui/button.tsx": "5a5c4b8b60a8a80ba7b8b5d0319be2d3c61bfd2ce4fc2a645371dee9f6db0a77", + "src/components/ui/calendar.tsx": "c8e67d15d8622135b72045d974a3234ea99f5ffcc1b981eafea8847a14ae1f12", + "src/components/ui/card.tsx": "2040cdff27cd1ed771e0ebbd15abcd73d31f2f1e4be6664bd6816fffd2a87476", + "src/components/ui/carousel.tsx": "10c5388b66d98f0c555dad2e5b89b9bc846fbc1a3de101ee8b98abc305ec2c51", + "src/components/ui/chart.tsx": "39a2fde544144e0ed0e3e7f76eb3f3988f570f849f30f62208c6f3e2fc4e3e4f", + "src/components/ui/checkbox.tsx": "a8292972a5b81eff164f621ac0bb66f4ed4419d1599e2d4901968e216574677f", + "src/components/ui/collapsible.tsx": "661444318605c90d19e47e4d21289a68b4c5f7f01782be70dafa80d3f7a4cd08", + "src/components/ui/command.tsx": "416cdc19eb9e7301b51f9665b4f1a797534769a6bb58a563808979f460b0b8a2", + "src/components/ui/context-menu.tsx": "70e547a9bececcc98adf2fbfb2cae05c99179707ab0edb1ddfb5d2de329dab42", + "src/components/ui/dialog.tsx": "761dbab032ecb18f192d5ded08bf85421b2c31c0930d321eaff4031561602015", + "src/components/ui/drawer.tsx": "0c9464ed4f95207ff6ec0b8f433f550388ea0fe57fecd36bbe100b084ee46a3e", + "src/components/ui/dropdown-menu.tsx": "ba022169876b487c849d046ac577654ab61a4cfba158305c8790c572b704ed9e", + "src/components/ui/empty.tsx": "584b491f9eb69f8041b3d3732a4d139f5af01de19a00b7a97656c7af7a78716a", + "src/components/ui/field.tsx": "e9dcb51b16e5f235bdf23a0b4a092e55c05b2bad08a83126ac675b72aae5380d", + "src/components/ui/form.tsx": "a12f73507ab613e9d797979b988a15e32d23458fc8dd4ba71b922aeee977a3b6", + "src/components/ui/hover-card.tsx": "031f6a309d87c8e42a2282fccc277dde75e373de8c93dad881582c9dc13e05d0", + "src/components/ui/input-group.tsx": "c0df02569e483db8ee86bd51b3b392a1ba62b276604d8c7ea90a9efc5faa9e25", + "src/components/ui/input-otp.tsx": "7fd7ed5273f849cde558238148ee1bbae729aa1149407c7c732b6c65906933d2", + "src/components/ui/input.tsx": "56b7fd30208addbcc2468cfda4f5bc0a55342211deaab61ee35b1c352b1622f1", + "src/components/ui/item.tsx": "6d64b756260749245b3a1f292e2aaf2774d7ec0b8bb99403eb8c1be31bd26900", + "src/components/ui/kbd.tsx": "886e04c83aaa016dfce924e461aa38aa68a9f5c83bdaedd6209dc358c32a8f22", + "src/components/ui/label.tsx": "9ec42c8a57e82311118b794318409ee02b2cebfa49ba6cce8457cff6448cd471", + "src/components/ui/menubar.tsx": "b4be4da586ce1288e8259b1e760a9e317eb0ee9183548c762d8b2a222bbdb3e5", + "src/components/ui/navigation-menu.tsx": "d71f57fe0f365541fbf5d00196b0b78a461d8c4f38d35293e5754680d93b9245", + "src/components/ui/pagination.tsx": "374ad135c3d4ff3ec080a0009cd9745cdd0e12faa89d2b0e86074f11e5127fd1", + "src/components/ui/popover.tsx": "29a217781737bbf5c430859b3de46097a44ada81c4143c2d05543d2167de0ee1", + "src/components/ui/progress.tsx": "9e36ca3f10bc56b69058d8edd342832b72c8c1b2d36cd142a0decb2445c3b724", + "src/components/ui/radio-group.tsx": "b12ca5cef859dd75b274337234bae66e413b0f97845243254a1dedcb2d7a7237", + "src/components/ui/resizable.tsx": "4634b0a700b91e5d422babc1f068b6d145b5f000c8aff62d5cfc9b5711fbff73", + "src/components/ui/scroll-area.tsx": "1c5d0b242d0513848f4bfa9b57ba7f438d9b1120617029941bfaa137196ecead", + "src/components/ui/select.tsx": "68fc754d3042f9fec3406895845e6fcc05d44f93a049478a9d3c706919100ebe", + "src/components/ui/separator.tsx": "e9dddbd8dbbc0eccd683306481b0f0bbc8e2b60ea97817416ebb9fe7fbbbdca8", + "src/components/ui/sheet.tsx": "fbe9b257fd95b9865e1aba651489899c959ed5c16cb8493fe8c2733f83b92ee1", + "src/components/ui/sidebar.tsx": "6074d8027b4bc9ea2d5eb1527a8528a7fa69df96f6261b9c6441c3980d41700f", + "src/components/ui/skeleton.tsx": "f2aea81d8baf2b621945382aabac150e3db40f20d19ac1abea7aff805f1dc33c", + "src/components/ui/slider.tsx": "640996327017c3977e3c61eee8ec55230fa0bec509d0f4b44bdc9acdd8eca138", + "src/components/ui/sonner.tsx": "a3868f2a8aafd8e2dc96b7ae145009939e9d8723cbb5a4b61d7b7d9bed9df478", + "src/components/ui/spinner.tsx": "3e6e6e8d37fb4069f8e43e55318f8db06fbc36e6c8be0096da3c9337c1c798b9", + "src/components/ui/switch.tsx": "5c19dba26a703cda3dba9ca6fc2ec0049187bcc90224c82b134a2fb5d368e80f", + "src/components/ui/table.tsx": "95e3ef5db88b3bbfb68eed12f341fb942e40ca815f4342e1d5dbc8c8d47c783d", + "src/components/ui/tabs.tsx": "e8469e599381cf021ce751c27cca3d8cb06440a45665ca9c2ef2efb0acef1fd9", + "src/components/ui/textarea.tsx": "de4e9fb0fd8e8ed10ea2e475ffe202a922ffe77e3f3edb2c517b0781447ad1b4", + "src/components/ui/toggle-group.tsx": "c63c671fe328f2c1e0d58e3df82a474e73834037c5a39a9ff566a4b3b2cf9010", + "src/components/ui/toggle.tsx": "ab2e52debb86451889ac9519dfe27daf3a86d70aa2833da8ed8f6cf3146197ff", + "src/components/ui/tooltip.tsx": "cbc12f4086448f8a307ed5fbb160f79467c84a44c48ca0dbd2c62e39a2db6f5d", + "src/hooks/__tests__/useKeyboardShortcuts.test.ts": "8fc622e2b9086d11d4f1de3759991673a4c0745b062af665c2a4e43a348294ed", + "src/hooks/__tests__/useSignOutAction.test.tsx": "10f23bb1cd16009400895e4b824cf1cd7d34703ad5dbf4bae89dc509f2bb144a", + "src/hooks/index.ts": "90cc1e84f3108e39bd5623c95b27873a932e2d2b9e5db4b4b6fb8415853a20b5", + "src/hooks/use-is-compact.ts": "368ad314e1015933a269f6fce322b24cfcdd56200d90151ef5086655d1945874", + "src/hooks/use-mobile.ts": "ad0936f84f1df79d3697bfbff9c18f8ad58431c1cbaf2359c6a853b0fcc9f28b", + "src/hooks/useAIUsage.ts": "59ef72909aa9dcf22f281910a808e9a259ad771c3b4de588e0ce76e67bfc013b", + "src/hooks/useActivityLogger.ts": "420ca7dbc66c6ee996d58c855bbca124469c9cdfcc593984ee96c3fba6931bba", + "src/hooks/useAdmin.ts": "7e14d5e5c6c3c7a1d1c8c9388042492ad1f75bb111d46ef61da1e379a86d1a1f", + "src/hooks/useAuth.ts": "e3d3ca9e160e53b06b8aa12323a2d8bebddbe94767f05535e683d082aa43a496", + "src/hooks/useBoard.ts": "0b6754a7220290ef08d4014e10be96e7fb1bdbadb6987bc45a47ee94970f922d", + "src/hooks/useBoardDialogs.ts": "384ae5b59a60b44b9fc490d3e794480e48c60dececb68f296c4e725fc4927d3f", + "src/hooks/useBoards.ts": "bc4551cf900e3b9610eb725244ed0f514449023711e51cc3a810aec77963e10d", + "src/hooks/useCards.ts": "4ba035b326f14c193b31f7ff3a90fef62fe17c02ec978aa886cf8371a6b981e4", + "src/hooks/useColumns.ts": "9a74ad014c218cf73b0597c1f0dc6a148751e8dc282740fcbb26ed045e68bf4c", + "src/hooks/useKeyboardShortcuts.ts": "af636c58a7f409b6529b76218ab796aa1e85eedaabcb178d3502ba9e361364a4", + "src/hooks/useSignOutAction.ts": "231422491ffc6d09bf9f2a1c28737122d47136b6e0383a270f022e749c780025", + "src/hooks/useSubscription.ts": "51b44796a7c66d8bda615f938e321a5376ac4e2599cc15e0cd1288f5a773a5ce", + "src/index.css": "a08b8fc4db94d4313dcc86af63febe68bf5335fc8bbd0e32edff64ac3a4f7821", + "src/lib/__tests__/apiFetch.test.ts": "14c3502dbe019ce9f0cd7b07583561626d12525a7157248c637b876ad06c8b87", + "src/lib/__tests__/auth-helpers.test.ts": "c1d07f51ed4d57140706092a03c0cf516c77642fd3d24d09266e556b7709ac76", + "src/lib/__tests__/board-io.test.ts": "c1d58408527d9b7e8aaf459917563ef188d1d7d7448533861e96fd7dc96995f2", + "src/lib/__tests__/board-merge.test.ts": "af94d29c0f770b2544295eb954a6f3c9377187a2e8b6a9f7e51a2a8143865d18", + "src/lib/__tests__/board-sync.test.ts": "5769ab0e100fe59f3836ac3d327b7e5f7137289bd19e449f72421cbf69bdc56b", + "src/lib/__tests__/calendar-date.test.ts": "25b0d56e2f43aa595782a4c8b68967b03f8fc998c908e0e85c5fbf285119b468", + "src/lib/__tests__/ci-guard.test.ts": "a9570842782b2c1cb368508a9640b9e7dc66018c9d9f15913e7ebadca942953e", + "src/lib/__tests__/claude.test.ts": "3daf4979b17557ba2acfa4bbcadda93fc00c1d687578499e8aaec92ccdf41f66", + "src/lib/__tests__/recurrence.test.ts": "23ae8fa233bf06ce23c751a76a25c3edf3bf1299b7530be180292773c9573526", + "src/lib/__tests__/stripe-webhook.test.ts": "cbc0df8b231c91a58ed9067fd49dd7b16db763f8af0076b81e9c51496d02c113", + "src/lib/__tests__/supabase-auth-lock.test.ts": "5d222ec40db224be052832c59c8ed45ae9b9501ac8ea86e21fbf42015f08a601", + "src/lib/__tests__/templates.test.ts": "20b266bb947edba1e5c2dbe3d99dd88e9257011961f3182e45575d2f3761c683", + "src/lib/__tests__/utils.test.ts": "726d4c2b91b11b17763eb21d266844112f2c32e9702e3d8dd2813a1a3acfb3f1", + "src/lib/apiFetch.ts": "173bb611e2f770c26aa56471d4c05a9cb2159e37512b6d60e57044f1c714cdf3", + "src/lib/auth-session.ts": "d46a05da52968e5d30331d9f48e25a34ca08ed3ede851549998cef654d4c3de4", + "src/lib/board-access.ts": "3aa288d882334c9affa31a81bd4558780df92c2c0272e8b82cfa5c6f8927e2fc", + "src/lib/board-io.ts": "eb9e91591242615d25c9b1db5442b5ec637ee95d48805f6bdcdc3a435c989d04", + "src/lib/board-merge.ts": "8dfc81db05619f0e39c4a33b0c7746c126765c4976d597fcb5c6fc1ecd226daf", + "src/lib/board-sync.ts": "cdb02f74aa3c63c65b7a0412e7fea0f8c8cef7a3b14077f9b2bddb6b19dfbf8d", + "src/lib/calendar-date.ts": "2e67524202bb5364597db86685c8e438574104ecfcd33bdf94d20f8363aae789", + "src/lib/claude.ts": "31bc90968f2ba1c3139497e0d759307c28cc2fb3e43472bcdfbaeeb19e2ac76f", + "src/lib/database/board-members.ts": "37fe55c8609602e4e418600bb94e564ed2da7ce9a2dd8ac371c5f1137d650656", + "src/lib/database/boards.ts": "149dec3eeaaab75b42e10c3cf61b6971444d8342d0f20df07b398ea97ed388c0", + "src/lib/database/cards.ts": "be18b22b257c72774d3df321336f873854f24160b3c21920038e2e524b153d68", + "src/lib/database/columns.ts": "a94edf435468c0966452844da9a1e86275e9cb88d53df4e5e77abcfec57d89fa", + "src/lib/database/feedback.ts": "283b09a7cfccafc984b293b9b96bf1af0aa739b2b01cca518a610aff5c681358", + "src/lib/database/index.ts": "f85d0fb33c3d81a53ccc6c1dec9d8c9ff696a135fa425a1c6781a01f56b647a0", + "src/lib/database/types.ts": "f986e01d6493f34bb87838ba2f79795436289d3682506f2d622e0dfd3f298265", + "src/lib/keyboard.ts": "cf320ee6228b82e81d81d2b74c301bc5f25dcab5bcda0cea39b4bae664b8f9d3", + "src/lib/recurrence.ts": "7c16adf0250b8877305ce9cbc9f1ed96e43970f6047b9ef598a560ec7dab8030", + "src/lib/supabase.ts": "75f0d60fb87120924510be2ca3c00772a5ade8916610862d9db727caa1201789", + "src/lib/templates.ts": "cab61dbe2545d4c62217a99a493ef97b23890c300cfa258030b20434544aa353", + "src/lib/utils.ts": "ace8eec1b148d71b4fad92d583958c906c6ea66a25e32d4c3ae57bb1bed52bc3", + "src/main.tsx": "7406127375e63bc3d916af109672a26d27f1b875b7e81349ca185376feec8fcf", + "src/pages/AccountPage.tsx": "c390563555e5cb0445e4326a55f75cfead8d8316011dda5972a0c1ad3307c0ed", + "src/pages/AdminPage.tsx": "e9f9b15ef9ba4c300a8ccf11951230ec01fd730d570d3bb9dad5b9aab64649f1", + "src/pages/AuthCliPage.tsx": "a9fae0c584ba1f9770fab7c144c0560517af5d54124da01f24d40cf12f23b4fd", + "src/pages/ConnectorConsentPage.tsx": "3bdde7b8b4786f37ede2d77711494553815f32827f74b476c9ebf9b10d6f65b6", + "src/pages/EmbedBoardPage.tsx": "c4b7dfce03d2f0b62bceb5a4e269a1a6a5c53ea5bf4dd388b21f4aa3dee43052", + "src/pages/FeedbackPage.tsx": "08d5d1a8e8916e339bbd7d988738e3970bb4db4dbd8fae99d54758079afdacb6", + "src/pages/LandingPage.tsx": "7196abfa83c51c7a677fe3bf23e0e13242299629b15f20822daea041f0d9329d", + "src/pages/NotFoundPage.tsx": "191c6eeee23e592b6c695579aa0367bc2ebd13f193c691b32bc52e5fbaea7aff", + "src/pages/PrivacyPage.tsx": "7d454f6bd08d02ade52d3c79e811adf66f096b9f6eeacb7a99febaee96ab9bb3", + "src/pages/SharedBoardPage.tsx": "45e2f062d1fb6b9154492189772d26535426ad01980bda09f8358185bee9cacb", + "src/pages/TermsPage.tsx": "ae88aeb6fa7be935be048770c573bc645df756fd15984942b3d0bea981091ca1", + "src/pages/__tests__/LandingPage.test.tsx": "6295bd97e9b1eb0193709501441badc32d6b718c6b250f707be9439eb9e77b78", + "src/pages/__tests__/SharedBoardPage.test.tsx": "9c8c875a0a0ac253af745bc42e48687652f55570e7431e60eaabd048d0833d2d", + "src/routes.tsx": "641bdc4b73a3d0c887ac4acbf6f0e643ccb09f9b22679a4b16a6b1982876c774", + "src/store/__tests__/boardConcurrentMutations.test.ts": "1f754003e8d36738583a9004db7b00777eab74a3e051a89ff68df21ea6f9af8b", + "src/store/__tests__/boardSyncIntegration.test.ts": "75d9fc64d55d34a1e30ca9963fd5dee271956b7ceb5050f42f3208fa18cbb90e", + "src/store/__tests__/useBoardStore.test.ts": "e916ed6127dc720a5af85aa4a7e2855fbecb1075b4d2e5b97b4350c047341443", + "src/store/__tests__/useUndoStore.test.ts": "cf7f398ce474bcb34c7c48f5d5eeb5df0da312a39ffc97979f4c1aefbe0e4ff7", + "src/store/useBoardStore.ts": "6502f75d9be343f0af6549f01895b6471154ef5471a929b013868468591adbfd", + "src/store/useUndoStore.ts": "d0d577d0a3310b698d08f69f98a0777f546a11c8e122a841c47b37ecee58ea6f", + "src/test/setup.ts": "4c6fe3bcefbdacf379fb6fc02b89e2377bebb86f11de391a211e6933baab21b2", + "src/types/database.ts": "e7beb599f96d0758bc972783518a9767305622bc3ff76bbf41385b510bb3ff7b", + "src/types/index.ts": "f8b009e46821ad03a5cf83d1b960650d9b68c0d630e19bf1827b8f53ea4fce2c", + "src/types/index.ts.bak": "8882ce7f161d13ec02ae7fae3d17c48995e9692a1605ad1ce8e5b56c93b9ac53", + "supabase/migrations/20261001044235_plugin_board_editor_enforcement.sql": "24bc22fc072c75157e256a1e4bbf2ab7fbad8639a8cebf666155c06eae2b7f7d", + "supabase/migrations/20261001142109_plugin_oauth_records.sql": "fd03541378a09b10d4f54c5b948aa9aa9500d7dc871e76b36e6b42b73547d2e1", + "supabase/migrations/20261002030041_plugin_connector_vault.sql": "20f2ab5656ab305012a437e7e943c4a38350ae49f4ad65f76c6d2775b8fd9282", + "supabase/migrations/20261002055310_restrict_definer_function_execution.sql": "62af3d4651dbeb57dfa2f22bac7e1df1de644ca9eb564ec26d3a808eaeb9b41c", + "supabase/migrations/20261002060649_connector_expiry_cleanup.sql": "da97273b6b2bc3d9a999dd0ee6aeb7bb019b5f9fe3b58612c11c1c33c83911ab", + "supabase/schema.sql": "09f2457631349bb09ad8f6ddfb2785078d0c0128fdb375cc7f87540d0c5336d0", + "tailwind.config.js": "149b62bbe6c8c83d2f3dfb3196bbdb309156a63a7a289acc12f6c9066c763752", + "tests/connector-ui/README.md": "52824c5e11d5957d19b4d8e9df7f157e8fafa82c50109070fc3c645567ef2ee9", + "tests/connector-ui/ai-drafts.spec.ts": "bd9ae2009b4a9b8830eee93fbb584ffca0a7abaa2e1b61a8434c545440ede274", + "tests/connector-ui/board-access.spec.ts": "3c6cb6a9358c6b0dd1f41d43722bfe0eafba385ecff83dee206c662e57d8ecaf", + "tests/connector-ui/board-accessibility.spec.ts": "5163ac150db2f19ffcd6ef20037c00f4b54ee2727e89f50393f8234bdbd32c1e", + "tests/connector-ui/board-generation.spec.ts": "84fbfcaf67cf40e7320f834fcc95656e57305c14adf3240a4afab88a6de5eef8", + "tests/connector-ui/connector-ownership.spec.ts": "afe593b2412deed97627a1fbe2731a9d2e0ba8f8d5547193685fd1d97d426f23", + "tests/connector-ui/connector.spec.ts": "a12a2c0da60ca65bc56dc7dbf763a24a5e9ec06c7991e89bdf72efbb832fcc4a", + "tests/connector-ui/fixtures.ts": "f2b9ed7075bd7bfc5b76b6709473f23fa1319760ab04ac5baded8a3911e563f4", + "tests/connector-ui/navigation-drafts.spec.ts": "36d6e1c1b87723e1bbf114c76c7bb780474f4ea970fe700b0a1e6354a2c6fae3", + "tests/connector-ui/signout.spec.ts": "f16c1fab42a0fac4f91667c557b80da0ebd58c7cb93d718d8fc380aff83afc61", + "tests/e2e/board-sync.spec.ts": "f34599bb2d5587791ce2eb7df44df53e93433b109bd78256a60ce6bf8bb2b727", + "tests/e2e/card-parity.spec.ts": "bfca1b86d5883dd9f0e6abcb29a5f535bc49c9f2d32003b826a3b044517af48a", + "tests/e2e/date-parity.spec.ts": "2fb4967aacd1ca1e25195ed1053c193fa131f5e809d24351deaca8bbc459956d", + "tests/e2e/env.ts": "dc326d9fe840b50b5509006f3065fa6c096b935d1f24aefc834c614c4cbf57c1", + "tests/e2e/global-setup.ts": "83a847c325d9c5494d4a3bcd63476ca9d188d38132b1e094ce7aed058a09229d", + "tests/e2e/helpers/mcp.mjs": "d3c6c4ebc24249d31ee0f9c1155d7c5fba734870c6b4841b63e53122e47d243a", + "tests/e2e/logged-in.spec.ts": "9a2611bc5980932008b706fb285a278a23d10bece7bd579358e55c7859fc965f", + "tests/e2e/login-ui.public.spec.ts": "5b49d5b01401b62473ae99baa98c61aa826bfafd9524fd30b3ce7b70f0620a87", + "tests/e2e/recurrence-parity.spec.ts": "64a200a09483071e6c146ef202f3faef12a90e9df4fd05cebfe0aa9b16d19db7", + "tsconfig.app.json": "90eb3ac3b7cd4d06c4c837f073f3855774761998780ac01cec7a13d0d5de5cfe", + "tsconfig.json": "a389bfb0309454cd0828a3c4a7431e56c3d6f50a70e648613fd0f51ae300057c", + "tsconfig.node.json": "7888dcc526df903c9ae2360a32b445b1de51c36a65e60200cdc22594bd3a2166", + "vercel.json": "44a58ad3b5e69920f3285377663463995ee35be6f99c261b949911528be09360", + "vite.config.ts": "3b313be8b240dc5c5a4aef9bf20634ddec444eefc577a332931c9eab76326545" +} diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/before-browser-source.json b/docs/qa/v0.8/ai-response-limit/browser-integration/before-browser-source.json new file mode 100644 index 0000000..3718a72 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/browser-integration/before-browser-source.json @@ -0,0 +1,374 @@ +{ + ".claude-plugin/marketplace.json": "c50d34ff6091a4cd1a22f4809c2d7c5e21109ac92c77c5a77734cce9e2e5de9a", + ".env.example": "be86c3929ac827aaadf8f7d8e27b6ddff3fe3d375c581c8729bb1f8f62e85f8b", + ".github/CODEOWNERS": "0d49181962b1615a21af81bade5f6840129b4e3e906393e765979aa927442896", + ".github/ISSUE_TEMPLATE/bug_report.md": "d3bb803d32cb7d93caebc8cb2f78608cb1f947dce864b53ed2b5bcdee7a13091", + ".github/ISSUE_TEMPLATE/config.yml": "5ed05fbdc4516b94957bc161461d8889c4008afbe6f2ad344c6cb578b909c38e", + ".github/ISSUE_TEMPLATE/feature_request.md": "84ccab69e2f251ad4930cc86cf0a15cdbf6277982fa69270265ca741018b2a75", + ".github/pull_request_template.md": "eed0496b2c2a8c4ac7202299207f4a840e5c6d606f19cc278908ab85cad4d069", + ".github/workflows/ci.yml": "4446575d200e5f81f067c86b0d3c1f60b0e7fa43c9aaf7f09884b60df38307c2", + ".github/workflows/connector-ui.yml": "413d033267af14ff84401987a33e86d4232e7be96a1094f6bdc2c1c24f195781", + ".gitignore": "d207dbb3b0c8de6a3e85ef515b61728a2fa559dc387129458e7b816254a59214", + "CONTRIBUTING.md": "41d382190fb3617d1e25f5d0be017cc575a3aea92b91441fa4ef480124a286ec", + "LICENSE": "00898b990be80050d269061ce2432adbf3042d40f9bd692d350e735e3e92413d", + "README.md": "cfaed875cedf4aa025c3df25e82b0bcba646fe090d9ca0b2e5f8476f26d2ffca", + "SECURITY.md": "8e41f572376effc7792e0f5864573e3f5857460ec8c1a2ac8ae65d7950876b8b", + "UI-Design-References.md": "39a8c6d4f42441f493aaa5d6ed154bfa935fa9eb101cdc899b8f0b8b548683fd", + "api/_lib/__tests__/ai-provider-response-limit.test.ts": "9442ee496fa6a22374585abaf5365d497af454783d4b4af5a1db49eb30022d14", + "api/_lib/__tests__/connector-config.test.ts": "37773357e588dfe8048b20cfa120340f4168adf78aa3cf4a6399de2238e2d21c", + "api/_lib/__tests__/connector-readiness.test.ts": "3d48d9ff7b1f2d5c14062435150b4880e8836ca135b0e32569289c661243a142", + "api/_lib/__tests__/connector-sql.test.ts": "ee4fa4666c11c04071fa4fb73fde21cbd767eea65391290cd17733690f7781e8", + "api/_lib/__tests__/connector.test.ts": "f7f843c10132b4ea1c349595ba4d67d8e9bdefcdf8dd3c2a5c537ef1dd5ac743", + "api/_lib/__tests__/fixtures/database-leaf.pem": "dc523af50e63e6560330dbb85c8a1cee1aad67cdc20fc884df7a62b7e6367422", + "api/_lib/__tests__/fixtures/supabase-database-ca.pem": "700723581420dd1ac98fd7e9ac529f0ef210eadcaf87fc868a3ad7d114c2f3b7", + "api/_lib/__tests__/resolve-commands.test.ts": "55fdf398c9ade929a2547b59bf60c7ff2f1a0e3d59555912ae4a906638d37296", + "api/_lib/auth.ts": "c653507453b32b783f20aa3ab36185a0a60c1825184fc92e92be30fc1b1f7978", + "api/_lib/board-core.ts": "c52f49ff81456ef875d42ceee8bf2636d800672cd2fe1bd1231442f4d8a9ad57", + "api/_lib/connector-config.ts": "ba9638b60bef77511ec098f572d6fb7b1668b66931ad41474e78a2fbb658d789", + "api/_lib/connector-runtime.ts": "89f955901c3a7c849fb20e8f2356a1fc8099ddf3ce8251d71a067b05bfb592be", + "api/_lib/connector-sql.ts": "467174f4298ea29b177271c13de5d0ddbea18888f4002a7002b784322c886a0b", + "api/_lib/connector-vault.ts": "e1c78fc671f657d8f0bb93a2f1736d05136c6f43644ba270da0aa3cc31732711", + "api/_lib/resolve-commands.ts": "af04a344fe47c5a246f7d4a1a135dbac4335a9a65d9ea33803a16c02d620b36d", + "api/admin/check.ts": "7b9c9b29bd556682aef7491426d53f99ffaaaf9ad2151d486969ef95a8defa6c", + "api/admin/stats.ts": "fd903ae24cf4bcf92fc1ee4c69c77d70b9ed3c398f0ab76c393b16fcfe8841b1", + "api/ai/board-template.ts": "830c73fd8d5b0ad1203d960128bea631ca2067b929c4c20d0edd404febe310af", + "api/ai/command.ts": "eb6e0eaae0e55f54683af9f4fb7057c640f9849fdc5392065fc90099571bfc61", + "api/ai/usage.ts": "7f81b086ecbe8bac1edb015886bcc8d1a821ac1620178dbfa34dfe0860a17ab4", + "api/connector.ts": "b38719fa05e779d32b33f934466ebb8b67f6133896eb18f512ebf1389cac3562", + "api/feedback/submit.ts": "6d3a26d4fd13d8b9c90aa438a146eb758405704d19d857cf7767903dcfd420eb", + "api/invite/__tests__/send.test.ts": "27ce146ecb9bc779b0cec63d461b7f3cef424796b8fd0ec9ba19f1aac1899059", + "api/invite/send.ts": "b8c659c36303149abba7a55a2800c5325f23872692e62ebf06d5a1a345554a3b", + "api/stripe/check-subscription.ts": "397c8be5de31834422f45e1ee1b7b4e49ebba833a9be874f9e3bcf33e1669990", + "api/stripe/create-checkout.ts": "7caf5cc2ceb0176c1e18d40f678cc654301582f688876fcc2f8c535184f17674", + "api/stripe/create-portal.ts": "9f9fb52cf3abfe18e74b388e4bf2cd511ec9b734af749899f14fb2d19f210c95", + "api/stripe/webhook.ts": "ecf3c23e71ac19ffa8bfe996b431c68a7d8668fd8af468e0679aa86bd9477552", + "codex-plugin/README.md": "a17fdb6016b31f8a50b36d82b2cadce8923a7ece66831dca7236eb1ba533261d", + "codex-plugin/mcp.json": "d3a66fccfaed9a29691664ed797d4363bd19800439f47b8f38430f99c94d5a72", + "codex-plugin/plugin.json": "6046ee920eef812a3200611a8068ffc7abaea2c1f6e9d1d7fcc433fef7621f2b", + "codex-plugin/scripts/serve.mjs": "5a6da6b18d65a6f7723e3c3fd2584365a5c9622aa4723a5aeecfa8fddb75894c", + "codex-plugin/skills/meeting-actions/SKILL.md": "c5a624d0e80cffc4a8380cc6aae77954c482897c5b69f705089eb02305678a41", + "codex-plugin/skills/standup/SKILL.md": "c65087e2498114679ba4f7d89ec371f52e19d385b43b34339aa11e70ee79bb00", + "codex-plugin/skills/triage/SKILL.md": "630e3a0b17309776ccc5115db8b29119e4ea3a24060c20e50736e9ce7a364b6d", + "components.json": "22643b642f17cd817ec94d8439a272dac28119af0aebf8219a96ac1c2f4c61dd", + "eslint.config.js": "6f32697340de8096ec4166743f659cb36f1d48a4595d636f6c49fab904cb367d", + "index.html": "827dc4841dc88a4ecb32cadffd24cbc001f134bb564ef3ad329a7e58b1525dc6", + "info.md": "9c99671a0fe27f9c0e575560c886ae290651b8833b8e30d70a50d27c3e55209f", + "mcp-server/HOSTED.md": "5869513e66b9fc718c96247fb74458880c9fc5ff701963ddd49ba1515727f8a6", + "mcp-server/README.md": "b835faad804e5b25537f713b7333874b982d4e4b5fcf130c53339ead5dc79ad4", + "mcp-server/package-lock.json": "5abb726bb26520172082aae09ff06d83a449d2ab3c02687b540ad5fe1bd32df0", + "mcp-server/package.json": "253833b8c81e496dd83cb4ae414cc24303ef7d4277ccc87be082f8f8899fdb83", + "mcp-server/src/ai.ts": "b6fd6c20e2db4653a6f7737c657fd03b4d156351b4006f7b4058a4744e53eec1", + "mcp-server/src/auth.ts": "43db86173655eda0a1d17a70eb4f43c9a0db587db836ad8063571eaa5cf25ea6", + "mcp-server/src/board-data.ts": "bbac2dc43d1beb20f7cb07e028046d3df9eb87884d984fdba2c9d4f65657a034", + "mcp-server/src/calendar-date.ts": "e29d55f37227c348a7f07dc54c2d51012b584dd5669bc4fc51b302b1e5de9aad", + "mcp-server/src/config.ts": "e172d8d267c9bdeb05420732230142b006629a2ed222d3369bc0b4a4d2811ac5", + "mcp-server/src/credentials.ts": "cd40018ab4f837de3ce7ca7b3ca1a62f6ced8f2bcd6beed336622f5342bfe0e3", + "mcp-server/src/hosted-account.ts": "4166d8d443d9fe0fbe07a4d90a8cbc9f5e605f761c0f3621079af9d9b10d06cb", + "mcp-server/src/http-body.ts": "0b6fac7c3c468b5737547d7e4dbe34d951eebaf71d9f9fd8ccb35d673a9b8ba6", + "mcp-server/src/http.ts": "244d6fe6a62a6b9b4f06e023887a9a8db49d033b3fba2b91d66aa39868151766", + "mcp-server/src/index.ts": "a91c20cc06cb800858a3b5bbd4425862e69cee3d074bfc8d6b992c621395627b", + "mcp-server/src/meeting.ts": "a0d58f8cf758593cfc259c5546895ab06a75ea674a79933564d8c664f22041c3", + "mcp-server/src/node-client.ts": "9d0ad1e4fd4fcaca7dd4b9bbcdccc23665ffdfff6d65ab6937aa94a604f6706c", + "mcp-server/src/oauth-callback.ts": "7c92f10d5210c2db071e836e79278ae0bf62d7c7284ff96bd95b084e61e30a45", + "mcp-server/src/oauth-store.ts": "a336444c2a02ced5c818f9908ddc5eff45fa0340b51b1e310afd036312079f84", + "mcp-server/src/oauth.ts": "7fb75edb0c68d6508ce763aa70d10fc74c31a05556d81b0d0c7d19ad1006e575", + "mcp-server/src/openai-server.ts": "f26c16f3b48f13f7ce5f2f46cae69acd8ac58420c92e218008cceeacbb3b357d", + "mcp-server/src/plugin-entry.ts": "bae79087a43e5723e6b4d100ac890ec7ebeb2fcff1171c1e7557351a0faa1240", + "mcp-server/src/recurrence-identity.ts": "30f2394be11599dba905ac692fec74fa451e45ef95e242940f07a6cd0798546c", + "mcp-server/src/recurrence-schema.ts": "2aa27e54be366a7ccfd43f668ac0a9fafe2d58e0f2bc9bca4798cc1df302ffd8", + "mcp-server/src/recurrence.ts": "28fc66043d501d09f356d12d28d01a6d1cdcfdaee0a165eee0b7b286537fd0ac", + "mcp-server/src/server.ts": "4d9b396ff24ad3b419ceb75b1352d046650c0348a354625dc47b97b71ee50760", + "mcp-server/src/smoke.ts": "6cefbd9877482c5c4114e7cca08397e9b05c82645d79a884a0bfc194aa7484e6", + "mcp-server/src/supabase.ts": "4f56637739600a971d9fb63062912ad77c32299d266ea4bd36dcd7b26696b0bb", + "mcp-server/src/target-date-schema.ts": "cf725f2dda6bed0da5785437f84cd01fe75a4db639f3a759d8f4446eddbca0d6", + "mcp-server/src/types.ts": "ed528070f3146305f793c4925f86e2d1b3287a166fe24d9822fac5c6d020bec4", + "mcp-server/test/board-data.test.mjs": "15d89b8471b94772c36b8279eeabcc0b5446b0935295589f3c776f078275c8f2", + "mcp-server/test/calendar-date.test.mjs": "a96c0b4572b146fb44e503e9f68dcc617bc972b23289b68cb7bffb97a71b81f7", + "mcp-server/test/cli-options.test.mjs": "df8d29342a60a85de4ed4c7f18b5c5444be69e82afc3a3747fb08510c1973308", + "mcp-server/test/config-security.test.mjs": "55739babafb7ecd92bb9aefbdbd835a533e86f695d73793f8e91a3b800d73294", + "mcp-server/test/connector-cleanup.test.mjs": "cbf5e64d2f5566324de7718c6fd7f4aba12bfa7a3ced0426d693b4e8b90e917c", + "mcp-server/test/credentials-project.test.mjs": "9db0056669f6d76727aa363878f6ffffaa009f624cd5910aeba13e29cbdee98d", + "mcp-server/test/credentials.test.mjs": "bc7387a19b5aaa5f1144e79c72788780d1af30bbf37870902384e82573962a85", + "mcp-server/test/definer-privileges.test.mjs": "0f48d1074b8d4d6e229b2d2ed833d7e54ab795c6f8dcaeb91083e5be0ed7c58d", + "mcp-server/test/helpers/boards.mjs": "4db2e81d6d32d357a1b0a3b08d5f47350448a7b279b0a24811fcbfb0ad24adc4", + "mcp-server/test/live-protocol-smoke.mjs": "8c3fea7881f260ef72d000d51bc94fa55ff244f8da74fde29a8a22b80437f149", + "mcp-server/test/node-client.test.mjs": "e8eef2bc97c53cdfd78e8aa92ddb194d64f89094d31e5a480c244cc0ce55cb62", + "mcp-server/test/oauth-callback.test.mjs": "8b3038bf7b175f81ae95d277ef8434e9ffb93892f1fa6e94b496cc510e613baf", + "mcp-server/test/oauth-http.test.mjs": "113fd84cf937c87a3df65615a565562e809a89dcf69c3a16d596d5e87b59a9a6", + "mcp-server/test/oauth-store.test.mjs": "8f390fcdc2ca25d35e2841ac9d67a2e57e1126e227c2a62fa060f369d4c1e7d6", + "mcp-server/test/package.test.mjs": "64b779122fb5c2a6cddcf6e47d2d400ab3be25311d4f1af4979691c2ec9f42a1", + "mcp-server/test/plugin-launcher.test.mjs": "5994dde676bb72a8c3f14fc49b46359598692d8987dc9b9cba6f67cd310ad7f3", + "mcp-server/test/plugin.test.mjs": "3f4b9be227a016077864ae55d48f744d2dc860a274e48072e8ec1d28c6169572", + "mcp-server/test/protocol.test.mjs": "0093cd58058d97aa74b51c3323f83798752f3e627462a14465f6bc720363be79", + "mcp-server/test/recurrence.test.mjs": "7f20bb362198b4e38d01f37adc4e95ea4827d4d1de08fcb0dd355e1323a6fe48", + "mcp-server/test/rls.test.mjs": "6a607a808863e440ec82e3a5b989112815239624fc2defaedc4ac3cba018292f", + "mcp-server/test/schemas/mcp.schema.json": "6539175bfcdf43085855183e86da40ea94b166547a72b47ae9a0a390516d3acb", + "mcp-server/test/schemas/plugin.schema.json": "0a4aad95ce337878ad38802ebf0daa3fde76abe3f65400c86bcbb1ec0b3ab883", + "mcp-server/test/stdio-fixture.mjs": "2c402438d439037bd2820b546f7ba822771cf0fda93ab26cb59ec004af5c50de", + "mcp-server/test/stdio-plugin.test.mjs": "2efea624f29d9292d347bfe5bbc4053d84248ae9dec08d1c3eb422a6cce4dcfe", + "mcp-server/tsconfig.json": "78b489e258534bd41a05f1f5e430f22752615a2821150cef059d31699a16c6b7", + "media/.gitignore": "1151d360a55341695a33cc870b65d09ddf297a57ba5602d81fbf45e9709c35bf", + "media/README.md": "a87716fdb90ef00549974ff43c143658837b014784fd800dd3c7eaf05310a7dd", + "media/manifest.json": "5df56653895ce886d80ef19650c335d46e291124770b802442786f3d73e7a682", + "media/wrangler.jsonc": "578f3654b7a90c757dce52f42fbc6e8533999941d608937fa14c9d3625a470c7", + "package-lock.json": "9c79e68c03958a2c5d40fda9a180ee705024295e1f8ccfc1acc9a77d7999ea95", + "package.json": "d861c93b64a2d769a403d93ad1601d83e82bb31c01ea4e53cfb8b328b69ec18b", + "playwright.config.ts": "7a4d56457a21aa2eadbc539a9973fe86be51eeef4ffacd096201b08de3674e91", + "playwright.connector.config.ts": "274868ff19062170051b7a722c507e5dfa91fed28b2b94324c5b863c1e07ada9", + "plugin/.claude-plugin/plugin.json": "8d9ff6899c423e4feaf4986cefc97e6ed3e016113d63a337250cb37256d5f0c3", + "plugin/README.md": "101b1e61034fad200b75f58309ac81ea217ac02c01d38aa3363a658d07545b32", + "plugin/commands/zeroboard-standup.md": "22186398d99dac40d37ca357756a2144e2ec42e189dc7413d7ebd1e82e58e08f", + "plugin/commands/zeroboard-triage.md": "5ee5b8e06edcd018b8caa5357324601abe59ef1c74f4d00f53c044a0aee97edd", + "plugin/skills/transcript-to-cards/SKILL.md": "cf373a8bc45e2258b76ef86454324b43e2e0bb47e7e2cc8c17f39b44691aa874", + "postcss.config.js": "190c877db466995bf1482f4a16abd06e04a89ede3119341e2a86ff96e1737b27", + "public/android-chrome-192x192.png": "50117c38991d1f05eb547aa9fdd5310ddbc1c3c3191074974178cedba6f67b88", + "public/android-chrome-512x512.png": "8372cbeffa825e3add85147f032f25f27c394bdec8f25765ca172b904d1e26d8", + "public/apple-touch-icon.png": "bc8585046099cb1b4ed0def79c5c8965be7503da6abd47b2bb266d896b210cdc", + "public/favicon-16x16.png": "bfbf0d89f45777cd191e9469821d552a6fdd165caed3df063aaaa35069312864", + "public/favicon-32x32.png": "346c79ed3891dff343b7ea9ff401095dbe756c97f1c872408f87c242c3ecb597", + "public/favicon.ico": "b1a99af77445241f1676ddbf23fb12b3f7b59f0ca3ccda3158834b0179b31a15", + "public/logo/logo_color.svg": "471cfbd7f8e6c166e1f034b9a8a859f93b7dd0d4485a692addef37a25119ce23", + "public/logo/logo_dark_pointer.svg": "bfc85a05ebd3a97ea76a282a07ca486c9f2e781f0241fd5306995df6ec5c42cf", + "public/logo/logo_wordmark.svg": "d722e84c19e78e085cd2039c133dddc956263e7bdbfdd126da4afe03e94ba3ef", + "public/screenshots/ZeroBoardAI.gif": "10f5b724226fee0f709f004cc56328d847934a4d22677017f43e1e1430a566da", + "public/screenshots/ai-assist.png": "8dc1b38f769e288eadd1fa183083b81ac117bd7b9a1761bb24f63cd7d0a21a3e", + "public/screenshots/ai-plan-a-sprint.png": "3dd5b810495f077a2bd15b3d7203638b210ebe064f058636828e374d171584f6", + "public/screenshots/card-editor.png": "61675bb2019e0a35a6b4c260d19cf1b7bb8207576d3635c58ee03f75cbfafca2", + "public/screenshots/choose-background-color.png": "0c89279f420dbd38a8c38543ce878f46281cb1febe274cbf7fddfafb1bff24c3", + "public/screenshots/deploy-with-vercel.png": "d769ff3378e29b68f7f192c841b70b5c6ffba555907bc1d382c1514f3965a62b", + "public/screenshots/export-to-json.png": "86e7c25b6dc869b735ab5cf872f2fd59c0d8b178a475f9b7535705906ecba9ff", + "public/screenshots/kanban.png": "88d485f1d44566b0a8c15a510d0908faaaaac76d377815a8a441eec6787660ad", + "public/screenshots/save-as-template.png": "79b4c2c514e3e5337c0e548ea3182fb943335890032a9781fd2d239b879ba4c4", + "public/screenshots/sharing.png": "a1ecc503709eb34cdec2e56d5eff68499f27181a03d8e42225f699ec3499f8f2", + "public/screenshots/sign-in-auth.png": "f37d071428675266004e3567b546ebd6038c734e1c3a17554f33b5680e8895f8", + "public/screenshots/timeline.png": "9196b6a6bb5dc771e75e14eb92d77f850cb908911be409cb4c2856ffd0d09317", + "public/zeroboard-mcp-commercial.en.vtt": "0bae4a9b69406072773a28b19a7d4eb67c07a5bf4c2143dbc934e89f76542b09", + "scripts/e2e/ensure-test-user.mjs": "a61cec638ef049661419efb96e901f50825a9e0bbcc46d1ac939bfbadcea04dd", + "scripts/package-plugin.mjs": "7a303270b4e0621f932bb58fc1a110d990eaf41a24d11682da779318628a1e8a", + "src/App.css": "0cf674130f7841bd239f6803d7c5ac0a9e649e1fddf20330e5979d1f284e1119", + "src/App.tsx": "d5b6b777312d8bace0ab6b56d81ba74e405809f8aea25f00600f56cb7f5ec66f", + "src/components/ErrorBoundary.tsx": "73f32a0ff0a13f5096293e88bb8431d7fc32e55443b24b1ba92ebadd72f892c3", + "src/components/FallingCardsShower.tsx": "604c846b6a2fcfda8b7865d5992535ccf3f5f690d5f6edbef2d70402bf3101ba", + "src/components/KeyboardShortcutsHelp.tsx": "2d7a2e12a903eacbe1a6d257446d3ef1be77042cb0798975e95443c5b53cd7e7", + "src/components/__tests__/ErrorBoundary.test.tsx": "6f3d5a4ae28141fd698c2a1743e1ede75a496aab00df46c6b1f28e20cbcc8e23", + "src/components/ai/AIAssistant.tsx": "7def49c5a906a0c3d262db20ef464a10e2688b35872355a5180c892578073319", + "src/components/ai/__tests__/AIAssistant.test.tsx": "c6d345574b2e9d93b2f17a14103e8a331f412ee13b31cf10a1c0d937f6e2ac2d", + "src/components/auth/AuthProvider.tsx": "6e0b56f9549421ba7e0a2bcb5ca93d723f4e21e3f68fe50be8c5f2d363327c11", + "src/components/auth/AuthRedirect.tsx": "aa1d8ffc0b9296841a894d3d71bb42be59d7b4926bbef08fc72d41f2ee953ec4", + "src/components/auth/ProtectedRoute.tsx": "0daad38616a5ab643baf033eba7b62be87954e841c61ec848954e3545b152a17", + "src/components/auth/SignInModal.tsx": "6c69bf552d6dc269431c73bf2b869f8f16c8370ac49daddb6093997a6026e313", + "src/components/auth/UserProfile.tsx": "6e2d165f98de486abda166994cdc3075050c63621e2f19390f173ee8f42e1fee", + "src/components/auth/__tests__/AuthRedirect.test.tsx": "104a59beff2daebbd73b7ef3890e7ea4138ec3a202531a62991835d7a37ce7ed", + "src/components/auth/__tests__/SignInModal.test.tsx": "737e5a8126ae75ffefe2616fbe2c375b3cf92c4c40a2f613bb86e29d8fa88a27", + "src/components/auth/__tests__/signOut.test.tsx": "bd6566761bdae412fb6cf717b1f6bad76bc4bdc6d080a9512a5cf7a2c68e7273", + "src/components/auth/index.ts": "3480d4813664a322e16576cbacb8aa23875aeed1c7f487733e7df96a1c468166", + "src/components/billing/AIUpgradePrompt.tsx": "40c6a722fbb7feead1bce5ba30e9dcf0babc08cb13cf5d3fbb8d541de9c3e3c2", + "src/components/billing/ManageSubscription.tsx": "b71378699abd414f8b5d6bcf30344d4cf0e5343bd656f34896c241bb50469117", + "src/components/billing/UpgradeToProBanner.tsx": "a9c4863fac22b956983e63d0ad9e0c4337e1ef4659f099dccb24222dbb3257f3", + "src/components/board/ActiveCardEditor.tsx": "adf6a1ae9c6efc0f3722cc4b18e1e5334f28ef52e611908c167754cf4b35f76b", + "src/components/board/ArchiveView.tsx": "61e06ad7fb0bbda3f87300a9e332a125baf0283ab06c1b85ebd23954647ffd26", + "src/components/board/BackgroundPicker.tsx": "72d12e5f71d65fa5162bef7f06d206420ab27d53bde5a737321065f96fe4ebe7", + "src/components/board/BoardSelector.tsx": "1410f0d34aec8fbe30d76bdb6bd955c1d29b3d7bcd39527a24d461feebe62460", + "src/components/board/BoardSkeleton.tsx": "f7cbb710dbcd32da04e20602ab986754439b75edabfa97e52cb121e590f5060a", + "src/components/board/BoardSyncNotice.tsx": "3a6cbf60a658eb3cb13a38e8ba5df30006ac2a5d8ccc726bdb4f03965ef5a6ad", + "src/components/board/BoardTextDialog.tsx": "b561a3b8bb115075999c6b846b0a44cfa071e0b3ca4940142f9ae00ccade0baf", + "src/components/board/CardActionsMenu.tsx": "d69576b6ff9c836d92735cc00b2f1bcabf3b951bab663aa1f5517214803166e0", + "src/components/board/CardActivityFeed.tsx": "06c3fddec7cfbd26d53ca2fe1c8beb0be5f44a747c676ac425172e39e3dff542", + "src/components/board/CardEditor.tsx": "82a6fd8fb9f3469cfbd489479b267d892f085ef09f21ba265db7a8366fa65504", + "src/components/board/ClaudeResponseDialog.tsx": "bf8aee830655ab65f0b74ec1f08d734e0d659b9c90c625affd391c0c7ec1a3d1", + "src/components/board/CreateBoardDialog.tsx": "a9d3980bb19f1d6009b24391da6006bfc08c7dafd77dfcb74188cc0a660ed1dc", + "src/components/board/KanbanBoard.tsx": "6dbde3cc7299915f76a8c14b5080d27f23f4ab33d35a5405466cdde2d17602a8", + "src/components/board/KanbanCard.tsx": "e726502b71e1da0247d703261ef347a8553d0bf032d81fc0765140737d9aa107", + "src/components/board/KanbanColumn.tsx": "e72a04a00a8970302becdf57973181e576d6154f1f27d28bfca2905f75a55098", + "src/components/board/LabelPicker.tsx": "be2bd5840a1229ea8df4782543cbd667001063a00bc97220a61ac17b8ed50ae5", + "src/components/board/MobileBottomBar.tsx": "36f9657c9e43504a15a5c18a8548fd5f80374a569f005bf86f1f44b8b9611610", + "src/components/board/MobileColumnTabs.tsx": "b773c292e5ec0891ce6dfd0bf61b8a1ef3e804264bf6b2a99c7df464e53a1963", + "src/components/board/MobileSearchOverlay.tsx": "e06a2adb7729ff40485945c2dac52af1c05b56109375b9a6c510eb8f01ec0c6f", + "src/components/board/ReadOnlyBoard.tsx": "81cdac1ef3503b53c15d560873cb1d83e057d9dd2dea79159996553fdd96de39", + "src/components/board/ShareBoardDialog.tsx": "97f317e73429ea3777546bb8d1355909a4d94eb312b7487426538d568b2cd68a", + "src/components/board/TemplatePicker.tsx": "1a6569c9ea5d81125337ede40ac6152a1031d7c670c4efdc00c63c645758846c", + "src/components/board/ViewToggle.tsx": "dbf6c314c280b537609e9df7cd5996f0bb15dfb31957b4d26a6dd908017e8a03", + "src/components/board/__tests__/ActiveCardEditor.test.tsx": "4bdf7ae11d1beacf3ccd1ab15362de5f0a76d62eb73e6b1f2af3edc45aedaf73", + "src/components/board/__tests__/BoardSelector.test.tsx": "36ca55c8868c8e3b639e8e8d56eea2f5614ebad6cabd1960d2f7b8e057460e42", + "src/components/board/__tests__/BoardSyncNotice.test.tsx": "8656c60eda92de157ee5fc01878acf83e1fa1b4c68dca5be002ece6a5a3c6a48", + "src/components/board/__tests__/CardActivityFeed.test.tsx": "68d3ba8257d719bdfb867a4607183918301767d9a06ea4e7aae22e2a77f911cb", + "src/components/board/__tests__/CardEditor.test.tsx": "4933e8d8357eed11e715f16b73f28dfda1733fe18eaa120f4f616ef09654fdb6", + "src/components/board/__tests__/CreateBoardDialog.async.test.tsx": "c88bb74df7fe3c127555c83d338e4d179a216752ea329e6fdcf99b3a3ab0e62b", + "src/components/board/__tests__/KanbanCard.test.tsx": "8d10d9ddc8ec2715e6da5149c7bac8531696057cf04ab355956e242c4f6630c7", + "src/components/board/__tests__/ReadOnlyBoard.test.tsx": "88bd5c1fc39a85104c5750ee20bbe5d8218185437214e6e8e26c8e62afca98df", + "src/components/connectors/ConnectorSettings.tsx": "61c997d231f0cd0ec1f6b45ea9e3fac41d8882db4f76462059164e472c49d3bf", + "src/components/connectors/__tests__/connector-api.test.ts": "52fd593926568a845866e239b97ce967ec2692070f8b38983ddf7074922338f2", + "src/components/connectors/__tests__/connector-ownership.test.tsx": "c1d247164d4384bb7d84d9fa81290f6aae1b2b60e1e2be8caa1d0d2f335fb080", + "src/components/connectors/__tests__/connector-setup.test.ts": "7cd1a8207f788d7dfcbde8fe88271d3ec6da3f6ca14ec3c09a3d8551d914f1b2", + "src/components/connectors/__tests__/connector-ui.test.tsx": "d9eaf25e7a232c0e97d665dae44136611aa07137c3e29292211a6531823fbfb9", + "src/components/connectors/connector-api.ts": "63590ae57495e45bf78674b5e38bab4abfadcb7c79f2761c1137b42e0e16bd14", + "src/components/connectors/connector-setup.ts": "c0610bb44048169fb62097b5d3fae3c0bb89fbb887d270a5b195045c45ffb64c", + "src/components/layout/AppShell.tsx": "518baece9271608bb06e972d23640d8f78ad245cff6a3a0959c2283549a4f4ab", + "src/components/layout/AppToaster.tsx": "a8ff5d6eee6702bad159e26697ca2b1de9f781c40ab9f90f303a0e33245b5503", + "src/components/layout/Footer.tsx": "3e0238dce7c9a2cf68d1ca02eab93aff66286d0562da13d6c50e47ab16029b87", + "src/components/layout/LeaveBoardDialog.tsx": "a182fd75cbfbdf07b35d829dadda5acbb27b3eb34e2253b5cb0dc6a73dd76af5", + "src/components/layout/PublicHeader.tsx": "931a33d5ebd541d19e56ab25ec925ba373bae3ea9810544288200a7483dbbf58", + "src/components/layout/PublicLayout.tsx": "ec7902a3734d70d25206264342609610baf48a0d58237724cabc1a0e1c777a64", + "src/components/layout/__tests__/AppShell.test.tsx": "47c9c528666b60d5fcce98a5a79a49e5775c9b99b024bf70964887bc8dde9f68", + "src/components/timeline/TimelineView.tsx": "be2586c969c8bd1dc2923a3d1ce75021fc60d968a91b21643664c0d4981804e4", + "src/components/ui/accordion.tsx": "1e00288c7eee72380002164ea3ff7589df5d92f2f1b8c7aa5077596ef680acdb", + "src/components/ui/alert-dialog.tsx": "683cf8b6c3b0c29fb0e31f36e8c7794c63ab5b7ab431f7441ea2d478bbf9fe41", + "src/components/ui/alert.tsx": "49d8311589b810b106aada8ef7b13f70b2b1f68cfce4e1458b7f31a191f420e9", + "src/components/ui/aspect-ratio.tsx": "6a75117416aa89200cf31e8d61643b428e812f479caea857c80004b26d893e79", + "src/components/ui/avatar.tsx": "e637ab3522c01631eac2e456588ef301314e2bb7940ebf7cd96e698a868d47bc", + "src/components/ui/badge.tsx": "e7455feb113b38c59456ba29a9ec264b5ffa1daae8883866332ad637ffd57c31", + "src/components/ui/breadcrumb.tsx": "22f3f4c13ed1085c4131379bfccc6fb173a474f861636bc2736506820153aa08", + "src/components/ui/button-group.tsx": "ccbf09097f5ebf2eec86f1a96cb92e8dd39d251ebb5867394196c8b4fec68a5c", + "src/components/ui/button.tsx": "5a5c4b8b60a8a80ba7b8b5d0319be2d3c61bfd2ce4fc2a645371dee9f6db0a77", + "src/components/ui/calendar.tsx": "c8e67d15d8622135b72045d974a3234ea99f5ffcc1b981eafea8847a14ae1f12", + "src/components/ui/card.tsx": "2040cdff27cd1ed771e0ebbd15abcd73d31f2f1e4be6664bd6816fffd2a87476", + "src/components/ui/carousel.tsx": "10c5388b66d98f0c555dad2e5b89b9bc846fbc1a3de101ee8b98abc305ec2c51", + "src/components/ui/chart.tsx": "39a2fde544144e0ed0e3e7f76eb3f3988f570f849f30f62208c6f3e2fc4e3e4f", + "src/components/ui/checkbox.tsx": "a8292972a5b81eff164f621ac0bb66f4ed4419d1599e2d4901968e216574677f", + "src/components/ui/collapsible.tsx": "661444318605c90d19e47e4d21289a68b4c5f7f01782be70dafa80d3f7a4cd08", + "src/components/ui/command.tsx": "416cdc19eb9e7301b51f9665b4f1a797534769a6bb58a563808979f460b0b8a2", + "src/components/ui/context-menu.tsx": "70e547a9bececcc98adf2fbfb2cae05c99179707ab0edb1ddfb5d2de329dab42", + "src/components/ui/dialog.tsx": "761dbab032ecb18f192d5ded08bf85421b2c31c0930d321eaff4031561602015", + "src/components/ui/drawer.tsx": "0c9464ed4f95207ff6ec0b8f433f550388ea0fe57fecd36bbe100b084ee46a3e", + "src/components/ui/dropdown-menu.tsx": "ba022169876b487c849d046ac577654ab61a4cfba158305c8790c572b704ed9e", + "src/components/ui/empty.tsx": "584b491f9eb69f8041b3d3732a4d139f5af01de19a00b7a97656c7af7a78716a", + "src/components/ui/field.tsx": "e9dcb51b16e5f235bdf23a0b4a092e55c05b2bad08a83126ac675b72aae5380d", + "src/components/ui/form.tsx": "a12f73507ab613e9d797979b988a15e32d23458fc8dd4ba71b922aeee977a3b6", + "src/components/ui/hover-card.tsx": "031f6a309d87c8e42a2282fccc277dde75e373de8c93dad881582c9dc13e05d0", + "src/components/ui/input-group.tsx": "c0df02569e483db8ee86bd51b3b392a1ba62b276604d8c7ea90a9efc5faa9e25", + "src/components/ui/input-otp.tsx": "7fd7ed5273f849cde558238148ee1bbae729aa1149407c7c732b6c65906933d2", + "src/components/ui/input.tsx": "56b7fd30208addbcc2468cfda4f5bc0a55342211deaab61ee35b1c352b1622f1", + "src/components/ui/item.tsx": "6d64b756260749245b3a1f292e2aaf2774d7ec0b8bb99403eb8c1be31bd26900", + "src/components/ui/kbd.tsx": "886e04c83aaa016dfce924e461aa38aa68a9f5c83bdaedd6209dc358c32a8f22", + "src/components/ui/label.tsx": "9ec42c8a57e82311118b794318409ee02b2cebfa49ba6cce8457cff6448cd471", + "src/components/ui/menubar.tsx": "b4be4da586ce1288e8259b1e760a9e317eb0ee9183548c762d8b2a222bbdb3e5", + "src/components/ui/navigation-menu.tsx": "d71f57fe0f365541fbf5d00196b0b78a461d8c4f38d35293e5754680d93b9245", + "src/components/ui/pagination.tsx": "374ad135c3d4ff3ec080a0009cd9745cdd0e12faa89d2b0e86074f11e5127fd1", + "src/components/ui/popover.tsx": "29a217781737bbf5c430859b3de46097a44ada81c4143c2d05543d2167de0ee1", + "src/components/ui/progress.tsx": "9e36ca3f10bc56b69058d8edd342832b72c8c1b2d36cd142a0decb2445c3b724", + "src/components/ui/radio-group.tsx": "b12ca5cef859dd75b274337234bae66e413b0f97845243254a1dedcb2d7a7237", + "src/components/ui/resizable.tsx": "4634b0a700b91e5d422babc1f068b6d145b5f000c8aff62d5cfc9b5711fbff73", + "src/components/ui/scroll-area.tsx": "1c5d0b242d0513848f4bfa9b57ba7f438d9b1120617029941bfaa137196ecead", + "src/components/ui/select.tsx": "68fc754d3042f9fec3406895845e6fcc05d44f93a049478a9d3c706919100ebe", + "src/components/ui/separator.tsx": "e9dddbd8dbbc0eccd683306481b0f0bbc8e2b60ea97817416ebb9fe7fbbbdca8", + "src/components/ui/sheet.tsx": "fbe9b257fd95b9865e1aba651489899c959ed5c16cb8493fe8c2733f83b92ee1", + "src/components/ui/sidebar.tsx": "6074d8027b4bc9ea2d5eb1527a8528a7fa69df96f6261b9c6441c3980d41700f", + "src/components/ui/skeleton.tsx": "f2aea81d8baf2b621945382aabac150e3db40f20d19ac1abea7aff805f1dc33c", + "src/components/ui/slider.tsx": "640996327017c3977e3c61eee8ec55230fa0bec509d0f4b44bdc9acdd8eca138", + "src/components/ui/sonner.tsx": "a3868f2a8aafd8e2dc96b7ae145009939e9d8723cbb5a4b61d7b7d9bed9df478", + "src/components/ui/spinner.tsx": "3e6e6e8d37fb4069f8e43e55318f8db06fbc36e6c8be0096da3c9337c1c798b9", + "src/components/ui/switch.tsx": "5c19dba26a703cda3dba9ca6fc2ec0049187bcc90224c82b134a2fb5d368e80f", + "src/components/ui/table.tsx": "95e3ef5db88b3bbfb68eed12f341fb942e40ca815f4342e1d5dbc8c8d47c783d", + "src/components/ui/tabs.tsx": "e8469e599381cf021ce751c27cca3d8cb06440a45665ca9c2ef2efb0acef1fd9", + "src/components/ui/textarea.tsx": "de4e9fb0fd8e8ed10ea2e475ffe202a922ffe77e3f3edb2c517b0781447ad1b4", + "src/components/ui/toggle-group.tsx": "c63c671fe328f2c1e0d58e3df82a474e73834037c5a39a9ff566a4b3b2cf9010", + "src/components/ui/toggle.tsx": "ab2e52debb86451889ac9519dfe27daf3a86d70aa2833da8ed8f6cf3146197ff", + "src/components/ui/tooltip.tsx": "cbc12f4086448f8a307ed5fbb160f79467c84a44c48ca0dbd2c62e39a2db6f5d", + "src/hooks/__tests__/useKeyboardShortcuts.test.ts": "8fc622e2b9086d11d4f1de3759991673a4c0745b062af665c2a4e43a348294ed", + "src/hooks/__tests__/useSignOutAction.test.tsx": "10f23bb1cd16009400895e4b824cf1cd7d34703ad5dbf4bae89dc509f2bb144a", + "src/hooks/index.ts": "90cc1e84f3108e39bd5623c95b27873a932e2d2b9e5db4b4b6fb8415853a20b5", + "src/hooks/use-is-compact.ts": "368ad314e1015933a269f6fce322b24cfcdd56200d90151ef5086655d1945874", + "src/hooks/use-mobile.ts": "ad0936f84f1df79d3697bfbff9c18f8ad58431c1cbaf2359c6a853b0fcc9f28b", + "src/hooks/useAIUsage.ts": "59ef72909aa9dcf22f281910a808e9a259ad771c3b4de588e0ce76e67bfc013b", + "src/hooks/useActivityLogger.ts": "420ca7dbc66c6ee996d58c855bbca124469c9cdfcc593984ee96c3fba6931bba", + "src/hooks/useAdmin.ts": "7e14d5e5c6c3c7a1d1c8c9388042492ad1f75bb111d46ef61da1e379a86d1a1f", + "src/hooks/useAuth.ts": "e3d3ca9e160e53b06b8aa12323a2d8bebddbe94767f05535e683d082aa43a496", + "src/hooks/useBoard.ts": "0b6754a7220290ef08d4014e10be96e7fb1bdbadb6987bc45a47ee94970f922d", + "src/hooks/useBoardDialogs.ts": "384ae5b59a60b44b9fc490d3e794480e48c60dececb68f296c4e725fc4927d3f", + "src/hooks/useBoards.ts": "bc4551cf900e3b9610eb725244ed0f514449023711e51cc3a810aec77963e10d", + "src/hooks/useCards.ts": "4ba035b326f14c193b31f7ff3a90fef62fe17c02ec978aa886cf8371a6b981e4", + "src/hooks/useColumns.ts": "9a74ad014c218cf73b0597c1f0dc6a148751e8dc282740fcbb26ed045e68bf4c", + "src/hooks/useKeyboardShortcuts.ts": "af636c58a7f409b6529b76218ab796aa1e85eedaabcb178d3502ba9e361364a4", + "src/hooks/useSignOutAction.ts": "231422491ffc6d09bf9f2a1c28737122d47136b6e0383a270f022e749c780025", + "src/hooks/useSubscription.ts": "51b44796a7c66d8bda615f938e321a5376ac4e2599cc15e0cd1288f5a773a5ce", + "src/index.css": "a08b8fc4db94d4313dcc86af63febe68bf5335fc8bbd0e32edff64ac3a4f7821", + "src/lib/__tests__/apiFetch.test.ts": "14c3502dbe019ce9f0cd7b07583561626d12525a7157248c637b876ad06c8b87", + "src/lib/__tests__/auth-helpers.test.ts": "c1d07f51ed4d57140706092a03c0cf516c77642fd3d24d09266e556b7709ac76", + "src/lib/__tests__/board-io.test.ts": "c1d58408527d9b7e8aaf459917563ef188d1d7d7448533861e96fd7dc96995f2", + "src/lib/__tests__/board-merge.test.ts": "af94d29c0f770b2544295eb954a6f3c9377187a2e8b6a9f7e51a2a8143865d18", + "src/lib/__tests__/board-sync.test.ts": "5769ab0e100fe59f3836ac3d327b7e5f7137289bd19e449f72421cbf69bdc56b", + "src/lib/__tests__/calendar-date.test.ts": "25b0d56e2f43aa595782a4c8b68967b03f8fc998c908e0e85c5fbf285119b468", + "src/lib/__tests__/ci-guard.test.ts": "a9570842782b2c1cb368508a9640b9e7dc66018c9d9f15913e7ebadca942953e", + "src/lib/__tests__/claude.test.ts": "3daf4979b17557ba2acfa4bbcadda93fc00c1d687578499e8aaec92ccdf41f66", + "src/lib/__tests__/recurrence.test.ts": "23ae8fa233bf06ce23c751a76a25c3edf3bf1299b7530be180292773c9573526", + "src/lib/__tests__/stripe-webhook.test.ts": "cbc0df8b231c91a58ed9067fd49dd7b16db763f8af0076b81e9c51496d02c113", + "src/lib/__tests__/supabase-auth-lock.test.ts": "5d222ec40db224be052832c59c8ed45ae9b9501ac8ea86e21fbf42015f08a601", + "src/lib/__tests__/templates.test.ts": "20b266bb947edba1e5c2dbe3d99dd88e9257011961f3182e45575d2f3761c683", + "src/lib/__tests__/utils.test.ts": "726d4c2b91b11b17763eb21d266844112f2c32e9702e3d8dd2813a1a3acfb3f1", + "src/lib/apiFetch.ts": "173bb611e2f770c26aa56471d4c05a9cb2159e37512b6d60e57044f1c714cdf3", + "src/lib/auth-session.ts": "d46a05da52968e5d30331d9f48e25a34ca08ed3ede851549998cef654d4c3de4", + "src/lib/board-access.ts": "3aa288d882334c9affa31a81bd4558780df92c2c0272e8b82cfa5c6f8927e2fc", + "src/lib/board-io.ts": "eb9e91591242615d25c9b1db5442b5ec637ee95d48805f6bdcdc3a435c989d04", + "src/lib/board-merge.ts": "8dfc81db05619f0e39c4a33b0c7746c126765c4976d597fcb5c6fc1ecd226daf", + "src/lib/board-sync.ts": "cdb02f74aa3c63c65b7a0412e7fea0f8c8cef7a3b14077f9b2bddb6b19dfbf8d", + "src/lib/calendar-date.ts": "2e67524202bb5364597db86685c8e438574104ecfcd33bdf94d20f8363aae789", + "src/lib/claude.ts": "31bc90968f2ba1c3139497e0d759307c28cc2fb3e43472bcdfbaeeb19e2ac76f", + "src/lib/database/board-members.ts": "37fe55c8609602e4e418600bb94e564ed2da7ce9a2dd8ac371c5f1137d650656", + "src/lib/database/boards.ts": "149dec3eeaaab75b42e10c3cf61b6971444d8342d0f20df07b398ea97ed388c0", + "src/lib/database/cards.ts": "be18b22b257c72774d3df321336f873854f24160b3c21920038e2e524b153d68", + "src/lib/database/columns.ts": "a94edf435468c0966452844da9a1e86275e9cb88d53df4e5e77abcfec57d89fa", + "src/lib/database/feedback.ts": "283b09a7cfccafc984b293b9b96bf1af0aa739b2b01cca518a610aff5c681358", + "src/lib/database/index.ts": "f85d0fb33c3d81a53ccc6c1dec9d8c9ff696a135fa425a1c6781a01f56b647a0", + "src/lib/database/types.ts": "f986e01d6493f34bb87838ba2f79795436289d3682506f2d622e0dfd3f298265", + "src/lib/keyboard.ts": "cf320ee6228b82e81d81d2b74c301bc5f25dcab5bcda0cea39b4bae664b8f9d3", + "src/lib/recurrence.ts": "7c16adf0250b8877305ce9cbc9f1ed96e43970f6047b9ef598a560ec7dab8030", + "src/lib/supabase.ts": "75f0d60fb87120924510be2ca3c00772a5ade8916610862d9db727caa1201789", + "src/lib/templates.ts": "cab61dbe2545d4c62217a99a493ef97b23890c300cfa258030b20434544aa353", + "src/lib/utils.ts": "ace8eec1b148d71b4fad92d583958c906c6ea66a25e32d4c3ae57bb1bed52bc3", + "src/main.tsx": "7406127375e63bc3d916af109672a26d27f1b875b7e81349ca185376feec8fcf", + "src/pages/AccountPage.tsx": "c390563555e5cb0445e4326a55f75cfead8d8316011dda5972a0c1ad3307c0ed", + "src/pages/AdminPage.tsx": "e9f9b15ef9ba4c300a8ccf11951230ec01fd730d570d3bb9dad5b9aab64649f1", + "src/pages/AuthCliPage.tsx": "a9fae0c584ba1f9770fab7c144c0560517af5d54124da01f24d40cf12f23b4fd", + "src/pages/ConnectorConsentPage.tsx": "3bdde7b8b4786f37ede2d77711494553815f32827f74b476c9ebf9b10d6f65b6", + "src/pages/EmbedBoardPage.tsx": "c4b7dfce03d2f0b62bceb5a4e269a1a6a5c53ea5bf4dd388b21f4aa3dee43052", + "src/pages/FeedbackPage.tsx": "08d5d1a8e8916e339bbd7d988738e3970bb4db4dbd8fae99d54758079afdacb6", + "src/pages/LandingPage.tsx": "7196abfa83c51c7a677fe3bf23e0e13242299629b15f20822daea041f0d9329d", + "src/pages/NotFoundPage.tsx": "191c6eeee23e592b6c695579aa0367bc2ebd13f193c691b32bc52e5fbaea7aff", + "src/pages/PrivacyPage.tsx": "7d454f6bd08d02ade52d3c79e811adf66f096b9f6eeacb7a99febaee96ab9bb3", + "src/pages/SharedBoardPage.tsx": "45e2f062d1fb6b9154492189772d26535426ad01980bda09f8358185bee9cacb", + "src/pages/TermsPage.tsx": "ae88aeb6fa7be935be048770c573bc645df756fd15984942b3d0bea981091ca1", + "src/pages/__tests__/LandingPage.test.tsx": "6295bd97e9b1eb0193709501441badc32d6b718c6b250f707be9439eb9e77b78", + "src/pages/__tests__/SharedBoardPage.test.tsx": "9c8c875a0a0ac253af745bc42e48687652f55570e7431e60eaabd048d0833d2d", + "src/routes.tsx": "641bdc4b73a3d0c887ac4acbf6f0e643ccb09f9b22679a4b16a6b1982876c774", + "src/store/__tests__/boardConcurrentMutations.test.ts": "1f754003e8d36738583a9004db7b00777eab74a3e051a89ff68df21ea6f9af8b", + "src/store/__tests__/boardSyncIntegration.test.ts": "75d9fc64d55d34a1e30ca9963fd5dee271956b7ceb5050f42f3208fa18cbb90e", + "src/store/__tests__/useBoardStore.test.ts": "e916ed6127dc720a5af85aa4a7e2855fbecb1075b4d2e5b97b4350c047341443", + "src/store/__tests__/useUndoStore.test.ts": "cf7f398ce474bcb34c7c48f5d5eeb5df0da312a39ffc97979f4c1aefbe0e4ff7", + "src/store/useBoardStore.ts": "6502f75d9be343f0af6549f01895b6471154ef5471a929b013868468591adbfd", + "src/store/useUndoStore.ts": "d0d577d0a3310b698d08f69f98a0777f546a11c8e122a841c47b37ecee58ea6f", + "src/test/setup.ts": "4c6fe3bcefbdacf379fb6fc02b89e2377bebb86f11de391a211e6933baab21b2", + "src/types/database.ts": "e7beb599f96d0758bc972783518a9767305622bc3ff76bbf41385b510bb3ff7b", + "src/types/index.ts": "f8b009e46821ad03a5cf83d1b960650d9b68c0d630e19bf1827b8f53ea4fce2c", + "src/types/index.ts.bak": "8882ce7f161d13ec02ae7fae3d17c48995e9692a1605ad1ce8e5b56c93b9ac53", + "supabase/migrations/20261001044235_plugin_board_editor_enforcement.sql": "24bc22fc072c75157e256a1e4bbf2ab7fbad8639a8cebf666155c06eae2b7f7d", + "supabase/migrations/20261001142109_plugin_oauth_records.sql": "fd03541378a09b10d4f54c5b948aa9aa9500d7dc871e76b36e6b42b73547d2e1", + "supabase/migrations/20261002030041_plugin_connector_vault.sql": "20f2ab5656ab305012a437e7e943c4a38350ae49f4ad65f76c6d2775b8fd9282", + "supabase/migrations/20261002055310_restrict_definer_function_execution.sql": "62af3d4651dbeb57dfa2f22bac7e1df1de644ca9eb564ec26d3a808eaeb9b41c", + "supabase/migrations/20261002060649_connector_expiry_cleanup.sql": "da97273b6b2bc3d9a999dd0ee6aeb7bb019b5f9fe3b58612c11c1c33c83911ab", + "supabase/schema.sql": "09f2457631349bb09ad8f6ddfb2785078d0c0128fdb375cc7f87540d0c5336d0", + "tailwind.config.js": "149b62bbe6c8c83d2f3dfb3196bbdb309156a63a7a289acc12f6c9066c763752", + "tests/connector-ui/README.md": "52824c5e11d5957d19b4d8e9df7f157e8fafa82c50109070fc3c645567ef2ee9", + "tests/connector-ui/ai-drafts.spec.ts": "bd9ae2009b4a9b8830eee93fbb584ffca0a7abaa2e1b61a8434c545440ede274", + "tests/connector-ui/board-access.spec.ts": "3c6cb6a9358c6b0dd1f41d43722bfe0eafba385ecff83dee206c662e57d8ecaf", + "tests/connector-ui/board-accessibility.spec.ts": "5163ac150db2f19ffcd6ef20037c00f4b54ee2727e89f50393f8234bdbd32c1e", + "tests/connector-ui/board-generation.spec.ts": "84fbfcaf67cf40e7320f834fcc95656e57305c14adf3240a4afab88a6de5eef8", + "tests/connector-ui/connector-ownership.spec.ts": "afe593b2412deed97627a1fbe2731a9d2e0ba8f8d5547193685fd1d97d426f23", + "tests/connector-ui/connector.spec.ts": "a12a2c0da60ca65bc56dc7dbf763a24a5e9ec06c7991e89bdf72efbb832fcc4a", + "tests/connector-ui/fixtures.ts": "f2b9ed7075bd7bfc5b76b6709473f23fa1319760ab04ac5baded8a3911e563f4", + "tests/connector-ui/navigation-drafts.spec.ts": "36d6e1c1b87723e1bbf114c76c7bb780474f4ea970fe700b0a1e6354a2c6fae3", + "tests/connector-ui/signout.spec.ts": "f16c1fab42a0fac4f91667c557b80da0ebd58c7cb93d718d8fc380aff83afc61", + "tests/e2e/board-sync.spec.ts": "f34599bb2d5587791ce2eb7df44df53e93433b109bd78256a60ce6bf8bb2b727", + "tests/e2e/card-parity.spec.ts": "bfca1b86d5883dd9f0e6abcb29a5f535bc49c9f2d32003b826a3b044517af48a", + "tests/e2e/date-parity.spec.ts": "2fb4967aacd1ca1e25195ed1053c193fa131f5e809d24351deaca8bbc459956d", + "tests/e2e/env.ts": "dc326d9fe840b50b5509006f3065fa6c096b935d1f24aefc834c614c4cbf57c1", + "tests/e2e/global-setup.ts": "83a847c325d9c5494d4a3bcd63476ca9d188d38132b1e094ce7aed058a09229d", + "tests/e2e/helpers/mcp.mjs": "d3c6c4ebc24249d31ee0f9c1155d7c5fba734870c6b4841b63e53122e47d243a", + "tests/e2e/logged-in.spec.ts": "9a2611bc5980932008b706fb285a278a23d10bece7bd579358e55c7859fc965f", + "tests/e2e/login-ui.public.spec.ts": "5b49d5b01401b62473ae99baa98c61aa826bfafd9524fd30b3ce7b70f0620a87", + "tests/e2e/recurrence-parity.spec.ts": "64a200a09483071e6c146ef202f3faef12a90e9df4fd05cebfe0aa9b16d19db7", + "tsconfig.app.json": "90eb3ac3b7cd4d06c4c837f073f3855774761998780ac01cec7a13d0d5de5cfe", + "tsconfig.json": "a389bfb0309454cd0828a3c4a7431e56c3d6f50a70e648613fd0f51ae300057c", + "tsconfig.node.json": "7888dcc526df903c9ae2360a32b445b1de51c36a65e60200cdc22594bd3a2166", + "vercel.json": "44a58ad3b5e69920f3285377663463995ee35be6f99c261b949911528be09360", + "vite.config.ts": "3b313be8b240dc5c5a4aef9bf20634ddec444eefc577a332931c9eab76326545" +} diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/browser-harness-start-failed.log b/docs/qa/v0.8/ai-response-limit/browser-integration/browser-harness-start-failed.log new file mode 100644 index 0000000..0bf659b --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/browser-integration/browser-harness-start-failed.log @@ -0,0 +1,6 @@ +[WebServer] error when starting preview server: +[WebServer] Error: The directory "dist" does not exist. Did you build your project? +[WebServer] at preview (file:///Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/work/zeroboard-ai-response-limit/node_modules/vite/dist/node/chunks/config.js:35067:200) +[WebServer] at async CAC. (file:///Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/work/zeroboard-ai-response-limit/node_modules/vite/dist/node/cli.js:669:18) +Error: Process from config.webServer was not able to start. Exit code: 1 + diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/browser.log b/docs/qa/v0.8/ai-response-limit/browser-integration/browser.log new file mode 100644 index 0000000..ce3bfca --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/browser-integration/browser.log @@ -0,0 +1,25 @@ +[WebServer] (node:69702) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set. +[WebServer] (Use `node --trace-warnings ...` to show where the warning was created) + +Running 18 tests using 1 worker + + ✓ 1 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:106:1 › AI-only text blocks browser Back, preserves text and focus on Stay, and leaves explicitly (2.5s) + ✓ 2 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:126:1 › Clear chat and closing AI retain its hidden draft and truthful Account warning (2.2s) + ✓ 3 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:145:1 › hidden AI draft delays sign-out and survives a failed explicit attempt for retry (3.1s) + ✓ 4 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:164:1 › same-owner token renewal keeps AI text while an actual SDK account replacement clears the old intent (3.2s) + ✓ 5 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:182:1 › composing Enter keeps AI text guarded and accepted submission clears only the unsent reason (5.2s) + ✓ 6 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/board-access.spec.ts:214:3 › timeline ignores composing Enter and Escape until composition ends (4.1s) + ✓ 7 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/board-access.spec.ts:214:3 › timeline ignores 229 Enter and Escape until composition ends (2.5s) + ✓ 8 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/board-access.spec.ts:760:1 › timeline recurring cards stay operable when drag is disabled (2.0s) + ✓ 9 [desktop] › work/zeroboard-ai-response-limit/tests/connector-ui/board-access.spec.ts:775:1 › timeline downgrade keeps title copyable while open and explains closing discards it (4.4s) + ✓ 10 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:106:1 › AI-only text blocks browser Back, preserves text and focus on Stay, and leaves explicitly (3.1s) + ✓ 11 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:126:1 › Clear chat and closing AI retain its hidden draft and truthful Account warning (2.9s) + ✓ 12 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:145:1 › hidden AI draft delays sign-out and survives a failed explicit attempt for retry (11.2s) + ✓ 13 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:164:1 › same-owner token renewal keeps AI text while an actual SDK account replacement clears the old intent (6.8s) + ✓ 14 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/ai-drafts.spec.ts:182:1 › composing Enter keeps AI text guarded and accepted submission clears only the unsent reason (1.7s) + ✓ 15 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/board-access.spec.ts:214:3 › timeline ignores composing Enter and Escape until composition ends (1.9s) + ✓ 16 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/board-access.spec.ts:214:3 › timeline ignores 229 Enter and Escape until composition ends (1.7s) + ✓ 17 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/board-access.spec.ts:760:1 › timeline recurring cards stay operable when drag is disabled (1.7s) + ✓ 18 [mobile] › work/zeroboard-ai-response-limit/tests/connector-ui/board-access.spec.ts:775:1 › timeline downgrade keeps title copyable while open and explains closing discards it (2.1s) + + 18 passed (1.6m) diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/playwright.config.mjs b/docs/qa/v0.8/ai-response-limit/browser-integration/playwright.config.mjs new file mode 100644 index 0000000..27b1471 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/browser-integration/playwright.config.mjs @@ -0,0 +1,7 @@ +import { defineConfig, devices } from '/Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/work/zeroboard-ai-response-limit/node_modules/@playwright/test/index.mjs'; +export default defineConfig({ + testDir: '/Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/work/zeroboard-ai-response-limit/tests/connector-ui', testMatch: ['board-access.spec.ts', 'ai-drafts.spec.ts'], grep: /timeline (ignores|recurring|downgrade)|AI-only|Clear chat and closing AI|hidden AI draft|same-owner token renewal|composing Enter keeps AI/, outputDir: '/Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/outputs/gauntlet/thirteenth-sdk-integration/browser-results', fullyParallel: false, workers: 1, retries: 0, reporter: [['list']], + use: { baseURL: 'http://127.0.0.1:4267', screenshot: 'only-on-failure', trace: 'retain-on-failure', permissions: ['clipboard-read', 'clipboard-write'] }, + projects: [{name: 'desktop', use: {...devices['Desktop Chrome']}}, {name: 'mobile', use: {...devices['iPhone 13'], defaultBrowserType: 'chromium'}}], + webServer: {command: '/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/vite/bin/vite.js preview --config /Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/outputs/gauntlet/thirteenth-sdk-integration/vite-build.config.mts --host 127.0.0.1 --port 4267 --strictPort', cwd: '/Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/work/zeroboard-ai-response-limit', url: 'http://127.0.0.1:4267', reuseExistingServer: false, timeout: 60000, env: { VITE_SUPABASE_URL: 'https://connector-fixture.invalid', VITE_SUPABASE_ANON_KEY: 'disposable-fixture-public-key' } } +}); diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/hidden-draft-warning-desktop.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/hidden-draft-warning-desktop.png new file mode 100644 index 0000000..6c54f64 Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/hidden-draft-warning-desktop.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/hidden-draft-warning-mobile.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/hidden-draft-warning-mobile.png new file mode 100644 index 0000000..38095da Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/hidden-draft-warning-mobile.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/signout-failure-retained-draft-desktop.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/signout-failure-retained-draft-desktop.png new file mode 100644 index 0000000..345c91f Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/signout-failure-retained-draft-desktop.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/signout-failure-retained-draft-mobile.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/signout-failure-retained-draft-mobile.png new file mode 100644 index 0000000..940ced6 Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/signout-failure-retained-draft-mobile.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-stay-desktop.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-stay-desktop.png new file mode 100644 index 0000000..975205e Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-stay-desktop.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-stay-mobile.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-stay-mobile.png new file mode 100644 index 0000000..da48a06 Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-stay-mobile.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-warning-desktop.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-warning-desktop.png new file mode 100644 index 0000000..137c706 Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-warning-desktop.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-warning-mobile.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-warning-mobile.png new file mode 100644 index 0000000..ce50a59 Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-warning-mobile.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/timeline/read-only-title-desktop.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/timeline/read-only-title-desktop.png new file mode 100644 index 0000000..6c42e56 Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/timeline/read-only-title-desktop.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/timeline/read-only-title-mobile.png b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/timeline/read-only-title-mobile.png new file mode 100644 index 0000000..345437b Binary files /dev/null and b/docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/timeline/read-only-title-mobile.png differ diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/verification.json b/docs/qa/v0.8/ai-response-limit/browser-integration/verification.json new file mode 100644 index 0000000..0329b48 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/browser-integration/verification.json @@ -0,0 +1,115 @@ +{ + "recordedAt": "2026-10-02T13:15:07.393509+00:00", + "candidateHead": "9893eb7394a262f87632b9db3e5fcbbff8b576e7", + "mergedBase": "44458fec738110d67d9158b98e82215fcbaa3c96", + "runtime": "Node20.20.2, macOSarm64, Chromium desktop/mobile", + "browserResult": { + "total": 18, + "passed": 18, + "failed": 0, + "workers": 1, + "retries": 0, + "reportedElapsed": "1.6m" + }, + "sourceFreeze": { + "files": 372, + "unchanged": true, + "manifest": "before-browser-source.json" + }, + "artifactDirectory": "/private/tmp/zeroboard-sdk-integrated-built-smoke/dist", + "artifactHashes": { + "android-chrome-192x192.png": "50117c38991d1f05eb547aa9fdd5310ddbc1c3c3191074974178cedba6f67b88", + "android-chrome-512x512.png": "8372cbeffa825e3add85147f032f25f27c394bdec8f25765ca172b904d1e26d8", + "apple-touch-icon.png": "bc8585046099cb1b4ed0def79c5c8965be7503da6abd47b2bb266d896b210cdc", + "assets/AppShell-CjOWo3DY.js": "bdbc44e06ce67b743efef57c03722c32717d3c13b482edb6c20e0323bebbc94e", + "assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff": "9e97905f0663eab927bcaa72b4e5b844bfa980ada3f894ff92052ec7ed2d8c03", + "assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2": "259b63d9a2dcdf449b73f46624e409de1d62a51134e884d3f4af1242736cde10", + "assets/geist-mono-latin-400-normal-CoULgQGM.woff": "af2a06fc6940abff35305a96ce4e2f69c2934106339b488b8cb85ca6f136dfff", + "assets/geist-mono-latin-400-normal-LC9RFr9I.woff2": "616e37ca59a2afebe306751773a538b93f5a2d9a90fd3fc97ce73321cb93af51", + "assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2": "7f4a5d3c1cdf8a5bc8deb47b85606a5486d5159d42eba048bae9583c4d085cd0", + "assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff": "9f73a257660b9605fd3fae18eec73f1813da5d4e06638f5f7d2b155750530185", + "assets/geist-sans-latin-400-normal-BOaIZNA2.woff": "b2f5931f1a903bcc64af96ee41b3fed53a8ce74e9261181931a680a50560485b", + "assets/geist-sans-latin-400-normal-gapTbOY8.woff2": "e6ef6abb39c762ed2259cc814e6f16888c540cd84835962227b56ab2354f27f1", + "assets/geist-sans-latin-500-normal-CN2lyvyL.woff": "5d679b8796eed440d6e7e2e94c37390b82f9db77aa92cfc21e96a1cdeecfba3d", + "assets/geist-sans-latin-500-normal-uokXdC-Q.woff2": "40073e90816315c92e4f4381bd50b6fdc950b22b0dd010a4179046cf588d4f12", + "assets/geist-sans-latin-600-normal-CA1yjETN.woff": "3903ed7633d563de34bbbf609e869a878e4b4081a25011a195b7a80043ecafe9", + "assets/geist-sans-latin-600-normal-DFOURf8L.woff2": "9d99fbd791968493fa507ac846de561cee47b00f8100c23cad333b3cb78392d6", + "assets/geist-sans-latin-700-normal-BmN9tIp5.woff2": "3d59addfafec3452d44717aa0a18911d5c3812487ed06af47f2ef27192ea1eed", + "assets/geist-sans-latin-700-normal-CjScfYeH.woff": "a25e16202a8cd74d4a149b97d69262582e23ae59abfde1cee1a051ba5c41622a", + "assets/index-CHEpaECk.css": "263e79f76a1b7eea90ef1464343a1cde2748db1ae45e75881816b9f83fe9cf05", + "assets/index-DbFgEV0a.js": "f46fefd57227231264f09a548bc37a305d954d1ba7224c69cbcf798601f1f37b", + "assets/matter-Dk2mHJSa.js": "2bb7fdfd8fb1bb43510645ce6528a51220b2a98ba0d40e0a1da804224b5f6979", + "favicon-16x16.png": "bfbf0d89f45777cd191e9469821d552a6fdd165caed3df063aaaa35069312864", + "favicon-32x32.png": "346c79ed3891dff343b7ea9ff401095dbe756c97f1c872408f87c242c3ecb597", + "favicon.ico": "b1a99af77445241f1676ddbf23fb12b3f7b59f0ca3ccda3158834b0179b31a15", + "index.html": "98c17efb8c749189642f6f755f2c08c6bc517fafbbc3c66c3b95c02e6519b17f", + "logo/logo_color.svg": "471cfbd7f8e6c166e1f034b9a8a859f93b7dd0d4485a692addef37a25119ce23", + "logo/logo_dark_pointer.svg": "bfc85a05ebd3a97ea76a282a07ca486c9f2e781f0241fd5306995df6ec5c42cf", + "logo/logo_wordmark.svg": "d722e84c19e78e085cd2039c133dddc956263e7bdbfdd126da4afe03e94ba3ef", + "screenshots/ZeroBoardAI.gif": "10f5b724226fee0f709f004cc56328d847934a4d22677017f43e1e1430a566da", + "screenshots/ai-assist.png": "8dc1b38f769e288eadd1fa183083b81ac117bd7b9a1761bb24f63cd7d0a21a3e", + "screenshots/ai-plan-a-sprint.png": "3dd5b810495f077a2bd15b3d7203638b210ebe064f058636828e374d171584f6", + "screenshots/card-editor.png": "61675bb2019e0a35a6b4c260d19cf1b7bb8207576d3635c58ee03f75cbfafca2", + "screenshots/choose-background-color.png": "0c89279f420dbd38a8c38543ce878f46281cb1febe274cbf7fddfafb1bff24c3", + "screenshots/deploy-with-vercel.png": "d769ff3378e29b68f7f192c841b70b5c6ffba555907bc1d382c1514f3965a62b", + "screenshots/export-to-json.png": "86e7c25b6dc869b735ab5cf872f2fd59c0d8b178a475f9b7535705906ecba9ff", + "screenshots/kanban.png": "88d485f1d44566b0a8c15a510d0908faaaaac76d377815a8a441eec6787660ad", + "screenshots/save-as-template.png": "79b4c2c514e3e5337c0e548ea3182fb943335890032a9781fd2d239b879ba4c4", + "screenshots/sharing.png": "a1ecc503709eb34cdec2e56d5eff68499f27181a03d8e42225f699ec3499f8f2", + "screenshots/sign-in-auth.png": "f37d071428675266004e3567b546ebd6038c734e1c3a17554f33b5680e8895f8", + "screenshots/timeline.png": "9196b6a6bb5dc771e75e14eb92d77f850cb908911be409cb4c2856ffd0d09317", + "zeroboard-mcp-commercial.en.vtt": "0bae4a9b69406072773a28b19a7d4eb67c07a5bf4c2143dbc934e89f76542b09" + }, + "evidence": { + "playwright.config.mjs": "26baa3cd87ff15bce213b4646c4a4cac654b82a8fa7d00c9deff5ddf46a7ebc5", + "vite-build.config.mts": "a14bef958e5a62dd86e0e816f0e377e4ad9dd4235271c14b799e720be39ec5de", + "browser.log": "d59b027019322cdcbe446e3eed78dbc7f3c18ae375eb452d7e350480823cb8b7", + "browser-harness-start-failed.log": "e1c99eb3f0188c260c9e9b3d8f1ba266c725aa498bd292ec4e4748e480eb0381", + "before-browser-source.json": "3c35d5d53fe465c0ecbdbec6d8a7767957e68a144488b5770ff44503631c12e9", + "after-browser-source.json": "3c35d5d53fe465c0ecbdbec6d8a7767957e68a144488b5770ff44503631c12e9" + }, + "screenshots": { + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/hidden-draft-warning-desktop.png": { + "sha256": "e24605110b90f8f4da0d91b3e1db641e9d14b9009c0b37be4138194761505a0d", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/hidden-draft-warning-mobile.png": { + "sha256": "20b8a585eeebe604438508115bcca1aeb0815be2aaf663008b280b9f2367385b", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/signout-failure-retained-draft-desktop.png": { + "sha256": "9d6d1e4841c980061a8cdcdc6521046766af70d120931acc12051a30535163e2", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/signout-failure-retained-draft-mobile.png": { + "sha256": "6b5ddae63496ddf570b502861c923f22bc9b576b0ae6dafdd4f8742947887412", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-stay-desktop.png": { + "sha256": "8423713f53e96c2e6cf3cae52cbdafd2b8837be54411ff0a5a7174aea6756b7b", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-stay-mobile.png": { + "sha256": "b1ae6a683359632fb099f6ea1df58e0d919f4308d7732f56ea2bed008002c871", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-warning-desktop.png": { + "sha256": "ea17079c8e9cff88dcf0dd78125f9a9ce45d100ef7c1833d24edcd85cf20b654", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/ai/visible-draft-warning-mobile.png": { + "sha256": "8c845069c8b66a81c799f27a3174a921aa67eca364301959f650e31690390c1c", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/timeline/read-only-title-desktop.png": { + "sha256": "9ae878dd690bba30437fff5a7e8427d3868e212dcafc71b39015cea7ec4b5128", + "scope": "Actual compiled integrated disposable browser fixture" + }, + "docs/qa/v0.8/ai-response-limit/browser-integration/screenshots/timeline/read-only-title-mobile.png": { + "sha256": "7a401b24deefb7d0219fc94e87b93806c5e929eddf8cfafbbb47883185ecbe8f", + "scope": "Actual compiled integrated disposable browser fixture" + } + }, + "harnessCorrection": "Initial preview command accidentally retained npm separator --; Vite selected default dist and exited before any tests. Only the private command was corrected; the failed start log is preserved. All actual18 tests ran once with zero retries.", + "scope": "No live provider, production user or human browser access. UI product source is inherited from PR42/43; these captures validate the freshly built SDK-integrated bundle." +} diff --git a/docs/qa/v0.8/ai-response-limit/browser-integration/vite-build.config.mts b/docs/qa/v0.8/ai-response-limit/browser-integration/vite-build.config.mts new file mode 100644 index 0000000..67a5d18 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/browser-integration/vite-build.config.mts @@ -0,0 +1,2 @@ +import original from '/Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/work/zeroboard-ai-response-limit/vite.config.ts'; +export default { ...original, cacheDir: '/private/tmp/zeroboard-sdk-integrated-vite-cache', build: { ...original.build, outDir: '/private/tmp/zeroboard-sdk-integrated-built-smoke/dist', emptyOutDir: true } }; diff --git a/docs/qa/v0.8/ai-response-limit/candidate.json b/docs/qa/v0.8/ai-response-limit/candidate.json new file mode 100644 index 0000000..c14a4c4 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/candidate.json @@ -0,0 +1,50 @@ +{ + "phase": "candidate", + "totalTests": 8, + "passed": 8, + "failed": 0, + "exitCode": 0, + "success": true, + "cases": [ + { + "name": "actual OpenAI chat adapter response size guard accepts ordinary successful streamed JSON", + "status": "passed", + "durationMs": 65.26920900000005 + }, + { + "name": "actual OpenAI chat adapter response size guard preserves an ordinary streamed upstream JSON error", + "status": "passed", + "durationMs": 4.733207999999877 + }, + { + "name": "actual OpenAI chat adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=false)", + "status": "passed", + "durationMs": 4.577041999999892 + }, + { + "name": "actual OpenAI chat adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=true)", + "status": "passed", + "durationMs": 1.349333999999999 + }, + { + "name": "actual OpenAI responses adapter response size guard accepts ordinary successful streamed JSON", + "status": "passed", + "durationMs": 22.173416999999972 + }, + { + "name": "actual OpenAI responses adapter response size guard preserves an ordinary streamed upstream JSON error", + "status": "passed", + "durationMs": 1.2842500000001564 + }, + { + "name": "actual OpenAI responses adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=false)", + "status": "passed", + "durationMs": 4.907042000000047 + }, + { + "name": "actual OpenAI responses adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=true)", + "status": "passed", + "durationMs": 6.9055419999999685 + } + ] +} diff --git a/docs/qa/v0.8/ai-response-limit/compatibility.json b/docs/qa/v0.8/ai-response-limit/compatibility.json new file mode 100644 index 0000000..11de36d --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/compatibility.json @@ -0,0 +1,174 @@ +{ + "runtimeNode": "20.20.2", + "totalTests": 33, + "passed": 33, + "failed": 0, + "success": true, + "cases": [ + { + "name": "actual OpenAI chat adapter response size guard accepts ordinary successful streamed JSON", + "status": "passed", + "durationMs": 158.88208299999997 + }, + { + "name": "actual OpenAI chat adapter response size guard preserves an ordinary streamed upstream JSON error", + "status": "passed", + "durationMs": 5.2870419999999285 + }, + { + "name": "actual OpenAI chat adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=false)", + "status": "passed", + "durationMs": 24.026417000000038 + }, + { + "name": "actual OpenAI chat adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=true)", + "status": "passed", + "durationMs": 5.298416000000088 + }, + { + "name": "actual OpenAI responses adapter response size guard accepts ordinary successful streamed JSON", + "status": "passed", + "durationMs": 42.931790999999976 + }, + { + "name": "actual OpenAI responses adapter response size guard preserves an ordinary streamed upstream JSON error", + "status": "passed", + "durationMs": 6.871999999999844 + }, + { + "name": "actual OpenAI responses adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=false)", + "status": "passed", + "durationMs": 7.1106660000000375 + }, + { + "name": "actual OpenAI responses adapter response size guard rejects and cancels declared oversized streamed JSON before reading (error=true)", + "status": "passed", + "durationMs": 24.208250000000135 + }, + { + "name": "resolveCommandIds resolves columnId for add_card from columnTitle", + "status": "passed", + "durationMs": 13.44549999999981 + }, + { + "name": "resolveCommandIds matches columns case-insensitively and by substring", + "status": "passed", + "durationMs": 0.5855840000003809 + }, + { + "name": "resolveCommandIds resolves cardId + columnId for move_card and its target column", + "status": "passed", + "durationMs": 1.0490410000002157 + }, + { + "name": "resolveCommandIds prefers an exact title match over a substring match", + "status": "passed", + "durationMs": 0.9127499999995052 + }, + { + "name": "resolveCommandIds resolves cardId + columnId for edit_card", + "status": "passed", + "durationMs": 0.7952919999997903 + }, + { + "name": "resolveCommandIds remove_card resolves the card under the `title` param", + "status": "passed", + "durationMs": 0.826958999999988 + }, + { + "name": "resolveCommandIds restore_card prefers the archived card", + "status": "passed", + "durationMs": 0.3352080000004207 + }, + { + "name": "resolveCommandIds does not attach a cardId for bulk (allCards) operations", + "status": "passed", + "durationMs": 0.2924590000002354 + }, + { + "name": "resolveCommandIds never overwrites an id the model already supplied", + "status": "passed", + "durationMs": 1.76508400000057 + }, + { + "name": "resolveCommandIds leaves params untouched when the title cannot be resolved", + "status": "passed", + "durationMs": 1.1174160000000484 + }, + { + "name": "resolveCommandIds does not mutate the input command params", + "status": "passed", + "durationMs": 0.7344579999999041 + }, + { + "name": "AI shared-board permissions keeps composition confirmation out of AI commands ({\"isComposing\":true})", + "status": "passed", + "durationMs": 345.5799999999999 + }, + { + "name": "AI shared-board permissions keeps composition confirmation out of AI commands ({\"keyCode\":229})", + "status": "passed", + "durationMs": 161.72012499999983 + }, + { + "name": "AI shared-board permissions keeps viewer board commands read-only and does not claim an edit succeeded", + "status": "passed", + "durationMs": 585.9767499999998 + }, + { + "name": "AI shared-board permissions keeps commenter board commands read-only and does not claim an edit succeeded", + "status": "passed", + "durationMs": 319.37241600000016 + }, + { + "name": "AI shared-board permissions checks current access after waiting for an AI response", + "status": "passed", + "durationMs": 579.6504999999997 + }, + { + "name": "AI shared-board permissions checks access between commands in an AI batch", + "status": "passed", + "durationMs": 1109.3245000000006 + }, + { + "name": "AI shared-board permissions still permits a board summary for a viewer", + "status": "passed", + "durationMs": 916.4916249999987 + }, + { + "name": "AI shared-board permissions permits creating a separate owned board while viewing a shared read-only board", + "status": "passed", + "durationMs": 574.442833000001 + }, + { + "name": "AI card content commands uses the latest moved card after waiting for the AI response: edit_card", + "status": "passed", + "durationMs": 584.9447499999987 + }, + { + "name": "AI card content commands uses the latest moved card after waiting for the AI response: add_checklist", + "status": "passed", + "durationMs": 311.28229099999953 + }, + { + "name": "AI card content commands does not execute a delayed response after the signed-in account changes", + "status": "passed", + "durationMs": 867.265958 + }, + { + "name": "AI card content commands edits only body text and preserves checklist, image, metadata and summary ({\"cardId\":\"card-1\"})", + "status": "passed", + "durationMs": 449.5670829999981 + }, + { + "name": "AI card content commands edits only body text and preserves checklist, image, metadata and summary ({\"cardTitle\":\"Review card\"})", + "status": "passed", + "durationMs": 406.3818749999991 + }, + { + "name": "AI card content commands restores stored checklist items while keeping body and image when adding tasks to all cards", + "status": "passed", + "durationMs": 455.2772499999992 + } + ] +} diff --git a/docs/qa/v0.8/ai-response-limit/integration-build.log b/docs/qa/v0.8/ai-response-limit/integration-build.log new file mode 100644 index 0000000..1fab6a9 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/integration-build.log @@ -0,0 +1,33 @@ +vite v7.3.0 building client environment for production... +transforming... +Browserslist: browsers data (caniuse-lite) is 10 months old. Please run: + npx update-browserslist-db@latest + Why you should do it regularly: https://github.com/browserslist/update-db#readme +✓ 2403 modules transformed. +rendering chunks... +computing gzip size... +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/index.html 0.69 kB │ gzip: 0.38 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 5.46 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 6.42 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff 7.16 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff 8.74 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 14.71 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff 19.17 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-sans-latin-400-normal-gapTbOY8.woff2 33.40 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-sans-latin-500-normal-uokXdC-Q.woff2 34.72 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-sans-latin-600-normal-DFOURf8L.woff2 35.29 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-sans-latin-700-normal-BmN9tIp5.woff2 35.48 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-sans-latin-400-normal-BOaIZNA2.woff 38.91 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-sans-latin-500-normal-CN2lyvyL.woff 40.52 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-sans-latin-600-normal-CA1yjETN.woff 41.20 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/geist-sans-latin-700-normal-CjScfYeH.woff 41.40 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/index-CHEpaECk.css 123.98 kB │ gzip: 20.96 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/matter-Dk2mHJSa.js 84.44 kB │ gzip: 26.81 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/AppShell-CjOWo3DY.js 354.18 kB │ gzip: 92.38 kB +../../../../../../../../private/tmp/zeroboard-sdk-integrated-built-smoke/dist/assets/index-DbFgEV0a.js 998.53 kB │ gzip: 291.02 kB + +(!) Some chunks are larger than 500 kB after minification. Consider: +- Using dynamic import() to code-split the application +- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks +- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. +✓ built in 11.59s diff --git a/docs/qa/v0.8/ai-response-limit/integration-full-test-summary.json b/docs/qa/v0.8/ai-response-limit/integration-full-test-summary.json new file mode 100644 index 0000000..44f4431 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/integration-full-test-summary.json @@ -0,0 +1,289 @@ +{ + "head": "9893eb7394a262f87632b9db3e5fcbbff8b576e7", + "node": "20.20.2", + "total": 966, + "passed": 966, + "failed": 0, + "files": 46, + "success": true, + "attempts": 1, + "maxWorkers": 2, + "suites": [ + { + "file": "api/_lib/__tests__/ai-provider-response-limit.test.ts", + "status": "passed", + "total": 8, + "passed": 8 + }, + { + "file": "api/_lib/__tests__/connector-config.test.ts", + "status": "passed", + "total": 3, + "passed": 3 + }, + { + "file": "api/_lib/__tests__/connector-readiness.test.ts", + "status": "passed", + "total": 60, + "passed": 60 + }, + { + "file": "api/_lib/__tests__/connector-sql.test.ts", + "status": "passed", + "total": 4, + "passed": 4 + }, + { + "file": "api/_lib/__tests__/connector.test.ts", + "status": "passed", + "total": 21, + "passed": 21 + }, + { + "file": "api/_lib/__tests__/resolve-commands.test.ts", + "status": "passed", + "total": 11, + "passed": 11 + }, + { + "file": "src/components/__tests__/ErrorBoundary.test.tsx", + "status": "passed", + "total": 3, + "passed": 3 + }, + { + "file": "src/hooks/__tests__/useKeyboardShortcuts.test.ts", + "status": "passed", + "total": 18, + "passed": 18 + }, + { + "file": "src/hooks/__tests__/useSignOutAction.test.tsx", + "status": "passed", + "total": 7, + "passed": 7 + }, + { + "file": "src/pages/__tests__/LandingPage.test.tsx", + "status": "passed", + "total": 1, + "passed": 1 + }, + { + "file": "src/pages/__tests__/SharedBoardPage.test.tsx", + "status": "passed", + "total": 10, + "passed": 10 + }, + { + "file": "src/store/__tests__/boardConcurrentMutations.test.ts", + "status": "passed", + "total": 21, + "passed": 21 + }, + { + "file": "src/store/__tests__/boardSyncIntegration.test.ts", + "status": "passed", + "total": 70, + "passed": 70 + }, + { + "file": "src/store/__tests__/useBoardStore.test.ts", + "status": "passed", + "total": 34, + "passed": 34 + }, + { + "file": "src/store/__tests__/useUndoStore.test.ts", + "status": "passed", + "total": 15, + "passed": 15 + }, + { + "file": "src/lib/__tests__/apiFetch.test.ts", + "status": "passed", + "total": 13, + "passed": 13 + }, + { + "file": "src/lib/__tests__/auth-helpers.test.ts", + "status": "passed", + "total": 12, + "passed": 12 + }, + { + "file": "src/lib/__tests__/board-io.test.ts", + "status": "passed", + "total": 50, + "passed": 50 + }, + { + "file": "src/lib/__tests__/board-merge.test.ts", + "status": "passed", + "total": 63, + "passed": 63 + }, + { + "file": "src/lib/__tests__/board-sync.test.ts", + "status": "passed", + "total": 51, + "passed": 51 + }, + { + "file": "src/lib/__tests__/calendar-date.test.ts", + "status": "passed", + "total": 6, + "passed": 6 + }, + { + "file": "src/lib/__tests__/ci-guard.test.ts", + "status": "passed", + "total": 32, + "passed": 32 + }, + { + "file": "src/lib/__tests__/claude.test.ts", + "status": "passed", + "total": 15, + "passed": 15 + }, + { + "file": "src/lib/__tests__/recurrence.test.ts", + "status": "passed", + "total": 78, + "passed": 78 + }, + { + "file": "src/lib/__tests__/stripe-webhook.test.ts", + "status": "passed", + "total": 7, + "passed": 7 + }, + { + "file": "src/lib/__tests__/supabase-auth-lock.test.ts", + "status": "passed", + "total": 15, + "passed": 15 + }, + { + "file": "src/lib/__tests__/templates.test.ts", + "status": "passed", + "total": 19, + "passed": 19 + }, + { + "file": "src/lib/__tests__/utils.test.ts", + "status": "passed", + "total": 13, + "passed": 13 + }, + { + "file": "src/components/ai/__tests__/AIAssistant.test.tsx", + "status": "passed", + "total": 20, + "passed": 20 + }, + { + "file": "src/components/auth/__tests__/AuthRedirect.test.tsx", + "status": "passed", + "total": 5, + "passed": 5 + }, + { + "file": "src/components/auth/__tests__/SignInModal.test.tsx", + "status": "passed", + "total": 6, + "passed": 6 + }, + { + "file": "src/components/auth/__tests__/signOut.test.tsx", + "status": "passed", + "total": 6, + "passed": 6 + }, + { + "file": "src/components/connectors/__tests__/connector-api.test.ts", + "status": "passed", + "total": 25, + "passed": 25 + }, + { + "file": "src/components/connectors/__tests__/connector-ownership.test.tsx", + "status": "passed", + "total": 30, + "passed": 30 + }, + { + "file": "src/components/connectors/__tests__/connector-setup.test.ts", + "status": "passed", + "total": 1, + "passed": 1 + }, + { + "file": "src/components/connectors/__tests__/connector-ui.test.tsx", + "status": "passed", + "total": 31, + "passed": 31 + }, + { + "file": "api/invite/__tests__/send.test.ts", + "status": "passed", + "total": 26, + "passed": 26 + }, + { + "file": "src/components/board/__tests__/ActiveCardEditor.test.tsx", + "status": "passed", + "total": 17, + "passed": 17 + }, + { + "file": "src/components/board/__tests__/BoardSelector.test.tsx", + "status": "passed", + "total": 3, + "passed": 3 + }, + { + "file": "src/components/board/__tests__/BoardSyncNotice.test.tsx", + "status": "passed", + "total": 13, + "passed": 13 + }, + { + "file": "src/components/board/__tests__/CardActivityFeed.test.tsx", + "status": "passed", + "total": 8, + "passed": 8 + }, + { + "file": "src/components/board/__tests__/CardEditor.test.tsx", + "status": "passed", + "total": 53, + "passed": 53 + }, + { + "file": "src/components/board/__tests__/CreateBoardDialog.async.test.tsx", + "status": "passed", + "total": 16, + "passed": 16 + }, + { + "file": "src/components/board/__tests__/KanbanCard.test.tsx", + "status": "passed", + "total": 6, + "passed": 6 + }, + { + "file": "src/components/board/__tests__/ReadOnlyBoard.test.tsx", + "status": "passed", + "total": 13, + "passed": 13 + }, + { + "file": "src/components/layout/__tests__/AppShell.test.tsx", + "status": "passed", + "total": 27, + "passed": 27 + } + ] +} diff --git a/docs/qa/v0.8/ai-response-limit/integration-full-test.log b/docs/qa/v0.8/ai-response-limit/integration-full-test.log new file mode 100644 index 0000000..12ec10e --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/integration-full-test.log @@ -0,0 +1,710 @@ + + RUN v4.1.4 /Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/work/zeroboard-ai-response-limit + + ✓ src/lib/__tests__/board-merge.test.ts (63 tests) 189ms +stdout | api/_lib/__tests__/connector.test.ts +{"step":"auth-module:loaded","ts":1790946345588} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":false,"urlHost":"placeholder.supabase.co"} + + ✓ src/store/__tests__/boardSyncIntegration.test.ts (70 tests) 1363ms + ✓ src/lib/__tests__/board-sync.test.ts (51 tests) 142ms + ✓ src/components/board/__tests__/CardEditor.test.tsx (53 tests) 19911ms + ✓ waits before adding a checklist item with {"isComposing":true,"keyCode":13} 484ms + ✓ keeps the attachment name draft for composing Enter and Escape with {"isComposing":true,"keyCode":13} 378ms + ✓ keeps a checklist separate when its description is edited 825ms + ✓ edits a checklist body without changing its items or description 598ms + ✓ keeps a body draft when adding a checklist 1803ms + ✓ hides and restores a checklist with its item state and metadata intact 1120ms + ✓ removes only the chosen item and retains body and other item metadata through hide/show 1190ms + ✓ shows dormant checklist items and preserves them during unrelated edits 571ms + ✓ displays legacy date 2026-02-28T23:30:00-08:00 as 2026-02-28 without introducing a date edit 616ms + ✓ displays legacy date 2024-02-29T00:00:00.123Z as 2024-02-29 without introducing a date edit 445ms + ✓ displays legacy date 0099-03-04 as 0099-03-04 without introducing a date edit 304ms + ✓ shows invalid saved date 2026-02-30 for repair and preserves it during an unrelated edit 304ms + ✓ shows invalid saved date not-a-date for repair and preserves it during an unrelated edit 473ms + ✓ shows invalid saved date 2026-02-28T99:30:00Z for repair and preserves it during an unrelated edit 640ms + ✓ retains a draft when the native picker reports an incomplete date, then saves a correction 415ms + ✓ distinguishes an incomplete empty native value from deliberate date removal 403ms + ✓ keeps an invalid interval draft open () and saves after correction 607ms + ✓ keeps an invalid interval draft open (0) and saves after correction 483ms + ✓ keeps an invalid interval draft open (100) and saves after correction 409ms + ✓ keeps an invalid interval draft open (1.5) and saves after correction 325ms + ✓ sorts and deduplicates weekdays only after a deliberate schedule edit 433ms + ✓ preserves a saved image template image alongside existing attachments without changing the cover 326ms + ✓ displays a legacy image under text content without creating a cover or an unrelated form edit 413ms + ✓ displays a legacy image under checklist content without creating a cover or an unrelated form edit 336ms + ✓ displays a legacy image under image content without creating a cover or an unrelated form edit 342ms + ✓ does not revive a cleared cover when an attachment is renamed, including a legacy body image 608ms + ✓ api/_lib/__tests__/connector.test.ts (21 tests) 25946ms + ✓ stores ciphertext, rejects tampering/expiry and denies browser roles 1373ms + ✓ requires every storage privilege and matching backend policies for availability 1030ms + ✓ authenticates status and reports unavailable configuration honestly 819ms + ✓ reports callback capabilities without relying on public client names or exposing callbacks 812ms + ✓ shows only owned/member boards, denies foreign/viewer writes, cross-site approval and refresh-token input 1003ms + ✓ persists consent/token flow, one-time PKCE exchange and authenticated revocation (preparsed=false) 3037ms + ✓ persists consent/token flow, one-time PKCE exchange and authenticated revocation (preparsed=true) 3387ms + ✓ native form authorization and approval preserve active callback ports through the Vercel adapter (preparsed=false) 1808ms + ✓ native form authorization and approval preserve active callback ports through the Vercel adapter (preparsed=true) 2121ms + ✓ cancels once and returns only the stored callback with state and access_denied 1444ms + ✓ rejects durable pending requests and codes after their exact registered callback is removed 992ms + ✓ bounds valid SDK payloads and preserves OAuth forms (preparsed=false) 1826ms + ✓ bounds valid SDK payloads and preserves OAuth forms (preparsed=true) 2081ms + ✓ bounds valid SDK payloads and preserves OAuth forms (preparsed=restored) 2053ms + ✓ bounds valid SDK payloads and preserves OAuth forms (preparsed=raw-buffer) 2146ms + ✓ src/lib/__tests__/recurrence.test.ts (78 tests) 708ms + ✓ matches repeated next dates for every weekday subset, including off-selected initial dates 674ms +stderr | src/components/layout/__tests__/AppShell.test.tsx > AppShell board synchronization > keeps an entered rename and its focus after a blocked route is cancelled, then leaves once explicitly allowed +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/layout/__tests__/AppShell.test.tsx > AppShell board synchronization > keeps an entered rename and its focus after a blocked route is cancelled, then leaves once explicitly allowed +A component suspended inside an `act` scope, but the `act` call was not awaited. When testing React components that depend on asynchronous data, you must await the result: + +await act(() => ...) + +stderr | src/components/layout/__tests__/AppShell.test.tsx > AppShell board synchronization > clears private local forms and an old blocked navigation when the account changes +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/layout/__tests__/AppShell.test.tsx > AppShell unsent AI drafts > guards AI-only text before unload and pathname navigation, retaining it on Stay +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + +stderr | src/components/layout/__tests__/AppShell.test.tsx > AppShell unsent AI drafts > retains the same-owner signal on rerender and ignores an obsolete owner report after replacement +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to FocusScope inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to Presence inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act +An update to DismissableLayer inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act + + ✓ src/components/layout/__tests__/AppShell.test.tsx (27 tests) 4570ms + ✓ warns for an open text draft and removes the warning after explicit cancellation 396ms + ✓ keeps an entered rename and its focus after a blocked route is cancelled, then leaves once explicitly allowed 600ms + ✓ clears private local forms and an old blocked navigation when the account changes 338ms + ✓ allows board query cleanup while retaining the entered text and original save target 411ms + ✓ retains the same-owner signal on rerender and ignores an obsolete owner report after replacement 431ms + ✓ src/components/connectors/__tests__/connector-ownership.test.tsx (30 tests) 4430ms + ✓ ignores success approval after exit replacement 305ms + ✓ ignores an old revoke success while a successor confirmation is pending 404ms + ✓ src/components/connectors/__tests__/connector-ui.test.tsx (31 tests) 3443ms + ✓ requires explicit board selection and submits only selected eligible boards 483ms + ✓ asks before revoking and removes the connection only after server confirmation 316ms + ✓ src/lib/__tests__/supabase-auth-lock.test.ts (15 tests) 409ms + ✓ src/components/ai/__tests__/AIAssistant.test.tsx (20 tests) 3441ms + ✓ keeps viewer board commands read-only and does not claim an edit succeeded 393ms + ✓ checks access between commands in an AI batch 496ms + ✓ src/lib/__tests__/board-io.test.ts (50 tests) 38ms + ✓ src/store/__tests__/useBoardStore.test.ts (34 tests) 212ms + ✓ src/components/board/__tests__/ActiveCardEditor.test.tsx (17 tests) 13068ms + ✓ keeps a typed draft open across a remote move and saves only changed fields onto the moved card 1063ms + ✓ survives filtering out the source card and cancels without applying its draft 544ms + ✓ opens a fresh session with the newest values after a draft is cancelled 677ms + ✓ retains the legacy image as an attachment when the user starts a text body 532ms + ✓ keeps the raw saved date 2026-02-28T23:30:00-08:00 during a title-only edit 498ms + ✓ keeps the raw saved date 2026-02-30 during a title-only edit 572ms + ✓ persists an explicit date change and preserves incoming body text 336ms + ✓ persists an explicit date remove and preserves incoming body text 621ms + ✓ keeps an implicit monthly day untouched during a title edit (remote clears recurrence: false) 772ms + ✓ keeps an implicit monthly day untouched during a title edit (remote clears recurrence: true) 1161ms + ✓ saves an edited Description independently from an incoming change to the other field 2529ms + ✓ saves an edited Body text independently from an incoming change to the other field 1339ms + ✓ opens the persistent editor from the timeline and keeps it open if the timeline unmounts 1411ms + ✓ passes the separate body text and legacy attachment migration as the unchanged initial form 394ms + ✓ src/store/__tests__/boardConcurrentMutations.test.ts (21 tests) 62ms + ✓ src/components/board/__tests__/CreateBoardDialog.async.test.tsx (16 tests) 6330ms + ✓ aborts cancellation and preserves a reopened prompt even if the transport still succeeds 1323ms + ✓ does not let a superseded response or finally reset a newer pending attempt 663ms + ✓ ignores previous-account results without closing the current form or changing usage 300ms + ✓ checks cancellation again after waiting for response JSON 611ms + ✓ creates the complete initial snapshot before closing, with every card, checklist item, and label 420ms + ✓ shows a current failure and allows retry without creating a board 417ms + ✓ does not import a previous-account file after its asynchronous read completes 308ms + ✓ retains the complete accepted snapshot after reopening and cancelling the creation form 355ms + ✓ preserves an accepted board while starting a same-account generation successor 345ms + ✓ preserves an accepted board while starting a same-account import successor 315ms +stdout | api/invite/__tests__/send.test.ts +{"step":"auth-module:loaded","ts":1790946406579} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":false,"urlHost":"placeholder.supabase.co"} + + ✓ api/invite/__tests__/send.test.ts (26 tests) 33ms + ✓ src/components/auth/__tests__/signOut.test.tsx (6 tests) 2135ms + ✓ keeps Account signed in on failure, prevents duplicate requests, and redirects only after a successful retry 740ms + ✓ supports public-menu keyboard selection, visible failure, disabled pending selection and explicit retry 731ms +stderr | src/components/board/__tests__/BoardSyncNotice.test.tsx > BoardSyncNotice > describes checklist visibility separately from competing body text +Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. + +stderr | src/components/board/__tests__/BoardSyncNotice.test.tsx > BoardSyncNotice > describes complete recurrence choices using readable schedules +Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. + +stderr | src/components/board/__tests__/BoardSyncNotice.test.tsx > BoardSyncNotice > reviews each field and both values without resolving changes on dismissal +Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. + +stderr | src/components/board/__tests__/BoardSyncNotice.test.tsx > BoardSyncNotice > resolves conflicting values with "'Keep my edits'" +Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. + +stderr | src/components/board/__tests__/BoardSyncNotice.test.tsx > BoardSyncNotice > resolves conflicting values with "'Use incoming edits'" +Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. + +stderr | src/components/board/__tests__/BoardSyncNotice.test.tsx > BoardSyncNotice > renders incoming markup as plain text and makes missing or structured values readable +Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. + +stderr | src/components/board/__tests__/BoardSyncNotice.test.tsx > BoardSyncNotice > closes the review when switching boards, so an old decision cannot affect another board +Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. + +stderr | src/components/board/__tests__/BoardSyncNotice.test.tsx > BoardSyncNotice > closes the review when switching boards, so an old decision cannot affect another board +Warning: Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. + + ✓ src/components/board/__tests__/BoardSyncNotice.test.tsx (13 tests) 1675ms + ✓ describes checklist visibility separately from competing body text 530ms + ✓ api/_lib/__tests__/connector-sql.test.ts (4 tests) 8116ms + ✓ drains startup work when a socket disconnects before any query 2094ms + ✓ detects the same-socket pipelining made by the unreserved driver 1278ms + ✓ does not pipeline on either socket with max=1 and releases errors 1528ms + ✓ does not pipeline on either socket with max=2 and releases errors 3214ms +stdout | api/_lib/__tests__/connector-readiness.test.ts +{"step":"auth-module:loaded","ts":1790946416370} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":false,"urlHost":"placeholder.supabase.co"} + + ✓ src/pages/__tests__/SharedBoardPage.test.tsx (10 tests) 931ms + ✓ offers a bounded retry when refresh ends ready without the invited board 455ms + ✓ api/_lib/__tests__/connector-readiness.test.ts (60 tests) 5871ms + ✓ accepts the dedicated login with matching current/session identity and unrelated shared-project functions 1422ms + ✓ src/hooks/__tests__/useSignOutAction.test.tsx (7 tests) 620ms + ✓ src/lib/__tests__/templates.test.ts (19 tests) 15ms + ✓ src/lib/__tests__/apiFetch.test.ts (13 tests) 72ms + ✓ src/hooks/__tests__/useKeyboardShortcuts.test.ts (18 tests) 89ms + ✓ src/components/board/__tests__/CardActivityFeed.test.tsx (8 tests) 488ms + ✓ blocks repeated shortcuts before and after the send button becomes disabled 314ms + ✓ api/_lib/__tests__/ai-provider-response-limit.test.ts (8 tests) 95ms + ✓ src/lib/__tests__/claude.test.ts (15 tests) 14ms + ✓ src/components/board/__tests__/ReadOnlyBoard.test.tsx (13 tests) 262ms +stdout | src/lib/__tests__/stripe-webhook.test.ts > stripe webhook handler > rejects non-POST requests +{"step":"auth-module:loaded","ts":1790946429295} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":true,"urlHost":"test.supabase.co"} + +stdout | src/lib/__tests__/stripe-webhook.test.ts > stripe webhook handler > rejects missing stripe-signature +{"step":"auth-module:loaded","ts":1790946429303} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":true,"urlHost":"test.supabase.co"} + +stdout | src/lib/__tests__/stripe-webhook.test.ts > stripe webhook handler > rejects invalid signature +{"step":"auth-module:loaded","ts":1790946429303} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":true,"urlHost":"test.supabase.co"} + +stdout | src/lib/__tests__/stripe-webhook.test.ts > stripe webhook handler > handles checkout.session.completed +{"step":"auth-module:loaded","ts":1790946429304} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":true,"urlHost":"test.supabase.co"} + +stdout | src/lib/__tests__/stripe-webhook.test.ts > stripe webhook handler > handles customer.subscription.updated +{"step":"auth-module:loaded","ts":1790946429306} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":true,"urlHost":"test.supabase.co"} + +stdout | src/lib/__tests__/stripe-webhook.test.ts > stripe webhook handler > handles customer.subscription.deleted +{"step":"auth-module:loaded","ts":1790946429306} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":true,"urlHost":"test.supabase.co"} + +stdout | src/lib/__tests__/stripe-webhook.test.ts > stripe webhook handler > handles invoice.payment_failed +{"step":"auth-module:loaded","ts":1790946429310} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":true,"urlHost":"test.supabase.co"} + + ✓ src/lib/__tests__/stripe-webhook.test.ts (7 tests) 50ms + ✓ src/store/__tests__/useUndoStore.test.ts (15 tests) 12ms +stdout | src/lib/__tests__/auth-helpers.test.ts > API auth helpers > getHeader > extracts header from Web Request-like object +{"step":"auth-module:loaded","ts":1790946430503} +{"step":"auth-module:env","hasUrl":true,"hasAnonKey":true,"hasServiceKey":false,"urlHost":"placeholder.supabase.co"} + + ✓ src/lib/__tests__/auth-helpers.test.ts (12 tests) 18ms + ✓ api/_lib/__tests__/resolve-commands.test.ts (11 tests) 7ms + ✓ src/components/connectors/__tests__/connector-api.test.ts (25 tests) 32ms + ✓ src/lib/__tests__/calendar-date.test.ts (6 tests) 4ms + ✓ api/_lib/__tests__/connector-config.test.ts (3 tests) 25ms + ✓ src/components/auth/__tests__/SignInModal.test.tsx (6 tests) 1947ms + ✓ allows sign-in with a short (pre-existing) password — no 8-char lockout 371ms + ✓ submits sign-in via the form and closes on success 377ms + ✓ enforces the 8-char minimum only on the sign-up tab 340ms + ✓ stays open with a confirmation notice when sign-up needs email verification 343ms + ✓ src/components/board/__tests__/KanbanCard.test.tsx (6 tests) 200ms + ✓ src/components/auth/__tests__/AuthRedirect.test.tsx (5 tests) 47ms + ✓ src/lib/__tests__/utils.test.ts (13 tests) 16ms + ✓ src/components/board/__tests__/BoardSelector.test.tsx (3 tests) 288ms + ✓ src/pages/__tests__/LandingPage.test.tsx (1 test) 512ms + ✓ renders without crashing and shows heading 509ms + ✓ src/lib/__tests__/ci-guard.test.ts (32 tests) 246ms + ✓ src/components/__tests__/ErrorBoundary.test.tsx (3 tests) 149ms + ✓ src/components/connectors/__tests__/connector-setup.test.ts (1 test) 513ms + ✓ copied Codex setup preserves public IDs as literal arguments in a real shell 512ms + + Test Files 46 passed (46) + Tests 966 passed (966) + Start at 06:05:40 + Duration 97.52s (transform 6.67s, setup 5.25s, import 23.57s, tests 108.74s, environment 45.77s) + +JSON report written to /Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/outputs/gauntlet/thirteenth-sdk-integration/full-test.json diff --git a/docs/qa/v0.8/ai-response-limit/integration-lint.log b/docs/qa/v0.8/ai-response-limit/integration-lint.log new file mode 100644 index 0000000..e69de29 diff --git a/docs/qa/v0.8/ai-response-limit/integration-nonbrowser-receipt.json b/docs/qa/v0.8/ai-response-limit/integration-nonbrowser-receipt.json new file mode 100644 index 0000000..51c9556 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/integration-nonbrowser-receipt.json @@ -0,0 +1,892 @@ +{ + "recordedAtUtc": "2026-10-02T13:15:02.720842+00:00", + "head": "9893eb7394a262f87632b9db3e5fcbbff8b576e7", + "nodeRuntime": { + "version": "20.20.2", + "path": "/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node", + "sha256": "38de4fc456c0c439bac48c727d378f749abb4e31f4116703bb1ee9a746fccbb6" + }, + "candidateSourceSha256": { + "package.json": "d861c93b64a2d769a403d93ad1601d83e82bb31c01ea4e53cfb8b328b69ec18b", + "package-lock.json": "9c79e68c03958a2c5d40fda9a180ee705024295e1f8ccfc1acc9a77d7999ea95", + "api/_lib/__tests__/ai-provider-response-limit.test.ts": "9442ee496fa6a22374585abaf5365d497af454783d4b4af5a1db49eb30022d14" + }, + "freeze": { + "preRunGitStatus": "clean", + "trackedCodeConfigCount": 351, + "allHashesUnchanged": true, + "methodNote": "Pre-run git state was clean at the immutable integrated HEAD. Explicit TypeScript/JavaScript/JSON/YAML/HTML/CSS hashes were recorded before execution; SQL, JSONC and ignore/CODEOWNERS hashes were subsequently verified against that same HEAD and added to the manifest. All matched HEAD and the final worktree.", + "beforeSourceSha256": "dcbeba94e72ed534d2b78861e90bf9f2ba20e132170cb9cb88bf9560a90d134d", + "afterFullSourceSha256": "1f6d9d9f6587f925d22b3b862d415c77fc2d6d2e33231a9f58c4f4e22d2f3cd6", + "finalCodeConfigSha256": { + ".claude-plugin/marketplace.json": "c50d34ff6091a4cd1a22f4809c2d7c5e21109ac92c77c5a77734cce9e2e5de9a", + ".github/ISSUE_TEMPLATE/config.yml": "5ed05fbdc4516b94957bc161461d8889c4008afbe6f2ad344c6cb578b909c38e", + ".github/workflows/ci.yml": "4446575d200e5f81f067c86b0d3c1f60b0e7fa43c9aaf7f09884b60df38307c2", + ".github/workflows/connector-ui.yml": "413d033267af14ff84401987a33e86d4232e7be96a1094f6bdc2c1c24f195781", + "api/_lib/__tests__/ai-provider-response-limit.test.ts": "9442ee496fa6a22374585abaf5365d497af454783d4b4af5a1db49eb30022d14", + "api/_lib/__tests__/connector-config.test.ts": "37773357e588dfe8048b20cfa120340f4168adf78aa3cf4a6399de2238e2d21c", + "api/_lib/__tests__/connector-readiness.test.ts": "3d48d9ff7b1f2d5c14062435150b4880e8836ca135b0e32569289c661243a142", + "api/_lib/__tests__/connector-sql.test.ts": "ee4fa4666c11c04071fa4fb73fde21cbd767eea65391290cd17733690f7781e8", + "api/_lib/__tests__/connector.test.ts": "f7f843c10132b4ea1c349595ba4d67d8e9bdefcdf8dd3c2a5c537ef1dd5ac743", + "api/_lib/__tests__/resolve-commands.test.ts": "55fdf398c9ade929a2547b59bf60c7ff2f1a0e3d59555912ae4a906638d37296", + "api/_lib/auth.ts": "c653507453b32b783f20aa3ab36185a0a60c1825184fc92e92be30fc1b1f7978", + "api/_lib/board-core.ts": "c52f49ff81456ef875d42ceee8bf2636d800672cd2fe1bd1231442f4d8a9ad57", + "api/_lib/connector-config.ts": "ba9638b60bef77511ec098f572d6fb7b1668b66931ad41474e78a2fbb658d789", + "api/_lib/connector-runtime.ts": "89f955901c3a7c849fb20e8f2356a1fc8099ddf3ce8251d71a067b05bfb592be", + "api/_lib/connector-sql.ts": "467174f4298ea29b177271c13de5d0ddbea18888f4002a7002b784322c886a0b", + "api/_lib/connector-vault.ts": "e1c78fc671f657d8f0bb93a2f1736d05136c6f43644ba270da0aa3cc31732711", + "api/_lib/resolve-commands.ts": "af04a344fe47c5a246f7d4a1a135dbac4335a9a65d9ea33803a16c02d620b36d", + "api/admin/check.ts": "7b9c9b29bd556682aef7491426d53f99ffaaaf9ad2151d486969ef95a8defa6c", + "api/admin/stats.ts": "fd903ae24cf4bcf92fc1ee4c69c77d70b9ed3c398f0ab76c393b16fcfe8841b1", + "api/ai/board-template.ts": "830c73fd8d5b0ad1203d960128bea631ca2067b929c4c20d0edd404febe310af", + "api/ai/command.ts": "eb6e0eaae0e55f54683af9f4fb7057c640f9849fdc5392065fc90099571bfc61", + "api/ai/usage.ts": "7f81b086ecbe8bac1edb015886bcc8d1a821ac1620178dbfa34dfe0860a17ab4", + "api/connector.ts": "b38719fa05e779d32b33f934466ebb8b67f6133896eb18f512ebf1389cac3562", + "api/feedback/submit.ts": "6d3a26d4fd13d8b9c90aa438a146eb758405704d19d857cf7767903dcfd420eb", + "api/invite/__tests__/send.test.ts": "27ce146ecb9bc779b0cec63d461b7f3cef424796b8fd0ec9ba19f1aac1899059", + "api/invite/send.ts": "b8c659c36303149abba7a55a2800c5325f23872692e62ebf06d5a1a345554a3b", + "api/stripe/check-subscription.ts": "397c8be5de31834422f45e1ee1b7b4e49ebba833a9be874f9e3bcf33e1669990", + "api/stripe/create-checkout.ts": "7caf5cc2ceb0176c1e18d40f678cc654301582f688876fcc2f8c535184f17674", + "api/stripe/create-portal.ts": "9f9fb52cf3abfe18e74b388e4bf2cd511ec9b734af749899f14fb2d19f210c95", + "api/stripe/webhook.ts": "ecf3c23e71ac19ffa8bfe996b431c68a7d8668fd8af468e0679aa86bd9477552", + "codex-plugin/mcp.json": "d3a66fccfaed9a29691664ed797d4363bd19800439f47b8f38430f99c94d5a72", + "codex-plugin/plugin.json": "6046ee920eef812a3200611a8068ffc7abaea2c1f6e9d1d7fcc433fef7621f2b", + "codex-plugin/scripts/serve.mjs": "5a6da6b18d65a6f7723e3c3fd2584365a5c9622aa4723a5aeecfa8fddb75894c", + "components.json": "22643b642f17cd817ec94d8439a272dac28119af0aebf8219a96ac1c2f4c61dd", + "docs/qa/v0.8/ai-drafts/ci-signout-repair/integration.json": "3e752064c7ae91ed5594d846e1364a0fa86b3d00905c43b2c60dea40ea458be4", + "docs/qa/v0.8/ai-drafts/ci-signout-repair/pr42-signout-repair-receipt.json": "e33e3492b2a61832fe82193839ec17ca3aaac32755d7e034736fd920c723fe5d", + "docs/qa/v0.8/ai-drafts/ci-signout-repair/pr42-signout-vite.config.mjs": "7a9884bc51427f3d2be54da5151dfcb1a7bdb515dc6afdc7b5bd0d47902b154b", + "docs/qa/v0.8/ai-drafts/combined-source-hashes.json": "8d9bc46a377952592ceceff76dafd7797958537bcd244be9cba5a0e732dac38e", + "docs/qa/v0.8/ai-drafts/preintegration-verification.json": "7307199549a205eb207b507be233e246fb4af30b5454c28c1fb072df3d15dd34", + "docs/qa/v0.8/ai-drafts/verification.json": "43cd80b0bc90be880aa7759712e543ffda6b89da15a226a68d8e3cba31001dd7", + "docs/qa/v0.8/ai-response-limit/audit-diff.json": "0e7c243f89e6f569088973ab447538f043dc03bdf6b72921efc56f7a21ab0792", + "docs/qa/v0.8/ai-response-limit/audit.json": "86d95158734471d549b81c173b627a16d28b01f33824edca230d381b90d69682", + "docs/qa/v0.8/ai-response-limit/baseline.json": "a9811b6fc57ed13f9f30c31a151d80ef17762b956c0e016369bdb0a6718ba5c5", + "docs/qa/v0.8/ai-response-limit/candidate.json": "3bacfa61a0dfb1bfeb765c095f32b6dc8985acde04161677be0ba95f77f6c97c", + "docs/qa/v0.8/ai-response-limit/compatibility.json": "ba166b9a81ff84de2ff23be1406bb854c66ba42ff674f7ec406ae0f8a3712438", + "docs/qa/v0.8/ai-response-limit/receipt.json": "36dc509e18ebe5801a547d064e320165564b3a6a878effbff111db7a0fcd576b", + "docs/qa/v0.8/consent/receipt.json": "aa9d61d7042d0a0e44c7f471f81a161c1bd68e355cce2220d5860b1886c741e6", + "docs/qa/v0.8/signout/verification.json": "07cddc6735803f354bb39bf0dee669dbb3107899f752d8d7dafa2c104ab8188f", + "docs/qa/v0.8/sql-fixture/artifact-sha256.json": "8767e38c4aaf9c971274bd25e3d6fafdc869c60f62ffcba6fbb2ae248456e853", + "docs/qa/v0.8/sql-fixture/integration/artifact-sha256.json": "f172436c443ea48fb3f6cf6447bfa300d0c1eda0f469648b6fc237a60a8e4ccb", + "docs/qa/v0.8/sql-fixture/integration/runtime-capabilities.json": "d389d9e8070ecc3e274b2205f181c50f8c1fdbf343b6436538b7d81110e08866", + "docs/qa/v0.8/sql-fixture/integration/tracked-source-before.json": "b6cd5365b1cb77bf20c7905f846e934c3c8d9dc0f02a55abb8131030d72cd141", + "docs/qa/v0.8/sql-fixture/integration/verification.json": "27ef8c5950fe2e2643b669a8f4483017dd8cda7852b98e49e0d7cec19d0f00b9", + "docs/qa/v0.8/sql-fixture/verification.json": "359007f1dff93d8991bb6adfff3e1c1d8a17eafa3eb77fdf2489fe1c5b7b7278", + "docs/qa/v0.8/timeline-copy/combined-source-hashes.json": "a7395c85fc44c6b6bed17610b3d7879a8a022e9d7d4d3ab3332c37b2c127e7ce", + "docs/qa/v0.8/timeline-copy/harness/tenth-combined-playwright.config.mjs": "7b0a6cd13c99b16cd8b4c588aba1d4c49df853948771c9f8867cc4aa0302cda6", + "docs/qa/v0.8/timeline-copy/harness/tenth-timeline-playwright.config.mjs": "0b06ab50d7d4c91cb240c0cfca55c06ae6f622e8a5b991c37196f34b0d72e87f", + "docs/qa/v0.8/timeline-copy/harness/tenth-timeline-vite.config.mjs": "83ed4c469537528537171d8580013af4f43c79b70512f1fb7cf7097abc37969b", + "docs/qa/v0.8/timeline-copy/preintegration-verification.json": "8bc85cd5f51ca12845c8daaca94b792755c780f4ac6e5ea1fa87c60153ac3054", + "docs/qa/v0.8/timeline-copy/verification.json": "fd175866638798c86cc0e74bfe1b7de762470de301f01ded13aa84e0ba3d7fcc", + "eslint.config.js": "6f32697340de8096ec4166743f659cb36f1d48a4595d636f6c49fab904cb367d", + "index.html": "827dc4841dc88a4ecb32cadffd24cbc001f134bb564ef3ad329a7e58b1525dc6", + "mcp-server/package-lock.json": "5abb726bb26520172082aae09ff06d83a449d2ab3c02687b540ad5fe1bd32df0", + "mcp-server/package.json": "253833b8c81e496dd83cb4ae414cc24303ef7d4277ccc87be082f8f8899fdb83", + "mcp-server/src/ai.ts": "b6fd6c20e2db4653a6f7737c657fd03b4d156351b4006f7b4058a4744e53eec1", + "mcp-server/src/auth.ts": "43db86173655eda0a1d17a70eb4f43c9a0db587db836ad8063571eaa5cf25ea6", + "mcp-server/src/board-data.ts": "bbac2dc43d1beb20f7cb07e028046d3df9eb87884d984fdba2c9d4f65657a034", + "mcp-server/src/calendar-date.ts": "e29d55f37227c348a7f07dc54c2d51012b584dd5669bc4fc51b302b1e5de9aad", + "mcp-server/src/config.ts": "e172d8d267c9bdeb05420732230142b006629a2ed222d3369bc0b4a4d2811ac5", + "mcp-server/src/credentials.ts": "cd40018ab4f837de3ce7ca7b3ca1a62f6ced8f2bcd6beed336622f5342bfe0e3", + "mcp-server/src/hosted-account.ts": "4166d8d443d9fe0fbe07a4d90a8cbc9f5e605f761c0f3621079af9d9b10d06cb", + "mcp-server/src/http-body.ts": "0b6fac7c3c468b5737547d7e4dbe34d951eebaf71d9f9fd8ccb35d673a9b8ba6", + "mcp-server/src/http.ts": "244d6fe6a62a6b9b4f06e023887a9a8db49d033b3fba2b91d66aa39868151766", + "mcp-server/src/index.ts": "a91c20cc06cb800858a3b5bbd4425862e69cee3d074bfc8d6b992c621395627b", + "mcp-server/src/meeting.ts": "a0d58f8cf758593cfc259c5546895ab06a75ea674a79933564d8c664f22041c3", + "mcp-server/src/node-client.ts": "9d0ad1e4fd4fcaca7dd4b9bbcdccc23665ffdfff6d65ab6937aa94a604f6706c", + "mcp-server/src/oauth-callback.ts": "7c92f10d5210c2db071e836e79278ae0bf62d7c7284ff96bd95b084e61e30a45", + "mcp-server/src/oauth-store.ts": "a336444c2a02ced5c818f9908ddc5eff45fa0340b51b1e310afd036312079f84", + "mcp-server/src/oauth.ts": "7fb75edb0c68d6508ce763aa70d10fc74c31a05556d81b0d0c7d19ad1006e575", + "mcp-server/src/openai-server.ts": "f26c16f3b48f13f7ce5f2f46cae69acd8ac58420c92e218008cceeacbb3b357d", + "mcp-server/src/plugin-entry.ts": "bae79087a43e5723e6b4d100ac890ec7ebeb2fcff1171c1e7557351a0faa1240", + "mcp-server/src/recurrence-identity.ts": "30f2394be11599dba905ac692fec74fa451e45ef95e242940f07a6cd0798546c", + "mcp-server/src/recurrence-schema.ts": "2aa27e54be366a7ccfd43f668ac0a9fafe2d58e0f2bc9bca4798cc1df302ffd8", + "mcp-server/src/recurrence.ts": "28fc66043d501d09f356d12d28d01a6d1cdcfdaee0a165eee0b7b286537fd0ac", + "mcp-server/src/server.ts": "4d9b396ff24ad3b419ceb75b1352d046650c0348a354625dc47b97b71ee50760", + "mcp-server/src/smoke.ts": "6cefbd9877482c5c4114e7cca08397e9b05c82645d79a884a0bfc194aa7484e6", + "mcp-server/src/supabase.ts": "4f56637739600a971d9fb63062912ad77c32299d266ea4bd36dcd7b26696b0bb", + "mcp-server/src/target-date-schema.ts": "cf725f2dda6bed0da5785437f84cd01fe75a4db639f3a759d8f4446eddbca0d6", + "mcp-server/src/types.ts": "ed528070f3146305f793c4925f86e2d1b3287a166fe24d9822fac5c6d020bec4", + "mcp-server/test/board-data.test.mjs": "15d89b8471b94772c36b8279eeabcc0b5446b0935295589f3c776f078275c8f2", + "mcp-server/test/calendar-date.test.mjs": "a96c0b4572b146fb44e503e9f68dcc617bc972b23289b68cb7bffb97a71b81f7", + "mcp-server/test/cli-options.test.mjs": "df8d29342a60a85de4ed4c7f18b5c5444be69e82afc3a3747fb08510c1973308", + "mcp-server/test/config-security.test.mjs": "55739babafb7ecd92bb9aefbdbd835a533e86f695d73793f8e91a3b800d73294", + "mcp-server/test/connector-cleanup.test.mjs": "cbf5e64d2f5566324de7718c6fd7f4aba12bfa7a3ced0426d693b4e8b90e917c", + "mcp-server/test/credentials-project.test.mjs": "9db0056669f6d76727aa363878f6ffffaa009f624cd5910aeba13e29cbdee98d", + "mcp-server/test/credentials.test.mjs": "bc7387a19b5aaa5f1144e79c72788780d1af30bbf37870902384e82573962a85", + "mcp-server/test/definer-privileges.test.mjs": "0f48d1074b8d4d6e229b2d2ed833d7e54ab795c6f8dcaeb91083e5be0ed7c58d", + "mcp-server/test/helpers/boards.mjs": "4db2e81d6d32d357a1b0a3b08d5f47350448a7b279b0a24811fcbfb0ad24adc4", + "mcp-server/test/live-protocol-smoke.mjs": "8c3fea7881f260ef72d000d51bc94fa55ff244f8da74fde29a8a22b80437f149", + "mcp-server/test/node-client.test.mjs": "e8eef2bc97c53cdfd78e8aa92ddb194d64f89094d31e5a480c244cc0ce55cb62", + "mcp-server/test/oauth-callback.test.mjs": "8b3038bf7b175f81ae95d277ef8434e9ffb93892f1fa6e94b496cc510e613baf", + "mcp-server/test/oauth-http.test.mjs": "113fd84cf937c87a3df65615a565562e809a89dcf69c3a16d596d5e87b59a9a6", + "mcp-server/test/oauth-store.test.mjs": "8f390fcdc2ca25d35e2841ac9d67a2e57e1126e227c2a62fa060f369d4c1e7d6", + "mcp-server/test/package.test.mjs": "64b779122fb5c2a6cddcf6e47d2d400ab3be25311d4f1af4979691c2ec9f42a1", + "mcp-server/test/plugin-launcher.test.mjs": "5994dde676bb72a8c3f14fc49b46359598692d8987dc9b9cba6f67cd310ad7f3", + "mcp-server/test/plugin.test.mjs": "3f4b9be227a016077864ae55d48f744d2dc860a274e48072e8ec1d28c6169572", + "mcp-server/test/protocol.test.mjs": "0093cd58058d97aa74b51c3323f83798752f3e627462a14465f6bc720363be79", + "mcp-server/test/recurrence.test.mjs": "7f20bb362198b4e38d01f37adc4e95ea4827d4d1de08fcb0dd355e1323a6fe48", + "mcp-server/test/rls.test.mjs": "6a607a808863e440ec82e3a5b989112815239624fc2defaedc4ac3cba018292f", + "mcp-server/test/schemas/mcp.schema.json": "6539175bfcdf43085855183e86da40ea94b166547a72b47ae9a0a390516d3acb", + "mcp-server/test/schemas/plugin.schema.json": "0a4aad95ce337878ad38802ebf0daa3fde76abe3f65400c86bcbb1ec0b3ab883", + "mcp-server/test/stdio-fixture.mjs": "2c402438d439037bd2820b546f7ba822771cf0fda93ab26cb59ec004af5c50de", + "mcp-server/test/stdio-plugin.test.mjs": "2efea624f29d9292d347bfe5bbc4053d84248ae9dec08d1c3eb422a6cce4dcfe", + "mcp-server/tsconfig.json": "78b489e258534bd41a05f1f5e430f22752615a2821150cef059d31699a16c6b7", + "media/manifest.json": "5df56653895ce886d80ef19650c335d46e291124770b802442786f3d73e7a682", + "package-lock.json": "9c79e68c03958a2c5d40fda9a180ee705024295e1f8ccfc1acc9a77d7999ea95", + "package.json": "d861c93b64a2d769a403d93ad1601d83e82bb31c01ea4e53cfb8b328b69ec18b", + "playwright.config.ts": "7a4d56457a21aa2eadbc539a9973fe86be51eeef4ffacd096201b08de3674e91", + "playwright.connector.config.ts": "274868ff19062170051b7a722c507e5dfa91fed28b2b94324c5b863c1e07ada9", + "plugin/.claude-plugin/plugin.json": "8d9ff6899c423e4feaf4986cefc97e6ed3e016113d63a337250cb37256d5f0c3", + "postcss.config.js": "190c877db466995bf1482f4a16abd06e04a89ede3119341e2a86ff96e1737b27", + "scripts/e2e/ensure-test-user.mjs": "a61cec638ef049661419efb96e901f50825a9e0bbcc46d1ac939bfbadcea04dd", + "scripts/package-plugin.mjs": "7a303270b4e0621f932bb58fc1a110d990eaf41a24d11682da779318628a1e8a", + "src/App.css": "0cf674130f7841bd239f6803d7c5ac0a9e649e1fddf20330e5979d1f284e1119", + "src/App.tsx": "d5b6b777312d8bace0ab6b56d81ba74e405809f8aea25f00600f56cb7f5ec66f", + "src/components/ErrorBoundary.tsx": "73f32a0ff0a13f5096293e88bb8431d7fc32e55443b24b1ba92ebadd72f892c3", + "src/components/FallingCardsShower.tsx": "604c846b6a2fcfda8b7865d5992535ccf3f5f690d5f6edbef2d70402bf3101ba", + "src/components/KeyboardShortcutsHelp.tsx": "2d7a2e12a903eacbe1a6d257446d3ef1be77042cb0798975e95443c5b53cd7e7", + "src/components/__tests__/ErrorBoundary.test.tsx": "6f3d5a4ae28141fd698c2a1743e1ede75a496aab00df46c6b1f28e20cbcc8e23", + "src/components/ai/AIAssistant.tsx": "7def49c5a906a0c3d262db20ef464a10e2688b35872355a5180c892578073319", + "src/components/ai/__tests__/AIAssistant.test.tsx": "c6d345574b2e9d93b2f17a14103e8a331f412ee13b31cf10a1c0d937f6e2ac2d", + "src/components/auth/AuthProvider.tsx": "6e0b56f9549421ba7e0a2bcb5ca93d723f4e21e3f68fe50be8c5f2d363327c11", + "src/components/auth/AuthRedirect.tsx": "aa1d8ffc0b9296841a894d3d71bb42be59d7b4926bbef08fc72d41f2ee953ec4", + "src/components/auth/ProtectedRoute.tsx": "0daad38616a5ab643baf033eba7b62be87954e841c61ec848954e3545b152a17", + "src/components/auth/SignInModal.tsx": "6c69bf552d6dc269431c73bf2b869f8f16c8370ac49daddb6093997a6026e313", + "src/components/auth/UserProfile.tsx": "6e2d165f98de486abda166994cdc3075050c63621e2f19390f173ee8f42e1fee", + "src/components/auth/__tests__/AuthRedirect.test.tsx": "104a59beff2daebbd73b7ef3890e7ea4138ec3a202531a62991835d7a37ce7ed", + "src/components/auth/__tests__/SignInModal.test.tsx": "737e5a8126ae75ffefe2616fbe2c375b3cf92c4c40a2f613bb86e29d8fa88a27", + "src/components/auth/__tests__/signOut.test.tsx": "bd6566761bdae412fb6cf717b1f6bad76bc4bdc6d080a9512a5cf7a2c68e7273", + "src/components/auth/index.ts": "3480d4813664a322e16576cbacb8aa23875aeed1c7f487733e7df96a1c468166", + "src/components/billing/AIUpgradePrompt.tsx": "40c6a722fbb7feead1bce5ba30e9dcf0babc08cb13cf5d3fbb8d541de9c3e3c2", + "src/components/billing/ManageSubscription.tsx": "b71378699abd414f8b5d6bcf30344d4cf0e5343bd656f34896c241bb50469117", + "src/components/billing/UpgradeToProBanner.tsx": "a9c4863fac22b956983e63d0ad9e0c4337e1ef4659f099dccb24222dbb3257f3", + "src/components/board/ActiveCardEditor.tsx": "adf6a1ae9c6efc0f3722cc4b18e1e5334f28ef52e611908c167754cf4b35f76b", + "src/components/board/ArchiveView.tsx": "61e06ad7fb0bbda3f87300a9e332a125baf0283ab06c1b85ebd23954647ffd26", + "src/components/board/BackgroundPicker.tsx": "72d12e5f71d65fa5162bef7f06d206420ab27d53bde5a737321065f96fe4ebe7", + "src/components/board/BoardSelector.tsx": "1410f0d34aec8fbe30d76bdb6bd955c1d29b3d7bcd39527a24d461feebe62460", + "src/components/board/BoardSkeleton.tsx": "f7cbb710dbcd32da04e20602ab986754439b75edabfa97e52cb121e590f5060a", + "src/components/board/BoardSyncNotice.tsx": "3a6cbf60a658eb3cb13a38e8ba5df30006ac2a5d8ccc726bdb4f03965ef5a6ad", + "src/components/board/BoardTextDialog.tsx": "b561a3b8bb115075999c6b846b0a44cfa071e0b3ca4940142f9ae00ccade0baf", + "src/components/board/CardActionsMenu.tsx": "d69576b6ff9c836d92735cc00b2f1bcabf3b951bab663aa1f5517214803166e0", + "src/components/board/CardActivityFeed.tsx": "06c3fddec7cfbd26d53ca2fe1c8beb0be5f44a747c676ac425172e39e3dff542", + "src/components/board/CardEditor.tsx": "82a6fd8fb9f3469cfbd489479b267d892f085ef09f21ba265db7a8366fa65504", + "src/components/board/ClaudeResponseDialog.tsx": "bf8aee830655ab65f0b74ec1f08d734e0d659b9c90c625affd391c0c7ec1a3d1", + "src/components/board/CreateBoardDialog.tsx": "a9d3980bb19f1d6009b24391da6006bfc08c7dafd77dfcb74188cc0a660ed1dc", + "src/components/board/KanbanBoard.tsx": "6dbde3cc7299915f76a8c14b5080d27f23f4ab33d35a5405466cdde2d17602a8", + "src/components/board/KanbanCard.tsx": "e726502b71e1da0247d703261ef347a8553d0bf032d81fc0765140737d9aa107", + "src/components/board/KanbanColumn.tsx": "e72a04a00a8970302becdf57973181e576d6154f1f27d28bfca2905f75a55098", + "src/components/board/LabelPicker.tsx": "be2bd5840a1229ea8df4782543cbd667001063a00bc97220a61ac17b8ed50ae5", + "src/components/board/MobileBottomBar.tsx": "36f9657c9e43504a15a5c18a8548fd5f80374a569f005bf86f1f44b8b9611610", + "src/components/board/MobileColumnTabs.tsx": "b773c292e5ec0891ce6dfd0bf61b8a1ef3e804264bf6b2a99c7df464e53a1963", + "src/components/board/MobileSearchOverlay.tsx": "e06a2adb7729ff40485945c2dac52af1c05b56109375b9a6c510eb8f01ec0c6f", + "src/components/board/ReadOnlyBoard.tsx": "81cdac1ef3503b53c15d560873cb1d83e057d9dd2dea79159996553fdd96de39", + "src/components/board/ShareBoardDialog.tsx": "97f317e73429ea3777546bb8d1355909a4d94eb312b7487426538d568b2cd68a", + "src/components/board/TemplatePicker.tsx": "1a6569c9ea5d81125337ede40ac6152a1031d7c670c4efdc00c63c645758846c", + "src/components/board/ViewToggle.tsx": "dbf6c314c280b537609e9df7cd5996f0bb15dfb31957b4d26a6dd908017e8a03", + "src/components/board/__tests__/ActiveCardEditor.test.tsx": "4bdf7ae11d1beacf3ccd1ab15362de5f0a76d62eb73e6b1f2af3edc45aedaf73", + "src/components/board/__tests__/BoardSelector.test.tsx": "36ca55c8868c8e3b639e8e8d56eea2f5614ebad6cabd1960d2f7b8e057460e42", + "src/components/board/__tests__/BoardSyncNotice.test.tsx": "8656c60eda92de157ee5fc01878acf83e1fa1b4c68dca5be002ece6a5a3c6a48", + "src/components/board/__tests__/CardActivityFeed.test.tsx": "68d3ba8257d719bdfb867a4607183918301767d9a06ea4e7aae22e2a77f911cb", + "src/components/board/__tests__/CardEditor.test.tsx": "4933e8d8357eed11e715f16b73f28dfda1733fe18eaa120f4f616ef09654fdb6", + "src/components/board/__tests__/CreateBoardDialog.async.test.tsx": "c88bb74df7fe3c127555c83d338e4d179a216752ea329e6fdcf99b3a3ab0e62b", + "src/components/board/__tests__/KanbanCard.test.tsx": "8d10d9ddc8ec2715e6da5149c7bac8531696057cf04ab355956e242c4f6630c7", + "src/components/board/__tests__/ReadOnlyBoard.test.tsx": "88bd5c1fc39a85104c5750ee20bbe5d8218185437214e6e8e26c8e62afca98df", + "src/components/connectors/ConnectorSettings.tsx": "61c997d231f0cd0ec1f6b45ea9e3fac41d8882db4f76462059164e472c49d3bf", + "src/components/connectors/__tests__/connector-api.test.ts": "52fd593926568a845866e239b97ce967ec2692070f8b38983ddf7074922338f2", + "src/components/connectors/__tests__/connector-ownership.test.tsx": "c1d247164d4384bb7d84d9fa81290f6aae1b2b60e1e2be8caa1d0d2f335fb080", + "src/components/connectors/__tests__/connector-setup.test.ts": "7cd1a8207f788d7dfcbde8fe88271d3ec6da3f6ca14ec3c09a3d8551d914f1b2", + "src/components/connectors/__tests__/connector-ui.test.tsx": "d9eaf25e7a232c0e97d665dae44136611aa07137c3e29292211a6531823fbfb9", + "src/components/connectors/connector-api.ts": "63590ae57495e45bf78674b5e38bab4abfadcb7c79f2761c1137b42e0e16bd14", + "src/components/connectors/connector-setup.ts": "c0610bb44048169fb62097b5d3fae3c0bb89fbb887d270a5b195045c45ffb64c", + "src/components/layout/AppShell.tsx": "518baece9271608bb06e972d23640d8f78ad245cff6a3a0959c2283549a4f4ab", + "src/components/layout/AppToaster.tsx": "a8ff5d6eee6702bad159e26697ca2b1de9f781c40ab9f90f303a0e33245b5503", + "src/components/layout/Footer.tsx": "3e0238dce7c9a2cf68d1ca02eab93aff66286d0562da13d6c50e47ab16029b87", + "src/components/layout/LeaveBoardDialog.tsx": "a182fd75cbfbdf07b35d829dadda5acbb27b3eb34e2253b5cb0dc6a73dd76af5", + "src/components/layout/PublicHeader.tsx": "931a33d5ebd541d19e56ab25ec925ba373bae3ea9810544288200a7483dbbf58", + "src/components/layout/PublicLayout.tsx": "ec7902a3734d70d25206264342609610baf48a0d58237724cabc1a0e1c777a64", + "src/components/layout/__tests__/AppShell.test.tsx": "47c9c528666b60d5fcce98a5a79a49e5775c9b99b024bf70964887bc8dde9f68", + "src/components/timeline/TimelineView.tsx": "be2586c969c8bd1dc2923a3d1ce75021fc60d968a91b21643664c0d4981804e4", + "src/components/ui/accordion.tsx": "1e00288c7eee72380002164ea3ff7589df5d92f2f1b8c7aa5077596ef680acdb", + "src/components/ui/alert-dialog.tsx": "683cf8b6c3b0c29fb0e31f36e8c7794c63ab5b7ab431f7441ea2d478bbf9fe41", + "src/components/ui/alert.tsx": "49d8311589b810b106aada8ef7b13f70b2b1f68cfce4e1458b7f31a191f420e9", + "src/components/ui/aspect-ratio.tsx": "6a75117416aa89200cf31e8d61643b428e812f479caea857c80004b26d893e79", + "src/components/ui/avatar.tsx": "e637ab3522c01631eac2e456588ef301314e2bb7940ebf7cd96e698a868d47bc", + "src/components/ui/badge.tsx": "e7455feb113b38c59456ba29a9ec264b5ffa1daae8883866332ad637ffd57c31", + "src/components/ui/breadcrumb.tsx": "22f3f4c13ed1085c4131379bfccc6fb173a474f861636bc2736506820153aa08", + "src/components/ui/button-group.tsx": "ccbf09097f5ebf2eec86f1a96cb92e8dd39d251ebb5867394196c8b4fec68a5c", + "src/components/ui/button.tsx": "5a5c4b8b60a8a80ba7b8b5d0319be2d3c61bfd2ce4fc2a645371dee9f6db0a77", + "src/components/ui/calendar.tsx": "c8e67d15d8622135b72045d974a3234ea99f5ffcc1b981eafea8847a14ae1f12", + "src/components/ui/card.tsx": "2040cdff27cd1ed771e0ebbd15abcd73d31f2f1e4be6664bd6816fffd2a87476", + "src/components/ui/carousel.tsx": "10c5388b66d98f0c555dad2e5b89b9bc846fbc1a3de101ee8b98abc305ec2c51", + "src/components/ui/chart.tsx": "39a2fde544144e0ed0e3e7f76eb3f3988f570f849f30f62208c6f3e2fc4e3e4f", + "src/components/ui/checkbox.tsx": "a8292972a5b81eff164f621ac0bb66f4ed4419d1599e2d4901968e216574677f", + "src/components/ui/collapsible.tsx": "661444318605c90d19e47e4d21289a68b4c5f7f01782be70dafa80d3f7a4cd08", + "src/components/ui/command.tsx": "416cdc19eb9e7301b51f9665b4f1a797534769a6bb58a563808979f460b0b8a2", + "src/components/ui/context-menu.tsx": "70e547a9bececcc98adf2fbfb2cae05c99179707ab0edb1ddfb5d2de329dab42", + "src/components/ui/dialog.tsx": "761dbab032ecb18f192d5ded08bf85421b2c31c0930d321eaff4031561602015", + "src/components/ui/drawer.tsx": "0c9464ed4f95207ff6ec0b8f433f550388ea0fe57fecd36bbe100b084ee46a3e", + "src/components/ui/dropdown-menu.tsx": "ba022169876b487c849d046ac577654ab61a4cfba158305c8790c572b704ed9e", + "src/components/ui/empty.tsx": "584b491f9eb69f8041b3d3732a4d139f5af01de19a00b7a97656c7af7a78716a", + "src/components/ui/field.tsx": "e9dcb51b16e5f235bdf23a0b4a092e55c05b2bad08a83126ac675b72aae5380d", + "src/components/ui/form.tsx": "a12f73507ab613e9d797979b988a15e32d23458fc8dd4ba71b922aeee977a3b6", + "src/components/ui/hover-card.tsx": "031f6a309d87c8e42a2282fccc277dde75e373de8c93dad881582c9dc13e05d0", + "src/components/ui/input-group.tsx": "c0df02569e483db8ee86bd51b3b392a1ba62b276604d8c7ea90a9efc5faa9e25", + "src/components/ui/input-otp.tsx": "7fd7ed5273f849cde558238148ee1bbae729aa1149407c7c732b6c65906933d2", + "src/components/ui/input.tsx": "56b7fd30208addbcc2468cfda4f5bc0a55342211deaab61ee35b1c352b1622f1", + "src/components/ui/item.tsx": "6d64b756260749245b3a1f292e2aaf2774d7ec0b8bb99403eb8c1be31bd26900", + "src/components/ui/kbd.tsx": "886e04c83aaa016dfce924e461aa38aa68a9f5c83bdaedd6209dc358c32a8f22", + "src/components/ui/label.tsx": "9ec42c8a57e82311118b794318409ee02b2cebfa49ba6cce8457cff6448cd471", + "src/components/ui/menubar.tsx": "b4be4da586ce1288e8259b1e760a9e317eb0ee9183548c762d8b2a222bbdb3e5", + "src/components/ui/navigation-menu.tsx": "d71f57fe0f365541fbf5d00196b0b78a461d8c4f38d35293e5754680d93b9245", + "src/components/ui/pagination.tsx": "374ad135c3d4ff3ec080a0009cd9745cdd0e12faa89d2b0e86074f11e5127fd1", + "src/components/ui/popover.tsx": "29a217781737bbf5c430859b3de46097a44ada81c4143c2d05543d2167de0ee1", + "src/components/ui/progress.tsx": "9e36ca3f10bc56b69058d8edd342832b72c8c1b2d36cd142a0decb2445c3b724", + "src/components/ui/radio-group.tsx": "b12ca5cef859dd75b274337234bae66e413b0f97845243254a1dedcb2d7a7237", + "src/components/ui/resizable.tsx": "4634b0a700b91e5d422babc1f068b6d145b5f000c8aff62d5cfc9b5711fbff73", + "src/components/ui/scroll-area.tsx": "1c5d0b242d0513848f4bfa9b57ba7f438d9b1120617029941bfaa137196ecead", + "src/components/ui/select.tsx": "68fc754d3042f9fec3406895845e6fcc05d44f93a049478a9d3c706919100ebe", + "src/components/ui/separator.tsx": "e9dddbd8dbbc0eccd683306481b0f0bbc8e2b60ea97817416ebb9fe7fbbbdca8", + "src/components/ui/sheet.tsx": "fbe9b257fd95b9865e1aba651489899c959ed5c16cb8493fe8c2733f83b92ee1", + "src/components/ui/sidebar.tsx": "6074d8027b4bc9ea2d5eb1527a8528a7fa69df96f6261b9c6441c3980d41700f", + "src/components/ui/skeleton.tsx": "f2aea81d8baf2b621945382aabac150e3db40f20d19ac1abea7aff805f1dc33c", + "src/components/ui/slider.tsx": "640996327017c3977e3c61eee8ec55230fa0bec509d0f4b44bdc9acdd8eca138", + "src/components/ui/sonner.tsx": "a3868f2a8aafd8e2dc96b7ae145009939e9d8723cbb5a4b61d7b7d9bed9df478", + "src/components/ui/spinner.tsx": "3e6e6e8d37fb4069f8e43e55318f8db06fbc36e6c8be0096da3c9337c1c798b9", + "src/components/ui/switch.tsx": "5c19dba26a703cda3dba9ca6fc2ec0049187bcc90224c82b134a2fb5d368e80f", + "src/components/ui/table.tsx": "95e3ef5db88b3bbfb68eed12f341fb942e40ca815f4342e1d5dbc8c8d47c783d", + "src/components/ui/tabs.tsx": "e8469e599381cf021ce751c27cca3d8cb06440a45665ca9c2ef2efb0acef1fd9", + "src/components/ui/textarea.tsx": "de4e9fb0fd8e8ed10ea2e475ffe202a922ffe77e3f3edb2c517b0781447ad1b4", + "src/components/ui/toggle-group.tsx": "c63c671fe328f2c1e0d58e3df82a474e73834037c5a39a9ff566a4b3b2cf9010", + "src/components/ui/toggle.tsx": "ab2e52debb86451889ac9519dfe27daf3a86d70aa2833da8ed8f6cf3146197ff", + "src/components/ui/tooltip.tsx": "cbc12f4086448f8a307ed5fbb160f79467c84a44c48ca0dbd2c62e39a2db6f5d", + "src/hooks/__tests__/useKeyboardShortcuts.test.ts": "8fc622e2b9086d11d4f1de3759991673a4c0745b062af665c2a4e43a348294ed", + "src/hooks/__tests__/useSignOutAction.test.tsx": "10f23bb1cd16009400895e4b824cf1cd7d34703ad5dbf4bae89dc509f2bb144a", + "src/hooks/index.ts": "90cc1e84f3108e39bd5623c95b27873a932e2d2b9e5db4b4b6fb8415853a20b5", + "src/hooks/use-is-compact.ts": "368ad314e1015933a269f6fce322b24cfcdd56200d90151ef5086655d1945874", + "src/hooks/use-mobile.ts": "ad0936f84f1df79d3697bfbff9c18f8ad58431c1cbaf2359c6a853b0fcc9f28b", + "src/hooks/useAIUsage.ts": "59ef72909aa9dcf22f281910a808e9a259ad771c3b4de588e0ce76e67bfc013b", + "src/hooks/useActivityLogger.ts": "420ca7dbc66c6ee996d58c855bbca124469c9cdfcc593984ee96c3fba6931bba", + "src/hooks/useAdmin.ts": "7e14d5e5c6c3c7a1d1c8c9388042492ad1f75bb111d46ef61da1e379a86d1a1f", + "src/hooks/useAuth.ts": "e3d3ca9e160e53b06b8aa12323a2d8bebddbe94767f05535e683d082aa43a496", + "src/hooks/useBoard.ts": "0b6754a7220290ef08d4014e10be96e7fb1bdbadb6987bc45a47ee94970f922d", + "src/hooks/useBoardDialogs.ts": "384ae5b59a60b44b9fc490d3e794480e48c60dececb68f296c4e725fc4927d3f", + "src/hooks/useBoards.ts": "bc4551cf900e3b9610eb725244ed0f514449023711e51cc3a810aec77963e10d", + "src/hooks/useCards.ts": "4ba035b326f14c193b31f7ff3a90fef62fe17c02ec978aa886cf8371a6b981e4", + "src/hooks/useColumns.ts": "9a74ad014c218cf73b0597c1f0dc6a148751e8dc282740fcbb26ed045e68bf4c", + "src/hooks/useKeyboardShortcuts.ts": "af636c58a7f409b6529b76218ab796aa1e85eedaabcb178d3502ba9e361364a4", + "src/hooks/useSignOutAction.ts": "231422491ffc6d09bf9f2a1c28737122d47136b6e0383a270f022e749c780025", + "src/hooks/useSubscription.ts": "51b44796a7c66d8bda615f938e321a5376ac4e2599cc15e0cd1288f5a773a5ce", + "src/index.css": "a08b8fc4db94d4313dcc86af63febe68bf5335fc8bbd0e32edff64ac3a4f7821", + "src/lib/__tests__/apiFetch.test.ts": "14c3502dbe019ce9f0cd7b07583561626d12525a7157248c637b876ad06c8b87", + "src/lib/__tests__/auth-helpers.test.ts": "c1d07f51ed4d57140706092a03c0cf516c77642fd3d24d09266e556b7709ac76", + "src/lib/__tests__/board-io.test.ts": "c1d58408527d9b7e8aaf459917563ef188d1d7d7448533861e96fd7dc96995f2", + "src/lib/__tests__/board-merge.test.ts": "af94d29c0f770b2544295eb954a6f3c9377187a2e8b6a9f7e51a2a8143865d18", + "src/lib/__tests__/board-sync.test.ts": "5769ab0e100fe59f3836ac3d327b7e5f7137289bd19e449f72421cbf69bdc56b", + "src/lib/__tests__/calendar-date.test.ts": "25b0d56e2f43aa595782a4c8b68967b03f8fc998c908e0e85c5fbf285119b468", + "src/lib/__tests__/ci-guard.test.ts": "a9570842782b2c1cb368508a9640b9e7dc66018c9d9f15913e7ebadca942953e", + "src/lib/__tests__/claude.test.ts": "3daf4979b17557ba2acfa4bbcadda93fc00c1d687578499e8aaec92ccdf41f66", + "src/lib/__tests__/recurrence.test.ts": "23ae8fa233bf06ce23c751a76a25c3edf3bf1299b7530be180292773c9573526", + "src/lib/__tests__/stripe-webhook.test.ts": "cbc0df8b231c91a58ed9067fd49dd7b16db763f8af0076b81e9c51496d02c113", + "src/lib/__tests__/supabase-auth-lock.test.ts": "5d222ec40db224be052832c59c8ed45ae9b9501ac8ea86e21fbf42015f08a601", + "src/lib/__tests__/templates.test.ts": "20b266bb947edba1e5c2dbe3d99dd88e9257011961f3182e45575d2f3761c683", + "src/lib/__tests__/utils.test.ts": "726d4c2b91b11b17763eb21d266844112f2c32e9702e3d8dd2813a1a3acfb3f1", + "src/lib/apiFetch.ts": "173bb611e2f770c26aa56471d4c05a9cb2159e37512b6d60e57044f1c714cdf3", + "src/lib/auth-session.ts": "d46a05da52968e5d30331d9f48e25a34ca08ed3ede851549998cef654d4c3de4", + "src/lib/board-access.ts": "3aa288d882334c9affa31a81bd4558780df92c2c0272e8b82cfa5c6f8927e2fc", + "src/lib/board-io.ts": "eb9e91591242615d25c9b1db5442b5ec637ee95d48805f6bdcdc3a435c989d04", + "src/lib/board-merge.ts": "8dfc81db05619f0e39c4a33b0c7746c126765c4976d597fcb5c6fc1ecd226daf", + "src/lib/board-sync.ts": "cdb02f74aa3c63c65b7a0412e7fea0f8c8cef7a3b14077f9b2bddb6b19dfbf8d", + "src/lib/calendar-date.ts": "2e67524202bb5364597db86685c8e438574104ecfcd33bdf94d20f8363aae789", + "src/lib/claude.ts": "31bc90968f2ba1c3139497e0d759307c28cc2fb3e43472bcdfbaeeb19e2ac76f", + "src/lib/database/board-members.ts": "37fe55c8609602e4e418600bb94e564ed2da7ce9a2dd8ac371c5f1137d650656", + "src/lib/database/boards.ts": "149dec3eeaaab75b42e10c3cf61b6971444d8342d0f20df07b398ea97ed388c0", + "src/lib/database/cards.ts": "be18b22b257c72774d3df321336f873854f24160b3c21920038e2e524b153d68", + "src/lib/database/columns.ts": "a94edf435468c0966452844da9a1e86275e9cb88d53df4e5e77abcfec57d89fa", + "src/lib/database/feedback.ts": "283b09a7cfccafc984b293b9b96bf1af0aa739b2b01cca518a610aff5c681358", + "src/lib/database/index.ts": "f85d0fb33c3d81a53ccc6c1dec9d8c9ff696a135fa425a1c6781a01f56b647a0", + "src/lib/database/types.ts": "f986e01d6493f34bb87838ba2f79795436289d3682506f2d622e0dfd3f298265", + "src/lib/keyboard.ts": "cf320ee6228b82e81d81d2b74c301bc5f25dcab5bcda0cea39b4bae664b8f9d3", + "src/lib/recurrence.ts": "7c16adf0250b8877305ce9cbc9f1ed96e43970f6047b9ef598a560ec7dab8030", + "src/lib/supabase.ts": "75f0d60fb87120924510be2ca3c00772a5ade8916610862d9db727caa1201789", + "src/lib/templates.ts": "cab61dbe2545d4c62217a99a493ef97b23890c300cfa258030b20434544aa353", + "src/lib/utils.ts": "ace8eec1b148d71b4fad92d583958c906c6ea66a25e32d4c3ae57bb1bed52bc3", + "src/main.tsx": "7406127375e63bc3d916af109672a26d27f1b875b7e81349ca185376feec8fcf", + "src/pages/AccountPage.tsx": "c390563555e5cb0445e4326a55f75cfead8d8316011dda5972a0c1ad3307c0ed", + "src/pages/AdminPage.tsx": "e9f9b15ef9ba4c300a8ccf11951230ec01fd730d570d3bb9dad5b9aab64649f1", + "src/pages/AuthCliPage.tsx": "a9fae0c584ba1f9770fab7c144c0560517af5d54124da01f24d40cf12f23b4fd", + "src/pages/ConnectorConsentPage.tsx": "3bdde7b8b4786f37ede2d77711494553815f32827f74b476c9ebf9b10d6f65b6", + "src/pages/EmbedBoardPage.tsx": "c4b7dfce03d2f0b62bceb5a4e269a1a6a5c53ea5bf4dd388b21f4aa3dee43052", + "src/pages/FeedbackPage.tsx": "08d5d1a8e8916e339bbd7d988738e3970bb4db4dbd8fae99d54758079afdacb6", + "src/pages/LandingPage.tsx": "7196abfa83c51c7a677fe3bf23e0e13242299629b15f20822daea041f0d9329d", + "src/pages/NotFoundPage.tsx": "191c6eeee23e592b6c695579aa0367bc2ebd13f193c691b32bc52e5fbaea7aff", + "src/pages/PrivacyPage.tsx": "7d454f6bd08d02ade52d3c79e811adf66f096b9f6eeacb7a99febaee96ab9bb3", + "src/pages/SharedBoardPage.tsx": "45e2f062d1fb6b9154492189772d26535426ad01980bda09f8358185bee9cacb", + "src/pages/TermsPage.tsx": "ae88aeb6fa7be935be048770c573bc645df756fd15984942b3d0bea981091ca1", + "src/pages/__tests__/LandingPage.test.tsx": "6295bd97e9b1eb0193709501441badc32d6b718c6b250f707be9439eb9e77b78", + "src/pages/__tests__/SharedBoardPage.test.tsx": "9c8c875a0a0ac253af745bc42e48687652f55570e7431e60eaabd048d0833d2d", + "src/routes.tsx": "641bdc4b73a3d0c887ac4acbf6f0e643ccb09f9b22679a4b16a6b1982876c774", + "src/store/__tests__/boardConcurrentMutations.test.ts": "1f754003e8d36738583a9004db7b00777eab74a3e051a89ff68df21ea6f9af8b", + "src/store/__tests__/boardSyncIntegration.test.ts": "75d9fc64d55d34a1e30ca9963fd5dee271956b7ceb5050f42f3208fa18cbb90e", + "src/store/__tests__/useBoardStore.test.ts": "e916ed6127dc720a5af85aa4a7e2855fbecb1075b4d2e5b97b4350c047341443", + "src/store/__tests__/useUndoStore.test.ts": "cf7f398ce474bcb34c7c48f5d5eeb5df0da312a39ffc97979f4c1aefbe0e4ff7", + "src/store/useBoardStore.ts": "6502f75d9be343f0af6549f01895b6471154ef5471a929b013868468591adbfd", + "src/store/useUndoStore.ts": "d0d577d0a3310b698d08f69f98a0777f546a11c8e122a841c47b37ecee58ea6f", + "src/test/setup.ts": "4c6fe3bcefbdacf379fb6fc02b89e2377bebb86f11de391a211e6933baab21b2", + "src/types/database.ts": "e7beb599f96d0758bc972783518a9767305622bc3ff76bbf41385b510bb3ff7b", + "src/types/index.ts": "f8b009e46821ad03a5cf83d1b960650d9b68c0d630e19bf1827b8f53ea4fce2c", + "tailwind.config.js": "149b62bbe6c8c83d2f3dfb3196bbdb309156a63a7a289acc12f6c9066c763752", + "tests/connector-ui/ai-drafts.spec.ts": "bd9ae2009b4a9b8830eee93fbb584ffca0a7abaa2e1b61a8434c545440ede274", + "tests/connector-ui/board-access.spec.ts": "3c6cb6a9358c6b0dd1f41d43722bfe0eafba385ecff83dee206c662e57d8ecaf", + "tests/connector-ui/board-accessibility.spec.ts": "5163ac150db2f19ffcd6ef20037c00f4b54ee2727e89f50393f8234bdbd32c1e", + "tests/connector-ui/board-generation.spec.ts": "84fbfcaf67cf40e7320f834fcc95656e57305c14adf3240a4afab88a6de5eef8", + "tests/connector-ui/connector-ownership.spec.ts": "afe593b2412deed97627a1fbe2731a9d2e0ba8f8d5547193685fd1d97d426f23", + "tests/connector-ui/connector.spec.ts": "a12a2c0da60ca65bc56dc7dbf763a24a5e9ec06c7991e89bdf72efbb832fcc4a", + "tests/connector-ui/fixtures.ts": "f2b9ed7075bd7bfc5b76b6709473f23fa1319760ab04ac5baded8a3911e563f4", + "tests/connector-ui/navigation-drafts.spec.ts": "36d6e1c1b87723e1bbf114c76c7bb780474f4ea970fe700b0a1e6354a2c6fae3", + "tests/connector-ui/signout.spec.ts": "f16c1fab42a0fac4f91667c557b80da0ebd58c7cb93d718d8fc380aff83afc61", + "tests/e2e/board-sync.spec.ts": "f34599bb2d5587791ce2eb7df44df53e93433b109bd78256a60ce6bf8bb2b727", + "tests/e2e/card-parity.spec.ts": "bfca1b86d5883dd9f0e6abcb29a5f535bc49c9f2d32003b826a3b044517af48a", + "tests/e2e/date-parity.spec.ts": "2fb4967aacd1ca1e25195ed1053c193fa131f5e809d24351deaca8bbc459956d", + "tests/e2e/env.ts": "dc326d9fe840b50b5509006f3065fa6c096b935d1f24aefc834c614c4cbf57c1", + "tests/e2e/global-setup.ts": "83a847c325d9c5494d4a3bcd63476ca9d188d38132b1e094ce7aed058a09229d", + "tests/e2e/helpers/mcp.mjs": "d3c6c4ebc24249d31ee0f9c1155d7c5fba734870c6b4841b63e53122e47d243a", + "tests/e2e/logged-in.spec.ts": "9a2611bc5980932008b706fb285a278a23d10bece7bd579358e55c7859fc965f", + "tests/e2e/login-ui.public.spec.ts": "5b49d5b01401b62473ae99baa98c61aa826bfafd9524fd30b3ce7b70f0620a87", + "tests/e2e/recurrence-parity.spec.ts": "64a200a09483071e6c146ef202f3faef12a90e9df4fd05cebfe0aa9b16d19db7", + "tsconfig.app.json": "90eb3ac3b7cd4d06c4c837f073f3855774761998780ac01cec7a13d0d5de5cfe", + "tsconfig.json": "a389bfb0309454cd0828a3c4a7431e56c3d6f50a70e648613fd0f51ae300057c", + "tsconfig.node.json": "7888dcc526df903c9ae2360a32b445b1de51c36a65e60200cdc22594bd3a2166", + "vercel.json": "44a58ad3b5e69920f3285377663463995ee35be6f99c261b949911528be09360", + "vite.config.ts": "3b313be8b240dc5c5a4aef9bf20634ddec444eefc577a332931c9eab76326545", + ".github/CODEOWNERS": "0d49181962b1615a21af81bade5f6840129b4e3e906393e765979aa927442896", + ".gitignore": "d207dbb3b0c8de6a3e85ef515b61728a2fa559dc387129458e7b816254a59214", + "media/.gitignore": "1151d360a55341695a33cc870b65d09ddf297a57ba5602d81fbf45e9709c35bf", + "media/wrangler.jsonc": "578f3654b7a90c757dce52f42fbc6e8533999941d608937fa14c9d3625a470c7", + "supabase/migrations/20261001044235_plugin_board_editor_enforcement.sql": "24bc22fc072c75157e256a1e4bbf2ab7fbad8639a8cebf666155c06eae2b7f7d", + "supabase/migrations/20261001142109_plugin_oauth_records.sql": "fd03541378a09b10d4f54c5b948aa9aa9500d7dc871e76b36e6b42b73547d2e1", + "supabase/migrations/20261002030041_plugin_connector_vault.sql": "20f2ab5656ab305012a437e7e943c4a38350ae49f4ad65f76c6d2775b8fd9282", + "supabase/migrations/20261002055310_restrict_definer_function_execution.sql": "62af3d4651dbeb57dfa2f22bac7e1df1de644ca9eb564ec26d3a808eaeb9b41c", + "supabase/migrations/20261002060649_connector_expiry_cleanup.sql": "da97273b6b2bc3d9a999dd0ee6aeb7bb019b5f9fe3b58612c11c1c33c83911ab", + "supabase/schema.sql": "09f2457631349bb09ad8f6ddfb2785078d0c0128fdb375cc7f87540d0c5336d0" + } + }, + "originalEvidencePreserved": { + "originalReceiptSha256": "36dc509e18ebe5801a547d064e320165564b3a6a878effbff111db7a0fcd576b", + "originalReceiptByteForByteUnchanged": true, + "previousArtifactLocation": "/private/tmp/zeroboard-ai-response-limit-production", + "previousArtifactCount": 41, + "allPreviousArtifactBytesMatchReceipt": true, + "previousPrivateConfigPath": "/private/tmp/zeroboard-ai-response-limit-proof/vite-proof.config.mts", + "previousPrivateConfigSha256": "fdd1c48f80bb8b397c058c58d9f651f4e3875735edd24dbaeba0047b7f464fd8" + }, + "gates": { + "fullSuite": { + "head": "9893eb7394a262f87632b9db3e5fcbbff8b576e7", + "node": "20.20.2", + "total": 966, + "passed": 966, + "failed": 0, + "files": 46, + "success": true, + "attempts": 1, + "maxWorkers": 2, + "suites": [ + { + "file": "api/_lib/__tests__/ai-provider-response-limit.test.ts", + "status": "passed", + "total": 8, + "passed": 8 + }, + { + "file": "api/_lib/__tests__/connector-config.test.ts", + "status": "passed", + "total": 3, + "passed": 3 + }, + { + "file": "api/_lib/__tests__/connector-readiness.test.ts", + "status": "passed", + "total": 60, + "passed": 60 + }, + { + "file": "api/_lib/__tests__/connector-sql.test.ts", + "status": "passed", + "total": 4, + "passed": 4 + }, + { + "file": "api/_lib/__tests__/connector.test.ts", + "status": "passed", + "total": 21, + "passed": 21 + }, + { + "file": "api/_lib/__tests__/resolve-commands.test.ts", + "status": "passed", + "total": 11, + "passed": 11 + }, + { + "file": "src/components/__tests__/ErrorBoundary.test.tsx", + "status": "passed", + "total": 3, + "passed": 3 + }, + { + "file": "src/hooks/__tests__/useKeyboardShortcuts.test.ts", + "status": "passed", + "total": 18, + "passed": 18 + }, + { + "file": "src/hooks/__tests__/useSignOutAction.test.tsx", + "status": "passed", + "total": 7, + "passed": 7 + }, + { + "file": "src/pages/__tests__/LandingPage.test.tsx", + "status": "passed", + "total": 1, + "passed": 1 + }, + { + "file": "src/pages/__tests__/SharedBoardPage.test.tsx", + "status": "passed", + "total": 10, + "passed": 10 + }, + { + "file": "src/store/__tests__/boardConcurrentMutations.test.ts", + "status": "passed", + "total": 21, + "passed": 21 + }, + { + "file": "src/store/__tests__/boardSyncIntegration.test.ts", + "status": "passed", + "total": 70, + "passed": 70 + }, + { + "file": "src/store/__tests__/useBoardStore.test.ts", + "status": "passed", + "total": 34, + "passed": 34 + }, + { + "file": "src/store/__tests__/useUndoStore.test.ts", + "status": "passed", + "total": 15, + "passed": 15 + }, + { + "file": "src/lib/__tests__/apiFetch.test.ts", + "status": "passed", + "total": 13, + "passed": 13 + }, + { + "file": "src/lib/__tests__/auth-helpers.test.ts", + "status": "passed", + "total": 12, + "passed": 12 + }, + { + "file": "src/lib/__tests__/board-io.test.ts", + "status": "passed", + "total": 50, + "passed": 50 + }, + { + "file": "src/lib/__tests__/board-merge.test.ts", + "status": "passed", + "total": 63, + "passed": 63 + }, + { + "file": "src/lib/__tests__/board-sync.test.ts", + "status": "passed", + "total": 51, + "passed": 51 + }, + { + "file": "src/lib/__tests__/calendar-date.test.ts", + "status": "passed", + "total": 6, + "passed": 6 + }, + { + "file": "src/lib/__tests__/ci-guard.test.ts", + "status": "passed", + "total": 32, + "passed": 32 + }, + { + "file": "src/lib/__tests__/claude.test.ts", + "status": "passed", + "total": 15, + "passed": 15 + }, + { + "file": "src/lib/__tests__/recurrence.test.ts", + "status": "passed", + "total": 78, + "passed": 78 + }, + { + "file": "src/lib/__tests__/stripe-webhook.test.ts", + "status": "passed", + "total": 7, + "passed": 7 + }, + { + "file": "src/lib/__tests__/supabase-auth-lock.test.ts", + "status": "passed", + "total": 15, + "passed": 15 + }, + { + "file": "src/lib/__tests__/templates.test.ts", + "status": "passed", + "total": 19, + "passed": 19 + }, + { + "file": "src/lib/__tests__/utils.test.ts", + "status": "passed", + "total": 13, + "passed": 13 + }, + { + "file": "src/components/ai/__tests__/AIAssistant.test.tsx", + "status": "passed", + "total": 20, + "passed": 20 + }, + { + "file": "src/components/auth/__tests__/AuthRedirect.test.tsx", + "status": "passed", + "total": 5, + "passed": 5 + }, + { + "file": "src/components/auth/__tests__/SignInModal.test.tsx", + "status": "passed", + "total": 6, + "passed": 6 + }, + { + "file": "src/components/auth/__tests__/signOut.test.tsx", + "status": "passed", + "total": 6, + "passed": 6 + }, + { + "file": "src/components/connectors/__tests__/connector-api.test.ts", + "status": "passed", + "total": 25, + "passed": 25 + }, + { + "file": "src/components/connectors/__tests__/connector-ownership.test.tsx", + "status": "passed", + "total": 30, + "passed": 30 + }, + { + "file": "src/components/connectors/__tests__/connector-setup.test.ts", + "status": "passed", + "total": 1, + "passed": 1 + }, + { + "file": "src/components/connectors/__tests__/connector-ui.test.tsx", + "status": "passed", + "total": 31, + "passed": 31 + }, + { + "file": "api/invite/__tests__/send.test.ts", + "status": "passed", + "total": 26, + "passed": 26 + }, + { + "file": "src/components/board/__tests__/ActiveCardEditor.test.tsx", + "status": "passed", + "total": 17, + "passed": 17 + }, + { + "file": "src/components/board/__tests__/BoardSelector.test.tsx", + "status": "passed", + "total": 3, + "passed": 3 + }, + { + "file": "src/components/board/__tests__/BoardSyncNotice.test.tsx", + "status": "passed", + "total": 13, + "passed": 13 + }, + { + "file": "src/components/board/__tests__/CardActivityFeed.test.tsx", + "status": "passed", + "total": 8, + "passed": 8 + }, + { + "file": "src/components/board/__tests__/CardEditor.test.tsx", + "status": "passed", + "total": 53, + "passed": 53 + }, + { + "file": "src/components/board/__tests__/CreateBoardDialog.async.test.tsx", + "status": "passed", + "total": 16, + "passed": 16 + }, + { + "file": "src/components/board/__tests__/KanbanCard.test.tsx", + "status": "passed", + "total": 6, + "passed": 6 + }, + { + "file": "src/components/board/__tests__/ReadOnlyBoard.test.tsx", + "status": "passed", + "total": 13, + "passed": 13 + }, + { + "file": "src/components/layout/__tests__/AppShell.test.tsx", + "status": "passed", + "total": 27, + "passed": 27 + } + ] + }, + "nodeApiNonincrementalTypesExitCode": 0, + "appNonincrementalTypesExitCode": 0, + "scopedLintExitCode": 0, + "buildExitCode": 0, + "diffWhitespaceExitCode": 0, + "commands": { + "fullSuite": "CI=true VITE_SUPABASE_URL=https://placeholder.supabase.co VITE_SUPABASE_ANON_KEY=placeholder-key /private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/vitest/vitest.mjs run --config /Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/outputs/gauntlet/thirteenth-sdk-integration/vite-test.config.mts --maxWorkers=2 --reporter=default --reporter=json --outputFile.json=/Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/outputs/gauntlet/thirteenth-sdk-integration/full-test.json", + "nodeApiTypes": "/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/typescript/bin/tsc --project tsconfig.node.json --incremental false --noEmit", + "appTypes": "/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/typescript/bin/tsc --project tsconfig.app.json --incremental false --noEmit", + "scopedLint": "/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/eslint/bin/eslint.js api/_lib/__tests__/ai-provider-response-limit.test.ts", + "build": "VITE_SUPABASE_URL=https://connector-fixture.invalid VITE_SUPABASE_ANON_KEY=disposable-fixture-public-key /private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/vite/bin/vite.js build --config /Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/outputs/gauntlet/thirteenth-sdk-integration/vite-build.config.mts" + }, + "logSha256": { + "full-test.log": "dd277d2e742abf6df6ef4df0c96e1612dd8766a1aec24b1e6d4f8357d4a30c58", + "typecheck-node.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "typecheck-app.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "lint.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "build.log": "52d3b911553fe4eab85ba181b65e7a67e9a18181f7324dee19ada03720c2dd34" + } + }, + "integratedProductionBuild": { + "directory": "/private/tmp/zeroboard-sdk-integrated-built-smoke/dist", + "artifactCount": 41, + "artifactHashes": { + "android-chrome-192x192.png": { + "sha256": "50117c38991d1f05eb547aa9fdd5310ddbc1c3c3191074974178cedba6f67b88", + "bytes": 31787 + }, + "android-chrome-512x512.png": { + "sha256": "8372cbeffa825e3add85147f032f25f27c394bdec8f25765ca172b904d1e26d8", + "bytes": 136346 + }, + "apple-touch-icon.png": { + "sha256": "bc8585046099cb1b4ed0def79c5c8965be7503da6abd47b2bb266d896b210cdc", + "bytes": 28455 + }, + "assets/AppShell-CjOWo3DY.js": { + "sha256": "bdbc44e06ce67b743efef57c03722c32717d3c13b482edb6c20e0323bebbc94e", + "bytes": 354175 + }, + "assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff": { + "sha256": "9e97905f0663eab927bcaa72b4e5b844bfa980ada3f894ff92052ec7ed2d8c03", + "bytes": 7164 + }, + "assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2": { + "sha256": "259b63d9a2dcdf449b73f46624e409de1d62a51134e884d3f4af1242736cde10", + "bytes": 5460 + }, + "assets/geist-mono-latin-400-normal-CoULgQGM.woff": { + "sha256": "af2a06fc6940abff35305a96ce4e2f69c2934106339b488b8cb85ca6f136dfff", + "bytes": 19168 + }, + "assets/geist-mono-latin-400-normal-LC9RFr9I.woff2": { + "sha256": "616e37ca59a2afebe306751773a538b93f5a2d9a90fd3fc97ce73321cb93af51", + "bytes": 14712 + }, + "assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2": { + "sha256": "7f4a5d3c1cdf8a5bc8deb47b85606a5486d5159d42eba048bae9583c4d085cd0", + "bytes": 6424 + }, + "assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff": { + "sha256": "9f73a257660b9605fd3fae18eec73f1813da5d4e06638f5f7d2b155750530185", + "bytes": 8744 + }, + "assets/geist-sans-latin-400-normal-BOaIZNA2.woff": { + "sha256": "b2f5931f1a903bcc64af96ee41b3fed53a8ce74e9261181931a680a50560485b", + "bytes": 38912 + }, + "assets/geist-sans-latin-400-normal-gapTbOY8.woff2": { + "sha256": "e6ef6abb39c762ed2259cc814e6f16888c540cd84835962227b56ab2354f27f1", + "bytes": 33400 + }, + "assets/geist-sans-latin-500-normal-CN2lyvyL.woff": { + "sha256": "5d679b8796eed440d6e7e2e94c37390b82f9db77aa92cfc21e96a1cdeecfba3d", + "bytes": 40520 + }, + "assets/geist-sans-latin-500-normal-uokXdC-Q.woff2": { + "sha256": "40073e90816315c92e4f4381bd50b6fdc950b22b0dd010a4179046cf588d4f12", + "bytes": 34716 + }, + "assets/geist-sans-latin-600-normal-CA1yjETN.woff": { + "sha256": "3903ed7633d563de34bbbf609e869a878e4b4081a25011a195b7a80043ecafe9", + "bytes": 41204 + }, + "assets/geist-sans-latin-600-normal-DFOURf8L.woff2": { + "sha256": "9d99fbd791968493fa507ac846de561cee47b00f8100c23cad333b3cb78392d6", + "bytes": 35292 + }, + "assets/geist-sans-latin-700-normal-BmN9tIp5.woff2": { + "sha256": "3d59addfafec3452d44717aa0a18911d5c3812487ed06af47f2ef27192ea1eed", + "bytes": 35484 + }, + "assets/geist-sans-latin-700-normal-CjScfYeH.woff": { + "sha256": "a25e16202a8cd74d4a149b97d69262582e23ae59abfde1cee1a051ba5c41622a", + "bytes": 41396 + }, + "assets/index-CHEpaECk.css": { + "sha256": "263e79f76a1b7eea90ef1464343a1cde2748db1ae45e75881816b9f83fe9cf05", + "bytes": 123981 + }, + "assets/index-DbFgEV0a.js": { + "sha256": "f46fefd57227231264f09a548bc37a305d954d1ba7224c69cbcf798601f1f37b", + "bytes": 998531 + }, + "assets/matter-Dk2mHJSa.js": { + "sha256": "2bb7fdfd8fb1bb43510645ce6528a51220b2a98ba0d40e0a1da804224b5f6979", + "bytes": 84438 + }, + "favicon-16x16.png": { + "sha256": "bfbf0d89f45777cd191e9469821d552a6fdd165caed3df063aaaa35069312864", + "bytes": 805 + }, + "favicon-32x32.png": { + "sha256": "346c79ed3891dff343b7ea9ff401095dbe756c97f1c872408f87c242c3ecb597", + "bytes": 2038 + }, + "favicon.ico": { + "sha256": "b1a99af77445241f1676ddbf23fb12b3f7b59f0ca3ccda3158834b0179b31a15", + "bytes": 5430 + }, + "index.html": { + "sha256": "98c17efb8c749189642f6f755f2c08c6bc517fafbbc3c66c3b95c02e6519b17f", + "bytes": 686 + }, + "logo/logo_color.svg": { + "sha256": "471cfbd7f8e6c166e1f034b9a8a859f93b7dd0d4485a692addef37a25119ce23", + "bytes": 4302 + }, + "logo/logo_dark_pointer.svg": { + "sha256": "bfc85a05ebd3a97ea76a282a07ca486c9f2e781f0241fd5306995df6ec5c42cf", + "bytes": 4286 + }, + "logo/logo_wordmark.svg": { + "sha256": "d722e84c19e78e085cd2039c133dddc956263e7bdbfdd126da4afe03e94ba3ef", + "bytes": 4886 + }, + "screenshots/ZeroBoardAI.gif": { + "sha256": "10f5b724226fee0f709f004cc56328d847934a4d22677017f43e1e1430a566da", + "bytes": 5338589 + }, + "screenshots/ai-assist.png": { + "sha256": "8dc1b38f769e288eadd1fa183083b81ac117bd7b9a1761bb24f63cd7d0a21a3e", + "bytes": 131175 + }, + "screenshots/ai-plan-a-sprint.png": { + "sha256": "3dd5b810495f077a2bd15b3d7203638b210ebe064f058636828e374d171584f6", + "bytes": 440811 + }, + "screenshots/card-editor.png": { + "sha256": "61675bb2019e0a35a6b4c260d19cf1b7bb8207576d3635c58ee03f75cbfafca2", + "bytes": 41609 + }, + "screenshots/choose-background-color.png": { + "sha256": "0c89279f420dbd38a8c38543ce878f46281cb1febe274cbf7fddfafb1bff24c3", + "bytes": 42821 + }, + "screenshots/deploy-with-vercel.png": { + "sha256": "d769ff3378e29b68f7f192c841b70b5c6ffba555907bc1d382c1514f3965a62b", + "bytes": 39815 + }, + "screenshots/export-to-json.png": { + "sha256": "86e7c25b6dc869b735ab5cf872f2fd59c0d8b178a475f9b7535705906ecba9ff", + "bytes": 19055 + }, + "screenshots/kanban.png": { + "sha256": "88d485f1d44566b0a8c15a510d0908faaaaac76d377815a8a441eec6787660ad", + "bytes": 254898 + }, + "screenshots/save-as-template.png": { + "sha256": "79b4c2c514e3e5337c0e548ea3182fb943335890032a9781fd2d239b879ba4c4", + "bytes": 19689 + }, + "screenshots/sharing.png": { + "sha256": "a1ecc503709eb34cdec2e56d5eff68499f27181a03d8e42225f699ec3499f8f2", + "bytes": 36980 + }, + "screenshots/sign-in-auth.png": { + "sha256": "f37d071428675266004e3567b546ebd6038c734e1c3a17554f33b5680e8895f8", + "bytes": 42269 + }, + "screenshots/timeline.png": { + "sha256": "9196b6a6bb5dc771e75e14eb92d77f850cb908911be409cb4c2856ffd0d09317", + "bytes": 275660 + }, + "zeroboard-mcp-commercial.en.vtt": { + "sha256": "0bae4a9b69406072773a28b19a7d4eb67c07a5bf4c2143dbc934e89f76542b09", + "bytes": 1313 + } + }, + "elapsedSeconds": 11.59, + "originalViteConfigSha256": "3b313be8b240dc5c5a4aef9bf20634ddec444eefc577a332931c9eab76326545", + "privateConfigPath": "/Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/outputs/gauntlet/thirteenth-sdk-integration/vite-build.config.mts", + "privateConfigSha256": "a14bef958e5a62dd86e0e816f0e377e4ad9dd4235271c14b799e720be39ec5de", + "privateTestConfigPath": "/Users/tmcfarlane/Documents/Codex/2026-09-30/zeroboard-chatgpt-integration/outputs/gauntlet/thirteenth-sdk-integration/vite-test.config.mts", + "privateTestConfigSha256": "f72d0b6a1d6a05635aef79fcdc8014662e301962b5e9ba18ffc00868f744803a", + "overridesOnly": [ + "cacheDir", + "build.outDir", + "build.emptyOutDir" + ], + "fixtureEnvironment": { + "VITE_SUPABASE_URL": "https://connector-fixture.invalid", + "VITE_SUPABASE_ANON_KEY": "disposable-fixture-public-key" + }, + "notices": [ + "Browserslist age", + "chunks larger than 500 kB" + ] + }, + "scope": [ + "One full app/API gate; no autoretry", + "No added source/package/test change", + "No provider-focused or audit repeat", + "No browser evidence written or executed by this agent", + "No MCP suite, service mutation, commit or push", + "Header-only 2 GiB proof remains in original receipt; integration does not add a smaller application cap" + ], + "integrationReadmeSha256": "44efcf95c08179e3e429ab23c891f74e55cb533fbd64abcb6036b40ff2ad4a57" +} diff --git a/docs/qa/v0.8/ai-response-limit/integration-nonbrowser.md b/docs/qa/v0.8/ai-response-limit/integration-nonbrowser.md new file mode 100644 index 0000000..6347d0b --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/integration-nonbrowser.md @@ -0,0 +1,17 @@ +# Integrated SDK app/API verification + +Integrated source: `9893eb7394a262f87632b9db3e5fcbbff8b576e7`, including the latest v0.8 auth and native SQL fixture repairs. The three reviewed SDK package/test hashes remain unchanged. This appends verification to the original evidence; [receipt.json](receipt.json) is preserved byte for byte. + +One full app/API pass ran under the root-provided Node **20.20.2** binary with two workers, the original Vite test settings, a private cache and CI placeholder Supabase values. All **966 tests across 46 files passed** on the first attempt in 97.52 seconds, including the four repaired native SQL cases and the eight actual-adapter size-header cases. No retry, source correction or test relaxation followed this pass. The shared SQL test slot was released immediately after the process exited. + +Both app and API/node TypeScript projects passed with `--incremental false --noEmit`. ESLint on the new adapter test and diff whitespace checks passed. [integration-full-test-summary.json](integration-full-test-summary.json) records every suite count; [integration-full-test.log](integration-full-test.log) preserves the complete output. The empty typecheck/lint logs and [integration-build.log](integration-build.log) accompany the machine-readable [integration-nonbrowser-receipt.json](integration-nonbrowser-receipt.json). + +The integrated production build used the original `vite.config.ts` and plugins, overriding only its private cache/output directory and empty-output behavior. It completed in 11.59 seconds, retaining the existing Browserslist age notice and large-chunk advisory. The build used `https://connector-fixture.invalid` and a disposable public key so the compiled app matches the local connector browser fixtures. This is not a production deployment or a live Supabase/AI request. + +All **41** integrated artifacts are retained at `/private/tmp/zeroboard-sdk-integrated-built-smoke/dist`. Their exact bytes and SHA-256 values are recorded in the integration receipt. The private build config is retained at `outputs/gauntlet/thirteenth-sdk-integration/vite-build.config.mts` outside the repository. This agent did not execute browser checks or write browser evidence; the separately appended browser integration evidence is owned by root. + +The earlier 41-artifact build still exists at `/private/tmp/zeroboard-ai-response-limit-production`; every byte continues to match its original receipt. Its original private config is `/private/tmp/zeroboard-ai-response-limit-proof/vite-proof.config.mts`. Neither location was overwritten by the integrated build. + +The source check covers 351 tracked code/config files and found no changed hashes after the full pass, typechecks, lint and build. Pre-run git state was clean at the immutable integrated commit. The explicit pre-execution manifest covered TypeScript, JavaScript, JSON, YAML, HTML and CSS; SQL, JSONC and ignore/CODEOWNERS settings were subsequently checked against that same commit and added to the manifest. The original receipt's SHA-256 remains `36dc509e18ebe5801a547d064e320165564b3a6a878effbff111db7a0fcd576b`. + +The original before/after proof still establishes the SDK's **2 GiB declared-header guard**, using small valid streamed fixtures. Integration adds no proof of a smaller app memory cap or an unadvertised 2 GiB transfer. No focused provider/audit repeat, MCP suite, service mutation, commit or push was performed in this integrated gate. diff --git a/docs/qa/v0.8/ai-response-limit/integration-typecheck-app.log b/docs/qa/v0.8/ai-response-limit/integration-typecheck-app.log new file mode 100644 index 0000000..e69de29 diff --git a/docs/qa/v0.8/ai-response-limit/integration-typecheck-node.log b/docs/qa/v0.8/ai-response-limit/integration-typecheck-node.log new file mode 100644 index 0000000..e69de29 diff --git a/docs/qa/v0.8/ai-response-limit/receipt.json b/docs/qa/v0.8/ai-response-limit/receipt.json new file mode 100644 index 0000000..691fb23 --- /dev/null +++ b/docs/qa/v0.8/ai-response-limit/receipt.json @@ -0,0 +1,361 @@ +{ + "recordedAtUtc": "2026-10-02T12:31:37.645806+00:00", + "baseCommit": "63efb43fe37ddc312a9b76b7ee1f875901389e7f", + "branch": "codex/gauntlet-ai-response-limit", + "runtime": { + "node": "25.6.0", + "npm": "11.8.0", + "vitest": "4.1.4" + }, + "installation": "npm ci --ignore-scripts --no-audit --no-fund; task-private node_modules and npm cache; no symlinks", + "testCommand": "./node_modules/.bin/vitest run api/_lib/__tests__/ai-provider-response-limit.test.ts --maxWorkers=1 --reporter=default --reporter=json --outputFile.json=", + "baseline": { + "sourceSha256": { + "package.json": "72ec80ee52cbdf1a792298f5eb2616c285d12f2958bb5bf9a077ec4b939fb3a7", + "package-lock.json": "31cc49471db5d501d464ea4d27e919a74d4c33e4f0277d53c832704319dbeed7", + "api/_lib/__tests__/ai-provider-response-limit.test.ts": "9442ee496fa6a22374585abaf5365d497af454783d4b4af5a1db49eb30022d14" + }, + "lockVersions": { + "ai": "6.0.158", + "@ai-sdk/openai": "3.0.52", + "@ai-sdk/provider-utils": "4.0.23", + "@ai-sdk/gateway": "3.0.95", + "@ai-sdk/provider": "3.0.8", + "@vercel/oidc": "3.1.0", + "eventsource-parser": "3.0.6" + }, + "result": { + "total": 8, + "passed": 4, + "expectedFailures": 4 + } + }, + "candidate": { + "sourceSha256": { + "package.json": "d861c93b64a2d769a403d93ad1601d83e82bb31c01ea4e53cfb8b328b69ec18b", + "package-lock.json": "9c79e68c03958a2c5d40fda9a180ee705024295e1f8ccfc1acc9a77d7999ea95", + "api/_lib/__tests__/ai-provider-response-limit.test.ts": "9442ee496fa6a22374585abaf5365d497af454783d4b4af5a1db49eb30022d14" + }, + "lockVersions": { + "ai": "6.0.214", + "@ai-sdk/openai": "3.0.77", + "@ai-sdk/provider-utils": "4.0.33", + "@ai-sdk/gateway": "3.0.139", + "@ai-sdk/provider": "3.0.12", + "@vercel/oidc": "3.2.0", + "eventsource-parser": "3.1.1" + }, + "installedVersions": { + "ai": "6.0.214", + "@ai-sdk/openai": "3.0.77", + "@ai-sdk/provider-utils": "4.0.33", + "@ai-sdk/gateway": "3.0.139", + "@ai-sdk/provider": "3.0.12", + "@vercel/oidc": "3.2.0", + "eventsource-parser": "3.1.1" + }, + "result": { + "total": 8, + "passed": 8, + "failed": 0 + } + }, + "scope": { + "actualPublicAdapters": [ + "createOpenAI().chat", + "createOpenAI() default Responses" + ], + "generation": "generateText", + "responseKind": "genuine small streamed JSON success and error bodies in real Response objects", + "declaredContentLength": 2147483649, + "sdkDefaultMaxBytes": 2147483648, + "candidateGuardAssertions": [ + "APICallError cause is DownloadError", + "size error message", + "exactly one injected fetch", + "zero body bytes delivered", + "unread body stream cancelled", + "stream not completed", + "global network fetch not called" + ], + "limitations": [ + "No 2 GiB allocation or transfer", + "No unadvertised/chunk-accumulation 2 GiB threshold proof", + "No smaller application memory cap", + "No live provider or production request", + "Full unit, broad browser and MCP suites remain held" + ] + }, + "evidenceSha256": { + "baseline.json": "a9811b6fc57ed13f9f30c31a151d80ef17762b956c0e016369bdb0a6718ba5c5", + "candidate.json": "3bacfa61a0dfb1bfeb765c095f32b6dc8985acde04161677be0ba95f77f6c97c", + "README.md": "308d2253f86b34b759a5c8d3ee7e34361003226f8dffb743910090693e916a05", + "compatibility.json": "ba166b9a81ff84de2ff23be1406bb854c66ba42ff674f7ec406ae0f8a3712438", + "audit.json": "86d95158734471d549b81c173b627a16d28b01f33824edca230d381b90d69682", + "audit-diff.json": "0e7c243f89e6f569088973ab447538f043dc03bdf6b72921efc56f7a21ab0792" + }, + "rawLogSha256": { + "baseline-test.log": "8b2c53beca722d34d7bd021bf84faf4608eb18a9d8306c66075dbed720b7010f", + "candidate-test.log": "6470ed2515edb5ff81517599eb32db8c31643aeb8ccbacb694b47381bba7e829" + }, + "installLogSha256": { + "baseline-install.log": "65e79b0f00614ceef187eee35dc57968f390259419c5165580c79e02b2ce5b0a", + "candidate-install.log": "6b7b60cf3fc3b0ccaad8e6d190d4a18d8effb0f15ed971d6f1eb0cb642573198" + }, + "compatibilityGates": { + "recordedAtUtc": "2026-10-02T12:38:46.617172+00:00", + "runtimeNode": "20.20.2", + "tests": { + "total": 33, + "passed": 33, + "failed": 0, + "workers": 1 + }, + "appTypecheckExitCode": 0, + "nodeApiTypecheckExitCode": 0, + "scopedLintExitCode": 0, + "productionBuildExitCode": 0, + "auditExitCode": 1, + "commands": { + "compatibilityTests": "/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/vitest/vitest.mjs run api/_lib/__tests__/ai-provider-response-limit.test.ts api/_lib/__tests__/resolve-commands.test.ts src/components/ai/__tests__/AIAssistant.test.tsx --maxWorkers=1 --reporter=default --reporter=json --outputFile.json=/private/tmp/zeroboard-ai-response-limit-proof/compatibility-test.json", + "appTypes": "/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/typescript/bin/tsc --project tsconfig.app.json --incremental false --noEmit", + "nodeApiTypes": "/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/typescript/bin/tsc --project tsconfig.node.json --incremental false --noEmit", + "scopedLint": "/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/eslint/bin/eslint.js api/_lib/__tests__/ai-provider-response-limit.test.ts", + "build": "VITE_SUPABASE_URL=https://ai-response-fixture.invalid VITE_SUPABASE_ANON_KEY=disposable-fixture-public-key /private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin/node node_modules/vite/bin/vite.js build --config /private/tmp/zeroboard-ai-response-limit-proof/vite-proof.config.mts", + "audit": "PATH=/private/tmp/zeroboard-ai-ci-runtime/node_modules/node/bin:$PATH npm audit --omit=dev --json --cache /private/tmp/zeroboard-ai-response-limit-npm-cache" + }, + "logSha256": { + "compatibility-test.log": "a5003ab4e537976f6ed096f203d3344d3159f84e0bfdbd91135d3999cda6d24a", + "typecheck-app.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "typecheck-node.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "lint.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "build.log": "a19444db01f06c7059f8751c13e9b200d4f8ed09ae0b1e24b2fc5c1ce401582b", + "candidate-audit-stderr.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "build": { + "originalConfigSha256": "3b313be8b240dc5c5a4aef9bf20634ddec444eefc577a332931c9eab76326545", + "privateOverrideSha256": "fdd1c48f80bb8b397c058c58d9f651f4e3875735edd24dbaeba0047b7f464fd8", + "overridesOnly": [ + "cacheDir", + "build.outDir", + "build.emptyOutDir" + ], + "elapsedSeconds": 11.54, + "modulesTransformed": 2403, + "disposableEnvironment": { + "VITE_SUPABASE_URL": "https://ai-response-fixture.invalid", + "VITE_SUPABASE_ANON_KEY": "disposable-fixture-public-key" + }, + "notices": [ + "Browserslist age", + "chunks larger than 500 kB" + ], + "artifactHashes": { + "android-chrome-192x192.png": { + "sha256": "50117c38991d1f05eb547aa9fdd5310ddbc1c3c3191074974178cedba6f67b88", + "bytes": 31787 + }, + "android-chrome-512x512.png": { + "sha256": "8372cbeffa825e3add85147f032f25f27c394bdec8f25765ca172b904d1e26d8", + "bytes": 136346 + }, + "apple-touch-icon.png": { + "sha256": "bc8585046099cb1b4ed0def79c5c8965be7503da6abd47b2bb266d896b210cdc", + "bytes": 28455 + }, + "assets/AppShell-DW_UCLA7.js": { + "sha256": "0233497a264592855d3ed4ff128f5100db0edd681e5323a524ea643230e61dfb", + "bytes": 353547 + }, + "assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff": { + "sha256": "9e97905f0663eab927bcaa72b4e5b844bfa980ada3f894ff92052ec7ed2d8c03", + "bytes": 7164 + }, + "assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2": { + "sha256": "259b63d9a2dcdf449b73f46624e409de1d62a51134e884d3f4af1242736cde10", + "bytes": 5460 + }, + "assets/geist-mono-latin-400-normal-CoULgQGM.woff": { + "sha256": "af2a06fc6940abff35305a96ce4e2f69c2934106339b488b8cb85ca6f136dfff", + "bytes": 19168 + }, + "assets/geist-mono-latin-400-normal-LC9RFr9I.woff2": { + "sha256": "616e37ca59a2afebe306751773a538b93f5a2d9a90fd3fc97ce73321cb93af51", + "bytes": 14712 + }, + "assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2": { + "sha256": "7f4a5d3c1cdf8a5bc8deb47b85606a5486d5159d42eba048bae9583c4d085cd0", + "bytes": 6424 + }, + "assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff": { + "sha256": "9f73a257660b9605fd3fae18eec73f1813da5d4e06638f5f7d2b155750530185", + "bytes": 8744 + }, + "assets/geist-sans-latin-400-normal-BOaIZNA2.woff": { + "sha256": "b2f5931f1a903bcc64af96ee41b3fed53a8ce74e9261181931a680a50560485b", + "bytes": 38912 + }, + "assets/geist-sans-latin-400-normal-gapTbOY8.woff2": { + "sha256": "e6ef6abb39c762ed2259cc814e6f16888c540cd84835962227b56ab2354f27f1", + "bytes": 33400 + }, + "assets/geist-sans-latin-500-normal-CN2lyvyL.woff": { + "sha256": "5d679b8796eed440d6e7e2e94c37390b82f9db77aa92cfc21e96a1cdeecfba3d", + "bytes": 40520 + }, + "assets/geist-sans-latin-500-normal-uokXdC-Q.woff2": { + "sha256": "40073e90816315c92e4f4381bd50b6fdc950b22b0dd010a4179046cf588d4f12", + "bytes": 34716 + }, + "assets/geist-sans-latin-600-normal-CA1yjETN.woff": { + "sha256": "3903ed7633d563de34bbbf609e869a878e4b4081a25011a195b7a80043ecafe9", + "bytes": 41204 + }, + "assets/geist-sans-latin-600-normal-DFOURf8L.woff2": { + "sha256": "9d99fbd791968493fa507ac846de561cee47b00f8100c23cad333b3cb78392d6", + "bytes": 35292 + }, + "assets/geist-sans-latin-700-normal-BmN9tIp5.woff2": { + "sha256": "3d59addfafec3452d44717aa0a18911d5c3812487ed06af47f2ef27192ea1eed", + "bytes": 35484 + }, + "assets/geist-sans-latin-700-normal-CjScfYeH.woff": { + "sha256": "a25e16202a8cd74d4a149b97d69262582e23ae59abfde1cee1a051ba5c41622a", + "bytes": 41396 + }, + "assets/index-CHEpaECk.css": { + "sha256": "263e79f76a1b7eea90ef1464343a1cde2748db1ae45e75881816b9f83fe9cf05", + "bytes": 123981 + }, + "assets/index-bF_bTvOd.js": { + "sha256": "f10ece31bb61cea17f39573983ea24e93b414b563cb5573a5169acea32d51748", + "bytes": 998533 + }, + "assets/matter-Blj7Ov7A.js": { + "sha256": "73a63d73cc3b902e291e63d90c818a2fbb60b4640f3af01fb72d49ddd5902277", + "bytes": 84438 + }, + "favicon-16x16.png": { + "sha256": "bfbf0d89f45777cd191e9469821d552a6fdd165caed3df063aaaa35069312864", + "bytes": 805 + }, + "favicon-32x32.png": { + "sha256": "346c79ed3891dff343b7ea9ff401095dbe756c97f1c872408f87c242c3ecb597", + "bytes": 2038 + }, + "favicon.ico": { + "sha256": "b1a99af77445241f1676ddbf23fb12b3f7b59f0ca3ccda3158834b0179b31a15", + "bytes": 5430 + }, + "index.html": { + "sha256": "3dd6f66a5eb38028d34cee540330037cf424f58b8635a7474a575d595bdd80b8", + "bytes": 686 + }, + "logo/logo_color.svg": { + "sha256": "471cfbd7f8e6c166e1f034b9a8a859f93b7dd0d4485a692addef37a25119ce23", + "bytes": 4302 + }, + "logo/logo_dark_pointer.svg": { + "sha256": "bfc85a05ebd3a97ea76a282a07ca486c9f2e781f0241fd5306995df6ec5c42cf", + "bytes": 4286 + }, + "logo/logo_wordmark.svg": { + "sha256": "d722e84c19e78e085cd2039c133dddc956263e7bdbfdd126da4afe03e94ba3ef", + "bytes": 4886 + }, + "screenshots/ZeroBoardAI.gif": { + "sha256": "10f5b724226fee0f709f004cc56328d847934a4d22677017f43e1e1430a566da", + "bytes": 5338589 + }, + "screenshots/ai-assist.png": { + "sha256": "8dc1b38f769e288eadd1fa183083b81ac117bd7b9a1761bb24f63cd7d0a21a3e", + "bytes": 131175 + }, + "screenshots/ai-plan-a-sprint.png": { + "sha256": "3dd5b810495f077a2bd15b3d7203638b210ebe064f058636828e374d171584f6", + "bytes": 440811 + }, + "screenshots/card-editor.png": { + "sha256": "61675bb2019e0a35a6b4c260d19cf1b7bb8207576d3635c58ee03f75cbfafca2", + "bytes": 41609 + }, + "screenshots/choose-background-color.png": { + "sha256": "0c89279f420dbd38a8c38543ce878f46281cb1febe274cbf7fddfafb1bff24c3", + "bytes": 42821 + }, + "screenshots/deploy-with-vercel.png": { + "sha256": "d769ff3378e29b68f7f192c841b70b5c6ffba555907bc1d382c1514f3965a62b", + "bytes": 39815 + }, + "screenshots/export-to-json.png": { + "sha256": "86e7c25b6dc869b735ab5cf872f2fd59c0d8b178a475f9b7535705906ecba9ff", + "bytes": 19055 + }, + "screenshots/kanban.png": { + "sha256": "88d485f1d44566b0a8c15a510d0908faaaaac76d377815a8a441eec6787660ad", + "bytes": 254898 + }, + "screenshots/save-as-template.png": { + "sha256": "79b4c2c514e3e5337c0e548ea3182fb943335890032a9781fd2d239b879ba4c4", + "bytes": 19689 + }, + "screenshots/sharing.png": { + "sha256": "a1ecc503709eb34cdec2e56d5eff68499f27181a03d8e42225f699ec3499f8f2", + "bytes": 36980 + }, + "screenshots/sign-in-auth.png": { + "sha256": "f37d071428675266004e3567b546ebd6038c734e1c3a17554f33b5680e8895f8", + "bytes": 42269 + }, + "screenshots/timeline.png": { + "sha256": "9196b6a6bb5dc771e75e14eb92d77f850cb908911be409cb4c2856ffd0d09317", + "bytes": 275660 + }, + "zeroboard-mcp-commercial.en.vtt": { + "sha256": "0bae4a9b69406072773a28b19a7d4eb67c07a5bf4c2143dbc934e89f76542b09", + "bytes": 1313 + } + } + }, + "audit": { + "before": { + "info": 0, + "low": 4, + "moderate": 3, + "high": 3, + "critical": 0, + "total": 10 + }, + "after": { + "info": 0, + "low": 0, + "moderate": 3, + "high": 3, + "critical": 0, + "total": 6 + }, + "removedPackageNodes": [ + "@ai-sdk/gateway", + "@ai-sdk/openai", + "@ai-sdk/provider-utils", + "ai" + ], + "addedPackageNodes": [], + "remainingChangedPackageNodes": [], + "remainingPackageNodes": [ + "lodash", + "react-router", + "react-router-dom", + "resend", + "svix", + "uuid" + ], + "packageHashes": { + "package.json": "d861c93b64a2d769a403d93ad1601d83e82bb31c01ea4e53cfb8b328b69ec18b", + "package-lock.json": "9c79e68c03958a2c5d40fda9a180ee705024295e1f8ccfc1acc9a77d7999ea95" + }, + "auditExitCode": 1, + "assessment": "The four AI-family nodes are removed; six existing unrelated package nodes remain. No new findings appeared. Prior source reachability assessment applies because the application and these packages are unchanged. The nonzero audit result is not a zero-vulnerability claim and does not negate the scoped AI advisory removal." + } + } +} diff --git a/package-lock.json b/package-lock.json index c4d5132..91bd09a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "zeroclickboards", "version": "0.0.0", "dependencies": { - "@ai-sdk/openai": "^3.0.52", + "@ai-sdk/openai": "^3.0.77", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", @@ -47,7 +47,7 @@ "@tanstack/react-query-devtools": "^5.87.1", "@types/matter-js": "^0.20.2", "@vercel/analytics": "^2.0.1", - "ai": "^6.0.158", + "ai": "^6.0.214", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -115,14 +115,14 @@ "license": "MIT" }, "node_modules/@ai-sdk/gateway": { - "version": "3.0.95", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.95.tgz", - "integrity": "sha512-ZmUNNbZl3V42xwQzPaNUi+s8eqR2lnrxf0bvB6YbLXpLjHYv0k2Y78t12cNOfY0bxGeuVVTLyk856uLuQIuXEQ==", + "version": "3.0.139", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.139.tgz", + "integrity": "sha512-RFpxyh5j9g7ZMfKxhiwCcF7bGU872o3JvoiIqZbHOM4qkR4RCzeKJF+k+zHomcJYGeUabEbeMXTKNASzz4Toxw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.23", - "@vercel/oidc": "3.1.0" + "@ai-sdk/provider": "3.0.12", + "@ai-sdk/provider-utils": "4.0.33", + "@vercel/oidc": "3.2.0" }, "engines": { "node": ">=18" @@ -132,13 +132,13 @@ } }, "node_modules/@ai-sdk/openai": { - "version": "3.0.52", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.52.tgz", - "integrity": "sha512-4Rr8NCGmfWTz6DCUvixn9UmyZcMatiHn0zWoMzI3JCUe9R1P/vsPOpCBALKoSzVYOjyJnhtnVIbfUKujcS39uw==", + "version": "3.0.77", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.77.tgz", + "integrity": "sha512-DK0sGy/9j6KhgSrdhSKplTo3qf5frzGjLNYo9DVloH37L6DT42AxR/26UVCCoTEjR+WdsA9svm+5cT3Aye9NTg==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.23" + "@ai-sdk/provider": "3.0.12", + "@ai-sdk/provider-utils": "4.0.33" }, "engines": { "node": ">=18" @@ -148,9 +148,9 @@ } }, "node_modules/@ai-sdk/provider": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz", - "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.12.tgz", + "integrity": "sha512-sj9DWTJ2Ze0WR9qsiOPqoqzNx3OxL6iMxHImbhvoe9qOspekbzxNDMiJ4TIGfYHYh9w4OmBjz3prvqhzTi96+Q==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -160,14 +160,14 @@ } }, "node_modules/@ai-sdk/provider-utils": { - "version": "4.0.23", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.23.tgz", - "integrity": "sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==", + "version": "4.0.33", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.33.tgz", + "integrity": "sha512-nJ0bAfegMAIJtrzMJtbzer1cS3nb7c7DsyU1S4nrPm7ZU0Mn6SBBZv5IGZZGTbpWTJwqKTSPeZJTXalbAxt1BA==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.8", + "@ai-sdk/provider": "3.0.12", "@standard-schema/spec": "^1.1.0", - "eventsource-parser": "^3.0.6" + "eventsource-parser": "^3.0.8" }, "engines": { "node": ">=18" @@ -5939,9 +5939,9 @@ } }, "node_modules/@vercel/oidc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.1.0.tgz", - "integrity": "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.2.0.tgz", + "integrity": "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==", "license": "Apache-2.0", "engines": { "node": ">= 20" @@ -6118,15 +6118,15 @@ } }, "node_modules/ai": { - "version": "6.0.158", - "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.158.tgz", - "integrity": "sha512-gLTp1UXFtMqKUi3XHs33K7UFglbvojkxF/aq337TxnLGOhHIW9+GyP2jwW4hYX87f1es+wId3VQoPRRu9zEStQ==", + "version": "6.0.214", + "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.214.tgz", + "integrity": "sha512-9MlePEXT5pXtQv4fXqmiR0RG3DZU4Dbv+kU9ktEJC2COi2RH2WvI2GiyG9MuCqgPII6f1w+5kB5fNIiArqPzaQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "3.0.95", - "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.23", - "@opentelemetry/api": "1.9.0" + "@ai-sdk/gateway": "3.0.139", + "@ai-sdk/provider": "3.0.12", + "@ai-sdk/provider-utils": "4.0.33", + "@opentelemetry/api": "^1.9.0" }, "engines": { "node": ">=18" @@ -7518,9 +7518,9 @@ } }, "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.1.tgz", + "integrity": "sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==", "license": "MIT", "engines": { "node": ">=18.0.0" diff --git a/package.json b/package.json index f01f38f..4a510a0 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test:e2e:ui": "playwright test --ui" }, "dependencies": { - "@ai-sdk/openai": "^3.0.52", + "@ai-sdk/openai": "^3.0.77", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", @@ -56,7 +56,7 @@ "@tanstack/react-query-devtools": "^5.87.1", "@types/matter-js": "^0.20.2", "@vercel/analytics": "^2.0.1", - "ai": "^6.0.158", + "ai": "^6.0.214", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1",