@spotpatch/vite 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/index.cjs +138 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +141 -32
- package/dist/index.js.map +1 -1
- package/dist/runtime-client.js +112 -34
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts","../src/environment-ai.ts","../src/options.ts","../src/registry/source-registry.ts","../src/registry/source-id.ts","../src/runtime/runtime-injection-plugin.ts","../package.json","../src/server/server-plugin.ts","../src/agent/job-manager.ts","../src/server/middleware.ts","../src/server/agent-http.ts","../src/server/agent-request.ts","../src/server/source-context.ts","../src/server/extract-code-context.ts","../src/server/source-file.ts","../src/server/constants.ts","../src/server/request-body.ts","../src/server/editor.ts","../src/server/request-security.ts","../src/session/session.ts","../src/transform/transform-plugin.ts","../src/transform/inject-source-markers.ts","../src/transform/intrinsic-element.ts","../src/transform/source-position.ts","../src/transform/transform-filter.ts","../src/index.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport { loadEnv, type ConfigEnv, type Plugin, type UserConfig } from \"vite\";\n\nimport { resolveEnvironmentAiConfiguration } from \"./environment-ai.js\";\nimport { resolveOptions, type SpotPatchOptions } from \"./options.js\";\nimport type { SpotPatchPluginContext } from \"./plugin-context.js\";\nimport { createSourceRegistry } from \"./registry/source-registry.js\";\nimport { createRuntimeInjectionPlugin } from \"./runtime/runtime-injection-plugin.js\";\nimport { createServerPlugin } from \"./server/server-plugin.js\";\nimport { createSession } from \"./session/session.js\";\nimport { createTransformPlugin } from \"./transform/transform-plugin.js\";\n\nexport function spotPatch(userOptions: SpotPatchOptions = {}): Plugin[] {\n let options = resolveOptions(userOptions);\n let credentialEnvironment: Readonly<Record<string, string | undefined>> =\n Object.freeze({});\n\n if (!options.enabled) {\n return [];\n }\n\n const registry = createSourceRegistry();\n const session = createSession();\n const context = Object.freeze({\n getCredentialEnvironment: () => credentialEnvironment,\n getOptions: () => options,\n } satisfies SpotPatchPluginContext);\n const configure = (config: UserConfig, environment: ConfigEnv): void => {\n const root = path.resolve(process.cwd(), config.root ?? \".\");\n const loadedEnvironment =\n config.envDir === false\n ? process.env\n : loadEnv(environment.mode, path.resolve(root, config.envDir ?? \".\"), \"\");\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(loadedEnvironment).ai\n : false;\n\n options = resolveOptions(userOptions, environmentAi);\n\n if (options.ai === false) {\n credentialEnvironment = Object.freeze({});\n return;\n }\n\n const names = new Set(\n Object.values(options.ai.providers).map((provider) => provider.apiKeyEnv),\n );\n const missing = [...names].filter((name) => {\n const value = loadedEnvironment[name];\n return value === undefined || value.trim().length === 0;\n });\n\n if (missing.length > 0) {\n throw new RangeError(\n `SpotPatch AI credential environment is missing ${missing.join(\", \")}.`,\n );\n }\n\n credentialEnvironment = Object.freeze(\n Object.fromEntries([...names].map((name) => [name, loadedEnvironment[name]])),\n );\n };\n\n return [\n createTransformPlugin({ configure, context, registry }),\n createRuntimeInjectionPlugin({ context, session }),\n createServerPlugin({ context, registry, session }),\n ];\n}\n","import type { SimpleAiOptions } from \"./options.js\";\n\nconst AI_ENVIRONMENT_NAMES = Object.freeze({\n authentication: \"SPOTPATCH_AI_AUTHENTICATION\",\n baseURL: \"SPOTPATCH_AI_BASE_URL\",\n credential: \"SPOTPATCH_AI_API_KEY\",\n model: \"SPOTPATCH_AI_MODEL\",\n protocol: \"SPOTPATCH_AI_PROTOCOL\",\n} as const);\n\nexport interface EnvironmentAiConfiguration {\n readonly ai: false | SimpleAiOptions;\n}\n\nfunction normalizedValue(\n environment: Readonly<Record<string, string | undefined>>,\n name: string,\n): string | undefined {\n const value = environment[name];\n\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n return value.trim();\n}\n\nexport function resolveEnvironmentAiConfiguration(\n environment: Readonly<Record<string, string | undefined>>,\n): EnvironmentAiConfiguration {\n const baseURL = normalizedValue(environment, AI_ENVIRONMENT_NAMES.baseURL);\n const model = normalizedValue(environment, AI_ENVIRONMENT_NAMES.model);\n const credential = normalizedValue(environment, AI_ENVIRONMENT_NAMES.credential);\n const protocol = normalizedValue(environment, AI_ENVIRONMENT_NAMES.protocol);\n const authentication = normalizedValue(\n environment,\n AI_ENVIRONMENT_NAMES.authentication,\n );\n const configuredValues = [baseURL, model, credential, protocol, authentication];\n\n if (configuredValues.every((value) => value === undefined)) {\n return Object.freeze({ ai: false });\n }\n\n const missing = [\n [AI_ENVIRONMENT_NAMES.baseURL, baseURL],\n [AI_ENVIRONMENT_NAMES.model, model],\n [AI_ENVIRONMENT_NAMES.credential, credential],\n ]\n .filter((entry): entry is [string, undefined] => entry[1] === undefined)\n .map(([name]) => name);\n\n if (missing.length > 0) {\n throw new RangeError(\n `SpotPatch AI environment configuration is incomplete; missing ${missing.join(\", \")}.`,\n );\n }\n\n if (baseURL === undefined || model === undefined || credential === undefined) {\n throw new RangeError(\"SpotPatch AI environment configuration is incomplete.\");\n }\n\n if (\n protocol !== undefined &&\n protocol !== \"responses\" &&\n protocol !== \"chat-completions\"\n ) {\n throw new RangeError(\n \"SpotPatch SPOTPATCH_AI_PROTOCOL must be responses or chat-completions.\",\n );\n }\n\n if (\n authentication !== undefined &&\n authentication !== \"bearer\" &&\n authentication !== \"x-api-key\"\n ) {\n throw new RangeError(\n \"SpotPatch SPOTPATCH_AI_AUTHENTICATION must be bearer or x-api-key.\",\n );\n }\n\n return Object.freeze({\n ai: Object.freeze({\n baseURL,\n model,\n ...(protocol === undefined ? {} : { protocol }),\n ...(authentication === undefined ? {} : { authentication }),\n }),\n });\n}\n","import {\n DEFAULT_AGENT_LIMITS,\n MAX_ANNOTATION_TARGETS,\n SPOTPATCH_EDITOR_PREFERENCES,\n SPOTPATCH_LOCALE_PREFERENCES,\n type AgentLimits,\n type AiExecutionOptions,\n type AiOptions,\n type AiProviderAuthentication,\n type AiProviderProtocol,\n type ContextBudget,\n type ResolvedAgentCheckDefinition,\n type ResolvedAiModelProfile,\n type ResolvedAiOptions,\n type ResolvedOpenAICompatibleProviderOptions,\n type RuntimeAiConfig,\n type SpotPatchEditorPreference,\n type SpotPatchLocalePreference,\n} from \"@spotpatch/shared\";\nimport { z } from \"zod\";\n\nexport type {\n AgentApplyMode,\n AgentCheckDefinition,\n AgentLimits,\n AiExecutionOptions,\n AiModelProfile,\n AiOptions,\n AiProviderAuthentication,\n AiProviderProtocol,\n OpenAICompatibleProviderOptions,\n} from \"@spotpatch/shared\";\n\nexport type FilterEntry = string | RegExp;\n\nexport interface SimpleAiOptions {\n readonly baseURL: string;\n readonly model: string;\n readonly apiKeyEnv?: string;\n readonly protocol?: AiProviderProtocol;\n readonly authentication?: AiProviderAuthentication;\n readonly providerLabel?: string;\n readonly modelLabel?: string;\n readonly execution?: AiExecutionOptions;\n}\n\nexport type SpotPatchAiOptions = false | SimpleAiOptions | AiOptions;\n\nexport interface SpotPatchOptions {\n readonly enabled?: boolean;\n readonly include?: readonly FilterEntry[];\n readonly exclude?: readonly FilterEntry[];\n readonly editor?: SpotPatchEditorPreference;\n readonly redact?: boolean;\n readonly budget?: Partial<ContextBudget>;\n readonly shortcut?: string;\n readonly allowLan?: boolean;\n readonly debug?: boolean;\n readonly locale?: SpotPatchLocalePreference;\n readonly maxTargets?: number;\n readonly ai?: SpotPatchAiOptions;\n}\n\nexport interface ResolvedSpotPatchOptions {\n readonly enabled: boolean;\n readonly include: readonly FilterEntry[];\n readonly exclude: readonly FilterEntry[];\n readonly editor: SpotPatchEditorPreference;\n readonly redact: boolean;\n readonly budget: Readonly<ContextBudget>;\n readonly shortcut: string;\n readonly allowLan: boolean;\n readonly debug: boolean;\n readonly locale: SpotPatchLocalePreference;\n readonly maxTargets: number;\n readonly ai: false | ResolvedAiOptions;\n}\n\nexport const DEFAULT_EXCLUDE = Object.freeze([\n /node_modules/,\n /\\.test\\.[jt]sx$/,\n /\\.spec\\.[jt]sx$/,\n /\\.stories\\.[jt]sx$/,\n /(?:^|\\/)dist(?:\\/|$)/,\n /(?:^|\\/)coverage(?:\\/|$)/,\n]);\n\nconst DEFAULT_INCLUDE = Object.freeze([/(?:^|[/\\\\])src[/\\\\].+\\.(?:jsx|tsx)$/]);\n\nconst DEFAULT_BUDGET = Object.freeze({\n totalCharacters: 16_000,\n domCharacters: 3_000,\n cssCharacters: 4_000,\n codeCharacters: 7_000,\n maxCodeLines: 80,\n maxComponentDepth: 8,\n} satisfies ContextBudget);\n\nexport const DEFAULT_OPTIONS = Object.freeze({\n enabled: true,\n include: DEFAULT_INCLUDE,\n exclude: DEFAULT_EXCLUDE,\n editor: \"auto\",\n redact: true,\n budget: DEFAULT_BUDGET,\n shortcut: \"Mod+Shift+S\",\n allowLan: false,\n debug: false,\n locale: \"auto\",\n maxTargets: 8,\n ai: false,\n} satisfies ResolvedSpotPatchOptions);\n\nconst PROFILE_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;\nconst ENV_NAME_PATTERN = /^[A-Z][A-Z0-9_]{1,127}$/;\n\nconst agentLimitsSchema = z\n .strictObject({\n maxTurns: z.number().optional(),\n maxToolCalls: z.number().optional(),\n maxChangedFiles: z.number().optional(),\n maxDiffBytes: z.number().optional(),\n maxReadBytesPerFile: z.number().optional(),\n maxToolOutputCharacters: z.number().optional(),\n maxProviderResponseBytes: z.number().optional(),\n providerConnectTimeoutMs: z.number().optional(),\n providerFirstByteTimeoutMs: z.number().optional(),\n providerIdleTimeoutMs: z.number().optional(),\n checkTimeoutMs: z.number().optional(),\n jobTimeoutMs: z.number().optional(),\n })\n .optional();\n\nconst agentCheckSchema = z.strictObject({\n label: z.string(),\n command: z.string(),\n args: z.array(z.string()).optional(),\n required: z.boolean().optional(),\n timeoutMs: z.number().optional(),\n});\n\ntype ParsedAgentCheck = z.infer<typeof agentCheckSchema>;\ntype ParsedAgentLimits = Readonly<\n Partial<Record<keyof AgentLimits, number | undefined>>\n>;\n\nconst aiOptionsSchema = z.strictObject({\n providers: z.record(\n z.string(),\n z.strictObject({\n type: z.literal(\"openai-compatible\"),\n label: z.string(),\n protocol: z.enum([\"responses\", \"chat-completions\"]),\n authentication: z.enum([\"bearer\", \"x-api-key\"]).optional(),\n baseURL: z.string(),\n apiKeyEnv: z.string(),\n models: z.record(\n z.string(),\n z.strictObject({ label: z.string(), model: z.string() }),\n ),\n defaultModel: z.string(),\n }),\n ),\n defaultProvider: z.string(),\n execution: z\n .strictObject({\n isolation: z.literal(\"git-worktree\").optional(),\n applyMode: z.enum([\"review\", \"auto\"]).optional(),\n checks: z.record(z.string(), agentCheckSchema).optional(),\n limits: agentLimitsSchema,\n })\n .optional(),\n});\n\nconst simpleAiOptionsSchema = z.strictObject({\n baseURL: z.string(),\n model: z.string(),\n apiKeyEnv: z.string().optional(),\n protocol: z.enum([\"responses\", \"chat-completions\"]).optional(),\n authentication: z.enum([\"bearer\", \"x-api-key\"]).optional(),\n providerLabel: z.string().optional(),\n modelLabel: z.string().optional(),\n execution: aiOptionsSchema.shape.execution,\n});\n\ntype ParsedAiOptions = z.infer<typeof aiOptionsSchema>;\n\nfunction assertIdentifier(value: string, label: string): void {\n if (!PROFILE_ID_PATTERN.test(value)) {\n throw new RangeError(\n `SpotPatch ${label} must contain only letters, numbers, dot, underscore, or hyphen.`,\n );\n }\n}\n\nfunction nonEmpty(value: string, label: string, maximum = 256): string {\n const normalized = value.trim();\n\n if (normalized.length === 0 || normalized.length > maximum || value.includes(\"\\0\")) {\n throw new RangeError(`SpotPatch ${label} is invalid.`);\n }\n\n return normalized;\n}\n\nfunction normalizeProviderBaseURL(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new RangeError(\"SpotPatch AI provider baseURL must be a valid URL.\");\n }\n\n const loopbackHosts = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n const allowedProtocol =\n url.protocol === \"https:\" ||\n (url.protocol === \"http:\" && loopbackHosts.has(url.hostname));\n\n if (\n !allowedProtocol ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.search.length > 0 ||\n url.hash.length > 0\n ) {\n throw new RangeError(\"SpotPatch AI provider baseURL violates URL policy.\");\n }\n\n url.pathname = url.pathname.replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\");\n return url.toString().replace(/\\/$/, \"\");\n}\n\nfunction resolveLimits(limits: ParsedAgentLimits | undefined): Readonly<AgentLimits> {\n const resolved = Object.freeze({\n maxTurns: limits?.maxTurns ?? DEFAULT_AGENT_LIMITS.maxTurns,\n maxToolCalls: limits?.maxToolCalls ?? DEFAULT_AGENT_LIMITS.maxToolCalls,\n maxChangedFiles: limits?.maxChangedFiles ?? DEFAULT_AGENT_LIMITS.maxChangedFiles,\n maxDiffBytes: limits?.maxDiffBytes ?? DEFAULT_AGENT_LIMITS.maxDiffBytes,\n maxReadBytesPerFile:\n limits?.maxReadBytesPerFile ?? DEFAULT_AGENT_LIMITS.maxReadBytesPerFile,\n maxToolOutputCharacters:\n limits?.maxToolOutputCharacters ?? DEFAULT_AGENT_LIMITS.maxToolOutputCharacters,\n maxProviderResponseBytes:\n limits?.maxProviderResponseBytes ?? DEFAULT_AGENT_LIMITS.maxProviderResponseBytes,\n providerConnectTimeoutMs:\n limits?.providerConnectTimeoutMs ?? DEFAULT_AGENT_LIMITS.providerConnectTimeoutMs,\n providerFirstByteTimeoutMs:\n limits?.providerFirstByteTimeoutMs ??\n DEFAULT_AGENT_LIMITS.providerFirstByteTimeoutMs,\n providerIdleTimeoutMs:\n limits?.providerIdleTimeoutMs ?? DEFAULT_AGENT_LIMITS.providerIdleTimeoutMs,\n checkTimeoutMs: limits?.checkTimeoutMs ?? DEFAULT_AGENT_LIMITS.checkTimeoutMs,\n jobTimeoutMs: limits?.jobTimeoutMs ?? DEFAULT_AGENT_LIMITS.jobTimeoutMs,\n } satisfies AgentLimits);\n\n for (const [name, value] of Object.entries(resolved)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`SpotPatch AI limit ${name} must be a positive integer.`);\n }\n }\n\n return resolved;\n}\n\nfunction resolveModels(\n models: ParsedAiOptions[\"providers\"][string][\"models\"],\n): Readonly<Record<string, ResolvedAiModelProfile>> {\n const entries = Object.entries(models);\n\n if (entries.length === 0) {\n throw new RangeError(\"SpotPatch AI provider must declare at least one model.\");\n }\n\n return Object.freeze(\n Object.fromEntries(\n entries.map(([id, model]) => {\n assertIdentifier(id, \"model profile id\");\n return [\n id,\n Object.freeze({\n id,\n label: nonEmpty(model.label, \"model label\", 100),\n model: nonEmpty(model.model, \"provider model name\"),\n } satisfies ResolvedAiModelProfile),\n ];\n }),\n ),\n );\n}\n\nfunction resolveProviders(\n providers: ParsedAiOptions[\"providers\"],\n): Readonly<Record<string, ResolvedOpenAICompatibleProviderOptions>> {\n const entries = Object.entries(providers);\n\n if (entries.length === 0) {\n throw new RangeError(\"SpotPatch AI must declare at least one provider.\");\n }\n\n return Object.freeze(\n Object.fromEntries(\n entries.map(([id, provider]) => {\n assertIdentifier(id, \"provider profile id\");\n\n if (\n !ENV_NAME_PATTERN.test(provider.apiKeyEnv) ||\n provider.apiKeyEnv.startsWith(\"VITE_\")\n ) {\n throw new RangeError(\n \"SpotPatch AI apiKeyEnv must be an uppercase non-VITE environment name.\",\n );\n }\n\n const models = resolveModels(provider.models);\n\n if (!(provider.defaultModel in models)) {\n throw new RangeError(\n \"SpotPatch AI provider defaultModel must reference a configured model.\",\n );\n }\n\n return [\n id,\n Object.freeze({\n id,\n type: provider.type,\n label: nonEmpty(provider.label, \"provider label\", 100),\n protocol: provider.protocol,\n authentication: provider.authentication ?? \"bearer\",\n baseURL: normalizeProviderBaseURL(provider.baseURL),\n apiKeyEnv: provider.apiKeyEnv,\n models,\n defaultModel: provider.defaultModel,\n } satisfies ResolvedOpenAICompatibleProviderOptions),\n ];\n }),\n ),\n );\n}\n\nfunction resolveChecks(\n checks: Readonly<Record<string, ParsedAgentCheck>> | undefined,\n defaultTimeoutMs: number,\n): Readonly<Record<string, ResolvedAgentCheckDefinition>> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(checks ?? {}).map(([id, check]) => {\n assertIdentifier(id, \"check id\");\n const timeoutMs = check.timeoutMs ?? defaultTimeoutMs;\n\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new RangeError(\"SpotPatch AI check timeout must be positive.\");\n }\n\n const args = Object.freeze(\n [...(check.args ?? [])].map((argument) =>\n nonEmpty(argument, \"check argument\", 4_096),\n ),\n );\n\n return [\n id,\n Object.freeze({\n id,\n label: nonEmpty(check.label, \"check label\", 100),\n command: nonEmpty(check.command, \"check command\", 1_024),\n args,\n required: check.required ?? true,\n timeoutMs,\n } satisfies ResolvedAgentCheckDefinition),\n ];\n }),\n ),\n );\n}\n\nfunction resolveAiOptions(\n options: SpotPatchAiOptions | undefined,\n): false | ResolvedAiOptions {\n if (options === undefined || options === false) {\n return false;\n }\n\n const expanded =\n \"providers\" in options\n ? options\n : (() => {\n const simple = simpleAiOptionsSchema.safeParse(options);\n\n if (!simple.success) {\n throw new RangeError(\"SpotPatch AI configuration is invalid.\");\n }\n\n const providerId = \"default\";\n const modelId = \"default\";\n\n return {\n providers: {\n [providerId]: {\n type: \"openai-compatible\",\n label: simple.data.providerLabel ?? \"AI provider\",\n protocol: simple.data.protocol ?? \"chat-completions\",\n authentication: simple.data.authentication ?? \"bearer\",\n baseURL: simple.data.baseURL,\n apiKeyEnv: simple.data.apiKeyEnv ?? \"SPOTPATCH_AI_API_KEY\",\n models: {\n [modelId]: {\n label: simple.data.modelLabel ?? \"AI model\",\n model: simple.data.model,\n },\n },\n defaultModel: modelId,\n },\n },\n defaultProvider: providerId,\n ...(simple.data.execution === undefined\n ? {}\n : { execution: simple.data.execution }),\n };\n })();\n const parsed = aiOptionsSchema.safeParse(expanded);\n\n if (!parsed.success) {\n throw new RangeError(\"SpotPatch AI configuration is invalid.\");\n }\n\n const validated = parsed.data;\n const limits = resolveLimits(validated.execution?.limits);\n const checks = resolveChecks(validated.execution?.checks, limits.checkTimeoutMs);\n const applyMode = validated.execution?.applyMode ?? \"review\";\n\n if (applyMode === \"auto\" && !Object.values(checks).some((check) => check.required)) {\n throw new RangeError(\"SpotPatch AI auto mode requires a required check.\");\n }\n\n const providers = resolveProviders(validated.providers);\n\n if (!(validated.defaultProvider in providers)) {\n throw new RangeError(\n \"SpotPatch AI defaultProvider must reference a configured provider.\",\n );\n }\n\n return Object.freeze({\n providers,\n defaultProvider: validated.defaultProvider,\n execution: Object.freeze({\n isolation: \"git-worktree\",\n applyMode,\n checks,\n limits,\n }),\n });\n}\n\nexport function createRuntimeAiConfig(\n options: false | ResolvedAiOptions,\n): RuntimeAiConfig {\n if (options === false) {\n return Object.freeze({ enabled: false });\n }\n\n return Object.freeze({\n enabled: true,\n defaultProvider: options.defaultProvider,\n applyMode: options.execution.applyMode,\n providers: Object.freeze(\n Object.values(options.providers).map((provider) =>\n Object.freeze({\n id: provider.id,\n label: provider.label,\n protocol: provider.protocol,\n defaultModel: provider.defaultModel,\n models: Object.freeze(\n Object.values(provider.models).map((model) =>\n Object.freeze({ id: model.id, label: model.label }),\n ),\n ),\n }),\n ),\n ),\n });\n}\n\nfunction assertPositiveBudget(budget: Readonly<ContextBudget>): void {\n for (const [name, value] of Object.entries(budget)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`SpotPatch budget ${name} must be a positive integer.`);\n }\n }\n}\n\nexport function resolveOptions(\n options: SpotPatchOptions = {},\n environmentAi?: false | SimpleAiOptions,\n): ResolvedSpotPatchOptions {\n const budget = Object.freeze({\n ...DEFAULT_OPTIONS.budget,\n ...options.budget,\n });\n\n assertPositiveBudget(budget);\n\n const maxTargets = options.maxTargets ?? DEFAULT_OPTIONS.maxTargets;\n const locale = options.locale ?? DEFAULT_OPTIONS.locale;\n const editor = options.editor ?? DEFAULT_OPTIONS.editor;\n\n if (!(SPOTPATCH_LOCALE_PREFERENCES as readonly string[]).includes(locale)) {\n throw new RangeError(\"SpotPatch locale must be auto, en-US, or zh-CN.\");\n }\n\n if (!(SPOTPATCH_EDITOR_PREFERENCES as readonly string[]).includes(editor)) {\n throw new RangeError(\"SpotPatch editor must be auto, vscode, or cursor.\");\n }\n\n if (\n !Number.isSafeInteger(maxTargets) ||\n maxTargets < 1 ||\n maxTargets > MAX_ANNOTATION_TARGETS\n ) {\n throw new RangeError(\n `SpotPatch maxTargets must be an integer between 1 and ${String(MAX_ANNOTATION_TARGETS)}.`,\n );\n }\n\n const resolved = {\n enabled: options.enabled ?? DEFAULT_OPTIONS.enabled,\n include: Object.freeze([...(options.include ?? DEFAULT_OPTIONS.include)]),\n exclude: Object.freeze([...(options.exclude ?? DEFAULT_OPTIONS.exclude)]),\n editor,\n redact: options.redact ?? DEFAULT_OPTIONS.redact,\n budget,\n shortcut: options.shortcut ?? DEFAULT_OPTIONS.shortcut,\n allowLan: options.allowLan ?? DEFAULT_OPTIONS.allowLan,\n debug: options.debug ?? DEFAULT_OPTIONS.debug,\n locale,\n maxTargets,\n ai: resolveAiOptions(options.ai ?? environmentAi),\n } satisfies ResolvedSpotPatchOptions;\n\n if (resolved.shortcut.trim().length === 0) {\n throw new RangeError(\"SpotPatch shortcut cannot be empty.\");\n }\n\n return Object.freeze(resolved);\n}\n","import path from \"node:path\";\n\nimport { createRandomSourceId, type SourceIdFactory } from \"./source-id.js\";\n\nexport interface SourceRegistry {\n register(absolutePath: string): string;\n resolve(fileId: string): string | undefined;\n clear(): void;\n}\n\ninterface SourceRegistryOptions {\n readonly createId?: SourceIdFactory;\n}\n\nfunction normalizeAbsolutePath(absolutePath: string): string {\n return path.normalize(path.resolve(absolutePath));\n}\n\nexport function createSourceRegistry(\n options: SourceRegistryOptions = {},\n): SourceRegistry {\n const createId = options.createId ?? createRandomSourceId;\n const pathToId = new Map<string, string>();\n const idToPath = new Map<string, string>();\n\n return Object.freeze({\n register(absolutePath: string): string {\n const normalizedPath = normalizeAbsolutePath(absolutePath);\n const existingId = pathToId.get(normalizedPath);\n\n if (existingId !== undefined) {\n return existingId;\n }\n\n let fileId = createId();\n\n while (idToPath.has(fileId)) {\n fileId = createId();\n }\n\n pathToId.set(normalizedPath, fileId);\n idToPath.set(fileId, normalizedPath);\n return fileId;\n },\n\n resolve(fileId: string): string | undefined {\n return idToPath.get(fileId);\n },\n\n clear(): void {\n pathToId.clear();\n idToPath.clear();\n },\n });\n}\n","import { randomBytes } from \"node:crypto\";\n\nconst SOURCE_ID_BYTES = 8;\n\nexport type SourceIdFactory = () => string;\n\nexport const createRandomSourceId: SourceIdFactory = () =>\n randomBytes(SOURCE_ID_BYTES).toString(\"base64url\");\n","import { createRequire } from \"node:module\";\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport packageMetadata from \"../../package.json\" with { type: \"json\" };\nimport { version as VITE_VERSION, type Plugin } from \"vite\";\n\nimport { createRuntimeAiConfig } from \"../options.js\";\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport type { SpotPatchSession } from \"../session/session.js\";\n\nexport const SPOTPATCH_CLIENT_MODULE_ID = \"virtual:spotpatch/client\";\nexport const RESOLVED_SPOTPATCH_CLIENT_MODULE_ID = `\\0${SPOTPATCH_CLIENT_MODULE_ID}`;\nexport const SPOTPATCH_REACT_ADAPTER_MODULE_ID = \"virtual:spotpatch/react-adapter\";\nexport const RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID = `\\0${SPOTPATCH_REACT_ADAPTER_MODULE_ID}`;\n\ninterface RuntimeInjectionPluginInput {\n readonly clientBundle?: string;\n readonly context: SpotPatchPluginContext;\n readonly reactAdapterBundle?: string;\n readonly session: SpotPatchSession;\n}\n\nfunction readRuntimeBundle(root: string, fileName: string): string {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const packageEntry = resolveFromProject.resolve(\"@spotpatch/vite\");\n const bundlePath = path.join(path.dirname(packageEntry), fileName);\n return readFileSync(bundlePath, \"utf8\");\n}\n\nfunction readConsumerViteVersion(root: string): string {\n try {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const manifestPath = resolveFromProject.resolve(\"vite/package.json\");\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest === \"object\" &&\n manifest !== null &&\n \"version\" in manifest &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n // Vite itself remains the safe fallback if package metadata is not exported.\n }\n\n return VITE_VERSION;\n}\n\nfunction createClientModule(\n input: RuntimeInjectionPluginInput,\n clientBundle: string,\n viteVersion: string,\n): string {\n const options = input.context.getOptions();\n const runtimeConfig = {\n ai: createRuntimeAiConfig(options.ai),\n budget: options.budget,\n debug: options.debug,\n editor: options.editor,\n locale: options.locale,\n maxTargets: options.maxTargets,\n redact: options.redact,\n sessionToken: input.session.token,\n shortcut: options.shortcut,\n spotPatchVersion: packageMetadata.version,\n viteVersion,\n };\n\n return [\n `const __SPOTPATCH_RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};`,\n clientBundle,\n ].join(\"\\n\");\n}\n\nexport function createRuntimeInjectionPlugin(\n input: RuntimeInjectionPluginInput,\n): Plugin {\n let root = process.cwd();\n let clientBundle = input.clientBundle;\n let viteVersion = VITE_VERSION;\n\n return {\n name: \"spotpatch:runtime-injection\",\n apply: \"serve\",\n enforce: \"pre\",\n\n configResolved(config) {\n root = path.resolve(config.root);\n viteVersion = readConsumerViteVersion(root);\n },\n\n resolveId(id, importer) {\n if (id === SPOTPATCH_CLIENT_MODULE_ID) {\n return RESOLVED_SPOTPATCH_CLIENT_MODULE_ID;\n }\n\n if (\n id === \"@spotpatch/react-adapter\" &&\n importer === RESOLVED_SPOTPATCH_CLIENT_MODULE_ID\n ) {\n return RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID;\n }\n\n return null;\n },\n\n load(id) {\n if (id === RESOLVED_SPOTPATCH_CLIENT_MODULE_ID) {\n clientBundle ??= readRuntimeBundle(root, \"runtime-client.js\");\n return createClientModule(input, clientBundle, viteVersion);\n }\n\n if (id === RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID) {\n return (\n input.reactAdapterBundle ??\n readRuntimeBundle(root, \"runtime-react-adapter.js\")\n );\n }\n\n return null;\n },\n\n transformIndexHtml() {\n return [\n {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_CLIENT_MODULE_ID}`,\n },\n injectTo: \"head\",\n },\n ];\n },\n };\n}\n","{\n \"name\": \"@spotpatch/vite\",\n \"version\": \"1.2.1\",\n \"description\": \"Vite development plugin for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/vite\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"vite\",\n \"react\",\n \"developer-tools\",\n \"ai-agent\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && tsup --config tsup.runtime-client.config.ts && tsup --config tsup.runtime-react-adapter.config.ts\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\"\n },\n \"dependencies\": {\n \"@rollup/pluginutils\": \"5.4.0\",\n \"@spotpatch/agent\": \"workspace:^\",\n \"@spotpatch/react-adapter\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"launch-editor\": \"2.14.1\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\",\n \"zod\": \"4.4.3\"\n },\n \"peerDependencies\": {\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","import path from \"node:path\";\n\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nimport { createAgentJobManager, type AgentJobManager } from \"../agent/job-manager.js\";\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport type { SpotPatchSession } from \"../session/session.js\";\nimport { createSpotPatchMiddleware } from \"./middleware.js\";\n\ninterface ServerPluginInput {\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n readonly session: SpotPatchSession;\n}\n\nexport function createServerPlugin(input: ServerPluginInput): Plugin {\n let agentManager: AgentJobManager | undefined;\n let config: ResolvedConfig | undefined;\n\n const closeResources = async (): Promise<void> => {\n input.registry.clear();\n await agentManager?.close();\n agentManager = undefined;\n };\n\n return {\n name: \"spotpatch:server\",\n apply: \"serve\",\n enforce: \"pre\",\n\n configResolved(resolvedConfig) {\n config = resolvedConfig;\n },\n\n configureServer(server) {\n if (config === undefined) {\n throw new Error(\"SpotPatch server initialized before Vite config resolution.\");\n }\n\n const root = path.resolve(config.root);\n const options = input.context.getOptions();\n agentManager =\n options.ai === false\n ? undefined\n : createAgentJobManager({\n ai: options.ai,\n environment: input.context.getCredentialEnvironment(),\n root,\n });\n\n server.middlewares.use(\n createSpotPatchMiddleware({\n ...(agentManager === undefined ? {} : { agentManager }),\n options,\n registry: input.registry,\n root,\n session: input.session,\n logger: config.logger,\n }),\n );\n\n server.httpServer?.once(\"close\", () => {\n void closeResources();\n });\n\n config.logger.info(\n `[spotpatch:vite] Ready. Toggle picker with ${options.shortcut}.`,\n );\n },\n\n async closeBundle() {\n await closeResources();\n },\n };\n}\n","import { createHash, randomBytes } from \"node:crypto\";\n\nimport {\n applyPreparedAgentChange,\n executeAgentChange,\n probeProviderCapability,\n resolveProviderCredential,\n revertPreparedAgentChange,\n type ExecuteAgentChangeOptions,\n type PreparedAgentChange,\n type ProviderCredential,\n} from \"@spotpatch/agent\";\nimport {\n ERROR_CODES,\n SpotPatchError,\n type AgentCapabilityRequest,\n type AgentCapabilitySnapshot,\n type AgentJobCreateRequest,\n type AgentJobEvent,\n type AgentJobResult,\n type AgentJobResultResponse,\n type AgentJobSnapshot,\n type AgentJobStatus,\n type ErrorCode,\n type ResolvedAiModelProfile,\n type ResolvedAiOptions,\n type ResolvedOpenAICompatibleProviderOptions,\n type SpotAnnotation,\n} from \"@spotpatch/shared\";\n\nconst MAX_RETAINED_JOBS = 32;\nconst MAX_RETAINED_EVENTS = 512;\nconst JOB_ID_PATTERN = /^[A-Za-z0-9_-]{22,128}$/;\n\nconst ACTIVE_JOB_STATUSES = new Set<AgentJobStatus>([\n \"queued\",\n \"preparing\",\n \"running\",\n \"validating\",\n \"awaiting-review\",\n \"applying\",\n \"cancelling\",\n \"reverting\",\n]);\n\nconst CANCELLABLE_JOB_STATUSES = new Set<AgentJobStatus>([\n \"queued\",\n \"preparing\",\n \"running\",\n \"validating\",\n \"awaiting-review\",\n]);\n\nconst PRUNABLE_JOB_STATUSES = new Set<AgentJobStatus>([\n \"completed\",\n \"cancelled\",\n \"reverted\",\n \"failed\",\n]);\n\nexport type AgentJobEventListener = (event: AgentJobEvent) => void;\n\ninterface AgentSelection {\n readonly credential: ProviderCredential;\n readonly model: ResolvedAiModelProfile;\n readonly provider: ResolvedOpenAICompatibleProviderOptions;\n}\n\ninterface InternalAgentJob {\n readonly annotation: SpotAnnotation;\n readonly controller: AbortController;\n readonly createdAt: string;\n readonly credential: ProviderCredential;\n readonly events: AgentJobEvent[];\n readonly id: string;\n readonly listeners: Set<AgentJobEventListener>;\n readonly model: ResolvedAiModelProfile;\n readonly provider: ResolvedOpenAICompatibleProviderOptions;\n errorCode: ErrorCode | undefined;\n phaseMessage: string;\n preparedChange: PreparedAgentChange | undefined;\n result: AgentJobResult | undefined;\n runPromise: Promise<void> | undefined;\n sequence: number;\n status: AgentJobStatus;\n updatedAt: string;\n}\n\nexport interface AgentJobManager {\n apply(jobId: string): Promise<AgentJobSnapshot>;\n cancel(jobId: string): AgentJobSnapshot;\n close(): Promise<void>;\n create(request: AgentJobCreateRequest): AgentJobSnapshot;\n events(jobId: string): readonly AgentJobEvent[];\n probe(\n request: AgentCapabilityRequest,\n signal: AbortSignal,\n ): Promise<AgentCapabilitySnapshot>;\n result(jobId: string): AgentJobResultResponse;\n revert(jobId: string): Promise<AgentJobSnapshot>;\n subscribe(jobId: string, listener: AgentJobEventListener): () => void;\n}\n\ninterface AgentJobManagerDependencies {\n readonly applyChange: typeof applyPreparedAgentChange;\n readonly createJobId: () => string;\n readonly executeChange: typeof executeAgentChange;\n readonly now: () => string;\n readonly probeCapability: typeof probeProviderCapability;\n readonly resolveCredential: typeof resolveProviderCredential;\n readonly revertChange: typeof revertPreparedAgentChange;\n}\n\nexport interface CreateAgentJobManagerOptions {\n readonly ai: ResolvedAiOptions;\n readonly dependencies?: Partial<AgentJobManagerDependencies>;\n readonly environment?: Readonly<Record<string, string | undefined>>;\n readonly fetch?: typeof globalThis.fetch;\n readonly root: string;\n}\n\nconst DEFAULT_DEPENDENCIES: AgentJobManagerDependencies = Object.freeze({\n applyChange: applyPreparedAgentChange,\n createJobId: () => randomBytes(16).toString(\"base64url\"),\n executeChange: executeAgentChange,\n now: () => new Date().toISOString(),\n probeCapability: probeProviderCapability,\n resolveCredential: resolveProviderCredential,\n revertChange: revertPreparedAgentChange,\n});\n\nfunction normalizeError(error: unknown): SpotPatchError {\n return error instanceof SpotPatchError\n ? error\n : new SpotPatchError(ERROR_CODES.INTERNAL_ERROR, undefined, { cause: error });\n}\n\nfunction isActive(status: AgentJobStatus): boolean {\n return ACTIVE_JOB_STATUSES.has(status);\n}\n\nfunction snapshot(job: InternalAgentJob): AgentJobSnapshot {\n const base = {\n jobId: job.id,\n status: job.status,\n providerProfileId: job.provider.id,\n providerLabel: job.provider.label,\n modelProfileId: job.model.id,\n modelLabel: job.model.label,\n phaseMessage: job.phaseMessage,\n createdAt: job.createdAt,\n updatedAt: job.updatedAt,\n canCancel: CANCELLABLE_JOB_STATUSES.has(job.status),\n canApply:\n job.status === \"awaiting-review\" &&\n job.preparedChange?.validationPassed === true &&\n job.result !== undefined &&\n job.result.diff.length > 0,\n canRevert: job.status === \"applied\",\n } as const;\n\n return Object.freeze(\n job.errorCode === undefined ? base : { ...base, errorCode: job.errorCode },\n );\n}\n\nfunction capabilityCacheKey(\n provider: ResolvedOpenAICompatibleProviderOptions,\n model: ResolvedAiModelProfile,\n): string {\n const configurationDigest = createHash(\"sha256\")\n .update(provider.baseURL)\n .update(\"\\0\")\n .update(provider.protocol)\n .update(\"\\0\")\n .update(provider.authentication)\n .digest(\"hex\");\n\n return `${provider.id}:${model.id}:${configurationDigest}`;\n}\n\nfunction freezeEvent<T extends AgentJobEvent>(event: T): T {\n return Object.freeze(event);\n}\n\nexport function createAgentJobManager(\n options: CreateAgentJobManagerOptions,\n): AgentJobManager {\n const dependencies = Object.freeze({\n ...DEFAULT_DEPENDENCIES,\n ...options.dependencies,\n });\n const jobs = new Map<string, InternalAgentJob>();\n const capabilityCache = new Map<string, AgentCapabilitySnapshot>();\n const providerConsents = new Set<string>();\n let closed = false;\n\n const resolveSelection = (\n providerProfileId: string,\n modelProfileId: string,\n ): AgentSelection => {\n const provider = options.ai.providers[providerProfileId];\n\n if (provider === undefined) {\n throw new SpotPatchError(ERROR_CODES.PROVIDER_NOT_CONFIGURED);\n }\n\n const model = provider.models[modelProfileId];\n\n if (model === undefined) {\n throw new SpotPatchError(ERROR_CODES.MODEL_NOT_ALLOWED);\n }\n\n const credential = dependencies.resolveCredential(\n provider.apiKeyEnv,\n options.environment,\n );\n\n return Object.freeze({ credential, model, provider });\n };\n\n const requireJob = (jobId: string): InternalAgentJob => {\n if (!JOB_ID_PATTERN.test(jobId)) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const job = jobs.get(jobId);\n\n if (job === undefined) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return job;\n };\n\n const appendEvent = (job: InternalAgentJob, event: AgentJobEvent): void => {\n job.events.push(event);\n\n if (job.events.length > MAX_RETAINED_EVENTS) {\n job.events.splice(0, job.events.length - MAX_RETAINED_EVENTS);\n }\n\n for (const listener of job.listeners) {\n listener(event);\n }\n };\n\n const eventBase = (job: InternalAgentJob) => {\n job.sequence += 1;\n return {\n schemaVersion: 1 as const,\n sequence: job.sequence,\n jobId: job.id,\n status: job.status,\n timestamp: dependencies.now(),\n };\n };\n\n const emitSnapshot = (job: InternalAgentJob): void => {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"snapshot\",\n data: Object.freeze({ snapshot: snapshot(job) }),\n }),\n );\n };\n\n const emitPhase = (job: InternalAgentJob, message: string): void => {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"phase\",\n data: Object.freeze({ message }),\n }),\n );\n };\n\n const emitError = (job: InternalAgentJob, code: ErrorCode): void => {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"error\",\n data: Object.freeze({ code, message: \"The Agent job failed.\" }),\n }),\n );\n };\n\n const transition = (\n job: InternalAgentJob,\n status: AgentJobStatus,\n phaseMessage: string,\n errorCode?: ErrorCode,\n ): void => {\n job.status = status;\n job.phaseMessage = phaseMessage;\n job.errorCode = errorCode;\n job.updatedAt = dependencies.now();\n emitSnapshot(job);\n emitPhase(job, phaseMessage);\n };\n\n const probeResolved = async (\n selection: AgentSelection,\n signal: AbortSignal,\n ): Promise<AgentCapabilitySnapshot> => {\n const key = capabilityCacheKey(selection.provider, selection.model);\n const cached = capabilityCache.get(key);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const capability = await dependencies.probeCapability({\n provider: selection.provider,\n modelProfileId: selection.model.id,\n limits: options.ai.execution.limits,\n credential: selection.credential,\n signal,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n\n if (capability.state !== \"agent-ready\") {\n throw new SpotPatchError(ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED);\n }\n\n capabilityCache.set(key, capability);\n return capability;\n };\n\n const finishWithError = (job: InternalAgentJob, error: unknown): void => {\n const normalized = normalizeError(error);\n const cancelled =\n job.controller.signal.aborted || normalized.code === ERROR_CODES.AGENT_CANCELLED;\n\n transition(\n job,\n cancelled ? \"cancelled\" : \"failed\",\n cancelled ? \"Agent job cancelled.\" : \"Agent job failed.\",\n cancelled ? ERROR_CODES.AGENT_CANCELLED : normalized.code,\n );\n\n if (!cancelled) {\n emitError(job, normalized.code);\n }\n };\n\n const applyChange = async (\n job: InternalAgentJob,\n preparedChange: PreparedAgentChange,\n ): Promise<void> => {\n transition(job, \"applying\", \"Applying validated changes to the project.\");\n\n try {\n await dependencies.applyChange(preparedChange);\n transition(job, \"applied\", \"Changes were applied to local project files.\");\n } catch (error: unknown) {\n const normalized = normalizeError(error);\n transition(job, \"failed\", \"Agent change could not be applied.\", normalized.code);\n emitError(job, normalized.code);\n throw normalized;\n }\n };\n\n const runJob = async (job: InternalAgentJob): Promise<void> => {\n try {\n transition(job, \"preparing\", \"Verifying provider and model capabilities.\");\n await probeResolved(\n Object.freeze({\n credential: job.credential,\n model: job.model,\n provider: job.provider,\n }),\n job.controller.signal,\n );\n\n const callbacks: NonNullable<ExecuteAgentChangeOptions[\"callbacks\"]> = {\n onCheck(result) {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"check\",\n data: Object.freeze({ result }),\n }),\n );\n },\n onPhase(event) {\n transition(job, event.phase, event.message);\n },\n onTool(event) {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"tool\",\n data: Object.freeze({ ...event }),\n }),\n );\n },\n };\n const preparedChange = await dependencies.executeChange({\n annotation: job.annotation,\n callbacks,\n credential: job.credential,\n execution: options.ai.execution,\n jobId: job.id,\n model: job.model,\n provider: job.provider,\n root: options.root,\n signal: job.controller.signal,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n job.preparedChange = preparedChange;\n job.result = preparedChange.result;\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"result-ready\",\n data: Object.freeze({ hasResult: true as const }),\n }),\n );\n\n if (!preparedChange.validationPassed) {\n transition(\n job,\n \"failed\",\n \"Required validation checks failed.\",\n ERROR_CODES.VALIDATION_FAILED,\n );\n emitError(job, ERROR_CODES.VALIDATION_FAILED);\n return;\n }\n\n if (preparedChange.result.diff.length === 0) {\n transition(job, \"completed\", \"No source changes were proposed.\");\n return;\n }\n\n if (\n options.ai.execution.applyMode === \"auto\" &&\n preparedChange.autoApplyEligible\n ) {\n try {\n await applyChange(job, preparedChange);\n } catch {\n // applyChange already records the stable public failure on the Job.\n }\n return;\n }\n\n transition(job, \"awaiting-review\", \"Validated changes are ready for review.\");\n } catch (error: unknown) {\n finishWithError(job, error);\n }\n };\n\n const hasActiveJob = (excludedJobId?: string): boolean =>\n [...jobs.values()].some((job) => job.id !== excludedJobId && isActive(job.status));\n\n const pruneJobs = (): void => {\n if (jobs.size < MAX_RETAINED_JOBS) {\n return;\n }\n\n for (const [jobId, job] of jobs) {\n if (PRUNABLE_JOB_STATUSES.has(job.status)) {\n jobs.delete(jobId);\n }\n\n if (jobs.size < MAX_RETAINED_JOBS) {\n return;\n }\n }\n };\n\n return Object.freeze({\n async apply(jobId) {\n const job = requireJob(jobId);\n\n if (\n job.status !== \"awaiting-review\" ||\n job.preparedChange === undefined ||\n !job.preparedChange.validationPassed ||\n job.result?.diff.length === 0\n ) {\n throw new SpotPatchError(ERROR_CODES.PATCH_REJECTED);\n }\n\n await applyChange(job, job.preparedChange);\n return snapshot(job);\n },\n\n cancel(jobId) {\n const job = requireJob(jobId);\n\n if (!CANCELLABLE_JOB_STATUSES.has(job.status)) {\n return snapshot(job);\n }\n\n if (job.status === \"awaiting-review\") {\n job.preparedChange = undefined;\n job.controller.abort(\"agent-review-cancelled\");\n transition(\n job,\n \"cancelled\",\n \"Agent review was closed without applying changes.\",\n ERROR_CODES.AGENT_CANCELLED,\n );\n return snapshot(job);\n }\n\n transition(job, \"cancelling\", \"Cancelling Agent job.\");\n job.controller.abort(\"agent-job-cancelled\");\n return snapshot(job);\n },\n\n async close() {\n if (closed) {\n return;\n }\n\n closed = true;\n\n for (const job of jobs.values()) {\n if (CANCELLABLE_JOB_STATUSES.has(job.status)) {\n job.controller.abort(\"vite-server-closed\");\n }\n }\n\n await Promise.allSettled(\n [...jobs.values()]\n .map((job) => job.runPromise)\n .filter((promise): promise is Promise<void> => promise !== undefined),\n );\n capabilityCache.clear();\n providerConsents.clear();\n jobs.clear();\n },\n\n create(request) {\n if (closed) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n if (hasActiveJob()) {\n throw new SpotPatchError(ERROR_CODES.AGENT_BUSY);\n }\n\n pruneJobs();\n\n if (jobs.size >= MAX_RETAINED_JOBS) {\n throw new SpotPatchError(ERROR_CODES.AGENT_BUSY);\n }\n\n const selection = resolveSelection(\n request.providerProfileId,\n request.modelProfileId,\n );\n providerConsents.add(selection.provider.id);\n const id = dependencies.createJobId();\n\n if (!JOB_ID_PATTERN.test(id) || jobs.has(id)) {\n throw new SpotPatchError(ERROR_CODES.INTERNAL_ERROR);\n }\n\n const timestamp = dependencies.now();\n const job: InternalAgentJob = {\n annotation: request.annotation,\n controller: new AbortController(),\n createdAt: timestamp,\n credential: selection.credential,\n errorCode: undefined,\n events: [],\n id,\n listeners: new Set(),\n model: selection.model,\n phaseMessage: \"Agent job queued.\",\n preparedChange: undefined,\n provider: selection.provider,\n result: undefined,\n runPromise: undefined,\n sequence: 0,\n status: \"queued\",\n updatedAt: timestamp,\n };\n jobs.set(id, job);\n emitSnapshot(job);\n emitPhase(job, job.phaseMessage);\n job.runPromise = Promise.resolve().then(async () => runJob(job));\n return snapshot(job);\n },\n\n events(jobId) {\n return Object.freeze([...requireJob(jobId).events]);\n },\n\n async probe(request, signal) {\n if (closed) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n return probeResolved(\n resolveSelection(request.providerProfileId, request.modelProfileId),\n signal,\n );\n },\n\n result(jobId) {\n const job = requireJob(jobId);\n const response =\n job.result === undefined\n ? { snapshot: snapshot(job) }\n : { snapshot: snapshot(job), result: job.result };\n return Object.freeze(response);\n },\n\n async revert(jobId) {\n const job = requireJob(jobId);\n\n if (\n job.status !== \"applied\" ||\n job.preparedChange === undefined ||\n hasActiveJob(job.id)\n ) {\n throw new SpotPatchError(\n hasActiveJob(job.id) ? ERROR_CODES.AGENT_BUSY : ERROR_CODES.APPLY_CONFLICT,\n );\n }\n\n transition(job, \"reverting\", \"Reverting the applied Agent change.\");\n\n try {\n await dependencies.revertChange(job.preparedChange);\n transition(job, \"reverted\", \"The Agent change was safely reverted.\");\n } catch (error: unknown) {\n const normalized = normalizeError(error);\n transition(\n job,\n \"applied\",\n \"Revert was rejected because project files changed.\",\n normalized.code,\n );\n emitError(job, normalized.code);\n throw normalized;\n }\n\n return snapshot(job);\n },\n\n subscribe(jobId, listener) {\n const job = requireJob(jobId);\n job.listeners.add(listener);\n return () => {\n job.listeners.delete(listener);\n };\n },\n } satisfies AgentJobManager);\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n ERROR_CODES,\n SPOTPATCH_API_BASE,\n SPOTPATCH_ENDPOINTS,\n SpotPatchError,\n openEditorRequestSchema,\n sourceContextRequestSchema,\n type ApiFailure,\n type ApiSuccess,\n type CodeContext,\n type EditorOpenResult,\n type ErrorCode,\n} from \"@spotpatch/shared\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport type { SpotPatchSession } from \"../session/session.js\";\nimport type { AgentJobManager } from \"../agent/job-manager.js\";\nimport { handleAgentRequest, matchAgentRequestPath } from \"./agent-http.js\";\nimport { type EditorLauncher, launchConfiguredEditor } from \"./editor.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { assertRequestAuthorized } from \"./request-security.js\";\nimport { readSourceContext } from \"./source-context.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\nexport type SpotPatchNext = (error?: unknown) => void;\nexport type SpotPatchMiddleware = (\n request: IncomingMessage,\n response: ServerResponse,\n next: SpotPatchNext,\n) => void;\n\nexport interface SpotPatchServerLogger {\n warn(message: string): void;\n}\n\nexport interface CreateMiddlewareOptions {\n readonly agentManager?: AgentJobManager;\n readonly editorLauncher?: EditorLauncher;\n readonly logger?: SpotPatchServerLogger;\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly root: string;\n readonly session: SpotPatchSession;\n}\n\nconst STATUS_BY_ERROR = Object.freeze({\n [ERROR_CODES.INVALID_REQUEST]: 400,\n [ERROR_CODES.INVALID_TOKEN]: 401,\n [ERROR_CODES.ORIGIN_NOT_ALLOWED]: 403,\n [ERROR_CODES.SOURCE_NOT_FOUND]: 404,\n [ERROR_CODES.SOURCE_OUTSIDE_ROOT]: 403,\n [ERROR_CODES.SOURCE_TOO_LARGE]: 413,\n [ERROR_CODES.EDITOR_OPEN_FAILED]: 500,\n [ERROR_CODES.AI_DISABLED]: 404,\n [ERROR_CODES.PROVIDER_NOT_CONFIGURED]: 503,\n [ERROR_CODES.PROVIDER_AUTH_FAILED]: 502,\n [ERROR_CODES.PROVIDER_PROTOCOL_UNSUPPORTED]: 502,\n [ERROR_CODES.MODEL_NOT_ALLOWED]: 400,\n [ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED]: 422,\n [ERROR_CODES.PROVIDER_RATE_LIMITED]: 429,\n [ERROR_CODES.AGENT_BUSY]: 409,\n [ERROR_CODES.AGENT_LIMIT_EXCEEDED]: 413,\n [ERROR_CODES.AGENT_CANCELLED]: 409,\n [ERROR_CODES.WORKTREE_DIRTY]: 409,\n [ERROR_CODES.TOOL_DENIED]: 403,\n [ERROR_CODES.PATCH_REJECTED]: 422,\n [ERROR_CODES.VALIDATION_FAILED]: 422,\n [ERROR_CODES.APPLY_CONFLICT]: 409,\n [ERROR_CODES.INTERNAL_ERROR]: 500,\n} satisfies Record<ErrorCode, number>);\n\nconst PUBLIC_MESSAGES = Object.freeze({\n [ERROR_CODES.INVALID_REQUEST]: \"The request is invalid.\",\n [ERROR_CODES.INVALID_TOKEN]: \"The session token is invalid.\",\n [ERROR_CODES.ORIGIN_NOT_ALLOWED]: \"The request origin is not allowed.\",\n [ERROR_CODES.SOURCE_NOT_FOUND]: \"The source file is unavailable.\",\n [ERROR_CODES.SOURCE_OUTSIDE_ROOT]: \"The source file is outside the project root.\",\n [ERROR_CODES.SOURCE_TOO_LARGE]: \"The source file exceeds the size limit.\",\n [ERROR_CODES.EDITOR_OPEN_FAILED]: \"The editor request could not be started.\",\n [ERROR_CODES.AI_DISABLED]: \"AI execution is not enabled.\",\n [ERROR_CODES.PROVIDER_NOT_CONFIGURED]: \"The AI provider is unavailable.\",\n [ERROR_CODES.PROVIDER_AUTH_FAILED]: \"The AI provider rejected authentication.\",\n [ERROR_CODES.PROVIDER_PROTOCOL_UNSUPPORTED]:\n \"The AI provider protocol is unsupported.\",\n [ERROR_CODES.MODEL_NOT_ALLOWED]: \"The selected model is not allowed.\",\n [ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED]:\n \"The selected model cannot run SpotPatch tools.\",\n [ERROR_CODES.PROVIDER_RATE_LIMITED]: \"The AI provider is rate limited.\",\n [ERROR_CODES.AGENT_BUSY]: \"Another Agent job is already running.\",\n [ERROR_CODES.AGENT_LIMIT_EXCEEDED]: \"The Agent job exceeded a safety limit.\",\n [ERROR_CODES.AGENT_CANCELLED]: \"The Agent job was cancelled.\",\n [ERROR_CODES.WORKTREE_DIRTY]: \"The project worktree must be clean.\",\n [ERROR_CODES.TOOL_DENIED]: \"The Agent tool request was denied.\",\n [ERROR_CODES.PATCH_REJECTED]: \"The proposed patch was rejected.\",\n [ERROR_CODES.VALIDATION_FAILED]: \"The proposed change failed validation.\",\n [ERROR_CODES.APPLY_CONFLICT]: \"The change conflicts with the current worktree.\",\n [ERROR_CODES.INTERNAL_ERROR]: \"The request could not be completed.\",\n} satisfies Record<ErrorCode, string>);\n\nfunction writeJson<T>(\n response: ServerResponse,\n status: number,\n payload: ApiSuccess<T> | ApiFailure,\n): void {\n response.statusCode = status;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.end(JSON.stringify(payload));\n}\n\nfunction asSpotPatchError(error: unknown): SpotPatchError {\n return error instanceof SpotPatchError\n ? error\n : new SpotPatchError(ERROR_CODES.INTERNAL_ERROR, undefined, { cause: error });\n}\n\nfunction writeError(\n response: ServerResponse,\n error: unknown,\n logger: SpotPatchServerLogger | undefined,\n): void {\n const normalized = asSpotPatchError(error);\n\n if (normalized.code === ERROR_CODES.INTERNAL_ERROR) {\n logger?.warn(\"[spotpatch:server] Internal request failure.\");\n }\n\n writeJson(response, STATUS_BY_ERROR[normalized.code], {\n ok: false,\n error: {\n code: normalized.code,\n message: PUBLIC_MESSAGES[normalized.code],\n },\n });\n}\n\nfunction requestPath(request: IncomingMessage): string {\n try {\n return new URL(request.url ?? \"/\", \"http://spotpatch.invalid\").pathname;\n } catch {\n return \"\";\n }\n}\n\nasync function handleSourceContext(\n request: IncomingMessage,\n options: CreateMiddlewareOptions,\n): Promise<CodeContext> {\n const parsed = sourceContextRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return readSourceContext({\n request: parsed.data,\n registry: options.registry,\n root: options.root,\n maxCharacters: options.options.budget.codeCharacters,\n maxLines: options.options.budget.maxCodeLines,\n });\n}\n\nasync function handleOpenEditor(\n request: IncomingMessage,\n options: CreateMiddlewareOptions,\n): Promise<EditorOpenResult> {\n const parsed = openEditorRequestSchema.safeParse(await readJsonRequestBody(request));\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const body = parsed.data;\n const sourcePath = await resolveSourceFile({\n fileId: body.fileId,\n registry: options.registry,\n root: options.root,\n });\n const target = `${sourcePath}:${String(body.line)}:${String(body.column)}`;\n const editorLauncher = options.editorLauncher ?? launchConfiguredEditor;\n\n try {\n await editorLauncher(target, options.options.editor);\n } catch (error: unknown) {\n options.logger?.warn(\n `[spotpatch:server] ${options.options.editor === \"auto\" ? \"The detected editor\" : options.options.editor} rejected an editor request.`,\n );\n throw new SpotPatchError(ERROR_CODES.EDITOR_OPEN_FAILED, undefined, {\n cause: error,\n });\n }\n\n return Object.freeze({ editor: options.options.editor });\n}\n\nexport function createSpotPatchMiddleware(\n options: CreateMiddlewareOptions,\n): SpotPatchMiddleware {\n return (request, response, next) => {\n const path = requestPath(request);\n const agentRoute = matchAgentRequestPath(path);\n\n if (\n path !== SPOTPATCH_ENDPOINTS.sourceContext &&\n path !== SPOTPATCH_ENDPOINTS.openEditor &&\n agentRoute === undefined &&\n !path.startsWith(`${SPOTPATCH_API_BASE}/`)\n ) {\n next();\n return;\n }\n\n const handle = async (): Promise<void> => {\n assertRequestAuthorized(request, {\n allowLan: options.options.allowLan,\n sessionToken: options.session.token,\n });\n\n if (path === SPOTPATCH_ENDPOINTS.sourceContext) {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const data = await handleSourceContext(request, options);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (path === SPOTPATCH_ENDPOINTS.openEditor) {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const data = await handleOpenEditor(request, options);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (agentRoute === undefined) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n await handleAgentRequest(\n request,\n response,\n options,\n agentRoute,\n (target, status, data) => {\n writeJson(target, status, { ok: true, data });\n },\n );\n };\n\n void handle().catch((error: unknown) => {\n writeError(response, error, options.logger);\n });\n };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n ERROR_CODES,\n SPOTPATCH_ENDPOINTS,\n SpotPatchError,\n agentCapabilityRequestSchema,\n agentJobActionRequestSchema,\n agentJobCreateRequestSchema,\n type AgentJobAction,\n type AgentJobEvent,\n type AgentJobStatus,\n} from \"@spotpatch/shared\";\n\nimport type { AgentJobManager } from \"../agent/job-manager.js\";\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { authorizeAgentJobRequest } from \"./agent-request.js\";\nimport { MAX_AGENT_REQUEST_BODY_BYTES } from \"./constants.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\n\ninterface AgentJobRoute {\n readonly action: AgentJobAction;\n readonly jobId: string;\n readonly kind: \"job-action\";\n}\n\nexport type AgentRequestRoute =\n Readonly<{ kind: \"capability\" }> | Readonly<{ kind: \"create-job\" }> | AgentJobRoute;\n\nexport interface AgentHttpOptions {\n readonly agentManager?: AgentJobManager;\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly root: string;\n}\n\nexport type WriteAgentSuccess = (\n response: ServerResponse,\n status: number,\n data: unknown,\n) => void;\n\nconst AGENT_JOB_ID_PATTERN = /^[A-Za-z0-9_-]{22,128}$/;\nconst AGENT_JOB_ACTIONS = new Set<AgentJobAction>([\n \"events\",\n \"result\",\n \"cancel\",\n \"apply\",\n \"revert\",\n]);\nconst EVENT_STREAM_END_STATUSES = new Set<AgentJobStatus>([\n \"awaiting-review\",\n \"applied\",\n \"completed\",\n \"cancelled\",\n \"reverted\",\n \"failed\",\n]);\n\nexport function matchAgentRequestPath(path: string): AgentRequestRoute | undefined {\n if (path === SPOTPATCH_ENDPOINTS.agentCapability) {\n return Object.freeze({ kind: \"capability\" });\n }\n\n if (path === SPOTPATCH_ENDPOINTS.agentJobs) {\n return Object.freeze({ kind: \"create-job\" });\n }\n\n const prefix = `${SPOTPATCH_ENDPOINTS.agentJobs}/`;\n\n if (!path.startsWith(prefix)) {\n return undefined;\n }\n\n const segments = path.slice(prefix.length).split(\"/\");\n const jobId = segments[0];\n const action = segments[1];\n\n if (\n segments.length !== 2 ||\n jobId === undefined ||\n !AGENT_JOB_ID_PATTERN.test(jobId) ||\n action === undefined ||\n !AGENT_JOB_ACTIONS.has(action as AgentJobAction)\n ) {\n return undefined;\n }\n\n return Object.freeze({\n kind: \"job-action\",\n action: action as AgentJobAction,\n jobId,\n });\n}\n\nfunction requireAgentManager(options: AgentHttpOptions): AgentJobManager {\n if (options.agentManager === undefined || options.options.ai === false) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n return options.agentManager;\n}\n\nfunction writeNdjsonEvent(response: ServerResponse, event: AgentJobEvent): void {\n response.write(`${JSON.stringify(event)}\\n`);\n}\n\nfunction streamAgentJobEvents(\n response: ServerResponse,\n manager: AgentJobManager,\n jobId: string,\n): void {\n const events = manager.events(jobId);\n const current = manager.result(jobId).snapshot;\n response.statusCode = 200;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/x-ndjson; charset=utf-8\");\n response.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n\n for (const event of events) {\n writeNdjsonEvent(response, event);\n }\n\n if (EVENT_STREAM_END_STATUSES.has(current.status)) {\n response.end();\n return;\n }\n\n let settled = false;\n let unsubscribe = (): void => undefined;\n const heartbeat = setInterval(() => {\n if (!settled) {\n response.write(\"\\n\");\n }\n }, 15_000);\n heartbeat.unref();\n const cleanup = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearInterval(heartbeat);\n unsubscribe();\n };\n unsubscribe = manager.subscribe(jobId, (event) => {\n if (settled) {\n return;\n }\n\n writeNdjsonEvent(response, event);\n\n if (\n event.type === \"snapshot\" &&\n EVENT_STREAM_END_STATUSES.has(event.data.snapshot.status)\n ) {\n cleanup();\n response.end();\n }\n });\n response.once(\"close\", cleanup);\n response.once(\"error\", cleanup);\n}\n\nasync function handleCapability(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const parsed = agentCapabilityRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const controller = new AbortController();\n const abort = (): void => {\n controller.abort(\"agent-capability-client-disconnected\");\n };\n response.once(\"close\", abort);\n\n try {\n const data = await requireAgentManager(options).probe(\n parsed.data,\n controller.signal,\n );\n writeSuccess(response, 200, data);\n } finally {\n response.removeListener(\"close\", abort);\n }\n}\n\nasync function handleCreateJob(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const parsed = agentJobCreateRequestSchema.safeParse(\n await readJsonRequestBody(request, MAX_AGENT_REQUEST_BODY_BYTES),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const authorizedRequest = await authorizeAgentJobRequest({\n request: parsed.data,\n options: options.options,\n registry: options.registry,\n root: options.root,\n });\n const data = requireAgentManager(options).create(authorizedRequest);\n writeSuccess(response, 202, data);\n}\n\nasync function handleJobAction(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n route: AgentJobRoute,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n const manager = requireAgentManager(options);\n\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const parsed = agentJobActionRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n if (route.action === \"events\") {\n streamAgentJobEvents(response, manager, route.jobId);\n return;\n }\n\n if (route.action === \"result\") {\n writeSuccess(response, 200, manager.result(route.jobId));\n return;\n }\n\n const data =\n route.action === \"cancel\"\n ? manager.cancel(route.jobId)\n : route.action === \"apply\"\n ? await manager.apply(route.jobId)\n : await manager.revert(route.jobId);\n writeSuccess(response, 200, data);\n}\n\nexport async function handleAgentRequest(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n route: AgentRequestRoute,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n if (route.kind === \"capability\") {\n await handleCapability(request, response, options, writeSuccess);\n return;\n }\n\n if (route.kind === \"create-job\") {\n await handleCreateJob(request, response, options, writeSuccess);\n return;\n }\n\n await handleJobAction(request, response, options, route, writeSuccess);\n}\n","import { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n ERROR_CODES,\n SpotPatchError,\n type AgentJobCreateRequest,\n type MatchedStyleRule,\n type SourceRef,\n type SpotAnnotation,\n type SpotTargetContext,\n} from \"@spotpatch/shared\";\nimport type { agentJobCreateRequestSchema } from \"@spotpatch/shared\";\nimport type { z } from \"zod\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { readSourceContext } from \"./source-context.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\nexport interface AuthorizeAgentJobRequestOptions {\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly request: z.output<typeof agentJobCreateRequestSchema>;\n readonly root: string;\n}\n\ntype ParsedAgentJobRequest = AuthorizeAgentJobRequestOptions[\"request\"];\ntype ParsedTarget = ParsedAgentJobRequest[\"annotation\"][\"targets\"][number];\n\nfunction compactSourceRef(source: ParsedTarget[\"source\"]): SourceRef {\n return Object.freeze({\n origin: source.origin,\n confidence: source.confidence,\n ...(source.fileId === undefined ? {} : { fileId: source.fileId }),\n ...(source.relativePath === undefined ? {} : { relativePath: source.relativePath }),\n ...(source.line === undefined ? {} : { line: source.line }),\n ...(source.column === undefined ? {} : { column: source.column }),\n });\n}\n\nasync function authorizeSourceRef(\n source: ParsedTarget[\"source\"],\n registry: SourceRegistry,\n root: string,\n): Promise<SourceRef> {\n const markerOrigin = source.origin === \"jsx-host\" || source.origin === \"dom-ancestor\";\n\n if (\n markerOrigin &&\n (source.fileId === undefined ||\n source.line === undefined ||\n source.column === undefined)\n ) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n if (source.fileId === undefined) {\n if (source.origin === \"none\" && source.relativePath !== undefined) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return compactSourceRef(source);\n }\n\n const sourcePath = await resolveSourceFile({\n fileId: source.fileId,\n registry,\n root,\n });\n const relativePath = path\n .relative(await realpath(root), sourcePath)\n .split(path.sep)\n .join(\"/\");\n\n if (source.relativePath !== undefined && source.relativePath !== relativePath) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return Object.freeze({\n ...compactSourceRef(source),\n relativePath,\n });\n}\n\nfunction freezeMatchedRule(\n rule: ParsedTarget[\"styles\"][\"matchedRules\"][number],\n): MatchedStyleRule {\n return Object.freeze({\n selector: rule.selector,\n declarations: rule.declarations,\n ...(rule.source === undefined ? {} : { source: rule.source }),\n ...(rule.media === undefined ? {} : { media: rule.media }),\n });\n}\n\nfunction targetIdentity(target: ParsedTarget): string {\n const source = target.source;\n\n if (\n source.fileId !== undefined &&\n source.line !== undefined &&\n source.column !== undefined\n ) {\n return `source:${source.fileId}:${String(source.line)}:${String(source.column)}`;\n }\n\n return [\n \"element\",\n source.origin,\n source.relativePath ?? \"\",\n target.element.selector,\n target.element.sanitizedHtml,\n ].join(\"\\0\");\n}\n\nasync function authorizeTarget(\n target: ParsedTarget,\n input: AuthorizeAgentJobRequestOptions,\n): Promise<SpotTargetContext> {\n const source = await authorizeSourceRef(target.source, input.registry, input.root);\n const reactSourceInput = target.react.source;\n const reactSource =\n reactSourceInput === undefined\n ? undefined\n : await authorizeSourceRef(reactSourceInput, input.registry, input.root);\n const marker =\n source.fileId === undefined ||\n source.line === undefined ||\n source.column === undefined\n ? undefined\n : Object.freeze({\n fileId: source.fileId,\n line: source.line,\n column: source.column,\n maxLines: input.options.budget.maxCodeLines,\n });\n\n if (marker === undefined && target.code !== undefined) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const code =\n marker === undefined\n ? undefined\n : await readSourceContext({\n request: marker,\n registry: input.registry,\n root: input.root,\n maxCharacters: input.options.budget.codeCharacters,\n maxLines: input.options.budget.maxCodeLines,\n });\n\n if (target.code !== undefined && target.code.relativePath !== code?.relativePath) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return Object.freeze({\n instruction: target.instruction,\n source,\n react: Object.freeze({\n supported: target.react.supported,\n ...(target.react.version === undefined ? {} : { version: target.react.version }),\n ...(target.react.componentName === undefined\n ? {}\n : { componentName: target.react.componentName }),\n componentStack: Object.freeze([...target.react.componentStack]),\n ...(reactSource === undefined ? {} : { source: reactSource }),\n }),\n element: Object.freeze({\n tagName: target.element.tagName,\n selector: target.element.selector,\n sanitizedHtml: target.element.sanitizedHtml,\n ...(target.element.textPreview === undefined\n ? {}\n : { textPreview: target.element.textPreview }),\n ...(target.element.role === undefined ? {} : { role: target.element.role }),\n rect: Object.freeze({ ...target.element.rect }),\n }),\n styles: Object.freeze({\n classNames: Object.freeze([...target.styles.classNames]),\n ...(target.styles.inlineStyle === undefined\n ? {}\n : { inlineStyle: target.styles.inlineStyle }),\n matchedRules: Object.freeze(target.styles.matchedRules.map(freezeMatchedRule)),\n computed: Object.freeze({ ...target.styles.computed }),\n warnings: Object.freeze([...target.styles.warnings]),\n }),\n ...(code === undefined ? {} : { code: Object.freeze({ ...code }) }),\n warnings: Object.freeze([...target.warnings]),\n });\n}\n\nexport async function authorizeAgentJobRequest(\n input: AuthorizeAgentJobRequestOptions,\n): Promise<AgentJobCreateRequest> {\n const requestedTargets = input.request.annotation.targets;\n\n if (requestedTargets.length > input.options.maxTargets) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const identities = requestedTargets.map(targetIdentity);\n\n if (new Set(identities).size !== identities.length) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const targets = Object.freeze(\n await Promise.all(requestedTargets.map((target) => authorizeTarget(target, input))),\n );\n\n const annotation = Object.freeze({\n schemaVersion: 3,\n id: input.request.annotation.id,\n locale: input.request.annotation.locale,\n page: Object.freeze({ ...input.request.annotation.page }),\n targets,\n createdAt: input.request.annotation.createdAt,\n }) satisfies SpotAnnotation;\n\n return Object.freeze({\n annotation,\n providerProfileId: input.request.providerProfileId,\n modelProfileId: input.request.modelProfileId,\n providerDataConsent: true,\n });\n}\n","import { readFile, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n ERROR_CODES,\n SpotPatchError,\n type CodeContext,\n type SourceContextRequest,\n} from \"@spotpatch/shared\";\n\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { extractCodeContext } from \"./extract-code-context.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\nexport interface ReadSourceContextOptions {\n readonly maxCharacters: number;\n readonly maxLines: number;\n readonly registry: SourceRegistry;\n readonly request: SourceContextRequest;\n readonly root: string;\n}\n\nfunction toDisplayPath(root: string, sourcePath: string): string {\n return path.relative(root, sourcePath).split(path.sep).join(\"/\");\n}\n\nexport async function readSourceContext(\n options: ReadSourceContextOptions,\n): Promise<CodeContext> {\n const sourcePath = await resolveSourceFile({\n fileId: options.request.fileId,\n registry: options.registry,\n root: options.root,\n });\n let source: string;\n\n try {\n source = await readFile(sourcePath, \"utf8\");\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n ) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND, undefined, {\n cause: error,\n });\n }\n\n throw error;\n }\n const lines = source.split(/\\r?\\n/);\n\n if (options.request.line > lines.length) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const extension = path.extname(sourcePath).toLowerCase();\n\n return extractCodeContext({\n source,\n sourcePath,\n relativePath: toDisplayPath(await realpath(options.root), sourcePath),\n language: extension === \".tsx\" ? \"tsx\" : \"jsx\",\n line: options.request.line,\n column: options.request.column,\n maxLines: Math.min(options.request.maxLines, options.maxLines),\n maxCharacters: options.maxCharacters,\n });\n}\n","import type { CodeContext } from \"@spotpatch/shared\";\nimport {\n parseSync,\n Visitor,\n type Class,\n type Expression,\n type Function,\n type JSXElement,\n type JSXFragment,\n type Span,\n type VariableDeclarator,\n} from \"oxc-parser\";\n\ninterface ComponentCandidate extends Span {\n readonly name: string;\n}\n\nexport interface ExtractCodeContextOptions {\n readonly column: number;\n readonly language: CodeContext[\"language\"];\n readonly line: number;\n readonly maxCharacters: number;\n readonly maxLines: number;\n readonly relativePath: string;\n readonly source: string;\n readonly sourcePath: string;\n}\n\nfunction isComponentName(name: string): boolean {\n return /^[A-Z]/u.test(name);\n}\n\nfunction unwrapTypeExpression(expression: Expression): Expression {\n switch (expression.type) {\n case \"TSAsExpression\":\n case \"TSSatisfiesExpression\":\n case \"TSTypeAssertion\":\n case \"TSNonNullExpression\":\n case \"TSInstantiationExpression\":\n return unwrapTypeExpression(expression.expression);\n default:\n return expression;\n }\n}\n\nfunction calleeName(expression: Expression): string | undefined {\n const unwrapped = unwrapTypeExpression(expression);\n\n if (unwrapped.type === \"Identifier\") {\n return unwrapped.name;\n }\n\n if (unwrapped.type === \"MemberExpression\" && !unwrapped.computed) {\n return unwrapped.property.type === \"Identifier\"\n ? unwrapped.property.name\n : undefined;\n }\n\n return undefined;\n}\n\nfunction isFunctionExpression(expression: Expression): boolean {\n const unwrapped = unwrapTypeExpression(expression);\n return (\n unwrapped.type === \"ArrowFunctionExpression\" ||\n unwrapped.type === \"FunctionExpression\"\n );\n}\n\nfunction isSupportedComponentInitializer(expression: Expression): boolean {\n const unwrapped = unwrapTypeExpression(expression);\n\n if (isFunctionExpression(unwrapped)) {\n return true;\n }\n\n if (unwrapped.type !== \"CallExpression\") {\n return false;\n }\n\n const name = calleeName(unwrapped.callee);\n\n if (name !== \"memo\" && name !== \"forwardRef\") {\n return false;\n }\n\n const firstArgument = unwrapped.arguments[0];\n return (\n firstArgument !== undefined &&\n firstArgument.type !== \"SpreadElement\" &&\n (isFunctionExpression(firstArgument) ||\n isSupportedComponentInitializer(firstArgument))\n );\n}\n\nfunction variableComponent(node: VariableDeclarator): ComponentCandidate | undefined {\n if (\n node.id.type !== \"Identifier\" ||\n !isComponentName(node.id.name) ||\n node.init === null ||\n !isSupportedComponentInitializer(node.init)\n ) {\n return undefined;\n }\n\n return Object.freeze({ start: node.start, end: node.end, name: node.id.name });\n}\n\nfunction functionComponent(node: Function): ComponentCandidate | undefined {\n return node.id !== null && isComponentName(node.id.name) && node.body !== null\n ? Object.freeze({ start: node.start, end: node.end, name: node.id.name })\n : undefined;\n}\n\nfunction isReactComponentSuperclass(expression: Expression | null): boolean {\n if (expression === null) {\n return false;\n }\n\n const unwrapped = unwrapTypeExpression(expression);\n\n if (unwrapped.type === \"Identifier\") {\n return unwrapped.name === \"Component\" || unwrapped.name === \"PureComponent\";\n }\n\n return (\n unwrapped.type === \"MemberExpression\" &&\n !unwrapped.computed &&\n unwrapped.object.type === \"Identifier\" &&\n unwrapped.object.name === \"React\" &&\n (unwrapped.property.name === \"Component\" ||\n unwrapped.property.name === \"PureComponent\")\n );\n}\n\nfunction classComponent(node: Class): ComponentCandidate | undefined {\n return node.id !== null &&\n isComponentName(node.id.name) &&\n isReactComponentSuperclass(node.superClass)\n ? Object.freeze({ start: node.start, end: node.end, name: node.id.name })\n : undefined;\n}\n\nfunction selectedOffset(\n source: string,\n line: number,\n column: number,\n): number | undefined {\n const lines = source.split(/\\r?\\n/u);\n\n if (line < 1 || line > lines.length) {\n return undefined;\n }\n\n const lineStart = lines\n .slice(0, line - 1)\n .reduce((total, value) => total + value.length + 1, 0);\n const lineLength = lines[line - 1]?.length ?? 0;\n return lineStart + Math.min(Math.max(0, column - 1), lineLength);\n}\n\nfunction findComponentSpan(\n options: ExtractCodeContextOptions,\n): ComponentCandidate | undefined {\n const offset = selectedOffset(options.source, options.line, options.column);\n\n if (offset === undefined) {\n return undefined;\n }\n\n let parseResult: ReturnType<typeof parseSync>;\n\n try {\n parseResult = parseSync(options.sourcePath, options.source, {\n sourceType: \"module\",\n });\n } catch {\n return undefined;\n }\n\n if (parseResult.errors.length > 0) {\n return undefined;\n }\n\n const jsxNodes: (JSXElement | JSXFragment)[] = [];\n const components: ComponentCandidate[] = [];\n const visitor = new Visitor({\n JSXElement(node) {\n jsxNodes.push(node);\n },\n JSXFragment(node) {\n jsxNodes.push(node);\n },\n FunctionDeclaration(node) {\n const candidate = functionComponent(node);\n\n if (candidate !== undefined) {\n components.push(candidate);\n }\n },\n VariableDeclarator(node) {\n const candidate = variableComponent(node);\n\n if (candidate !== undefined) {\n components.push(candidate);\n }\n },\n ClassDeclaration(node) {\n const candidate = classComponent(node);\n\n if (candidate !== undefined) {\n components.push(candidate);\n }\n },\n });\n visitor.visit(parseResult.program);\n\n const selectedJsx = jsxNodes\n .filter((node) => node.start <= offset && node.end >= offset)\n .sort((left, right) => left.end - left.start - (right.end - right.start))[0];\n\n if (selectedJsx === undefined) {\n return undefined;\n }\n\n return components\n .filter(\n (component) =>\n component.start <= selectedJsx.start && component.end >= selectedJsx.end,\n )\n .sort((left, right) => left.end - left.start - (right.end - right.start))[0];\n}\n\nfunction lineAtOffset(source: string, offset: number): number {\n let line = 1;\n\n for (let index = 0; index < offset; index += 1) {\n if (source[index] === \"\\n\") {\n line += 1;\n }\n }\n\n return line;\n}\n\nfunction componentRange(\n source: string,\n component: ComponentCandidate,\n): Readonly<{ startLine: number; endLine: number }> {\n return Object.freeze({\n startLine: lineAtOffset(source, component.start),\n endLine: lineAtOffset(source, Math.max(component.start, component.end - 1)),\n });\n}\n\nfunction truncateSelectedLine(\n line: string,\n column: number,\n maxCharacters: number,\n): string {\n if (line.length <= maxCharacters) {\n return line;\n }\n\n if (maxCharacters === 1) {\n return \"…\";\n }\n\n const contentCharacters = maxCharacters - 2;\n const desiredStart = Math.max(0, column - 1 - Math.floor(contentCharacters / 2));\n const start = Math.min(desiredStart, line.length - contentCharacters);\n const end = start + contentCharacters;\n return `${start > 0 ? \"…\" : \"\"}${line.slice(start, end)}${end < line.length ? \"…\" : \"\"}`.slice(\n 0,\n maxCharacters,\n );\n}\n\nfunction boundedRange(\n lines: readonly string[],\n selectedLine: number,\n column: number,\n initialStart: number,\n initialEnd: number,\n maxCharacters: number,\n): Readonly<{ startLine: number; endLine: number; excerpt: string }> {\n let startLine = initialStart;\n let endLine = initialEnd;\n let excerpt = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n while (excerpt.length > maxCharacters && startLine < endLine) {\n if (endLine - selectedLine >= selectedLine - startLine) {\n endLine -= 1;\n } else {\n startLine += 1;\n }\n\n excerpt = lines.slice(startLine - 1, endLine).join(\"\\n\");\n }\n\n if (excerpt.length > maxCharacters) {\n startLine = selectedLine;\n endLine = selectedLine;\n excerpt = truncateSelectedLine(\n lines[selectedLine - 1] ?? \"\",\n column,\n maxCharacters,\n );\n }\n\n return Object.freeze({ startLine, endLine, excerpt });\n}\n\nfunction nearbyContext(options: ExtractCodeContextOptions): CodeContext {\n const lines = options.source.split(/\\r?\\n/u);\n const initialStart = Math.max(1, options.line - Math.floor(options.maxLines / 2));\n const initialEnd = Math.min(lines.length, initialStart + options.maxLines - 1);\n const startLine = Math.max(1, initialEnd - options.maxLines + 1);\n const bounded = boundedRange(\n lines,\n options.line,\n options.column,\n startLine,\n initialEnd,\n options.maxCharacters,\n );\n\n return Object.freeze({\n relativePath: options.relativePath,\n language: options.language,\n startLine: bounded.startLine,\n endLine: bounded.endLine,\n excerpt: bounded.excerpt,\n boundary: \"nearby-lines\",\n });\n}\n\nexport function extractCodeContext(options: ExtractCodeContextOptions): CodeContext {\n const component = findComponentSpan(options);\n\n if (component !== undefined) {\n const range = componentRange(options.source, component);\n const lineCount = range.endLine - range.startLine + 1;\n const excerpt = options.source\n .split(/\\r?\\n/u)\n .slice(range.startLine - 1, range.endLine)\n .join(\"\\n\");\n\n if (lineCount <= options.maxLines && excerpt.length <= options.maxCharacters) {\n return Object.freeze({\n relativePath: options.relativePath,\n language: options.language,\n startLine: range.startLine,\n endLine: range.endLine,\n excerpt,\n boundary: \"component\",\n });\n }\n }\n\n return nearbyContext(options);\n}\n","import { realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { ERROR_CODES, SpotPatchError } from \"@spotpatch/shared\";\n\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { MAX_SOURCE_FILE_BYTES } from \"./constants.js\";\n\nconst ALLOWED_EXTENSIONS = new Set([\".jsx\", \".tsx\"]);\n\nfunction isMissingFileError(error: unknown): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n );\n}\n\nexport async function assertInsideRoot(\n root: string,\n candidate: string,\n): Promise<string> {\n let realRoot: string;\n let realCandidate: string;\n\n try {\n [realRoot, realCandidate] = await Promise.all([\n realpath(root),\n realpath(candidate),\n ]);\n } catch (error: unknown) {\n if (isMissingFileError(error)) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND, undefined, {\n cause: error,\n });\n }\n\n throw error;\n }\n\n const relative = path.relative(realRoot, realCandidate);\n const outside =\n relative.startsWith(`..${path.sep}`) ||\n relative === \"..\" ||\n path.isAbsolute(relative);\n\n if (outside) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_OUTSIDE_ROOT);\n }\n\n return realCandidate;\n}\n\nexport interface ResolveSourceFileOptions {\n readonly fileId: string;\n readonly registry: SourceRegistry;\n readonly root: string;\n}\n\nexport async function resolveSourceFile(\n options: ResolveSourceFileOptions,\n): Promise<string> {\n const registeredPath = options.registry.resolve(options.fileId);\n\n if (registeredPath === undefined) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND);\n }\n\n const sourcePath = await assertInsideRoot(options.root, registeredPath);\n\n if (!ALLOWED_EXTENSIONS.has(path.extname(sourcePath).toLowerCase())) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND);\n }\n\n let sourceStat;\n\n try {\n sourceStat = await stat(sourcePath);\n } catch (error: unknown) {\n if (isMissingFileError(error)) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND, undefined, {\n cause: error,\n });\n }\n\n throw error;\n }\n\n if (!sourceStat.isFile()) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND);\n }\n\n if (sourceStat.size > MAX_SOURCE_FILE_BYTES) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_TOO_LARGE);\n }\n\n return sourcePath;\n}\n","export const MAX_REQUEST_BODY_BYTES = 32 * 1024;\nexport const MAX_AGENT_REQUEST_BODY_BYTES = 256 * 1024;\nexport const MAX_SOURCE_FILE_BYTES = 1024 * 1024;\n","import type { IncomingMessage } from \"node:http\";\n\nimport { ERROR_CODES, SpotPatchError } from \"@spotpatch/shared\";\n\nimport { MAX_REQUEST_BODY_BYTES } from \"./constants.js\";\n\nfunction isJsonContentType(value: string | undefined): boolean {\n return value?.split(\";\", 1)[0]?.trim().toLowerCase() === \"application/json\";\n}\n\nexport async function readJsonRequestBody(\n request: IncomingMessage,\n maximumBytes = MAX_REQUEST_BODY_BYTES,\n): Promise<unknown> {\n if (!isJsonContentType(request.headers[\"content-type\"])) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const declaredLength = Number(request.headers[\"content-length\"]);\n\n if (Number.isFinite(declaredLength) && declaredLength > maximumBytes) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const chunks: Uint8Array[] = [];\n let byteLength = 0;\n let exceededLimit = false;\n\n for await (const rawChunk of request) {\n const chunk: unknown = rawChunk;\n\n if (typeof chunk !== \"string\" && !(chunk instanceof Uint8Array)) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const buffer = Buffer.from(chunk);\n byteLength += buffer.byteLength;\n\n if (byteLength > maximumBytes) {\n exceededLimit = true;\n continue;\n }\n\n chunks.push(buffer);\n }\n\n if (exceededLimit || byteLength === 0) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n try {\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown;\n } catch (error: unknown) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST, undefined, {\n cause: error,\n });\n }\n}\n","import type { SpotPatchEditorPreference } from \"@spotpatch/shared\";\nimport launchEditor from \"launch-editor\";\n\nconst EDITOR_STARTUP_GRACE_MS = 150;\n\nexport type EditorLauncher = (\n target: string,\n editor: SpotPatchEditorPreference,\n) => Promise<void>;\n\nfunction editorCommand(editor: SpotPatchEditorPreference): string | undefined {\n if (editor === \"vscode\") {\n return \"code\";\n }\n\n if (editor === \"cursor\") {\n return \"cursor\";\n }\n\n return undefined;\n}\n\nexport const launchConfiguredEditor: EditorLauncher = (target, editor) =>\n new Promise<void>((resolve, reject) => {\n let settled = false;\n const startupTimer = setTimeout(() => {\n settled = true;\n resolve();\n }, EDITOR_STARTUP_GRACE_MS);\n\n const rejectStartup = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(startupTimer);\n reject(new Error(\"The configured editor could not be started.\"));\n };\n\n try {\n launchEditor(target, editorCommand(editor), rejectStartup);\n } catch {\n rejectStartup();\n }\n });\n","import { timingSafeEqual } from \"node:crypto\";\nimport type { IncomingMessage } from \"node:http\";\nimport { isIP } from \"node:net\";\n\nimport { ERROR_CODES, SPOTPATCH_TOKEN_HEADER, SpotPatchError } from \"@spotpatch/shared\";\n\nfunction getSingleHeader(request: IncomingMessage, name: string): string | undefined {\n const value = request.headers[name.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction tokensMatch(actual: string | undefined, expected: string): boolean {\n if (actual === undefined) {\n return false;\n }\n\n const actualBytes = Buffer.from(actual);\n const expectedBytes = Buffer.from(expected);\n\n return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\n\nexport function isLoopbackHostname(hostname: string): boolean {\n const normalized = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n if (normalized === \"localhost\" || normalized.endsWith(\".localhost\")) {\n return true;\n }\n\n if (normalized === \"::1\") {\n return true;\n }\n\n if (isIP(normalized) === 4) {\n return normalized.split(\".\")[0] === \"127\";\n }\n\n return normalized.startsWith(\"::ffff:127.\");\n}\n\nfunction parseHost(value: string): URL | undefined {\n try {\n return new URL(`http://${value}`);\n } catch {\n return undefined;\n }\n}\n\nfunction parseOrigin(value: string): URL | undefined {\n try {\n const origin = new URL(value);\n\n if (\n (origin.protocol !== \"http:\" && origin.protocol !== \"https:\") ||\n origin.username.length > 0 ||\n origin.password.length > 0 ||\n origin.origin === \"null\"\n ) {\n return undefined;\n }\n\n return origin;\n } catch {\n return undefined;\n }\n}\n\nexport interface RequestSecurityOptions {\n readonly allowLan: boolean;\n readonly sessionToken: string;\n}\n\nexport function assertRequestAuthorized(\n request: IncomingMessage,\n options: RequestSecurityOptions,\n): void {\n const actualToken = getSingleHeader(request, SPOTPATCH_TOKEN_HEADER);\n\n if (!tokensMatch(actualToken, options.sessionToken)) {\n throw new SpotPatchError(ERROR_CODES.INVALID_TOKEN);\n }\n\n const hostHeader = getSingleHeader(request, \"host\");\n const originHeader = getSingleHeader(request, \"origin\");\n const host = hostHeader === undefined ? undefined : parseHost(hostHeader);\n const origin = originHeader === undefined ? undefined : parseOrigin(originHeader);\n\n if (host === undefined || origin === undefined) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n\n const hostIsLoopback = isLoopbackHostname(host.hostname);\n const originIsLoopback = isLoopbackHostname(origin.hostname);\n\n if (!options.allowLan) {\n if (!hostIsLoopback || !originIsLoopback) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n\n return;\n }\n\n if (!originIsLoopback && origin.host.toLowerCase() !== host.host.toLowerCase()) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\nexport interface SpotPatchSession {\n readonly token: string;\n}\n\nexport function createSession(): SpotPatchSession {\n return Object.freeze({\n token: randomBytes(16).toString(\"base64url\"),\n });\n}\n","import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\n\nimport type { ConfigEnv, Plugin, ResolvedConfig, UserConfig } from \"vite\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { injectSourceMarkers } from \"./inject-source-markers.js\";\nimport { createTransformFilter, stripViteQuery } from \"./transform-filter.js\";\n\ninterface TransformPluginInput {\n readonly configure?: (config: UserConfig, environment: ConfigEnv) => void;\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n}\n\ninterface ViteTransformOutput {\n readonly code: string;\n readonly map: string;\n}\n\nfunction createCacheKey(id: string, code: string): string {\n const hash = createHash(\"sha256\").update(code).digest(\"base64url\");\n return `${id}\\0${hash}`;\n}\n\nfunction getDisplayPath(root: string, id: string): string {\n const relative = path.relative(root, stripViteQuery(id));\n return relative.split(path.sep).join(\"/\");\n}\n\nexport function createTransformPlugin(input: TransformPluginInput): Plugin {\n let root = process.cwd();\n let filter = createTransformFilter(root, input.context.getOptions());\n let logger: ResolvedConfig[\"logger\"] | undefined;\n const warnedFiles = new Set<string>();\n const cache = new Map<string, ViteTransformOutput | null>();\n\n return {\n name: \"spotpatch:transform\",\n apply: \"serve\",\n enforce: \"pre\",\n\n config(config, environment) {\n input.configure?.(config, environment);\n },\n\n configResolved(config) {\n root = path.resolve(config.root);\n filter = createTransformFilter(root, input.context.getOptions());\n logger = config.logger;\n },\n\n transform(code, id) {\n if (!filter.shouldTransform(id, code)) {\n return null;\n }\n\n const cleanId = path.resolve(stripViteQuery(id));\n const cacheKey = createCacheKey(cleanId, code);\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey) ?? null;\n }\n\n const startedAt = performance.now();\n const options = input.context.getOptions();\n\n try {\n const result = injectSourceMarkers({\n code,\n absolutePath: cleanId,\n root,\n fileId: input.registry.register(cleanId),\n onWarning(warning) {\n logger?.warn(\n `[spotpatch:transform] Existing source marker at ${getDisplayPath(root, id)}:${String(warning.line)}:${String(warning.column)}; preserving application value.`,\n );\n },\n });\n\n const output =\n result === undefined\n ? null\n : Object.freeze({\n code: result.code,\n map: result.map.toString(),\n });\n cache.set(cacheKey, output);\n\n if (options.debug) {\n const elapsed = performance.now() - startedAt;\n logger?.info(\n `[spotpatch:transform] ${getDisplayPath(root, id)} ${elapsed.toFixed(2)}ms`,\n );\n }\n\n return output;\n } catch (error: unknown) {\n if (!warnedFiles.has(cleanId)) {\n warnedFiles.add(cleanId);\n const detail =\n options.debug && error instanceof Error ? `: ${error.message}` : \"\";\n logger?.warn(\n `[spotpatch:transform] Failed to transform ${getDisplayPath(root, id)}; using original module${detail}`,\n );\n }\n\n return null;\n }\n },\n };\n}\n","import path from \"node:path\";\n\nimport {\n formatSourceMarker,\n SOURCE_MARKER_ATTRIBUTE,\n type SourceMarker,\n} from \"@spotpatch/shared\";\nimport MagicString from \"magic-string\";\nimport { parseSync, Visitor, type JSXOpeningElement } from \"oxc-parser\";\n\nimport {\n hasSourceMarkerAttribute,\n isIntrinsicOpeningElement,\n} from \"./intrinsic-element.js\";\nimport { createLineStarts, getSourcePosition } from \"./source-position.js\";\n\nexport interface TransformWarning {\n readonly code: \"EXISTING_SOURCE_MARKER\";\n readonly line: number;\n readonly column: number;\n}\n\nexport interface InjectSourceMarkersInput {\n readonly code: string;\n readonly absolutePath: string;\n readonly root: string;\n readonly fileId: string;\n readonly onWarning?: (warning: TransformWarning) => void;\n}\n\nexport interface InjectSourceMarkersResult {\n readonly code: string;\n readonly map: ReturnType<MagicString[\"generateMap\"]>;\n readonly markerCount: number;\n}\n\nfunction findAttributeInsertionOffset(code: string, node: JSXOpeningElement): number {\n let cursor = node.end - 2;\n\n while (cursor >= node.start && /\\s/u.test(code[cursor] ?? \"\")) {\n cursor -= 1;\n }\n\n if (code[cursor] === \"/\") {\n cursor -= 1;\n while (cursor >= node.start && /\\s/u.test(code[cursor] ?? \"\")) {\n cursor -= 1;\n }\n }\n\n return cursor + 1;\n}\n\nfunction normalizeRelativePath(root: string, absolutePath: string): string {\n return path.relative(root, absolutePath).split(path.sep).join(\"/\");\n}\n\nfunction createMarker(fileId: string, line: number, column: number): SourceMarker {\n return Object.freeze({ fileId, line, column });\n}\n\nexport function injectSourceMarkers(\n input: InjectSourceMarkersInput,\n): InjectSourceMarkersResult | undefined {\n const parseResult = parseSync(input.absolutePath, input.code, {\n sourceType: \"module\",\n });\n\n const parseError = parseResult.errors[0];\n\n if (parseError !== undefined) {\n throw new SyntaxError(parseError.message);\n }\n\n const magicString = new MagicString(input.code);\n const lineStarts = createLineStarts(input.code);\n let markerCount = 0;\n\n const visitor = new Visitor({\n JSXOpeningElement(node) {\n if (!isIntrinsicOpeningElement(node)) {\n return;\n }\n\n const position = getSourcePosition(lineStarts, node.start);\n\n if (hasSourceMarkerAttribute(node)) {\n input.onWarning?.({\n code: \"EXISTING_SOURCE_MARKER\",\n line: position.line,\n column: position.column,\n });\n return;\n }\n\n const value = formatSourceMarker(\n createMarker(input.fileId, position.line, position.column),\n );\n const insertionOffset = findAttributeInsertionOffset(input.code, node);\n magicString.appendLeft(\n insertionOffset,\n ` ${SOURCE_MARKER_ATTRIBUTE}=${JSON.stringify(value)}`,\n );\n markerCount += 1;\n },\n });\n\n visitor.visit(parseResult.program);\n\n if (markerCount === 0) {\n return undefined;\n }\n\n return Object.freeze({\n code: magicString.toString(),\n map: magicString.generateMap({\n hires: true,\n includeContent: true,\n source: normalizeRelativePath(input.root, input.absolutePath),\n }),\n markerCount,\n });\n}\n","import { SOURCE_MARKER_ATTRIBUTE } from \"@spotpatch/shared\";\nimport type { JSXOpeningElement } from \"oxc-parser\";\n\nexport function isIntrinsicOpeningElement(node: JSXOpeningElement): boolean {\n if (node.name.type !== \"JSXIdentifier\") {\n return false;\n }\n\n const { name } = node.name;\n const firstCharacter = name[0];\n\n return name.includes(\"-\") || firstCharacter?.toLowerCase() === firstCharacter;\n}\n\nexport function hasSourceMarkerAttribute(node: JSXOpeningElement): boolean {\n return node.attributes.some(\n (attribute) =>\n attribute.type === \"JSXAttribute\" &&\n attribute.name.type === \"JSXIdentifier\" &&\n attribute.name.name === SOURCE_MARKER_ATTRIBUTE,\n );\n}\n","export interface SourcePosition {\n readonly line: number;\n readonly column: number;\n}\n\nexport function createLineStarts(code: string): readonly number[] {\n const starts = [0];\n\n for (let index = 0; index < code.length; index += 1) {\n if (code.charCodeAt(index) === 10) {\n starts.push(index + 1);\n }\n }\n\n return starts;\n}\n\nexport function getSourcePosition(\n lineStarts: readonly number[],\n offset: number,\n): SourcePosition {\n let lower = 0;\n let upper = lineStarts.length - 1;\n\n while (lower <= upper) {\n const middle = Math.floor((lower + upper) / 2);\n const start = lineStarts[middle];\n\n if (start === undefined) {\n break;\n }\n\n if (start <= offset) {\n lower = middle + 1;\n } else {\n upper = middle - 1;\n }\n }\n\n const lineIndex = Math.max(0, upper);\n const lineStart = lineStarts[lineIndex] ?? 0;\n\n return Object.freeze({\n line: lineIndex + 1,\n column: offset - lineStart + 1,\n });\n}\n","import path from \"node:path\";\n\nimport { createFilter } from \"@rollup/pluginutils\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\n\nconst SUPPORTED_EXTENSIONS = new Set([\".jsx\", \".tsx\"]);\n\nexport function stripViteQuery(id: string): string {\n const queryIndex = id.indexOf(\"?\");\n return queryIndex === -1 ? id : id.slice(0, queryIndex);\n}\n\nexport function isInsideRoot(root: string, candidate: string, pathApi = path): boolean {\n const relative = pathApi.relative(pathApi.resolve(root), pathApi.resolve(candidate));\n return (\n relative === \"\" ||\n (!relative.startsWith(`..${pathApi.sep}`) &&\n relative !== \"..\" &&\n !pathApi.isAbsolute(relative))\n );\n}\n\nexport interface TransformFilter {\n shouldTransform(id: string, code: string): boolean;\n}\n\nexport function createTransformFilter(\n root: string,\n options: ResolvedSpotPatchOptions,\n): TransformFilter {\n const matchesConfiguredFilter = createFilter(options.include, options.exclude);\n\n return Object.freeze({\n shouldTransform(id: string, code: string): boolean {\n if (id.startsWith(\"\\0\") || id.includes(\"virtual:spotpatch\")) {\n return false;\n }\n\n const cleanId = stripViteQuery(id);\n\n if (!SUPPORTED_EXTENSIONS.has(path.extname(cleanId).toLowerCase())) {\n return false;\n }\n\n if (\n cleanId.includes(\"/node_modules/\") ||\n cleanId.includes(\"\\\\node_modules\\\\\") ||\n cleanId.includes(\"/packages/vite/\") ||\n cleanId.includes(\"\\\\packages\\\\vite\\\\\")\n ) {\n return false;\n }\n\n if (!isInsideRoot(root, cleanId) || !matchesConfiguredFilter(cleanId)) {\n return false;\n }\n\n return code.includes(\"<\");\n },\n });\n}\n","export { spotPatch } from \"./plugin.js\";\nexport {\n DEFAULT_OPTIONS,\n resolveOptions,\n type ResolvedSpotPatchOptions,\n type SimpleAiOptions,\n type SpotPatchAiOptions,\n type SpotPatchOptions,\n} from \"./options.js\";\nexport {\n DEFAULT_AGENT_LIMITS,\n type AgentApplyMode,\n type AgentCheckDefinition,\n type AgentLimits,\n type AiExecutionOptions,\n type AiModelProfile,\n type AiOptions,\n type AiProviderAuthentication,\n type AiProviderProtocol,\n type ContextBudget,\n type OpenAICompatibleProviderOptions,\n type SpotPatchEditorPreference,\n} from \"@spotpatch/shared\";\n"],"mappings":"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","names":["path","path","path","path","randomBytes","ERROR_CODES","SPOTPATCH_ENDPOINTS","SpotPatchError","ERROR_CODES","SpotPatchError","realpath","path","ERROR_CODES","SpotPatchError","realpath","path","ERROR_CODES","SpotPatchError","path","ERROR_CODES","SpotPatchError","SpotPatchError","ERROR_CODES","path","path","SpotPatchError","ERROR_CODES","realpath","SpotPatchError","ERROR_CODES","path","realpath","ERROR_CODES","SpotPatchError","SpotPatchError","ERROR_CODES","path","SpotPatchError","ERROR_CODES","ERROR_CODES","SpotPatchError","ERROR_CODES","SpotPatchError","path","SPOTPATCH_ENDPOINTS","path","randomBytes","createHash","path","path","SOURCE_MARKER_ATTRIBUTE","parseSync","Visitor","path","parseSync","Visitor","SOURCE_MARKER_ATTRIBUTE","path","createHash","path","path","DEFAULT_AGENT_LIMITS"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts","../src/environment-ai.ts","../src/options.ts","../src/registry/source-registry.ts","../src/registry/source-id.ts","../src/runtime/runtime-injection-plugin.ts","../package.json","../src/server/server-plugin.ts","../src/agent/job-manager.ts","../src/server/middleware.ts","../src/server/agent-http.ts","../src/server/agent-request.ts","../src/server/source-context.ts","../src/server/extract-code-context.ts","../src/server/source-file.ts","../src/server/constants.ts","../src/server/request-body.ts","../src/server/editor.ts","../src/server/request-security.ts","../src/session/session.ts","../src/transform/transform-plugin.ts","../src/transform/inject-source-markers.ts","../src/transform/intrinsic-element.ts","../src/transform/source-position.ts","../src/transform/transform-filter.ts","../src/index.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport { loadEnv, type ConfigEnv, type Plugin, type UserConfig } from \"vite\";\n\nimport { resolveEnvironmentAiConfiguration } from \"./environment-ai.js\";\nimport { resolveOptions, type SpotPatchOptions } from \"./options.js\";\nimport type { SpotPatchPluginContext } from \"./plugin-context.js\";\nimport { createSourceRegistry } from \"./registry/source-registry.js\";\nimport { createRuntimeInjectionPlugin } from \"./runtime/runtime-injection-plugin.js\";\nimport { createServerPlugin } from \"./server/server-plugin.js\";\nimport { createSession } from \"./session/session.js\";\nimport { createTransformPlugin } from \"./transform/transform-plugin.js\";\n\nexport function spotPatch(userOptions: SpotPatchOptions = {}): Plugin[] {\n let options = resolveOptions(userOptions);\n let credentialEnvironment: Readonly<Record<string, string | undefined>> =\n Object.freeze({});\n\n if (!options.enabled) {\n return [];\n }\n\n const registry = createSourceRegistry();\n const session = createSession();\n const context = Object.freeze({\n getCredentialEnvironment: () => credentialEnvironment,\n getOptions: () => options,\n } satisfies SpotPatchPluginContext);\n const configure = (config: UserConfig, environment: ConfigEnv): void => {\n const root = path.resolve(process.cwd(), config.root ?? \".\");\n const loadedEnvironment =\n config.envDir === false\n ? process.env\n : loadEnv(environment.mode, path.resolve(root, config.envDir ?? \".\"), \"\");\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(loadedEnvironment).ai\n : false;\n\n options = resolveOptions(userOptions, environmentAi);\n\n if (options.ai === false) {\n credentialEnvironment = Object.freeze({});\n return;\n }\n\n const names = new Set(\n Object.values(options.ai.providers).map((provider) => provider.apiKeyEnv),\n );\n const missing = [...names].filter((name) => {\n const value = loadedEnvironment[name];\n return value === undefined || value.trim().length === 0;\n });\n\n if (missing.length > 0) {\n throw new RangeError(\n `SpotPatch AI credential environment is missing ${missing.join(\", \")}.`,\n );\n }\n\n credentialEnvironment = Object.freeze(\n Object.fromEntries([...names].map((name) => [name, loadedEnvironment[name]])),\n );\n };\n\n return [\n createTransformPlugin({ configure, context, registry }),\n createRuntimeInjectionPlugin({ context, session }),\n createServerPlugin({ context, registry, session }),\n ];\n}\n","import type { SimpleAiOptions } from \"./options.js\";\n\nconst AI_ENVIRONMENT_NAMES = Object.freeze({\n authentication: \"SPOTPATCH_AI_AUTHENTICATION\",\n baseURL: \"SPOTPATCH_AI_BASE_URL\",\n credential: \"SPOTPATCH_AI_API_KEY\",\n model: \"SPOTPATCH_AI_MODEL\",\n protocol: \"SPOTPATCH_AI_PROTOCOL\",\n} as const);\n\nexport interface EnvironmentAiConfiguration {\n readonly ai: false | SimpleAiOptions;\n}\n\nfunction normalizedValue(\n environment: Readonly<Record<string, string | undefined>>,\n name: string,\n): string | undefined {\n const value = environment[name];\n\n if (value === undefined || value.trim().length === 0) {\n return undefined;\n }\n\n return value.trim();\n}\n\nexport function resolveEnvironmentAiConfiguration(\n environment: Readonly<Record<string, string | undefined>>,\n): EnvironmentAiConfiguration {\n const baseURL = normalizedValue(environment, AI_ENVIRONMENT_NAMES.baseURL);\n const model = normalizedValue(environment, AI_ENVIRONMENT_NAMES.model);\n const credential = normalizedValue(environment, AI_ENVIRONMENT_NAMES.credential);\n const protocol = normalizedValue(environment, AI_ENVIRONMENT_NAMES.protocol);\n const authentication = normalizedValue(\n environment,\n AI_ENVIRONMENT_NAMES.authentication,\n );\n const configuredValues = [baseURL, model, credential, protocol, authentication];\n\n if (configuredValues.every((value) => value === undefined)) {\n return Object.freeze({ ai: false });\n }\n\n const missing = [\n [AI_ENVIRONMENT_NAMES.baseURL, baseURL],\n [AI_ENVIRONMENT_NAMES.model, model],\n [AI_ENVIRONMENT_NAMES.credential, credential],\n ]\n .filter((entry): entry is [string, undefined] => entry[1] === undefined)\n .map(([name]) => name);\n\n if (missing.length > 0) {\n throw new RangeError(\n `SpotPatch AI environment configuration is incomplete; missing ${missing.join(\", \")}.`,\n );\n }\n\n if (baseURL === undefined || model === undefined || credential === undefined) {\n throw new RangeError(\"SpotPatch AI environment configuration is incomplete.\");\n }\n\n if (\n protocol !== undefined &&\n protocol !== \"responses\" &&\n protocol !== \"chat-completions\"\n ) {\n throw new RangeError(\n \"SpotPatch SPOTPATCH_AI_PROTOCOL must be responses or chat-completions.\",\n );\n }\n\n if (\n authentication !== undefined &&\n authentication !== \"bearer\" &&\n authentication !== \"x-api-key\"\n ) {\n throw new RangeError(\n \"SpotPatch SPOTPATCH_AI_AUTHENTICATION must be bearer or x-api-key.\",\n );\n }\n\n return Object.freeze({\n ai: Object.freeze({\n baseURL,\n model,\n ...(protocol === undefined ? {} : { protocol }),\n ...(authentication === undefined ? {} : { authentication }),\n }),\n });\n}\n","import {\n DEFAULT_AGENT_LIMITS,\n MAX_ANNOTATION_TARGETS,\n SPOTPATCH_EDITOR_PREFERENCES,\n SPOTPATCH_LOCALE_PREFERENCES,\n type AgentLimits,\n type AiExecutionOptions,\n type AiOptions,\n type AiProviderAuthentication,\n type AiProviderProtocol,\n type ContextBudget,\n type ResolvedAgentCheckDefinition,\n type ResolvedAiModelProfile,\n type ResolvedAiOptions,\n type ResolvedOpenAICompatibleProviderOptions,\n type RuntimeAiConfig,\n type SpotPatchEditorPreference,\n type SpotPatchLocalePreference,\n} from \"@spotpatch/shared\";\nimport { z } from \"zod\";\n\nexport type {\n AgentApplyMode,\n AgentCheckDefinition,\n AgentLimits,\n AiExecutionOptions,\n AiModelProfile,\n AiOptions,\n AiProviderAuthentication,\n AiProviderProtocol,\n OpenAICompatibleProviderOptions,\n} from \"@spotpatch/shared\";\n\nexport type FilterEntry = string | RegExp;\n\nexport interface SimpleAiOptions {\n readonly baseURL: string;\n readonly model: string;\n readonly apiKeyEnv?: string;\n readonly protocol?: AiProviderProtocol;\n readonly authentication?: AiProviderAuthentication;\n readonly providerLabel?: string;\n readonly modelLabel?: string;\n readonly execution?: AiExecutionOptions;\n}\n\nexport type SpotPatchAiOptions = false | SimpleAiOptions | AiOptions;\n\nexport interface SpotPatchOptions {\n readonly enabled?: boolean;\n readonly include?: readonly FilterEntry[];\n readonly exclude?: readonly FilterEntry[];\n readonly editor?: SpotPatchEditorPreference;\n readonly redact?: boolean;\n readonly budget?: Partial<ContextBudget>;\n readonly shortcut?: string;\n readonly allowLan?: boolean;\n readonly debug?: boolean;\n readonly locale?: SpotPatchLocalePreference;\n readonly maxTargets?: number;\n readonly ai?: SpotPatchAiOptions;\n}\n\nexport interface ResolvedSpotPatchOptions {\n readonly enabled: boolean;\n readonly include: readonly FilterEntry[];\n readonly exclude: readonly FilterEntry[];\n readonly editor: SpotPatchEditorPreference;\n readonly redact: boolean;\n readonly budget: Readonly<ContextBudget>;\n readonly shortcut: string;\n readonly allowLan: boolean;\n readonly debug: boolean;\n readonly locale: SpotPatchLocalePreference;\n readonly maxTargets: number;\n readonly ai: false | ResolvedAiOptions;\n}\n\nexport const DEFAULT_EXCLUDE = Object.freeze([\n /node_modules/,\n /\\.test\\.[jt]sx$/,\n /\\.spec\\.[jt]sx$/,\n /\\.stories\\.[jt]sx$/,\n /(?:^|\\/)dist(?:\\/|$)/,\n /(?:^|\\/)coverage(?:\\/|$)/,\n]);\n\nconst DEFAULT_INCLUDE = Object.freeze([/(?:^|[/\\\\])src[/\\\\].+\\.(?:jsx|tsx)$/]);\n\nconst DEFAULT_BUDGET = Object.freeze({\n totalCharacters: 16_000,\n domCharacters: 3_000,\n cssCharacters: 4_000,\n codeCharacters: 7_000,\n maxCodeLines: 80,\n maxComponentDepth: 8,\n} satisfies ContextBudget);\n\nexport const DEFAULT_OPTIONS = Object.freeze({\n enabled: true,\n include: DEFAULT_INCLUDE,\n exclude: DEFAULT_EXCLUDE,\n editor: \"auto\",\n redact: true,\n budget: DEFAULT_BUDGET,\n shortcut: \"Mod+Shift+S\",\n allowLan: false,\n debug: false,\n locale: \"auto\",\n maxTargets: 8,\n ai: false,\n} satisfies ResolvedSpotPatchOptions);\n\nconst PROFILE_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;\nconst ENV_NAME_PATTERN = /^[A-Z][A-Z0-9_]{1,127}$/;\n\nconst agentLimitsSchema = z\n .strictObject({\n maxTurns: z.number().optional(),\n maxToolCalls: z.number().optional(),\n maxChangedFiles: z.number().optional(),\n maxDiffBytes: z.number().optional(),\n maxReadBytesPerFile: z.number().optional(),\n maxToolOutputCharacters: z.number().optional(),\n maxProviderResponseBytes: z.number().optional(),\n providerConnectTimeoutMs: z.number().optional(),\n providerFirstByteTimeoutMs: z.number().optional(),\n providerIdleTimeoutMs: z.number().optional(),\n checkTimeoutMs: z.number().optional(),\n jobTimeoutMs: z.number().optional(),\n })\n .optional();\n\nconst agentCheckSchema = z.strictObject({\n label: z.string(),\n command: z.string(),\n args: z.array(z.string()).optional(),\n required: z.boolean().optional(),\n timeoutMs: z.number().optional(),\n});\n\ntype ParsedAgentCheck = z.infer<typeof agentCheckSchema>;\ntype ParsedAgentLimits = Readonly<\n Partial<Record<keyof AgentLimits, number | undefined>>\n>;\n\nconst aiOptionsSchema = z.strictObject({\n providers: z.record(\n z.string(),\n z.strictObject({\n type: z.literal(\"openai-compatible\"),\n label: z.string(),\n protocol: z.enum([\"responses\", \"chat-completions\"]),\n authentication: z.enum([\"bearer\", \"x-api-key\"]).optional(),\n baseURL: z.string(),\n apiKeyEnv: z.string(),\n models: z.record(\n z.string(),\n z.strictObject({ label: z.string(), model: z.string() }),\n ),\n defaultModel: z.string(),\n }),\n ),\n defaultProvider: z.string(),\n execution: z\n .strictObject({\n isolation: z.literal(\"git-worktree\").optional(),\n applyMode: z.enum([\"review\", \"auto\"]).optional(),\n checks: z.record(z.string(), agentCheckSchema).optional(),\n limits: agentLimitsSchema,\n })\n .optional(),\n});\n\nconst simpleAiOptionsSchema = z.strictObject({\n baseURL: z.string(),\n model: z.string(),\n apiKeyEnv: z.string().optional(),\n protocol: z.enum([\"responses\", \"chat-completions\"]).optional(),\n authentication: z.enum([\"bearer\", \"x-api-key\"]).optional(),\n providerLabel: z.string().optional(),\n modelLabel: z.string().optional(),\n execution: aiOptionsSchema.shape.execution,\n});\n\ntype ParsedAiOptions = z.infer<typeof aiOptionsSchema>;\n\nfunction assertIdentifier(value: string, label: string): void {\n if (!PROFILE_ID_PATTERN.test(value)) {\n throw new RangeError(\n `SpotPatch ${label} must contain only letters, numbers, dot, underscore, or hyphen.`,\n );\n }\n}\n\nfunction nonEmpty(value: string, label: string, maximum = 256): string {\n const normalized = value.trim();\n\n if (normalized.length === 0 || normalized.length > maximum || value.includes(\"\\0\")) {\n throw new RangeError(`SpotPatch ${label} is invalid.`);\n }\n\n return normalized;\n}\n\nfunction normalizeProviderBaseURL(value: string): string {\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new RangeError(\"SpotPatch AI provider baseURL must be a valid URL.\");\n }\n\n const loopbackHosts = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n const allowedProtocol =\n url.protocol === \"https:\" ||\n (url.protocol === \"http:\" && loopbackHosts.has(url.hostname));\n\n if (\n !allowedProtocol ||\n url.username.length > 0 ||\n url.password.length > 0 ||\n url.search.length > 0 ||\n url.hash.length > 0\n ) {\n throw new RangeError(\"SpotPatch AI provider baseURL violates URL policy.\");\n }\n\n url.pathname = url.pathname.replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\");\n return url.toString().replace(/\\/$/, \"\");\n}\n\nfunction resolveLimits(limits: ParsedAgentLimits | undefined): Readonly<AgentLimits> {\n const resolved = Object.freeze({\n maxTurns: limits?.maxTurns ?? DEFAULT_AGENT_LIMITS.maxTurns,\n maxToolCalls: limits?.maxToolCalls ?? DEFAULT_AGENT_LIMITS.maxToolCalls,\n maxChangedFiles: limits?.maxChangedFiles ?? DEFAULT_AGENT_LIMITS.maxChangedFiles,\n maxDiffBytes: limits?.maxDiffBytes ?? DEFAULT_AGENT_LIMITS.maxDiffBytes,\n maxReadBytesPerFile:\n limits?.maxReadBytesPerFile ?? DEFAULT_AGENT_LIMITS.maxReadBytesPerFile,\n maxToolOutputCharacters:\n limits?.maxToolOutputCharacters ?? DEFAULT_AGENT_LIMITS.maxToolOutputCharacters,\n maxProviderResponseBytes:\n limits?.maxProviderResponseBytes ?? DEFAULT_AGENT_LIMITS.maxProviderResponseBytes,\n providerConnectTimeoutMs:\n limits?.providerConnectTimeoutMs ?? DEFAULT_AGENT_LIMITS.providerConnectTimeoutMs,\n providerFirstByteTimeoutMs:\n limits?.providerFirstByteTimeoutMs ??\n DEFAULT_AGENT_LIMITS.providerFirstByteTimeoutMs,\n providerIdleTimeoutMs:\n limits?.providerIdleTimeoutMs ?? DEFAULT_AGENT_LIMITS.providerIdleTimeoutMs,\n checkTimeoutMs: limits?.checkTimeoutMs ?? DEFAULT_AGENT_LIMITS.checkTimeoutMs,\n jobTimeoutMs: limits?.jobTimeoutMs ?? DEFAULT_AGENT_LIMITS.jobTimeoutMs,\n } satisfies AgentLimits);\n\n for (const [name, value] of Object.entries(resolved)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`SpotPatch AI limit ${name} must be a positive integer.`);\n }\n }\n\n return resolved;\n}\n\nfunction resolveModels(\n models: ParsedAiOptions[\"providers\"][string][\"models\"],\n): Readonly<Record<string, ResolvedAiModelProfile>> {\n const entries = Object.entries(models);\n\n if (entries.length === 0) {\n throw new RangeError(\"SpotPatch AI provider must declare at least one model.\");\n }\n\n return Object.freeze(\n Object.fromEntries(\n entries.map(([id, model]) => {\n assertIdentifier(id, \"model profile id\");\n return [\n id,\n Object.freeze({\n id,\n label: nonEmpty(model.label, \"model label\", 100),\n model: nonEmpty(model.model, \"provider model name\"),\n } satisfies ResolvedAiModelProfile),\n ];\n }),\n ),\n );\n}\n\nfunction resolveProviders(\n providers: ParsedAiOptions[\"providers\"],\n): Readonly<Record<string, ResolvedOpenAICompatibleProviderOptions>> {\n const entries = Object.entries(providers);\n\n if (entries.length === 0) {\n throw new RangeError(\"SpotPatch AI must declare at least one provider.\");\n }\n\n return Object.freeze(\n Object.fromEntries(\n entries.map(([id, provider]) => {\n assertIdentifier(id, \"provider profile id\");\n\n if (\n !ENV_NAME_PATTERN.test(provider.apiKeyEnv) ||\n provider.apiKeyEnv.startsWith(\"VITE_\")\n ) {\n throw new RangeError(\n \"SpotPatch AI apiKeyEnv must be an uppercase non-VITE environment name.\",\n );\n }\n\n const models = resolveModels(provider.models);\n\n if (!(provider.defaultModel in models)) {\n throw new RangeError(\n \"SpotPatch AI provider defaultModel must reference a configured model.\",\n );\n }\n\n return [\n id,\n Object.freeze({\n id,\n type: provider.type,\n label: nonEmpty(provider.label, \"provider label\", 100),\n protocol: provider.protocol,\n authentication: provider.authentication ?? \"bearer\",\n baseURL: normalizeProviderBaseURL(provider.baseURL),\n apiKeyEnv: provider.apiKeyEnv,\n models,\n defaultModel: provider.defaultModel,\n } satisfies ResolvedOpenAICompatibleProviderOptions),\n ];\n }),\n ),\n );\n}\n\nfunction resolveChecks(\n checks: Readonly<Record<string, ParsedAgentCheck>> | undefined,\n defaultTimeoutMs: number,\n): Readonly<Record<string, ResolvedAgentCheckDefinition>> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(checks ?? {}).map(([id, check]) => {\n assertIdentifier(id, \"check id\");\n const timeoutMs = check.timeoutMs ?? defaultTimeoutMs;\n\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) {\n throw new RangeError(\"SpotPatch AI check timeout must be positive.\");\n }\n\n const args = Object.freeze(\n [...(check.args ?? [])].map((argument) =>\n nonEmpty(argument, \"check argument\", 4_096),\n ),\n );\n\n return [\n id,\n Object.freeze({\n id,\n label: nonEmpty(check.label, \"check label\", 100),\n command: nonEmpty(check.command, \"check command\", 1_024),\n args,\n required: check.required ?? true,\n timeoutMs,\n } satisfies ResolvedAgentCheckDefinition),\n ];\n }),\n ),\n );\n}\n\nfunction resolveAiOptions(\n options: SpotPatchAiOptions | undefined,\n): false | ResolvedAiOptions {\n if (options === undefined || options === false) {\n return false;\n }\n\n const expanded =\n \"providers\" in options\n ? options\n : (() => {\n const simple = simpleAiOptionsSchema.safeParse(options);\n\n if (!simple.success) {\n throw new RangeError(\"SpotPatch AI configuration is invalid.\");\n }\n\n const providerId = \"default\";\n const modelId = \"default\";\n\n return {\n providers: {\n [providerId]: {\n type: \"openai-compatible\",\n label: simple.data.providerLabel ?? \"AI provider\",\n protocol: simple.data.protocol ?? \"chat-completions\",\n authentication: simple.data.authentication ?? \"bearer\",\n baseURL: simple.data.baseURL,\n apiKeyEnv: simple.data.apiKeyEnv ?? \"SPOTPATCH_AI_API_KEY\",\n models: {\n [modelId]: {\n label: simple.data.modelLabel ?? \"AI model\",\n model: simple.data.model,\n },\n },\n defaultModel: modelId,\n },\n },\n defaultProvider: providerId,\n ...(simple.data.execution === undefined\n ? {}\n : { execution: simple.data.execution }),\n };\n })();\n const parsed = aiOptionsSchema.safeParse(expanded);\n\n if (!parsed.success) {\n throw new RangeError(\"SpotPatch AI configuration is invalid.\");\n }\n\n const validated = parsed.data;\n const limits = resolveLimits(validated.execution?.limits);\n const checks = resolveChecks(validated.execution?.checks, limits.checkTimeoutMs);\n const applyMode = validated.execution?.applyMode ?? \"review\";\n\n if (applyMode === \"auto\" && !Object.values(checks).some((check) => check.required)) {\n throw new RangeError(\"SpotPatch AI auto mode requires a required check.\");\n }\n\n const providers = resolveProviders(validated.providers);\n\n if (!(validated.defaultProvider in providers)) {\n throw new RangeError(\n \"SpotPatch AI defaultProvider must reference a configured provider.\",\n );\n }\n\n return Object.freeze({\n providers,\n defaultProvider: validated.defaultProvider,\n execution: Object.freeze({\n isolation: \"git-worktree\",\n applyMode,\n checks,\n limits,\n }),\n });\n}\n\nexport function createRuntimeAiConfig(\n options: false | ResolvedAiOptions,\n): RuntimeAiConfig {\n if (options === false) {\n return Object.freeze({ enabled: false });\n }\n\n return Object.freeze({\n enabled: true,\n defaultProvider: options.defaultProvider,\n applyMode: options.execution.applyMode,\n providers: Object.freeze(\n Object.values(options.providers).map((provider) =>\n Object.freeze({\n id: provider.id,\n label: provider.label,\n protocol: provider.protocol,\n defaultModel: provider.defaultModel,\n models: Object.freeze(\n Object.values(provider.models).map((model) =>\n Object.freeze({ id: model.id, label: model.label }),\n ),\n ),\n }),\n ),\n ),\n });\n}\n\nfunction assertPositiveBudget(budget: Readonly<ContextBudget>): void {\n for (const [name, value] of Object.entries(budget)) {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`SpotPatch budget ${name} must be a positive integer.`);\n }\n }\n}\n\nexport function resolveOptions(\n options: SpotPatchOptions = {},\n environmentAi?: false | SimpleAiOptions,\n): ResolvedSpotPatchOptions {\n const budget = Object.freeze({\n ...DEFAULT_OPTIONS.budget,\n ...options.budget,\n });\n\n assertPositiveBudget(budget);\n\n const maxTargets = options.maxTargets ?? DEFAULT_OPTIONS.maxTargets;\n const locale = options.locale ?? DEFAULT_OPTIONS.locale;\n const editor = options.editor ?? DEFAULT_OPTIONS.editor;\n\n if (!(SPOTPATCH_LOCALE_PREFERENCES as readonly string[]).includes(locale)) {\n throw new RangeError(\"SpotPatch locale must be auto, en-US, or zh-CN.\");\n }\n\n if (!(SPOTPATCH_EDITOR_PREFERENCES as readonly string[]).includes(editor)) {\n throw new RangeError(\"SpotPatch editor must be auto, vscode, or cursor.\");\n }\n\n if (\n !Number.isSafeInteger(maxTargets) ||\n maxTargets < 1 ||\n maxTargets > MAX_ANNOTATION_TARGETS\n ) {\n throw new RangeError(\n `SpotPatch maxTargets must be an integer between 1 and ${String(MAX_ANNOTATION_TARGETS)}.`,\n );\n }\n\n const resolved = {\n enabled: options.enabled ?? DEFAULT_OPTIONS.enabled,\n include: Object.freeze([...(options.include ?? DEFAULT_OPTIONS.include)]),\n exclude: Object.freeze([...(options.exclude ?? DEFAULT_OPTIONS.exclude)]),\n editor,\n redact: options.redact ?? DEFAULT_OPTIONS.redact,\n budget,\n shortcut: options.shortcut ?? DEFAULT_OPTIONS.shortcut,\n allowLan: options.allowLan ?? DEFAULT_OPTIONS.allowLan,\n debug: options.debug ?? DEFAULT_OPTIONS.debug,\n locale,\n maxTargets,\n ai: resolveAiOptions(options.ai ?? environmentAi),\n } satisfies ResolvedSpotPatchOptions;\n\n if (resolved.shortcut.trim().length === 0) {\n throw new RangeError(\"SpotPatch shortcut cannot be empty.\");\n }\n\n return Object.freeze(resolved);\n}\n","import path from \"node:path\";\n\nimport { createRandomSourceId, type SourceIdFactory } from \"./source-id.js\";\n\nexport interface SourceRegistry {\n register(absolutePath: string): string;\n resolve(fileId: string): string | undefined;\n clear(): void;\n}\n\ninterface SourceRegistryOptions {\n readonly createId?: SourceIdFactory;\n}\n\nfunction normalizeAbsolutePath(absolutePath: string): string {\n return path.normalize(path.resolve(absolutePath));\n}\n\nexport function createSourceRegistry(\n options: SourceRegistryOptions = {},\n): SourceRegistry {\n const createId = options.createId ?? createRandomSourceId;\n const pathToId = new Map<string, string>();\n const idToPath = new Map<string, string>();\n\n return Object.freeze({\n register(absolutePath: string): string {\n const normalizedPath = normalizeAbsolutePath(absolutePath);\n const existingId = pathToId.get(normalizedPath);\n\n if (existingId !== undefined) {\n return existingId;\n }\n\n let fileId = createId();\n\n while (idToPath.has(fileId)) {\n fileId = createId();\n }\n\n pathToId.set(normalizedPath, fileId);\n idToPath.set(fileId, normalizedPath);\n return fileId;\n },\n\n resolve(fileId: string): string | undefined {\n return idToPath.get(fileId);\n },\n\n clear(): void {\n pathToId.clear();\n idToPath.clear();\n },\n });\n}\n","import { randomBytes } from \"node:crypto\";\n\nconst SOURCE_ID_BYTES = 8;\n\nexport type SourceIdFactory = () => string;\n\nexport const createRandomSourceId: SourceIdFactory = () =>\n randomBytes(SOURCE_ID_BYTES).toString(\"base64url\");\n","import { createRequire } from \"node:module\";\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport packageMetadata from \"../../package.json\" with { type: \"json\" };\nimport { version as VITE_VERSION, type Plugin } from \"vite\";\n\nimport { createRuntimeAiConfig } from \"../options.js\";\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport type { SpotPatchSession } from \"../session/session.js\";\n\nexport const SPOTPATCH_CLIENT_MODULE_ID = \"virtual:spotpatch/client\";\nexport const RESOLVED_SPOTPATCH_CLIENT_MODULE_ID = `\\0${SPOTPATCH_CLIENT_MODULE_ID}`;\nexport const SPOTPATCH_REACT_ADAPTER_MODULE_ID = \"virtual:spotpatch/react-adapter\";\nexport const RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID = `\\0${SPOTPATCH_REACT_ADAPTER_MODULE_ID}`;\n\ninterface RuntimeInjectionPluginInput {\n readonly clientBundle?: string;\n readonly context: SpotPatchPluginContext;\n readonly reactAdapterBundle?: string;\n readonly session: SpotPatchSession;\n}\n\nfunction readRuntimeBundle(root: string, fileName: string): string {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const packageEntry = resolveFromProject.resolve(\"@spotpatch/vite\");\n const bundlePath = path.join(path.dirname(packageEntry), fileName);\n return readFileSync(bundlePath, \"utf8\");\n}\n\nfunction readConsumerViteVersion(root: string): string {\n try {\n const resolveFromProject = createRequire(path.join(root, \"package.json\"));\n const manifestPath = resolveFromProject.resolve(\"vite/package.json\");\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest === \"object\" &&\n manifest !== null &&\n \"version\" in manifest &&\n typeof manifest.version === \"string\"\n ) {\n return manifest.version;\n }\n } catch {\n // Vite itself remains the safe fallback if package metadata is not exported.\n }\n\n return VITE_VERSION;\n}\n\nfunction createClientModule(\n input: RuntimeInjectionPluginInput,\n clientBundle: string,\n viteVersion: string,\n): string {\n const options = input.context.getOptions();\n const runtimeConfig = {\n ai: createRuntimeAiConfig(options.ai),\n budget: options.budget,\n debug: options.debug,\n editor: options.editor,\n locale: options.locale,\n maxTargets: options.maxTargets,\n redact: options.redact,\n sessionToken: input.session.token,\n shortcut: options.shortcut,\n spotPatchVersion: packageMetadata.version,\n viteVersion,\n };\n\n return [\n `const __SPOTPATCH_RUNTIME_CONFIG__ = ${JSON.stringify(runtimeConfig)};`,\n clientBundle,\n ].join(\"\\n\");\n}\n\nexport function createRuntimeInjectionPlugin(\n input: RuntimeInjectionPluginInput,\n): Plugin {\n let root = process.cwd();\n let clientBundle = input.clientBundle;\n let viteVersion = VITE_VERSION;\n\n return {\n name: \"spotpatch:runtime-injection\",\n apply: \"serve\",\n enforce: \"pre\",\n\n configResolved(config) {\n root = path.resolve(config.root);\n viteVersion = readConsumerViteVersion(root);\n },\n\n resolveId(id, importer) {\n if (id === SPOTPATCH_CLIENT_MODULE_ID) {\n return RESOLVED_SPOTPATCH_CLIENT_MODULE_ID;\n }\n\n if (\n id === \"@spotpatch/react-adapter\" &&\n importer === RESOLVED_SPOTPATCH_CLIENT_MODULE_ID\n ) {\n return RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID;\n }\n\n return null;\n },\n\n load(id) {\n if (id === RESOLVED_SPOTPATCH_CLIENT_MODULE_ID) {\n clientBundle ??= readRuntimeBundle(root, \"runtime-client.js\");\n return createClientModule(input, clientBundle, viteVersion);\n }\n\n if (id === RESOLVED_SPOTPATCH_REACT_ADAPTER_MODULE_ID) {\n return (\n input.reactAdapterBundle ??\n readRuntimeBundle(root, \"runtime-react-adapter.js\")\n );\n }\n\n return null;\n },\n\n transformIndexHtml() {\n return [\n {\n tag: \"script\",\n attrs: {\n type: \"module\",\n src: `/@id/${SPOTPATCH_CLIENT_MODULE_ID}`,\n },\n injectTo: \"head\",\n },\n ];\n },\n };\n}\n","{\n \"name\": \"@spotpatch/vite\",\n \"version\": \"1.3.0\",\n \"description\": \"Vite development plugin for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/vite\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"vite\",\n \"react\",\n \"developer-tools\",\n \"ai-agent\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && tsup --config tsup.runtime-client.config.ts && tsup --config tsup.runtime-react-adapter.config.ts\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\"\n },\n \"dependencies\": {\n \"@rollup/pluginutils\": \"5.4.0\",\n \"@spotpatch/agent\": \"workspace:^\",\n \"@spotpatch/react-adapter\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"launch-editor\": \"2.14.1\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\",\n \"zod\": \"4.4.3\"\n },\n \"peerDependencies\": {\n \"vite\": \"^5.0.0 || ^6.0.0 || ^7.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","import path from \"node:path\";\n\nimport type { Plugin, ResolvedConfig } from \"vite\";\n\nimport { createAgentJobManager, type AgentJobManager } from \"../agent/job-manager.js\";\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport type { SpotPatchSession } from \"../session/session.js\";\nimport { createSpotPatchMiddleware } from \"./middleware.js\";\n\ninterface ServerPluginInput {\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n readonly session: SpotPatchSession;\n}\n\nexport function createServerPlugin(input: ServerPluginInput): Plugin {\n let agentManager: AgentJobManager | undefined;\n let config: ResolvedConfig | undefined;\n\n const closeResources = async (): Promise<void> => {\n input.registry.clear();\n await agentManager?.close();\n agentManager = undefined;\n };\n\n return {\n name: \"spotpatch:server\",\n apply: \"serve\",\n enforce: \"pre\",\n\n configResolved(resolvedConfig) {\n config = resolvedConfig;\n },\n\n configureServer(server) {\n if (config === undefined) {\n throw new Error(\"SpotPatch server initialized before Vite config resolution.\");\n }\n\n const root = path.resolve(config.root);\n const options = input.context.getOptions();\n agentManager =\n options.ai === false\n ? undefined\n : createAgentJobManager({\n ai: options.ai,\n environment: input.context.getCredentialEnvironment(),\n root,\n });\n\n server.middlewares.use(\n createSpotPatchMiddleware({\n ...(agentManager === undefined ? {} : { agentManager }),\n options,\n registry: input.registry,\n root,\n session: input.session,\n logger: config.logger,\n }),\n );\n\n server.httpServer?.once(\"close\", () => {\n void closeResources();\n });\n\n config.logger.info(\n `[spotpatch:vite] Ready. Toggle picker with ${options.shortcut}.`,\n );\n },\n\n async closeBundle() {\n await closeResources();\n },\n };\n}\n","import { createHash, randomBytes } from \"node:crypto\";\n\nimport {\n applyPreparedAgentChange,\n executeAgentChange,\n inspectAgentWorkspace,\n probeProviderCapability,\n resolveProviderCredential,\n revertPreparedAgentChange,\n type ExecuteAgentChangeOptions,\n type PreparedAgentChange,\n type ProviderCredential,\n} from \"@spotpatch/agent\";\nimport {\n ERROR_CODES,\n SpotPatchError,\n type AgentCapabilityRequest,\n type AgentCapabilitySnapshot,\n type AgentJobCreateRequest,\n type AgentJobEvent,\n type AgentJobResult,\n type AgentJobResultResponse,\n type AgentJobSnapshot,\n type AgentJobStatus,\n type AgentWorkspaceHealthSnapshot,\n type AgentWorkingTreeMode,\n type ErrorCode,\n type ResolvedAiModelProfile,\n type ResolvedAiOptions,\n type ResolvedOpenAICompatibleProviderOptions,\n type SpotAnnotation,\n} from \"@spotpatch/shared\";\n\nconst MAX_RETAINED_JOBS = 32;\nconst MAX_RETAINED_EVENTS = 512;\nconst JOB_ID_PATTERN = /^[A-Za-z0-9_-]{22,128}$/;\n\nconst ACTIVE_JOB_STATUSES = new Set<AgentJobStatus>([\n \"queued\",\n \"preparing\",\n \"running\",\n \"validating\",\n \"awaiting-review\",\n \"applying\",\n \"cancelling\",\n \"reverting\",\n]);\n\nconst CANCELLABLE_JOB_STATUSES = new Set<AgentJobStatus>([\n \"queued\",\n \"preparing\",\n \"running\",\n \"validating\",\n \"awaiting-review\",\n]);\n\nconst PRUNABLE_JOB_STATUSES = new Set<AgentJobStatus>([\n \"completed\",\n \"cancelled\",\n \"reverted\",\n \"failed\",\n]);\n\nexport type AgentJobEventListener = (event: AgentJobEvent) => void;\n\ninterface AgentSelection {\n readonly credential: ProviderCredential;\n readonly model: ResolvedAiModelProfile;\n readonly provider: ResolvedOpenAICompatibleProviderOptions;\n}\n\ninterface InternalAgentJob {\n readonly annotation: SpotAnnotation;\n readonly controller: AbortController;\n readonly createdAt: string;\n readonly credential: ProviderCredential;\n readonly events: AgentJobEvent[];\n readonly id: string;\n readonly listeners: Set<AgentJobEventListener>;\n readonly model: ResolvedAiModelProfile;\n readonly provider: ResolvedOpenAICompatibleProviderOptions;\n readonly workingTreeMode: AgentWorkingTreeMode;\n errorCode: ErrorCode | undefined;\n phaseMessage: string;\n preparedChange: PreparedAgentChange | undefined;\n result: AgentJobResult | undefined;\n runPromise: Promise<void> | undefined;\n sequence: number;\n status: AgentJobStatus;\n updatedAt: string;\n}\n\nexport interface AgentJobManager {\n apply(jobId: string): Promise<AgentJobSnapshot>;\n cancel(jobId: string): AgentJobSnapshot;\n close(): Promise<void>;\n create(request: AgentJobCreateRequest): AgentJobSnapshot;\n events(jobId: string): readonly AgentJobEvent[];\n probe(\n request: AgentCapabilityRequest,\n signal: AbortSignal,\n ): Promise<AgentCapabilitySnapshot>;\n result(jobId: string): AgentJobResultResponse;\n revert(jobId: string): Promise<AgentJobSnapshot>;\n subscribe(jobId: string, listener: AgentJobEventListener): () => void;\n workspaceHealth(signal: AbortSignal): Promise<AgentWorkspaceHealthSnapshot>;\n}\n\ninterface AgentJobManagerDependencies {\n readonly applyChange: typeof applyPreparedAgentChange;\n readonly createJobId: () => string;\n readonly executeChange: typeof executeAgentChange;\n readonly inspectWorkspace: typeof inspectAgentWorkspace;\n readonly now: () => string;\n readonly probeCapability: typeof probeProviderCapability;\n readonly resolveCredential: typeof resolveProviderCredential;\n readonly revertChange: typeof revertPreparedAgentChange;\n}\n\nexport interface CreateAgentJobManagerOptions {\n readonly ai: ResolvedAiOptions;\n readonly dependencies?: Partial<AgentJobManagerDependencies>;\n readonly environment?: Readonly<Record<string, string | undefined>>;\n readonly fetch?: typeof globalThis.fetch;\n readonly root: string;\n}\n\nconst DEFAULT_DEPENDENCIES: AgentJobManagerDependencies = Object.freeze({\n applyChange: applyPreparedAgentChange,\n createJobId: () => randomBytes(16).toString(\"base64url\"),\n executeChange: executeAgentChange,\n inspectWorkspace: inspectAgentWorkspace,\n now: () => new Date().toISOString(),\n probeCapability: probeProviderCapability,\n resolveCredential: resolveProviderCredential,\n revertChange: revertPreparedAgentChange,\n});\n\nfunction normalizeError(error: unknown): SpotPatchError {\n return error instanceof SpotPatchError\n ? error\n : new SpotPatchError(ERROR_CODES.INTERNAL_ERROR, undefined, { cause: error });\n}\n\nfunction isActive(status: AgentJobStatus): boolean {\n return ACTIVE_JOB_STATUSES.has(status);\n}\n\nfunction snapshot(job: InternalAgentJob): AgentJobSnapshot {\n const base = {\n jobId: job.id,\n status: job.status,\n providerProfileId: job.provider.id,\n providerLabel: job.provider.label,\n modelProfileId: job.model.id,\n modelLabel: job.model.label,\n phaseMessage: job.phaseMessage,\n createdAt: job.createdAt,\n updatedAt: job.updatedAt,\n canCancel: CANCELLABLE_JOB_STATUSES.has(job.status),\n canApply:\n job.status === \"awaiting-review\" &&\n job.preparedChange?.validationPassed === true &&\n job.result !== undefined &&\n job.result.diff.length > 0,\n canRevert: job.status === \"applied\",\n } as const;\n\n return Object.freeze(\n job.errorCode === undefined ? base : { ...base, errorCode: job.errorCode },\n );\n}\n\nfunction capabilityCacheKey(\n provider: ResolvedOpenAICompatibleProviderOptions,\n model: ResolvedAiModelProfile,\n): string {\n const configurationDigest = createHash(\"sha256\")\n .update(provider.baseURL)\n .update(\"\\0\")\n .update(provider.protocol)\n .update(\"\\0\")\n .update(provider.authentication)\n .digest(\"hex\");\n\n return `${provider.id}:${model.id}:${configurationDigest}`;\n}\n\nfunction freezeEvent<T extends AgentJobEvent>(event: T): T {\n return Object.freeze(event);\n}\n\nexport function createAgentJobManager(\n options: CreateAgentJobManagerOptions,\n): AgentJobManager {\n const dependencies = Object.freeze({\n ...DEFAULT_DEPENDENCIES,\n ...options.dependencies,\n });\n const jobs = new Map<string, InternalAgentJob>();\n const capabilityCache = new Map<string, AgentCapabilitySnapshot>();\n const providerConsents = new Set<string>();\n let closed = false;\n\n const resolveSelection = (\n providerProfileId: string,\n modelProfileId: string,\n ): AgentSelection => {\n const provider = options.ai.providers[providerProfileId];\n\n if (provider === undefined) {\n throw new SpotPatchError(ERROR_CODES.PROVIDER_NOT_CONFIGURED);\n }\n\n const model = provider.models[modelProfileId];\n\n if (model === undefined) {\n throw new SpotPatchError(ERROR_CODES.MODEL_NOT_ALLOWED);\n }\n\n const credential = dependencies.resolveCredential(\n provider.apiKeyEnv,\n options.environment,\n );\n\n return Object.freeze({ credential, model, provider });\n };\n\n const requireJob = (jobId: string): InternalAgentJob => {\n if (!JOB_ID_PATTERN.test(jobId)) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const job = jobs.get(jobId);\n\n if (job === undefined) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return job;\n };\n\n const appendEvent = (job: InternalAgentJob, event: AgentJobEvent): void => {\n job.events.push(event);\n\n if (job.events.length > MAX_RETAINED_EVENTS) {\n job.events.splice(0, job.events.length - MAX_RETAINED_EVENTS);\n }\n\n for (const listener of job.listeners) {\n listener(event);\n }\n };\n\n const eventBase = (job: InternalAgentJob) => {\n job.sequence += 1;\n return {\n schemaVersion: 1 as const,\n sequence: job.sequence,\n jobId: job.id,\n status: job.status,\n timestamp: dependencies.now(),\n };\n };\n\n const emitSnapshot = (job: InternalAgentJob): void => {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"snapshot\",\n data: Object.freeze({ snapshot: snapshot(job) }),\n }),\n );\n };\n\n const emitPhase = (job: InternalAgentJob, message: string): void => {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"phase\",\n data: Object.freeze({ message }),\n }),\n );\n };\n\n const emitError = (job: InternalAgentJob, code: ErrorCode): void => {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"error\",\n data: Object.freeze({ code, message: \"The Agent job failed.\" }),\n }),\n );\n };\n\n const transition = (\n job: InternalAgentJob,\n status: AgentJobStatus,\n phaseMessage: string,\n errorCode?: ErrorCode,\n ): void => {\n job.status = status;\n job.phaseMessage = phaseMessage;\n job.errorCode = errorCode;\n job.updatedAt = dependencies.now();\n emitSnapshot(job);\n emitPhase(job, phaseMessage);\n };\n\n const probeResolved = async (\n selection: AgentSelection,\n signal: AbortSignal,\n ): Promise<AgentCapabilitySnapshot> => {\n const key = capabilityCacheKey(selection.provider, selection.model);\n const cached = capabilityCache.get(key);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const capability = await dependencies.probeCapability({\n provider: selection.provider,\n modelProfileId: selection.model.id,\n limits: options.ai.execution.limits,\n credential: selection.credential,\n signal,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n\n if (capability.state !== \"agent-ready\") {\n throw new SpotPatchError(ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED);\n }\n\n capabilityCache.set(key, capability);\n return capability;\n };\n\n const finishWithError = (job: InternalAgentJob, error: unknown): void => {\n const normalized = normalizeError(error);\n const cancelled =\n job.controller.signal.aborted || normalized.code === ERROR_CODES.AGENT_CANCELLED;\n\n transition(\n job,\n cancelled ? \"cancelled\" : \"failed\",\n cancelled ? \"Agent job cancelled.\" : \"Agent job failed.\",\n cancelled ? ERROR_CODES.AGENT_CANCELLED : normalized.code,\n );\n\n if (!cancelled) {\n emitError(job, normalized.code);\n }\n };\n\n const applyChange = async (\n job: InternalAgentJob,\n preparedChange: PreparedAgentChange,\n ): Promise<void> => {\n transition(job, \"applying\", \"Applying validated changes to the project.\");\n\n try {\n await dependencies.applyChange(preparedChange);\n transition(job, \"applied\", \"Changes were applied to local project files.\");\n } catch (error: unknown) {\n const normalized = normalizeError(error);\n transition(job, \"failed\", \"Agent change could not be applied.\", normalized.code);\n emitError(job, normalized.code);\n throw normalized;\n }\n };\n\n const runJob = async (job: InternalAgentJob): Promise<void> => {\n try {\n transition(job, \"preparing\", \"Verifying provider and model capabilities.\");\n await probeResolved(\n Object.freeze({\n credential: job.credential,\n model: job.model,\n provider: job.provider,\n }),\n job.controller.signal,\n );\n\n const callbacks: NonNullable<ExecuteAgentChangeOptions[\"callbacks\"]> = {\n onCheck(result) {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"check\",\n data: Object.freeze({ result }),\n }),\n );\n },\n onPhase(event) {\n transition(job, event.phase, event.message);\n },\n onTool(event) {\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"tool\",\n data: Object.freeze({ ...event }),\n }),\n );\n },\n };\n const preparedChange = await dependencies.executeChange({\n annotation: job.annotation,\n callbacks,\n credential: job.credential,\n execution: options.ai.execution,\n jobId: job.id,\n model: job.model,\n provider: job.provider,\n root: options.root,\n signal: job.controller.signal,\n workingTreeMode: job.workingTreeMode,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n job.preparedChange = preparedChange;\n job.result = preparedChange.result;\n appendEvent(\n job,\n freezeEvent({\n ...eventBase(job),\n type: \"result-ready\",\n data: Object.freeze({ hasResult: true as const }),\n }),\n );\n\n if (!preparedChange.validationPassed) {\n transition(\n job,\n \"failed\",\n \"Required validation checks failed.\",\n ERROR_CODES.VALIDATION_FAILED,\n );\n emitError(job, ERROR_CODES.VALIDATION_FAILED);\n return;\n }\n\n if (preparedChange.result.diff.length === 0) {\n transition(job, \"completed\", \"No source changes were proposed.\");\n return;\n }\n\n if (\n options.ai.execution.applyMode === \"auto\" &&\n preparedChange.autoApplyEligible\n ) {\n try {\n await applyChange(job, preparedChange);\n } catch {\n // applyChange already records the stable public failure on the Job.\n }\n return;\n }\n\n transition(job, \"awaiting-review\", \"Validated changes are ready for review.\");\n } catch (error: unknown) {\n finishWithError(job, error);\n }\n };\n\n const hasActiveJob = (excludedJobId?: string): boolean =>\n [...jobs.values()].some((job) => job.id !== excludedJobId && isActive(job.status));\n\n const pruneJobs = (): void => {\n if (jobs.size < MAX_RETAINED_JOBS) {\n return;\n }\n\n for (const [jobId, job] of jobs) {\n if (PRUNABLE_JOB_STATUSES.has(job.status)) {\n jobs.delete(jobId);\n }\n\n if (jobs.size < MAX_RETAINED_JOBS) {\n return;\n }\n }\n };\n\n return Object.freeze({\n async apply(jobId) {\n const job = requireJob(jobId);\n\n if (\n job.status !== \"awaiting-review\" ||\n job.preparedChange === undefined ||\n !job.preparedChange.validationPassed ||\n job.result?.diff.length === 0\n ) {\n throw new SpotPatchError(ERROR_CODES.PATCH_REJECTED);\n }\n\n await applyChange(job, job.preparedChange);\n return snapshot(job);\n },\n\n cancel(jobId) {\n const job = requireJob(jobId);\n\n if (!CANCELLABLE_JOB_STATUSES.has(job.status)) {\n return snapshot(job);\n }\n\n if (job.status === \"awaiting-review\") {\n job.preparedChange = undefined;\n job.controller.abort(\"agent-review-cancelled\");\n transition(\n job,\n \"cancelled\",\n \"Agent review was closed without applying changes.\",\n ERROR_CODES.AGENT_CANCELLED,\n );\n return snapshot(job);\n }\n\n transition(job, \"cancelling\", \"Cancelling Agent job.\");\n job.controller.abort(\"agent-job-cancelled\");\n return snapshot(job);\n },\n\n async close() {\n if (closed) {\n return;\n }\n\n closed = true;\n\n for (const job of jobs.values()) {\n if (CANCELLABLE_JOB_STATUSES.has(job.status)) {\n job.controller.abort(\"vite-server-closed\");\n }\n }\n\n await Promise.allSettled(\n [...jobs.values()]\n .map((job) => job.runPromise)\n .filter((promise): promise is Promise<void> => promise !== undefined),\n );\n capabilityCache.clear();\n providerConsents.clear();\n jobs.clear();\n },\n\n create(request) {\n if (closed) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n if (hasActiveJob()) {\n throw new SpotPatchError(ERROR_CODES.AGENT_BUSY);\n }\n\n pruneJobs();\n\n if (jobs.size >= MAX_RETAINED_JOBS) {\n throw new SpotPatchError(ERROR_CODES.AGENT_BUSY);\n }\n\n const selection = resolveSelection(\n request.providerProfileId,\n request.modelProfileId,\n );\n providerConsents.add(selection.provider.id);\n const id = dependencies.createJobId();\n\n if (!JOB_ID_PATTERN.test(id) || jobs.has(id)) {\n throw new SpotPatchError(ERROR_CODES.INTERNAL_ERROR);\n }\n\n const timestamp = dependencies.now();\n const job: InternalAgentJob = {\n annotation: request.annotation,\n controller: new AbortController(),\n createdAt: timestamp,\n credential: selection.credential,\n errorCode: undefined,\n events: [],\n id,\n listeners: new Set(),\n model: selection.model,\n phaseMessage: \"Agent job queued.\",\n preparedChange: undefined,\n provider: selection.provider,\n result: undefined,\n runPromise: undefined,\n sequence: 0,\n status: \"queued\",\n updatedAt: timestamp,\n workingTreeMode: request.workingTreeMode,\n };\n jobs.set(id, job);\n emitSnapshot(job);\n emitPhase(job, job.phaseMessage);\n job.runPromise = Promise.resolve().then(async () => runJob(job));\n return snapshot(job);\n },\n\n events(jobId) {\n return Object.freeze([...requireJob(jobId).events]);\n },\n\n async probe(request, signal) {\n if (closed) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n return probeResolved(\n resolveSelection(request.providerProfileId, request.modelProfileId),\n signal,\n );\n },\n\n result(jobId) {\n const job = requireJob(jobId);\n const response =\n job.result === undefined\n ? { snapshot: snapshot(job) }\n : { snapshot: snapshot(job), result: job.result };\n return Object.freeze(response);\n },\n\n async revert(jobId) {\n const job = requireJob(jobId);\n\n if (\n job.status !== \"applied\" ||\n job.preparedChange === undefined ||\n hasActiveJob(job.id)\n ) {\n throw new SpotPatchError(\n hasActiveJob(job.id) ? ERROR_CODES.AGENT_BUSY : ERROR_CODES.APPLY_CONFLICT,\n );\n }\n\n transition(job, \"reverting\", \"Reverting the applied Agent change.\");\n\n try {\n await dependencies.revertChange(job.preparedChange);\n transition(job, \"reverted\", \"The Agent change was safely reverted.\");\n } catch (error: unknown) {\n const normalized = normalizeError(error);\n transition(\n job,\n \"applied\",\n \"Revert was rejected because project files changed.\",\n normalized.code,\n );\n emitError(job, normalized.code);\n throw normalized;\n }\n\n return snapshot(job);\n },\n\n subscribe(jobId, listener) {\n const job = requireJob(jobId);\n job.listeners.add(listener);\n return () => {\n job.listeners.delete(listener);\n };\n },\n\n workspaceHealth(signal) {\n if (closed) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n return dependencies.inspectWorkspace(options.root, signal);\n },\n } satisfies AgentJobManager);\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n ERROR_CODES,\n SPOTPATCH_API_BASE,\n SPOTPATCH_ENDPOINTS,\n SpotPatchError,\n openEditorRequestSchema,\n sourceContextRequestSchema,\n type ApiFailure,\n type ApiSuccess,\n type CodeContext,\n type EditorOpenResult,\n type ErrorCode,\n} from \"@spotpatch/shared\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport type { SpotPatchSession } from \"../session/session.js\";\nimport type { AgentJobManager } from \"../agent/job-manager.js\";\nimport { handleAgentRequest, matchAgentRequestPath } from \"./agent-http.js\";\nimport { type EditorLauncher, launchConfiguredEditor } from \"./editor.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { assertRequestAuthorized } from \"./request-security.js\";\nimport { readSourceContext } from \"./source-context.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\nexport type SpotPatchNext = (error?: unknown) => void;\nexport type SpotPatchMiddleware = (\n request: IncomingMessage,\n response: ServerResponse,\n next: SpotPatchNext,\n) => void;\n\nexport interface SpotPatchServerLogger {\n warn(message: string): void;\n}\n\nexport interface CreateMiddlewareOptions {\n readonly agentManager?: AgentJobManager;\n readonly editorLauncher?: EditorLauncher;\n readonly logger?: SpotPatchServerLogger;\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly root: string;\n readonly session: SpotPatchSession;\n}\n\nconst STATUS_BY_ERROR = Object.freeze({\n [ERROR_CODES.INVALID_REQUEST]: 400,\n [ERROR_CODES.INVALID_TOKEN]: 401,\n [ERROR_CODES.ORIGIN_NOT_ALLOWED]: 403,\n [ERROR_CODES.SOURCE_NOT_FOUND]: 404,\n [ERROR_CODES.SOURCE_OUTSIDE_ROOT]: 403,\n [ERROR_CODES.SOURCE_TOO_LARGE]: 413,\n [ERROR_CODES.EDITOR_OPEN_FAILED]: 500,\n [ERROR_CODES.AI_DISABLED]: 404,\n [ERROR_CODES.PROVIDER_NOT_CONFIGURED]: 503,\n [ERROR_CODES.PROVIDER_AUTH_FAILED]: 502,\n [ERROR_CODES.PROVIDER_PROTOCOL_UNSUPPORTED]: 502,\n [ERROR_CODES.MODEL_NOT_ALLOWED]: 400,\n [ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED]: 422,\n [ERROR_CODES.PROVIDER_RATE_LIMITED]: 429,\n [ERROR_CODES.AGENT_BUSY]: 409,\n [ERROR_CODES.AGENT_LIMIT_EXCEEDED]: 413,\n [ERROR_CODES.AGENT_CANCELLED]: 409,\n [ERROR_CODES.WORKTREE_DIRTY]: 409,\n [ERROR_CODES.WORKTREE_NOT_REPOSITORY]: 409,\n [ERROR_CODES.WORKTREE_OPERATION_IN_PROGRESS]: 409,\n [ERROR_CODES.WORKTREE_CONFLICTED]: 409,\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_TOO_LARGE]: 413,\n [ERROR_CODES.WORKTREE_UNTRACKED_UNSUPPORTED]: 409,\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_UNSUPPORTED]: 409,\n [ERROR_CODES.TOOL_DENIED]: 403,\n [ERROR_CODES.TOOL_INPUT_INVALID]: 422,\n [ERROR_CODES.TOOL_PATH_DENIED]: 403,\n [ERROR_CODES.PATCH_REJECTED]: 422,\n [ERROR_CODES.VALIDATION_FAILED]: 422,\n [ERROR_CODES.APPLY_CONFLICT]: 409,\n [ERROR_CODES.INTERNAL_ERROR]: 500,\n} satisfies Record<ErrorCode, number>);\n\nconst PUBLIC_MESSAGES = Object.freeze({\n [ERROR_CODES.INVALID_REQUEST]: \"The request is invalid.\",\n [ERROR_CODES.INVALID_TOKEN]: \"The session token is invalid.\",\n [ERROR_CODES.ORIGIN_NOT_ALLOWED]: \"The request origin is not allowed.\",\n [ERROR_CODES.SOURCE_NOT_FOUND]: \"The source file is unavailable.\",\n [ERROR_CODES.SOURCE_OUTSIDE_ROOT]: \"The source file is outside the project root.\",\n [ERROR_CODES.SOURCE_TOO_LARGE]: \"The source file exceeds the size limit.\",\n [ERROR_CODES.EDITOR_OPEN_FAILED]: \"The editor request could not be started.\",\n [ERROR_CODES.AI_DISABLED]: \"AI execution is not enabled.\",\n [ERROR_CODES.PROVIDER_NOT_CONFIGURED]: \"The AI provider is unavailable.\",\n [ERROR_CODES.PROVIDER_AUTH_FAILED]: \"The AI provider rejected authentication.\",\n [ERROR_CODES.PROVIDER_PROTOCOL_UNSUPPORTED]:\n \"The AI provider protocol is unsupported.\",\n [ERROR_CODES.MODEL_NOT_ALLOWED]: \"The selected model is not allowed.\",\n [ERROR_CODES.MODEL_TOOL_CALL_UNSUPPORTED]:\n \"The selected model cannot run SpotPatch tools.\",\n [ERROR_CODES.PROVIDER_RATE_LIMITED]: \"The AI provider is rate limited.\",\n [ERROR_CODES.AGENT_BUSY]: \"Another Agent job is already running.\",\n [ERROR_CODES.AGENT_LIMIT_EXCEEDED]: \"The Agent job exceeded a safety limit.\",\n [ERROR_CODES.AGENT_CANCELLED]: \"The Agent job was cancelled.\",\n [ERROR_CODES.WORKTREE_DIRTY]: \"Local changes require explicit inclusion consent.\",\n [ERROR_CODES.WORKTREE_NOT_REPOSITORY]: \"The project root is not a Git repository.\",\n [ERROR_CODES.WORKTREE_OPERATION_IN_PROGRESS]:\n \"A Git operation is currently in progress.\",\n [ERROR_CODES.WORKTREE_CONFLICTED]:\n \"The local workspace contains unresolved merge conflicts.\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_TOO_LARGE]:\n \"The local workspace exceeds the safe isolation size limit.\",\n [ERROR_CODES.WORKTREE_UNTRACKED_UNSUPPORTED]:\n \"An untracked path cannot be isolated safely.\",\n [ERROR_CODES.WORKTREE_LOCAL_CHANGES_UNSUPPORTED]:\n \"The local workspace state cannot be isolated safely.\",\n [ERROR_CODES.TOOL_DENIED]: \"The Agent tool request was denied.\",\n [ERROR_CODES.TOOL_INPUT_INVALID]: \"The Agent tool input was invalid.\",\n [ERROR_CODES.TOOL_PATH_DENIED]: \"The Agent tool path was denied.\",\n [ERROR_CODES.PATCH_REJECTED]: \"The proposed patch was rejected.\",\n [ERROR_CODES.VALIDATION_FAILED]: \"The proposed change failed validation.\",\n [ERROR_CODES.APPLY_CONFLICT]: \"The change conflicts with the current worktree.\",\n [ERROR_CODES.INTERNAL_ERROR]: \"The request could not be completed.\",\n} satisfies Record<ErrorCode, string>);\n\nfunction writeJson<T>(\n response: ServerResponse,\n status: number,\n payload: ApiSuccess<T> | ApiFailure,\n): void {\n response.statusCode = status;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.end(JSON.stringify(payload));\n}\n\nfunction asSpotPatchError(error: unknown): SpotPatchError {\n return error instanceof SpotPatchError\n ? error\n : new SpotPatchError(ERROR_CODES.INTERNAL_ERROR, undefined, { cause: error });\n}\n\nfunction writeError(\n response: ServerResponse,\n error: unknown,\n logger: SpotPatchServerLogger | undefined,\n): void {\n const normalized = asSpotPatchError(error);\n\n if (normalized.code === ERROR_CODES.INTERNAL_ERROR) {\n logger?.warn(\"[spotpatch:server] Internal request failure.\");\n }\n\n writeJson(response, STATUS_BY_ERROR[normalized.code], {\n ok: false,\n error: {\n code: normalized.code,\n message: PUBLIC_MESSAGES[normalized.code],\n },\n });\n}\n\nfunction requestPath(request: IncomingMessage): string {\n try {\n return new URL(request.url ?? \"/\", \"http://spotpatch.invalid\").pathname;\n } catch {\n return \"\";\n }\n}\n\nasync function handleSourceContext(\n request: IncomingMessage,\n options: CreateMiddlewareOptions,\n): Promise<CodeContext> {\n const parsed = sourceContextRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return readSourceContext({\n request: parsed.data,\n registry: options.registry,\n root: options.root,\n maxCharacters: options.options.budget.codeCharacters,\n maxLines: options.options.budget.maxCodeLines,\n });\n}\n\nasync function handleOpenEditor(\n request: IncomingMessage,\n options: CreateMiddlewareOptions,\n): Promise<EditorOpenResult> {\n const parsed = openEditorRequestSchema.safeParse(await readJsonRequestBody(request));\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const body = parsed.data;\n const sourcePath = await resolveSourceFile({\n fileId: body.fileId,\n registry: options.registry,\n root: options.root,\n });\n const target = `${sourcePath}:${String(body.line)}:${String(body.column)}`;\n const editorLauncher = options.editorLauncher ?? launchConfiguredEditor;\n\n try {\n const editor = await editorLauncher(target, options.options.editor);\n return Object.freeze({ editor });\n } catch (error: unknown) {\n options.logger?.warn(\n `[spotpatch:server] ${options.options.editor === \"auto\" ? \"The detected editor\" : options.options.editor} rejected an editor request.`,\n );\n throw new SpotPatchError(ERROR_CODES.EDITOR_OPEN_FAILED, undefined, {\n cause: error,\n });\n }\n}\n\nexport function createSpotPatchMiddleware(\n options: CreateMiddlewareOptions,\n): SpotPatchMiddleware {\n return (request, response, next) => {\n const path = requestPath(request);\n const agentRoute = matchAgentRequestPath(path);\n\n if (\n path !== SPOTPATCH_ENDPOINTS.sourceContext &&\n path !== SPOTPATCH_ENDPOINTS.openEditor &&\n agentRoute === undefined &&\n !path.startsWith(`${SPOTPATCH_API_BASE}/`)\n ) {\n next();\n return;\n }\n\n const handle = async (): Promise<void> => {\n assertRequestAuthorized(request, {\n allowLan: options.options.allowLan,\n sessionToken: options.session.token,\n });\n\n if (path === SPOTPATCH_ENDPOINTS.sourceContext) {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const data = await handleSourceContext(request, options);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (path === SPOTPATCH_ENDPOINTS.openEditor) {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const data = await handleOpenEditor(request, options);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (agentRoute === undefined) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n await handleAgentRequest(\n request,\n response,\n options,\n agentRoute,\n (target, status, data) => {\n writeJson(target, status, { ok: true, data });\n },\n );\n };\n\n void handle().catch((error: unknown) => {\n writeError(response, error, options.logger);\n });\n };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n ERROR_CODES,\n SPOTPATCH_ENDPOINTS,\n SpotPatchError,\n agentCapabilityRequestSchema,\n agentJobActionRequestSchema,\n agentJobCreateRequestSchema,\n agentWorkspaceHealthRequestSchema,\n type AgentJobAction,\n type AgentJobEvent,\n type AgentJobStatus,\n} from \"@spotpatch/shared\";\n\nimport type { AgentJobManager } from \"../agent/job-manager.js\";\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { authorizeAgentJobRequest } from \"./agent-request.js\";\nimport { MAX_AGENT_REQUEST_BODY_BYTES } from \"./constants.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\n\ninterface AgentJobRoute {\n readonly action: AgentJobAction;\n readonly jobId: string;\n readonly kind: \"job-action\";\n}\n\nexport type AgentRequestRoute =\n | Readonly<{ kind: \"capability\" }>\n | Readonly<{ kind: \"workspace-health\" }>\n | Readonly<{ kind: \"create-job\" }>\n | AgentJobRoute;\n\nexport interface AgentHttpOptions {\n readonly agentManager?: AgentJobManager;\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly root: string;\n}\n\nexport type WriteAgentSuccess = (\n response: ServerResponse,\n status: number,\n data: unknown,\n) => void;\n\nconst AGENT_JOB_ID_PATTERN = /^[A-Za-z0-9_-]{22,128}$/;\nconst AGENT_JOB_ACTIONS = new Set<AgentJobAction>([\n \"events\",\n \"result\",\n \"cancel\",\n \"apply\",\n \"revert\",\n]);\nconst EVENT_STREAM_END_STATUSES = new Set<AgentJobStatus>([\n \"awaiting-review\",\n \"applied\",\n \"completed\",\n \"cancelled\",\n \"reverted\",\n \"failed\",\n]);\n\nexport function matchAgentRequestPath(path: string): AgentRequestRoute | undefined {\n if (path === SPOTPATCH_ENDPOINTS.agentCapability) {\n return Object.freeze({ kind: \"capability\" });\n }\n\n if (path === SPOTPATCH_ENDPOINTS.agentWorkspaceHealth) {\n return Object.freeze({ kind: \"workspace-health\" });\n }\n\n if (path === SPOTPATCH_ENDPOINTS.agentJobs) {\n return Object.freeze({ kind: \"create-job\" });\n }\n\n const prefix = `${SPOTPATCH_ENDPOINTS.agentJobs}/`;\n\n if (!path.startsWith(prefix)) {\n return undefined;\n }\n\n const segments = path.slice(prefix.length).split(\"/\");\n const jobId = segments[0];\n const action = segments[1];\n\n if (\n segments.length !== 2 ||\n jobId === undefined ||\n !AGENT_JOB_ID_PATTERN.test(jobId) ||\n action === undefined ||\n !AGENT_JOB_ACTIONS.has(action as AgentJobAction)\n ) {\n return undefined;\n }\n\n return Object.freeze({\n kind: \"job-action\",\n action: action as AgentJobAction,\n jobId,\n });\n}\n\nfunction requireAgentManager(options: AgentHttpOptions): AgentJobManager {\n if (options.agentManager === undefined || options.options.ai === false) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n return options.agentManager;\n}\n\nfunction writeNdjsonEvent(response: ServerResponse, event: AgentJobEvent): void {\n response.write(`${JSON.stringify(event)}\\n`);\n}\n\nfunction streamAgentJobEvents(\n response: ServerResponse,\n manager: AgentJobManager,\n jobId: string,\n): void {\n const events = manager.events(jobId);\n const current = manager.result(jobId).snapshot;\n response.statusCode = 200;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/x-ndjson; charset=utf-8\");\n response.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n\n for (const event of events) {\n writeNdjsonEvent(response, event);\n }\n\n if (EVENT_STREAM_END_STATUSES.has(current.status)) {\n response.end();\n return;\n }\n\n let settled = false;\n let unsubscribe = (): void => undefined;\n const heartbeat = setInterval(() => {\n if (!settled) {\n response.write(\"\\n\");\n }\n }, 15_000);\n heartbeat.unref();\n const cleanup = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearInterval(heartbeat);\n unsubscribe();\n };\n unsubscribe = manager.subscribe(jobId, (event) => {\n if (settled) {\n return;\n }\n\n writeNdjsonEvent(response, event);\n\n if (\n event.type === \"snapshot\" &&\n EVENT_STREAM_END_STATUSES.has(event.data.snapshot.status)\n ) {\n cleanup();\n response.end();\n }\n });\n response.once(\"close\", cleanup);\n response.once(\"error\", cleanup);\n}\n\nasync function handleCapability(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const parsed = agentCapabilityRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const controller = new AbortController();\n const abort = (): void => {\n controller.abort(\"agent-capability-client-disconnected\");\n };\n response.once(\"close\", abort);\n\n try {\n const data = await requireAgentManager(options).probe(\n parsed.data,\n controller.signal,\n );\n writeSuccess(response, 200, data);\n } finally {\n response.removeListener(\"close\", abort);\n }\n}\n\nasync function handleCreateJob(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const parsed = agentJobCreateRequestSchema.safeParse(\n await readJsonRequestBody(request, MAX_AGENT_REQUEST_BODY_BYTES),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const authorizedRequest = await authorizeAgentJobRequest({\n request: parsed.data,\n options: options.options,\n registry: options.registry,\n root: options.root,\n });\n const data = requireAgentManager(options).create(authorizedRequest);\n writeSuccess(response, 202, data);\n}\n\nasync function handleWorkspaceHealth(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const parsed = agentWorkspaceHealthRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const controller = new AbortController();\n const abort = (): void => {\n controller.abort(\"agent-workspace-health-client-disconnected\");\n };\n response.once(\"close\", abort);\n\n try {\n const data = await requireAgentManager(options).workspaceHealth(controller.signal);\n writeSuccess(response, 200, data);\n } finally {\n response.removeListener(\"close\", abort);\n }\n}\n\nasync function handleJobAction(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n route: AgentJobRoute,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n const manager = requireAgentManager(options);\n\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const parsed = agentJobActionRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n if (route.action === \"events\") {\n streamAgentJobEvents(response, manager, route.jobId);\n return;\n }\n\n if (route.action === \"result\") {\n writeSuccess(response, 200, manager.result(route.jobId));\n return;\n }\n\n const data =\n route.action === \"cancel\"\n ? manager.cancel(route.jobId)\n : route.action === \"apply\"\n ? await manager.apply(route.jobId)\n : await manager.revert(route.jobId);\n writeSuccess(response, 200, data);\n}\n\nexport async function handleAgentRequest(\n request: IncomingMessage,\n response: ServerResponse,\n options: AgentHttpOptions,\n route: AgentRequestRoute,\n writeSuccess: WriteAgentSuccess,\n): Promise<void> {\n if (route.kind === \"capability\") {\n await handleCapability(request, response, options, writeSuccess);\n return;\n }\n\n if (route.kind === \"create-job\") {\n await handleCreateJob(request, response, options, writeSuccess);\n return;\n }\n\n if (route.kind === \"workspace-health\") {\n await handleWorkspaceHealth(request, response, options, writeSuccess);\n return;\n }\n\n await handleJobAction(request, response, options, route, writeSuccess);\n}\n","import { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n ERROR_CODES,\n SpotPatchError,\n type AgentJobCreateRequest,\n type MatchedStyleRule,\n type SourceRef,\n type SpotAnnotation,\n type SpotTargetContext,\n} from \"@spotpatch/shared\";\nimport type { agentJobCreateRequestSchema } from \"@spotpatch/shared\";\nimport type { z } from \"zod\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { readSourceContext } from \"./source-context.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\nexport interface AuthorizeAgentJobRequestOptions {\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly request: z.output<typeof agentJobCreateRequestSchema>;\n readonly root: string;\n}\n\ntype ParsedAgentJobRequest = AuthorizeAgentJobRequestOptions[\"request\"];\ntype ParsedTarget = ParsedAgentJobRequest[\"annotation\"][\"targets\"][number];\n\nfunction compactSourceRef(source: ParsedTarget[\"source\"]): SourceRef {\n return Object.freeze({\n origin: source.origin,\n confidence: source.confidence,\n ...(source.fileId === undefined ? {} : { fileId: source.fileId }),\n ...(source.relativePath === undefined ? {} : { relativePath: source.relativePath }),\n ...(source.line === undefined ? {} : { line: source.line }),\n ...(source.column === undefined ? {} : { column: source.column }),\n });\n}\n\nasync function authorizeSourceRef(\n source: ParsedTarget[\"source\"],\n registry: SourceRegistry,\n root: string,\n): Promise<SourceRef> {\n const markerOrigin = source.origin === \"jsx-host\" || source.origin === \"dom-ancestor\";\n\n if (\n markerOrigin &&\n (source.fileId === undefined ||\n source.line === undefined ||\n source.column === undefined)\n ) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n if (source.fileId === undefined) {\n if (source.origin === \"none\" && source.relativePath !== undefined) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return compactSourceRef(source);\n }\n\n const sourcePath = await resolveSourceFile({\n fileId: source.fileId,\n registry,\n root,\n });\n const relativePath = path\n .relative(await realpath(root), sourcePath)\n .split(path.sep)\n .join(\"/\");\n\n if (source.relativePath !== undefined && source.relativePath !== relativePath) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return Object.freeze({\n ...compactSourceRef(source),\n relativePath,\n });\n}\n\nfunction freezeMatchedRule(\n rule: ParsedTarget[\"styles\"][\"matchedRules\"][number],\n): MatchedStyleRule {\n return Object.freeze({\n selector: rule.selector,\n declarations: rule.declarations,\n ...(rule.source === undefined ? {} : { source: rule.source }),\n ...(rule.media === undefined ? {} : { media: rule.media }),\n });\n}\n\nfunction targetIdentity(target: ParsedTarget): string {\n const source = target.source;\n\n if (\n source.fileId !== undefined &&\n source.line !== undefined &&\n source.column !== undefined\n ) {\n return `source:${source.fileId}:${String(source.line)}:${String(source.column)}`;\n }\n\n return [\n \"element\",\n source.origin,\n source.relativePath ?? \"\",\n target.element.selector,\n target.element.sanitizedHtml,\n ].join(\"\\0\");\n}\n\nasync function authorizeTarget(\n target: ParsedTarget,\n input: AuthorizeAgentJobRequestOptions,\n): Promise<SpotTargetContext> {\n const source = await authorizeSourceRef(target.source, input.registry, input.root);\n const reactSourceInput = target.react.source;\n const reactSource =\n reactSourceInput === undefined\n ? undefined\n : await authorizeSourceRef(reactSourceInput, input.registry, input.root);\n const marker =\n source.fileId === undefined ||\n source.line === undefined ||\n source.column === undefined\n ? undefined\n : Object.freeze({\n fileId: source.fileId,\n line: source.line,\n column: source.column,\n maxLines: input.options.budget.maxCodeLines,\n });\n\n if (marker === undefined && target.code !== undefined) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const code =\n marker === undefined\n ? undefined\n : await readSourceContext({\n request: marker,\n registry: input.registry,\n root: input.root,\n maxCharacters: input.options.budget.codeCharacters,\n maxLines: input.options.budget.maxCodeLines,\n });\n\n if (target.code !== undefined && target.code.relativePath !== code?.relativePath) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return Object.freeze({\n instruction: target.instruction,\n source,\n react: Object.freeze({\n supported: target.react.supported,\n ...(target.react.version === undefined ? {} : { version: target.react.version }),\n ...(target.react.componentName === undefined\n ? {}\n : { componentName: target.react.componentName }),\n componentStack: Object.freeze([...target.react.componentStack]),\n ...(reactSource === undefined ? {} : { source: reactSource }),\n }),\n element: Object.freeze({\n tagName: target.element.tagName,\n selector: target.element.selector,\n sanitizedHtml: target.element.sanitizedHtml,\n ...(target.element.textPreview === undefined\n ? {}\n : { textPreview: target.element.textPreview }),\n ...(target.element.role === undefined ? {} : { role: target.element.role }),\n rect: Object.freeze({ ...target.element.rect }),\n }),\n styles: Object.freeze({\n classNames: Object.freeze([...target.styles.classNames]),\n ...(target.styles.inlineStyle === undefined\n ? {}\n : { inlineStyle: target.styles.inlineStyle }),\n matchedRules: Object.freeze(target.styles.matchedRules.map(freezeMatchedRule)),\n computed: Object.freeze({ ...target.styles.computed }),\n warnings: Object.freeze([...target.styles.warnings]),\n }),\n ...(code === undefined ? {} : { code: Object.freeze({ ...code }) }),\n warnings: Object.freeze([...target.warnings]),\n });\n}\n\nexport async function authorizeAgentJobRequest(\n input: AuthorizeAgentJobRequestOptions,\n): Promise<AgentJobCreateRequest> {\n const requestedTargets = input.request.annotation.targets;\n\n if (requestedTargets.length > input.options.maxTargets) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const identities = requestedTargets.map(targetIdentity);\n\n if (new Set(identities).size !== identities.length) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const targets = Object.freeze(\n await Promise.all(requestedTargets.map((target) => authorizeTarget(target, input))),\n );\n\n const annotation = Object.freeze({\n schemaVersion: 3,\n id: input.request.annotation.id,\n locale: input.request.annotation.locale,\n page: Object.freeze({ ...input.request.annotation.page }),\n targets,\n createdAt: input.request.annotation.createdAt,\n }) satisfies SpotAnnotation;\n\n return Object.freeze({\n annotation,\n providerProfileId: input.request.providerProfileId,\n modelProfileId: input.request.modelProfileId,\n providerDataConsent: true,\n workingTreeMode: input.request.workingTreeMode,\n });\n}\n","import { readFile, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n ERROR_CODES,\n SpotPatchError,\n type CodeContext,\n type SourceContextRequest,\n} from \"@spotpatch/shared\";\n\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { extractCodeContext } from \"./extract-code-context.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\nexport interface ReadSourceContextOptions {\n readonly maxCharacters: number;\n readonly maxLines: number;\n readonly registry: SourceRegistry;\n readonly request: SourceContextRequest;\n readonly root: string;\n}\n\nfunction toDisplayPath(root: string, sourcePath: string): string {\n return path.relative(root, sourcePath).split(path.sep).join(\"/\");\n}\n\nexport async function readSourceContext(\n options: ReadSourceContextOptions,\n): Promise<CodeContext> {\n const sourcePath = await resolveSourceFile({\n fileId: options.request.fileId,\n registry: options.registry,\n root: options.root,\n });\n let source: string;\n\n try {\n source = await readFile(sourcePath, \"utf8\");\n } catch (error: unknown) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n ) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND, undefined, {\n cause: error,\n });\n }\n\n throw error;\n }\n const lines = source.split(/\\r?\\n/);\n\n if (options.request.line > lines.length) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const extension = path.extname(sourcePath).toLowerCase();\n\n return extractCodeContext({\n source,\n sourcePath,\n relativePath: toDisplayPath(await realpath(options.root), sourcePath),\n language: extension === \".tsx\" ? \"tsx\" : \"jsx\",\n line: options.request.line,\n column: options.request.column,\n maxLines: Math.min(options.request.maxLines, options.maxLines),\n maxCharacters: options.maxCharacters,\n });\n}\n","import type { CodeContext } from \"@spotpatch/shared\";\nimport {\n parseSync,\n Visitor,\n type Class,\n type Expression,\n type Function,\n type JSXElement,\n type JSXFragment,\n type Span,\n type VariableDeclarator,\n} from \"oxc-parser\";\n\ninterface ComponentCandidate extends Span {\n readonly name: string;\n}\n\nexport interface ExtractCodeContextOptions {\n readonly column: number;\n readonly language: CodeContext[\"language\"];\n readonly line: number;\n readonly maxCharacters: number;\n readonly maxLines: number;\n readonly relativePath: string;\n readonly source: string;\n readonly sourcePath: string;\n}\n\nfunction isComponentName(name: string): boolean {\n return /^[A-Z]/u.test(name);\n}\n\nfunction unwrapTypeExpression(expression: Expression): Expression {\n switch (expression.type) {\n case \"TSAsExpression\":\n case \"TSSatisfiesExpression\":\n case \"TSTypeAssertion\":\n case \"TSNonNullExpression\":\n case \"TSInstantiationExpression\":\n return unwrapTypeExpression(expression.expression);\n default:\n return expression;\n }\n}\n\nfunction calleeName(expression: Expression): string | undefined {\n const unwrapped = unwrapTypeExpression(expression);\n\n if (unwrapped.type === \"Identifier\") {\n return unwrapped.name;\n }\n\n if (unwrapped.type === \"MemberExpression\" && !unwrapped.computed) {\n return unwrapped.property.type === \"Identifier\"\n ? unwrapped.property.name\n : undefined;\n }\n\n return undefined;\n}\n\nfunction isFunctionExpression(expression: Expression): boolean {\n const unwrapped = unwrapTypeExpression(expression);\n return (\n unwrapped.type === \"ArrowFunctionExpression\" ||\n unwrapped.type === \"FunctionExpression\"\n );\n}\n\nfunction isSupportedComponentInitializer(expression: Expression): boolean {\n const unwrapped = unwrapTypeExpression(expression);\n\n if (isFunctionExpression(unwrapped)) {\n return true;\n }\n\n if (unwrapped.type !== \"CallExpression\") {\n return false;\n }\n\n const name = calleeName(unwrapped.callee);\n\n if (name !== \"memo\" && name !== \"forwardRef\") {\n return false;\n }\n\n const firstArgument = unwrapped.arguments[0];\n return (\n firstArgument !== undefined &&\n firstArgument.type !== \"SpreadElement\" &&\n (isFunctionExpression(firstArgument) ||\n isSupportedComponentInitializer(firstArgument))\n );\n}\n\nfunction variableComponent(node: VariableDeclarator): ComponentCandidate | undefined {\n if (\n node.id.type !== \"Identifier\" ||\n !isComponentName(node.id.name) ||\n node.init === null ||\n !isSupportedComponentInitializer(node.init)\n ) {\n return undefined;\n }\n\n return Object.freeze({ start: node.start, end: node.end, name: node.id.name });\n}\n\nfunction functionComponent(node: Function): ComponentCandidate | undefined {\n return node.id !== null && isComponentName(node.id.name) && node.body !== null\n ? Object.freeze({ start: node.start, end: node.end, name: node.id.name })\n : undefined;\n}\n\nfunction isReactComponentSuperclass(expression: Expression | null): boolean {\n if (expression === null) {\n return false;\n }\n\n const unwrapped = unwrapTypeExpression(expression);\n\n if (unwrapped.type === \"Identifier\") {\n return unwrapped.name === \"Component\" || unwrapped.name === \"PureComponent\";\n }\n\n return (\n unwrapped.type === \"MemberExpression\" &&\n !unwrapped.computed &&\n unwrapped.object.type === \"Identifier\" &&\n unwrapped.object.name === \"React\" &&\n (unwrapped.property.name === \"Component\" ||\n unwrapped.property.name === \"PureComponent\")\n );\n}\n\nfunction classComponent(node: Class): ComponentCandidate | undefined {\n return node.id !== null &&\n isComponentName(node.id.name) &&\n isReactComponentSuperclass(node.superClass)\n ? Object.freeze({ start: node.start, end: node.end, name: node.id.name })\n : undefined;\n}\n\nfunction selectedOffset(\n source: string,\n line: number,\n column: number,\n): number | undefined {\n const lines = source.split(/\\r?\\n/u);\n\n if (line < 1 || line > lines.length) {\n return undefined;\n }\n\n const lineStart = lines\n .slice(0, line - 1)\n .reduce((total, value) => total + value.length + 1, 0);\n const lineLength = lines[line - 1]?.length ?? 0;\n return lineStart + Math.min(Math.max(0, column - 1), lineLength);\n}\n\nfunction findComponentSpan(\n options: ExtractCodeContextOptions,\n): ComponentCandidate | undefined {\n const offset = selectedOffset(options.source, options.line, options.column);\n\n if (offset === undefined) {\n return undefined;\n }\n\n let parseResult: ReturnType<typeof parseSync>;\n\n try {\n parseResult = parseSync(options.sourcePath, options.source, {\n sourceType: \"module\",\n });\n } catch {\n return undefined;\n }\n\n if (parseResult.errors.length > 0) {\n return undefined;\n }\n\n const jsxNodes: (JSXElement | JSXFragment)[] = [];\n const components: ComponentCandidate[] = [];\n const visitor = new Visitor({\n JSXElement(node) {\n jsxNodes.push(node);\n },\n JSXFragment(node) {\n jsxNodes.push(node);\n },\n FunctionDeclaration(node) {\n const candidate = functionComponent(node);\n\n if (candidate !== undefined) {\n components.push(candidate);\n }\n },\n VariableDeclarator(node) {\n const candidate = variableComponent(node);\n\n if (candidate !== undefined) {\n components.push(candidate);\n }\n },\n ClassDeclaration(node) {\n const candidate = classComponent(node);\n\n if (candidate !== undefined) {\n components.push(candidate);\n }\n },\n });\n visitor.visit(parseResult.program);\n\n const selectedJsx = jsxNodes\n .filter((node) => node.start <= offset && node.end >= offset)\n .sort((left, right) => left.end - left.start - (right.end - right.start))[0];\n\n if (selectedJsx === undefined) {\n return undefined;\n }\n\n return components\n .filter(\n (component) =>\n component.start <= selectedJsx.start && component.end >= selectedJsx.end,\n )\n .sort((left, right) => left.end - left.start - (right.end - right.start))[0];\n}\n\nfunction lineAtOffset(source: string, offset: number): number {\n let line = 1;\n\n for (let index = 0; index < offset; index += 1) {\n if (source[index] === \"\\n\") {\n line += 1;\n }\n }\n\n return line;\n}\n\nfunction componentRange(\n source: string,\n component: ComponentCandidate,\n): Readonly<{ startLine: number; endLine: number }> {\n return Object.freeze({\n startLine: lineAtOffset(source, component.start),\n endLine: lineAtOffset(source, Math.max(component.start, component.end - 1)),\n });\n}\n\nfunction truncateSelectedLine(\n line: string,\n column: number,\n maxCharacters: number,\n): string {\n if (line.length <= maxCharacters) {\n return line;\n }\n\n if (maxCharacters === 1) {\n return \"…\";\n }\n\n const contentCharacters = maxCharacters - 2;\n const desiredStart = Math.max(0, column - 1 - Math.floor(contentCharacters / 2));\n const start = Math.min(desiredStart, line.length - contentCharacters);\n const end = start + contentCharacters;\n return `${start > 0 ? \"…\" : \"\"}${line.slice(start, end)}${end < line.length ? \"…\" : \"\"}`.slice(\n 0,\n maxCharacters,\n );\n}\n\nfunction boundedRange(\n lines: readonly string[],\n selectedLine: number,\n column: number,\n initialStart: number,\n initialEnd: number,\n maxCharacters: number,\n): Readonly<{ startLine: number; endLine: number; excerpt: string }> {\n let startLine = initialStart;\n let endLine = initialEnd;\n let excerpt = lines.slice(startLine - 1, endLine).join(\"\\n\");\n\n while (excerpt.length > maxCharacters && startLine < endLine) {\n if (endLine - selectedLine >= selectedLine - startLine) {\n endLine -= 1;\n } else {\n startLine += 1;\n }\n\n excerpt = lines.slice(startLine - 1, endLine).join(\"\\n\");\n }\n\n if (excerpt.length > maxCharacters) {\n startLine = selectedLine;\n endLine = selectedLine;\n excerpt = truncateSelectedLine(\n lines[selectedLine - 1] ?? \"\",\n column,\n maxCharacters,\n );\n }\n\n return Object.freeze({ startLine, endLine, excerpt });\n}\n\nfunction nearbyContext(options: ExtractCodeContextOptions): CodeContext {\n const lines = options.source.split(/\\r?\\n/u);\n const initialStart = Math.max(1, options.line - Math.floor(options.maxLines / 2));\n const initialEnd = Math.min(lines.length, initialStart + options.maxLines - 1);\n const startLine = Math.max(1, initialEnd - options.maxLines + 1);\n const bounded = boundedRange(\n lines,\n options.line,\n options.column,\n startLine,\n initialEnd,\n options.maxCharacters,\n );\n\n return Object.freeze({\n relativePath: options.relativePath,\n language: options.language,\n startLine: bounded.startLine,\n endLine: bounded.endLine,\n excerpt: bounded.excerpt,\n boundary: \"nearby-lines\",\n });\n}\n\nexport function extractCodeContext(options: ExtractCodeContextOptions): CodeContext {\n const component = findComponentSpan(options);\n\n if (component !== undefined) {\n const range = componentRange(options.source, component);\n const lineCount = range.endLine - range.startLine + 1;\n const excerpt = options.source\n .split(/\\r?\\n/u)\n .slice(range.startLine - 1, range.endLine)\n .join(\"\\n\");\n\n if (lineCount <= options.maxLines && excerpt.length <= options.maxCharacters) {\n return Object.freeze({\n relativePath: options.relativePath,\n language: options.language,\n startLine: range.startLine,\n endLine: range.endLine,\n excerpt,\n boundary: \"component\",\n });\n }\n }\n\n return nearbyContext(options);\n}\n","import { realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { ERROR_CODES, SpotPatchError } from \"@spotpatch/shared\";\n\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { MAX_SOURCE_FILE_BYTES } from \"./constants.js\";\n\nconst ALLOWED_EXTENSIONS = new Set([\".jsx\", \".tsx\"]);\n\nfunction isMissingFileError(error: unknown): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n );\n}\n\nexport async function assertInsideRoot(\n root: string,\n candidate: string,\n): Promise<string> {\n let realRoot: string;\n let realCandidate: string;\n\n try {\n [realRoot, realCandidate] = await Promise.all([\n realpath(root),\n realpath(candidate),\n ]);\n } catch (error: unknown) {\n if (isMissingFileError(error)) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND, undefined, {\n cause: error,\n });\n }\n\n throw error;\n }\n\n const relative = path.relative(realRoot, realCandidate);\n const outside =\n relative.startsWith(`..${path.sep}`) ||\n relative === \"..\" ||\n path.isAbsolute(relative);\n\n if (outside) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_OUTSIDE_ROOT);\n }\n\n return realCandidate;\n}\n\nexport interface ResolveSourceFileOptions {\n readonly fileId: string;\n readonly registry: SourceRegistry;\n readonly root: string;\n}\n\nexport async function resolveSourceFile(\n options: ResolveSourceFileOptions,\n): Promise<string> {\n const registeredPath = options.registry.resolve(options.fileId);\n\n if (registeredPath === undefined) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND);\n }\n\n const sourcePath = await assertInsideRoot(options.root, registeredPath);\n\n if (!ALLOWED_EXTENSIONS.has(path.extname(sourcePath).toLowerCase())) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND);\n }\n\n let sourceStat;\n\n try {\n sourceStat = await stat(sourcePath);\n } catch (error: unknown) {\n if (isMissingFileError(error)) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND, undefined, {\n cause: error,\n });\n }\n\n throw error;\n }\n\n if (!sourceStat.isFile()) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_NOT_FOUND);\n }\n\n if (sourceStat.size > MAX_SOURCE_FILE_BYTES) {\n throw new SpotPatchError(ERROR_CODES.SOURCE_TOO_LARGE);\n }\n\n return sourcePath;\n}\n","export const MAX_REQUEST_BODY_BYTES = 32 * 1024;\nexport const MAX_AGENT_REQUEST_BODY_BYTES = 256 * 1024;\nexport const MAX_SOURCE_FILE_BYTES = 1024 * 1024;\n","import type { IncomingMessage } from \"node:http\";\n\nimport { ERROR_CODES, SpotPatchError } from \"@spotpatch/shared\";\n\nimport { MAX_REQUEST_BODY_BYTES } from \"./constants.js\";\n\nfunction isJsonContentType(value: string | undefined): boolean {\n return value?.split(\";\", 1)[0]?.trim().toLowerCase() === \"application/json\";\n}\n\nexport async function readJsonRequestBody(\n request: IncomingMessage,\n maximumBytes = MAX_REQUEST_BODY_BYTES,\n): Promise<unknown> {\n if (!isJsonContentType(request.headers[\"content-type\"])) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const declaredLength = Number(request.headers[\"content-length\"]);\n\n if (Number.isFinite(declaredLength) && declaredLength > maximumBytes) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const chunks: Uint8Array[] = [];\n let byteLength = 0;\n let exceededLimit = false;\n\n for await (const rawChunk of request) {\n const chunk: unknown = rawChunk;\n\n if (typeof chunk !== \"string\" && !(chunk instanceof Uint8Array)) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const buffer = Buffer.from(chunk);\n byteLength += buffer.byteLength;\n\n if (byteLength > maximumBytes) {\n exceededLimit = true;\n continue;\n }\n\n chunks.push(buffer);\n }\n\n if (exceededLimit || byteLength === 0) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n try {\n return JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as unknown;\n } catch (error: unknown) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST, undefined, {\n cause: error,\n });\n }\n}\n","import { spawn, type SpawnOptions } from \"node:child_process\";\n\nimport type { SpotPatchEditorPreference } from \"@spotpatch/shared\";\nimport launchEditor from \"launch-editor\";\n\nconst EDITOR_STARTUP_GRACE_MS = 300;\n\ninterface SpawnedEditorProcess {\n once(event: \"error\", listener: (error: Error) => void): SpawnedEditorProcess;\n once(\n event: \"exit\",\n listener: (code: number | null, signal: NodeJS.Signals | null) => void,\n ): SpawnedEditorProcess;\n}\n\ntype EditorProcessSpawner = (\n command: string,\n arguments_: readonly string[],\n options: SpawnOptions,\n) => SpawnedEditorProcess;\n\ntype FallbackEditorLauncher = (\n target: string,\n editor: string | undefined,\n onError: () => void,\n) => void;\n\nexport interface EditorLaunchDependencies {\n readonly environment: Readonly<NodeJS.ProcessEnv>;\n readonly fallbackLauncher: FallbackEditorLauncher;\n readonly processSpawner: EditorProcessSpawner;\n readonly startupGraceMs: number;\n}\n\nexport type EditorLauncher = (\n target: string,\n editor: SpotPatchEditorPreference,\n) => Promise<SpotPatchEditorPreference>;\n\nfunction normalizedEditorEnvironment(environment: Readonly<NodeJS.ProcessEnv>): string {\n return [\n environment.TERM_PROGRAM,\n environment.VSCODE_GIT_ASKPASS_NODE,\n environment.VSCODE_GIT_ASKPASS_MAIN,\n environment.GIT_ASKPASS,\n ]\n .filter((value): value is string => typeof value === \"string\")\n .join(\"\\n\")\n .replaceAll(\"\\\\\", \"/\")\n .toLowerCase();\n}\n\nexport function detectIntegratedEditor(\n environment: Readonly<NodeJS.ProcessEnv>,\n): Exclude<SpotPatchEditorPreference, \"auto\"> | undefined {\n const signature = normalizedEditorEnvironment(environment);\n\n if (signature === \"cursor\" || signature.includes(\"/cursor\")) {\n return \"cursor\";\n }\n\n if (\n signature === \"vscode\" ||\n signature.includes(\"visual studio code\") ||\n /(^|\\/)(code|code-insiders)(\\.exe)?($|\\/)/u.test(signature)\n ) {\n return \"vscode\";\n }\n\n return undefined;\n}\n\nfunction editorCommand(editor: Exclude<SpotPatchEditorPreference, \"auto\">): string {\n return editor === \"cursor\" ? \"cursor\" : \"code\";\n}\n\nconst DEFAULT_DEPENDENCIES: EditorLaunchDependencies = Object.freeze({\n environment: process.env,\n fallbackLauncher: launchEditor,\n processSpawner: (\n command: string,\n arguments_: readonly string[],\n options: SpawnOptions,\n ) => spawn(command, [...arguments_], options),\n startupGraceMs: EDITOR_STARTUP_GRACE_MS,\n});\n\nexport function createEditorLauncher(\n dependencies: EditorLaunchDependencies = DEFAULT_DEPENDENCIES,\n): EditorLauncher {\n return (target, configuredEditor) => {\n const integratedEditor = detectIntegratedEditor(dependencies.environment);\n const resolvedEditor =\n configuredEditor === \"auto\" ? integratedEditor : configuredEditor;\n\n return new Promise<SpotPatchEditorPreference>((resolve, reject) => {\n let settled = false;\n const settle = (\n error?: Error,\n editor: SpotPatchEditorPreference = resolvedEditor ?? \"auto\",\n ): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(startupTimer);\n\n if (error === undefined) {\n resolve(editor);\n } else {\n reject(error);\n }\n };\n const startupTimer = setTimeout(settle, dependencies.startupGraceMs);\n const rejectStartup = (): void => {\n settle(new Error(\"The configured editor could not be started.\"));\n };\n\n try {\n if (resolvedEditor === undefined) {\n dependencies.fallbackLauncher(target, undefined, rejectStartup);\n return;\n }\n\n const child = dependencies.processSpawner(\n editorCommand(resolvedEditor),\n [\"--goto\", target],\n {\n env: dependencies.environment,\n stdio: \"ignore\",\n windowsHide: true,\n },\n );\n child.once(\"error\", rejectStartup);\n child.once(\"exit\", (code, signal) => {\n if (code === 0) {\n settle(undefined, resolvedEditor);\n return;\n }\n\n if (code !== null || signal !== null) {\n rejectStartup();\n }\n });\n } catch {\n rejectStartup();\n }\n });\n };\n}\n\nexport const launchConfiguredEditor = createEditorLauncher();\n","import { timingSafeEqual } from \"node:crypto\";\nimport type { IncomingMessage } from \"node:http\";\nimport { isIP } from \"node:net\";\n\nimport { ERROR_CODES, SPOTPATCH_TOKEN_HEADER, SpotPatchError } from \"@spotpatch/shared\";\n\nfunction getSingleHeader(request: IncomingMessage, name: string): string | undefined {\n const value = request.headers[name.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction tokensMatch(actual: string | undefined, expected: string): boolean {\n if (actual === undefined) {\n return false;\n }\n\n const actualBytes = Buffer.from(actual);\n const expectedBytes = Buffer.from(expected);\n\n return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\n\nexport function isLoopbackHostname(hostname: string): boolean {\n const normalized = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n if (normalized === \"localhost\" || normalized.endsWith(\".localhost\")) {\n return true;\n }\n\n if (normalized === \"::1\") {\n return true;\n }\n\n if (isIP(normalized) === 4) {\n return normalized.split(\".\")[0] === \"127\";\n }\n\n return normalized.startsWith(\"::ffff:127.\");\n}\n\nfunction parseHost(value: string): URL | undefined {\n try {\n return new URL(`http://${value}`);\n } catch {\n return undefined;\n }\n}\n\nfunction parseOrigin(value: string): URL | undefined {\n try {\n const origin = new URL(value);\n\n if (\n (origin.protocol !== \"http:\" && origin.protocol !== \"https:\") ||\n origin.username.length > 0 ||\n origin.password.length > 0 ||\n origin.origin === \"null\"\n ) {\n return undefined;\n }\n\n return origin;\n } catch {\n return undefined;\n }\n}\n\nexport interface RequestSecurityOptions {\n readonly allowLan: boolean;\n readonly sessionToken: string;\n}\n\nexport function assertRequestAuthorized(\n request: IncomingMessage,\n options: RequestSecurityOptions,\n): void {\n const actualToken = getSingleHeader(request, SPOTPATCH_TOKEN_HEADER);\n\n if (!tokensMatch(actualToken, options.sessionToken)) {\n throw new SpotPatchError(ERROR_CODES.INVALID_TOKEN);\n }\n\n const hostHeader = getSingleHeader(request, \"host\");\n const originHeader = getSingleHeader(request, \"origin\");\n const host = hostHeader === undefined ? undefined : parseHost(hostHeader);\n const origin = originHeader === undefined ? undefined : parseOrigin(originHeader);\n\n if (host === undefined || origin === undefined) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n\n const hostIsLoopback = isLoopbackHostname(host.hostname);\n const originIsLoopback = isLoopbackHostname(origin.hostname);\n\n if (!options.allowLan) {\n if (!hostIsLoopback || !originIsLoopback) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n\n return;\n }\n\n if (!originIsLoopback && origin.host.toLowerCase() !== host.host.toLowerCase()) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n}\n","import { randomBytes } from \"node:crypto\";\n\nexport interface SpotPatchSession {\n readonly token: string;\n}\n\nexport function createSession(): SpotPatchSession {\n return Object.freeze({\n token: randomBytes(16).toString(\"base64url\"),\n });\n}\n","import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\n\nimport type { ConfigEnv, Plugin, ResolvedConfig, UserConfig } from \"vite\";\n\nimport type { SpotPatchPluginContext } from \"../plugin-context.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { injectSourceMarkers } from \"./inject-source-markers.js\";\nimport { createTransformFilter, stripViteQuery } from \"./transform-filter.js\";\n\ninterface TransformPluginInput {\n readonly configure?: (config: UserConfig, environment: ConfigEnv) => void;\n readonly context: SpotPatchPluginContext;\n readonly registry: SourceRegistry;\n}\n\ninterface ViteTransformOutput {\n readonly code: string;\n readonly map: string;\n}\n\nfunction createCacheKey(id: string, code: string): string {\n const hash = createHash(\"sha256\").update(code).digest(\"base64url\");\n return `${id}\\0${hash}`;\n}\n\nfunction getDisplayPath(root: string, id: string): string {\n const relative = path.relative(root, stripViteQuery(id));\n return relative.split(path.sep).join(\"/\");\n}\n\nexport function createTransformPlugin(input: TransformPluginInput): Plugin {\n let root = process.cwd();\n let filter = createTransformFilter(root, input.context.getOptions());\n let logger: ResolvedConfig[\"logger\"] | undefined;\n const warnedFiles = new Set<string>();\n const cache = new Map<string, ViteTransformOutput | null>();\n\n return {\n name: \"spotpatch:transform\",\n apply: \"serve\",\n enforce: \"pre\",\n\n config(config, environment) {\n input.configure?.(config, environment);\n },\n\n configResolved(config) {\n root = path.resolve(config.root);\n filter = createTransformFilter(root, input.context.getOptions());\n logger = config.logger;\n },\n\n transform(code, id) {\n if (!filter.shouldTransform(id, code)) {\n return null;\n }\n\n const cleanId = path.resolve(stripViteQuery(id));\n const cacheKey = createCacheKey(cleanId, code);\n\n if (cache.has(cacheKey)) {\n return cache.get(cacheKey) ?? null;\n }\n\n const startedAt = performance.now();\n const options = input.context.getOptions();\n\n try {\n const result = injectSourceMarkers({\n code,\n absolutePath: cleanId,\n root,\n fileId: input.registry.register(cleanId),\n onWarning(warning) {\n logger?.warn(\n `[spotpatch:transform] Existing source marker at ${getDisplayPath(root, id)}:${String(warning.line)}:${String(warning.column)}; preserving application value.`,\n );\n },\n });\n\n const output =\n result === undefined\n ? null\n : Object.freeze({\n code: result.code,\n map: result.map.toString(),\n });\n cache.set(cacheKey, output);\n\n if (options.debug) {\n const elapsed = performance.now() - startedAt;\n logger?.info(\n `[spotpatch:transform] ${getDisplayPath(root, id)} ${elapsed.toFixed(2)}ms`,\n );\n }\n\n return output;\n } catch (error: unknown) {\n if (!warnedFiles.has(cleanId)) {\n warnedFiles.add(cleanId);\n const detail =\n options.debug && error instanceof Error ? `: ${error.message}` : \"\";\n logger?.warn(\n `[spotpatch:transform] Failed to transform ${getDisplayPath(root, id)}; using original module${detail}`,\n );\n }\n\n return null;\n }\n },\n };\n}\n","import path from \"node:path\";\n\nimport {\n formatSourceMarker,\n SOURCE_MARKER_ATTRIBUTE,\n type SourceMarker,\n} from \"@spotpatch/shared\";\nimport MagicString from \"magic-string\";\nimport { parseSync, Visitor, type JSXOpeningElement } from \"oxc-parser\";\n\nimport {\n hasSourceMarkerAttribute,\n isIntrinsicOpeningElement,\n} from \"./intrinsic-element.js\";\nimport { createLineStarts, getSourcePosition } from \"./source-position.js\";\n\nexport interface TransformWarning {\n readonly code: \"EXISTING_SOURCE_MARKER\";\n readonly line: number;\n readonly column: number;\n}\n\nexport interface InjectSourceMarkersInput {\n readonly code: string;\n readonly absolutePath: string;\n readonly root: string;\n readonly fileId: string;\n readonly onWarning?: (warning: TransformWarning) => void;\n}\n\nexport interface InjectSourceMarkersResult {\n readonly code: string;\n readonly map: ReturnType<MagicString[\"generateMap\"]>;\n readonly markerCount: number;\n}\n\nfunction findAttributeInsertionOffset(code: string, node: JSXOpeningElement): number {\n let cursor = node.end - 2;\n\n while (cursor >= node.start && /\\s/u.test(code[cursor] ?? \"\")) {\n cursor -= 1;\n }\n\n if (code[cursor] === \"/\") {\n cursor -= 1;\n while (cursor >= node.start && /\\s/u.test(code[cursor] ?? \"\")) {\n cursor -= 1;\n }\n }\n\n return cursor + 1;\n}\n\nfunction normalizeRelativePath(root: string, absolutePath: string): string {\n return path.relative(root, absolutePath).split(path.sep).join(\"/\");\n}\n\nfunction createMarker(fileId: string, line: number, column: number): SourceMarker {\n return Object.freeze({ fileId, line, column });\n}\n\nexport function injectSourceMarkers(\n input: InjectSourceMarkersInput,\n): InjectSourceMarkersResult | undefined {\n const parseResult = parseSync(input.absolutePath, input.code, {\n sourceType: \"module\",\n });\n\n const parseError = parseResult.errors[0];\n\n if (parseError !== undefined) {\n throw new SyntaxError(parseError.message);\n }\n\n const magicString = new MagicString(input.code);\n const lineStarts = createLineStarts(input.code);\n let markerCount = 0;\n\n const visitor = new Visitor({\n JSXOpeningElement(node) {\n if (!isIntrinsicOpeningElement(node)) {\n return;\n }\n\n const position = getSourcePosition(lineStarts, node.start);\n\n if (hasSourceMarkerAttribute(node)) {\n input.onWarning?.({\n code: \"EXISTING_SOURCE_MARKER\",\n line: position.line,\n column: position.column,\n });\n return;\n }\n\n const value = formatSourceMarker(\n createMarker(input.fileId, position.line, position.column),\n );\n const insertionOffset = findAttributeInsertionOffset(input.code, node);\n magicString.appendLeft(\n insertionOffset,\n ` ${SOURCE_MARKER_ATTRIBUTE}=${JSON.stringify(value)}`,\n );\n markerCount += 1;\n },\n });\n\n visitor.visit(parseResult.program);\n\n if (markerCount === 0) {\n return undefined;\n }\n\n return Object.freeze({\n code: magicString.toString(),\n map: magicString.generateMap({\n hires: true,\n includeContent: true,\n source: normalizeRelativePath(input.root, input.absolutePath),\n }),\n markerCount,\n });\n}\n","import { SOURCE_MARKER_ATTRIBUTE } from \"@spotpatch/shared\";\nimport type { JSXOpeningElement } from \"oxc-parser\";\n\nexport function isIntrinsicOpeningElement(node: JSXOpeningElement): boolean {\n if (node.name.type !== \"JSXIdentifier\") {\n return false;\n }\n\n const { name } = node.name;\n const firstCharacter = name[0];\n\n return name.includes(\"-\") || firstCharacter?.toLowerCase() === firstCharacter;\n}\n\nexport function hasSourceMarkerAttribute(node: JSXOpeningElement): boolean {\n return node.attributes.some(\n (attribute) =>\n attribute.type === \"JSXAttribute\" &&\n attribute.name.type === \"JSXIdentifier\" &&\n attribute.name.name === SOURCE_MARKER_ATTRIBUTE,\n );\n}\n","export interface SourcePosition {\n readonly line: number;\n readonly column: number;\n}\n\nexport function createLineStarts(code: string): readonly number[] {\n const starts = [0];\n\n for (let index = 0; index < code.length; index += 1) {\n if (code.charCodeAt(index) === 10) {\n starts.push(index + 1);\n }\n }\n\n return starts;\n}\n\nexport function getSourcePosition(\n lineStarts: readonly number[],\n offset: number,\n): SourcePosition {\n let lower = 0;\n let upper = lineStarts.length - 1;\n\n while (lower <= upper) {\n const middle = Math.floor((lower + upper) / 2);\n const start = lineStarts[middle];\n\n if (start === undefined) {\n break;\n }\n\n if (start <= offset) {\n lower = middle + 1;\n } else {\n upper = middle - 1;\n }\n }\n\n const lineIndex = Math.max(0, upper);\n const lineStart = lineStarts[lineIndex] ?? 0;\n\n return Object.freeze({\n line: lineIndex + 1,\n column: offset - lineStart + 1,\n });\n}\n","import path from \"node:path\";\n\nimport { createFilter } from \"@rollup/pluginutils\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\n\nconst SUPPORTED_EXTENSIONS = new Set([\".jsx\", \".tsx\"]);\n\nexport function stripViteQuery(id: string): string {\n const queryIndex = id.indexOf(\"?\");\n return queryIndex === -1 ? id : id.slice(0, queryIndex);\n}\n\nexport function isInsideRoot(root: string, candidate: string, pathApi = path): boolean {\n const relative = pathApi.relative(pathApi.resolve(root), pathApi.resolve(candidate));\n return (\n relative === \"\" ||\n (!relative.startsWith(`..${pathApi.sep}`) &&\n relative !== \"..\" &&\n !pathApi.isAbsolute(relative))\n );\n}\n\nexport interface TransformFilter {\n shouldTransform(id: string, code: string): boolean;\n}\n\nexport function createTransformFilter(\n root: string,\n options: ResolvedSpotPatchOptions,\n): TransformFilter {\n const matchesConfiguredFilter = createFilter(options.include, options.exclude);\n\n return Object.freeze({\n shouldTransform(id: string, code: string): boolean {\n if (id.startsWith(\"\\0\") || id.includes(\"virtual:spotpatch\")) {\n return false;\n }\n\n const cleanId = stripViteQuery(id);\n\n if (!SUPPORTED_EXTENSIONS.has(path.extname(cleanId).toLowerCase())) {\n return false;\n }\n\n if (\n cleanId.includes(\"/node_modules/\") ||\n cleanId.includes(\"\\\\node_modules\\\\\") ||\n cleanId.includes(\"/packages/vite/\") ||\n cleanId.includes(\"\\\\packages\\\\vite\\\\\")\n ) {\n return false;\n }\n\n if (!isInsideRoot(root, cleanId) || !matchesConfiguredFilter(cleanId)) {\n return false;\n }\n\n return code.includes(\"<\");\n },\n });\n}\n","export { spotPatch } from \"./plugin.js\";\nexport {\n DEFAULT_OPTIONS,\n resolveOptions,\n type ResolvedSpotPatchOptions,\n type SimpleAiOptions,\n type SpotPatchAiOptions,\n type SpotPatchOptions,\n} from \"./options.js\";\nexport {\n DEFAULT_AGENT_LIMITS,\n type AgentApplyMode,\n type AgentCheckDefinition,\n type AgentLimits,\n type AiExecutionOptions,\n type AiModelProfile,\n type AiOptions,\n type AiProviderAuthentication,\n type AiProviderProtocol,\n type ContextBudget,\n type OpenAICompatibleProviderOptions,\n type SpotPatchEditorPreference,\n} from \"@spotpatch/shared\";\n"],"mappings":"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","names":["path","path","path","path","randomBytes","ERROR_CODES","SPOTPATCH_ENDPOINTS","SpotPatchError","ERROR_CODES","SpotPatchError","realpath","path","ERROR_CODES","SpotPatchError","realpath","path","ERROR_CODES","SpotPatchError","path","ERROR_CODES","SpotPatchError","SpotPatchError","ERROR_CODES","path","path","SpotPatchError","ERROR_CODES","realpath","SpotPatchError","ERROR_CODES","path","realpath","ERROR_CODES","SpotPatchError","SpotPatchError","ERROR_CODES","path","SpotPatchError","ERROR_CODES","DEFAULT_DEPENDENCIES","ERROR_CODES","SpotPatchError","ERROR_CODES","SpotPatchError","path","SPOTPATCH_ENDPOINTS","path","randomBytes","createHash","path","path","SOURCE_MARKER_ATTRIBUTE","parseSync","Visitor","path","parseSync","Visitor","SOURCE_MARKER_ATTRIBUTE","path","createHash","path","path","DEFAULT_AGENT_LIMITS"]}
|