From 2cb27fb41401ebf85c3c7a3971e21a19492cf28a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 May 2026 02:24:07 +0000 Subject: [PATCH 1/8] Delete orphan fetch-markdown-doc helper The kody_official_guide capability inlines its own fetch helper in kody-official-guide.ts; nothing else references fetchMarkdownPreferredDoc or MARKDOWN_PREFERRED_ACCEPT, so the module is dead. Co-authored-by: Kent C. Dodds --- .../capabilities/coding/fetch-markdown-doc.ts | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 packages/worker/src/mcp/capabilities/coding/fetch-markdown-doc.ts diff --git a/packages/worker/src/mcp/capabilities/coding/fetch-markdown-doc.ts b/packages/worker/src/mcp/capabilities/coding/fetch-markdown-doc.ts deleted file mode 100644 index f08343e295..0000000000 --- a/packages/worker/src/mcp/capabilities/coding/fetch-markdown-doc.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Prefer markdown (or plain text) over HTML so agent context stays small where - * the origin supports content negotiation (e.g. GitHub Docs → text/markdown). - * Cursor’s docs often respond as text/plain with markdown-shaped bodies. - */ -export const MARKDOWN_PREFERRED_ACCEPT = - 'text/markdown, text/plain;q=0.9, text/html;q=0.8' - -const MAX_DOC_CHARS = 2_000_000 - -export async function fetchMarkdownPreferredDoc(url: string): Promise<{ - status: number - contentType: string | null - body: string - markdownTokenEstimate: string | null -}> { - const response = await fetch(url, { - headers: { Accept: MARKDOWN_PREFERRED_ACCEPT }, - redirect: 'follow', - }) - const body = await response.text() - if (body.length > MAX_DOC_CHARS) { - throw new Error( - `documentation response exceeds ${MAX_DOC_CHARS} characters`, - ) - } - return { - status: response.status, - contentType: response.headers.get('content-type'), - body, - markdownTokenEstimate: response.headers.get('x-markdown-tokens'), - } -} From a84c42432f340f6facf7b23286779dfb154fdd53 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 May 2026 02:24:13 +0000 Subject: [PATCH 2/8] Delete orphan ui-artifacts-embed helper buildUiArtifactEmbedText has no callers outside its own test, so the embed helper and its test are dead. The previous app-search vectorization flow that consumed it has been gone since the legacy inline-source cleanup. Co-authored-by: Kent C. Dodds --- .../src/mcp/ui-artifacts-embed.node.test.ts | 45 ------------------ packages/worker/src/mcp/ui-artifacts-embed.ts | 46 ------------------- 2 files changed, 91 deletions(-) delete mode 100644 packages/worker/src/mcp/ui-artifacts-embed.node.test.ts delete mode 100644 packages/worker/src/mcp/ui-artifacts-embed.ts diff --git a/packages/worker/src/mcp/ui-artifacts-embed.node.test.ts b/packages/worker/src/mcp/ui-artifacts-embed.node.test.ts deleted file mode 100644 index aec9981e20..0000000000 --- a/packages/worker/src/mcp/ui-artifacts-embed.node.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { expect, test } from 'vitest' -import { buildUiArtifactEmbedText } from './ui-artifacts-embed.ts' - -test('buildUiArtifactEmbedText summarizes searchable app metadata and truncates long embeds', () => { - const input = { - title: 'Spotify OAuth Setup', - description: 'Connect Spotify to Kody.', - hasServerCode: true, - parameters: [ - { - name: 'clientId', - description: 'Spotify client id', - type: 'string', - required: true, - }, - { - name: 'region', - description: 'Spotify API region', - type: 'string', - required: false, - default: 'us', - }, - ], - } - - const fullText = buildUiArtifactEmbedText(input) - const lines = fullText.split('\n') - expect(lines.slice(0, 5)).toEqual([ - 'Spotify OAuth Setup', - 'Connect Spotify to Kody.', - 'mcp app', - 'ui artifact', - 'facet backend', - ]) - expect(lines).toContain('package app parameters') - expect( - lines.some((line) => line.startsWith('clientId string required')), - ).toBe(true) - expect(lines.some((line) => line.includes('region string optional'))).toBe( - true, - ) - expect(lines.some((line) => line.includes('default "us"'))).toBe(true) - - expect(buildUiArtifactEmbedText(input, 24)).toBe(fullText.slice(0, 24)) -}) diff --git a/packages/worker/src/mcp/ui-artifacts-embed.ts b/packages/worker/src/mcp/ui-artifacts-embed.ts deleted file mode 100644 index c44e2a7ead..0000000000 --- a/packages/worker/src/mcp/ui-artifacts-embed.ts +++ /dev/null @@ -1,46 +0,0 @@ -const defaultAppEmbedMaxChars = 8_000 - -export function buildUiArtifactEmbedText( - input: { - title: string - description: string - hasServerCode: boolean - parameters?: Array<{ - name: string - description: string - type: string - required: boolean - default?: unknown - }> | null - }, - maxChars: number = defaultAppEmbedMaxChars, -) { - const parameterText = - input.parameters && input.parameters.length > 0 - ? [ - 'package app parameters', - ...input.parameters.map((parameter) => - [ - parameter.name, - parameter.type, - parameter.required ? 'required' : 'optional', - parameter.description, - parameter.default !== undefined - ? `default ${JSON.stringify(parameter.default)}` - : null, - ] - .filter(Boolean) - .join(' '), - ), - ].join('\n') - : null - const text = [ - input.title, - input.description, - 'mcp app', - 'ui artifact', - input.hasServerCode ? 'facet backend' : 'client only', - ...(parameterText ? [parameterText] : []), - ].join('\n') - return text.slice(0, maxChars) -} From b10cba2e78e9f0c7c93850483be2667d3583a78b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 May 2026 02:24:21 +0000 Subject: [PATCH 3/8] Drop dead ui-artifact-parameters helpers and buildAppSourceFiles normalizeUiArtifactParameters / parseUiArtifactParameters / applyUiArtifactParameters and uiArtifactParameterSchema were only referenced by their own test. The only production consumer of the shared UiArtifactParameter types was buildAppSourceFiles, which has no remaining callers either, so the worker module, the shared parameter types, the dead source template, and the orphan test all go away together. Co-authored-by: Kent C. Dodds --- packages/shared/src/ui-artifact-parameters.ts | 24 --- .../mcp/ui-artifact-parameters.node.test.ts | 56 ------ .../worker/src/mcp/ui-artifact-parameters.ts | 161 ------------------ packages/worker/src/repo/source-templates.ts | 34 ---- 4 files changed, 275 deletions(-) delete mode 100644 packages/shared/src/ui-artifact-parameters.ts delete mode 100644 packages/worker/src/mcp/ui-artifact-parameters.node.test.ts delete mode 100644 packages/worker/src/mcp/ui-artifact-parameters.ts diff --git a/packages/shared/src/ui-artifact-parameters.ts b/packages/shared/src/ui-artifact-parameters.ts deleted file mode 100644 index 3bf999e5e0..0000000000 --- a/packages/shared/src/ui-artifact-parameters.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const uiArtifactParameterTypes = [ - 'string', - 'number', - 'boolean', - 'json', -] as const - -export type UiArtifactParameterType = (typeof uiArtifactParameterTypes)[number] - -export type UiArtifactParameterInput = { - name: string - description: string - type: UiArtifactParameterType - required?: boolean | undefined - default?: unknown -} - -export type UiArtifactParameterDefinition = { - name: string - description: string - type: UiArtifactParameterType - required: boolean - default?: unknown -} diff --git a/packages/worker/src/mcp/ui-artifact-parameters.node.test.ts b/packages/worker/src/mcp/ui-artifact-parameters.node.test.ts deleted file mode 100644 index 3eebdee7cb..0000000000 --- a/packages/worker/src/mcp/ui-artifact-parameters.node.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { expect, test } from 'vitest' -import { - applyUiArtifactParameters, - normalizeUiArtifactParameters, -} from './ui-artifact-parameters.ts' - -test('ui artifact parameters normalize names, apply defaults, and reject invalid caller input', () => { - const defs = normalizeUiArtifactParameters([ - { - name: ' owner ', - description: 'Repo owner.', - type: 'string', - required: true, - }, - { - name: 'limit', - description: 'Result limit.', - type: 'number', - default: 5, - }, - ]) - - expect(defs).toEqual([ - { - name: 'owner', - description: 'Repo owner.', - type: 'string', - required: true, - }, - { - name: 'limit', - description: 'Result limit.', - type: 'number', - required: false, - default: 5, - }, - ]) - - expect(() => - applyUiArtifactParameters({ definitions: defs, values: { limit: 2 } }), - ).toThrow('Missing required package app parameter: owner.') - - expect( - applyUiArtifactParameters({ definitions: defs, values: { owner: 'kody' } }), - ).toEqual({ - owner: 'kody', - limit: 5, - }) - - expect(() => - applyUiArtifactParameters({ - definitions: defs, - values: { owner: 'kody', extra: true }, - }), - ).toThrow('Unknown package app parameter(s): extra.') -}) diff --git a/packages/worker/src/mcp/ui-artifact-parameters.ts b/packages/worker/src/mcp/ui-artifact-parameters.ts deleted file mode 100644 index 2f2211945a..0000000000 --- a/packages/worker/src/mcp/ui-artifact-parameters.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { - type UiArtifactParameterDefinition, - type UiArtifactParameterInput, - type UiArtifactParameterType, - uiArtifactParameterTypes, -} from '@kody-internal/shared/ui-artifact-parameters.ts' -import { z } from 'zod' -const reservedParameterNames = new Set([ - '__proto__', - 'constructor', - 'prototype', - '__defineGetter__', - '__defineSetter__', - '__lookupGetter__', - '__lookupSetter__', -]) - -export const uiArtifactParameterSchema = z.object({ - name: z - .string() - .min(1) - .describe( - 'Parameter name available on the imported `kodyWidget.params` runtime object.', - ), - description: z - .string() - .min(1) - .describe('What this parameter controls for the package app.'), - type: z - .enum(uiArtifactParameterTypes) - .describe('Expected parameter type for runtime validation.'), - required: z - .boolean() - .optional() - .describe('Whether the caller must provide a value for this parameter.'), - default: z - .unknown() - .optional() - .describe('Default value used when the caller omits this parameter.'), -}) - -const uiArtifactParametersSchema = z.array(uiArtifactParameterSchema) - -export function normalizeUiArtifactParameters( - input: Array | undefined, -): Array | null { - if (!input || input.length === 0) return null - const seen = new Set() - const out: Array = [] - for (const param of input) { - const name = param.name.trim() - if (!name) { - throw new Error('Package app parameter name cannot be empty.') - } - if (reservedParameterNames.has(name)) { - throw new Error(`Package app parameter name "${name}" is not allowed.`) - } - if (seen.has(name)) { - throw new Error(`Duplicate package app parameter name: ${name}.`) - } - seen.add(name) - if (param.default !== undefined) { - assertParameterValueType(param.default, param.type, `default for ${name}`) - assertJsonSerializable(param.default, `default for ${name}`) - } - out.push({ - name, - description: param.description, - type: param.type, - required: param.required ?? false, - ...(param.default !== undefined ? { default: param.default } : {}), - }) - } - return out -} - -export function parseUiArtifactParameters( - raw: string | null, -): Array | null { - if (raw == null) return null - try { - const parsed = JSON.parse(raw) as unknown - const result = uiArtifactParametersSchema.safeParse(parsed) - if (!result.success) return null - return normalizeUiArtifactParameters(result.data) - } catch { - return null - } -} - -export function applyUiArtifactParameters(input: { - definitions: Array | null - values: Record | undefined -}): Record { - if (!input.definitions || input.definitions.length === 0) { - const fallback = input.values ?? {} - assertJsonSerializable(fallback, 'package app params') - return fallback - } - const values = input.values ?? {} - const definedNames = new Set(input.definitions.map((def) => def.name)) - const unknown = Object.keys(values).filter((key) => !definedNames.has(key)) - if (unknown.length > 0) { - throw new Error(`Unknown package app parameter(s): ${unknown.join(', ')}.`) - } - const resolved: Record = Object.create(null) - for (const def of input.definitions) { - if (Object.prototype.hasOwnProperty.call(values, def.name)) { - const value = values[def.name] - assertParameterValueType(value, def.type, def.name) - resolved[def.name] = value - continue - } - if (def.default !== undefined) { - resolved[def.name] = def.default - continue - } - if (def.required) { - throw new Error(`Missing required package app parameter: ${def.name}.`) - } - } - assertJsonSerializable(resolved, 'package app params') - return resolved -} - -function assertJsonSerializable(value: unknown, label: string) { - try { - const json = JSON.stringify(value) - if (json == null) { - throw new Error(`${label} must be JSON-serializable.`) - } - } catch { - throw new Error(`${label} must be JSON-serializable.`) - } -} - -function assertParameterValueType( - value: unknown, - type: UiArtifactParameterType, - label: string, -) { - if (value === undefined) { - throw new Error(`Package app parameter "${label}" must not be undefined.`) - } - if (type === 'json') return - if (type === 'string') { - if (typeof value !== 'string') { - throw new Error(`Package app parameter "${label}" must be a string.`) - } - return - } - if (type === 'number') { - if (typeof value !== 'number' || !Number.isFinite(value)) { - throw new Error(`Package app parameter "${label}" must be a number.`) - } - return - } - if (type === 'boolean' && typeof value !== 'boolean') { - throw new Error(`Package app parameter "${label}" must be a boolean.`) - } -} diff --git a/packages/worker/src/repo/source-templates.ts b/packages/worker/src/repo/source-templates.ts index 78249bc9a1..2386dd62a5 100644 --- a/packages/worker/src/repo/source-templates.ts +++ b/packages/worker/src/repo/source-templates.ts @@ -1,4 +1,3 @@ -import { type UiArtifactParameterInput } from '@kody-internal/shared/ui-artifact-parameters.ts' import { type JobView } from '#worker/jobs/types.ts' function stringifyManifest(value: unknown) { @@ -27,36 +26,3 @@ export function buildJobSourceFiles(input: { } return files } - -export function buildAppSourceFiles(input: { - title: string - description: string - parameters?: Array | null - hidden: boolean - clientCode: string | null - serverCode: string | null -}) { - const manifest = { - version: 1 as const, - kind: 'app' as const, - title: input.title, - description: input.description, - sourceRoot: '/', - server: 'src/server.ts', - assets: ['client.html'], - parameters: input.parameters ?? undefined, - hidden: input.hidden, - } - return { - 'kody.json': stringifyManifest(manifest), - 'client.html': `${(input.clientCode ?? '
').trim()}\n`, - 'src/server.ts': `${( - input.serverCode ?? - `export default { - async fetch() { - return new Response('Package app backend not configured.', { status: 404 }) - }, -}` - ).trim()}\n`, - } -} From 00a0077264ccb4f2bc226938b337c2fb7145b94c Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 May 2026 02:24:27 +0000 Subject: [PATCH 4/8] Trim unused remote-connector helpers Drop isJsonRpcEnvelope, jsonResponse, createJsonRpcResultResponse, createJsonRpcErrorResponse, and the identity parseJsonRpcMessage wrapper from remote-connector/utils.ts. None had callers outside the file itself, and parseJsonRpcMessage was just returning its argument, so session.ts can use the JSONRPCMessage value directly. Co-authored-by: Kent C. Dodds --- .../worker/src/remote-connector/session.ts | 14 ++--- packages/worker/src/remote-connector/utils.ts | 58 +------------------ 2 files changed, 7 insertions(+), 65 deletions(-) diff --git a/packages/worker/src/remote-connector/session.ts b/packages/worker/src/remote-connector/session.ts index c9a75c2edf..d53672d0b4 100644 --- a/packages/worker/src/remote-connector/session.ts +++ b/packages/worker/src/remote-connector/session.ts @@ -12,7 +12,6 @@ import { import { createJsonRpcRequest, parseRemoteConnectorMessage, - parseJsonRpcMessage, stringifyRemoteConnectorMessage, } from './utils.ts' import { connectorSessionKey } from './connector-session-key.ts' @@ -438,18 +437,17 @@ class RemoteConnectorSessionBase extends DurableObject { } private async handleJsonRpcMessage(message: JSONRPCMessage) { - const parsed = parseJsonRpcMessage(message) - if ('result' in parsed || 'error' in parsed) { - const pending = this.pendingRequests.get(String(parsed.id)) + if ('result' in message || 'error' in message) { + const pending = this.pendingRequests.get(String(message.id)) if (!pending) return clearTimeout(pending.timeout) - this.pendingRequests.delete(String(parsed.id)) - pending.resolve(parsed) + this.pendingRequests.delete(String(message.id)) + pending.resolve(message) return } if ( - 'method' in parsed && - parsed.method === 'notifications/tools/list_changed' + 'method' in message && + message.method === 'notifications/tools/list_changed' ) { try { await this.refreshToolsSnapshot() diff --git a/packages/worker/src/remote-connector/utils.ts b/packages/worker/src/remote-connector/utils.ts index 9ed65452f1..153781c0f3 100644 --- a/packages/worker/src/remote-connector/utils.ts +++ b/packages/worker/src/remote-connector/utils.ts @@ -1,38 +1,12 @@ import { type RemoteConnectorClientMessage, - type RemoteConnectorJsonRpcEnvelope, type RemoteConnectorServerMessage, } from './types.ts' import { - isConnectorJsonRpcEnvelope, parseConnectorMessage, stringifyConnectorMessage, } from '@kody-bot/connector-kit/protocol' -import { - type JSONRPCErrorResponse, - type JSONRPCMessage, - type JSONRPCRequest, - type JSONRPCResultResponse, -} from '@modelcontextprotocol/sdk/types.js' - -export function jsonResponse(data: unknown, init?: ResponseInit) { - return new Response(JSON.stringify(data), { - ...init, - headers: { - 'Content-Type': 'application/json', - 'Cache-Control': 'no-store', - ...init?.headers, - }, - }) -} - -export function isJsonRpcEnvelope( - value: RemoteConnectorServerMessage, -): value is RemoteConnectorJsonRpcEnvelope { - return isConnectorJsonRpcEnvelope( - value as Parameters[0], - ) -} +import { type JSONRPCRequest } from '@modelcontextprotocol/sdk/types.js' export function parseRemoteConnectorMessage( raw: string | ArrayBuffer, @@ -60,33 +34,3 @@ export function createJsonRpcRequest( params, } } - -export function createJsonRpcResultResponse( - id: string | number, - result: Record, -): JSONRPCResultResponse { - return { - jsonrpc: '2.0', - id, - result, - } -} - -export function createJsonRpcErrorResponse( - id: string | number | undefined, - code: number, - message: string, -): JSONRPCErrorResponse { - return { - jsonrpc: '2.0', - id, - error: { - code, - message, - }, - } -} - -export function parseJsonRpcMessage(message: JSONRPCMessage) { - return message -} From 18d407ecd7a1c94eb7b633144b9c2e84f611abf7 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 May 2026 02:24:35 +0000 Subject: [PATCH 5/8] nx: drop dangling build-codemode-sandbox-modules dependsOn The codemode sandbox modules artifact was deleted in 3bd7e38 ("Remove stale codemode sandbox modules file"), but the build target kept the now-nonexistent dependency in dependsOn. Nx silently ignores missing targets, so this has been a no-op string ever since. Co-authored-by: Kent C. Dodds --- packages/worker/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/worker/project.json b/packages/worker/project.json index 754903c9ba..e185fc4e33 100644 --- a/packages/worker/project.json +++ b/packages/worker/project.json @@ -52,7 +52,7 @@ }, "build": { "executor": "nx:run-commands", - "dependsOn": ["build-codemode-sandbox-modules", "build-client"], + "dependsOn": ["build-client"], "options": { "command": "node --env-file=packages/worker/.env ./wrangler-env.ts build" } From f2760cd3ec168658b396e1b7028f595f05742af1 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 May 2026 02:24:41 +0000 Subject: [PATCH 6/8] Drop dangling docs/post-download.ts references There is no docs/post-download.ts in the repository, but tsconfig-tools.json listed it under include and typescript-setup.md called it out as a Tools environment file. Both references are stale leftovers. Co-authored-by: Kent C. Dodds --- docs/contributing/typescript-setup.md | 1 - tsconfig-tools.json | 1 - 2 files changed, 2 deletions(-) diff --git a/docs/contributing/typescript-setup.md b/docs/contributing/typescript-setup.md index 016a4a2882..694b5e0e86 100644 --- a/docs/contributing/typescript-setup.md +++ b/docs/contributing/typescript-setup.md @@ -22,7 +22,6 @@ We have **three** distinct TypeScript environments, each with its own - `playwright.config.ts` - `wrangler-env.ts` - `cli.ts` - - `docs/post-download.ts` - `packages/worker/src/mcp/**/*.mcp-e2e.test.ts` - **Environment**: Node 24 (scripts, configs, tests) diff --git a/tsconfig-tools.json b/tsconfig-tools.json index df0229381d..92dfa5048f 100644 --- a/tsconfig-tools.json +++ b/tsconfig-tools.json @@ -30,7 +30,6 @@ "./playwright.config.ts", "./wrangler-env.ts", "./cli.ts", - "./docs/post-download.ts", "./packages/worker/src/mcp/execute-modules/**/*.ts", "./packages/worker/src/mcp/apps/claude-widget-domain.ts", "./packages/worker/src/mcp/mcp-server.mcp-e2e.test.ts", From ab70a33b153e16fec8895e04c43f39554ab601aa Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 May 2026 02:24:47 +0000 Subject: [PATCH 7/8] Drop unused style tokens mq.desktop, colors.primarySoftSubtle, colors.primarySoftHover, and shadows.lg had no callers across the client. Their backing CSS custom properties (--shadow-lg / --shadow-lg-dark) were also unreferenced and go away with them. Co-authored-by: Kent C. Dodds --- packages/worker/client/styles/tokens.ts | 4 ---- packages/worker/public/styles.css | 7 ------- 2 files changed, 11 deletions(-) diff --git a/packages/worker/client/styles/tokens.ts b/packages/worker/client/styles/tokens.ts index 02f9ca752d..a4e662cd30 100644 --- a/packages/worker/client/styles/tokens.ts +++ b/packages/worker/client/styles/tokens.ts @@ -5,11 +5,9 @@ export const colors = { primaryActive: 'var(--color-primary-active)', primaryText: 'var(--color-primary-text)', primarySoftest: 'color-mix(in srgb, var(--color-primary) 6%, transparent)', - primarySoftSubtle: 'color-mix(in srgb, var(--color-primary) 8%, transparent)', primarySoft: 'color-mix(in srgb, var(--color-primary) 12%, transparent)', primarySoftStrong: 'color-mix(in srgb, var(--color-primary) 15%, transparent)', - primarySoftHover: 'color-mix(in srgb, var(--color-primary) 18%, transparent)', onPrimary: 'var(--color-on-primary)', background: 'var(--color-background)', surface: 'var(--color-surface)', @@ -65,7 +63,6 @@ export const radius = { export const shadows = { sm: 'var(--shadow-sm)', md: 'var(--shadow-md)', - lg: 'var(--shadow-lg)', } as const // Transition tokens @@ -84,5 +81,4 @@ export const breakpoints = { export const mq = { mobile: `@media (max-width: ${breakpoints.mobile})`, tablet: `@media (max-width: ${breakpoints.tablet})`, - desktop: `@media (min-width: ${breakpoints.tablet})`, } as const diff --git a/packages/worker/public/styles.css b/packages/worker/public/styles.css index 00ed592291..a716cfb1b4 100644 --- a/packages/worker/public/styles.css +++ b/packages/worker/public/styles.css @@ -62,15 +62,10 @@ /* Shadows */ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --shadow-lg: - 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --shadow-sm-dark: 0 1px 2px 0 rgb(255 255 255 / 0.05); --shadow-md-dark: 0 4px 6px -1px rgb(255 255 255 / 0.08), 0 2px 4px -2px rgb(255 255 255 / 0.08); - --shadow-lg-dark: - 0 10px 15px -3px rgb(255 255 255 / 0.1), - 0 4px 6px -4px rgb(255 255 255 / 0.1); /* Transitions */ --transition-fast: 0.15s ease; @@ -121,7 +116,6 @@ /* Dark mode shadows - lighter for visibility */ --shadow-sm: var(--shadow-sm-dark); --shadow-md: var(--shadow-md-dark); - --shadow-lg: var(--shadow-lg-dark); } @media (prefers-color-scheme: dark) { @@ -144,7 +138,6 @@ /* Dark mode shadows - lighter for visibility */ --shadow-sm: var(--shadow-sm-dark); --shadow-md: var(--shadow-md-dark); - --shadow-lg: var(--shadow-lg-dark); } } From f7c7ef785def7dedec563413caff575ec267ef5a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 9 May 2026 02:35:46 +0000 Subject: [PATCH 8/8] format: drop stray trailing blank line in kody-ui-utils-contract oxfmt has been flagging this on every PR (the validate format:check step fails on main because of it). Re-run oxfmt to make the gate green. Co-authored-by: Kent C. Dodds --- packages/worker/client/mcp-apps/kody-ui-utils-contract.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/worker/client/mcp-apps/kody-ui-utils-contract.ts b/packages/worker/client/mcp-apps/kody-ui-utils-contract.ts index 80628f154e..6e136cc3d1 100644 --- a/packages/worker/client/mcp-apps/kody-ui-utils-contract.ts +++ b/packages/worker/client/mcp-apps/kody-ui-utils-contract.ts @@ -61,4 +61,3 @@ export function buildGeneratedUiRuntimeImportMap(runtimeScriptHref: string) { ) return `` } -