@spotpatch/dev-server 0.10.1 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +29 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -4
- package/dist/index.d.ts +12 -4
- package/dist/index.js +30 -15
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/agent/job-manager.ts","../src/external-handoff/service.ts","../src/external-handoff/active-registry.ts","../src/external-handoff/clock.ts","../src/external-handoff/broker.ts","../src/server/request-body.ts","../src/server/constants.ts","../src/external-handoff/discovery.ts","../src/external-handoff/fingerprint.ts","../src/external-handoff/store.ts","../src/environment-ai.ts","../src/integration/file-plan.ts","../src/options.ts","../src/project-validation.ts","../src/project-options.ts","../src/registry/source-registry.ts","../src/registry/source-id.ts","../src/contextual-ask/manager.ts","../src/contextual-ask/error.ts","../src/contextual-ask/read-snapshot.ts","../src/contextual-ask/configured-key-executors.ts","../src/contextual-ask/executors.ts","../src/workspace/activity-coordinator.ts","../src/server/middleware.ts","../src/contextual-ask/http.ts","../src/external-handoff/browser-http.ts","../src/server/annotation-authorizer.ts","../src/server/source-context.ts","../src/server/extract-code-context.ts","../src/server/source-file.ts","../src/external-agent/browser-http.ts","../src/server/agent-http.ts","../src/server/agent-request.ts","../src/server/editor.ts","../src/server/data-flow-http.ts","../src/server/request-security.ts","../src/server/runtime-bootstrap.ts","../src/server/source-registration.ts","../src/session/session.ts","../src/transport-options.ts","../src/development-session.ts"],"sourcesContent":["export {\n createAgentJobManager,\n type AgentJobEventListener,\n type AgentJobManager,\n type CreateAgentJobManagerOptions,\n} from \"./agent/job-manager.js\";\nexport {\n createExternalHandoffService,\n type CreateExternalHandoffServiceOptions,\n type ExternalHandoffService,\n} from \"./external-handoff/service.js\";\nexport type { ExternalAgentControlPort } from \"./external-agent/control-port.js\";\nexport {\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n type EnvironmentAiConfiguration,\n} from \"./environment-ai.js\";\nexport {\n applyIntegrationPlan,\n createIntegrationFileChange,\n integrationPathExists,\n readIntegrationFile,\n type IntegrationFileChange,\n type IntegrationPlan,\n} from \"./integration/file-plan.js\";\nexport {\n createRuntimeAiConfig,\n createRuntimeDataFlowConfig,\n DEFAULT_EXCLUDE,\n DEFAULT_OPTIONS,\n resolveOptions,\n type FilterEntry,\n type ResolvedSpotPatchOptions,\n type ResolvedSpotPatchDataFlowOptions,\n type ResolvedContextualAskOptions,\n type SimpleAiOptions,\n type SpotPatchAiOptions,\n type SpotPatchDataFlowOptions,\n type SpotPatchOptions,\n} from \"./options.js\";\nexport {\n resolveProjectOptions,\n type ResolveProjectOptionsInput,\n} from \"./project-options.js\";\nexport {\n discoverProjectValidationCheck,\n resolveManagedExecutionValidation,\n resolveProjectValidationChecks,\n type DiscoverProjectValidationCheckOptions,\n type ResolvedManagedExecutionValidation,\n type ResolveManagedExecutionValidationOptions,\n type ResolveProjectValidationChecksOptions,\n} from \"./project-validation.js\";\nexport {\n createSourceRegistry,\n type SourceRegistry,\n} from \"./registry/source-registry.js\";\nexport {\n createContextualAskManager,\n type ContextualAskJobEventListener,\n type ContextualAskManager,\n type CreateContextualAskManagerOptions,\n} from \"./contextual-ask/manager.js\";\nexport {\n captureAskReadSnapshot,\n type CapturedAskReadSnapshot,\n type CaptureAskReadSnapshotOptions,\n} from \"./contextual-ask/read-snapshot.js\";\nexport { ContextualAskError } from \"./contextual-ask/error.js\";\nexport {\n createConfiguredKeyAskExecutors,\n type CreateConfiguredKeyAskExecutorsOptions,\n} from \"./contextual-ask/configured-key-executors.js\";\nexport {\n composeContextualAskExecutors,\n type ComposeContextualAskExecutorsOptions,\n} from \"./contextual-ask/executors.js\";\nexport {\n createWorkspaceActivityCoordinator,\n type WorkspaceActivityCoordinator,\n type WorkspaceActivityKind,\n type WorkspaceActivityLease,\n} from \"./workspace/activity-coordinator.js\";\nexport {\n createSpotPatchMiddleware,\n type CreateMiddlewareOptions,\n type SpotPatchMiddleware,\n type SpotPatchNext,\n type SpotPatchServerLogger,\n} from \"./server/middleware.js\";\nexport { readJsonRequestBody } from \"./server/request-body.js\";\nexport {\n readRuntimeBootstrap,\n resolveRuntimeBootstrapOptions,\n type ResolvedRuntimeBootstrapOptions,\n type RuntimeBootstrapOptions,\n} from \"./server/runtime-bootstrap.js\";\nexport { isLoopbackHostname } from \"./server/request-security.js\";\nexport {\n handleContextualAskRequest,\n matchContextualAskPath,\n type ContextualAskRoute,\n} from \"./contextual-ask/http.js\";\nexport {\n createSourceRegistrationService,\n type SourceRegistrationHandler,\n type SourceRegistrationService,\n type SourceRegistrationServiceOptions,\n} from \"./server/source-registration.js\";\nexport { createSession, type SpotPatchSession } from \"./session/session.js\";\nexport {\n parseSerializedSpotPatchOptions,\n serializeResolvedSpotPatchOptions,\n type SerializedFilterEntry,\n type SerializedSpotPatchOptions,\n} from \"./transport-options.js\";\nexport {\n createDevelopmentSession,\n type DevelopmentSession,\n type DevelopmentSessionInput,\n} from \"./development-session.js\";\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 AgentApplyMode,\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\nimport type {\n WorkspaceActivityCoordinator,\n WorkspaceActivityLease,\n} from \"../workspace/activity-coordinator.js\";\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 applyMode: AgentApplyMode;\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 trustedFastModeConsent: boolean;\n readonly workingTreeMode: AgentWorkingTreeMode;\n lease: WorkspaceActivityLease | undefined;\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 readonly coordinator?: WorkspaceActivityCoordinator;\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 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: 2 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 if (!isActive(status)) {\n job.lease?.release();\n job.lease = undefined;\n }\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(\n job,\n \"applying\",\n job.applyMode === \"trusted-auto\"\n ? \"Applying trusted change directly to the project.\"\n : \"Applying validated changes to the project.\",\n );\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\", \"Preparing isolated Agent execution.\");\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 execution = Object.freeze({\n ...options.ai.execution,\n applyMode: job.applyMode,\n });\n const preparedChange = await dependencies.executeChange({\n annotation: job.annotation,\n callbacks,\n credential: job.credential,\n 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 const shouldApplyDirectly =\n (job.applyMode === \"auto\" && preparedChange.autoApplyEligible) ||\n (job.applyMode === \"trusted-auto\" && job.trustedFastModeConsent);\n\n if (shouldApplyDirectly) {\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 for (const job of jobs.values()) job.lease?.release();\n jobs.clear();\n },\n\n create(request) {\n if (closed) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n const configuredApplyMode = options.ai.execution.applyMode;\n const requestedApplyMode =\n request.applyMode ??\n (request.trustedFastModeConsent === true\n ? \"trusted-auto\"\n : configuredApplyMode);\n const applyModeAllowed =\n configuredApplyMode === \"trusted-auto\"\n ? requestedApplyMode === \"review\" || requestedApplyMode === \"trusted-auto\"\n : requestedApplyMode === configuredApplyMode;\n const trustedConsentMatches =\n (requestedApplyMode === \"trusted-auto\") ===\n (request.trustedFastModeConsent === true);\n\n if (!applyModeAllowed || !trustedConsentMatches) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\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 const lease = options.coordinator?.acquire(\"change\");\n if (options.coordinator !== undefined && lease === undefined) {\n throw new SpotPatchError(ERROR_CODES.AGENT_BUSY);\n }\n const id = dependencies.createJobId();\n\n if (!JOB_ID_PATTERN.test(id) || jobs.has(id)) {\n lease?.release();\n throw new SpotPatchError(ERROR_CODES.INTERNAL_ERROR);\n }\n\n const timestamp = dependencies.now();\n const job: InternalAgentJob = {\n annotation: request.annotation,\n applyMode: requestedApplyMode,\n controller: new AbortController(),\n createdAt: timestamp,\n credential: selection.credential,\n errorCode: undefined,\n events: [],\n id,\n listeners: new Set(),\n lease,\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 trustedFastModeConsent: request.trustedFastModeConsent === true,\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 const lease = options.coordinator?.acquire(\"change\");\n if (options.coordinator !== undefined && lease === undefined) {\n throw new SpotPatchError(ERROR_CODES.AGENT_BUSY);\n }\n job.lease = lease;\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 {\n ERROR_CODES,\n EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n SpotPatchError,\n type ExternalHandoffCapability,\n type ExternalHandoffFramework,\n type ExternalHandoffPublishRequest,\n type ExternalHandoffPublishResult,\n type ExternalHandoffStatusResult,\n type SpotAnnotation,\n} from \"@spotpatch/shared\";\nimport { computeExternalHandoffProjectKey } from \"@spotpatch/shared/external-agent-node\";\n\nimport {\n createActiveAdapterRegistry,\n type ActiveAdapterRegistry,\n} from \"./active-registry.js\";\nimport { createExternalHandoffBroker, type ExternalHandoffBroker } from \"./broker.js\";\nimport {\n publishExternalHandoffDescriptor,\n type PublishedExternalHandoffDescriptor,\n} from \"./discovery.js\";\nimport { fingerprintExternalHandoffAnnotation } from \"./fingerprint.js\";\nimport { createExternalHandoffStore } from \"./store.js\";\n\nexport type AuthorizeExternalHandoff = (\n annotation: ExternalHandoffPublishRequest[\"annotation\"],\n) => Promise<SpotAnnotation>;\n\nexport interface ExternalHandoffService {\n readonly capability: () => ExternalHandoffCapability;\n readonly close: () => Promise<void>;\n readonly publish: (\n request: ExternalHandoffPublishRequest,\n authorize: AuthorizeExternalHandoff,\n ) => Promise<ExternalHandoffPublishResult>;\n readonly resolveDelivery: (cursor: string) => ExternalHandoffStatusResult;\n readonly start: () => Promise<void>;\n readonly status: (cursor?: string) => ExternalHandoffStatusResult;\n}\n\nexport interface CreateExternalHandoffServiceOptions {\n readonly framework: ExternalHandoffFramework;\n readonly root: string;\n readonly sessionId: string;\n}\n\ninterface InFlightPublish {\n readonly fingerprint: string;\n readonly promise: Promise<ExternalHandoffPublishResult>;\n}\n\ntype ServiceState = \"idle\" | \"starting\" | \"ready\" | \"failed\" | \"closed\";\n\nfunction asReplay(result: ExternalHandoffPublishResult): ExternalHandoffPublishResult {\n return Object.freeze({ ...result, replayed: true });\n}\n\nexport function createExternalHandoffService(\n options: CreateExternalHandoffServiceOptions,\n): ExternalHandoffService {\n const activeRegistry: ActiveAdapterRegistry = createActiveAdapterRegistry();\n const store = createExternalHandoffStore({\n framework: options.framework,\n sessionId: options.sessionId,\n });\n const inFlight = new Map<string, InFlightPublish>();\n let broker: ExternalHandoffBroker | undefined;\n let descriptor: PublishedExternalHandoffDescriptor | undefined;\n let startPromise: Promise<void> | undefined;\n let closePromise: Promise<void> | undefined;\n let state: ServiceState = \"idle\";\n const isClosed = (): boolean => state === \"closed\";\n\n const requireReady = (): void => {\n if (state !== \"ready\" || broker?.isReady() !== true) {\n throw new SpotPatchError(\n state === \"closed\"\n ? ERROR_CODES.SESSION_CLOSED\n : ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE,\n );\n }\n };\n\n const start = async (): Promise<void> => {\n if (state === \"ready\") return;\n if (state === \"closed\") throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n if (startPromise !== undefined) return startPromise;\n\n state = \"starting\";\n startPromise = (async () => {\n let createdBroker: ExternalHandoffBroker | undefined;\n let createdDescriptor: PublishedExternalHandoffDescriptor | undefined;\n\n try {\n const projectKey = await computeExternalHandoffProjectKey(options.root);\n createdBroker = await createExternalHandoffBroker({\n activeRegistry,\n framework: options.framework,\n projectKey,\n sessionId: options.sessionId,\n store,\n });\n createdDescriptor = await publishExternalHandoffDescriptor({\n bridgeToken: createdBroker.bridgeToken,\n endpoint: createdBroker.endpoint,\n framework: options.framework,\n root: options.root,\n sessionId: options.sessionId,\n });\n\n if (isClosed()) {\n await createdDescriptor.close();\n await createdBroker.close();\n throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n }\n\n broker = createdBroker;\n descriptor = createdDescriptor;\n state = \"ready\";\n } catch (error: unknown) {\n if (createdDescriptor !== undefined && descriptor !== createdDescriptor) {\n await createdDescriptor.close().catch(() => undefined);\n }\n if (createdBroker !== undefined && broker !== createdBroker) {\n await createdBroker.close().catch(() => undefined);\n }\n if (!isClosed()) state = \"failed\";\n throw error;\n }\n })();\n\n return startPromise;\n };\n\n return Object.freeze({\n start,\n\n capability() {\n const currentCursor = store.currentCursor();\n const active = activeRegistry.snapshot(currentCursor ?? undefined);\n return Object.freeze({\n enabled: true,\n brokerReady: state === \"ready\" && broker?.isReady() === true,\n activeWaitCount: store.activeWaitCount(),\n snapshotSchemaVersion: EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n brokerProtocolVersion: EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n activeAdapter: active.activeAdapter,\n dispatch: currentCursor === null ? null : active.dispatch,\n });\n },\n\n async publish(\n request: ExternalHandoffPublishRequest,\n authorize: AuthorizeExternalHandoff,\n ) {\n requireReady();\n const fingerprint = fingerprintExternalHandoffAnnotation(request.annotation);\n const replayed = store.replay(request.requestId, fingerprint);\n if (replayed !== undefined) return replayed;\n\n const pending = inFlight.get(request.requestId);\n if (pending !== undefined) {\n if (pending.fingerprint !== fingerprint) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_VALIDATION_FAILED);\n }\n return asReplay(await pending.promise);\n }\n\n activeRegistry.assertPublishable();\n\n const promise = (async (): Promise<ExternalHandoffPublishResult> => {\n const annotation = await authorize(request.annotation);\n return store.publish({\n annotation,\n fingerprint,\n requestId: request.requestId,\n reserve: activeRegistry.reserve,\n });\n })();\n const activePublish = Object.freeze({ fingerprint, promise });\n inFlight.set(request.requestId, activePublish);\n\n try {\n return await promise;\n } finally {\n if (inFlight.get(request.requestId) === activePublish) {\n inFlight.delete(request.requestId);\n }\n }\n },\n\n status(cursor?: string) {\n requireReady();\n const handoff = store.status(cursor);\n const active = activeRegistry.snapshot(cursor ?? handoff.cursor);\n return Object.freeze({\n handoff,\n activeAdapter: active.activeAdapter,\n dispatch: active.dispatch,\n });\n },\n\n resolveDelivery(cursor: string) {\n requireReady();\n const handoff = store.status(cursor);\n const active = activeRegistry.resolveDelivery(cursor);\n return Object.freeze({\n handoff,\n activeAdapter: active.activeAdapter,\n dispatch: active.dispatch,\n });\n },\n\n close() {\n closePromise ??= (async () => {\n if (state === \"closed\") return;\n state = \"closed\";\n activeRegistry.close();\n store.close();\n inFlight.clear();\n await startPromise?.catch(() => undefined);\n const publishedDescriptor = descriptor;\n descriptor = undefined;\n const activeBroker = broker;\n broker = undefined;\n await publishedDescriptor?.close().catch(() => undefined);\n await activeBroker?.close().catch(() => undefined);\n })();\n return closePromise;\n },\n });\n}\n","import { randomBytes } from \"node:crypto\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_HANDOFF_LIMITS,\n SpotPatchError,\n type ActiveAdapterSummary,\n type DispatchSummary,\n type ExternalHandoffActiveAdapterKind,\n type ExternalHandoffDispatchPhase,\n type ExternalHandoffPublishDelivery,\n type ExternalHandoffReportableDispatchPhase,\n} from \"@spotpatch/shared\";\nimport type {\n BridgeActiveClaimResult,\n BridgeActiveStateResult,\n} from \"@spotpatch/shared/external-agent-node\";\n\nimport { SYSTEM_EXTERNAL_HANDOFF_CLOCK, type ExternalHandoffClock } from \"./clock.js\";\n\ninterface ActiveLease {\n readonly adapterKind: ExternalHandoffActiveAdapterKind;\n readonly baselineCursor: string | null;\n readonly connectedAt: string;\n readonly connectorInstanceId: string;\n readonly token: string;\n expiresAtMonotonic: number;\n updatedAt: string;\n}\n\ninterface ActiveDispatch {\n readonly adapterKind: ExternalHandoffActiveAdapterKind;\n readonly cursor: string;\n readonly deadlineMonotonic: number;\n readonly revision: number;\n phase: ExternalHandoffDispatchPhase;\n updatedAt: string;\n}\n\ninterface BlockedAdapter {\n readonly adapterKind: ExternalHandoffActiveAdapterKind;\n readonly connectedAt: string;\n readonly updatedAt: string;\n}\n\nexport interface ActiveRegistrySnapshot {\n readonly activeAdapter: ActiveAdapterSummary | null;\n readonly dispatch: DispatchSummary | null;\n}\n\nexport interface ActiveAdapterRegistry {\n readonly assertPublishable: () => void;\n readonly claim: (\n adapterKind: ExternalHandoffActiveAdapterKind,\n connectorInstanceId: string,\n baselineCursor: string | null,\n ) => BridgeActiveClaimResult;\n readonly close: () => void;\n readonly heartbeat: (leaseToken: string) => BridgeActiveStateResult;\n readonly release: (leaseToken: string) => BridgeActiveStateResult;\n readonly report: (\n leaseToken: string,\n cursor: string,\n phase: ExternalHandoffReportableDispatchPhase,\n ) => BridgeActiveStateResult;\n readonly reserve: (\n cursor: string,\n revision: number,\n ) => ExternalHandoffPublishDelivery;\n readonly resolveDelivery: (cursor: string) => ActiveRegistrySnapshot;\n readonly snapshot: (cursor?: string) => ActiveRegistrySnapshot;\n}\n\nexport interface CreateActiveAdapterRegistryOptions {\n readonly clock?: ExternalHandoffClock;\n readonly randomId?: () => string;\n}\n\nconst ALLOWED_TRANSITIONS = Object.freeze({\n queued: [\"dispatching\", \"failed\"],\n dispatching: [\"dispatched\", \"working\", \"failed\", \"delivery-unknown\"],\n dispatched: [\"working\", \"failed\", \"delivery-unknown\"],\n working: [\"completed\", \"failed\", \"delivery-unknown\"],\n completed: [],\n failed: [],\n \"delivery-unknown\": [],\n} as const) satisfies Readonly<\n Record<ExternalHandoffDispatchPhase, readonly ExternalHandoffDispatchPhase[]>\n>;\n\nconst TERMINAL_PHASES = new Set<ExternalHandoffDispatchPhase>([\n \"completed\",\n \"failed\",\n \"delivery-unknown\",\n]);\n\nfunction defaultRandomId(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nfunction requirePresent<T>(value: T | null): T {\n if (value === null) throw new SpotPatchError(ERROR_CODES.INTERNAL_ERROR);\n return value;\n}\n\nexport function createActiveAdapterRegistry(\n options: CreateActiveAdapterRegistryOptions = {},\n): ActiveAdapterRegistry {\n const clock = options.clock ?? SYSTEM_EXTERNAL_HANDOFF_CLOCK;\n const randomId = options.randomId ?? defaultRandomId;\n let blocked: BlockedAdapter | undefined;\n let closed = false;\n let dispatch: ActiveDispatch | undefined;\n let lastReleasedToken: string | undefined;\n let lease: ActiveLease | undefined;\n\n const nowIso = (): string => new Date(clock.wallNow()).toISOString();\n\n const requireOpen = (): void => {\n if (closed) throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n };\n\n const dispatchSummary = (): DispatchSummary | null =>\n dispatch === undefined\n ? null\n : Object.freeze({\n adapterKind: dispatch.adapterKind,\n revision: dispatch.revision,\n phase: dispatch.phase,\n updatedAt: dispatch.updatedAt,\n });\n\n const activeSummary = (): ActiveAdapterSummary | null => {\n if (blocked !== undefined) {\n return Object.freeze({\n kind: blocked.adapterKind,\n state: \"blocked\",\n canDispatch: false,\n connectedAt: blocked.connectedAt,\n updatedAt: blocked.updatedAt,\n });\n }\n\n if (lease === undefined) return null;\n const busy = dispatch !== undefined && !TERMINAL_PHASES.has(dispatch.phase);\n return Object.freeze({\n kind: lease.adapterKind,\n state: busy ? \"busy\" : \"ready\",\n canDispatch: !busy,\n connectedAt: lease.connectedAt,\n updatedAt: lease.updatedAt,\n });\n };\n\n const state = (cursor?: string): ActiveRegistrySnapshot =>\n Object.freeze({\n activeAdapter: activeSummary(),\n dispatch:\n cursor === undefined || dispatch?.cursor === cursor ? dispatchSummary() : null,\n });\n\n const enterUnknown = (activeLease: ActiveLease): void => {\n if (dispatch === undefined) return;\n const updatedAt = nowIso();\n dispatch.phase = \"delivery-unknown\";\n dispatch.updatedAt = updatedAt;\n blocked = Object.freeze({\n adapterKind: activeLease.adapterKind,\n connectedAt: activeLease.connectedAt,\n updatedAt,\n });\n };\n\n const endLease = (activeLease: ActiveLease): void => {\n if (dispatch?.phase === \"queued\") {\n dispatch.phase = \"failed\";\n dispatch.updatedAt = nowIso();\n } else if (\n dispatch?.phase === \"dispatching\" ||\n dispatch?.phase === \"dispatched\" ||\n dispatch?.phase === \"working\"\n ) {\n enterUnknown(activeLease);\n }\n\n lastReleasedToken = activeLease.token;\n lease = undefined;\n };\n\n const sweep = (): void => {\n if (lease === undefined) return;\n const monotonicNow = clock.monotonicNow();\n\n if (\n monotonicNow >= lease.expiresAtMonotonic ||\n (dispatch !== undefined &&\n !TERMINAL_PHASES.has(dispatch.phase) &&\n monotonicNow >= dispatch.deadlineMonotonic)\n ) {\n endLease(lease);\n }\n };\n\n const assertPublishable = (): void => {\n requireOpen();\n sweep();\n\n if (\n blocked !== undefined ||\n (lease !== undefined &&\n dispatch !== undefined &&\n !TERMINAL_PHASES.has(dispatch.phase))\n ) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_AGENT_BUSY);\n }\n };\n\n const requireLease = (leaseToken: string): ActiveLease => {\n requireOpen();\n sweep();\n\n if (lease?.token !== leaseToken) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID);\n }\n\n return lease;\n };\n\n return Object.freeze({\n assertPublishable,\n\n claim(\n adapterKind: ExternalHandoffActiveAdapterKind,\n connectorInstanceId: string,\n baselineCursor: string | null,\n ) {\n requireOpen();\n sweep();\n\n if (blocked !== undefined) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_AGENT_BUSY);\n }\n if (lease !== undefined) {\n if (\n lease.adapterKind === adapterKind &&\n lease.connectorInstanceId === connectorInstanceId\n ) {\n lease.expiresAtMonotonic =\n clock.monotonicNow() + EXTERNAL_HANDOFF_LIMITS.activeLeaseDurationMs;\n lease.updatedAt = nowIso();\n return Object.freeze({\n leaseToken: lease.token,\n heartbeatIntervalMs: EXTERNAL_HANDOFF_LIMITS.activeHeartbeatIntervalMs,\n baselineCursor: lease.baselineCursor,\n activeAdapter: requirePresent(activeSummary()),\n });\n }\n throw new SpotPatchError(ERROR_CODES.ACTIVE_ADAPTER_CONFLICT);\n }\n\n const timestamp = nowIso();\n lease = {\n adapterKind,\n baselineCursor,\n connectedAt: timestamp,\n connectorInstanceId,\n token: randomId(),\n expiresAtMonotonic:\n clock.monotonicNow() + EXTERNAL_HANDOFF_LIMITS.activeLeaseDurationMs,\n updatedAt: timestamp,\n };\n lastReleasedToken = undefined;\n return Object.freeze({\n leaseToken: lease.token,\n heartbeatIntervalMs: EXTERNAL_HANDOFF_LIMITS.activeHeartbeatIntervalMs,\n baselineCursor,\n activeAdapter: requirePresent(activeSummary()),\n });\n },\n\n heartbeat(leaseToken: string) {\n const activeLease = requireLease(leaseToken);\n activeLease.expiresAtMonotonic =\n clock.monotonicNow() + EXTERNAL_HANDOFF_LIMITS.activeLeaseDurationMs;\n activeLease.updatedAt = nowIso();\n return state();\n },\n\n report(\n leaseToken: string,\n cursor: string,\n phase: ExternalHandoffReportableDispatchPhase,\n ) {\n const activeLease = requireLease(leaseToken);\n\n if (\n dispatch?.cursor !== cursor ||\n dispatch.adapterKind !== activeLease.adapterKind\n ) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_DISPATCH_INVALID);\n }\n if (dispatch.phase === phase) return state(cursor);\n const allowed: readonly ExternalHandoffDispatchPhase[] =\n ALLOWED_TRANSITIONS[dispatch.phase];\n if (!allowed.includes(phase)) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_DISPATCH_INVALID);\n }\n\n const updatedAt = nowIso();\n dispatch.phase = phase;\n dispatch.updatedAt = updatedAt;\n activeLease.updatedAt = updatedAt;\n\n if (phase === \"delivery-unknown\") {\n blocked = Object.freeze({\n adapterKind: activeLease.adapterKind,\n connectedAt: activeLease.connectedAt,\n updatedAt,\n });\n lastReleasedToken = activeLease.token;\n lease = undefined;\n }\n\n return state(cursor);\n },\n\n release(leaseToken: string) {\n requireOpen();\n sweep();\n\n if (lease === undefined && lastReleasedToken === leaseToken) return state();\n const activeLease = lease;\n if (activeLease?.token !== leaseToken) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID);\n }\n\n endLease(activeLease);\n return state();\n },\n\n reserve(cursor: string, revision: number) {\n assertPublishable();\n if (lease === undefined) return Object.freeze({ mode: \"inbox\" });\n\n const updatedAt = nowIso();\n dispatch = {\n adapterKind: lease.adapterKind,\n cursor,\n deadlineMonotonic:\n clock.monotonicNow() + EXTERNAL_HANDOFF_LIMITS.activeDispatchTimeoutMs,\n revision,\n phase: \"queued\",\n updatedAt,\n };\n lease.updatedAt = updatedAt;\n return Object.freeze({\n mode: \"active\",\n adapter: requirePresent(activeSummary()),\n dispatch: requirePresent(dispatchSummary()),\n });\n },\n\n resolveDelivery(cursor: string) {\n requireOpen();\n sweep();\n\n const activeDispatch = dispatch;\n if (\n blocked === undefined ||\n activeDispatch?.cursor !== cursor ||\n activeDispatch.phase !== \"delivery-unknown\"\n ) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_DISPATCH_INVALID);\n }\n\n blocked = undefined;\n return state(cursor);\n },\n\n snapshot(cursor?: string) {\n requireOpen();\n sweep();\n return state(cursor);\n },\n\n close() {\n if (closed) return;\n closed = true;\n blocked = undefined;\n dispatch = undefined;\n lease = undefined;\n lastReleasedToken = undefined;\n },\n });\n}\n","import { performance } from \"node:perf_hooks\";\n\nexport interface ExternalHandoffClock {\n readonly monotonicNow: () => number;\n readonly wallNow: () => number;\n}\n\nexport const SYSTEM_EXTERNAL_HANDOFF_CLOCK: ExternalHandoffClock = Object.freeze({\n monotonicNow: () => performance.now(),\n wallNow: () => Date.now(),\n});\n","import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport {\n createServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport type { Socket } from \"node:net\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n EXTERNAL_HANDOFF_LIMITS,\n SpotPatchError,\n type ApiFailure,\n type ApiSuccess,\n type ExternalHandoffFramework,\n} from \"@spotpatch/shared\";\nimport {\n SPOTPATCH_BRIDGE_PATHS,\n SPOTPATCH_BRIDGE_TOKEN_HEADER,\n bridgeAckRequestSchema,\n bridgeActiveClaimRequestSchema,\n bridgeActiveHeartbeatRequestSchema,\n bridgeActiveReleaseRequestSchema,\n bridgeActiveReportRequestSchema,\n bridgeCurrentRequestSchema,\n bridgeStatusRequestSchema,\n bridgeWaitRequestSchema,\n} from \"@spotpatch/shared/external-agent-node\";\n\nimport { readJsonRequestBody } from \"../server/request-body.js\";\nimport type { ActiveAdapterRegistry } from \"./active-registry.js\";\nimport type { ExternalHandoffStore } from \"./store.js\";\n\nexport interface ExternalHandoffBroker {\n readonly bridgeToken: string;\n readonly close: () => Promise<void>;\n readonly endpoint: string;\n readonly isReady: () => boolean;\n}\n\nexport interface CreateExternalHandoffBrokerOptions {\n readonly activeRegistry: ActiveAdapterRegistry;\n readonly framework: ExternalHandoffFramework;\n readonly projectKey: string;\n readonly sessionId: string;\n readonly store: ExternalHandoffStore;\n}\n\nfunction singleHeader(request: IncomingMessage, name: string): string | undefined {\n const value = request.headers[name.toLowerCase()];\n return Array.isArray(value) ? undefined : value;\n}\n\nfunction tokensMatch(actual: string | undefined, expected: string): boolean {\n if (actual === undefined) return false;\n const actualBytes = Buffer.from(actual);\n const expectedBytes = Buffer.from(expected);\n return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\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(\"Connection\", \"close\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n response.end(JSON.stringify(payload));\n}\n\nfunction statusForError(code: string): number {\n if (code === ERROR_CODES.BRIDGE_UNAUTHORIZED) return 401;\n if (code === ERROR_CODES.HANDOFF_NOT_FOUND) return 404;\n if (code === ERROR_CODES.HANDOFF_EXPIRED || code === ERROR_CODES.SESSION_CLOSED) {\n return 410;\n }\n if (code === ERROR_CODES.BRIDGE_BUSY) return 429;\n if (code === ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID) return 401;\n if (code === ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE) return 413;\n if (\n code === ERROR_CODES.HANDOFF_CURSOR_INVALID ||\n code === ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH ||\n code === ERROR_CODES.EXTERNAL_AGENT_BUSY ||\n code === ERROR_CODES.ACTIVE_ADAPTER_CONFLICT ||\n code === ERROR_CODES.ACTIVE_DISPATCH_INVALID\n ) {\n return 409;\n }\n if (code === ERROR_CODES.INVALID_REQUEST) return 400;\n return 500;\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 assertAuthorized(\n request: IncomingMessage,\n expectedHost: string,\n bridgeToken: string,\n): void {\n if (\n request.socket.remoteAddress !== \"127.0.0.1\" ||\n singleHeader(request, \"host\") !== expectedHost ||\n !tokensMatch(singleHeader(request, SPOTPATCH_BRIDGE_TOKEN_HEADER), bridgeToken)\n ) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);\n }\n}\n\nasync function closeServer(server: Server, sockets: Set<Socket>): Promise<void> {\n await new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n\n for (const socket of sockets) {\n socket.destroy();\n }\n });\n}\n\nexport async function createExternalHandoffBroker(\n options: CreateExternalHandoffBrokerOptions,\n): Promise<ExternalHandoffBroker> {\n const bridgeToken = randomBytes(32).toString(\"base64url\");\n const sockets = new Set<Socket>();\n let expectedHost = \"\";\n const server = createServer(\n { maxHeaderSize: EXTERNAL_HANDOFF_LIMITS.maximumBrokerHeaderBytes },\n (request, response) => {\n const handle = async (): Promise<void> => {\n assertAuthorized(request, expectedHost, bridgeToken);\n\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const body = await readJsonRequestBody(\n request,\n EXTERNAL_HANDOFF_LIMITS.maximumBrokerRequestBytes,\n );\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.status) {\n const parsed = bridgeStatusRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n let current = null;\n\n try {\n current = options.store.status();\n } catch (error: unknown) {\n if (\n !(error instanceof SpotPatchError) ||\n error.code !== ERROR_CODES.HANDOFF_NOT_FOUND\n ) {\n throw error;\n }\n }\n\n writeJson(response, 200, {\n ok: true,\n data: Object.freeze({\n brokerProtocolVersion: EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n projectKey: options.projectKey,\n sessionId: options.sessionId,\n framework: options.framework,\n current,\n }),\n });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.current) {\n const parsed = bridgeCurrentRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const snapshot = options.store.current(parsed.data.cursor);\n writeJson(response, 200, {\n ok: true,\n data: Object.freeze({ outcome: \"handoff\" as const, snapshot }),\n });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.ack) {\n const parsed = bridgeAckRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const summary = options.store.ack(\n parsed.data.cursor,\n parsed.data.connectorInstanceId,\n );\n writeJson(response, 200, {\n ok: true,\n data: Object.freeze({ summary }),\n });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.wait) {\n const parsed = bridgeWaitRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const controller = new AbortController();\n const abort = (): void => {\n if (!response.writableEnded) controller.abort(\"bridge-client-closed\");\n };\n response.once(\"close\", abort);\n\n try {\n const data = await options.store.wait(\n parsed.data.afterCursor,\n parsed.data.timeoutMs,\n controller.signal,\n );\n writeJson(response, 200, { ok: true, data });\n } finally {\n response.removeListener(\"close\", abort);\n }\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.activeClaim) {\n const parsed = bridgeActiveClaimRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const data = options.activeRegistry.claim(\n parsed.data.adapterKind,\n parsed.data.connectorInstanceId,\n options.store.currentCursor(),\n );\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.activeHeartbeat) {\n const parsed = bridgeActiveHeartbeatRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const data = options.activeRegistry.heartbeat(parsed.data.leaseToken);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.activeReport) {\n const parsed = bridgeActiveReportRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const data = options.activeRegistry.report(\n parsed.data.leaseToken,\n parsed.data.cursor,\n parsed.data.phase,\n );\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.activeRelease) {\n const parsed = bridgeActiveReleaseRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const data = options.activeRegistry.release(parsed.data.leaseToken);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n };\n\n void handle().catch((error: unknown) => {\n if (response.writableEnded || response.destroyed) return;\n const normalized = normalizeError(error);\n\n if (normalized.code === ERROR_CODES.BRIDGE_BUSY) {\n response.setHeader(\"Retry-After\", \"1\");\n }\n\n writeJson(response, statusForError(normalized.code), {\n ok: false,\n error: {\n code: normalized.code,\n message: \"The local SpotPatch bridge request failed.\",\n },\n });\n });\n },\n );\n server.maxConnections = EXTERNAL_HANDOFF_LIMITS.maximumBrokerSockets;\n server.headersTimeout = 5_000;\n server.requestTimeout = EXTERNAL_HANDOFF_LIMITS.maximumWaitMs + 5_000;\n server.keepAliveTimeout = 1;\n server.on(\"connection\", (socket) => {\n if (sockets.size >= EXTERNAL_HANDOFF_LIMITS.maximumBrokerSockets) {\n socket.destroy();\n return;\n }\n\n sockets.add(socket);\n socket.once(\"close\", () => sockets.delete(socket));\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(0, \"127.0.0.1\", resolve);\n });\n const address = server.address();\n\n if (\n address === null ||\n typeof address === \"string\" ||\n address.address !== \"127.0.0.1\"\n ) {\n await closeServer(server, sockets);\n throw new Error(\"SpotPatch external Agent broker did not bind IPv4 loopback.\");\n }\n\n expectedHost = `127.0.0.1:${String(address.port)}`;\n let closed = false;\n let ready = true;\n server.removeAllListeners(\"error\");\n server.on(\"error\", () => {\n ready = false;\n\n for (const socket of sockets) socket.destroy();\n });\n return Object.freeze({\n bridgeToken,\n endpoint: `http://${expectedHost}`,\n isReady: () => ready && !closed,\n async close() {\n if (closed) return;\n closed = true;\n ready = false;\n await closeServer(server, sockets);\n },\n });\n}\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","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 { randomBytes } from \"node:crypto\";\nimport { lstat, open, rename, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n EXTERNAL_HANDOFF_LIMITS,\n type ExternalHandoffFramework,\n} from \"@spotpatch/shared\";\nimport {\n computeExternalHandoffProjectKey,\n assertPrivateExternalHandoffPath,\n externalHandoffDescriptorSchema,\n initializePrivateExternalHandoffFile,\n resolveExternalHandoffRuntimeDirectory,\n type ExternalHandoffDescriptor,\n} from \"@spotpatch/shared/external-agent-node\";\n\nexport interface PublishedExternalHandoffDescriptor {\n readonly close: () => Promise<void>;\n readonly descriptor: ExternalHandoffDescriptor;\n}\n\nexport interface PublishExternalHandoffDescriptorOptions {\n readonly bridgeToken: string;\n readonly endpoint: string;\n readonly framework: ExternalHandoffFramework;\n readonly root: string;\n readonly sessionId: string;\n}\n\nasync function syncDirectory(directory: string): Promise<void> {\n // Node cannot open directories for fsync on Windows. The atomic rename still\n // protects readers from observing a partial descriptor.\n if (process.platform === \"win32\") return;\n\n const handle = await open(directory, \"r\");\n\n try {\n await handle.sync();\n } catch (error: unknown) {\n const code = (error as NodeJS.ErrnoException).code;\n\n if (code !== \"EINVAL\" && code !== \"ENOTSUP\") {\n throw error;\n }\n } finally {\n await handle.close();\n }\n}\n\nexport async function publishExternalHandoffDescriptor(\n options: PublishExternalHandoffDescriptorOptions,\n): Promise<PublishedExternalHandoffDescriptor> {\n const directory = await resolveExternalHandoffRuntimeDirectory(true);\n const descriptor = externalHandoffDescriptorSchema.parse({\n schemaVersion: 1,\n brokerProtocolVersion: EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n projectKey: await computeExternalHandoffProjectKey(options.root),\n sessionId: options.sessionId,\n framework: options.framework,\n endpoint: options.endpoint,\n bridgeToken: options.bridgeToken,\n pid: process.pid,\n createdAt: new Date().toISOString(),\n });\n const serialized = JSON.stringify(descriptor);\n\n if (\n Buffer.byteLength(serialized, \"utf8\") >\n EXTERNAL_HANDOFF_LIMITS.maximumDescriptorBytes\n ) {\n throw new RangeError(\"SpotPatch external Agent descriptor exceeds its limit.\");\n }\n\n const destination = path.join(directory, `${descriptor.sessionId}.json`);\n const temporary = path.join(\n directory,\n `.${descriptor.sessionId}.${randomBytes(8).toString(\"hex\")}.tmp`,\n );\n let temporaryExists = false;\n let published = false;\n let descriptorIdentity: Readonly<{ device: number; inode: number }> = Object.freeze({\n device: -1,\n inode: -1,\n });\n\n try {\n const handle = await open(temporary, \"wx\", 0o600);\n temporaryExists = true;\n\n try {\n await handle.writeFile(serialized, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n\n await initializePrivateExternalHandoffFile(temporary);\n await rename(temporary, destination);\n temporaryExists = false;\n published = true;\n const status = await assertPrivateExternalHandoffPath(destination, \"file\");\n\n descriptorIdentity = Object.freeze({ device: status.dev, inode: status.ino });\n\n await syncDirectory(directory);\n } catch (error: unknown) {\n if (temporaryExists) {\n await unlink(temporary).catch(() => undefined);\n }\n\n if (published) {\n await unlink(destination).catch(() => undefined);\n }\n\n throw error;\n }\n\n let closed = false;\n return Object.freeze({\n descriptor,\n async close() {\n if (closed) return;\n closed = true;\n await lstat(destination)\n .then(async (status) => {\n if (\n status.dev === descriptorIdentity.device &&\n status.ino === descriptorIdentity.inode\n ) {\n await unlink(destination);\n }\n })\n .catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n await syncDirectory(directory);\n },\n });\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { ExternalHandoffPublishRequest } from \"@spotpatch/shared\";\n\nfunction canonicalJson(value: unknown): string {\n if (value === null || typeof value === \"boolean\" || typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new TypeError(\"Non-finite JSON number.\");\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((entry) => canonicalJson(entry)).join(\",\")}]`;\n }\n if (typeof value === \"object\") {\n const record = value as Readonly<Record<string, unknown>>;\n return `{${Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`)\n .join(\",\")}}`;\n }\n\n throw new TypeError(\"Unsupported JSON value.\");\n}\n\nexport function fingerprintExternalHandoffAnnotation(\n annotation: ExternalHandoffPublishRequest[\"annotation\"],\n): string {\n return createHash(\"sha256\").update(canonicalJson(annotation)).digest(\"hex\");\n}\n","import { randomBytes } from \"node:crypto\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_HANDOFF_LIMITS,\n EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n SpotPatchError,\n type ExternalHandoffFramework,\n type ExternalHandoffPublishDelivery,\n type ExternalHandoffPublishResult,\n type ExternalHandoffSnapshot,\n type ExternalHandoffState,\n type ExternalHandoffSummary,\n type SpotAnnotation,\n} from \"@spotpatch/shared\";\nimport type { BridgeWaitResult } from \"@spotpatch/shared/external-agent-node\";\n\nimport { SYSTEM_EXTERNAL_HANDOFF_CLOCK, type ExternalHandoffClock } from \"./clock.js\";\n\ninterface CurrentHandoff {\n readonly expiresAtMonotonic: number;\n readonly receipts: Set<string>;\n readonly snapshot: ExternalHandoffSnapshot;\n pickedUpAt?: string;\n}\n\ninterface HandoffWaiter {\n readonly reject: (error: SpotPatchError) => void;\n readonly resolve: (result: BridgeWaitResult) => void;\n}\n\ninterface IdempotencyRecord {\n readonly expiresAtMonotonic: number;\n readonly fingerprint: string;\n readonly result: ExternalHandoffPublishResult;\n}\n\nexport interface PublishExternalHandoffInput {\n readonly annotation: SpotAnnotation;\n readonly fingerprint: string;\n readonly requestId: string;\n readonly reserve: (\n cursor: string,\n revision: number,\n ) => ExternalHandoffPublishDelivery;\n}\n\nexport interface ExternalHandoffStore {\n readonly activeWaitCount: () => number;\n readonly ack: (cursor: string, connectorInstanceId: string) => ExternalHandoffSummary;\n readonly close: () => void;\n readonly current: (cursor?: string) => ExternalHandoffSnapshot;\n readonly currentCursor: () => string | null;\n readonly publish: (\n input: PublishExternalHandoffInput,\n ) => ExternalHandoffPublishResult;\n readonly replay: (\n requestId: string,\n fingerprint: string,\n ) => ExternalHandoffPublishResult | undefined;\n readonly status: (cursor?: string) => ExternalHandoffSummary;\n readonly wait: (\n afterCursor: string | undefined,\n timeoutMs: number,\n signal: AbortSignal,\n ) => Promise<BridgeWaitResult>;\n}\n\nexport interface CreateExternalHandoffStoreOptions {\n readonly clock?: ExternalHandoffClock;\n readonly framework: ExternalHandoffFramework;\n readonly randomId?: () => string;\n readonly sessionId: string;\n}\n\nfunction defaultRandomId(): string {\n return randomBytes(24).toString(\"base64url\");\n}\n\nfunction pageSummary(\n annotation: SpotAnnotation,\n): Readonly<{ origin: string; pathname: string }> {\n let origin = \"[unavailable]\";\n\n try {\n const url = new URL(annotation.page.url);\n origin = url.origin === \"null\" ? \"[unavailable]\" : url.origin;\n } catch {\n // Invalid and non-standard origins are intentionally omitted from the summary.\n }\n\n return Object.freeze({ origin, pathname: annotation.page.pathname });\n}\n\nfunction summaryOf(\n current: CurrentHandoff,\n state: ExternalHandoffState,\n): ExternalHandoffSummary {\n const snapshot = current.snapshot;\n return Object.freeze({\n sessionId: snapshot.session.id,\n framework: snapshot.session.framework,\n revision: snapshot.revision,\n cursor: snapshot.cursor,\n targetCount: snapshot.annotation.targets.length,\n page: pageSummary(snapshot.annotation),\n publishedAt: snapshot.publishedAt,\n expiresAt: snapshot.expiresAt,\n state,\n pickupCount: current.receipts.size,\n ...(current.pickedUpAt === undefined ? {} : { pickedUpAt: current.pickedUpAt }),\n });\n}\n\nfunction replayResult(record: IdempotencyRecord): ExternalHandoffPublishResult {\n return Object.freeze({ ...record.result, replayed: true });\n}\n\nexport function createExternalHandoffStore(\n options: CreateExternalHandoffStoreOptions,\n): ExternalHandoffStore {\n const clock = options.clock ?? SYSTEM_EXTERNAL_HANDOFF_CLOCK;\n const randomId = options.randomId ?? defaultRandomId;\n const history: ExternalHandoffSummary[] = [];\n const idempotency = new Map<string, IdempotencyRecord>();\n const waiters = new Set<HandoffWaiter>();\n let closed = false;\n let current: CurrentHandoff | undefined;\n let revision = 0;\n\n const requireOpen = (): void => {\n if (closed) throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n };\n\n const archive = (state: \"expired\" | \"superseded\"): void => {\n if (current === undefined) return;\n history.unshift(summaryOf(current, state));\n history.length = Math.min(\n history.length,\n EXTERNAL_HANDOFF_LIMITS.maximumHistorySummaries,\n );\n current = undefined;\n };\n\n const sweep = (): void => {\n const monotonicNow = clock.monotonicNow();\n\n if (current !== undefined && monotonicNow >= current.expiresAtMonotonic) {\n archive(\"expired\");\n }\n\n for (const [requestId, record] of idempotency) {\n if (monotonicNow >= record.expiresAtMonotonic) idempotency.delete(requestId);\n }\n };\n\n const knownSummary = (cursor: string): ExternalHandoffSummary | undefined => {\n sweep();\n\n if (current?.snapshot.cursor === cursor) {\n return summaryOf(current, \"available\");\n }\n\n return history.find((summary) => summary.cursor === cursor);\n };\n\n const readCurrent = (cursor?: string): ExternalHandoffSnapshot => {\n requireOpen();\n sweep();\n\n if (current === undefined) {\n const prior = cursor === undefined ? undefined : knownSummary(cursor);\n throw new SpotPatchError(\n prior?.state === \"expired\"\n ? ERROR_CODES.HANDOFF_EXPIRED\n : cursor === undefined\n ? ERROR_CODES.HANDOFF_NOT_FOUND\n : ERROR_CODES.HANDOFF_CURSOR_INVALID,\n );\n }\n\n if (cursor !== undefined && cursor !== current.snapshot.cursor) {\n const prior = knownSummary(cursor);\n throw new SpotPatchError(\n prior?.state === \"expired\"\n ? ERROR_CODES.HANDOFF_EXPIRED\n : ERROR_CODES.HANDOFF_CURSOR_INVALID,\n );\n }\n\n return current.snapshot;\n };\n\n const findReplay = (\n requestId: string,\n fingerprint: string,\n ): ExternalHandoffPublishResult | undefined => {\n requireOpen();\n sweep();\n const record = idempotency.get(requestId);\n\n if (record === undefined) return undefined;\n if (record.fingerprint !== fingerprint) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_VALIDATION_FAILED);\n }\n\n return replayResult(record);\n };\n\n const settleWaiters = (result: BridgeWaitResult): void => {\n const pending = [...waiters];\n waiters.clear();\n\n for (const waiter of pending) waiter.resolve(result);\n };\n\n return Object.freeze({\n activeWaitCount: () => waiters.size,\n\n replay: findReplay,\n\n publish(input: PublishExternalHandoffInput) {\n requireOpen();\n const replayed = findReplay(input.requestId, input.fingerprint);\n if (replayed !== undefined) return replayed;\n if (idempotency.size >= EXTERNAL_HANDOFF_LIMITS.maximumRequestIdRecords) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE);\n }\n\n const nextRevision = revision + 1;\n const publishedAtMs = clock.wallNow();\n const publishedAtMonotonic = clock.monotonicNow();\n const snapshot = Object.freeze({\n schemaVersion: EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n cursor: randomId(),\n session: Object.freeze({ id: options.sessionId, framework: options.framework }),\n revision: nextRevision,\n publishedAt: new Date(publishedAtMs).toISOString(),\n expiresAt: new Date(\n publishedAtMs + EXTERNAL_HANDOFF_LIMITS.handoffTtlMs,\n ).toISOString(),\n annotation: input.annotation,\n }) satisfies ExternalHandoffSnapshot;\n\n if (\n Buffer.byteLength(JSON.stringify(snapshot), \"utf8\") >\n EXTERNAL_HANDOFF_LIMITS.maximumSnapshotBytes\n ) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE);\n }\n\n const delivery = input.reserve(snapshot.cursor, nextRevision);\n\n if (current !== undefined) archive(\"superseded\");\n revision = nextRevision;\n current = {\n expiresAtMonotonic: publishedAtMonotonic + EXTERNAL_HANDOFF_LIMITS.handoffTtlMs,\n receipts: new Set<string>(),\n snapshot,\n };\n const result = Object.freeze({\n handoff: summaryOf(current, \"available\"),\n delivery,\n replayed: false,\n }) satisfies ExternalHandoffPublishResult;\n idempotency.set(\n input.requestId,\n Object.freeze({\n expiresAtMonotonic:\n publishedAtMonotonic + EXTERNAL_HANDOFF_LIMITS.requestIdTtlMs,\n fingerprint: input.fingerprint,\n result,\n }),\n );\n settleWaiters(Object.freeze({ outcome: \"handoff\", snapshot }));\n return result;\n },\n\n current: readCurrent,\n\n currentCursor() {\n requireOpen();\n sweep();\n return current?.snapshot.cursor ?? null;\n },\n\n status(cursor?: string) {\n requireOpen();\n sweep();\n\n if (cursor === undefined) {\n if (current === undefined) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_NOT_FOUND);\n }\n return summaryOf(current, \"available\");\n }\n\n const summary = knownSummary(cursor);\n if (summary === undefined) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_CURSOR_INVALID);\n }\n return summary;\n },\n\n ack(cursor: string, connectorInstanceId: string) {\n const snapshot = readCurrent(cursor);\n\n if (snapshot !== current?.snapshot) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_CURSOR_INVALID);\n }\n if (!current.receipts.has(connectorInstanceId)) {\n if (current.receipts.size >= EXTERNAL_HANDOFF_LIMITS.maximumConnectorReceipts) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_BUSY);\n }\n current.receipts.add(connectorInstanceId);\n current.pickedUpAt = new Date(clock.wallNow()).toISOString();\n }\n\n return summaryOf(current, \"available\");\n },\n\n async wait(\n afterCursor: string | undefined,\n timeoutMs: number,\n signal: AbortSignal,\n ) {\n requireOpen();\n sweep();\n\n if (afterCursor === undefined && current !== undefined) {\n return Object.freeze({ outcome: \"handoff\", snapshot: current.snapshot });\n }\n if (afterCursor !== undefined) {\n const known = knownSummary(afterCursor);\n if (known === undefined) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_CURSOR_INVALID);\n }\n if (current !== undefined && current.snapshot.cursor !== afterCursor) {\n return Object.freeze({ outcome: \"handoff\", snapshot: current.snapshot });\n }\n }\n if (waiters.size >= EXTERNAL_HANDOFF_LIMITS.maximumWaiters) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_BUSY);\n }\n if (signal.aborted) throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n\n return new Promise<BridgeWaitResult>((resolve, reject) => {\n let settled = false;\n const finish = (): boolean => {\n if (settled) return false;\n settled = true;\n waiters.delete(waiter);\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", abort);\n return true;\n };\n const waiter: HandoffWaiter = {\n reject(error) {\n if (finish()) reject(error);\n },\n resolve(result) {\n if (finish()) resolve(result);\n },\n };\n const abort = (): void => {\n waiter.reject(new SpotPatchError(ERROR_CODES.SESSION_CLOSED));\n };\n const timer = setTimeout(() => {\n waiter.resolve(Object.freeze({ outcome: \"timeout\" }));\n }, timeoutMs);\n timer.unref();\n signal.addEventListener(\"abort\", abort, { once: true });\n waiters.add(waiter);\n });\n },\n\n close() {\n if (closed) return;\n closed = true;\n current = undefined;\n history.length = 0;\n idempotency.clear();\n const pending = [...waiters];\n waiters.clear();\n\n for (const waiter of pending) {\n waiter.reject(new SpotPatchError(ERROR_CODES.SESSION_CLOSED));\n }\n },\n });\n}\n","import type { ResolvedSpotPatchOptions, 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\nexport function resolveCredentialEnvironment(\n options: ResolvedSpotPatchOptions,\n environment: Readonly<Record<string, string | undefined>>,\n): Readonly<Record<string, string>> {\n if (options.ai === false) {\n return Object.freeze({});\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 = environment[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 return Object.freeze(\n Object.fromEntries(\n [...names].map((name) => {\n const value = environment[name];\n\n if (value === undefined) {\n throw new RangeError(\"SpotPatch AI credential resolution failed.\");\n }\n\n return [name, value];\n }),\n ),\n );\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 { randomBytes } from \"node:crypto\";\nimport {\n access,\n lstat,\n mkdir,\n readFile,\n realpath,\n rename,\n stat,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface IntegrationFileChange {\n readonly absolutePath: string;\n readonly nextContent: string;\n readonly previousContent?: string;\n readonly relativePath: string;\n}\n\nexport interface IntegrationPlan {\n readonly appRoot: string;\n readonly changes: readonly IntegrationFileChange[];\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nfunction isPathWithin(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n\n return (\n relative === \"\" ||\n (relative !== \"..\" &&\n !relative.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction relativePathWithin(root: string, target: string): string {\n const relative = path.relative(root, target);\n\n if (relative.length === 0 || !isPathWithin(root, target)) {\n throw new Error(\"SpotPatch init refuses to modify a path outside the app root.\");\n }\n\n return relative.split(path.sep).join(\"/\");\n}\n\nexport async function integrationPathExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readIntegrationFile(absolutePath: string): Promise<string> {\n const metadata = await lstat(absolutePath);\n\n if (!metadata.isFile() || metadata.isSymbolicLink()) {\n throw new Error(\n `SpotPatch refuses to modify the non-regular file ${path.basename(absolutePath)}.`,\n );\n }\n\n return readFile(absolutePath, \"utf8\");\n}\n\nexport function createIntegrationFileChange(\n appRoot: string,\n absolutePath: string,\n nextContent: string,\n previousContent: string | undefined,\n): IntegrationFileChange | undefined {\n if (previousContent === nextContent) {\n return undefined;\n }\n\n const root = path.resolve(appRoot);\n const target = path.resolve(absolutePath);\n\n return Object.freeze({\n absolutePath: target,\n nextContent,\n ...(previousContent === undefined ? {} : { previousContent }),\n relativePath: relativePathWithin(root, target),\n });\n}\n\nfunction temporaryPath(absolutePath: string, label: string): string {\n return path.join(\n path.dirname(absolutePath),\n `.${path.basename(absolutePath)}.spotpatch-${label}-${String(process.pid)}-${randomBytes(8).toString(\"hex\")}`,\n );\n}\n\nasync function writeAtomic(\n absolutePath: string,\n content: string,\n mode: number,\n): Promise<void> {\n await mkdir(path.dirname(absolutePath), { recursive: true });\n const stagedPath = temporaryPath(absolutePath, \"stage\");\n\n try {\n await writeFile(stagedPath, content, { encoding: \"utf8\", flag: \"wx\", mode });\n await rename(stagedPath, absolutePath);\n } catch (error: unknown) {\n await unlink(stagedPath).catch(() => undefined);\n throw error;\n }\n}\n\nasync function rollbackChange(change: IntegrationFileChange): Promise<void> {\n const currentContent = await readIntegrationFile(change.absolutePath);\n\n if (currentContent !== change.nextContent) {\n throw new Error(\n `SpotPatch init cannot restore ${change.relativePath} because it changed during initialization.`,\n );\n }\n\n if (change.previousContent === undefined) {\n await unlink(change.absolutePath);\n return;\n }\n\n const mode = (await stat(change.absolutePath)).mode & 0o777;\n await writeAtomic(change.absolutePath, change.previousContent, mode);\n}\n\nasync function assertSafeTarget(\n appRoot: string,\n realAppRoot: string,\n change: IntegrationFileChange,\n): Promise<void> {\n const target = path.resolve(change.absolutePath);\n const relativePath = relativePathWithin(appRoot, target);\n\n if (\n target !== change.absolutePath ||\n relativePath !== change.relativePath ||\n path.dirname(target) === target\n ) {\n throw new Error(\"SpotPatch init received an invalid integration file plan.\");\n }\n\n let targetMetadata;\n\n try {\n targetMetadata = await lstat(target);\n } catch (error: unknown) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n }\n\n if (targetMetadata?.isSymbolicLink()) {\n throw new Error(\n `SpotPatch refuses to modify the symbolic link ${change.relativePath}.`,\n );\n }\n\n const containmentAnchor = await realpath(\n targetMetadata === undefined ? path.dirname(target) : target,\n );\n\n if (!isPathWithin(realAppRoot, containmentAnchor)) {\n throw new Error(\"SpotPatch init refuses to modify a path outside the app root.\");\n }\n}\n\nasync function assertCurrentBaseline(change: IntegrationFileChange): Promise<void> {\n if (change.previousContent === undefined) {\n try {\n await lstat(change.absolutePath);\n } catch (error: unknown) {\n if (isMissingPathError(error)) {\n return;\n }\n\n throw error;\n }\n\n throw new Error(\n `SpotPatch init cannot create ${change.relativePath} because it now exists.`,\n );\n }\n\n const currentContent = await readIntegrationFile(change.absolutePath);\n\n if (currentContent !== change.previousContent) {\n throw new Error(\n `SpotPatch init cannot update ${change.relativePath} because it changed after the preview.`,\n );\n }\n}\n\nexport async function applyIntegrationPlan(plan: IntegrationPlan): Promise<void> {\n if (plan.changes.length === 0) {\n return;\n }\n\n const appRoot = path.resolve(plan.appRoot);\n const realAppRoot = await realpath(appRoot);\n const targets = new Set<string>();\n\n for (const change of plan.changes) {\n if (targets.has(change.absolutePath)) {\n throw new Error(\"SpotPatch init received duplicate integration file changes.\");\n }\n\n targets.add(change.absolutePath);\n await assertSafeTarget(appRoot, realAppRoot, change);\n await assertCurrentBaseline(change);\n }\n\n const applied: IntegrationFileChange[] = [];\n\n try {\n for (const change of plan.changes) {\n await assertCurrentBaseline(change);\n const mode =\n change.previousContent === undefined\n ? 0o600\n : (await stat(change.absolutePath)).mode & 0o777;\n await writeAtomic(change.absolutePath, change.nextContent, mode);\n applied.push(change);\n }\n } catch (error: unknown) {\n const rollbackResults = await Promise.allSettled(\n applied.reverse().map(rollbackChange),\n );\n\n if (rollbackResults.some((result) => result.status === \"rejected\")) {\n throw new Error(\n \"SpotPatch init failed and could not completely restore the previous files.\",\n { cause: error },\n );\n }\n\n throw new Error(\"SpotPatch init failed; all written files were restored.\", {\n cause: error,\n });\n }\n}\n","import {\n AGENT_APPLY_MODES,\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 contextualAskOptionsSchema,\n CONTEXTUAL_ASK_LIMITS,\n type ContextualAskExecutorPreference,\n type ContextualAskOptions,\n DEFAULT_DATA_FLOW_LIMITS,\n type DataFlowLimits,\n type RuntimeDataFlowConfig,\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 type { SourceFilterEntry } from \"@spotpatch/compiler\";\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 = SourceFilterEntry;\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 SpotPatchDataFlowOptions {\n readonly runtime?: \"dispatch\";\n}\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 /** Exposes the review/trusted-fast selector after a project check is resolved. */\n readonly trustedFastMode?: boolean;\n readonly allowLan?: boolean;\n readonly debug?: boolean;\n readonly locale?: SpotPatchLocalePreference;\n readonly maxTargets?: number;\n readonly ai?: SpotPatchAiOptions;\n readonly dataFlow?: false | SpotPatchDataFlowOptions;\n readonly externalAgent?: boolean;\n readonly contextualAsk?: ContextualAskOptions;\n}\n\nexport interface ResolvedContextualAskOptions {\n readonly enabled: boolean;\n readonly defaultExecutor?: ContextualAskExecutorPreference;\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 readonly dataFlow: ResolvedSpotPatchDataFlowOptions;\n readonly externalAgent: Readonly<{ enabled: boolean }>;\n readonly contextualAsk: ResolvedContextualAskOptions;\n}\n\nexport interface ResolvedSpotPatchDataFlowOptions {\n readonly enabled: boolean;\n readonly runtime: \"dispatch\";\n readonly limits: DataFlowLimits;\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[/\\\\].+\\.(?:js|jsx|ts|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 dataFlow: Object.freeze({\n enabled: false,\n runtime: \"dispatch\",\n limits: DEFAULT_DATA_FLOW_LIMITS,\n }),\n externalAgent: Object.freeze({ enabled: false }),\n contextualAsk: Object.freeze({ enabled: 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(AGENT_APPLY_MODES).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 (\n applyMode !== \"review\" &&\n !Object.values(checks).some((check) => check.required)\n ) {\n throw new RangeError(`SpotPatch AI ${applyMode} 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\nfunction resolveDataFlowOptions(\n options: false | SpotPatchDataFlowOptions | undefined,\n): ResolvedSpotPatchDataFlowOptions {\n if (options === undefined || options === false) {\n return DEFAULT_OPTIONS.dataFlow;\n }\n\n const candidate: unknown = options;\n if (typeof candidate !== \"object\" || candidate === null) {\n throw new RangeError(\"SpotPatch dataFlow configuration is invalid.\");\n }\n\n const runtime: unknown = options.runtime ?? \"dispatch\";\n if (runtime !== \"dispatch\") {\n throw new RangeError(\"SpotPatch dataFlow runtime mode is invalid.\");\n }\n\n return Object.freeze({\n enabled: true,\n runtime,\n limits: DEFAULT_DATA_FLOW_LIMITS,\n });\n}\n\nfunction resolveContextualAskOptions(\n value: ContextualAskOptions | undefined,\n ai: false | ResolvedAiOptions,\n): ResolvedContextualAskOptions {\n if (value === undefined || value === false) return DEFAULT_OPTIONS.contextualAsk;\n const parsed = contextualAskOptionsSchema.safeParse(value);\n if (!parsed.success) {\n throw new RangeError(\"SpotPatch contextualAsk configuration is invalid.\");\n }\n const configured = typeof parsed.data === \"boolean\" ? {} : parsed.data;\n const preference = configured.defaultExecutor;\n if (preference?.kind === \"configured-key\") {\n const provider =\n ai === false ? undefined : ai.providers[preference.providerProfileId];\n if (provider?.models[preference.modelProfileId] === undefined) {\n throw new RangeError(\n \"SpotPatch contextualAsk default Key executor must reference a configured AI model.\",\n );\n }\n }\n if (\n ai !== false &&\n Object.values(ai.providers).reduce(\n (total, provider) => total + Object.keys(provider.models).length,\n 0,\n ) >= CONTEXTUAL_ASK_LIMITS.maximumExecutors\n ) {\n throw new RangeError(\n \"SpotPatch contextualAsk configuration exceeds the executor limit.\",\n );\n }\n return Object.freeze({\n enabled: true,\n ...(preference === undefined\n ? {}\n : { defaultExecutor: Object.freeze({ ...preference }) }),\n });\n}\n\nexport function createRuntimeDataFlowConfig(\n options: ResolvedSpotPatchDataFlowOptions,\n): RuntimeDataFlowConfig {\n return Object.freeze({\n enabled: options.enabled,\n runtime: options.runtime,\n limits: Object.freeze({\n observationMaxEntries: options.limits.observationMaxEntries,\n observationMaxBytes: options.limits.observationMaxBytes,\n observationTtlMs: options.limits.observationTtlMs,\n reportMaxBytes: options.limits.reportMaxBytes,\n }),\n });\n}\n\nexport function resolveOptions(\n options: SpotPatchOptions = {},\n environmentAi?: false | SimpleAiOptions,\n): ResolvedSpotPatchOptions {\n if (\n options.trustedFastMode !== undefined &&\n typeof options.trustedFastMode !== \"boolean\"\n ) {\n throw new RangeError(\"SpotPatch trustedFastMode must be a boolean.\");\n }\n\n if (\n options.externalAgent !== undefined &&\n typeof options.externalAgent !== \"boolean\"\n ) {\n throw new RangeError(\"SpotPatch externalAgent must be a boolean.\");\n }\n\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 ai = resolveAiOptions(options.ai ?? environmentAi);\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,\n dataFlow: resolveDataFlowOptions(options.dataFlow),\n externalAgent: Object.freeze({\n enabled: options.externalAgent ?? DEFAULT_OPTIONS.externalAgent.enabled,\n }),\n contextualAsk: resolveContextualAskOptions(options.contextualAsk, ai),\n } satisfies ResolvedSpotPatchOptions;\n\n if (\n resolved.shortcut.trim().length === 0 ||\n resolved.shortcut.length > 128 ||\n resolved.shortcut.includes(\"\\0\")\n ) {\n throw new RangeError(\"SpotPatch shortcut is invalid.\");\n }\n\n return Object.freeze(resolved);\n}\n","import { execFile } from \"node:child_process\";\nimport { access, lstat, readFile, realpath } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport {\n DEFAULT_AGENT_LIMITS,\n type AgentLimits,\n type ResolvedAgentCheckDefinition,\n type ResolvedAiOptions,\n} from \"@spotpatch/shared\";\n\nconst execFileAsync = promisify(execFile);\nconst TYPESCRIPT_CHECK_ID = \"spotpatch-typecheck\";\nconst TYPESCRIPT_CHECK_LABEL = \"TypeScript\";\n\ninterface ProjectManifest {\n readonly dependencies?: Readonly<Record<string, unknown>>;\n readonly devDependencies?: Readonly<Record<string, unknown>>;\n readonly peerDependencies?: Readonly<Record<string, unknown>>;\n}\n\nexport interface DiscoverProjectValidationCheckOptions {\n readonly appRoot: string;\n readonly timeoutMs: number;\n}\n\nexport interface ResolveProjectValidationChecksOptions extends DiscoverProjectValidationCheckOptions {\n readonly checks: Readonly<Record<string, ResolvedAgentCheckDefinition>>;\n}\n\nexport interface ResolveManagedExecutionValidationOptions {\n readonly ai: false | ResolvedAiOptions;\n readonly appRoot: string;\n}\n\nexport interface ResolvedManagedExecutionValidation {\n readonly checks: Readonly<Record<string, ResolvedAgentCheckDefinition>>;\n readonly limits: Readonly<AgentLimits>;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function isRegularFile(absolutePath: string): Promise<boolean> {\n try {\n const metadata = await lstat(absolutePath);\n return metadata.isFile() && !metadata.isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nasync function readManifest(appRoot: string): Promise<ProjectManifest | undefined> {\n const manifestPath = path.join(appRoot, \"package.json\");\n\n if (!(await isRegularFile(manifestPath))) {\n return undefined;\n }\n\n try {\n const value = JSON.parse(await readFile(manifestPath, \"utf8\")) as unknown;\n return isRecord(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction declaresTypeScript(manifest: ProjectManifest): boolean {\n return [\n manifest.dependencies,\n manifest.devDependencies,\n manifest.peerDependencies,\n ].some(\n (dependencies) =>\n isRecord(dependencies) && typeof dependencies.typescript === \"string\",\n );\n}\n\nasync function findGitRoot(appRoot: string): Promise<string | undefined> {\n try {\n const result = await execFileAsync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd: appRoot,\n encoding: \"utf8\",\n timeout: 5_000,\n windowsHide: true,\n });\n const root = await realpath(result.stdout.trim());\n const relative = path.relative(root, appRoot);\n\n if (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n ) {\n return root;\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n\nasync function resolveTypeScriptCli(appRoot: string): Promise<string | undefined> {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n\n try {\n const packagePath = resolveFromApplication.resolve(\"typescript/package.json\");\n const cliPath = path.join(path.dirname(packagePath), \"bin\", \"tsc\");\n await access(cliPath);\n return await realpath(cliPath);\n } catch {\n return undefined;\n }\n}\n\nfunction portableRelativePath(from: string, to: string): string {\n return path.relative(from, to).split(path.sep).join(\"/\");\n}\n\nfunction hasRequiredCheck(\n checks: Readonly<Record<string, ResolvedAgentCheckDefinition>>,\n): boolean {\n return Object.values(checks).some((check) => check.required);\n}\n\nfunction availableCheckId(\n checks: Readonly<Record<string, ResolvedAgentCheckDefinition>>,\n preferred: string,\n): string {\n if (checks[preferred] === undefined) return preferred;\n\n let suffix = 2;\n while (checks[`${preferred}-${String(suffix)}`] !== undefined) suffix += 1;\n return `${preferred}-${String(suffix)}`;\n}\n\nexport async function discoverProjectValidationCheck(\n options: DiscoverProjectValidationCheckOptions,\n): Promise<ResolvedAgentCheckDefinition | undefined> {\n const appRoot = await realpath(options.appRoot);\n const tsconfigPath = path.join(appRoot, \"tsconfig.json\");\n const [manifest, projectRoot, hasTsconfig] = await Promise.all([\n readManifest(appRoot),\n findGitRoot(appRoot),\n isRegularFile(tsconfigPath),\n ]);\n\n if (\n manifest === undefined ||\n projectRoot === undefined ||\n !hasTsconfig ||\n !declaresTypeScript(manifest)\n ) {\n return undefined;\n }\n\n const cliPath = await resolveTypeScriptCli(appRoot);\n\n if (cliPath === undefined) {\n return undefined;\n }\n\n const projectPath = portableRelativePath(projectRoot, tsconfigPath);\n\n if (projectPath.length === 0 || projectPath.startsWith(\"../\")) {\n return undefined;\n }\n\n return Object.freeze({\n id: TYPESCRIPT_CHECK_ID,\n label: TYPESCRIPT_CHECK_LABEL,\n command: process.execPath,\n args: Object.freeze([\n cliPath,\n \"--noEmit\",\n \"--pretty\",\n \"false\",\n \"--incremental\",\n \"false\",\n \"--project\",\n projectPath,\n ]),\n required: true,\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport async function resolveProjectValidationChecks(\n options: ResolveProjectValidationChecksOptions,\n): Promise<Readonly<Record<string, ResolvedAgentCheckDefinition>>> {\n if (hasRequiredCheck(options.checks)) return options.checks;\n\n const discovered = await discoverProjectValidationCheck(options);\n if (discovered === undefined) return options.checks;\n\n const id = availableCheckId(options.checks, discovered.id);\n return Object.freeze({\n ...options.checks,\n [id]: Object.freeze({ ...discovered, id }),\n });\n}\n\nexport async function resolveManagedExecutionValidation(\n options: ResolveManagedExecutionValidationOptions,\n): Promise<ResolvedManagedExecutionValidation> {\n const checks = options.ai === false ? Object.freeze({}) : options.ai.execution.checks;\n const limits =\n options.ai === false ? DEFAULT_AGENT_LIMITS : options.ai.execution.limits;\n\n return Object.freeze({\n checks: await resolveProjectValidationChecks({\n appRoot: options.appRoot,\n checks,\n timeoutMs: limits.checkTimeoutMs,\n }),\n limits,\n });\n}\n","import {\n resolveOptions,\n type ResolvedSpotPatchOptions,\n type SimpleAiOptions,\n type SpotPatchOptions,\n} from \"./options.js\";\nimport { resolveProjectValidationChecks } from \"./project-validation.js\";\n\nexport interface ResolveProjectOptionsInput {\n readonly appRoot: string;\n readonly environmentAi?: false | SimpleAiOptions;\n readonly options?: SpotPatchOptions;\n readonly resolveValidationChecks?: typeof resolveProjectValidationChecks;\n}\n\nexport async function resolveProjectOptions(\n input: ResolveProjectOptionsInput,\n): Promise<ResolvedSpotPatchOptions> {\n const userOptions = input.options ?? {};\n const resolved = resolveOptions(userOptions, input.environmentAi);\n\n if (!userOptions.trustedFastMode || resolved.ai === false) {\n return resolved;\n }\n\n if (resolved.ai.execution.applyMode === \"auto\") {\n throw new RangeError(\n \"SpotPatch trustedFastMode cannot be combined with applyMode auto.\",\n );\n }\n\n const checks = await (\n input.resolveValidationChecks ?? resolveProjectValidationChecks\n )({\n appRoot: input.appRoot,\n checks: resolved.ai.execution.checks,\n timeoutMs: resolved.ai.execution.limits.checkTimeoutMs,\n });\n\n if (!Object.values(checks).some((check) => check.required)) {\n throw new RangeError(\n \"SpotPatch trustedFastMode requires a configured required check or an available framework-compatible local project check.\",\n );\n }\n\n const ai = Object.freeze({\n ...resolved.ai,\n execution: Object.freeze({\n ...resolved.ai.execution,\n applyMode: \"trusted-auto\" as const,\n checks,\n }),\n });\n\n return Object.freeze({ ...resolved, ai });\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 registerDataFlowComponents(\n absolutePath: string,\n sourceVersion: string,\n components: readonly DataFlowComponentAnchorInput[],\n ): string;\n resolve(fileId: string): string | undefined;\n findRegisteredId(absolutePath: string): string | undefined;\n resolveDataFlowComponent(\n componentSourceId: string,\n ): DataFlowComponentAnchor | undefined;\n clear(): void;\n}\n\nexport interface DataFlowComponentAnchorInput {\n readonly componentSourceId: string;\n readonly line: number;\n readonly column: number;\n}\n\nexport interface DataFlowComponentAnchor extends DataFlowComponentAnchorInput {\n readonly fileId: string;\n readonly sourceVersion: string;\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 const componentAnchors = new Map<string, DataFlowComponentAnchor>();\n const componentIdsByPath = new Map<string, Set<string>>();\n\n function registerSourcePath(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 while (idToPath.has(fileId)) fileId = createId();\n pathToId.set(normalizedPath, fileId);\n idToPath.set(fileId, normalizedPath);\n return fileId;\n }\n\n return Object.freeze({\n register(absolutePath: string): string {\n return registerSourcePath(absolutePath);\n },\n\n registerDataFlowComponents(\n absolutePath: string,\n sourceVersion: string,\n components: readonly DataFlowComponentAnchorInput[],\n ): string {\n const normalizedPath = normalizeAbsolutePath(absolutePath);\n const previousIds = componentIdsByPath.get(normalizedPath);\n for (const componentSourceId of previousIds ?? []) {\n componentAnchors.delete(componentSourceId);\n }\n\n const fileId = registerSourcePath(normalizedPath);\n const currentIds = new Set<string>();\n for (const component of components) {\n currentIds.add(component.componentSourceId);\n componentAnchors.set(\n component.componentSourceId,\n Object.freeze({ ...component, fileId, sourceVersion }),\n );\n }\n componentIdsByPath.set(normalizedPath, currentIds);\n return fileId;\n },\n\n resolve(fileId: string): string | undefined {\n return idToPath.get(fileId);\n },\n\n findRegisteredId(absolutePath: string): string | undefined {\n return pathToId.get(normalizeAbsolutePath(absolutePath));\n },\n\n resolveDataFlowComponent(\n componentSourceId: string,\n ): DataFlowComponentAnchor | undefined {\n return componentAnchors.get(componentSourceId);\n },\n\n clear(): void {\n pathToId.clear();\n idToPath.clear();\n componentAnchors.clear();\n componentIdsByPath.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 { createHash, randomBytes } from \"node:crypto\";\n\nimport type {\n AskSourceGrantEntry,\n ContextualAskExecutor,\n ContextualAskReadSnapshot,\n} from \"@spotpatch/agent\";\nimport {\n askAnswerDraftSchema,\n askAnswerResultSchema,\n askJobCreateRequestSchema,\n askJobEventSchema,\n askJobResultResponseSchema,\n askJobSnapshotSchema,\n contextualAskCapabilitySchema,\n contextualAskExecutorCapabilitySchema,\n CONTEXTUAL_ASK_LIMITS,\n CONTEXTUAL_ASK_SCHEMA_VERSION,\n type AskAnswerBlock,\n type AskAnswerDraft,\n type AskAnswerResult,\n type AskAnswerWarning,\n type AskJobCreateRequest,\n type AskJobEvent,\n type AskJobResultResponse,\n type AskJobSnapshot,\n type AskJobStatus,\n type ContextualAskCapability,\n type ContextualAskErrorCode,\n type ContextualAskExecutorCapability,\n} from \"@spotpatch/shared\";\n\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport type {\n WorkspaceActivityCoordinator,\n WorkspaceActivityLease,\n} from \"../workspace/activity-coordinator.js\";\nimport { ContextualAskError, asContextualAskError } from \"./error.js\";\nimport {\n captureAskReadSnapshot,\n type CapturedAskReadSnapshot,\n type CaptureAskReadSnapshotOptions,\n} from \"./read-snapshot.js\";\n\nconst ACTIVE_STATUSES = new Set<AskJobStatus>([\n \"queued\",\n \"authorizing\",\n \"running\",\n \"cancelling\",\n]);\nconst TERMINAL_STATUSES = new Set<AskJobStatus>([\"answered\", \"cancelled\", \"failed\"]);\n\nexport type ContextualAskJobEventListener = (event: AskJobEvent) => void;\n\ninterface InternalAskJob {\n readonly controller: AbortController;\n readonly createdAt: string;\n readonly events: AskJobEvent[];\n readonly executor: ContextualAskExecutor;\n executorCapability: ContextualAskExecutorCapability;\n readonly fingerprint: string;\n readonly id: string;\n readonly lease: WorkspaceActivityLease;\n readonly listeners: Set<ContextualAskJobEventListener>;\n readonly request: AskJobCreateRequest;\n errorCode: ContextualAskErrorCode | undefined;\n expiresAt: number | undefined;\n phaseMessage: string | undefined;\n result: AskAnswerResult | undefined;\n runPromise: Promise<void> | undefined;\n sequence: number;\n snapshot: CapturedAskReadSnapshot | undefined;\n status: AskJobStatus;\n updatedAt: string;\n}\n\nexport interface ContextualAskManager {\n cancel(jobId: string): AskJobSnapshot;\n capability(signal: AbortSignal): Promise<ContextualAskCapability>;\n close(): Promise<void>;\n create(request: AskJobCreateRequest): Promise<AskJobSnapshot>;\n events(jobId: string, afterSequence?: number): readonly AskJobEvent[];\n result(jobId: string): Promise<AskJobResultResponse>;\n snapshot(jobId: string): AskJobSnapshot;\n subscribe(jobId: string, listener: ContextualAskJobEventListener): () => void;\n}\n\ninterface ContextualAskManagerDependencies {\n readonly captureSnapshot: typeof captureAskReadSnapshot;\n readonly createId: () => string;\n readonly now: () => Date;\n}\n\nexport interface CreateContextualAskManagerOptions {\n readonly resolveSourceImports?: CaptureAskReadSnapshotOptions[\"resolveSourceImports\"];\n readonly coordinator: WorkspaceActivityCoordinator;\n readonly enabled: boolean;\n readonly executors?: readonly ContextualAskExecutor[];\n readonly registry: SourceRegistry;\n readonly root: string;\n readonly dependencies?: Partial<ContextualAskManagerDependencies>;\n}\n\nconst DEFAULT_DEPENDENCIES: ContextualAskManagerDependencies = Object.freeze({\n captureSnapshot: captureAskReadSnapshot,\n createId: () => randomBytes(16).toString(\"base64url\"),\n now: () => new Date(),\n});\n\nfunction fingerprint(request: AskJobCreateRequest): string {\n return createHash(\"sha256\")\n .update(\n JSON.stringify({\n envelope: request.envelope,\n executorId: request.executorId,\n model: request.model,\n providerDataConsent: request.providerDataConsent,\n }),\n )\n .digest(\"hex\");\n}\n\nfunction fileCountBucket(count: number): \"one\" | \"few\" | \"many\" {\n if (count <= 1) return \"one\";\n if (count <= 5) return \"few\";\n return \"many\";\n}\n\nfunction raceWithAbort<T>(operation: Promise<T>, signal: AbortSignal): Promise<T> {\n const reason = (): Error =>\n signal.reason instanceof Error\n ? signal.reason\n : new ContextualAskError(\"ASK_CANCELLED\");\n if (signal.aborted) return Promise.reject(reason());\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => {\n reject(reason());\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n operation.then(\n (value) => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (error: unknown) => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(\n error instanceof Error\n ? error\n : new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\", { cause: error }),\n );\n },\n );\n });\n}\n\nexport function createContextualAskManager(\n options: CreateContextualAskManagerOptions,\n): ContextualAskManager {\n const dependencies = Object.freeze({\n ...DEFAULT_DEPENDENCIES,\n ...options.dependencies,\n });\n const executors = new Map<string, ContextualAskExecutor>();\n for (const executor of options.executors ?? []) {\n if (executors.has(executor.executorId)) {\n throw new TypeError(\"Contextual Ask executor IDs must be unique.\");\n }\n executors.set(executor.executorId, executor);\n }\n const jobs = new Map<string, InternalAskJob>();\n const requests = new Map<string, Readonly<{ fingerprint: string; jobId: string }>>();\n const pendingRequests = new Map<\n string,\n Readonly<{\n controller: AbortController;\n fingerprint: string;\n promise: Promise<AskJobSnapshot>;\n }>\n >();\n let closed = false;\n const isClosed = (): boolean => closed;\n\n const cleanupExpired = (): void => {\n const now = dependencies.now().getTime();\n for (const [jobId, job] of jobs) {\n if (job.expiresAt !== undefined && now >= job.expiresAt) {\n job.snapshot?.dispose();\n jobs.delete(jobId);\n const request = requests.get(job.request.requestId);\n if (request?.jobId === jobId) requests.delete(job.request.requestId);\n }\n }\n };\n\n const requireJob = (jobId: string): InternalAskJob => {\n cleanupExpired();\n const job = jobs.get(jobId);\n if (job === undefined) throw new ContextualAskError(\"ASK_RESULT_EXPIRED\");\n return job;\n };\n\n const publicSnapshot = (job: InternalAskJob): AskJobSnapshot =>\n askJobSnapshotSchema.parse({\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n jobId: job.id,\n selectionId: job.request.envelope.selection.selectionId,\n status: job.status,\n executor: {\n executorId: job.executorCapability.executorId,\n kind: job.executorCapability.kind,\n label: job.executorCapability.label,\n modelLabel: job.executorCapability.effectiveModelLabel,\n },\n ...(job.phaseMessage === undefined ? {} : { phaseMessage: job.phaseMessage }),\n createdAt: job.createdAt,\n updatedAt: job.updatedAt,\n canCancel: [\"queued\", \"authorizing\", \"running\"].includes(job.status),\n ...(job.errorCode === undefined ? {} : { errorCode: job.errorCode }),\n });\n\n const appendEvent = (job: InternalAskJob, event: AskJobEvent): void => {\n job.events.push(askJobEventSchema.parse(event));\n if (job.events.length > CONTEXTUAL_ASK_LIMITS.maximumRetainedEvents) {\n job.events.splice(\n 0,\n job.events.length - CONTEXTUAL_ASK_LIMITS.maximumRetainedEvents,\n );\n }\n for (const listener of job.listeners) listener(event);\n };\n\n const eventBase = (job: InternalAskJob) => {\n job.sequence += 1;\n return {\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n sequence: job.sequence,\n jobId: job.id,\n status: job.status,\n timestamp: dependencies.now().toISOString(),\n } as const;\n };\n\n const emitSnapshot = (job: InternalAskJob): void => {\n appendEvent(job, {\n ...eventBase(job),\n type: \"snapshot\",\n snapshot: publicSnapshot(job),\n });\n };\n\n const emitPhase = (job: InternalAskJob, message: string): void => {\n appendEvent(job, { ...eventBase(job), type: \"phase\", message });\n };\n\n const emitReadActivity = (\n job: InternalAskJob,\n entry: AskSourceGrantEntry | undefined,\n state: \"started\" | \"succeeded\" | \"failed\",\n ): void => {\n appendEvent(job, {\n ...eventBase(job),\n type: \"read-activity\",\n activity:\n entry === undefined\n ? {\n kind: \"file-count\",\n bucket: fileCountBucket(job.snapshot?.grant.sources.length ?? 0),\n }\n : {\n kind: \"source\",\n sourceId: entry.fileId,\n relativePath: entry.relativePath,\n },\n state,\n });\n };\n\n const transition = (\n job: InternalAskJob,\n status: AskJobStatus,\n phaseMessage: string,\n errorCode?: ContextualAskErrorCode,\n ): void => {\n job.status = status;\n job.phaseMessage = phaseMessage;\n job.errorCode = errorCode;\n job.updatedAt = dependencies.now().toISOString();\n emitSnapshot(job);\n if (!TERMINAL_STATUSES.has(status)) emitPhase(job, phaseMessage);\n };\n\n const finish = (job: InternalAskJob): void => {\n job.expiresAt = dependencies.now().getTime() + CONTEXTUAL_ASK_LIMITS.resultTtlMs;\n job.lease.release();\n job.snapshot?.dispose();\n job.snapshot = undefined;\n };\n\n const fail = (job: InternalAskJob, error: unknown): void => {\n if (TERMINAL_STATUSES.has(job.status)) return;\n const normalized = asContextualAskError(error);\n const abortReason: unknown = job.controller.signal.reason;\n const cancelled =\n normalized.code === \"ASK_CANCELLED\" ||\n (abortReason instanceof ContextualAskError &&\n abortReason.code === \"ASK_CANCELLED\");\n transition(\n job,\n cancelled ? \"cancelled\" : \"failed\",\n cancelled ? \"Question cancelled.\" : \"Question failed.\",\n cancelled ? \"ASK_CANCELLED\" : normalized.code,\n );\n appendEvent(job, {\n ...eventBase(job),\n type: \"error\",\n errorCode: cancelled ? \"ASK_CANCELLED\" : normalized.code,\n });\n finish(job);\n };\n\n const instrumentSnapshot = (\n job: InternalAskJob,\n snapshot: ContextualAskReadSnapshot,\n onLimitExceeded: () => void,\n ): ContextualAskReadSnapshot => {\n const byHandle = new Map(\n snapshot.manifest().map((entry) => [entry.handleId, entry]),\n );\n let readOperations = 0;\n const beginOperation = (): void => {\n readOperations += 1;\n if (readOperations > CONTEXTUAL_ASK_LIMITS.maximumToolCalls) {\n onLimitExceeded();\n throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n }\n };\n return Object.freeze({\n manifest: () => snapshot.manifest(),\n read(\n handleId: string,\n range?: Readonly<{ startLine?: number; endLine?: number }>,\n ) {\n beginOperation();\n const entry = byHandle.get(handleId);\n if (job.status === \"running\") emitReadActivity(job, entry, \"started\");\n try {\n const result = snapshot.read(handleId, range);\n if (job.status === \"running\") emitReadActivity(job, entry, \"succeeded\");\n return result;\n } catch (error: unknown) {\n if (job.status === \"running\") emitReadActivity(job, entry, \"failed\");\n throw error;\n }\n },\n search(query: string) {\n beginOperation();\n if (job.status === \"running\") emitReadActivity(job, undefined, \"started\");\n try {\n const result = snapshot.search(query);\n if (job.status === \"running\") {\n emitReadActivity(job, undefined, \"succeeded\");\n }\n return result;\n } catch (error: unknown) {\n if (job.status === \"running\") emitReadActivity(job, undefined, \"failed\");\n throw error;\n }\n },\n });\n };\n\n const projectAnswer = async (\n job: InternalAskJob,\n draft: AskAnswerDraft,\n captured: CapturedAskReadSnapshot,\n ): Promise<AskAnswerResult> => {\n const sourceIds = new Map<string, string>();\n const sources = new Map<string, ReturnType<typeof captured.projectCitation>>();\n const projectCitations = (\n citations: readonly Readonly<{\n handleId: string;\n startLine: number;\n endLine: number;\n }>[],\n ): string[] =>\n citations.map((citation) => {\n const key = `${citation.handleId}:${String(citation.startLine)}:${String(citation.endLine)}`;\n let sourceId = sourceIds.get(key);\n if (sourceId === undefined) {\n sourceId = dependencies.createId();\n sourceIds.set(key, sourceId);\n sources.set(\n sourceId,\n captured.projectCitation(\n citation.handleId,\n citation.startLine,\n citation.endLine,\n ),\n );\n }\n return sourceId;\n });\n const blocks: AskAnswerBlock[] = draft.blocks.map((block): AskAnswerBlock => {\n if (block.kind === \"list\") {\n return {\n kind: \"list\",\n items: block.items.map((item) => ({\n text: item.text,\n sourceIds: projectCitations(item.citations),\n })),\n };\n }\n return Object.freeze({\n kind: block.kind,\n ...(block.kind === \"paragraph\" ? { text: block.text } : { code: block.code }),\n ...(block.kind === \"code\" && block.language !== undefined\n ? { language: block.language }\n : {}),\n sourceIds: projectCitations(block.citations),\n }) as AskAnswerBlock;\n });\n const warnings: AskAnswerWarning[] = [...draft.warnings];\n if (\n captured.grant.truncated &&\n !warnings.some((warning) => warning.code === \"source-truncated\")\n ) {\n warnings.push(Object.freeze({ code: \"source-truncated\" }));\n }\n if (\n (await captured.isStale()) &&\n !warnings.some((warning) => warning.code === \"source-stale\")\n ) {\n warnings.push(Object.freeze({ code: \"source-stale\" }));\n }\n const created = dependencies.now();\n return askAnswerResultSchema.parse({\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n jobId: job.id,\n selectionId: job.request.envelope.selection.selectionId,\n contextHash: captured.grant.contextHash,\n executor: {\n executorId: job.executorCapability.executorId,\n kind: job.executorCapability.kind,\n label: job.executorCapability.label,\n modelLabel: job.executorCapability.effectiveModelLabel,\n },\n blocks,\n sources: [...sources].map(([sourceId, source]) => ({\n sourceId,\n label: source.label,\n relativePath: source.relativePath,\n fileId: source.fileId,\n startLine: source.startLine,\n endLine: source.endLine,\n confidence: source.confidence,\n targetIds: source.targetIds,\n ...(source.sourceVersion === undefined\n ? {}\n : { sourceVersion: source.sourceVersion }),\n contentHash: source.contentHash,\n })),\n warnings,\n createdAt: created.toISOString(),\n expiresAt: new Date(\n created.getTime() + CONTEXTUAL_ASK_LIMITS.resultTtlMs,\n ).toISOString(),\n });\n };\n\n const run = async (job: InternalAskJob): Promise<void> => {\n const timeout = setTimeout(() => {\n job.controller.abort(new ContextualAskError(\"ASK_TIMEOUT\"));\n }, CONTEXTUAL_ASK_LIMITS.jobTimeoutMs);\n timeout.unref();\n try {\n transition(job, \"authorizing\", \"Authorizing selected sources.\");\n const captured = await dependencies.captureSnapshot({\n root: options.root,\n registry: options.registry,\n selection: job.request.envelope.selection,\n signal: job.controller.signal,\n createHandleId: dependencies.createId,\n ...(options.resolveSourceImports === undefined\n ? {}\n : { resolveSourceImports: options.resolveSourceImports }),\n });\n if (job.controller.signal.aborted) {\n captured.dispose();\n }\n job.controller.signal.throwIfAborted();\n job.snapshot = captured;\n transition(job, \"running\", \"Analyzing the authorized snapshot.\");\n emitReadActivity(job, undefined, \"succeeded\");\n const readLimit = { exceeded: false };\n const execution = await raceWithAbort(\n job.executor.execute(\n {\n jobId: job.id,\n ...(job.request.model === undefined ? {} : { model: job.request.model }),\n envelope: job.request.envelope,\n grant: captured.grant,\n snapshot: instrumentSnapshot(job, captured.snapshot, () => {\n readLimit.exceeded = true;\n }),\n },\n job.controller.signal,\n ),\n job.controller.signal,\n );\n const draft = askAnswerDraftSchema.parse(execution);\n const effectiveModelLabel = job.executor.effectiveModelLabel?.();\n if (effectiveModelLabel !== undefined) {\n job.executorCapability = contextualAskExecutorCapabilitySchema.parse({\n ...job.executorCapability,\n effectiveModelLabel,\n });\n }\n if (readLimit.exceeded) throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n job.controller.signal.throwIfAborted();\n const result = await projectAnswer(job, draft, captured);\n job.controller.signal.throwIfAborted();\n job.result = result;\n transition(job, \"answered\", \"Answer ready.\");\n appendEvent(job, { ...eventBase(job), type: \"answer-ready\" });\n finish(job);\n } catch (error: unknown) {\n fail(\n job,\n error instanceof Error && error.name === \"ZodError\"\n ? new ContextualAskError(\"ASK_ANSWER_INVALID\", { cause: error })\n : asContextualAskError(error),\n );\n } finally {\n clearTimeout(timeout);\n }\n };\n\n return Object.freeze({\n async capability(signal: AbortSignal): Promise<ContextualAskCapability> {\n if (!options.enabled || closed) {\n return contextualAskCapabilitySchema.parse({\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n enabled: false,\n executors: [],\n safety: {\n selectionRequired: true,\n singleTurn: true,\n writesAllowed: false,\n historyStored: false,\n },\n checkedAt: dependencies.now().toISOString(),\n });\n }\n const capabilities = (\n await Promise.all(\n [...executors.values()].map(async (executor) => {\n try {\n return contextualAskExecutorCapabilitySchema.parse(\n await raceWithAbort(executor.capability(signal), signal),\n );\n } catch {\n return undefined;\n }\n }),\n )\n ).filter((capability) => capability !== undefined);\n return contextualAskCapabilitySchema.parse({\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n enabled: true,\n executors: capabilities,\n safety: {\n selectionRequired: true,\n singleTurn: true,\n writesAllowed: false,\n historyStored: false,\n },\n checkedAt: dependencies.now().toISOString(),\n });\n },\n\n async create(rawRequest: AskJobCreateRequest): Promise<AskJobSnapshot> {\n cleanupExpired();\n if (!options.enabled || closed) throw new ContextualAskError(\"ASK_DISABLED\");\n const parsed = askJobCreateRequestSchema.safeParse(rawRequest);\n if (!parsed.success) throw new ContextualAskError(\"ASK_QUESTION_INVALID\");\n const request = parsed.data;\n const requestFingerprint = fingerprint(request);\n const previous = requests.get(request.requestId);\n if (previous !== undefined) {\n if (previous.fingerprint !== requestFingerprint) {\n throw new ContextualAskError(\"ASK_IDEMPOTENCY_CONFLICT\");\n }\n return publicSnapshot(requireJob(previous.jobId));\n }\n const pending = pendingRequests.get(request.requestId);\n if (pending !== undefined) {\n if (pending.fingerprint !== requestFingerprint) {\n throw new ContextualAskError(\"ASK_IDEMPOTENCY_CONFLICT\");\n }\n return await pending.promise;\n }\n if ([...jobs.values()].some((job) => ACTIVE_STATUSES.has(job.status))) {\n throw new ContextualAskError(\"ASK_BUSY\");\n }\n const executor = executors.get(request.executorId);\n if (executor === undefined)\n throw new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\");\n const lease = options.coordinator.acquire(\"ask\");\n if (lease === undefined) throw new ContextualAskError(\"ASK_BUSY\");\n const controller = new AbortController();\n let leaseTransferred = false;\n const creation = (async (): Promise<AskJobSnapshot> => {\n try {\n const capabilitySignal = AbortSignal.any([\n controller.signal,\n AbortSignal.timeout(CONTEXTUAL_ASK_LIMITS.capabilityTimeoutMs),\n ]);\n const capability = contextualAskExecutorCapabilitySchema.parse(\n await raceWithAbort(\n executor.capability(capabilitySignal),\n capabilitySignal,\n ),\n );\n if (isClosed()) throw new ContextualAskError(\"ASK_DISABLED\");\n if (\n request.model !== undefined &&\n !capability.models?.includes(request.model)\n ) {\n throw new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\");\n }\n if (\n capability.executorId !== executor.executorId ||\n capability.state !== \"ready\" ||\n !capability.readOnlyProven\n ) {\n throw new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\");\n }\n for (const [jobId, existing] of jobs) {\n if (TERMINAL_STATUSES.has(existing.status)) {\n existing.snapshot?.dispose();\n jobs.delete(jobId);\n requests.delete(existing.request.requestId);\n }\n }\n const createdAt = dependencies.now().toISOString();\n const job: InternalAskJob = {\n controller: new AbortController(),\n createdAt,\n events: [],\n executor,\n executorCapability:\n request.model === undefined\n ? capability\n : {\n ...capability,\n requestedModelLabel: request.model,\n effectiveModelLabel: request.model,\n },\n fingerprint: requestFingerprint,\n id: dependencies.createId(),\n lease,\n listeners: new Set(),\n request,\n errorCode: undefined,\n expiresAt: undefined,\n phaseMessage: \"Question queued.\",\n result: undefined,\n runPromise: undefined,\n sequence: 0,\n snapshot: undefined,\n status: \"queued\",\n updatedAt: createdAt,\n };\n jobs.set(job.id, job);\n requests.set(request.requestId, {\n fingerprint: requestFingerprint,\n jobId: job.id,\n });\n leaseTransferred = true;\n emitSnapshot(job);\n emitPhase(job, \"Question queued.\");\n job.runPromise = run(job);\n return publicSnapshot(job);\n } catch (error: unknown) {\n throw error instanceof ContextualAskError\n ? error\n : new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\", {\n cause: error,\n });\n } finally {\n if (!leaseTransferred) lease.release();\n pendingRequests.delete(request.requestId);\n }\n })();\n pendingRequests.set(request.requestId, {\n controller,\n fingerprint: requestFingerprint,\n promise: creation,\n });\n return await creation;\n },\n\n cancel(jobId: string): AskJobSnapshot {\n const job = requireJob(jobId);\n if (TERMINAL_STATUSES.has(job.status)) return publicSnapshot(job);\n if (job.status !== \"cancelling\") {\n transition(job, \"cancelling\", \"Cancelling question.\");\n job.controller.abort(new ContextualAskError(\"ASK_CANCELLED\"));\n job.snapshot?.dispose();\n job.snapshot = undefined;\n }\n return publicSnapshot(job);\n },\n\n events(jobId: string, afterSequence = 0): readonly AskJobEvent[] {\n if (!Number.isSafeInteger(afterSequence) || afterSequence < 0) {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n }\n return Object.freeze(\n requireJob(jobId).events.filter((event) => event.sequence > afterSequence),\n );\n },\n\n async result(jobId: string): Promise<AskJobResultResponse> {\n const job = requireJob(jobId);\n await job.runPromise;\n const current = requireJob(jobId);\n return askJobResultResponseSchema.parse({\n snapshot: publicSnapshot(current),\n ...(current.result === undefined ? {} : { result: current.result }),\n });\n },\n\n snapshot(jobId: string): AskJobSnapshot {\n return publicSnapshot(requireJob(jobId));\n },\n\n subscribe(jobId: string, listener: ContextualAskJobEventListener): () => void {\n const job = requireJob(jobId);\n if (job.listeners.size >= CONTEXTUAL_ASK_LIMITS.maximumEventSubscribers) {\n throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n }\n job.listeners.add(listener);\n return () => job.listeners.delete(listener);\n },\n\n async close(): Promise<void> {\n if (closed) return;\n closed = true;\n for (const pending of pendingRequests.values()) {\n pending.controller.abort(new ContextualAskError(\"ASK_CANCELLED\"));\n }\n await Promise.allSettled(\n [...pendingRequests.values()].map((pending) => pending.promise),\n );\n for (const job of jobs.values()) {\n if (ACTIVE_STATUSES.has(job.status)) {\n job.controller.abort(new ContextualAskError(\"ASK_CANCELLED\"));\n }\n }\n await Promise.allSettled(\n [...jobs.values()].map((job) => job.runPromise ?? Promise.resolve()),\n );\n for (const job of jobs.values()) {\n job.snapshot?.dispose();\n job.listeners.clear();\n job.lease.release();\n }\n jobs.clear();\n requests.clear();\n pendingRequests.clear();\n await Promise.allSettled(\n [...executors.values()].map(async (executor) => executor.dispose?.()),\n );\n },\n });\n}\n","import { ContextualAskExecutorError } from \"@spotpatch/agent\";\nimport type { ContextualAskErrorCode } from \"@spotpatch/shared\";\n\nexport class ContextualAskError extends Error {\n readonly code: ContextualAskErrorCode;\n\n constructor(\n code: ContextualAskErrorCode,\n options: Readonly<{ cause?: unknown }> = {},\n ) {\n super(code, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"ContextualAskError\";\n this.code = code;\n }\n}\n\nexport function asContextualAskError(error: unknown): ContextualAskError {\n if (error instanceof ContextualAskError) return error;\n if (error instanceof ContextualAskExecutorError) {\n return new ContextualAskError(error.code, { cause: error });\n }\n return new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\", { cause: error });\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { lstat, open, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type {\n AskSourceGrant,\n AskSourceGrantEntry,\n AskSourceReadResult,\n AskSourceSearchMatch,\n ContextualAskReadSnapshot,\n} from \"@spotpatch/agent\";\nimport {\n CONTEXTUAL_ASK_LIMITS,\n type AskSourceConfidence,\n type SpotSelectionContext,\n} from \"@spotpatch/shared\";\nimport { parseSync, Visitor } from \"oxc-parser\";\n\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { ContextualAskError } from \"./error.js\";\n\nconst SOURCE_EXTENSIONS = Object.freeze([\n \".astro\",\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".css\",\n \".scss\",\n \".sass\",\n \".less\",\n] as const);\nconst PROTECTED_DIRECTORIES = new Set([\n \".git\",\n \".ssh\",\n \".spotpatch\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n]);\nconst PROTECTED_FILES = new Set([\n \".gitmodules\",\n \".git-credentials\",\n \".netrc\",\n \".npmrc\",\n \".pnpmrc\",\n \".pypirc\",\n \".yarnrc\",\n \"bun.lock\",\n \"bun.lockb\",\n \"npm-shrinkwrap.json\",\n \"package-lock.json\",\n \"pnpm-lock.yaml\",\n \"yarn.lock\",\n]);\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\ninterface AuthorizedSeed {\n readonly absolutePath: string;\n readonly fileId: string;\n readonly confidence: AskSourceConfidence;\n readonly targetIds: readonly string[];\n readonly sourceVersion?: string;\n}\n\ninterface CapturedSource extends AskSourceGrantEntry {\n readonly absolutePath: string;\n readonly content: string;\n}\n\nexport interface CapturedAskReadSnapshot {\n readonly grant: AskSourceGrant;\n readonly snapshot: ContextualAskReadSnapshot;\n dispose(): void;\n isStale(): Promise<boolean>;\n projectCitation(\n handleId: string,\n startLine: number,\n endLine: number,\n ): AskSourceGrantEntry & Readonly<{ startLine: number; endLine: number }>;\n}\n\nexport interface CaptureAskReadSnapshotOptions {\n readonly resolveSourceImports?: (\n absolutePath: string,\n code: string,\n ) => readonly string[] | undefined;\n readonly root: string;\n readonly registry: SourceRegistry;\n readonly selection: SpotSelectionContext;\n readonly signal?: AbortSignal;\n readonly createHandleId?: () => string;\n}\n\nfunction deny(\n code: \"ASK_SELECTION_REQUIRED\" | \"ASK_SELECTION_STALE\" | \"ASK_SOURCE_SCOPE_DENIED\",\n): never {\n throw new ContextualAskError(code);\n}\n\nfunction toPosixRelative(realRoot: string, absolutePath: string): string {\n const relative = path.relative(realRoot, absolutePath);\n if (\n relative.length === 0 ||\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n const normalized = relative.split(path.sep).join(\"/\");\n const segments = normalized.toLowerCase().split(\"/\");\n const fileName = segments.at(-1) ?? \"\";\n if (\n segments.some((segment) => PROTECTED_DIRECTORIES.has(segment)) ||\n PROTECTED_FILES.has(fileName) ||\n fileName === \".env\" ||\n fileName === \".envrc\" ||\n fileName === \".dev.vars\" ||\n fileName.startsWith(\".env.\") ||\n fileName.endsWith(\".pem\") ||\n fileName.endsWith(\".key\") ||\n fileName.endsWith(\".p12\") ||\n fileName.endsWith(\".pfx\") ||\n fileName.startsWith(\"id_rsa\")\n ) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n return normalized;\n}\n\nasync function assertNoSymlinkPath(\n realRoot: string,\n absolutePath: string,\n): Promise<void> {\n const relative = toPosixRelative(realRoot, absolutePath);\n let current = realRoot;\n for (const segment of relative.split(\"/\")) {\n current = path.join(current, segment);\n const metadata = await lstat(current).catch(() => undefined);\n if (metadata === undefined || metadata.isSymbolicLink()) {\n deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n }\n}\n\nasync function readSecureSource(\n realRoot: string,\n absolutePath: string,\n): Promise<\n Readonly<{ content: string; contentHash: string; relativePath: string; size: number }>\n> {\n const normalizedAbsolute = path.normalize(path.resolve(absolutePath));\n const relativePath = toPosixRelative(realRoot, normalizedAbsolute);\n await assertNoSymlinkPath(realRoot, normalizedAbsolute);\n const canonical = await realpath(normalizedAbsolute).catch(() => undefined);\n if (canonical === undefined || canonical !== normalizedAbsolute) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n\n let handle: Awaited<ReturnType<typeof open>> | undefined;\n try {\n handle = await open(normalizedAbsolute, constants.O_RDONLY | constants.O_NOFOLLOW);\n const before = await handle.stat();\n if (!before.isFile() || before.nlink !== 1) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n if (before.size > CONTEXTUAL_ASK_LIMITS.maximumReadBytesPerFile) {\n throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n }\n const bytes = await handle.readFile();\n const after = await handle.stat();\n if (\n bytes.byteLength !== before.size ||\n before.dev !== after.dev ||\n before.ino !== after.ino ||\n before.size !== after.size ||\n before.mtimeMs !== after.mtimeMs ||\n bytes.includes(0)\n ) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n let content: string;\n try {\n content = decoder.decode(bytes);\n } catch (error: unknown) {\n throw new ContextualAskError(\"ASK_SOURCE_SCOPE_DENIED\", { cause: error });\n }\n return Object.freeze({\n content,\n contentHash: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n relativePath,\n size: bytes.byteLength,\n });\n } finally {\n await handle?.close().catch(() => undefined);\n }\n}\n\nfunction confidence(value: string): AskSourceConfidence {\n return value === \"exact\" || value === \"probable\" ? value : \"approximate\";\n}\n\nasync function authorizeSeeds(\n selection: SpotSelectionContext,\n registry: SourceRegistry,\n root: string,\n realRoot: string,\n): Promise<AuthorizedSeed[]> {\n const byPath = new Map<string, AuthorizedSeed>();\n for (const target of selection.targets) {\n let fileId = target.react.source?.fileId ?? target.source.fileId;\n let sourceVersion: string | undefined;\n if (target.react.componentSourceId !== undefined) {\n const anchor = registry.resolveDataFlowComponent(target.react.componentSourceId);\n if (anchor === undefined || target.react.sourceVersion !== anchor.sourceVersion) {\n deny(\"ASK_SELECTION_STALE\");\n }\n fileId = anchor.fileId;\n sourceVersion = anchor.sourceVersion;\n }\n if (fileId === undefined) continue;\n const registered = registry.resolve(fileId);\n if (registered === undefined) deny(\"ASK_SELECTION_STALE\");\n const canonical = await realpath(registered).catch(() => undefined);\n if (canonical === undefined) deny(\"ASK_SELECTION_STALE\");\n const absolutePath = path.normalize(canonical);\n const registeredRelative = toPosixRelative(realRoot, absolutePath);\n const claimedRelative =\n target.react.source?.relativePath ?? target.source.relativePath;\n if (\n claimedRelative !== undefined &&\n claimedRelative.split(\"\\\\\").join(\"/\") !== registeredRelative\n ) {\n deny(\"ASK_SELECTION_STALE\");\n }\n const existing = byPath.get(absolutePath);\n const targetIds = Object.freeze([\n ...(existing?.targetIds ?? []),\n ...(existing?.targetIds.includes(target.targetId) === true\n ? []\n : [target.targetId]),\n ]);\n byPath.set(\n absolutePath,\n Object.freeze({\n absolutePath,\n fileId,\n confidence: confidence(\n target.react.source?.confidence ?? target.source.confidence,\n ),\n targetIds,\n ...(sourceVersion === undefined ? {} : { sourceVersion }),\n }),\n );\n }\n for (const target of selection.targets) {\n for (const rule of target.styles.matchedRules) {\n const claimed = rule.source;\n if (\n claimed === undefined ||\n claimed.startsWith(\"/\") ||\n claimed.includes(\"\\\\\") ||\n claimed.includes(\"\\0\") ||\n claimed\n .split(\"/\")\n .some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")\n ) {\n continue;\n }\n const registeredPath = path.resolve(root, ...claimed.split(\"/\"));\n const fileId = registry.findRegisteredId(registeredPath);\n if (fileId === undefined) continue;\n const canonical = await realpath(registeredPath).catch(() => undefined);\n if (canonical === undefined) continue;\n const absolutePath = path.normalize(canonical);\n toPosixRelative(realRoot, absolutePath);\n const existing = byPath.get(absolutePath);\n const targetIds = Object.freeze([\n ...(existing?.targetIds ?? []),\n ...(existing?.targetIds.includes(target.targetId) === true\n ? []\n : [target.targetId]),\n ]);\n byPath.set(\n absolutePath,\n Object.freeze({\n absolutePath,\n fileId,\n confidence: existing?.confidence ?? \"probable\",\n targetIds,\n ...(existing?.sourceVersion === undefined\n ? {}\n : { sourceVersion: existing.sourceVersion }),\n }),\n );\n }\n }\n if (byPath.size === 0) deny(\"ASK_SELECTION_REQUIRED\");\n return [...byPath.values()];\n}\n\nfunction localSpecifiers(filePath: string, content: string): readonly string[] {\n const found = new Set<string>();\n if (/\\.(?:css|scss|sass|less)$/iu.test(filePath)) {\n const pattern = /@import\\s+(?:url\\(\\s*)?[\"']([^\"']+)[\"']/gu;\n for (const match of content.matchAll(pattern)) {\n if (match[1]?.startsWith(\".\")) found.add(match[1]);\n }\n return [...found].sort();\n }\n try {\n const parsed = parseSync(filePath, content, { sourceType: \"module\" });\n if (parsed.errors.length > 0) return [];\n const add = (value: unknown): void => {\n if (typeof value === \"string\" && value.startsWith(\".\")) found.add(value);\n };\n const visitor = new Visitor({\n ImportDeclaration(node) {\n add(node.source.value);\n },\n ExportNamedDeclaration(node) {\n add(node.source?.value);\n },\n ExportAllDeclaration(node) {\n add(node.source.value);\n },\n ImportExpression(node) {\n if (\"value\" in node.source) add(node.source.value);\n },\n });\n visitor.visit(parsed.program);\n } catch {\n return [];\n }\n return [...found].sort();\n}\n\nfunction importCandidates(importer: string, specifier: string): readonly string[] {\n const base = path.resolve(path.dirname(importer), specifier);\n if (path.extname(base) !== \"\") return Object.freeze([base]);\n return Object.freeze([\n ...SOURCE_EXTENSIONS.map((extension) => `${base}${extension}`),\n ...SOURCE_EXTENSIONS.map((extension) => path.join(base, `index${extension}`)),\n ]);\n}\n\nfunction countLines(content: string): number {\n return content.length === 0 ? 1 : content.split(\"\\n\").length;\n}\n\nfunction publicSourceEntry(source: CapturedSource): AskSourceGrantEntry {\n return Object.freeze({\n handleId: source.handleId,\n fileId: source.fileId,\n relativePath: source.relativePath,\n label: source.label,\n lineCount: source.lineCount,\n size: source.size,\n contentHash: source.contentHash,\n confidence: source.confidence,\n targetIds: source.targetIds,\n ...(source.sourceVersion === undefined\n ? {}\n : { sourceVersion: source.sourceVersion }),\n });\n}\n\nfunction assertSelectionEvidenceCurrent(\n selection: SpotSelectionContext,\n captured: readonly CapturedSource[],\n): void {\n for (const target of selection.targets) {\n if (target.code === undefined) continue;\n const source = captured.find(\n (candidate) => candidate.relativePath === target.code?.relativePath,\n );\n if (source === undefined) deny(\"ASK_SELECTION_STALE\");\n const lines = source.content.split(/\\r?\\n/u);\n if (target.code.endLine > lines.length) deny(\"ASK_SELECTION_STALE\");\n const currentExcerpt = lines\n .slice(target.code.startLine - 1, target.code.endLine)\n .join(\"\\n\");\n if (currentExcerpt !== target.code.excerpt) deny(\"ASK_SELECTION_STALE\");\n }\n}\n\nexport async function captureAskReadSnapshot(\n options: CaptureAskReadSnapshotOptions,\n): Promise<CapturedAskReadSnapshot> {\n options.signal?.throwIfAborted();\n const realRoot = await realpath(options.root).catch(() => undefined);\n if (realRoot === undefined) deny(\"ASK_SOURCE_SCOPE_DENIED\");\n const seeds = await authorizeSeeds(\n options.selection,\n options.registry,\n options.root,\n realRoot,\n );\n const createHandleId =\n options.createHandleId ?? (() => randomBytes(16).toString(\"base64url\"));\n const captured: CapturedSource[] = [];\n const capturedPaths = new Set<string>();\n const queue = [...seeds];\n let totalBytes = 0;\n let truncated = false;\n\n while (queue.length > 0) {\n options.signal?.throwIfAborted();\n const candidate = queue.shift();\n if (candidate === undefined || capturedPaths.has(candidate.absolutePath)) continue;\n if (captured.length >= CONTEXTUAL_ASK_LIMITS.maximumReadFiles) {\n truncated = true;\n break;\n }\n let read;\n try {\n read = await readSecureSource(realRoot, candidate.absolutePath);\n options.signal?.throwIfAborted();\n } catch (error: unknown) {\n if (captured.length < seeds.length) throw error;\n truncated = true;\n continue;\n }\n if (totalBytes + read.size > CONTEXTUAL_ASK_LIMITS.maximumReadBytesTotal) {\n if (captured.length < seeds.length)\n throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n truncated = true;\n continue;\n }\n capturedPaths.add(candidate.absolutePath);\n totalBytes += read.size;\n const entry = Object.freeze({\n handleId: createHandleId(),\n fileId: candidate.fileId,\n relativePath: read.relativePath,\n label: path.basename(read.relativePath),\n lineCount: countLines(read.content),\n size: read.size,\n contentHash: read.contentHash,\n confidence: candidate.confidence,\n targetIds: Object.freeze([...candidate.targetIds]),\n ...(candidate.sourceVersion === undefined\n ? {}\n : { sourceVersion: candidate.sourceVersion }),\n absolutePath: candidate.absolutePath,\n content: read.content,\n } satisfies CapturedSource);\n captured.push(entry);\n\n const specifiers =\n options.resolveSourceImports?.(candidate.absolutePath, read.content) ??\n localSpecifiers(candidate.absolutePath, read.content);\n for (const specifier of specifiers.filter((value) => value.startsWith(\".\"))) {\n options.signal?.throwIfAborted();\n for (const importPath of importCandidates(candidate.absolutePath, specifier)) {\n if (capturedPaths.has(importPath)) continue;\n const metadata = await lstat(importPath).catch(() => undefined);\n if (metadata?.isFile() !== true || metadata.isSymbolicLink()) continue;\n const fileId =\n options.registry.findRegisteredId(importPath) ??\n options.registry.register(importPath);\n queue.push(\n Object.freeze({\n absolutePath: path.normalize(importPath),\n fileId,\n confidence: \"probable\" as const,\n targetIds: candidate.targetIds,\n }),\n );\n break;\n }\n }\n }\n\n assertSelectionEvidenceCurrent(options.selection, captured);\n\n const sourceByHandle = new Map(captured.map((source) => [source.handleId, source]));\n const publicEntries = Object.freeze(\n captured.map((source) => publicSourceEntry(source)),\n );\n const contextHash = createHash(\"sha256\")\n .update(\n JSON.stringify({\n selectionId: options.selection.selectionId,\n sources: publicEntries.map((source) => ({\n relativePath: source.relativePath,\n contentHash: source.contentHash,\n targetIds: source.targetIds,\n sourceVersion: source.sourceVersion ?? null,\n })),\n }),\n )\n .digest(\"hex\");\n let disposed = false;\n const requireSource = (handleId: string): CapturedSource => {\n if (disposed) throw new ContextualAskError(\"ASK_RESULT_EXPIRED\");\n const source = sourceByHandle.get(handleId);\n if (source === undefined) throw new ContextualAskError(\"ASK_SOURCE_SCOPE_DENIED\");\n return source;\n };\n const snapshot: ContextualAskReadSnapshot = Object.freeze({\n manifest: () => {\n if (disposed) throw new ContextualAskError(\"ASK_RESULT_EXPIRED\");\n return publicEntries;\n },\n read(\n handleId: string,\n range: Readonly<{ startLine?: number; endLine?: number }> = {},\n ): AskSourceReadResult {\n const source = requireSource(handleId);\n const startLine = range.startLine ?? 1;\n const endLine = range.endLine ?? source.lineCount;\n if (\n !Number.isSafeInteger(startLine) ||\n !Number.isSafeInteger(endLine) ||\n startLine < 1 ||\n endLine < startLine ||\n endLine > source.lineCount\n ) {\n throw new ContextualAskError(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n return Object.freeze({\n handleId,\n startLine,\n endLine,\n content: source.content\n .split(\"\\n\")\n .slice(startLine - 1, endLine)\n .join(\"\\n\"),\n });\n },\n search(query: string): readonly AskSourceSearchMatch[] {\n if (\n query.length === 0 ||\n query.length > CONTEXTUAL_ASK_LIMITS.maximumSearchQueryCharacters ||\n query.includes(\"\\0\")\n ) {\n throw new ContextualAskError(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n const normalized = query.toLocaleLowerCase(\"en-US\");\n const matches: AskSourceSearchMatch[] = [];\n for (const source of captured) {\n for (const [index, line] of source.content.split(\"\\n\").entries()) {\n if (line.toLocaleLowerCase(\"en-US\").includes(normalized)) {\n matches.push(\n Object.freeze({\n handleId: source.handleId,\n line: index + 1,\n preview: line.slice(\n 0,\n CONTEXTUAL_ASK_LIMITS.maximumSearchPreviewCharacters,\n ),\n }),\n );\n if (matches.length >= CONTEXTUAL_ASK_LIMITS.maximumSearchResults) {\n return Object.freeze(matches);\n }\n }\n }\n }\n return Object.freeze(matches);\n },\n });\n\n return Object.freeze({\n grant: Object.freeze({ contextHash, truncated, sources: publicEntries }),\n snapshot,\n dispose(): void {\n disposed = true;\n sourceByHandle.clear();\n captured.splice(0, captured.length);\n },\n async isStale(): Promise<boolean> {\n for (const source of captured) {\n try {\n const current = await readSecureSource(realRoot, source.absolutePath);\n if (current.contentHash !== source.contentHash) return true;\n } catch {\n return true;\n }\n }\n return false;\n },\n projectCitation(handleId: string, startLine: number, endLine: number) {\n const source = requireSource(handleId);\n if (\n !Number.isSafeInteger(startLine) ||\n !Number.isSafeInteger(endLine) ||\n startLine < 1 ||\n endLine < startLine ||\n endLine > source.lineCount\n ) {\n throw new ContextualAskError(\"ASK_ANSWER_INVALID\");\n }\n return Object.freeze({ ...publicSourceEntry(source), startLine, endLine });\n },\n });\n}\n","import {\n createConfiguredKeyAskExecutor,\n resolveProviderCredential,\n type ContextualAskExecutor,\n} from \"@spotpatch/agent\";\nimport type {\n ContextualAskExecutorPreference,\n ResolvedAiOptions,\n} from \"@spotpatch/shared\";\n\nexport interface CreateConfiguredKeyAskExecutorsOptions {\n readonly ai: ResolvedAiOptions;\n readonly environment: Readonly<Record<string, string | undefined>>;\n readonly fetch?: typeof globalThis.fetch;\n readonly defaultExecutor?: ContextualAskExecutorPreference;\n}\n\n/** Builds one isolated read-only Ask executor per configured Provider/model pair. */\nexport function createConfiguredKeyAskExecutors(\n options: CreateConfiguredKeyAskExecutorsOptions,\n): readonly ContextualAskExecutor[] {\n const preferred =\n options.defaultExecutor?.kind === \"configured-key\"\n ? options.defaultExecutor\n : Object.freeze({\n kind: \"configured-key\" as const,\n providerProfileId: options.ai.defaultProvider,\n modelProfileId:\n options.ai.providers[options.ai.defaultProvider]?.defaultModel ?? \"\",\n });\n const providers = Object.values(options.ai.providers).sort((left, right) =>\n left.id === preferred.providerProfileId\n ? -1\n : right.id === preferred.providerProfileId\n ? 1\n : 0,\n );\n return Object.freeze(\n providers.flatMap((provider) => {\n const credential = resolveProviderCredential(\n provider.apiKeyEnv,\n options.environment,\n );\n const models = Object.values(provider.models).sort((left, right) =>\n provider.id !== preferred.providerProfileId\n ? 0\n : left.id === preferred.modelProfileId\n ? -1\n : right.id === preferred.modelProfileId\n ? 1\n : 0,\n );\n return models.map((model) =>\n createConfiguredKeyAskExecutor({\n provider,\n model,\n credential,\n limits: options.ai.execution.limits,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n }),\n );\n }),\n );\n}\n","import type { ContextualAskExecutor } from \"@spotpatch/agent\";\nimport type { ContextualAskExecutorPreference } from \"@spotpatch/shared\";\n\nexport interface ComposeContextualAskExecutorsOptions {\n readonly configuredKey: readonly ContextualAskExecutor[];\n readonly managedCodex: ContextualAskExecutor;\n readonly defaultExecutor?: ContextualAskExecutorPreference;\n}\n\n/** Orders independent executor implementations without coupling dev-server to Codex. */\nexport function composeContextualAskExecutors(\n options: ComposeContextualAskExecutorsOptions,\n): readonly ContextualAskExecutor[] {\n return Object.freeze(\n options.defaultExecutor?.kind === \"managed-codex\"\n ? [options.managedCodex, ...options.configuredKey]\n : [...options.configuredKey, options.managedCodex],\n );\n}\n","export type WorkspaceActivityKind = \"ask\" | \"change\";\n\nexport interface WorkspaceActivityLease {\n release(): void;\n}\n\nexport interface WorkspaceActivityCoordinator {\n acquire(kind: WorkspaceActivityKind): WorkspaceActivityLease | undefined;\n current(): WorkspaceActivityKind | undefined;\n}\n\nexport function createWorkspaceActivityCoordinator(): WorkspaceActivityCoordinator {\n let active: WorkspaceActivityKind | undefined;\n\n return Object.freeze({\n acquire(kind: WorkspaceActivityKind): WorkspaceActivityLease | undefined {\n if (active !== undefined) return undefined;\n active = kind;\n let released = false;\n return Object.freeze({\n release(): void {\n if (released) return;\n released = true;\n if (active === kind) active = undefined;\n },\n });\n },\n current(): WorkspaceActivityKind | undefined {\n return active;\n },\n });\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { StaticDataFlowAnalyzerOptions } from \"@spotpatch/analyzer\";\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 type SpotPatchRuntimeConfig,\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 { ContextualAskManager } from \"../contextual-ask/manager.js\";\nimport {\n handleContextualAskRequest,\n matchContextualAskPath,\n} from \"../contextual-ask/http.js\";\nimport type { AgentJobManager } from \"../agent/job-manager.js\";\nimport {\n handleExternalHandoffBrowserRequest,\n matchExternalHandoffBrowserPath,\n} from \"../external-handoff/browser-http.js\";\nimport type { ExternalHandoffService } from \"../external-handoff/service.js\";\nimport {\n createExternalAgentBrowserController,\n matchExternalAgentBrowserPath,\n} from \"../external-agent/browser-http.js\";\nimport type { ExternalAgentControlPort } from \"../external-agent/control-port.js\";\nimport { handleAgentRequest, matchAgentRequestPath } from \"./agent-http.js\";\nimport { type EditorLauncher, launchConfiguredEditor } from \"./editor.js\";\nimport {\n createDataFlowAnalyzer,\n handleComponentDataFlowReport,\n handlePageDataFlowReport,\n} from \"./data-flow-http.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { assertRequestAuthorized } from \"./request-security.js\";\nimport {\n readRuntimeBootstrap,\n resolveRuntimeBootstrapOptions,\n type RuntimeBootstrapOptions,\n} from \"./runtime-bootstrap.js\";\nimport { readSourceContext } from \"./source-context.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\nexport type SpotPatchNext = (error?: unknown) => void;\nexport interface SpotPatchMiddleware {\n (request: IncomingMessage, response: ServerResponse, next: SpotPatchNext): void;\n dispose(): void;\n}\n\nexport interface SpotPatchServerLogger {\n warn(message: string): void;\n}\n\nexport interface CreateMiddlewareOptions {\n readonly projectDataFlowSource?: StaticDataFlowAnalyzerOptions[\"projectSource\"];\n readonly agentManager?: AgentJobManager;\n readonly contextualAskManager?: ContextualAskManager;\n readonly bootstrap?: RuntimeBootstrapOptions;\n readonly editorLauncher?: EditorLauncher;\n readonly externalAgentControl?: ExternalAgentControlPort;\n readonly externalHandoffService?: ExternalHandoffService;\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.DATA_FLOW_DISABLED]: 404,\n [ERROR_CODES.DATA_FLOW_SOURCE_STALE]: 409,\n [ERROR_CODES.DATA_FLOW_ANALYSIS_CANCELLED]: 409,\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.EXTERNAL_HANDOFF_DISABLED]: 404,\n [ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE]: 503,\n [ERROR_CODES.HANDOFF_VALIDATION_FAILED]: 422,\n [ERROR_CODES.HANDOFF_SOURCE_STALE]: 409,\n [ERROR_CODES.HANDOFF_NOT_FOUND]: 404,\n [ERROR_CODES.HANDOFF_EXPIRED]: 410,\n [ERROR_CODES.HANDOFF_CURSOR_INVALID]: 409,\n [ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE]: 413,\n [ERROR_CODES.BRIDGE_UNAUTHORIZED]: 401,\n [ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH]: 409,\n [ERROR_CODES.BRIDGE_BUSY]: 429,\n [ERROR_CODES.EXTERNAL_AGENT_BUSY]: 409,\n [ERROR_CODES.ACTIVE_ADAPTER_CONFLICT]: 409,\n [ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID]: 409,\n [ERROR_CODES.ACTIVE_DISPATCH_INVALID]: 409,\n [ERROR_CODES.SESSION_NOT_FOUND]: 404,\n [ERROR_CODES.SESSION_AMBIGUOUS]: 409,\n [ERROR_CODES.SESSION_CLOSED]: 410,\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_ARGUMENTS_INVALID]: 422,\n [ERROR_CODES.TOOL_CALL_ID_CONFLICT]: 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.DATA_FLOW_DISABLED]: \"Component data-flow analysis is not enabled.\",\n [ERROR_CODES.DATA_FLOW_SOURCE_STALE]: \"The selected source version is stale.\",\n [ERROR_CODES.DATA_FLOW_ANALYSIS_CANCELLED]: \"The data-flow analysis was cancelled.\",\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.EXTERNAL_HANDOFF_DISABLED]: \"External Agent handoff is not enabled.\",\n [ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE]:\n \"External Agent handoff is temporarily unavailable.\",\n [ERROR_CODES.HANDOFF_VALIDATION_FAILED]: \"The handoff content is invalid.\",\n [ERROR_CODES.HANDOFF_SOURCE_STALE]: \"The selected source is stale.\",\n [ERROR_CODES.HANDOFF_NOT_FOUND]: \"No current handoff is available.\",\n [ERROR_CODES.HANDOFF_EXPIRED]: \"The handoff has expired.\",\n [ERROR_CODES.HANDOFF_CURSOR_INVALID]: \"The handoff cursor is invalid.\",\n [ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE]: \"The handoff exceeds the size limit.\",\n [ERROR_CODES.BRIDGE_UNAUTHORIZED]: \"The local bridge request is unauthorized.\",\n [ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH]: \"The local bridge protocol is incompatible.\",\n [ERROR_CODES.BRIDGE_BUSY]: \"The local bridge is busy.\",\n [ERROR_CODES.EXTERNAL_AGENT_BUSY]: \"The connected external Agent is busy.\",\n [ERROR_CODES.ACTIVE_ADAPTER_CONFLICT]: \"Another active Agent adapter is connected.\",\n [ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID]:\n \"The active Agent adapter lease is invalid.\",\n [ERROR_CODES.ACTIVE_DISPATCH_INVALID]:\n \"The active Agent dispatch transition is invalid.\",\n [ERROR_CODES.SESSION_NOT_FOUND]: \"No active SpotPatch session was found.\",\n [ERROR_CODES.SESSION_AMBIGUOUS]: \"More than one SpotPatch session matches.\",\n [ERROR_CODES.SESSION_CLOSED]: \"The SpotPatch session has closed.\",\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_ARGUMENTS_INVALID]: \"The Agent tool arguments are invalid.\",\n [ERROR_CODES.TOOL_CALL_ID_CONFLICT]:\n \"A tool call ID conflicts within one Agent turn.\",\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 const bootstrap =\n options.bootstrap === undefined\n ? undefined\n : resolveRuntimeBootstrapOptions(options.bootstrap);\n const dataFlowAnalyzer = createDataFlowAnalyzer(options);\n const externalAgentController =\n options.externalAgentControl === undefined\n ? undefined\n : createExternalAgentBrowserController(options.externalAgentControl);\n\n const middleware = (\n request: IncomingMessage,\n response: ServerResponse,\n next: SpotPatchNext,\n ): void => {\n const path = requestPath(request);\n const agentRoute = matchAgentRequestPath(path);\n const askRoute = matchContextualAskPath(path);\n const externalAgentRoute = matchExternalAgentBrowserPath(path);\n const externalHandoffRoute = matchExternalHandoffBrowserPath(path);\n\n if (\n path !== SPOTPATCH_ENDPOINTS.sourceContext &&\n path !== SPOTPATCH_ENDPOINTS.openEditor &&\n path !== SPOTPATCH_ENDPOINTS.dataFlowComponentReport &&\n path !== SPOTPATCH_ENDPOINTS.dataFlowPageReport &&\n agentRoute === undefined &&\n askRoute === undefined &&\n externalAgentRoute === undefined &&\n externalHandoffRoute === undefined &&\n !path.startsWith(`${SPOTPATCH_API_BASE}/`)\n ) {\n next();\n return;\n }\n\n const handle = async (): Promise<void> => {\n if (path === SPOTPATCH_ENDPOINTS.bootstrap && bootstrap !== undefined) {\n const data: SpotPatchRuntimeConfig = await readRuntimeBootstrap(\n request,\n bootstrap,\n );\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n assertRequestAuthorized(request, {\n allowLan: options.options.allowLan,\n sessionToken: options.session.token,\n });\n\n if (askRoute !== undefined) {\n await handleContextualAskRequest(\n request,\n response,\n askRoute,\n options.contextualAskManager,\n options.logger,\n );\n return;\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 (path === SPOTPATCH_ENDPOINTS.dataFlowComponentReport) {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n const data = await handleComponentDataFlowReport(\n request,\n dataFlowAnalyzer,\n options,\n );\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (path === SPOTPATCH_ENDPOINTS.dataFlowPageReport) {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n const data = await handlePageDataFlowReport(request, dataFlowAnalyzer, options);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (externalAgentRoute !== undefined) {\n if (\n !options.options.externalAgent.enabled ||\n externalAgentController === undefined\n ) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_HANDOFF_DISABLED);\n }\n await externalAgentController.handle(\n request,\n response,\n externalAgentRoute,\n (target, status, data) => {\n writeJson(target, status, { ok: true, data });\n },\n );\n return;\n }\n\n if (externalHandoffRoute !== undefined) {\n await handleExternalHandoffBrowserRequest(\n request,\n response,\n externalHandoffRoute,\n {\n options: options.options,\n registry: options.registry,\n root: options.root,\n ...(options.externalHandoffService === undefined\n ? {}\n : { service: options.externalHandoffService }),\n },\n (target, status, data) => {\n writeJson(target, status, { ok: true, data });\n },\n );\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 return Object.assign(middleware, {\n dispose(): void {\n externalAgentController?.dispose();\n },\n });\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n askJobActionRequestSchema,\n askJobCreateRequestSchema,\n askJobEventsRequestSchema,\n CONTEXTUAL_ASK_LIMITS,\n SPOTPATCH_ENDPOINTS,\n type ContextualAskErrorCode,\n} from \"@spotpatch/shared\";\n\nimport { readJsonRequestBody } from \"../server/request-body.js\";\nimport type { SpotPatchServerLogger } from \"../server/middleware.js\";\nimport { ContextualAskError } from \"./error.js\";\nimport type { ContextualAskManager } from \"./manager.js\";\n\nexport type ContextualAskRoute =\n | Readonly<{ kind: \"capability\" }>\n | Readonly<{ kind: \"create\" }>\n | Readonly<{ kind: \"job\"; action: \"events\" | \"result\" | \"cancel\"; jobId: string }>;\n\nconst STATUS_BY_ERROR = Object.freeze({\n ASK_DISABLED: 404,\n ASK_SELECTION_REQUIRED: 422,\n ASK_SELECTION_STALE: 409,\n ASK_QUESTION_INVALID: 422,\n ASK_EXECUTOR_UNAVAILABLE: 503,\n ASK_TIMEOUT: 504,\n ASK_CONSENT_REQUIRED: 403,\n ASK_BUSY: 409,\n ASK_IDEMPOTENCY_CONFLICT: 409,\n ASK_SOURCE_SCOPE_DENIED: 403,\n ASK_LIMIT_EXCEEDED: 413,\n ASK_ANSWER_INVALID: 502,\n ASK_WRITE_ATTEMPTED: 403,\n ASK_CANCELLED: 409,\n ASK_RESULT_EXPIRED: 410,\n ASK_PROTOCOL_INCOMPATIBLE: 400,\n} satisfies Record<ContextualAskErrorCode, number>);\n\nconst PUBLIC_MESSAGES = Object.freeze({\n ASK_DISABLED: \"Contextual Ask is not enabled.\",\n ASK_SELECTION_REQUIRED: \"Select at least one source-backed element.\",\n ASK_SELECTION_STALE: \"The selected source is stale.\",\n ASK_QUESTION_INVALID: \"The question is invalid.\",\n ASK_EXECUTOR_UNAVAILABLE: \"The selected Ask executor is unavailable.\",\n ASK_TIMEOUT: \"The Ask executor did not answer before the deadline.\",\n ASK_CONSENT_REQUIRED: \"Provider data consent is required.\",\n ASK_BUSY: \"Another workspace task is active.\",\n ASK_IDEMPOTENCY_CONFLICT: \"The request ID was reused with different content.\",\n ASK_SOURCE_SCOPE_DENIED: \"The requested source scope was denied.\",\n ASK_LIMIT_EXCEEDED: \"The Ask request exceeded a safety limit.\",\n ASK_ANSWER_INVALID: \"The executor returned an invalid answer.\",\n ASK_WRITE_ATTEMPTED: \"Ask executors cannot write project files.\",\n ASK_CANCELLED: \"The Ask job was cancelled.\",\n ASK_RESULT_EXPIRED: \"The Ask result has expired.\",\n ASK_PROTOCOL_INCOMPATIBLE: \"The Ask protocol request is incompatible.\",\n} satisfies Record<ContextualAskErrorCode, string>);\n\nfunction writeJson(response: ServerResponse, status: number, data: unknown): 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({ ok: true, data }));\n}\n\nfunction writeError(\n response: ServerResponse,\n error: unknown,\n logger: SpotPatchServerLogger | undefined,\n): void {\n const normalized =\n error instanceof ContextualAskError\n ? error\n : new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\", { cause: error });\n if (normalized.code === \"ASK_EXECUTOR_UNAVAILABLE\" && error !== normalized) {\n logger?.warn(\"[spotpatch:ask] Internal contextual Ask request failure.\");\n }\n response.statusCode = STATUS_BY_ERROR[normalized.code];\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.end(\n JSON.stringify({\n ok: false,\n error: {\n code: normalized.code,\n message: PUBLIC_MESSAGES[normalized.code],\n },\n }),\n );\n}\n\nexport function matchContextualAskPath(\n pathname: string,\n): ContextualAskRoute | undefined {\n if (pathname === SPOTPATCH_ENDPOINTS.askCapability) {\n return Object.freeze({ kind: \"capability\" });\n }\n if (pathname === SPOTPATCH_ENDPOINTS.askJobs) {\n return Object.freeze({ kind: \"create\" });\n }\n const prefix = `${SPOTPATCH_ENDPOINTS.askJobs}/`;\n if (!pathname.startsWith(prefix)) return undefined;\n const segments = pathname.slice(prefix.length).split(\"/\");\n if (segments.length !== 2) return undefined;\n let jobId: string;\n try {\n jobId = decodeURIComponent(segments[0] ?? \"\");\n } catch {\n return undefined;\n }\n const action = segments[1];\n if (\n !/^[A-Za-z0-9_-]{1,128}$/u.test(jobId) ||\n (action !== \"events\" && action !== \"result\" && action !== \"cancel\")\n ) {\n return undefined;\n }\n return Object.freeze({ kind: \"job\", action, jobId });\n}\n\nfunction parseAfterSequence(request: IncomingMessage): number {\n let url: URL;\n try {\n url = new URL(request.url ?? \"/\", \"http://spotpatch.invalid\");\n } catch {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n }\n if ([...url.searchParams.keys()].some((key) => key !== \"afterSequence\")) {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n }\n const raw = url.searchParams.get(\"afterSequence\");\n if (raw === null) return 0;\n if (!/^\\d+$/u.test(raw)) throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n const parsed = askJobEventsRequestSchema.safeParse({ afterSequence: Number(raw) });\n if (!parsed.success || !Number.isSafeInteger(parsed.data.afterSequence)) {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n }\n return parsed.data.afterSequence ?? 0;\n}\n\nfunction streamEvents(\n request: IncomingMessage,\n response: ServerResponse,\n manager: ContextualAskManager,\n jobId: string,\n): void {\n const afterSequence = parseAfterSequence(request);\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 let unsubscribe = (): void => undefined;\n const heartbeat = setInterval(\n () => response.write(\"\\n\"),\n CONTEXTUAL_ASK_LIMITS.eventHeartbeatMs,\n );\n heartbeat.unref();\n const cleanup = (): void => {\n clearInterval(heartbeat);\n unsubscribe();\n };\n unsubscribe = manager.subscribe(jobId, (event) => {\n response.write(`${JSON.stringify(event)}\\n`);\n if ([\"answered\", \"cancelled\", \"failed\"].includes(event.status)) {\n cleanup();\n response.end();\n }\n });\n // subscribe() and events() are synchronous Manager operations. Establishing\n // the listener first closes the replay/live hand-off gap without duplicates.\n const replay = manager.events(jobId, afterSequence);\n for (const event of replay) response.write(`${JSON.stringify(event)}\\n`);\n const latest = replay.at(-1);\n const currentStatus = latest?.status ?? manager.snapshot(jobId).status;\n if ([\"answered\", \"cancelled\", \"failed\"].includes(currentStatus)) {\n cleanup();\n response.end();\n return;\n }\n request.once(\"close\", cleanup);\n response.once(\"close\", cleanup);\n}\n\nfunction hasEmptySelection(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) return false;\n const envelope = (value as { envelope?: unknown }).envelope;\n if (typeof envelope !== \"object\" || envelope === null) return false;\n const selection = (envelope as { selection?: unknown }).selection;\n if (typeof selection !== \"object\" || selection === null) return false;\n return (\n Array.isArray((selection as { targets?: unknown }).targets) &&\n (selection as { targets: unknown[] }).targets.length === 0\n );\n}\n\nfunction lacksProviderDataConsent(value: unknown): boolean {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { providerDataConsent?: unknown }).providerDataConsent !== true\n );\n}\n\nexport async function handleContextualAskRequest(\n request: IncomingMessage,\n response: ServerResponse,\n route: ContextualAskRoute,\n manager: ContextualAskManager | undefined,\n logger?: SpotPatchServerLogger,\n): Promise<void> {\n try {\n if (manager === undefined) throw new ContextualAskError(\"ASK_DISABLED\");\n if (route.kind === \"capability\") {\n if (request.method !== \"GET\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n writeJson(\n response,\n 200,\n await manager.capability(\n AbortSignal.timeout(CONTEXTUAL_ASK_LIMITS.capabilityTimeoutMs),\n ),\n );\n return;\n }\n if (route.kind === \"create\") {\n if (request.method !== \"POST\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n const raw = await readJsonRequestBody(\n request,\n CONTEXTUAL_ASK_LIMITS.maximumRequestBodyBytes,\n ).catch((error: unknown) => {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\", { cause: error });\n });\n const parsed = askJobCreateRequestSchema.safeParse(raw);\n if (!parsed.success) {\n throw new ContextualAskError(\n hasEmptySelection(raw)\n ? \"ASK_SELECTION_REQUIRED\"\n : lacksProviderDataConsent(raw)\n ? \"ASK_CONSENT_REQUIRED\"\n : \"ASK_PROTOCOL_INCOMPATIBLE\",\n );\n }\n writeJson(response, 202, await manager.create(parsed.data));\n return;\n }\n if (route.action === \"events\") {\n if (request.method !== \"GET\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n streamEvents(request, response, manager, route.jobId);\n return;\n }\n if (route.action === \"result\") {\n if (request.method !== \"GET\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n writeJson(response, 200, await manager.result(route.jobId));\n return;\n }\n if (request.method !== \"POST\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n const action = askJobActionRequestSchema.safeParse(\n await readJsonRequestBody(request).catch((error: unknown) => {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\", { cause: error });\n }),\n );\n if (!action.success) throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n writeJson(response, 200, manager.cancel(route.jobId));\n } catch (error: unknown) {\n writeError(response, error, logger);\n }\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_HANDOFF_LIMITS,\n SPOTPATCH_ENDPOINTS,\n SpotPatchError,\n externalHandoffCapabilityRequestSchema,\n externalHandoffPublishRequestSchema,\n externalHandoffResolveDeliveryRequestSchema,\n externalHandoffStatusRequestSchema,\n} from \"@spotpatch/shared\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { authorizeAnnotation } from \"../server/annotation-authorizer.js\";\nimport { readJsonRequestBody } from \"../server/request-body.js\";\nimport type { ExternalHandoffService } from \"./service.js\";\n\nexport type ExternalHandoffBrowserRoute =\n \"capability\" | \"publish\" | \"resolve-delivery\" | \"status\";\n\nexport interface ExternalHandoffBrowserOptions {\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly root: string;\n readonly service?: ExternalHandoffService;\n}\n\nexport type WriteExternalHandoffSuccess = (\n response: ServerResponse,\n status: number,\n data: unknown,\n) => void;\n\nexport function matchExternalHandoffBrowserPath(\n path: string,\n): ExternalHandoffBrowserRoute | undefined {\n if (path === SPOTPATCH_ENDPOINTS.externalHandoffCapability) return \"capability\";\n if (path === SPOTPATCH_ENDPOINTS.externalHandoffPublish) return \"publish\";\n if (path === SPOTPATCH_ENDPOINTS.externalHandoffStatus) return \"status\";\n if (path === SPOTPATCH_ENDPOINTS.externalHandoffResolveDelivery) {\n return \"resolve-delivery\";\n }\n return undefined;\n}\n\nfunction requireService(\n options: ExternalHandoffBrowserOptions,\n): ExternalHandoffService {\n if (!options.options.externalAgent.enabled || options.service === undefined) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_HANDOFF_DISABLED);\n }\n\n return options.service;\n}\n\nfunction remapAuthorizationError(error: unknown): never {\n if (error instanceof SpotPatchError) {\n if (\n error.code === ERROR_CODES.SOURCE_NOT_FOUND ||\n error.code === ERROR_CODES.SOURCE_OUTSIDE_ROOT ||\n error.code === ERROR_CODES.SOURCE_TOO_LARGE\n ) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_SOURCE_STALE, undefined, {\n cause: error,\n });\n }\n\n if (error.code === ERROR_CODES.INVALID_REQUEST) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_VALIDATION_FAILED, undefined, {\n cause: error,\n });\n }\n }\n\n throw error;\n}\n\nexport async function handleExternalHandoffBrowserRequest(\n request: IncomingMessage,\n response: ServerResponse,\n route: ExternalHandoffBrowserRoute,\n options: ExternalHandoffBrowserOptions,\n writeSuccess: WriteExternalHandoffSuccess,\n): Promise<void> {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const service = requireService(options);\n\n if (route === \"capability\") {\n const parsed = externalHandoffCapabilityRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(response, 200, service.capability());\n return;\n }\n\n if (route === \"status\") {\n const parsed = externalHandoffStatusRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(response, 200, service.status(parsed.data.cursor));\n return;\n }\n\n if (route === \"resolve-delivery\") {\n const parsed = externalHandoffResolveDeliveryRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(response, 200, service.resolveDelivery(parsed.data.cursor));\n return;\n }\n\n const parsed = externalHandoffPublishRequestSchema.safeParse(\n await readJsonRequestBody(request, EXTERNAL_HANDOFF_LIMITS.maximumPublishBodyBytes),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_VALIDATION_FAILED);\n }\n\n const result = await service.publish(parsed.data, async (annotation) => {\n try {\n return await authorizeAnnotation({\n annotation,\n options: options.options,\n registry: options.registry,\n root: options.root,\n });\n } catch (error: unknown) {\n remapAuthorizationError(error);\n }\n });\n writeSuccess(response, result.replayed ? 200 : 201, result);\n}\n","import { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n ERROR_CODES,\n SpotPatchError,\n redactSensitiveText,\n sanitizeUrl,\n type MatchedStyleRule,\n type PageContext,\n type SourceRef,\n type SpotAnnotation,\n type SpotTargetContext,\n type spotAnnotationRequestSchema,\n} 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 AuthorizeAnnotationOptions {\n readonly annotation: z.output<typeof spotAnnotationRequestSchema>;\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly root: string;\n}\n\ntype ParsedTarget = AuthorizeAnnotationOptions[\"annotation\"][\"targets\"][number];\n\nfunction sanitizePageContext(page: Readonly<PageContext>): Readonly<PageContext> {\n return Object.freeze({\n url: sanitizeUrl(page.url, page.url),\n pathname: redactSensitiveText(page.pathname),\n title: redactSensitiveText(page.title),\n viewportWidth: page.viewportWidth,\n viewportHeight: page.viewportHeight,\n devicePixelRatio: page.devicePixelRatio,\n });\n}\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 =\n source.origin === \"jsx-host\" ||\n source.origin === \"astro-host\" ||\n 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({ fileId: source.fileId, registry, root });\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({ ...compactSourceRef(source), relativePath });\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: AuthorizeAnnotationOptions,\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 ...(target.page === undefined ? {} : { page: sanitizePageContext(target.page) }),\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 authorizeAnnotation(\n input: AuthorizeAnnotationOptions,\n): Promise<SpotAnnotation> {\n const requestedTargets = input.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 return Object.freeze({\n schemaVersion: 3,\n id: input.annotation.id,\n locale: input.annotation.locale,\n page: sanitizePageContext(input.annotation.page),\n targets,\n createdAt: input.annotation.createdAt,\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 === \".astro\" ? \"astro\" : 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 if (options.language === \"astro\") return nearbyContext(options);\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\", \".astro\"]);\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","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_AGENT_CONTROL_LIMITS,\n SPOTPATCH_ENDPOINTS,\n SpotPatchError,\n externalAgentControlCancelRequestSchema,\n externalAgentControlConnectRequestSchema,\n externalAgentControlDisconnectRequestSchema,\n externalAgentControlStatusRequestSchema,\n externalAgentControlStatusSchema,\n externalAgentEventSchema,\n externalAgentEventsRequestSchema,\n externalAgentManagedResultSchema,\n externalAgentResultRequestSchema,\n type ExternalAgentEvent,\n} from \"@spotpatch/shared\";\n\nimport { readJsonRequestBody } from \"../server/request-body.js\";\nimport type { ExternalAgentControlPort } from \"./control-port.js\";\n\nexport type ExternalAgentBrowserRoute =\n \"cancel\" | \"connect\" | \"disconnect\" | \"events\" | \"result\" | \"status\";\n\nexport interface ExternalAgentBrowserController {\n handle(\n request: IncomingMessage,\n response: ServerResponse,\n route: ExternalAgentBrowserRoute,\n writeSuccess: (response: ServerResponse, status: number, data: unknown) => void,\n ): Promise<void>;\n dispose(): void;\n}\n\nexport function matchExternalAgentBrowserPath(\n path: string,\n): ExternalAgentBrowserRoute | undefined {\n if (path === SPOTPATCH_ENDPOINTS.externalAgentControlStatus) return \"status\";\n if (path === SPOTPATCH_ENDPOINTS.externalAgentControlConnect) return \"connect\";\n if (path === SPOTPATCH_ENDPOINTS.externalAgentControlDisconnect) {\n return \"disconnect\";\n }\n if (path === SPOTPATCH_ENDPOINTS.externalAgentControlCancel) return \"cancel\";\n if (path === SPOTPATCH_ENDPOINTS.externalAgentEvents) return \"events\";\n if (path === SPOTPATCH_ENDPOINTS.externalAgentResult) return \"result\";\n return undefined;\n}\n\nfunction writeEvent(response: ServerResponse, event: ExternalAgentEvent): void {\n response.write(`${JSON.stringify(externalAgentEventSchema.parse(event))}\\n`);\n}\n\nexport function createExternalAgentBrowserController(\n port: ExternalAgentControlPort,\n): ExternalAgentBrowserController {\n const streams = new Set<ServerResponse>();\n let disposed = false;\n\n const handleEvents = async (\n request: IncomingMessage,\n response: ServerResponse,\n ): Promise<void> => {\n const parsed = externalAgentEventsRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n if (\n disposed ||\n streams.size >= EXTERNAL_AGENT_CONTROL_LIMITS.maximumEventSubscribers\n ) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_BUSY);\n }\n\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 streams.add(response);\n const initial = externalAgentControlStatusSchema.parse(port.getStatus());\n writeEvent(response, { type: \"status\", data: initial });\n\n const unsubscribe = port.subscribe((status) => {\n if (!response.destroyed && status.sequence > (parsed.data.afterSequence ?? -1)) {\n writeEvent(response, { type: \"status\", data: status });\n }\n });\n const heartbeat = setInterval(() => {\n if (!response.destroyed) {\n const status = port.getStatus();\n writeEvent(response, {\n type: \"heartbeat\",\n sequence: status.sequence,\n emittedAt: new Date().toISOString(),\n });\n }\n }, EXTERNAL_AGENT_CONTROL_LIMITS.eventHeartbeatMs);\n heartbeat.unref();\n\n await new Promise<void>((resolve) => {\n const close = (): void => {\n response.off(\"close\", close);\n clearInterval(heartbeat);\n unsubscribe();\n streams.delete(response);\n resolve();\n };\n response.once(\"close\", close);\n });\n };\n\n return Object.freeze({\n async handle(\n request: IncomingMessage,\n response: ServerResponse,\n route: ExternalAgentBrowserRoute,\n writeSuccess: (response: ServerResponse, status: number, data: unknown) => void,\n ): Promise<void> {\n if (request.method !== \"POST\" || disposed) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n if (route === \"events\") {\n await handleEvents(request, response);\n return;\n }\n if (route === \"status\") {\n const parsed = externalAgentControlStatusRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(\n response,\n 200,\n externalAgentControlStatusSchema.parse(port.getStatus()),\n );\n return;\n }\n if (route === \"connect\") {\n const parsed = externalAgentControlConnectRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const controller = new AbortController();\n response.once(\"close\", () => {\n if (!response.writableEnded) controller.abort(\"browser-disconnected\");\n });\n writeSuccess(\n response,\n 200,\n externalAgentControlStatusSchema.parse(\n await port.connect(parsed.data, controller.signal),\n ),\n );\n return;\n }\n if (route === \"disconnect\") {\n const parsed = externalAgentControlDisconnectRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(\n response,\n 200,\n externalAgentControlStatusSchema.parse(await port.disconnect(parsed.data)),\n );\n return;\n }\n if (route === \"cancel\") {\n const parsed = externalAgentControlCancelRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(\n response,\n 200,\n externalAgentControlStatusSchema.parse(await port.cancel(parsed.data)),\n );\n return;\n }\n\n const parsed = externalAgentResultRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const result = port.getResult(parsed.data.revision);\n if (result === undefined) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_NOT_FOUND);\n }\n writeSuccess(response, 200, externalAgentManagedResultSchema.parse(result));\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n for (const response of streams) response.end();\n streams.clear();\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 {\n type AgentJobCreateRequest,\n type agentJobCreateRequestSchema,\n} from \"@spotpatch/shared\";\nimport type { z } from \"zod\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { authorizeAnnotation } from \"./annotation-authorizer.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\nexport async function authorizeAgentJobRequest(\n input: AuthorizeAgentJobRequestOptions,\n): Promise<AgentJobCreateRequest> {\n const annotation = await authorizeAnnotation({\n annotation: input.request.annotation,\n options: input.options,\n registry: input.registry,\n root: input.root,\n });\n\n return Object.freeze({\n annotation,\n ...(input.request.applyMode === undefined\n ? {}\n : { applyMode: input.request.applyMode }),\n providerProfileId: input.request.providerProfileId,\n modelProfileId: input.request.modelProfileId,\n providerDataConsent: true,\n ...(input.request.trustedFastModeConsent === true\n ? { trustedFastModeConsent: true as const }\n : {}),\n workingTreeMode: input.request.workingTreeMode,\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 { createHash } from \"node:crypto\";\nimport type { IncomingMessage } from \"node:http\";\n\nimport {\n createStaticDataFlowAnalyzer,\n type StaticDataFlowAnalyzer,\n} from \"@spotpatch/analyzer\";\nimport {\n DATA_FLOW_SCHEMA_VERSION,\n ERROR_CODES,\n SpotPatchError,\n dataFlowComponentReportRequestSchema,\n dataFlowPageReportRequestSchema,\n limitDataFlowReportCollections,\n type ComponentDataFlowReport,\n type DataFlowComponentReportRequest,\n type PageDataFlowReport,\n} from \"@spotpatch/shared\";\n\nimport type { CreateMiddlewareOptions } from \"./middleware.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\ntype DataFlowReport = ComponentDataFlowReport | PageDataFlowReport;\n\nfunction envelopeBytes(report: DataFlowReport): number {\n return Buffer.byteLength(JSON.stringify({ ok: true, data: report }), \"utf8\");\n}\n\nexport function limitDataFlowReportToBytes(\n report: ComponentDataFlowReport,\n maximumBytes: number,\n): ComponentDataFlowReport;\nexport function limitDataFlowReportToBytes(\n report: PageDataFlowReport,\n maximumBytes: number,\n): PageDataFlowReport;\nexport function limitDataFlowReportToBytes(\n report: DataFlowReport,\n maximumBytes: number,\n): DataFlowReport {\n const structurallyLimited = limitDataFlowReportCollections(report);\n if (envelopeBytes(structurallyLimited) <= maximumBytes) {\n return structurallyLimited;\n }\n\n let limited = limitDataFlowReportCollections(structurallyLimited, {\n forceTruncation: true,\n maximumDependencies: 0,\n truncatedBy: \"bytes\",\n });\n if (envelopeBytes(limited) > maximumBytes) {\n throw new SpotPatchError(ERROR_CODES.INTERNAL_ERROR);\n }\n\n for (\n let maximumDependencies = 1;\n maximumDependencies <= structurallyLimited.dependencies.length;\n maximumDependencies += 1\n ) {\n const candidate = limitDataFlowReportCollections(structurallyLimited, {\n forceTruncation: true,\n maximumDependencies,\n truncatedBy: \"bytes\",\n });\n if (envelopeBytes(candidate) > maximumBytes) break;\n limited = candidate;\n }\n return limited;\n}\n\nexport function createDataFlowAnalyzer(\n options: CreateMiddlewareOptions,\n): StaticDataFlowAnalyzer | undefined {\n if (!options.options.dataFlow.enabled) return undefined;\n\n return createStaticDataFlowAnalyzer({\n root: options.root,\n registryEpoch: options.session.id,\n registerSource: (absolutePath) => options.registry.register(absolutePath),\n limits: options.options.dataFlow.limits,\n ...(options.projectDataFlowSource === undefined\n ? {}\n : { projectSource: options.projectDataFlowSource }),\n });\n}\n\nasync function analyzeTarget(\n request: DataFlowComponentReportRequest,\n analyzer: StaticDataFlowAnalyzer,\n options: CreateMiddlewareOptions,\n): Promise<ComponentDataFlowReport> {\n const resolvedRequest = (() => {\n if (\"componentSourceId\" in request) {\n const anchor = options.registry.resolveDataFlowComponent(\n request.componentSourceId,\n );\n if (anchor?.sourceVersion !== request.sourceVersion) {\n throw new SpotPatchError(ERROR_CODES.DATA_FLOW_SOURCE_STALE);\n }\n return anchor;\n }\n return request;\n })();\n const absolutePath = await resolveSourceFile({\n fileId: resolvedRequest.fileId,\n registry: options.registry,\n root: options.root,\n });\n const report = analyzer.analyzeComponent({\n absolutePath,\n line: resolvedRequest.line,\n column: resolvedRequest.column,\n });\n\n if (\n resolvedRequest.sourceVersion !== undefined &&\n resolvedRequest.sourceVersion !== report.component.source.sourceVersion\n ) {\n throw new SpotPatchError(ERROR_CODES.DATA_FLOW_SOURCE_STALE);\n }\n\n return limitDataFlowReportToBytes(\n report,\n options.options.dataFlow.limits.reportMaxBytes,\n );\n}\n\nfunction requireAnalyzer(\n analyzer: StaticDataFlowAnalyzer | undefined,\n): StaticDataFlowAnalyzer {\n if (analyzer === undefined) {\n throw new SpotPatchError(ERROR_CODES.DATA_FLOW_DISABLED);\n }\n return analyzer;\n}\n\nexport async function handleComponentDataFlowReport(\n request: IncomingMessage,\n analyzer: StaticDataFlowAnalyzer | undefined,\n options: CreateMiddlewareOptions,\n): Promise<ComponentDataFlowReport> {\n const parsed = dataFlowComponentReportRequestSchema.safeParse(\n await readJsonRequestBody(\n request,\n options.options.dataFlow.limits.protocolRequestMaxBytes,\n ),\n );\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return analyzeTarget(parsed.data, requireAnalyzer(analyzer), options);\n}\n\nexport async function handlePageDataFlowReport(\n request: IncomingMessage,\n analyzer: StaticDataFlowAnalyzer | undefined,\n options: CreateMiddlewareOptions,\n): Promise<PageDataFlowReport> {\n const parsed = dataFlowPageReportRequestSchema.safeParse(\n await readJsonRequestBody(\n request,\n options.options.dataFlow.limits.protocolRequestMaxBytes,\n ),\n );\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n const activeAnalyzer = requireAnalyzer(analyzer);\n const componentReports = await Promise.all(\n parsed.data.targets.map((target) => analyzeTarget(target, activeAnalyzer, options)),\n );\n const dependencies = new Map(\n componentReports.flatMap((report) =>\n report.dependencies.map((dependency) => [dependency.id, dependency] as const),\n ),\n );\n const evidence = new Map(\n componentReports.flatMap((report) =>\n report.evidence.map((entry) => [entry.id, entry] as const),\n ),\n );\n const diagnostics = new Map(\n componentReports.flatMap((report) =>\n report.diagnostics.map((entry) => [entry.id, entry] as const),\n ),\n );\n const analyzedVersions = new Set(\n componentReports.flatMap((report) => report.baseline.analyzedSourceVersions),\n );\n const reportId = `page_${createHash(\"sha256\")\n .update(componentReports.map((report) => report.reportId).join(\"\\0\"))\n .digest(\"base64url\")\n .slice(0, 22)}`;\n const complete = componentReports.every((report) => report.completeness.complete);\n\n const report = Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n reportId,\n baseline: Object.freeze({\n registryEpoch: options.session.id,\n analyzerVersion: componentReports[0]?.baseline.analyzerVersion ?? \"unavailable\",\n adapterSetHash: componentReports[0]?.baseline.adapterSetHash ?? \"unavailable\",\n analyzedSourceVersions: Object.freeze([...analyzedVersions].sort()),\n }),\n capability: Object.freeze({\n enabled: true,\n staticAnalysis: complete ? \"available\" : \"partial\",\n runtimeObservation: \"dispatch-only\",\n responseShape: \"consumed-fields-only\",\n aiAssistance: \"disabled\",\n reasons: Object.freeze(\n componentReports.flatMap((report) => report.capability.reasons),\n ),\n }),\n dependencies: Object.freeze([...dependencies.values()]),\n evidence: Object.freeze([...evidence.values()]),\n diagnostics: Object.freeze([...diagnostics.values()]),\n completeness: Object.freeze({\n complete,\n visitedModules: componentReports.reduce(\n (total, report) => total + report.completeness.visitedModules,\n 0,\n ),\n visitedCallsites: componentReports.reduce(\n (total, report) => total + report.completeness.visitedCallsites,\n 0,\n ),\n frontierCount: componentReports.reduce(\n (total, report) => total + report.completeness.frontierCount,\n 0,\n ),\n }),\n });\n return limitDataFlowReportToBytes(\n report,\n options.options.dataFlow.limits.reportMaxBytes,\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\nfunction isSameOriginBrowserGet(request: IncomingMessage): boolean {\n return (\n request.method === \"GET\" &&\n getSingleHeader(request, \"sec-fetch-site\")?.toLowerCase() === \"same-origin\" &&\n getSingleHeader(request, \"sec-fetch-mode\")?.toLowerCase() === \"cors\" &&\n getSingleHeader(request, \"sec-fetch-dest\")?.toLowerCase() === \"empty\"\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) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n\n const hostIsLoopback = isLoopbackHostname(host.hostname);\n\n // Browsers omit Origin on same-origin GET fetches. Fetch Metadata is browser-\n // controlled and lets those reads pass without weakening token validation or\n // accepting cross-site requests. Non-browser clients can continue to send Origin.\n if (origin === undefined) {\n if (!isSameOriginBrowserGet(request) || (!options.allowLan && !hostIsLoopback)) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n return;\n }\n\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 type { IncomingMessage } from \"node:http\";\n\nimport {\n ERROR_CODES,\n SpotPatchError,\n runtimeBootstrapRequestSchema,\n runtimeConfigSchema,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { isLoopbackHostname } from \"./request-security.js\";\n\nexport interface RuntimeBootstrapOptions {\n readonly expectedOrigin: string;\n readonly runtimeConfig: SpotPatchRuntimeConfig;\n}\n\nexport interface ResolvedRuntimeBootstrapOptions {\n readonly expectedOrigin: string;\n readonly runtimeConfig: SpotPatchRuntimeConfig;\n}\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\nexport function resolveRuntimeBootstrapOptions(\n options: RuntimeBootstrapOptions,\n): ResolvedRuntimeBootstrapOptions {\n let expectedOrigin: URL;\n\n try {\n expectedOrigin = new URL(options.expectedOrigin);\n } catch {\n throw new TypeError(\"The SpotPatch bootstrap origin is invalid.\");\n }\n\n if (\n expectedOrigin.origin !== options.expectedOrigin ||\n expectedOrigin.protocol !== \"http:\" ||\n !isLoopbackHostname(expectedOrigin.hostname)\n ) {\n throw new TypeError(\"The SpotPatch bootstrap origin must be a loopback origin.\");\n }\n\n const parsedConfig = runtimeConfigSchema.safeParse(options.runtimeConfig);\n\n if (!parsedConfig.success) {\n throw new TypeError(\"The SpotPatch Runtime configuration is invalid.\");\n }\n\n return Object.freeze({\n expectedOrigin: expectedOrigin.origin,\n runtimeConfig: parsedConfig.data,\n });\n}\n\nfunction assertRuntimeBootstrapRequest(\n request: IncomingMessage,\n expectedOrigin: string,\n): void {\n const contentType = getSingleHeader(request, \"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase();\n\n if (request.method !== \"POST\" || contentType !== \"application/json\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const host = getSingleHeader(request, \"host\");\n let hostIsLoopback = false;\n\n if (host !== undefined) {\n try {\n hostIsLoopback = isLoopbackHostname(new URL(`http://${host}`).hostname);\n } catch {\n hostIsLoopback = false;\n }\n }\n\n if (\n !hostIsLoopback ||\n getSingleHeader(request, \"origin\") !== expectedOrigin ||\n getSingleHeader(request, \"sec-fetch-site\") !== \"same-origin\"\n ) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n}\n\nexport async function readRuntimeBootstrap(\n request: IncomingMessage,\n options: ResolvedRuntimeBootstrapOptions,\n): Promise<SpotPatchRuntimeConfig> {\n assertRuntimeBootstrapRequest(request, options.expectedOrigin);\n const parsedBody = runtimeBootstrapRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsedBody.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return options.runtimeConfig;\n}\n","import { timingSafeEqual } from \"node:crypto\";\nimport { lstat, readFile, realpath } from \"node:fs/promises\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport path from \"node:path\";\n\nimport {\n createDataFlowSourceFilter,\n createDataFlowSourceVersion,\n createSourceFilter,\n} from \"@spotpatch/compiler\";\nimport { DEFAULT_DATA_FLOW_LIMITS } from \"@spotpatch/shared\";\nimport { z } from \"zod\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { isLoopbackHostname } from \"./request-security.js\";\n\nconst REGISTRATION_BODY_LIMIT_BYTES = DEFAULT_DATA_FLOW_LIMITS.protocolRequestMaxBytes;\nconst REGISTRATION_IDENTITY_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst DATA_FLOW_IDENTITY_PATTERN = /^[A-Za-z0-9_-]{1,128}$/u;\nconst INTERNAL_SECRET_HEADER = \"x-spotpatch-internal\";\nconst FORBIDDEN_SOURCE_SEGMENTS = new Set([\".next\", \"node_modules\"]);\nconst registrationRequestSchema = z.strictObject({\n epoch: z.string().regex(REGISTRATION_IDENTITY_PATTERN),\n resourcePath: z.string().min(1).max(3_072),\n dataFlow: z\n .strictObject({\n sourceVersion: z.string().regex(DATA_FLOW_IDENTITY_PATTERN),\n components: z\n .array(\n z.strictObject({\n componentSourceId: z.string().regex(DATA_FLOW_IDENTITY_PATTERN),\n line: z.number().int().positive().max(10_000_000),\n column: z.number().int().positive().max(10_000_000),\n }),\n )\n .max(DEFAULT_DATA_FLOW_LIMITS.sourceMaxComponents),\n })\n .optional(),\n});\n\nexport interface SourceRegistrationServiceOptions {\n readonly internalSecret: string;\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly registryEpoch: string;\n readonly root: string;\n}\n\nexport type SourceRegistrationHandler = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nexport interface SourceRegistrationService {\n readonly handler: SourceRegistrationHandler;\n readonly root: string;\n}\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 identitiesMatch(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 return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\n\nfunction isWithinRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction hasForbiddenSegment(root: string, candidate: string): boolean {\n return path\n .relative(root, candidate)\n .split(path.sep)\n .some((segment) => FORBIDDEN_SOURCE_SEGMENTS.has(segment));\n}\n\nfunction writeJson(\n response: ServerResponse,\n statusCode: number,\n payload: unknown,\n): void {\n const body = JSON.stringify(payload);\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nfunction requestComesFromLoopbackWorker(request: IncomingMessage): boolean {\n const host = getSingleHeader(request, \"host\");\n\n if (host === undefined || getSingleHeader(request, \"origin\") !== undefined) {\n return false;\n }\n\n try {\n return isLoopbackHostname(new URL(`http://${host}`).hostname);\n } catch {\n return false;\n }\n}\n\nasync function resolveAuthorizedSource(\n root: string,\n requestedPath: string,\n shouldTransform: (absolutePath: string) => boolean,\n): Promise<string | undefined> {\n if (!path.isAbsolute(requestedPath) || requestedPath.includes(\"\\0\")) {\n return undefined;\n }\n\n try {\n const sourceStat = await lstat(requestedPath);\n\n if (!sourceStat.isFile() || sourceStat.isSymbolicLink()) {\n return undefined;\n }\n\n const resolvedPath = await realpath(requestedPath);\n\n if (\n !isWithinRoot(root, resolvedPath) ||\n hasForbiddenSegment(root, resolvedPath) ||\n !shouldTransform(resolvedPath)\n ) {\n return undefined;\n }\n\n return resolvedPath;\n } catch {\n return undefined;\n }\n}\n\nexport async function createSourceRegistrationService(\n input: SourceRegistrationServiceOptions,\n): Promise<SourceRegistrationService> {\n if (\n !REGISTRATION_IDENTITY_PATTERN.test(input.internalSecret) ||\n !REGISTRATION_IDENTITY_PATTERN.test(input.registryEpoch)\n ) {\n throw new TypeError(\"The source registration identity is invalid.\");\n }\n\n const root = await realpath(input.root);\n const sourceFilter = createSourceFilter(root, input.options);\n const dataFlowFilter = createDataFlowSourceFilter(root, input.options);\n const registrationQueues = new Map<string, Promise<void>>();\n\n async function registerCurrentSource(\n sourcePath: string,\n dataFlow: z.infer<typeof registrationRequestSchema>[\"dataFlow\"],\n ): Promise<string | undefined> {\n if (dataFlow === undefined) {\n return input.registry.register(sourcePath);\n }\n\n let fileId: string | undefined;\n const previous = registrationQueues.get(sourcePath) ?? Promise.resolve();\n const current = previous\n .catch(() => undefined)\n .then(async () => {\n const currentSource = await readFile(sourcePath, \"utf8\");\n if (createDataFlowSourceVersion(currentSource) !== dataFlow.sourceVersion) {\n return;\n }\n fileId = input.registry.registerDataFlowComponents(\n sourcePath,\n dataFlow.sourceVersion,\n dataFlow.components,\n );\n });\n registrationQueues.set(sourcePath, current);\n await current.finally(() => {\n if (registrationQueues.get(sourcePath) === current) {\n registrationQueues.delete(sourcePath);\n }\n });\n return fileId;\n }\n\n const handler: SourceRegistrationHandler = (request, response) => {\n const handle = async (): Promise<void> => {\n const contentType = getSingleHeader(request, \"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase();\n\n if (\n request.method !== \"POST\" ||\n contentType !== \"application/json\" ||\n !requestComesFromLoopbackWorker(request) ||\n !identitiesMatch(\n getSingleHeader(request, INTERNAL_SECRET_HEADER),\n input.internalSecret,\n )\n ) {\n writeJson(response, 403, { ok: false });\n return;\n }\n\n const parsed = registrationRequestSchema.safeParse(\n await readJsonRequestBody(request, REGISTRATION_BODY_LIMIT_BYTES),\n );\n\n if (!parsed.success || parsed.data.epoch !== input.registryEpoch) {\n writeJson(response, 400, { ok: false });\n return;\n }\n\n const sourcePath = await resolveAuthorizedSource(\n root,\n parsed.data.resourcePath,\n (absolutePath) =>\n parsed.data.dataFlow === undefined\n ? sourceFilter.shouldTransform(absolutePath, \"<\")\n : dataFlowFilter.shouldTransform(absolutePath, \"\"),\n );\n\n if (sourcePath === undefined) {\n writeJson(response, 403, { ok: false });\n return;\n }\n\n const fileId = await registerCurrentSource(sourcePath, parsed.data.dataFlow);\n if (fileId === undefined) {\n writeJson(response, 409, { ok: false });\n return;\n }\n\n writeJson(response, 200, { epoch: input.registryEpoch, fileId });\n };\n\n void handle().catch(() => {\n if (!response.headersSent) {\n writeJson(response, 400, { ok: false });\n } else {\n response.destroy();\n }\n });\n };\n\n return Object.freeze({ handler, root });\n}\n","import { randomBytes } from \"node:crypto\";\n\nexport interface SpotPatchSession {\n readonly id: string;\n readonly token: string;\n}\n\nexport function createSession(): SpotPatchSession {\n return Object.freeze({\n id: randomBytes(16).toString(\"base64url\"),\n token: randomBytes(16).toString(\"base64url\"),\n });\n}\n","import type {\n AiOptions,\n ContextBudget,\n ContextualAskOptions,\n ResolvedAiOptions,\n SpotPatchEditorPreference,\n SpotPatchLocalePreference,\n} from \"@spotpatch/shared\";\n\nimport {\n resolveOptions,\n type FilterEntry,\n type ResolvedSpotPatchOptions,\n type SpotPatchDataFlowOptions,\n} from \"./options.js\";\n\ninterface SerializedStringFilter {\n readonly kind: \"string\";\n readonly value: string;\n}\n\ninterface SerializedRegExpFilter {\n readonly flags: string;\n readonly kind: \"regexp\";\n readonly source: string;\n}\n\nexport type SerializedFilterEntry = SerializedRegExpFilter | SerializedStringFilter;\n\nexport interface SerializedSpotPatchOptions {\n readonly ai: false | AiOptions;\n readonly allowLan: boolean;\n readonly budget: Readonly<ContextBudget>;\n readonly debug: boolean;\n readonly dataFlow: false | SpotPatchDataFlowOptions;\n readonly contextualAsk: ContextualAskOptions;\n readonly editor: SpotPatchEditorPreference;\n readonly enabled: boolean;\n readonly externalAgent: boolean;\n readonly exclude: readonly SerializedFilterEntry[];\n readonly include: readonly SerializedFilterEntry[];\n readonly locale: SpotPatchLocalePreference;\n readonly maxTargets: number;\n readonly redact: boolean;\n readonly shortcut: string;\n}\n\nconst OPTION_KEYS = Object.freeze([\n \"ai\",\n \"allowLan\",\n \"budget\",\n \"debug\",\n \"dataFlow\",\n \"contextualAsk\",\n \"editor\",\n \"enabled\",\n \"externalAgent\",\n \"exclude\",\n \"include\",\n \"locale\",\n \"maxTargets\",\n \"redact\",\n \"shortcut\",\n] as const);\nconst BUDGET_KEYS = Object.freeze([\n \"totalCharacters\",\n \"domCharacters\",\n \"cssCharacters\",\n \"codeCharacters\",\n \"maxCodeLines\",\n \"maxComponentDepth\",\n] as const);\nconst REGEXP_FLAGS_PATTERN = /^(?!.*(.).*\\1)[dgimsuvy]*$/u;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(\n value: Readonly<Record<string, unknown>>,\n keys: readonly string[],\n): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...keys].sort();\n return (\n actual.length === expected.length &&\n actual.every((key, index) => key === expected[index])\n );\n}\n\nfunction serializeFilter(entry: FilterEntry): SerializedFilterEntry {\n return typeof entry === \"string\"\n ? Object.freeze({ kind: \"string\", value: entry })\n : Object.freeze({\n flags: entry.flags,\n kind: \"regexp\",\n source: entry.source,\n });\n}\n\nfunction serializeAiOptions(options: ResolvedAiOptions): AiOptions {\n return Object.freeze({\n providers: Object.freeze(\n Object.fromEntries(\n Object.entries(options.providers).map(([id, provider]) => [\n id,\n Object.freeze({\n type: provider.type,\n label: provider.label,\n protocol: provider.protocol,\n authentication: provider.authentication,\n baseURL: provider.baseURL,\n apiKeyEnv: provider.apiKeyEnv,\n models: Object.freeze(\n Object.fromEntries(\n Object.entries(provider.models).map(([modelId, model]) => [\n modelId,\n Object.freeze({ label: model.label, model: model.model }),\n ]),\n ),\n ),\n defaultModel: provider.defaultModel,\n }),\n ]),\n ),\n ),\n defaultProvider: options.defaultProvider,\n execution: Object.freeze({\n isolation: options.execution.isolation,\n applyMode: options.execution.applyMode,\n checks: Object.freeze(\n Object.fromEntries(\n Object.entries(options.execution.checks).map(([id, check]) => [\n id,\n Object.freeze({\n label: check.label,\n command: check.command,\n args: check.args,\n required: check.required,\n timeoutMs: check.timeoutMs,\n }),\n ]),\n ),\n ),\n limits: options.execution.limits,\n }),\n });\n}\n\nexport function serializeResolvedSpotPatchOptions(\n options: ResolvedSpotPatchOptions,\n): SerializedSpotPatchOptions {\n return Object.freeze({\n ai: options.ai === false ? false : serializeAiOptions(options.ai),\n allowLan: options.allowLan,\n budget: options.budget,\n debug: options.debug,\n dataFlow: options.dataFlow.enabled\n ? Object.freeze({\n runtime: options.dataFlow.runtime,\n })\n : false,\n contextualAsk: options.contextualAsk.enabled\n ? Object.freeze({\n ...(options.contextualAsk.defaultExecutor === undefined\n ? {}\n : { defaultExecutor: options.contextualAsk.defaultExecutor }),\n })\n : false,\n editor: options.editor,\n enabled: options.enabled,\n externalAgent: options.externalAgent.enabled,\n exclude: Object.freeze(options.exclude.map(serializeFilter)),\n include: Object.freeze(options.include.map(serializeFilter)),\n locale: options.locale,\n maxTargets: options.maxTargets,\n redact: options.redact,\n shortcut: options.shortcut,\n });\n}\n\nfunction parseFilterList(value: unknown): readonly FilterEntry[] {\n if (!Array.isArray(value) || value.length > 256) {\n throw new TypeError(\"The SpotPatch filter transport is invalid.\");\n }\n\n return Object.freeze(\n value.map((entry: unknown): FilterEntry => {\n if (!isRecord(entry)) {\n throw new TypeError(\"The SpotPatch filter transport is invalid.\");\n }\n\n if (\n entry.kind === \"string\" &&\n hasExactKeys(entry, [\"kind\", \"value\"]) &&\n typeof entry.value === \"string\" &&\n entry.value.length > 0 &&\n entry.value.length <= 1_024 &&\n !entry.value.includes(\"\\0\")\n ) {\n return entry.value;\n }\n\n if (\n entry.kind === \"regexp\" &&\n hasExactKeys(entry, [\"flags\", \"kind\", \"source\"]) &&\n typeof entry.source === \"string\" &&\n entry.source.length <= 1_024 &&\n typeof entry.flags === \"string\" &&\n REGEXP_FLAGS_PATTERN.test(entry.flags)\n ) {\n try {\n return new RegExp(entry.source, entry.flags);\n } catch {\n throw new TypeError(\"The SpotPatch filter transport is invalid.\");\n }\n }\n\n throw new TypeError(\"The SpotPatch filter transport is invalid.\");\n }),\n );\n}\n\nfunction parseBudget(value: unknown): Readonly<ContextBudget> {\n if (!isRecord(value) || !hasExactKeys(value, BUDGET_KEYS)) {\n throw new TypeError(\"The SpotPatch budget transport is invalid.\");\n }\n\n const budget = Object.fromEntries(\n BUDGET_KEYS.map((key) => [key, value[key]]),\n ) as unknown as ContextBudget;\n\n return Object.freeze(budget);\n}\n\nfunction parseDataFlow(value: unknown): false | SpotPatchDataFlowOptions {\n if (value === false) return false;\n\n if (\n !isRecord(value) ||\n !hasExactKeys(value, [\"runtime\"]) ||\n value.runtime !== \"dispatch\"\n ) {\n throw new TypeError(\"The SpotPatch data-flow transport is invalid.\");\n }\n\n return Object.freeze({\n runtime: value.runtime,\n });\n}\n\nfunction parseContextualAsk(value: unknown): ContextualAskOptions {\n if (value === false || value === true) return value;\n if (!isRecord(value)) {\n throw new TypeError(\"The SpotPatch contextual Ask transport is invalid.\");\n }\n const keys = Object.keys(value);\n if (keys.length === 0) return Object.freeze({});\n if (!hasExactKeys(value, [\"defaultExecutor\"]) || !isRecord(value.defaultExecutor)) {\n throw new TypeError(\"The SpotPatch contextual Ask transport is invalid.\");\n }\n const preference = value.defaultExecutor;\n if (preference.kind === \"managed-codex\" && hasExactKeys(preference, [\"kind\"])) {\n return Object.freeze({\n defaultExecutor: Object.freeze({ kind: \"managed-codex\" }),\n });\n }\n if (\n preference.kind === \"configured-key\" &&\n hasExactKeys(preference, [\"kind\", \"modelProfileId\", \"providerProfileId\"]) &&\n typeof preference.providerProfileId === \"string\" &&\n typeof preference.modelProfileId === \"string\"\n ) {\n return Object.freeze({\n defaultExecutor: Object.freeze({\n kind: \"configured-key\",\n providerProfileId: preference.providerProfileId,\n modelProfileId: preference.modelProfileId,\n }),\n });\n }\n throw new TypeError(\"The SpotPatch contextual Ask transport is invalid.\");\n}\n\nexport function parseSerializedSpotPatchOptions(\n value: unknown,\n): ResolvedSpotPatchOptions {\n if (!isRecord(value) || !hasExactKeys(value, OPTION_KEYS)) {\n throw new TypeError(\"The SpotPatch options transport is invalid.\");\n }\n\n if (\n typeof value.enabled !== \"boolean\" ||\n typeof value.externalAgent !== \"boolean\" ||\n typeof value.redact !== \"boolean\" ||\n typeof value.allowLan !== \"boolean\" ||\n typeof value.debug !== \"boolean\" ||\n typeof value.shortcut !== \"string\" ||\n typeof value.maxTargets !== \"number\" ||\n typeof value.editor !== \"string\" ||\n typeof value.locale !== \"string\" ||\n (value.ai !== false && !isRecord(value.ai))\n ) {\n throw new TypeError(\"The SpotPatch options transport is invalid.\");\n }\n\n try {\n return resolveOptions({\n ai: value.ai as AiOptions | false,\n allowLan: value.allowLan,\n budget: parseBudget(value.budget),\n debug: value.debug,\n dataFlow: parseDataFlow(value.dataFlow),\n contextualAsk: parseContextualAsk(value.contextualAsk),\n editor: value.editor as SpotPatchEditorPreference,\n enabled: value.enabled,\n externalAgent: value.externalAgent,\n exclude: parseFilterList(value.exclude),\n include: parseFilterList(value.include),\n locale: value.locale as SpotPatchLocalePreference,\n maxTargets: value.maxTargets,\n redact: value.redact,\n shortcut: value.shortcut,\n });\n } catch (error: unknown) {\n throw new TypeError(\"The SpotPatch options transport is invalid.\", {\n cause: error,\n });\n }\n}\n","import type { ContextualAskExecutor } from \"@spotpatch/agent\";\nimport type { ExternalHandoffFramework } from \"@spotpatch/shared\";\n\nimport { createAgentJobManager } from \"./agent/job-manager.js\";\nimport { createWorkspaceActivityCoordinator } from \"./workspace/activity-coordinator.js\";\nimport { createConfiguredKeyAskExecutors } from \"./contextual-ask/configured-key-executors.js\";\nimport { composeContextualAskExecutors } from \"./contextual-ask/executors.js\";\nimport {\n createContextualAskManager,\n type CreateContextualAskManagerOptions,\n} from \"./contextual-ask/manager.js\";\nimport type { ExternalAgentControlPort } from \"./external-agent/control-port.js\";\nimport { createExternalHandoffService } from \"./external-handoff/service.js\";\nimport {\n resolveManagedExecutionValidation,\n type ResolvedManagedExecutionValidation,\n} from \"./project-validation.js\";\nimport {\n createSpotPatchMiddleware,\n type CreateMiddlewareOptions,\n type SpotPatchMiddleware,\n} from \"./server/middleware.js\";\n\nexport interface DevelopmentSessionInput extends Omit<\n CreateMiddlewareOptions,\n | \"agentManager\"\n | \"contextualAskManager\"\n | \"externalAgentControl\"\n | \"externalHandoffService\"\n> {\n readonly framework: ExternalHandoffFramework;\n readonly resolveSourceImports?: CreateContextualAskManagerOptions[\"resolveSourceImports\"];\n readonly environment: Readonly<Record<string, string | undefined>>;\n readonly executionRoot?: string;\n readonly createManagedAskExecutor: () => ContextualAskExecutor;\n readonly createExternalAgentControl: (\n validation: ResolvedManagedExecutionValidation,\n ) => Promise<ExternalAgentControlPort>;\n readonly resolveValidation?: () => Promise<ResolvedManagedExecutionValidation>;\n}\n\nexport interface DevelopmentSession {\n readonly middleware: SpotPatchMiddleware;\n readonly close: () => Promise<void>;\n}\n\n/** Owns feature services, not HTTP listeners or framework-specific transports. */\nexport async function createDevelopmentSession(\n input: DevelopmentSessionInput,\n): Promise<DevelopmentSession> {\n const cleanups: (() => void | Promise<void>)[] = [\n () => {\n input.registry.clear();\n },\n ];\n let closing: Promise<void> | undefined;\n const close = (): Promise<void> =>\n (closing ??= (async () => {\n const errors: unknown[] = [];\n // Stop consumers before their dependencies, including after partial startup.\n for (const cleanup of cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0)\n throw new AggregateError(errors, \"SpotPatch service cleanup failed.\");\n })());\n const warn = (message: string): void => {\n input.logger?.warn(`[spotpatch:${input.framework}] ${message}`);\n };\n try {\n const { options, root, registry } = input;\n const coordinator = createWorkspaceActivityCoordinator();\n const agentManager =\n options.ai === false\n ? undefined\n : createAgentJobManager({\n ai: options.ai,\n environment: input.environment,\n root: input.executionRoot ?? root,\n coordinator,\n });\n if (agentManager !== undefined) cleanups.push(() => agentManager.close());\n const preference =\n options.contextualAsk.defaultExecutor === undefined\n ? {}\n : { defaultExecutor: options.contextualAsk.defaultExecutor };\n const contextualAskManager = !options.contextualAsk.enabled\n ? undefined\n : createContextualAskManager({\n coordinator,\n enabled: true,\n registry,\n root,\n ...(input.resolveSourceImports === undefined\n ? {}\n : { resolveSourceImports: input.resolveSourceImports }),\n executors: composeContextualAskExecutors({\n configuredKey:\n options.ai === false\n ? []\n : createConfiguredKeyAskExecutors({\n ai: options.ai,\n environment: input.environment,\n ...preference,\n }),\n managedCodex: input.createManagedAskExecutor(),\n ...preference,\n }),\n });\n if (contextualAskManager !== undefined)\n cleanups.push(() => contextualAskManager.close());\n const externalHandoffService = !options.externalAgent.enabled\n ? undefined\n : createExternalHandoffService({\n framework: input.framework,\n root,\n sessionId: input.session.id,\n });\n let externalAgentControl: ExternalAgentControlPort | undefined;\n if (externalHandoffService !== undefined) {\n cleanups.push(() => externalHandoffService.close());\n try {\n await externalHandoffService.start();\n } catch {\n warn(\"External Agent handoff is unavailable; core tools remain active.\");\n }\n if (externalHandoffService.capability().brokerReady) {\n try {\n const validation = await (input.resolveValidation?.() ??\n resolveManagedExecutionValidation({ ai: options.ai, appRoot: root }));\n const control = await input.createExternalAgentControl(validation);\n externalAgentControl = control;\n cleanups.push(() => control.dispose());\n } catch {\n warn(\"Managed Agent control is unavailable; Inbox remains active.\");\n }\n }\n }\n const middleware = createSpotPatchMiddleware({\n options,\n root,\n registry,\n session: input.session,\n ...(input.projectDataFlowSource === undefined\n ? {}\n : { projectDataFlowSource: input.projectDataFlowSource }),\n ...(input.bootstrap === undefined ? {} : { bootstrap: input.bootstrap }),\n ...(input.logger === undefined ? {} : { logger: input.logger }),\n ...(input.editorLauncher === undefined\n ? {}\n : { editorLauncher: input.editorLauncher }),\n ...(agentManager === undefined ? {} : { agentManager }),\n ...(contextualAskManager === undefined ? {} : { contextualAskManager }),\n ...(externalHandoffService === undefined ? {} : { externalHandoffService }),\n ...(externalAgentControl === undefined ? {} : { externalAgentControl }),\n });\n cleanups.push(() => {\n middleware.dispose();\n });\n return Object.freeze({ middleware, close });\n } catch (error) {\n try {\n await close();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n \"SpotPatch service startup and cleanup failed.\",\n );\n }\n throw error;\n }\n}\n"],"mappings":"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","names":["import_shared","import_external_agent_node","import_node_crypto","import_shared","import_node_crypto","import_shared","import_shared","normalizeError","snapshot","import_node_crypto","import_shared","import_external_agent_node","path","import_node_crypto","import_node_crypto","import_shared","defaultRandomId","snapshot","fingerprint","fingerprint","import_node_crypto","import_promises","import_node_path","path","import_shared","import_promises","import_node_path","import_shared","path","import_node_path","import_node_crypto","path","import_node_crypto","import_shared","import_agent","import_node_crypto","import_promises","import_node_path","import_shared","path","snapshot","DEFAULT_DEPENDENCIES","snapshot","import_agent","import_shared","import_shared","writeJson","import_shared","import_promises","import_node_path","import_shared","import_promises","import_node_path","import_shared","import_oxc_parser","import_promises","import_node_path","import_shared","path","path","path","path","parsed","import_shared","path","parsed","import_shared","import_shared","path","import_node_child_process","DEFAULT_DEPENDENCIES","launchEditor","import_node_crypto","import_shared","report","import_node_crypto","import_shared","tokensMatch","import_shared","getSingleHeader","STATUS_BY_ERROR","PUBLIC_MESSAGES","writeJson","writeError","path","import_node_crypto","import_promises","import_node_path","import_shared","import_zod","getSingleHeader","path","writeJson","import_node_crypto","isRecord"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/agent/job-manager.ts","../src/external-handoff/service.ts","../src/external-handoff/active-registry.ts","../src/external-handoff/clock.ts","../src/external-handoff/broker.ts","../src/server/request-body.ts","../src/server/constants.ts","../src/external-handoff/discovery.ts","../src/external-handoff/fingerprint.ts","../src/external-handoff/store.ts","../src/environment-ai.ts","../src/integration/file-plan.ts","../src/options.ts","../src/project-validation.ts","../src/project-options.ts","../src/registry/source-registry.ts","../src/registry/source-id.ts","../src/contextual-ask/manager.ts","../src/contextual-ask/error.ts","../src/contextual-ask/read-snapshot.ts","../src/contextual-ask/configured-key-executors.ts","../src/contextual-ask/executors.ts","../src/workspace/activity-coordinator.ts","../src/server/middleware.ts","../src/contextual-ask/http.ts","../src/external-handoff/browser-http.ts","../src/server/annotation-authorizer.ts","../src/server/source-context.ts","../src/server/extract-code-context.ts","../src/server/source-file.ts","../src/external-agent/browser-http.ts","../src/server/agent-http.ts","../src/server/agent-request.ts","../src/server/editor.ts","../src/server/data-flow-http.ts","../src/server/request-security.ts","../src/server/runtime-bootstrap.ts","../src/server/source-registration.ts","../src/session/session.ts","../src/transport-options.ts","../src/development-session.ts"],"sourcesContent":["export {\n createAgentJobManager,\n type AgentJobEventListener,\n type AgentJobManager,\n type CreateAgentJobManagerOptions,\n} from \"./agent/job-manager.js\";\nexport {\n createExternalHandoffService,\n type CreateExternalHandoffServiceOptions,\n type ExternalHandoffService,\n} from \"./external-handoff/service.js\";\nexport type { ExternalAgentControlPort } from \"./external-agent/control-port.js\";\nexport {\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n type EnvironmentAiConfiguration,\n} from \"./environment-ai.js\";\nexport {\n applyIntegrationPlan,\n createIntegrationFileChange,\n integrationPathExists,\n readIntegrationFile,\n type IntegrationFileChange,\n type IntegrationPlan,\n} from \"./integration/file-plan.js\";\nexport {\n createRuntimeAiConfig,\n createRuntimeDataFlowConfig,\n DEFAULT_EXCLUDE,\n DEFAULT_OPTIONS,\n resolveOptions,\n type FilterEntry,\n type ResolvedSpotPatchOptions,\n type ResolvedSpotPatchDataFlowOptions,\n type ResolvedContextualAskOptions,\n type SimpleAiOptions,\n type SpotPatchAiOptions,\n type SpotPatchDataFlowOptions,\n type SpotPatchOptions,\n} from \"./options.js\";\nexport {\n resolveProjectOptions,\n type ResolveProjectOptionsInput,\n} from \"./project-options.js\";\nexport {\n discoverProjectValidationCheck,\n resolveManagedExecutionValidation,\n resolveProjectValidationChecks,\n type DiscoverProjectValidationCheckOptions,\n type ResolvedManagedExecutionValidation,\n type ResolveManagedExecutionValidationOptions,\n type ResolveProjectValidationChecksOptions,\n} from \"./project-validation.js\";\nexport {\n createSourceRegistry,\n type SourceRegistry,\n} from \"./registry/source-registry.js\";\nexport {\n createContextualAskManager,\n type ContextualAskJobEventListener,\n type ContextualAskManager,\n type CreateContextualAskManagerOptions,\n} from \"./contextual-ask/manager.js\";\nexport {\n captureAskReadSnapshot,\n type CapturedAskReadSnapshot,\n type CaptureAskReadSnapshotOptions,\n} from \"./contextual-ask/read-snapshot.js\";\nexport { ContextualAskError } from \"./contextual-ask/error.js\";\nexport {\n createConfiguredKeyAskExecutors,\n type CreateConfiguredKeyAskExecutorsOptions,\n} from \"./contextual-ask/configured-key-executors.js\";\nexport {\n composeContextualAskExecutors,\n type ComposeContextualAskExecutorsOptions,\n type ManagedAskExecutors,\n} from \"./contextual-ask/executors.js\";\nexport {\n createWorkspaceActivityCoordinator,\n type WorkspaceActivityCoordinator,\n type WorkspaceActivityKind,\n type WorkspaceActivityLease,\n} from \"./workspace/activity-coordinator.js\";\nexport {\n createSpotPatchMiddleware,\n type CreateMiddlewareOptions,\n type SpotPatchMiddleware,\n type SpotPatchNext,\n type SpotPatchServerLogger,\n} from \"./server/middleware.js\";\nexport { readJsonRequestBody } from \"./server/request-body.js\";\nexport {\n readRuntimeBootstrap,\n resolveRuntimeBootstrapOptions,\n type ResolvedRuntimeBootstrapOptions,\n type RuntimeBootstrapOptions,\n} from \"./server/runtime-bootstrap.js\";\nexport { isLoopbackHostname } from \"./server/request-security.js\";\nexport {\n handleContextualAskRequest,\n matchContextualAskPath,\n type ContextualAskRoute,\n} from \"./contextual-ask/http.js\";\nexport {\n createSourceRegistrationService,\n type SourceRegistrationHandler,\n type SourceRegistrationService,\n type SourceRegistrationServiceOptions,\n} from \"./server/source-registration.js\";\nexport { createSession, type SpotPatchSession } from \"./session/session.js\";\nexport {\n parseSerializedSpotPatchOptions,\n serializeResolvedSpotPatchOptions,\n type SerializedFilterEntry,\n type SerializedSpotPatchOptions,\n} from \"./transport-options.js\";\nexport {\n createDevelopmentSession,\n type DevelopmentSession,\n type DevelopmentSessionInput,\n} from \"./development-session.js\";\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 AgentApplyMode,\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\nimport type {\n WorkspaceActivityCoordinator,\n WorkspaceActivityLease,\n} from \"../workspace/activity-coordinator.js\";\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 applyMode: AgentApplyMode;\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 trustedFastModeConsent: boolean;\n readonly workingTreeMode: AgentWorkingTreeMode;\n lease: WorkspaceActivityLease | undefined;\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 readonly coordinator?: WorkspaceActivityCoordinator;\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 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: 2 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 if (!isActive(status)) {\n job.lease?.release();\n job.lease = undefined;\n }\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(\n job,\n \"applying\",\n job.applyMode === \"trusted-auto\"\n ? \"Applying trusted change directly to the project.\"\n : \"Applying validated changes to the project.\",\n );\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\", \"Preparing isolated Agent execution.\");\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 execution = Object.freeze({\n ...options.ai.execution,\n applyMode: job.applyMode,\n });\n const preparedChange = await dependencies.executeChange({\n annotation: job.annotation,\n callbacks,\n credential: job.credential,\n 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 const shouldApplyDirectly =\n (job.applyMode === \"auto\" && preparedChange.autoApplyEligible) ||\n (job.applyMode === \"trusted-auto\" && job.trustedFastModeConsent);\n\n if (shouldApplyDirectly) {\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 for (const job of jobs.values()) job.lease?.release();\n jobs.clear();\n },\n\n create(request) {\n if (closed) {\n throw new SpotPatchError(ERROR_CODES.AI_DISABLED);\n }\n\n const configuredApplyMode = options.ai.execution.applyMode;\n const requestedApplyMode =\n request.applyMode ??\n (request.trustedFastModeConsent === true\n ? \"trusted-auto\"\n : configuredApplyMode);\n const applyModeAllowed =\n configuredApplyMode === \"trusted-auto\"\n ? requestedApplyMode === \"review\" || requestedApplyMode === \"trusted-auto\"\n : requestedApplyMode === configuredApplyMode;\n const trustedConsentMatches =\n (requestedApplyMode === \"trusted-auto\") ===\n (request.trustedFastModeConsent === true);\n\n if (!applyModeAllowed || !trustedConsentMatches) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\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 const lease = options.coordinator?.acquire(\"change\");\n if (options.coordinator !== undefined && lease === undefined) {\n throw new SpotPatchError(ERROR_CODES.AGENT_BUSY);\n }\n const id = dependencies.createJobId();\n\n if (!JOB_ID_PATTERN.test(id) || jobs.has(id)) {\n lease?.release();\n throw new SpotPatchError(ERROR_CODES.INTERNAL_ERROR);\n }\n\n const timestamp = dependencies.now();\n const job: InternalAgentJob = {\n annotation: request.annotation,\n applyMode: requestedApplyMode,\n controller: new AbortController(),\n createdAt: timestamp,\n credential: selection.credential,\n errorCode: undefined,\n events: [],\n id,\n listeners: new Set(),\n lease,\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 trustedFastModeConsent: request.trustedFastModeConsent === true,\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 const lease = options.coordinator?.acquire(\"change\");\n if (options.coordinator !== undefined && lease === undefined) {\n throw new SpotPatchError(ERROR_CODES.AGENT_BUSY);\n }\n job.lease = lease;\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 {\n ERROR_CODES,\n EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n SpotPatchError,\n type ExternalHandoffCapability,\n type ExternalHandoffFramework,\n type ExternalHandoffPublishRequest,\n type ExternalHandoffPublishResult,\n type ExternalHandoffStatusResult,\n type SpotAnnotation,\n} from \"@spotpatch/shared\";\nimport { computeExternalHandoffProjectKey } from \"@spotpatch/shared/external-agent-node\";\n\nimport {\n createActiveAdapterRegistry,\n type ActiveAdapterRegistry,\n} from \"./active-registry.js\";\nimport { createExternalHandoffBroker, type ExternalHandoffBroker } from \"./broker.js\";\nimport {\n publishExternalHandoffDescriptor,\n type PublishedExternalHandoffDescriptor,\n} from \"./discovery.js\";\nimport { fingerprintExternalHandoffAnnotation } from \"./fingerprint.js\";\nimport { createExternalHandoffStore } from \"./store.js\";\n\nexport type AuthorizeExternalHandoff = (\n annotation: ExternalHandoffPublishRequest[\"annotation\"],\n) => Promise<SpotAnnotation>;\n\nexport interface ExternalHandoffService {\n readonly capability: () => ExternalHandoffCapability;\n readonly close: () => Promise<void>;\n readonly publish: (\n request: ExternalHandoffPublishRequest,\n authorize: AuthorizeExternalHandoff,\n ) => Promise<ExternalHandoffPublishResult>;\n readonly resolveDelivery: (cursor: string) => ExternalHandoffStatusResult;\n readonly start: () => Promise<void>;\n readonly status: (cursor?: string) => ExternalHandoffStatusResult;\n}\n\nexport interface CreateExternalHandoffServiceOptions {\n readonly framework: ExternalHandoffFramework;\n readonly root: string;\n readonly sessionId: string;\n}\n\ninterface InFlightPublish {\n readonly fingerprint: string;\n readonly promise: Promise<ExternalHandoffPublishResult>;\n}\n\ntype ServiceState = \"idle\" | \"starting\" | \"ready\" | \"failed\" | \"closed\";\n\nfunction asReplay(result: ExternalHandoffPublishResult): ExternalHandoffPublishResult {\n return Object.freeze({ ...result, replayed: true });\n}\n\nexport function createExternalHandoffService(\n options: CreateExternalHandoffServiceOptions,\n): ExternalHandoffService {\n const activeRegistry: ActiveAdapterRegistry = createActiveAdapterRegistry();\n const store = createExternalHandoffStore({\n framework: options.framework,\n sessionId: options.sessionId,\n });\n const inFlight = new Map<string, InFlightPublish>();\n let broker: ExternalHandoffBroker | undefined;\n let descriptor: PublishedExternalHandoffDescriptor | undefined;\n let startPromise: Promise<void> | undefined;\n let closePromise: Promise<void> | undefined;\n let state: ServiceState = \"idle\";\n const isClosed = (): boolean => state === \"closed\";\n\n const requireReady = (): void => {\n if (state !== \"ready\" || broker?.isReady() !== true) {\n throw new SpotPatchError(\n state === \"closed\"\n ? ERROR_CODES.SESSION_CLOSED\n : ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE,\n );\n }\n };\n\n const start = async (): Promise<void> => {\n if (state === \"ready\") return;\n if (state === \"closed\") throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n if (startPromise !== undefined) return startPromise;\n\n state = \"starting\";\n startPromise = (async () => {\n let createdBroker: ExternalHandoffBroker | undefined;\n let createdDescriptor: PublishedExternalHandoffDescriptor | undefined;\n\n try {\n const projectKey = await computeExternalHandoffProjectKey(options.root);\n createdBroker = await createExternalHandoffBroker({\n activeRegistry,\n framework: options.framework,\n projectKey,\n sessionId: options.sessionId,\n store,\n });\n createdDescriptor = await publishExternalHandoffDescriptor({\n bridgeToken: createdBroker.bridgeToken,\n endpoint: createdBroker.endpoint,\n framework: options.framework,\n root: options.root,\n sessionId: options.sessionId,\n });\n\n if (isClosed()) {\n await createdDescriptor.close();\n await createdBroker.close();\n throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n }\n\n broker = createdBroker;\n descriptor = createdDescriptor;\n state = \"ready\";\n } catch (error: unknown) {\n if (createdDescriptor !== undefined && descriptor !== createdDescriptor) {\n await createdDescriptor.close().catch(() => undefined);\n }\n if (createdBroker !== undefined && broker !== createdBroker) {\n await createdBroker.close().catch(() => undefined);\n }\n if (!isClosed()) state = \"failed\";\n throw error;\n }\n })();\n\n return startPromise;\n };\n\n return Object.freeze({\n start,\n\n capability() {\n const currentCursor = store.currentCursor();\n const active = activeRegistry.snapshot(currentCursor ?? undefined);\n return Object.freeze({\n enabled: true,\n brokerReady: state === \"ready\" && broker?.isReady() === true,\n activeWaitCount: store.activeWaitCount(),\n snapshotSchemaVersion: EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n brokerProtocolVersion: EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n activeAdapter: active.activeAdapter,\n dispatch: currentCursor === null ? null : active.dispatch,\n });\n },\n\n async publish(\n request: ExternalHandoffPublishRequest,\n authorize: AuthorizeExternalHandoff,\n ) {\n requireReady();\n const fingerprint = fingerprintExternalHandoffAnnotation(request.annotation);\n const replayed = store.replay(request.requestId, fingerprint);\n if (replayed !== undefined) return replayed;\n\n const pending = inFlight.get(request.requestId);\n if (pending !== undefined) {\n if (pending.fingerprint !== fingerprint) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_VALIDATION_FAILED);\n }\n return asReplay(await pending.promise);\n }\n\n activeRegistry.assertPublishable();\n\n const promise = (async (): Promise<ExternalHandoffPublishResult> => {\n const annotation = await authorize(request.annotation);\n return store.publish({\n annotation,\n fingerprint,\n requestId: request.requestId,\n reserve: activeRegistry.reserve,\n });\n })();\n const activePublish = Object.freeze({ fingerprint, promise });\n inFlight.set(request.requestId, activePublish);\n\n try {\n return await promise;\n } finally {\n if (inFlight.get(request.requestId) === activePublish) {\n inFlight.delete(request.requestId);\n }\n }\n },\n\n status(cursor?: string) {\n requireReady();\n const handoff = store.status(cursor);\n const active = activeRegistry.snapshot(cursor ?? handoff.cursor);\n return Object.freeze({\n handoff,\n activeAdapter: active.activeAdapter,\n dispatch: active.dispatch,\n });\n },\n\n resolveDelivery(cursor: string) {\n requireReady();\n const handoff = store.status(cursor);\n const active = activeRegistry.resolveDelivery(cursor);\n return Object.freeze({\n handoff,\n activeAdapter: active.activeAdapter,\n dispatch: active.dispatch,\n });\n },\n\n close() {\n closePromise ??= (async () => {\n if (state === \"closed\") return;\n state = \"closed\";\n activeRegistry.close();\n store.close();\n inFlight.clear();\n await startPromise?.catch(() => undefined);\n const publishedDescriptor = descriptor;\n descriptor = undefined;\n const activeBroker = broker;\n broker = undefined;\n await publishedDescriptor?.close().catch(() => undefined);\n await activeBroker?.close().catch(() => undefined);\n })();\n return closePromise;\n },\n });\n}\n","import { randomBytes } from \"node:crypto\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_HANDOFF_LIMITS,\n SpotPatchError,\n type ActiveAdapterSummary,\n type DispatchSummary,\n type ExternalHandoffActiveAdapterKind,\n type ExternalHandoffDispatchPhase,\n type ExternalHandoffPublishDelivery,\n type ExternalHandoffReportableDispatchPhase,\n} from \"@spotpatch/shared\";\nimport type {\n BridgeActiveClaimResult,\n BridgeActiveStateResult,\n} from \"@spotpatch/shared/external-agent-node\";\n\nimport { SYSTEM_EXTERNAL_HANDOFF_CLOCK, type ExternalHandoffClock } from \"./clock.js\";\n\ninterface ActiveLease {\n readonly adapterKind: ExternalHandoffActiveAdapterKind;\n readonly baselineCursor: string | null;\n readonly connectedAt: string;\n readonly connectorInstanceId: string;\n readonly token: string;\n expiresAtMonotonic: number;\n updatedAt: string;\n}\n\ninterface ActiveDispatch {\n readonly adapterKind: ExternalHandoffActiveAdapterKind;\n readonly cursor: string;\n readonly deadlineMonotonic: number;\n readonly revision: number;\n phase: ExternalHandoffDispatchPhase;\n updatedAt: string;\n}\n\ninterface BlockedAdapter {\n readonly adapterKind: ExternalHandoffActiveAdapterKind;\n readonly connectedAt: string;\n readonly updatedAt: string;\n}\n\nexport interface ActiveRegistrySnapshot {\n readonly activeAdapter: ActiveAdapterSummary | null;\n readonly dispatch: DispatchSummary | null;\n}\n\nexport interface ActiveAdapterRegistry {\n readonly assertPublishable: () => void;\n readonly claim: (\n adapterKind: ExternalHandoffActiveAdapterKind,\n connectorInstanceId: string,\n baselineCursor: string | null,\n ) => BridgeActiveClaimResult;\n readonly close: () => void;\n readonly heartbeat: (leaseToken: string) => BridgeActiveStateResult;\n readonly release: (leaseToken: string) => BridgeActiveStateResult;\n readonly report: (\n leaseToken: string,\n cursor: string,\n phase: ExternalHandoffReportableDispatchPhase,\n ) => BridgeActiveStateResult;\n readonly reserve: (\n cursor: string,\n revision: number,\n ) => ExternalHandoffPublishDelivery;\n readonly resolveDelivery: (cursor: string) => ActiveRegistrySnapshot;\n readonly snapshot: (cursor?: string) => ActiveRegistrySnapshot;\n}\n\nexport interface CreateActiveAdapterRegistryOptions {\n readonly clock?: ExternalHandoffClock;\n readonly randomId?: () => string;\n}\n\nconst ALLOWED_TRANSITIONS = Object.freeze({\n queued: [\"dispatching\", \"failed\"],\n dispatching: [\"dispatched\", \"working\", \"failed\", \"delivery-unknown\"],\n dispatched: [\"working\", \"failed\", \"delivery-unknown\"],\n working: [\"completed\", \"failed\", \"delivery-unknown\"],\n completed: [],\n failed: [],\n \"delivery-unknown\": [],\n} as const) satisfies Readonly<\n Record<ExternalHandoffDispatchPhase, readonly ExternalHandoffDispatchPhase[]>\n>;\n\nconst TERMINAL_PHASES = new Set<ExternalHandoffDispatchPhase>([\n \"completed\",\n \"failed\",\n \"delivery-unknown\",\n]);\n\nfunction defaultRandomId(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nfunction requirePresent<T>(value: T | null): T {\n if (value === null) throw new SpotPatchError(ERROR_CODES.INTERNAL_ERROR);\n return value;\n}\n\nexport function createActiveAdapterRegistry(\n options: CreateActiveAdapterRegistryOptions = {},\n): ActiveAdapterRegistry {\n const clock = options.clock ?? SYSTEM_EXTERNAL_HANDOFF_CLOCK;\n const randomId = options.randomId ?? defaultRandomId;\n let blocked: BlockedAdapter | undefined;\n let closed = false;\n let dispatch: ActiveDispatch | undefined;\n let lastReleasedToken: string | undefined;\n let lease: ActiveLease | undefined;\n\n const nowIso = (): string => new Date(clock.wallNow()).toISOString();\n\n const requireOpen = (): void => {\n if (closed) throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n };\n\n const dispatchSummary = (): DispatchSummary | null =>\n dispatch === undefined\n ? null\n : Object.freeze({\n adapterKind: dispatch.adapterKind,\n revision: dispatch.revision,\n phase: dispatch.phase,\n updatedAt: dispatch.updatedAt,\n });\n\n const activeSummary = (): ActiveAdapterSummary | null => {\n if (blocked !== undefined) {\n return Object.freeze({\n kind: blocked.adapterKind,\n state: \"blocked\",\n canDispatch: false,\n connectedAt: blocked.connectedAt,\n updatedAt: blocked.updatedAt,\n });\n }\n\n if (lease === undefined) return null;\n const busy = dispatch !== undefined && !TERMINAL_PHASES.has(dispatch.phase);\n return Object.freeze({\n kind: lease.adapterKind,\n state: busy ? \"busy\" : \"ready\",\n canDispatch: !busy,\n connectedAt: lease.connectedAt,\n updatedAt: lease.updatedAt,\n });\n };\n\n const state = (cursor?: string): ActiveRegistrySnapshot =>\n Object.freeze({\n activeAdapter: activeSummary(),\n dispatch:\n cursor === undefined || dispatch?.cursor === cursor ? dispatchSummary() : null,\n });\n\n const enterUnknown = (activeLease: ActiveLease): void => {\n if (dispatch === undefined) return;\n const updatedAt = nowIso();\n dispatch.phase = \"delivery-unknown\";\n dispatch.updatedAt = updatedAt;\n blocked = Object.freeze({\n adapterKind: activeLease.adapterKind,\n connectedAt: activeLease.connectedAt,\n updatedAt,\n });\n };\n\n const endLease = (activeLease: ActiveLease): void => {\n if (dispatch?.phase === \"queued\") {\n dispatch.phase = \"failed\";\n dispatch.updatedAt = nowIso();\n } else if (\n dispatch?.phase === \"dispatching\" ||\n dispatch?.phase === \"dispatched\" ||\n dispatch?.phase === \"working\"\n ) {\n enterUnknown(activeLease);\n }\n\n lastReleasedToken = activeLease.token;\n lease = undefined;\n };\n\n const sweep = (): void => {\n if (lease === undefined) return;\n const monotonicNow = clock.monotonicNow();\n\n if (\n monotonicNow >= lease.expiresAtMonotonic ||\n (dispatch !== undefined &&\n !TERMINAL_PHASES.has(dispatch.phase) &&\n monotonicNow >= dispatch.deadlineMonotonic)\n ) {\n endLease(lease);\n }\n };\n\n const assertPublishable = (): void => {\n requireOpen();\n sweep();\n\n if (\n blocked !== undefined ||\n (lease !== undefined &&\n dispatch !== undefined &&\n !TERMINAL_PHASES.has(dispatch.phase))\n ) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_AGENT_BUSY);\n }\n };\n\n const requireLease = (leaseToken: string): ActiveLease => {\n requireOpen();\n sweep();\n\n if (lease?.token !== leaseToken) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID);\n }\n\n return lease;\n };\n\n return Object.freeze({\n assertPublishable,\n\n claim(\n adapterKind: ExternalHandoffActiveAdapterKind,\n connectorInstanceId: string,\n baselineCursor: string | null,\n ) {\n requireOpen();\n sweep();\n\n if (blocked !== undefined) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_AGENT_BUSY);\n }\n if (lease !== undefined) {\n if (\n lease.adapterKind === adapterKind &&\n lease.connectorInstanceId === connectorInstanceId\n ) {\n lease.expiresAtMonotonic =\n clock.monotonicNow() + EXTERNAL_HANDOFF_LIMITS.activeLeaseDurationMs;\n lease.updatedAt = nowIso();\n return Object.freeze({\n leaseToken: lease.token,\n heartbeatIntervalMs: EXTERNAL_HANDOFF_LIMITS.activeHeartbeatIntervalMs,\n baselineCursor: lease.baselineCursor,\n activeAdapter: requirePresent(activeSummary()),\n });\n }\n throw new SpotPatchError(ERROR_CODES.ACTIVE_ADAPTER_CONFLICT);\n }\n\n const timestamp = nowIso();\n lease = {\n adapterKind,\n baselineCursor,\n connectedAt: timestamp,\n connectorInstanceId,\n token: randomId(),\n expiresAtMonotonic:\n clock.monotonicNow() + EXTERNAL_HANDOFF_LIMITS.activeLeaseDurationMs,\n updatedAt: timestamp,\n };\n lastReleasedToken = undefined;\n return Object.freeze({\n leaseToken: lease.token,\n heartbeatIntervalMs: EXTERNAL_HANDOFF_LIMITS.activeHeartbeatIntervalMs,\n baselineCursor,\n activeAdapter: requirePresent(activeSummary()),\n });\n },\n\n heartbeat(leaseToken: string) {\n const activeLease = requireLease(leaseToken);\n activeLease.expiresAtMonotonic =\n clock.monotonicNow() + EXTERNAL_HANDOFF_LIMITS.activeLeaseDurationMs;\n activeLease.updatedAt = nowIso();\n return state();\n },\n\n report(\n leaseToken: string,\n cursor: string,\n phase: ExternalHandoffReportableDispatchPhase,\n ) {\n const activeLease = requireLease(leaseToken);\n\n if (\n dispatch?.cursor !== cursor ||\n dispatch.adapterKind !== activeLease.adapterKind\n ) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_DISPATCH_INVALID);\n }\n if (dispatch.phase === phase) return state(cursor);\n const allowed: readonly ExternalHandoffDispatchPhase[] =\n ALLOWED_TRANSITIONS[dispatch.phase];\n if (!allowed.includes(phase)) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_DISPATCH_INVALID);\n }\n\n const updatedAt = nowIso();\n dispatch.phase = phase;\n dispatch.updatedAt = updatedAt;\n activeLease.updatedAt = updatedAt;\n\n if (phase === \"delivery-unknown\") {\n blocked = Object.freeze({\n adapterKind: activeLease.adapterKind,\n connectedAt: activeLease.connectedAt,\n updatedAt,\n });\n lastReleasedToken = activeLease.token;\n lease = undefined;\n }\n\n return state(cursor);\n },\n\n release(leaseToken: string) {\n requireOpen();\n sweep();\n\n if (lease === undefined && lastReleasedToken === leaseToken) return state();\n const activeLease = lease;\n if (activeLease?.token !== leaseToken) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID);\n }\n\n endLease(activeLease);\n return state();\n },\n\n reserve(cursor: string, revision: number) {\n assertPublishable();\n if (lease === undefined) return Object.freeze({ mode: \"inbox\" });\n\n const updatedAt = nowIso();\n dispatch = {\n adapterKind: lease.adapterKind,\n cursor,\n deadlineMonotonic:\n clock.monotonicNow() + EXTERNAL_HANDOFF_LIMITS.activeDispatchTimeoutMs,\n revision,\n phase: \"queued\",\n updatedAt,\n };\n lease.updatedAt = updatedAt;\n return Object.freeze({\n mode: \"active\",\n adapter: requirePresent(activeSummary()),\n dispatch: requirePresent(dispatchSummary()),\n });\n },\n\n resolveDelivery(cursor: string) {\n requireOpen();\n sweep();\n\n const activeDispatch = dispatch;\n if (\n blocked === undefined ||\n activeDispatch?.cursor !== cursor ||\n activeDispatch.phase !== \"delivery-unknown\"\n ) {\n throw new SpotPatchError(ERROR_CODES.ACTIVE_DISPATCH_INVALID);\n }\n\n blocked = undefined;\n return state(cursor);\n },\n\n snapshot(cursor?: string) {\n requireOpen();\n sweep();\n return state(cursor);\n },\n\n close() {\n if (closed) return;\n closed = true;\n blocked = undefined;\n dispatch = undefined;\n lease = undefined;\n lastReleasedToken = undefined;\n },\n });\n}\n","import { performance } from \"node:perf_hooks\";\n\nexport interface ExternalHandoffClock {\n readonly monotonicNow: () => number;\n readonly wallNow: () => number;\n}\n\nexport const SYSTEM_EXTERNAL_HANDOFF_CLOCK: ExternalHandoffClock = Object.freeze({\n monotonicNow: () => performance.now(),\n wallNow: () => Date.now(),\n});\n","import { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport {\n createServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport type { Socket } from \"node:net\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n EXTERNAL_HANDOFF_LIMITS,\n SpotPatchError,\n type ApiFailure,\n type ApiSuccess,\n type ExternalHandoffFramework,\n} from \"@spotpatch/shared\";\nimport {\n SPOTPATCH_BRIDGE_PATHS,\n SPOTPATCH_BRIDGE_TOKEN_HEADER,\n bridgeAckRequestSchema,\n bridgeActiveClaimRequestSchema,\n bridgeActiveHeartbeatRequestSchema,\n bridgeActiveReleaseRequestSchema,\n bridgeActiveReportRequestSchema,\n bridgeCurrentRequestSchema,\n bridgeStatusRequestSchema,\n bridgeWaitRequestSchema,\n} from \"@spotpatch/shared/external-agent-node\";\n\nimport { readJsonRequestBody } from \"../server/request-body.js\";\nimport type { ActiveAdapterRegistry } from \"./active-registry.js\";\nimport type { ExternalHandoffStore } from \"./store.js\";\n\nexport interface ExternalHandoffBroker {\n readonly bridgeToken: string;\n readonly close: () => Promise<void>;\n readonly endpoint: string;\n readonly isReady: () => boolean;\n}\n\nexport interface CreateExternalHandoffBrokerOptions {\n readonly activeRegistry: ActiveAdapterRegistry;\n readonly framework: ExternalHandoffFramework;\n readonly projectKey: string;\n readonly sessionId: string;\n readonly store: ExternalHandoffStore;\n}\n\nfunction singleHeader(request: IncomingMessage, name: string): string | undefined {\n const value = request.headers[name.toLowerCase()];\n return Array.isArray(value) ? undefined : value;\n}\n\nfunction tokensMatch(actual: string | undefined, expected: string): boolean {\n if (actual === undefined) return false;\n const actualBytes = Buffer.from(actual);\n const expectedBytes = Buffer.from(expected);\n return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\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(\"Connection\", \"close\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n response.end(JSON.stringify(payload));\n}\n\nfunction statusForError(code: string): number {\n if (code === ERROR_CODES.BRIDGE_UNAUTHORIZED) return 401;\n if (code === ERROR_CODES.HANDOFF_NOT_FOUND) return 404;\n if (code === ERROR_CODES.HANDOFF_EXPIRED || code === ERROR_CODES.SESSION_CLOSED) {\n return 410;\n }\n if (code === ERROR_CODES.BRIDGE_BUSY) return 429;\n if (code === ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID) return 401;\n if (code === ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE) return 413;\n if (\n code === ERROR_CODES.HANDOFF_CURSOR_INVALID ||\n code === ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH ||\n code === ERROR_CODES.EXTERNAL_AGENT_BUSY ||\n code === ERROR_CODES.ACTIVE_ADAPTER_CONFLICT ||\n code === ERROR_CODES.ACTIVE_DISPATCH_INVALID\n ) {\n return 409;\n }\n if (code === ERROR_CODES.INVALID_REQUEST) return 400;\n return 500;\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 assertAuthorized(\n request: IncomingMessage,\n expectedHost: string,\n bridgeToken: string,\n): void {\n if (\n request.socket.remoteAddress !== \"127.0.0.1\" ||\n singleHeader(request, \"host\") !== expectedHost ||\n !tokensMatch(singleHeader(request, SPOTPATCH_BRIDGE_TOKEN_HEADER), bridgeToken)\n ) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_UNAUTHORIZED);\n }\n}\n\nasync function closeServer(server: Server, sockets: Set<Socket>): Promise<void> {\n await new Promise<void>((resolve) => {\n server.close(() => {\n resolve();\n });\n\n for (const socket of sockets) {\n socket.destroy();\n }\n });\n}\n\nexport async function createExternalHandoffBroker(\n options: CreateExternalHandoffBrokerOptions,\n): Promise<ExternalHandoffBroker> {\n const bridgeToken = randomBytes(32).toString(\"base64url\");\n const sockets = new Set<Socket>();\n let expectedHost = \"\";\n const server = createServer(\n { maxHeaderSize: EXTERNAL_HANDOFF_LIMITS.maximumBrokerHeaderBytes },\n (request, response) => {\n const handle = async (): Promise<void> => {\n assertAuthorized(request, expectedHost, bridgeToken);\n\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const body = await readJsonRequestBody(\n request,\n EXTERNAL_HANDOFF_LIMITS.maximumBrokerRequestBytes,\n );\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.status) {\n const parsed = bridgeStatusRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n let current = null;\n\n try {\n current = options.store.status();\n } catch (error: unknown) {\n if (\n !(error instanceof SpotPatchError) ||\n error.code !== ERROR_CODES.HANDOFF_NOT_FOUND\n ) {\n throw error;\n }\n }\n\n writeJson(response, 200, {\n ok: true,\n data: Object.freeze({\n brokerProtocolVersion: EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n projectKey: options.projectKey,\n sessionId: options.sessionId,\n framework: options.framework,\n current,\n }),\n });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.current) {\n const parsed = bridgeCurrentRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const snapshot = options.store.current(parsed.data.cursor);\n writeJson(response, 200, {\n ok: true,\n data: Object.freeze({ outcome: \"handoff\" as const, snapshot }),\n });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.ack) {\n const parsed = bridgeAckRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const summary = options.store.ack(\n parsed.data.cursor,\n parsed.data.connectorInstanceId,\n );\n writeJson(response, 200, {\n ok: true,\n data: Object.freeze({ summary }),\n });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.wait) {\n const parsed = bridgeWaitRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const controller = new AbortController();\n const abort = (): void => {\n if (!response.writableEnded) controller.abort(\"bridge-client-closed\");\n };\n response.once(\"close\", abort);\n\n try {\n const data = await options.store.wait(\n parsed.data.afterCursor,\n parsed.data.timeoutMs,\n controller.signal,\n );\n writeJson(response, 200, { ok: true, data });\n } finally {\n response.removeListener(\"close\", abort);\n }\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.activeClaim) {\n const parsed = bridgeActiveClaimRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const data = options.activeRegistry.claim(\n parsed.data.adapterKind,\n parsed.data.connectorInstanceId,\n options.store.currentCursor(),\n );\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.activeHeartbeat) {\n const parsed = bridgeActiveHeartbeatRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const data = options.activeRegistry.heartbeat(parsed.data.leaseToken);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.activeReport) {\n const parsed = bridgeActiveReportRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const data = options.activeRegistry.report(\n parsed.data.leaseToken,\n parsed.data.cursor,\n parsed.data.phase,\n );\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (request.url === SPOTPATCH_BRIDGE_PATHS.activeRelease) {\n const parsed = bridgeActiveReleaseRequestSchema.safeParse(body);\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const data = options.activeRegistry.release(parsed.data.leaseToken);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n };\n\n void handle().catch((error: unknown) => {\n if (response.writableEnded || response.destroyed) return;\n const normalized = normalizeError(error);\n\n if (normalized.code === ERROR_CODES.BRIDGE_BUSY) {\n response.setHeader(\"Retry-After\", \"1\");\n }\n\n writeJson(response, statusForError(normalized.code), {\n ok: false,\n error: {\n code: normalized.code,\n message: \"The local SpotPatch bridge request failed.\",\n },\n });\n });\n },\n );\n server.maxConnections = EXTERNAL_HANDOFF_LIMITS.maximumBrokerSockets;\n server.headersTimeout = 5_000;\n server.requestTimeout = EXTERNAL_HANDOFF_LIMITS.maximumWaitMs + 5_000;\n server.keepAliveTimeout = 1;\n server.on(\"connection\", (socket) => {\n if (sockets.size >= EXTERNAL_HANDOFF_LIMITS.maximumBrokerSockets) {\n socket.destroy();\n return;\n }\n\n sockets.add(socket);\n socket.once(\"close\", () => sockets.delete(socket));\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(0, \"127.0.0.1\", resolve);\n });\n const address = server.address();\n\n if (\n address === null ||\n typeof address === \"string\" ||\n address.address !== \"127.0.0.1\"\n ) {\n await closeServer(server, sockets);\n throw new Error(\"SpotPatch external Agent broker did not bind IPv4 loopback.\");\n }\n\n expectedHost = `127.0.0.1:${String(address.port)}`;\n let closed = false;\n let ready = true;\n server.removeAllListeners(\"error\");\n server.on(\"error\", () => {\n ready = false;\n\n for (const socket of sockets) socket.destroy();\n });\n return Object.freeze({\n bridgeToken,\n endpoint: `http://${expectedHost}`,\n isReady: () => ready && !closed,\n async close() {\n if (closed) return;\n closed = true;\n ready = false;\n await closeServer(server, sockets);\n },\n });\n}\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","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 { randomBytes } from \"node:crypto\";\nimport { lstat, open, rename, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n EXTERNAL_HANDOFF_LIMITS,\n type ExternalHandoffFramework,\n} from \"@spotpatch/shared\";\nimport {\n computeExternalHandoffProjectKey,\n assertPrivateExternalHandoffPath,\n externalHandoffDescriptorSchema,\n initializePrivateExternalHandoffFile,\n resolveExternalHandoffRuntimeDirectory,\n type ExternalHandoffDescriptor,\n} from \"@spotpatch/shared/external-agent-node\";\n\nexport interface PublishedExternalHandoffDescriptor {\n readonly close: () => Promise<void>;\n readonly descriptor: ExternalHandoffDescriptor;\n}\n\nexport interface PublishExternalHandoffDescriptorOptions {\n readonly bridgeToken: string;\n readonly endpoint: string;\n readonly framework: ExternalHandoffFramework;\n readonly root: string;\n readonly sessionId: string;\n}\n\nasync function syncDirectory(directory: string): Promise<void> {\n // Node cannot open directories for fsync on Windows. The atomic rename still\n // protects readers from observing a partial descriptor.\n if (process.platform === \"win32\") return;\n\n const handle = await open(directory, \"r\");\n\n try {\n await handle.sync();\n } catch (error: unknown) {\n const code = (error as NodeJS.ErrnoException).code;\n\n if (code !== \"EINVAL\" && code !== \"ENOTSUP\") {\n throw error;\n }\n } finally {\n await handle.close();\n }\n}\n\nexport async function publishExternalHandoffDescriptor(\n options: PublishExternalHandoffDescriptorOptions,\n): Promise<PublishedExternalHandoffDescriptor> {\n const directory = await resolveExternalHandoffRuntimeDirectory(true);\n const descriptor = externalHandoffDescriptorSchema.parse({\n schemaVersion: 1,\n brokerProtocolVersion: EXTERNAL_HANDOFF_BROKER_PROTOCOL_VERSION,\n projectKey: await computeExternalHandoffProjectKey(options.root),\n sessionId: options.sessionId,\n framework: options.framework,\n endpoint: options.endpoint,\n bridgeToken: options.bridgeToken,\n pid: process.pid,\n createdAt: new Date().toISOString(),\n });\n const serialized = JSON.stringify(descriptor);\n\n if (\n Buffer.byteLength(serialized, \"utf8\") >\n EXTERNAL_HANDOFF_LIMITS.maximumDescriptorBytes\n ) {\n throw new RangeError(\"SpotPatch external Agent descriptor exceeds its limit.\");\n }\n\n const destination = path.join(directory, `${descriptor.sessionId}.json`);\n const temporary = path.join(\n directory,\n `.${descriptor.sessionId}.${randomBytes(8).toString(\"hex\")}.tmp`,\n );\n let temporaryExists = false;\n let published = false;\n let descriptorIdentity: Readonly<{ device: number; inode: number }> = Object.freeze({\n device: -1,\n inode: -1,\n });\n\n try {\n const handle = await open(temporary, \"wx\", 0o600);\n temporaryExists = true;\n\n try {\n await handle.writeFile(serialized, \"utf8\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n\n await initializePrivateExternalHandoffFile(temporary);\n await rename(temporary, destination);\n temporaryExists = false;\n published = true;\n const status = await assertPrivateExternalHandoffPath(destination, \"file\");\n\n descriptorIdentity = Object.freeze({ device: status.dev, inode: status.ino });\n\n await syncDirectory(directory);\n } catch (error: unknown) {\n if (temporaryExists) {\n await unlink(temporary).catch(() => undefined);\n }\n\n if (published) {\n await unlink(destination).catch(() => undefined);\n }\n\n throw error;\n }\n\n let closed = false;\n return Object.freeze({\n descriptor,\n async close() {\n if (closed) return;\n closed = true;\n await lstat(destination)\n .then(async (status) => {\n if (\n status.dev === descriptorIdentity.device &&\n status.ino === descriptorIdentity.inode\n ) {\n await unlink(destination);\n }\n })\n .catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n });\n await syncDirectory(directory);\n },\n });\n}\n","import { createHash } from \"node:crypto\";\n\nimport type { ExternalHandoffPublishRequest } from \"@spotpatch/shared\";\n\nfunction canonicalJson(value: unknown): string {\n if (value === null || typeof value === \"boolean\" || typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new TypeError(\"Non-finite JSON number.\");\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((entry) => canonicalJson(entry)).join(\",\")}]`;\n }\n if (typeof value === \"object\") {\n const record = value as Readonly<Record<string, unknown>>;\n return `{${Object.keys(record)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`)\n .join(\",\")}}`;\n }\n\n throw new TypeError(\"Unsupported JSON value.\");\n}\n\nexport function fingerprintExternalHandoffAnnotation(\n annotation: ExternalHandoffPublishRequest[\"annotation\"],\n): string {\n return createHash(\"sha256\").update(canonicalJson(annotation)).digest(\"hex\");\n}\n","import { randomBytes } from \"node:crypto\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_HANDOFF_LIMITS,\n EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n SpotPatchError,\n type ExternalHandoffFramework,\n type ExternalHandoffPublishDelivery,\n type ExternalHandoffPublishResult,\n type ExternalHandoffSnapshot,\n type ExternalHandoffState,\n type ExternalHandoffSummary,\n type SpotAnnotation,\n} from \"@spotpatch/shared\";\nimport type { BridgeWaitResult } from \"@spotpatch/shared/external-agent-node\";\n\nimport { SYSTEM_EXTERNAL_HANDOFF_CLOCK, type ExternalHandoffClock } from \"./clock.js\";\n\ninterface CurrentHandoff {\n readonly expiresAtMonotonic: number;\n readonly receipts: Set<string>;\n readonly snapshot: ExternalHandoffSnapshot;\n pickedUpAt?: string;\n}\n\ninterface HandoffWaiter {\n readonly reject: (error: SpotPatchError) => void;\n readonly resolve: (result: BridgeWaitResult) => void;\n}\n\ninterface IdempotencyRecord {\n readonly expiresAtMonotonic: number;\n readonly fingerprint: string;\n readonly result: ExternalHandoffPublishResult;\n}\n\nexport interface PublishExternalHandoffInput {\n readonly annotation: SpotAnnotation;\n readonly fingerprint: string;\n readonly requestId: string;\n readonly reserve: (\n cursor: string,\n revision: number,\n ) => ExternalHandoffPublishDelivery;\n}\n\nexport interface ExternalHandoffStore {\n readonly activeWaitCount: () => number;\n readonly ack: (cursor: string, connectorInstanceId: string) => ExternalHandoffSummary;\n readonly close: () => void;\n readonly current: (cursor?: string) => ExternalHandoffSnapshot;\n readonly currentCursor: () => string | null;\n readonly publish: (\n input: PublishExternalHandoffInput,\n ) => ExternalHandoffPublishResult;\n readonly replay: (\n requestId: string,\n fingerprint: string,\n ) => ExternalHandoffPublishResult | undefined;\n readonly status: (cursor?: string) => ExternalHandoffSummary;\n readonly wait: (\n afterCursor: string | undefined,\n timeoutMs: number,\n signal: AbortSignal,\n ) => Promise<BridgeWaitResult>;\n}\n\nexport interface CreateExternalHandoffStoreOptions {\n readonly clock?: ExternalHandoffClock;\n readonly framework: ExternalHandoffFramework;\n readonly randomId?: () => string;\n readonly sessionId: string;\n}\n\nfunction defaultRandomId(): string {\n return randomBytes(24).toString(\"base64url\");\n}\n\nfunction pageSummary(\n annotation: SpotAnnotation,\n): Readonly<{ origin: string; pathname: string }> {\n let origin = \"[unavailable]\";\n\n try {\n const url = new URL(annotation.page.url);\n origin = url.origin === \"null\" ? \"[unavailable]\" : url.origin;\n } catch {\n // Invalid and non-standard origins are intentionally omitted from the summary.\n }\n\n return Object.freeze({ origin, pathname: annotation.page.pathname });\n}\n\nfunction summaryOf(\n current: CurrentHandoff,\n state: ExternalHandoffState,\n): ExternalHandoffSummary {\n const snapshot = current.snapshot;\n return Object.freeze({\n sessionId: snapshot.session.id,\n framework: snapshot.session.framework,\n revision: snapshot.revision,\n cursor: snapshot.cursor,\n targetCount: snapshot.annotation.targets.length,\n page: pageSummary(snapshot.annotation),\n publishedAt: snapshot.publishedAt,\n expiresAt: snapshot.expiresAt,\n state,\n pickupCount: current.receipts.size,\n ...(current.pickedUpAt === undefined ? {} : { pickedUpAt: current.pickedUpAt }),\n });\n}\n\nfunction replayResult(record: IdempotencyRecord): ExternalHandoffPublishResult {\n return Object.freeze({ ...record.result, replayed: true });\n}\n\nexport function createExternalHandoffStore(\n options: CreateExternalHandoffStoreOptions,\n): ExternalHandoffStore {\n const clock = options.clock ?? SYSTEM_EXTERNAL_HANDOFF_CLOCK;\n const randomId = options.randomId ?? defaultRandomId;\n const history: ExternalHandoffSummary[] = [];\n const idempotency = new Map<string, IdempotencyRecord>();\n const waiters = new Set<HandoffWaiter>();\n let closed = false;\n let current: CurrentHandoff | undefined;\n let revision = 0;\n\n const requireOpen = (): void => {\n if (closed) throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n };\n\n const archive = (state: \"expired\" | \"superseded\"): void => {\n if (current === undefined) return;\n history.unshift(summaryOf(current, state));\n history.length = Math.min(\n history.length,\n EXTERNAL_HANDOFF_LIMITS.maximumHistorySummaries,\n );\n current = undefined;\n };\n\n const sweep = (): void => {\n const monotonicNow = clock.monotonicNow();\n\n if (current !== undefined && monotonicNow >= current.expiresAtMonotonic) {\n archive(\"expired\");\n }\n\n for (const [requestId, record] of idempotency) {\n if (monotonicNow >= record.expiresAtMonotonic) idempotency.delete(requestId);\n }\n };\n\n const knownSummary = (cursor: string): ExternalHandoffSummary | undefined => {\n sweep();\n\n if (current?.snapshot.cursor === cursor) {\n return summaryOf(current, \"available\");\n }\n\n return history.find((summary) => summary.cursor === cursor);\n };\n\n const readCurrent = (cursor?: string): ExternalHandoffSnapshot => {\n requireOpen();\n sweep();\n\n if (current === undefined) {\n const prior = cursor === undefined ? undefined : knownSummary(cursor);\n throw new SpotPatchError(\n prior?.state === \"expired\"\n ? ERROR_CODES.HANDOFF_EXPIRED\n : cursor === undefined\n ? ERROR_CODES.HANDOFF_NOT_FOUND\n : ERROR_CODES.HANDOFF_CURSOR_INVALID,\n );\n }\n\n if (cursor !== undefined && cursor !== current.snapshot.cursor) {\n const prior = knownSummary(cursor);\n throw new SpotPatchError(\n prior?.state === \"expired\"\n ? ERROR_CODES.HANDOFF_EXPIRED\n : ERROR_CODES.HANDOFF_CURSOR_INVALID,\n );\n }\n\n return current.snapshot;\n };\n\n const findReplay = (\n requestId: string,\n fingerprint: string,\n ): ExternalHandoffPublishResult | undefined => {\n requireOpen();\n sweep();\n const record = idempotency.get(requestId);\n\n if (record === undefined) return undefined;\n if (record.fingerprint !== fingerprint) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_VALIDATION_FAILED);\n }\n\n return replayResult(record);\n };\n\n const settleWaiters = (result: BridgeWaitResult): void => {\n const pending = [...waiters];\n waiters.clear();\n\n for (const waiter of pending) waiter.resolve(result);\n };\n\n return Object.freeze({\n activeWaitCount: () => waiters.size,\n\n replay: findReplay,\n\n publish(input: PublishExternalHandoffInput) {\n requireOpen();\n const replayed = findReplay(input.requestId, input.fingerprint);\n if (replayed !== undefined) return replayed;\n if (idempotency.size >= EXTERNAL_HANDOFF_LIMITS.maximumRequestIdRecords) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE);\n }\n\n const nextRevision = revision + 1;\n const publishedAtMs = clock.wallNow();\n const publishedAtMonotonic = clock.monotonicNow();\n const snapshot = Object.freeze({\n schemaVersion: EXTERNAL_HANDOFF_SNAPSHOT_SCHEMA_VERSION,\n cursor: randomId(),\n session: Object.freeze({ id: options.sessionId, framework: options.framework }),\n revision: nextRevision,\n publishedAt: new Date(publishedAtMs).toISOString(),\n expiresAt: new Date(\n publishedAtMs + EXTERNAL_HANDOFF_LIMITS.handoffTtlMs,\n ).toISOString(),\n annotation: input.annotation,\n }) satisfies ExternalHandoffSnapshot;\n\n if (\n Buffer.byteLength(JSON.stringify(snapshot), \"utf8\") >\n EXTERNAL_HANDOFF_LIMITS.maximumSnapshotBytes\n ) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE);\n }\n\n const delivery = input.reserve(snapshot.cursor, nextRevision);\n\n if (current !== undefined) archive(\"superseded\");\n revision = nextRevision;\n current = {\n expiresAtMonotonic: publishedAtMonotonic + EXTERNAL_HANDOFF_LIMITS.handoffTtlMs,\n receipts: new Set<string>(),\n snapshot,\n };\n const result = Object.freeze({\n handoff: summaryOf(current, \"available\"),\n delivery,\n replayed: false,\n }) satisfies ExternalHandoffPublishResult;\n idempotency.set(\n input.requestId,\n Object.freeze({\n expiresAtMonotonic:\n publishedAtMonotonic + EXTERNAL_HANDOFF_LIMITS.requestIdTtlMs,\n fingerprint: input.fingerprint,\n result,\n }),\n );\n settleWaiters(Object.freeze({ outcome: \"handoff\", snapshot }));\n return result;\n },\n\n current: readCurrent,\n\n currentCursor() {\n requireOpen();\n sweep();\n return current?.snapshot.cursor ?? null;\n },\n\n status(cursor?: string) {\n requireOpen();\n sweep();\n\n if (cursor === undefined) {\n if (current === undefined) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_NOT_FOUND);\n }\n return summaryOf(current, \"available\");\n }\n\n const summary = knownSummary(cursor);\n if (summary === undefined) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_CURSOR_INVALID);\n }\n return summary;\n },\n\n ack(cursor: string, connectorInstanceId: string) {\n const snapshot = readCurrent(cursor);\n\n if (snapshot !== current?.snapshot) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_CURSOR_INVALID);\n }\n if (!current.receipts.has(connectorInstanceId)) {\n if (current.receipts.size >= EXTERNAL_HANDOFF_LIMITS.maximumConnectorReceipts) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_BUSY);\n }\n current.receipts.add(connectorInstanceId);\n current.pickedUpAt = new Date(clock.wallNow()).toISOString();\n }\n\n return summaryOf(current, \"available\");\n },\n\n async wait(\n afterCursor: string | undefined,\n timeoutMs: number,\n signal: AbortSignal,\n ) {\n requireOpen();\n sweep();\n\n if (afterCursor === undefined && current !== undefined) {\n return Object.freeze({ outcome: \"handoff\", snapshot: current.snapshot });\n }\n if (afterCursor !== undefined) {\n const known = knownSummary(afterCursor);\n if (known === undefined) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_CURSOR_INVALID);\n }\n if (current !== undefined && current.snapshot.cursor !== afterCursor) {\n return Object.freeze({ outcome: \"handoff\", snapshot: current.snapshot });\n }\n }\n if (waiters.size >= EXTERNAL_HANDOFF_LIMITS.maximumWaiters) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_BUSY);\n }\n if (signal.aborted) throw new SpotPatchError(ERROR_CODES.SESSION_CLOSED);\n\n return new Promise<BridgeWaitResult>((resolve, reject) => {\n let settled = false;\n const finish = (): boolean => {\n if (settled) return false;\n settled = true;\n waiters.delete(waiter);\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", abort);\n return true;\n };\n const waiter: HandoffWaiter = {\n reject(error) {\n if (finish()) reject(error);\n },\n resolve(result) {\n if (finish()) resolve(result);\n },\n };\n const abort = (): void => {\n waiter.reject(new SpotPatchError(ERROR_CODES.SESSION_CLOSED));\n };\n const timer = setTimeout(() => {\n waiter.resolve(Object.freeze({ outcome: \"timeout\" }));\n }, timeoutMs);\n timer.unref();\n signal.addEventListener(\"abort\", abort, { once: true });\n waiters.add(waiter);\n });\n },\n\n close() {\n if (closed) return;\n closed = true;\n current = undefined;\n history.length = 0;\n idempotency.clear();\n const pending = [...waiters];\n waiters.clear();\n\n for (const waiter of pending) {\n waiter.reject(new SpotPatchError(ERROR_CODES.SESSION_CLOSED));\n }\n },\n });\n}\n","import type { ResolvedSpotPatchOptions, 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\nexport function resolveCredentialEnvironment(\n options: ResolvedSpotPatchOptions,\n environment: Readonly<Record<string, string | undefined>>,\n): Readonly<Record<string, string>> {\n if (options.ai === false) {\n return Object.freeze({});\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 = environment[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 return Object.freeze(\n Object.fromEntries(\n [...names].map((name) => {\n const value = environment[name];\n\n if (value === undefined) {\n throw new RangeError(\"SpotPatch AI credential resolution failed.\");\n }\n\n return [name, value];\n }),\n ),\n );\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 { randomBytes } from \"node:crypto\";\nimport {\n access,\n lstat,\n mkdir,\n readFile,\n realpath,\n rename,\n stat,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface IntegrationFileChange {\n readonly absolutePath: string;\n readonly nextContent: string;\n readonly previousContent?: string;\n readonly relativePath: string;\n}\n\nexport interface IntegrationPlan {\n readonly appRoot: string;\n readonly changes: readonly IntegrationFileChange[];\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nfunction isPathWithin(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n\n return (\n relative === \"\" ||\n (relative !== \"..\" &&\n !relative.startsWith(`..${path.sep}`) &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction relativePathWithin(root: string, target: string): string {\n const relative = path.relative(root, target);\n\n if (relative.length === 0 || !isPathWithin(root, target)) {\n throw new Error(\"SpotPatch init refuses to modify a path outside the app root.\");\n }\n\n return relative.split(path.sep).join(\"/\");\n}\n\nexport async function integrationPathExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readIntegrationFile(absolutePath: string): Promise<string> {\n const metadata = await lstat(absolutePath);\n\n if (!metadata.isFile() || metadata.isSymbolicLink()) {\n throw new Error(\n `SpotPatch refuses to modify the non-regular file ${path.basename(absolutePath)}.`,\n );\n }\n\n return readFile(absolutePath, \"utf8\");\n}\n\nexport function createIntegrationFileChange(\n appRoot: string,\n absolutePath: string,\n nextContent: string,\n previousContent: string | undefined,\n): IntegrationFileChange | undefined {\n if (previousContent === nextContent) {\n return undefined;\n }\n\n const root = path.resolve(appRoot);\n const target = path.resolve(absolutePath);\n\n return Object.freeze({\n absolutePath: target,\n nextContent,\n ...(previousContent === undefined ? {} : { previousContent }),\n relativePath: relativePathWithin(root, target),\n });\n}\n\nfunction temporaryPath(absolutePath: string, label: string): string {\n return path.join(\n path.dirname(absolutePath),\n `.${path.basename(absolutePath)}.spotpatch-${label}-${String(process.pid)}-${randomBytes(8).toString(\"hex\")}`,\n );\n}\n\nasync function writeAtomic(\n absolutePath: string,\n content: string,\n mode: number,\n): Promise<void> {\n await mkdir(path.dirname(absolutePath), { recursive: true });\n const stagedPath = temporaryPath(absolutePath, \"stage\");\n\n try {\n await writeFile(stagedPath, content, { encoding: \"utf8\", flag: \"wx\", mode });\n await rename(stagedPath, absolutePath);\n } catch (error: unknown) {\n await unlink(stagedPath).catch(() => undefined);\n throw error;\n }\n}\n\nasync function rollbackChange(change: IntegrationFileChange): Promise<void> {\n const currentContent = await readIntegrationFile(change.absolutePath);\n\n if (currentContent !== change.nextContent) {\n throw new Error(\n `SpotPatch init cannot restore ${change.relativePath} because it changed during initialization.`,\n );\n }\n\n if (change.previousContent === undefined) {\n await unlink(change.absolutePath);\n return;\n }\n\n const mode = (await stat(change.absolutePath)).mode & 0o777;\n await writeAtomic(change.absolutePath, change.previousContent, mode);\n}\n\nasync function assertSafeTarget(\n appRoot: string,\n realAppRoot: string,\n change: IntegrationFileChange,\n): Promise<void> {\n const target = path.resolve(change.absolutePath);\n const relativePath = relativePathWithin(appRoot, target);\n\n if (\n target !== change.absolutePath ||\n relativePath !== change.relativePath ||\n path.dirname(target) === target\n ) {\n throw new Error(\"SpotPatch init received an invalid integration file plan.\");\n }\n\n let targetMetadata;\n\n try {\n targetMetadata = await lstat(target);\n } catch (error: unknown) {\n if (!isMissingPathError(error)) {\n throw error;\n }\n }\n\n if (targetMetadata?.isSymbolicLink()) {\n throw new Error(\n `SpotPatch refuses to modify the symbolic link ${change.relativePath}.`,\n );\n }\n\n const containmentAnchor = await realpath(\n targetMetadata === undefined ? path.dirname(target) : target,\n );\n\n if (!isPathWithin(realAppRoot, containmentAnchor)) {\n throw new Error(\"SpotPatch init refuses to modify a path outside the app root.\");\n }\n}\n\nasync function assertCurrentBaseline(change: IntegrationFileChange): Promise<void> {\n if (change.previousContent === undefined) {\n try {\n await lstat(change.absolutePath);\n } catch (error: unknown) {\n if (isMissingPathError(error)) {\n return;\n }\n\n throw error;\n }\n\n throw new Error(\n `SpotPatch init cannot create ${change.relativePath} because it now exists.`,\n );\n }\n\n const currentContent = await readIntegrationFile(change.absolutePath);\n\n if (currentContent !== change.previousContent) {\n throw new Error(\n `SpotPatch init cannot update ${change.relativePath} because it changed after the preview.`,\n );\n }\n}\n\nexport async function applyIntegrationPlan(plan: IntegrationPlan): Promise<void> {\n if (plan.changes.length === 0) {\n return;\n }\n\n const appRoot = path.resolve(plan.appRoot);\n const realAppRoot = await realpath(appRoot);\n const targets = new Set<string>();\n\n for (const change of plan.changes) {\n if (targets.has(change.absolutePath)) {\n throw new Error(\"SpotPatch init received duplicate integration file changes.\");\n }\n\n targets.add(change.absolutePath);\n await assertSafeTarget(appRoot, realAppRoot, change);\n await assertCurrentBaseline(change);\n }\n\n const applied: IntegrationFileChange[] = [];\n\n try {\n for (const change of plan.changes) {\n await assertCurrentBaseline(change);\n const mode =\n change.previousContent === undefined\n ? 0o600\n : (await stat(change.absolutePath)).mode & 0o777;\n await writeAtomic(change.absolutePath, change.nextContent, mode);\n applied.push(change);\n }\n } catch (error: unknown) {\n const rollbackResults = await Promise.allSettled(\n applied.reverse().map(rollbackChange),\n );\n\n if (rollbackResults.some((result) => result.status === \"rejected\")) {\n throw new Error(\n \"SpotPatch init failed and could not completely restore the previous files.\",\n { cause: error },\n );\n }\n\n throw new Error(\"SpotPatch init failed; all written files were restored.\", {\n cause: error,\n });\n }\n}\n","import {\n AGENT_APPLY_MODES,\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 contextualAskOptionsSchema,\n CONTEXTUAL_ASK_LIMITS,\n type ContextualAskExecutorPreference,\n type ContextualAskOptions,\n DEFAULT_DATA_FLOW_LIMITS,\n type DataFlowLimits,\n type RuntimeDataFlowConfig,\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 type { SourceFilterEntry } from \"@spotpatch/compiler\";\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 = SourceFilterEntry;\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 SpotPatchDataFlowOptions {\n readonly runtime?: \"dispatch\";\n}\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 /** Exposes the review/trusted-fast selector after a project check is resolved. */\n readonly trustedFastMode?: boolean;\n readonly allowLan?: boolean;\n readonly debug?: boolean;\n readonly locale?: SpotPatchLocalePreference;\n readonly maxTargets?: number;\n readonly ai?: SpotPatchAiOptions;\n readonly dataFlow?: false | SpotPatchDataFlowOptions;\n readonly externalAgent?: boolean;\n readonly contextualAsk?: ContextualAskOptions;\n}\n\nexport interface ResolvedContextualAskOptions {\n readonly enabled: boolean;\n readonly defaultExecutor?: ContextualAskExecutorPreference;\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 readonly dataFlow: ResolvedSpotPatchDataFlowOptions;\n readonly externalAgent: Readonly<{ enabled: boolean }>;\n readonly contextualAsk: ResolvedContextualAskOptions;\n}\n\nexport interface ResolvedSpotPatchDataFlowOptions {\n readonly enabled: boolean;\n readonly runtime: \"dispatch\";\n readonly limits: DataFlowLimits;\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[/\\\\].+\\.(?:js|jsx|ts|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 dataFlow: Object.freeze({\n enabled: false,\n runtime: \"dispatch\",\n limits: DEFAULT_DATA_FLOW_LIMITS,\n }),\n externalAgent: Object.freeze({ enabled: false }),\n contextualAsk: Object.freeze({ enabled: 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(AGENT_APPLY_MODES).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 (\n applyMode !== \"review\" &&\n !Object.values(checks).some((check) => check.required)\n ) {\n throw new RangeError(`SpotPatch AI ${applyMode} 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\nfunction resolveDataFlowOptions(\n options: false | SpotPatchDataFlowOptions | undefined,\n): ResolvedSpotPatchDataFlowOptions {\n if (options === undefined || options === false) {\n return DEFAULT_OPTIONS.dataFlow;\n }\n\n const candidate: unknown = options;\n if (typeof candidate !== \"object\" || candidate === null) {\n throw new RangeError(\"SpotPatch dataFlow configuration is invalid.\");\n }\n\n const runtime: unknown = options.runtime ?? \"dispatch\";\n if (runtime !== \"dispatch\") {\n throw new RangeError(\"SpotPatch dataFlow runtime mode is invalid.\");\n }\n\n return Object.freeze({\n enabled: true,\n runtime,\n limits: DEFAULT_DATA_FLOW_LIMITS,\n });\n}\n\nfunction resolveContextualAskOptions(\n value: ContextualAskOptions | undefined,\n ai: false | ResolvedAiOptions,\n): ResolvedContextualAskOptions {\n if (value === undefined || value === false) return DEFAULT_OPTIONS.contextualAsk;\n const parsed = contextualAskOptionsSchema.safeParse(value);\n if (!parsed.success) {\n throw new RangeError(\"SpotPatch contextualAsk configuration is invalid.\");\n }\n const configured = typeof parsed.data === \"boolean\" ? {} : parsed.data;\n const preference = configured.defaultExecutor;\n if (preference?.kind === \"configured-key\") {\n const provider =\n ai === false ? undefined : ai.providers[preference.providerProfileId];\n if (provider?.models[preference.modelProfileId] === undefined) {\n throw new RangeError(\n \"SpotPatch contextualAsk default Key executor must reference a configured AI model.\",\n );\n }\n }\n if (\n ai !== false &&\n Object.values(ai.providers).reduce(\n (total, provider) => total + Object.keys(provider.models).length,\n 0,\n ) >= CONTEXTUAL_ASK_LIMITS.maximumExecutors\n ) {\n throw new RangeError(\n \"SpotPatch contextualAsk configuration exceeds the executor limit.\",\n );\n }\n return Object.freeze({\n enabled: true,\n ...(preference === undefined\n ? {}\n : { defaultExecutor: Object.freeze({ ...preference }) }),\n });\n}\n\nexport function createRuntimeDataFlowConfig(\n options: ResolvedSpotPatchDataFlowOptions,\n): RuntimeDataFlowConfig {\n return Object.freeze({\n enabled: options.enabled,\n runtime: options.runtime,\n limits: Object.freeze({\n observationMaxEntries: options.limits.observationMaxEntries,\n observationMaxBytes: options.limits.observationMaxBytes,\n observationTtlMs: options.limits.observationTtlMs,\n reportMaxBytes: options.limits.reportMaxBytes,\n }),\n });\n}\n\nexport function resolveOptions(\n options: SpotPatchOptions = {},\n environmentAi?: false | SimpleAiOptions,\n): ResolvedSpotPatchOptions {\n if (\n options.trustedFastMode !== undefined &&\n typeof options.trustedFastMode !== \"boolean\"\n ) {\n throw new RangeError(\"SpotPatch trustedFastMode must be a boolean.\");\n }\n\n if (\n options.externalAgent !== undefined &&\n typeof options.externalAgent !== \"boolean\"\n ) {\n throw new RangeError(\"SpotPatch externalAgent must be a boolean.\");\n }\n\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 ai = resolveAiOptions(options.ai ?? environmentAi);\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,\n dataFlow: resolveDataFlowOptions(options.dataFlow),\n externalAgent: Object.freeze({\n enabled: options.externalAgent ?? DEFAULT_OPTIONS.externalAgent.enabled,\n }),\n contextualAsk: resolveContextualAskOptions(options.contextualAsk, ai),\n } satisfies ResolvedSpotPatchOptions;\n\n if (\n resolved.shortcut.trim().length === 0 ||\n resolved.shortcut.length > 128 ||\n resolved.shortcut.includes(\"\\0\")\n ) {\n throw new RangeError(\"SpotPatch shortcut is invalid.\");\n }\n\n return Object.freeze(resolved);\n}\n","import { execFile } from \"node:child_process\";\nimport { access, lstat, readFile, realpath } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport {\n DEFAULT_AGENT_LIMITS,\n type AgentLimits,\n type ResolvedAgentCheckDefinition,\n type ResolvedAiOptions,\n} from \"@spotpatch/shared\";\n\nconst execFileAsync = promisify(execFile);\nconst TYPESCRIPT_CHECK_ID = \"spotpatch-typecheck\";\nconst TYPESCRIPT_CHECK_LABEL = \"TypeScript\";\n\ninterface ProjectManifest {\n readonly dependencies?: Readonly<Record<string, unknown>>;\n readonly devDependencies?: Readonly<Record<string, unknown>>;\n readonly peerDependencies?: Readonly<Record<string, unknown>>;\n}\n\nexport interface DiscoverProjectValidationCheckOptions {\n readonly appRoot: string;\n readonly timeoutMs: number;\n}\n\nexport interface ResolveProjectValidationChecksOptions extends DiscoverProjectValidationCheckOptions {\n readonly checks: Readonly<Record<string, ResolvedAgentCheckDefinition>>;\n}\n\nexport interface ResolveManagedExecutionValidationOptions {\n readonly ai: false | ResolvedAiOptions;\n readonly appRoot: string;\n}\n\nexport interface ResolvedManagedExecutionValidation {\n readonly checks: Readonly<Record<string, ResolvedAgentCheckDefinition>>;\n readonly limits: Readonly<AgentLimits>;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nasync function isRegularFile(absolutePath: string): Promise<boolean> {\n try {\n const metadata = await lstat(absolutePath);\n return metadata.isFile() && !metadata.isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nasync function readManifest(appRoot: string): Promise<ProjectManifest | undefined> {\n const manifestPath = path.join(appRoot, \"package.json\");\n\n if (!(await isRegularFile(manifestPath))) {\n return undefined;\n }\n\n try {\n const value = JSON.parse(await readFile(manifestPath, \"utf8\")) as unknown;\n return isRecord(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction declaresTypeScript(manifest: ProjectManifest): boolean {\n return [\n manifest.dependencies,\n manifest.devDependencies,\n manifest.peerDependencies,\n ].some(\n (dependencies) =>\n isRecord(dependencies) && typeof dependencies.typescript === \"string\",\n );\n}\n\nasync function findGitRoot(appRoot: string): Promise<string | undefined> {\n try {\n const result = await execFileAsync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd: appRoot,\n encoding: \"utf8\",\n timeout: 5_000,\n windowsHide: true,\n });\n const root = await realpath(result.stdout.trim());\n const relative = path.relative(root, appRoot);\n\n if (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n ) {\n return root;\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n\nasync function resolveTypeScriptCli(appRoot: string): Promise<string | undefined> {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n\n try {\n const packagePath = resolveFromApplication.resolve(\"typescript/package.json\");\n const cliPath = path.join(path.dirname(packagePath), \"bin\", \"tsc\");\n await access(cliPath);\n return await realpath(cliPath);\n } catch {\n return undefined;\n }\n}\n\nfunction portableRelativePath(from: string, to: string): string {\n return path.relative(from, to).split(path.sep).join(\"/\");\n}\n\nfunction hasRequiredCheck(\n checks: Readonly<Record<string, ResolvedAgentCheckDefinition>>,\n): boolean {\n return Object.values(checks).some((check) => check.required);\n}\n\nfunction availableCheckId(\n checks: Readonly<Record<string, ResolvedAgentCheckDefinition>>,\n preferred: string,\n): string {\n if (checks[preferred] === undefined) return preferred;\n\n let suffix = 2;\n while (checks[`${preferred}-${String(suffix)}`] !== undefined) suffix += 1;\n return `${preferred}-${String(suffix)}`;\n}\n\nexport async function discoverProjectValidationCheck(\n options: DiscoverProjectValidationCheckOptions,\n): Promise<ResolvedAgentCheckDefinition | undefined> {\n const appRoot = await realpath(options.appRoot);\n const tsconfigPath = path.join(appRoot, \"tsconfig.json\");\n const [manifest, projectRoot, hasTsconfig] = await Promise.all([\n readManifest(appRoot),\n findGitRoot(appRoot),\n isRegularFile(tsconfigPath),\n ]);\n\n if (\n manifest === undefined ||\n projectRoot === undefined ||\n !hasTsconfig ||\n !declaresTypeScript(manifest)\n ) {\n return undefined;\n }\n\n const cliPath = await resolveTypeScriptCli(appRoot);\n\n if (cliPath === undefined) {\n return undefined;\n }\n\n const projectPath = portableRelativePath(projectRoot, tsconfigPath);\n\n if (projectPath.length === 0 || projectPath.startsWith(\"../\")) {\n return undefined;\n }\n\n return Object.freeze({\n id: TYPESCRIPT_CHECK_ID,\n label: TYPESCRIPT_CHECK_LABEL,\n command: process.execPath,\n args: Object.freeze([\n cliPath,\n \"--noEmit\",\n \"--pretty\",\n \"false\",\n \"--incremental\",\n \"false\",\n \"--project\",\n projectPath,\n ]),\n required: true,\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport async function resolveProjectValidationChecks(\n options: ResolveProjectValidationChecksOptions,\n): Promise<Readonly<Record<string, ResolvedAgentCheckDefinition>>> {\n if (hasRequiredCheck(options.checks)) return options.checks;\n\n const discovered = await discoverProjectValidationCheck(options);\n if (discovered === undefined) return options.checks;\n\n const id = availableCheckId(options.checks, discovered.id);\n return Object.freeze({\n ...options.checks,\n [id]: Object.freeze({ ...discovered, id }),\n });\n}\n\nexport async function resolveManagedExecutionValidation(\n options: ResolveManagedExecutionValidationOptions,\n): Promise<ResolvedManagedExecutionValidation> {\n const checks = options.ai === false ? Object.freeze({}) : options.ai.execution.checks;\n const limits =\n options.ai === false ? DEFAULT_AGENT_LIMITS : options.ai.execution.limits;\n\n return Object.freeze({\n checks: await resolveProjectValidationChecks({\n appRoot: options.appRoot,\n checks,\n timeoutMs: limits.checkTimeoutMs,\n }),\n limits,\n });\n}\n","import {\n resolveOptions,\n type ResolvedSpotPatchOptions,\n type SimpleAiOptions,\n type SpotPatchOptions,\n} from \"./options.js\";\nimport { resolveProjectValidationChecks } from \"./project-validation.js\";\n\nexport interface ResolveProjectOptionsInput {\n readonly appRoot: string;\n readonly environmentAi?: false | SimpleAiOptions;\n readonly options?: SpotPatchOptions;\n readonly resolveValidationChecks?: typeof resolveProjectValidationChecks;\n}\n\nexport async function resolveProjectOptions(\n input: ResolveProjectOptionsInput,\n): Promise<ResolvedSpotPatchOptions> {\n const userOptions = input.options ?? {};\n const resolved = resolveOptions(userOptions, input.environmentAi);\n\n if (!userOptions.trustedFastMode || resolved.ai === false) {\n return resolved;\n }\n\n if (resolved.ai.execution.applyMode === \"auto\") {\n throw new RangeError(\n \"SpotPatch trustedFastMode cannot be combined with applyMode auto.\",\n );\n }\n\n const checks = await (\n input.resolveValidationChecks ?? resolveProjectValidationChecks\n )({\n appRoot: input.appRoot,\n checks: resolved.ai.execution.checks,\n timeoutMs: resolved.ai.execution.limits.checkTimeoutMs,\n });\n\n if (!Object.values(checks).some((check) => check.required)) {\n throw new RangeError(\n \"SpotPatch trustedFastMode requires a configured required check or an available framework-compatible local project check.\",\n );\n }\n\n const ai = Object.freeze({\n ...resolved.ai,\n execution: Object.freeze({\n ...resolved.ai.execution,\n applyMode: \"trusted-auto\" as const,\n checks,\n }),\n });\n\n return Object.freeze({ ...resolved, ai });\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 registerDataFlowComponents(\n absolutePath: string,\n sourceVersion: string,\n components: readonly DataFlowComponentAnchorInput[],\n ): string;\n resolve(fileId: string): string | undefined;\n findRegisteredId(absolutePath: string): string | undefined;\n resolveDataFlowComponent(\n componentSourceId: string,\n ): DataFlowComponentAnchor | undefined;\n clear(): void;\n}\n\nexport interface DataFlowComponentAnchorInput {\n readonly componentSourceId: string;\n readonly line: number;\n readonly column: number;\n}\n\nexport interface DataFlowComponentAnchor extends DataFlowComponentAnchorInput {\n readonly fileId: string;\n readonly sourceVersion: string;\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 const componentAnchors = new Map<string, DataFlowComponentAnchor>();\n const componentIdsByPath = new Map<string, Set<string>>();\n\n function registerSourcePath(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 while (idToPath.has(fileId)) fileId = createId();\n pathToId.set(normalizedPath, fileId);\n idToPath.set(fileId, normalizedPath);\n return fileId;\n }\n\n return Object.freeze({\n register(absolutePath: string): string {\n return registerSourcePath(absolutePath);\n },\n\n registerDataFlowComponents(\n absolutePath: string,\n sourceVersion: string,\n components: readonly DataFlowComponentAnchorInput[],\n ): string {\n const normalizedPath = normalizeAbsolutePath(absolutePath);\n const previousIds = componentIdsByPath.get(normalizedPath);\n for (const componentSourceId of previousIds ?? []) {\n componentAnchors.delete(componentSourceId);\n }\n\n const fileId = registerSourcePath(normalizedPath);\n const currentIds = new Set<string>();\n for (const component of components) {\n currentIds.add(component.componentSourceId);\n componentAnchors.set(\n component.componentSourceId,\n Object.freeze({ ...component, fileId, sourceVersion }),\n );\n }\n componentIdsByPath.set(normalizedPath, currentIds);\n return fileId;\n },\n\n resolve(fileId: string): string | undefined {\n return idToPath.get(fileId);\n },\n\n findRegisteredId(absolutePath: string): string | undefined {\n return pathToId.get(normalizeAbsolutePath(absolutePath));\n },\n\n resolveDataFlowComponent(\n componentSourceId: string,\n ): DataFlowComponentAnchor | undefined {\n return componentAnchors.get(componentSourceId);\n },\n\n clear(): void {\n pathToId.clear();\n idToPath.clear();\n componentAnchors.clear();\n componentIdsByPath.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 { createHash, randomBytes } from \"node:crypto\";\n\nimport type {\n AskSourceGrantEntry,\n ContextualAskExecutor,\n ContextualAskReadSnapshot,\n} from \"@spotpatch/agent\";\nimport {\n askAnswerDraftSchema,\n askAnswerResultSchema,\n askJobCreateRequestSchema,\n askJobEventSchema,\n askJobResultResponseSchema,\n askJobSnapshotSchema,\n contextualAskCapabilitySchema,\n contextualAskExecutorCapabilitySchema,\n CONTEXTUAL_ASK_LIMITS,\n CONTEXTUAL_ASK_SCHEMA_VERSION,\n type AskAnswerBlock,\n type AskAnswerDraft,\n type AskAnswerResult,\n type AskAnswerWarning,\n type AskJobCreateRequest,\n type AskJobEvent,\n type AskJobResultResponse,\n type AskJobSnapshot,\n type AskJobStatus,\n type ContextualAskCapability,\n type ContextualAskErrorCode,\n type ContextualAskExecutorCapability,\n} from \"@spotpatch/shared\";\n\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport type {\n WorkspaceActivityCoordinator,\n WorkspaceActivityLease,\n} from \"../workspace/activity-coordinator.js\";\nimport { ContextualAskError, asContextualAskError } from \"./error.js\";\nimport {\n captureAskReadSnapshot,\n type CapturedAskReadSnapshot,\n type CaptureAskReadSnapshotOptions,\n} from \"./read-snapshot.js\";\n\nconst ACTIVE_STATUSES = new Set<AskJobStatus>([\n \"queued\",\n \"authorizing\",\n \"running\",\n \"cancelling\",\n]);\nconst TERMINAL_STATUSES = new Set<AskJobStatus>([\"answered\", \"cancelled\", \"failed\"]);\n\nexport type ContextualAskJobEventListener = (event: AskJobEvent) => void;\n\ninterface InternalAskJob {\n readonly controller: AbortController;\n readonly createdAt: string;\n readonly events: AskJobEvent[];\n readonly executor: ContextualAskExecutor;\n executorCapability: ContextualAskExecutorCapability;\n readonly fingerprint: string;\n readonly id: string;\n readonly lease: WorkspaceActivityLease;\n readonly listeners: Set<ContextualAskJobEventListener>;\n readonly request: AskJobCreateRequest;\n errorCode: ContextualAskErrorCode | undefined;\n expiresAt: number | undefined;\n phaseMessage: string | undefined;\n result: AskAnswerResult | undefined;\n runPromise: Promise<void> | undefined;\n sequence: number;\n snapshot: CapturedAskReadSnapshot | undefined;\n status: AskJobStatus;\n updatedAt: string;\n}\n\nexport interface ContextualAskManager {\n cancel(jobId: string): AskJobSnapshot;\n capability(signal: AbortSignal): Promise<ContextualAskCapability>;\n close(): Promise<void>;\n create(request: AskJobCreateRequest): Promise<AskJobSnapshot>;\n events(jobId: string, afterSequence?: number): readonly AskJobEvent[];\n result(jobId: string): Promise<AskJobResultResponse>;\n snapshot(jobId: string): AskJobSnapshot;\n subscribe(jobId: string, listener: ContextualAskJobEventListener): () => void;\n}\n\ninterface ContextualAskManagerDependencies {\n readonly captureSnapshot: typeof captureAskReadSnapshot;\n readonly createId: () => string;\n readonly now: () => Date;\n}\n\nexport interface CreateContextualAskManagerOptions {\n readonly resolveSourceImports?: CaptureAskReadSnapshotOptions[\"resolveSourceImports\"];\n readonly coordinator: WorkspaceActivityCoordinator;\n readonly enabled: boolean;\n readonly executors?: readonly ContextualAskExecutor[];\n readonly registry: SourceRegistry;\n readonly root: string;\n readonly dependencies?: Partial<ContextualAskManagerDependencies>;\n}\n\nconst DEFAULT_DEPENDENCIES: ContextualAskManagerDependencies = Object.freeze({\n captureSnapshot: captureAskReadSnapshot,\n createId: () => randomBytes(16).toString(\"base64url\"),\n now: () => new Date(),\n});\n\nfunction fingerprint(request: AskJobCreateRequest): string {\n return createHash(\"sha256\")\n .update(\n JSON.stringify({\n envelope: request.envelope,\n executorId: request.executorId,\n model: request.model,\n providerDataConsent: request.providerDataConsent,\n }),\n )\n .digest(\"hex\");\n}\n\nfunction fileCountBucket(count: number): \"one\" | \"few\" | \"many\" {\n if (count <= 1) return \"one\";\n if (count <= 5) return \"few\";\n return \"many\";\n}\n\nfunction raceWithAbort<T>(operation: Promise<T>, signal: AbortSignal): Promise<T> {\n const reason = (): Error =>\n signal.reason instanceof Error\n ? signal.reason\n : new ContextualAskError(\"ASK_CANCELLED\");\n if (signal.aborted) return Promise.reject(reason());\n return new Promise<T>((resolve, reject) => {\n const onAbort = (): void => {\n reject(reason());\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n operation.then(\n (value) => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (error: unknown) => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(\n error instanceof Error\n ? error\n : new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\", { cause: error }),\n );\n },\n );\n });\n}\n\nexport function createContextualAskManager(\n options: CreateContextualAskManagerOptions,\n): ContextualAskManager {\n const dependencies = Object.freeze({\n ...DEFAULT_DEPENDENCIES,\n ...options.dependencies,\n });\n const executors = new Map<string, ContextualAskExecutor>();\n for (const executor of options.executors ?? []) {\n if (executors.has(executor.executorId)) {\n throw new TypeError(\"Contextual Ask executor IDs must be unique.\");\n }\n executors.set(executor.executorId, executor);\n }\n const jobs = new Map<string, InternalAskJob>();\n const requests = new Map<string, Readonly<{ fingerprint: string; jobId: string }>>();\n const pendingRequests = new Map<\n string,\n Readonly<{\n controller: AbortController;\n fingerprint: string;\n promise: Promise<AskJobSnapshot>;\n }>\n >();\n let closed = false;\n const isClosed = (): boolean => closed;\n\n const cleanupExpired = (): void => {\n const now = dependencies.now().getTime();\n for (const [jobId, job] of jobs) {\n if (job.expiresAt !== undefined && now >= job.expiresAt) {\n job.snapshot?.dispose();\n jobs.delete(jobId);\n const request = requests.get(job.request.requestId);\n if (request?.jobId === jobId) requests.delete(job.request.requestId);\n }\n }\n };\n\n const requireJob = (jobId: string): InternalAskJob => {\n cleanupExpired();\n const job = jobs.get(jobId);\n if (job === undefined) throw new ContextualAskError(\"ASK_RESULT_EXPIRED\");\n return job;\n };\n\n const publicSnapshot = (job: InternalAskJob): AskJobSnapshot =>\n askJobSnapshotSchema.parse({\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n jobId: job.id,\n selectionId: job.request.envelope.selection.selectionId,\n status: job.status,\n executor: {\n executorId: job.executorCapability.executorId,\n kind: job.executorCapability.kind,\n label: job.executorCapability.label,\n modelLabel: job.executorCapability.effectiveModelLabel,\n },\n ...(job.phaseMessage === undefined ? {} : { phaseMessage: job.phaseMessage }),\n createdAt: job.createdAt,\n updatedAt: job.updatedAt,\n canCancel: [\"queued\", \"authorizing\", \"running\"].includes(job.status),\n ...(job.errorCode === undefined ? {} : { errorCode: job.errorCode }),\n });\n\n const appendEvent = (job: InternalAskJob, event: AskJobEvent): void => {\n job.events.push(askJobEventSchema.parse(event));\n if (job.events.length > CONTEXTUAL_ASK_LIMITS.maximumRetainedEvents) {\n job.events.splice(\n 0,\n job.events.length - CONTEXTUAL_ASK_LIMITS.maximumRetainedEvents,\n );\n }\n for (const listener of job.listeners) listener(event);\n };\n\n const eventBase = (job: InternalAskJob) => {\n job.sequence += 1;\n return {\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n sequence: job.sequence,\n jobId: job.id,\n status: job.status,\n timestamp: dependencies.now().toISOString(),\n } as const;\n };\n\n const emitSnapshot = (job: InternalAskJob): void => {\n appendEvent(job, {\n ...eventBase(job),\n type: \"snapshot\",\n snapshot: publicSnapshot(job),\n });\n };\n\n const emitPhase = (job: InternalAskJob, message: string): void => {\n appendEvent(job, { ...eventBase(job), type: \"phase\", message });\n };\n\n const emitReadActivity = (\n job: InternalAskJob,\n entry: AskSourceGrantEntry | undefined,\n state: \"started\" | \"succeeded\" | \"failed\",\n ): void => {\n appendEvent(job, {\n ...eventBase(job),\n type: \"read-activity\",\n activity:\n entry === undefined\n ? {\n kind: \"file-count\",\n bucket: fileCountBucket(job.snapshot?.grant.sources.length ?? 0),\n }\n : {\n kind: \"source\",\n sourceId: entry.fileId,\n relativePath: entry.relativePath,\n },\n state,\n });\n };\n\n const transition = (\n job: InternalAskJob,\n status: AskJobStatus,\n phaseMessage: string,\n errorCode?: ContextualAskErrorCode,\n ): void => {\n job.status = status;\n job.phaseMessage = phaseMessage;\n job.errorCode = errorCode;\n job.updatedAt = dependencies.now().toISOString();\n emitSnapshot(job);\n if (!TERMINAL_STATUSES.has(status)) emitPhase(job, phaseMessage);\n };\n\n const finish = (job: InternalAskJob): void => {\n job.expiresAt = dependencies.now().getTime() + CONTEXTUAL_ASK_LIMITS.resultTtlMs;\n job.lease.release();\n job.snapshot?.dispose();\n job.snapshot = undefined;\n };\n\n const fail = (job: InternalAskJob, error: unknown): void => {\n if (TERMINAL_STATUSES.has(job.status)) return;\n const normalized = asContextualAskError(error);\n const abortReason: unknown = job.controller.signal.reason;\n const cancelled =\n normalized.code === \"ASK_CANCELLED\" ||\n (abortReason instanceof ContextualAskError &&\n abortReason.code === \"ASK_CANCELLED\");\n transition(\n job,\n cancelled ? \"cancelled\" : \"failed\",\n cancelled ? \"Question cancelled.\" : \"Question failed.\",\n cancelled ? \"ASK_CANCELLED\" : normalized.code,\n );\n appendEvent(job, {\n ...eventBase(job),\n type: \"error\",\n errorCode: cancelled ? \"ASK_CANCELLED\" : normalized.code,\n });\n finish(job);\n };\n\n const instrumentSnapshot = (\n job: InternalAskJob,\n snapshot: ContextualAskReadSnapshot,\n onLimitExceeded: () => void,\n ): ContextualAskReadSnapshot => {\n const byHandle = new Map(\n snapshot.manifest().map((entry) => [entry.handleId, entry]),\n );\n let readOperations = 0;\n const beginOperation = (): void => {\n readOperations += 1;\n if (readOperations > CONTEXTUAL_ASK_LIMITS.maximumToolCalls) {\n onLimitExceeded();\n throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n }\n };\n return Object.freeze({\n manifest: () => snapshot.manifest(),\n read(\n handleId: string,\n range?: Readonly<{ startLine?: number; endLine?: number }>,\n ) {\n beginOperation();\n const entry = byHandle.get(handleId);\n if (job.status === \"running\") emitReadActivity(job, entry, \"started\");\n try {\n const result = snapshot.read(handleId, range);\n if (job.status === \"running\") emitReadActivity(job, entry, \"succeeded\");\n return result;\n } catch (error: unknown) {\n if (job.status === \"running\") emitReadActivity(job, entry, \"failed\");\n throw error;\n }\n },\n search(query: string) {\n beginOperation();\n if (job.status === \"running\") emitReadActivity(job, undefined, \"started\");\n try {\n const result = snapshot.search(query);\n if (job.status === \"running\") {\n emitReadActivity(job, undefined, \"succeeded\");\n }\n return result;\n } catch (error: unknown) {\n if (job.status === \"running\") emitReadActivity(job, undefined, \"failed\");\n throw error;\n }\n },\n });\n };\n\n const projectAnswer = async (\n job: InternalAskJob,\n draft: AskAnswerDraft,\n captured: CapturedAskReadSnapshot,\n ): Promise<AskAnswerResult> => {\n const sourceIds = new Map<string, string>();\n const sources = new Map<string, ReturnType<typeof captured.projectCitation>>();\n const projectCitations = (\n citations: readonly Readonly<{\n handleId: string;\n startLine: number;\n endLine: number;\n }>[],\n ): string[] =>\n citations.map((citation) => {\n const key = `${citation.handleId}:${String(citation.startLine)}:${String(citation.endLine)}`;\n let sourceId = sourceIds.get(key);\n if (sourceId === undefined) {\n sourceId = dependencies.createId();\n sourceIds.set(key, sourceId);\n sources.set(\n sourceId,\n captured.projectCitation(\n citation.handleId,\n citation.startLine,\n citation.endLine,\n ),\n );\n }\n return sourceId;\n });\n const blocks: AskAnswerBlock[] = draft.blocks.map((block): AskAnswerBlock => {\n if (block.kind === \"list\") {\n return {\n kind: \"list\",\n items: block.items.map((item) => ({\n text: item.text,\n sourceIds: projectCitations(item.citations),\n })),\n };\n }\n return Object.freeze({\n kind: block.kind,\n ...(block.kind === \"paragraph\" ? { text: block.text } : { code: block.code }),\n ...(block.kind === \"code\" && block.language !== undefined\n ? { language: block.language }\n : {}),\n sourceIds: projectCitations(block.citations),\n }) as AskAnswerBlock;\n });\n const warnings: AskAnswerWarning[] = [...draft.warnings];\n if (\n captured.grant.truncated &&\n !warnings.some((warning) => warning.code === \"source-truncated\")\n ) {\n warnings.push(Object.freeze({ code: \"source-truncated\" }));\n }\n if (\n (await captured.isStale()) &&\n !warnings.some((warning) => warning.code === \"source-stale\")\n ) {\n warnings.push(Object.freeze({ code: \"source-stale\" }));\n }\n const created = dependencies.now();\n return askAnswerResultSchema.parse({\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n jobId: job.id,\n selectionId: job.request.envelope.selection.selectionId,\n contextHash: captured.grant.contextHash,\n executor: {\n executorId: job.executorCapability.executorId,\n kind: job.executorCapability.kind,\n label: job.executorCapability.label,\n modelLabel: job.executorCapability.effectiveModelLabel,\n },\n blocks,\n sources: [...sources].map(([sourceId, source]) => ({\n sourceId,\n label: source.label,\n relativePath: source.relativePath,\n fileId: source.fileId,\n startLine: source.startLine,\n endLine: source.endLine,\n confidence: source.confidence,\n targetIds: source.targetIds,\n ...(source.sourceVersion === undefined\n ? {}\n : { sourceVersion: source.sourceVersion }),\n contentHash: source.contentHash,\n })),\n warnings,\n createdAt: created.toISOString(),\n expiresAt: new Date(\n created.getTime() + CONTEXTUAL_ASK_LIMITS.resultTtlMs,\n ).toISOString(),\n });\n };\n\n const run = async (job: InternalAskJob): Promise<void> => {\n const timeout = setTimeout(() => {\n job.controller.abort(new ContextualAskError(\"ASK_TIMEOUT\"));\n }, CONTEXTUAL_ASK_LIMITS.jobTimeoutMs);\n timeout.unref();\n try {\n transition(job, \"authorizing\", \"Authorizing selected sources.\");\n const captured = await dependencies.captureSnapshot({\n root: options.root,\n registry: options.registry,\n selection: job.request.envelope.selection,\n signal: job.controller.signal,\n createHandleId: dependencies.createId,\n ...(options.resolveSourceImports === undefined\n ? {}\n : { resolveSourceImports: options.resolveSourceImports }),\n });\n if (job.controller.signal.aborted) {\n captured.dispose();\n }\n job.controller.signal.throwIfAborted();\n job.snapshot = captured;\n transition(job, \"running\", \"Analyzing the authorized snapshot.\");\n emitReadActivity(job, undefined, \"succeeded\");\n const readLimit = { exceeded: false };\n const execution = await raceWithAbort(\n job.executor.execute(\n {\n jobId: job.id,\n ...(job.request.model === undefined ? {} : { model: job.request.model }),\n envelope: job.request.envelope,\n grant: captured.grant,\n snapshot: instrumentSnapshot(job, captured.snapshot, () => {\n readLimit.exceeded = true;\n }),\n },\n job.controller.signal,\n ),\n job.controller.signal,\n );\n const draft = askAnswerDraftSchema.parse(execution);\n const effectiveModelLabel = job.executor.effectiveModelLabel?.();\n if (effectiveModelLabel !== undefined) {\n job.executorCapability = contextualAskExecutorCapabilitySchema.parse({\n ...job.executorCapability,\n effectiveModelLabel,\n });\n }\n if (readLimit.exceeded) throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n job.controller.signal.throwIfAborted();\n const result = await projectAnswer(job, draft, captured);\n job.controller.signal.throwIfAborted();\n job.result = result;\n transition(job, \"answered\", \"Answer ready.\");\n appendEvent(job, { ...eventBase(job), type: \"answer-ready\" });\n finish(job);\n } catch (error: unknown) {\n fail(\n job,\n error instanceof Error && error.name === \"ZodError\"\n ? new ContextualAskError(\"ASK_ANSWER_INVALID\", { cause: error })\n : asContextualAskError(error),\n );\n } finally {\n clearTimeout(timeout);\n }\n };\n\n return Object.freeze({\n async capability(signal: AbortSignal): Promise<ContextualAskCapability> {\n if (!options.enabled || closed) {\n return contextualAskCapabilitySchema.parse({\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n enabled: false,\n executors: [],\n safety: {\n selectionRequired: true,\n singleTurn: true,\n writesAllowed: false,\n historyStored: false,\n },\n checkedAt: dependencies.now().toISOString(),\n });\n }\n const capabilities = (\n await Promise.all(\n [...executors.values()].map(async (executor) => {\n try {\n return contextualAskExecutorCapabilitySchema.parse(\n await raceWithAbort(executor.capability(signal), signal),\n );\n } catch {\n return undefined;\n }\n }),\n )\n ).filter((capability) => capability !== undefined);\n return contextualAskCapabilitySchema.parse({\n schemaVersion: CONTEXTUAL_ASK_SCHEMA_VERSION,\n enabled: true,\n executors: capabilities,\n safety: {\n selectionRequired: true,\n singleTurn: true,\n writesAllowed: false,\n historyStored: false,\n },\n checkedAt: dependencies.now().toISOString(),\n });\n },\n\n async create(rawRequest: AskJobCreateRequest): Promise<AskJobSnapshot> {\n cleanupExpired();\n if (!options.enabled || closed) throw new ContextualAskError(\"ASK_DISABLED\");\n const parsed = askJobCreateRequestSchema.safeParse(rawRequest);\n if (!parsed.success) throw new ContextualAskError(\"ASK_QUESTION_INVALID\");\n const request = parsed.data;\n const requestFingerprint = fingerprint(request);\n const previous = requests.get(request.requestId);\n if (previous !== undefined) {\n if (previous.fingerprint !== requestFingerprint) {\n throw new ContextualAskError(\"ASK_IDEMPOTENCY_CONFLICT\");\n }\n return publicSnapshot(requireJob(previous.jobId));\n }\n const pending = pendingRequests.get(request.requestId);\n if (pending !== undefined) {\n if (pending.fingerprint !== requestFingerprint) {\n throw new ContextualAskError(\"ASK_IDEMPOTENCY_CONFLICT\");\n }\n return await pending.promise;\n }\n if ([...jobs.values()].some((job) => ACTIVE_STATUSES.has(job.status))) {\n throw new ContextualAskError(\"ASK_BUSY\");\n }\n const executor = executors.get(request.executorId);\n if (executor === undefined)\n throw new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\");\n const lease = options.coordinator.acquire(\"ask\");\n if (lease === undefined) throw new ContextualAskError(\"ASK_BUSY\");\n const controller = new AbortController();\n let leaseTransferred = false;\n const creation = (async (): Promise<AskJobSnapshot> => {\n try {\n const capabilitySignal = AbortSignal.any([\n controller.signal,\n AbortSignal.timeout(CONTEXTUAL_ASK_LIMITS.capabilityTimeoutMs),\n ]);\n const capability = contextualAskExecutorCapabilitySchema.parse(\n await raceWithAbort(\n executor.capability(capabilitySignal),\n capabilitySignal,\n ),\n );\n if (isClosed()) throw new ContextualAskError(\"ASK_DISABLED\");\n if (\n request.model !== undefined &&\n !capability.models?.includes(request.model)\n ) {\n throw new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\");\n }\n if (\n capability.executorId !== executor.executorId ||\n capability.state !== \"ready\" ||\n !capability.readOnlyProven\n ) {\n throw new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\");\n }\n for (const [jobId, existing] of jobs) {\n if (TERMINAL_STATUSES.has(existing.status)) {\n existing.snapshot?.dispose();\n jobs.delete(jobId);\n requests.delete(existing.request.requestId);\n }\n }\n const createdAt = dependencies.now().toISOString();\n const job: InternalAskJob = {\n controller: new AbortController(),\n createdAt,\n events: [],\n executor,\n executorCapability:\n request.model === undefined\n ? capability\n : {\n ...capability,\n requestedModelLabel: request.model,\n effectiveModelLabel: request.model,\n },\n fingerprint: requestFingerprint,\n id: dependencies.createId(),\n lease,\n listeners: new Set(),\n request,\n errorCode: undefined,\n expiresAt: undefined,\n phaseMessage: \"Question queued.\",\n result: undefined,\n runPromise: undefined,\n sequence: 0,\n snapshot: undefined,\n status: \"queued\",\n updatedAt: createdAt,\n };\n jobs.set(job.id, job);\n requests.set(request.requestId, {\n fingerprint: requestFingerprint,\n jobId: job.id,\n });\n leaseTransferred = true;\n emitSnapshot(job);\n emitPhase(job, \"Question queued.\");\n job.runPromise = run(job);\n return publicSnapshot(job);\n } catch (error: unknown) {\n throw error instanceof ContextualAskError\n ? error\n : new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\", {\n cause: error,\n });\n } finally {\n if (!leaseTransferred) lease.release();\n pendingRequests.delete(request.requestId);\n }\n })();\n pendingRequests.set(request.requestId, {\n controller,\n fingerprint: requestFingerprint,\n promise: creation,\n });\n return await creation;\n },\n\n cancel(jobId: string): AskJobSnapshot {\n const job = requireJob(jobId);\n if (TERMINAL_STATUSES.has(job.status)) return publicSnapshot(job);\n if (job.status !== \"cancelling\") {\n transition(job, \"cancelling\", \"Cancelling question.\");\n job.controller.abort(new ContextualAskError(\"ASK_CANCELLED\"));\n job.snapshot?.dispose();\n job.snapshot = undefined;\n }\n return publicSnapshot(job);\n },\n\n events(jobId: string, afterSequence = 0): readonly AskJobEvent[] {\n if (!Number.isSafeInteger(afterSequence) || afterSequence < 0) {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n }\n return Object.freeze(\n requireJob(jobId).events.filter((event) => event.sequence > afterSequence),\n );\n },\n\n async result(jobId: string): Promise<AskJobResultResponse> {\n const job = requireJob(jobId);\n await job.runPromise;\n const current = requireJob(jobId);\n return askJobResultResponseSchema.parse({\n snapshot: publicSnapshot(current),\n ...(current.result === undefined ? {} : { result: current.result }),\n });\n },\n\n snapshot(jobId: string): AskJobSnapshot {\n return publicSnapshot(requireJob(jobId));\n },\n\n subscribe(jobId: string, listener: ContextualAskJobEventListener): () => void {\n const job = requireJob(jobId);\n if (job.listeners.size >= CONTEXTUAL_ASK_LIMITS.maximumEventSubscribers) {\n throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n }\n job.listeners.add(listener);\n return () => job.listeners.delete(listener);\n },\n\n async close(): Promise<void> {\n if (closed) return;\n closed = true;\n for (const pending of pendingRequests.values()) {\n pending.controller.abort(new ContextualAskError(\"ASK_CANCELLED\"));\n }\n await Promise.allSettled(\n [...pendingRequests.values()].map((pending) => pending.promise),\n );\n for (const job of jobs.values()) {\n if (ACTIVE_STATUSES.has(job.status)) {\n job.controller.abort(new ContextualAskError(\"ASK_CANCELLED\"));\n }\n }\n await Promise.allSettled(\n [...jobs.values()].map((job) => job.runPromise ?? Promise.resolve()),\n );\n for (const job of jobs.values()) {\n job.snapshot?.dispose();\n job.listeners.clear();\n job.lease.release();\n }\n jobs.clear();\n requests.clear();\n pendingRequests.clear();\n await Promise.allSettled(\n [...executors.values()].map(async (executor) => executor.dispose?.()),\n );\n },\n });\n}\n","import { ContextualAskExecutorError } from \"@spotpatch/agent\";\nimport type { ContextualAskErrorCode } from \"@spotpatch/shared\";\n\nexport class ContextualAskError extends Error {\n readonly code: ContextualAskErrorCode;\n\n constructor(\n code: ContextualAskErrorCode,\n options: Readonly<{ cause?: unknown }> = {},\n ) {\n super(code, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"ContextualAskError\";\n this.code = code;\n }\n}\n\nexport function asContextualAskError(error: unknown): ContextualAskError {\n if (error instanceof ContextualAskError) return error;\n if (error instanceof ContextualAskExecutorError) {\n return new ContextualAskError(error.code, { cause: error });\n }\n return new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\", { cause: error });\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { lstat, open, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type {\n AskSourceGrant,\n AskSourceGrantEntry,\n AskSourceReadResult,\n AskSourceSearchMatch,\n ContextualAskReadSnapshot,\n} from \"@spotpatch/agent\";\nimport {\n CONTEXTUAL_ASK_LIMITS,\n type AskSourceConfidence,\n type SpotSelectionContext,\n} from \"@spotpatch/shared\";\nimport { parseSync, Visitor } from \"oxc-parser\";\n\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { ContextualAskError } from \"./error.js\";\n\nconst SOURCE_EXTENSIONS = Object.freeze([\n \".astro\",\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".css\",\n \".scss\",\n \".sass\",\n \".less\",\n] as const);\nconst PROTECTED_DIRECTORIES = new Set([\n \".git\",\n \".ssh\",\n \".spotpatch\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n]);\nconst PROTECTED_FILES = new Set([\n \".gitmodules\",\n \".git-credentials\",\n \".netrc\",\n \".npmrc\",\n \".pnpmrc\",\n \".pypirc\",\n \".yarnrc\",\n \"bun.lock\",\n \"bun.lockb\",\n \"npm-shrinkwrap.json\",\n \"package-lock.json\",\n \"pnpm-lock.yaml\",\n \"yarn.lock\",\n]);\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\ninterface AuthorizedSeed {\n readonly absolutePath: string;\n readonly fileId: string;\n readonly confidence: AskSourceConfidence;\n readonly targetIds: readonly string[];\n readonly sourceVersion?: string;\n}\n\ninterface CapturedSource extends AskSourceGrantEntry {\n readonly absolutePath: string;\n readonly content: string;\n}\n\nexport interface CapturedAskReadSnapshot {\n readonly grant: AskSourceGrant;\n readonly snapshot: ContextualAskReadSnapshot;\n dispose(): void;\n isStale(): Promise<boolean>;\n projectCitation(\n handleId: string,\n startLine: number,\n endLine: number,\n ): AskSourceGrantEntry & Readonly<{ startLine: number; endLine: number }>;\n}\n\nexport interface CaptureAskReadSnapshotOptions {\n readonly resolveSourceImports?: (\n absolutePath: string,\n code: string,\n ) => readonly string[] | undefined;\n readonly root: string;\n readonly registry: SourceRegistry;\n readonly selection: SpotSelectionContext;\n readonly signal?: AbortSignal;\n readonly createHandleId?: () => string;\n}\n\nfunction deny(\n code: \"ASK_SELECTION_REQUIRED\" | \"ASK_SELECTION_STALE\" | \"ASK_SOURCE_SCOPE_DENIED\",\n): never {\n throw new ContextualAskError(code);\n}\n\nfunction toPosixRelative(realRoot: string, absolutePath: string): string {\n const relative = path.relative(realRoot, absolutePath);\n if (\n relative.length === 0 ||\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n const normalized = relative.split(path.sep).join(\"/\");\n const segments = normalized.toLowerCase().split(\"/\");\n const fileName = segments.at(-1) ?? \"\";\n if (\n segments.some((segment) => PROTECTED_DIRECTORIES.has(segment)) ||\n PROTECTED_FILES.has(fileName) ||\n fileName === \".env\" ||\n fileName === \".envrc\" ||\n fileName === \".dev.vars\" ||\n fileName.startsWith(\".env.\") ||\n fileName.endsWith(\".pem\") ||\n fileName.endsWith(\".key\") ||\n fileName.endsWith(\".p12\") ||\n fileName.endsWith(\".pfx\") ||\n fileName.startsWith(\"id_rsa\")\n ) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n return normalized;\n}\n\nasync function assertNoSymlinkPath(\n realRoot: string,\n absolutePath: string,\n): Promise<void> {\n const relative = toPosixRelative(realRoot, absolutePath);\n let current = realRoot;\n for (const segment of relative.split(\"/\")) {\n current = path.join(current, segment);\n const metadata = await lstat(current).catch(() => undefined);\n if (metadata === undefined || metadata.isSymbolicLink()) {\n deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n }\n}\n\nasync function readSecureSource(\n realRoot: string,\n absolutePath: string,\n): Promise<\n Readonly<{ content: string; contentHash: string; relativePath: string; size: number }>\n> {\n const normalizedAbsolute = path.normalize(path.resolve(absolutePath));\n const relativePath = toPosixRelative(realRoot, normalizedAbsolute);\n await assertNoSymlinkPath(realRoot, normalizedAbsolute);\n const canonical = await realpath(normalizedAbsolute).catch(() => undefined);\n if (canonical === undefined || canonical !== normalizedAbsolute) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n\n let handle: Awaited<ReturnType<typeof open>> | undefined;\n try {\n handle = await open(normalizedAbsolute, constants.O_RDONLY | constants.O_NOFOLLOW);\n const before = await handle.stat();\n if (!before.isFile() || before.nlink !== 1) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n if (before.size > CONTEXTUAL_ASK_LIMITS.maximumReadBytesPerFile) {\n throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n }\n const bytes = await handle.readFile();\n const after = await handle.stat();\n if (\n bytes.byteLength !== before.size ||\n before.dev !== after.dev ||\n before.ino !== after.ino ||\n before.size !== after.size ||\n before.mtimeMs !== after.mtimeMs ||\n bytes.includes(0)\n ) {\n return deny(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n let content: string;\n try {\n content = decoder.decode(bytes);\n } catch (error: unknown) {\n throw new ContextualAskError(\"ASK_SOURCE_SCOPE_DENIED\", { cause: error });\n }\n return Object.freeze({\n content,\n contentHash: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n relativePath,\n size: bytes.byteLength,\n });\n } finally {\n await handle?.close().catch(() => undefined);\n }\n}\n\nfunction confidence(value: string): AskSourceConfidence {\n return value === \"exact\" || value === \"probable\" ? value : \"approximate\";\n}\n\nasync function authorizeSeeds(\n selection: SpotSelectionContext,\n registry: SourceRegistry,\n root: string,\n realRoot: string,\n): Promise<AuthorizedSeed[]> {\n const byPath = new Map<string, AuthorizedSeed>();\n for (const target of selection.targets) {\n // The claimed path must describe the same location as the file id. The\n // React fiber source is where the component is rendered, which is usually\n // a different file from the selected host element.\n const location =\n target.react.source?.fileId === undefined ? target.source : target.react.source;\n let fileId = location.fileId;\n let claimedRelative = location.relativePath;\n let sourceVersion: string | undefined;\n if (target.react.componentSourceId !== undefined) {\n const anchor = registry.resolveDataFlowComponent(target.react.componentSourceId);\n if (anchor === undefined || target.react.sourceVersion !== anchor.sourceVersion) {\n deny(\"ASK_SELECTION_STALE\");\n }\n // The registry, not the browser, owns the component anchor's file.\n fileId = anchor.fileId;\n claimedRelative = undefined;\n sourceVersion = anchor.sourceVersion;\n }\n if (fileId === undefined) continue;\n const registered = registry.resolve(fileId);\n if (registered === undefined) deny(\"ASK_SELECTION_STALE\");\n const canonical = await realpath(registered).catch(() => undefined);\n if (canonical === undefined) deny(\"ASK_SELECTION_STALE\");\n const absolutePath = path.normalize(canonical);\n const registeredRelative = toPosixRelative(realRoot, absolutePath);\n if (\n claimedRelative !== undefined &&\n claimedRelative.split(\"\\\\\").join(\"/\") !== registeredRelative\n ) {\n deny(\"ASK_SELECTION_STALE\");\n }\n const existing = byPath.get(absolutePath);\n const targetIds = Object.freeze([\n ...(existing?.targetIds ?? []),\n ...(existing?.targetIds.includes(target.targetId) === true\n ? []\n : [target.targetId]),\n ]);\n byPath.set(\n absolutePath,\n Object.freeze({\n absolutePath,\n fileId,\n confidence: confidence(\n target.react.source?.confidence ?? target.source.confidence,\n ),\n targetIds,\n ...(sourceVersion === undefined ? {} : { sourceVersion }),\n }),\n );\n }\n for (const target of selection.targets) {\n for (const rule of target.styles.matchedRules) {\n const claimed = rule.source;\n if (\n claimed === undefined ||\n claimed.startsWith(\"/\") ||\n claimed.includes(\"\\\\\") ||\n claimed.includes(\"\\0\") ||\n claimed\n .split(\"/\")\n .some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")\n ) {\n continue;\n }\n const registeredPath = path.resolve(root, ...claimed.split(\"/\"));\n const fileId = registry.findRegisteredId(registeredPath);\n if (fileId === undefined) continue;\n const canonical = await realpath(registeredPath).catch(() => undefined);\n if (canonical === undefined) continue;\n const absolutePath = path.normalize(canonical);\n toPosixRelative(realRoot, absolutePath);\n const existing = byPath.get(absolutePath);\n const targetIds = Object.freeze([\n ...(existing?.targetIds ?? []),\n ...(existing?.targetIds.includes(target.targetId) === true\n ? []\n : [target.targetId]),\n ]);\n byPath.set(\n absolutePath,\n Object.freeze({\n absolutePath,\n fileId,\n confidence: existing?.confidence ?? \"probable\",\n targetIds,\n ...(existing?.sourceVersion === undefined\n ? {}\n : { sourceVersion: existing.sourceVersion }),\n }),\n );\n }\n }\n if (byPath.size === 0) deny(\"ASK_SELECTION_REQUIRED\");\n return [...byPath.values()];\n}\n\nfunction localSpecifiers(filePath: string, content: string): readonly string[] {\n const found = new Set<string>();\n if (/\\.(?:css|scss|sass|less)$/iu.test(filePath)) {\n const pattern = /@import\\s+(?:url\\(\\s*)?[\"']([^\"']+)[\"']/gu;\n for (const match of content.matchAll(pattern)) {\n if (match[1]?.startsWith(\".\")) found.add(match[1]);\n }\n return [...found].sort();\n }\n try {\n const parsed = parseSync(filePath, content, { sourceType: \"module\" });\n if (parsed.errors.length > 0) return [];\n const add = (value: unknown): void => {\n if (typeof value === \"string\" && value.startsWith(\".\")) found.add(value);\n };\n const visitor = new Visitor({\n ImportDeclaration(node) {\n add(node.source.value);\n },\n ExportNamedDeclaration(node) {\n add(node.source?.value);\n },\n ExportAllDeclaration(node) {\n add(node.source.value);\n },\n ImportExpression(node) {\n if (\"value\" in node.source) add(node.source.value);\n },\n });\n visitor.visit(parsed.program);\n } catch {\n return [];\n }\n return [...found].sort();\n}\n\nfunction importCandidates(importer: string, specifier: string): readonly string[] {\n const base = path.resolve(path.dirname(importer), specifier);\n if (path.extname(base) !== \"\") return Object.freeze([base]);\n return Object.freeze([\n ...SOURCE_EXTENSIONS.map((extension) => `${base}${extension}`),\n ...SOURCE_EXTENSIONS.map((extension) => path.join(base, `index${extension}`)),\n ]);\n}\n\nfunction countLines(content: string): number {\n return content.length === 0 ? 1 : content.split(\"\\n\").length;\n}\n\nfunction publicSourceEntry(source: CapturedSource): AskSourceGrantEntry {\n return Object.freeze({\n handleId: source.handleId,\n fileId: source.fileId,\n relativePath: source.relativePath,\n label: source.label,\n lineCount: source.lineCount,\n size: source.size,\n contentHash: source.contentHash,\n confidence: source.confidence,\n targetIds: source.targetIds,\n ...(source.sourceVersion === undefined\n ? {}\n : { sourceVersion: source.sourceVersion }),\n });\n}\n\nfunction assertSelectionEvidenceCurrent(\n selection: SpotSelectionContext,\n captured: readonly CapturedSource[],\n): void {\n for (const target of selection.targets) {\n if (target.code === undefined) continue;\n const source = captured.find(\n (candidate) => candidate.relativePath === target.code?.relativePath,\n );\n if (source === undefined) deny(\"ASK_SELECTION_STALE\");\n const lines = source.content.split(/\\r?\\n/u);\n if (target.code.endLine > lines.length) deny(\"ASK_SELECTION_STALE\");\n const currentExcerpt = lines\n .slice(target.code.startLine - 1, target.code.endLine)\n .join(\"\\n\");\n if (currentExcerpt !== target.code.excerpt) deny(\"ASK_SELECTION_STALE\");\n }\n}\n\nexport async function captureAskReadSnapshot(\n options: CaptureAskReadSnapshotOptions,\n): Promise<CapturedAskReadSnapshot> {\n options.signal?.throwIfAborted();\n const realRoot = await realpath(options.root).catch(() => undefined);\n if (realRoot === undefined) deny(\"ASK_SOURCE_SCOPE_DENIED\");\n const seeds = await authorizeSeeds(\n options.selection,\n options.registry,\n options.root,\n realRoot,\n );\n const createHandleId =\n options.createHandleId ?? (() => randomBytes(16).toString(\"base64url\"));\n const captured: CapturedSource[] = [];\n const capturedPaths = new Set<string>();\n const queue = [...seeds];\n let totalBytes = 0;\n let truncated = false;\n\n while (queue.length > 0) {\n options.signal?.throwIfAborted();\n const candidate = queue.shift();\n if (candidate === undefined || capturedPaths.has(candidate.absolutePath)) continue;\n if (captured.length >= CONTEXTUAL_ASK_LIMITS.maximumReadFiles) {\n truncated = true;\n break;\n }\n let read;\n try {\n read = await readSecureSource(realRoot, candidate.absolutePath);\n options.signal?.throwIfAborted();\n } catch (error: unknown) {\n if (captured.length < seeds.length) throw error;\n truncated = true;\n continue;\n }\n if (totalBytes + read.size > CONTEXTUAL_ASK_LIMITS.maximumReadBytesTotal) {\n if (captured.length < seeds.length)\n throw new ContextualAskError(\"ASK_LIMIT_EXCEEDED\");\n truncated = true;\n continue;\n }\n capturedPaths.add(candidate.absolutePath);\n totalBytes += read.size;\n const entry = Object.freeze({\n handleId: createHandleId(),\n fileId: candidate.fileId,\n relativePath: read.relativePath,\n label: path.basename(read.relativePath),\n lineCount: countLines(read.content),\n size: read.size,\n contentHash: read.contentHash,\n confidence: candidate.confidence,\n targetIds: Object.freeze([...candidate.targetIds]),\n ...(candidate.sourceVersion === undefined\n ? {}\n : { sourceVersion: candidate.sourceVersion }),\n absolutePath: candidate.absolutePath,\n content: read.content,\n } satisfies CapturedSource);\n captured.push(entry);\n\n const specifiers =\n options.resolveSourceImports?.(candidate.absolutePath, read.content) ??\n localSpecifiers(candidate.absolutePath, read.content);\n for (const specifier of specifiers.filter((value) => value.startsWith(\".\"))) {\n options.signal?.throwIfAborted();\n for (const importPath of importCandidates(candidate.absolutePath, specifier)) {\n if (capturedPaths.has(importPath)) continue;\n const metadata = await lstat(importPath).catch(() => undefined);\n if (metadata?.isFile() !== true || metadata.isSymbolicLink()) continue;\n const fileId =\n options.registry.findRegisteredId(importPath) ??\n options.registry.register(importPath);\n queue.push(\n Object.freeze({\n absolutePath: path.normalize(importPath),\n fileId,\n confidence: \"probable\" as const,\n targetIds: candidate.targetIds,\n }),\n );\n break;\n }\n }\n }\n\n assertSelectionEvidenceCurrent(options.selection, captured);\n\n const sourceByHandle = new Map(captured.map((source) => [source.handleId, source]));\n const publicEntries = Object.freeze(\n captured.map((source) => publicSourceEntry(source)),\n );\n const contextHash = createHash(\"sha256\")\n .update(\n JSON.stringify({\n selectionId: options.selection.selectionId,\n sources: publicEntries.map((source) => ({\n relativePath: source.relativePath,\n contentHash: source.contentHash,\n targetIds: source.targetIds,\n sourceVersion: source.sourceVersion ?? null,\n })),\n }),\n )\n .digest(\"hex\");\n let disposed = false;\n const requireSource = (handleId: string): CapturedSource => {\n if (disposed) throw new ContextualAskError(\"ASK_RESULT_EXPIRED\");\n const source = sourceByHandle.get(handleId);\n if (source === undefined) throw new ContextualAskError(\"ASK_SOURCE_SCOPE_DENIED\");\n return source;\n };\n const snapshot: ContextualAskReadSnapshot = Object.freeze({\n manifest: () => {\n if (disposed) throw new ContextualAskError(\"ASK_RESULT_EXPIRED\");\n return publicEntries;\n },\n read(\n handleId: string,\n range: Readonly<{ startLine?: number; endLine?: number }> = {},\n ): AskSourceReadResult {\n const source = requireSource(handleId);\n const startLine = range.startLine ?? 1;\n const endLine = range.endLine ?? source.lineCount;\n if (\n !Number.isSafeInteger(startLine) ||\n !Number.isSafeInteger(endLine) ||\n startLine < 1 ||\n endLine < startLine ||\n endLine > source.lineCount\n ) {\n throw new ContextualAskError(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n return Object.freeze({\n handleId,\n startLine,\n endLine,\n content: source.content\n .split(\"\\n\")\n .slice(startLine - 1, endLine)\n .join(\"\\n\"),\n });\n },\n search(query: string): readonly AskSourceSearchMatch[] {\n if (\n query.length === 0 ||\n query.length > CONTEXTUAL_ASK_LIMITS.maximumSearchQueryCharacters ||\n query.includes(\"\\0\")\n ) {\n throw new ContextualAskError(\"ASK_SOURCE_SCOPE_DENIED\");\n }\n const normalized = query.toLocaleLowerCase(\"en-US\");\n const matches: AskSourceSearchMatch[] = [];\n for (const source of captured) {\n for (const [index, line] of source.content.split(\"\\n\").entries()) {\n if (line.toLocaleLowerCase(\"en-US\").includes(normalized)) {\n matches.push(\n Object.freeze({\n handleId: source.handleId,\n line: index + 1,\n preview: line.slice(\n 0,\n CONTEXTUAL_ASK_LIMITS.maximumSearchPreviewCharacters,\n ),\n }),\n );\n if (matches.length >= CONTEXTUAL_ASK_LIMITS.maximumSearchResults) {\n return Object.freeze(matches);\n }\n }\n }\n }\n return Object.freeze(matches);\n },\n });\n\n return Object.freeze({\n grant: Object.freeze({ contextHash, truncated, sources: publicEntries }),\n snapshot,\n dispose(): void {\n disposed = true;\n sourceByHandle.clear();\n captured.splice(0, captured.length);\n },\n async isStale(): Promise<boolean> {\n for (const source of captured) {\n try {\n const current = await readSecureSource(realRoot, source.absolutePath);\n if (current.contentHash !== source.contentHash) return true;\n } catch {\n return true;\n }\n }\n return false;\n },\n projectCitation(handleId: string, startLine: number, endLine: number) {\n const source = requireSource(handleId);\n if (\n !Number.isSafeInteger(startLine) ||\n !Number.isSafeInteger(endLine) ||\n startLine < 1 ||\n endLine < startLine ||\n endLine > source.lineCount\n ) {\n throw new ContextualAskError(\"ASK_ANSWER_INVALID\");\n }\n return Object.freeze({ ...publicSourceEntry(source), startLine, endLine });\n },\n });\n}\n","import {\n createConfiguredKeyAskExecutor,\n resolveProviderCredential,\n type ContextualAskExecutor,\n} from \"@spotpatch/agent\";\nimport type {\n ContextualAskExecutorPreference,\n ResolvedAiOptions,\n} from \"@spotpatch/shared\";\n\nexport interface CreateConfiguredKeyAskExecutorsOptions {\n readonly ai: ResolvedAiOptions;\n readonly environment: Readonly<Record<string, string | undefined>>;\n readonly fetch?: typeof globalThis.fetch;\n readonly defaultExecutor?: ContextualAskExecutorPreference;\n}\n\n/** Builds one isolated read-only Ask executor per configured Provider/model pair. */\nexport function createConfiguredKeyAskExecutors(\n options: CreateConfiguredKeyAskExecutorsOptions,\n): readonly ContextualAskExecutor[] {\n const preferred =\n options.defaultExecutor?.kind === \"configured-key\"\n ? options.defaultExecutor\n : Object.freeze({\n kind: \"configured-key\" as const,\n providerProfileId: options.ai.defaultProvider,\n modelProfileId:\n options.ai.providers[options.ai.defaultProvider]?.defaultModel ?? \"\",\n });\n const providers = Object.values(options.ai.providers).sort((left, right) =>\n left.id === preferred.providerProfileId\n ? -1\n : right.id === preferred.providerProfileId\n ? 1\n : 0,\n );\n return Object.freeze(\n providers.flatMap((provider) => {\n const credential = resolveProviderCredential(\n provider.apiKeyEnv,\n options.environment,\n );\n const models = Object.values(provider.models).sort((left, right) =>\n provider.id !== preferred.providerProfileId\n ? 0\n : left.id === preferred.modelProfileId\n ? -1\n : right.id === preferred.modelProfileId\n ? 1\n : 0,\n );\n return models.map((model) =>\n createConfiguredKeyAskExecutor({\n provider,\n model,\n credential,\n limits: options.ai.execution.limits,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n }),\n );\n }),\n );\n}\n","import type { ContextualAskExecutor } from \"@spotpatch/agent\";\nimport type { ContextualAskExecutorPreference } from \"@spotpatch/shared\";\n\n/** Executors that drive a locally installed Agent CLI instead of an API key. */\nexport interface ManagedAskExecutors {\n readonly codex: ContextualAskExecutor;\n readonly claudeCode: ContextualAskExecutor;\n}\n\nexport interface ComposeContextualAskExecutorsOptions {\n readonly configuredKey: readonly ContextualAskExecutor[];\n readonly managed: ManagedAskExecutors;\n readonly defaultExecutor?: ContextualAskExecutorPreference;\n}\n\n/**\n * Orders independent executor implementations without coupling dev-server to\n * any Agent. The preferred kind comes first; otherwise configured keys lead.\n */\nexport function composeContextualAskExecutors(\n options: ComposeContextualAskExecutorsOptions,\n): readonly ContextualAskExecutor[] {\n const { codex, claudeCode } = options.managed;\n const preference = options.defaultExecutor?.kind;\n return Object.freeze(\n preference === \"managed-codex\"\n ? [codex, claudeCode, ...options.configuredKey]\n : preference === \"claude-code\"\n ? [claudeCode, codex, ...options.configuredKey]\n : [...options.configuredKey, codex, claudeCode],\n );\n}\n","export type WorkspaceActivityKind = \"ask\" | \"change\";\n\nexport interface WorkspaceActivityLease {\n release(): void;\n}\n\nexport interface WorkspaceActivityCoordinator {\n acquire(kind: WorkspaceActivityKind): WorkspaceActivityLease | undefined;\n current(): WorkspaceActivityKind | undefined;\n}\n\nexport function createWorkspaceActivityCoordinator(): WorkspaceActivityCoordinator {\n let active: WorkspaceActivityKind | undefined;\n\n return Object.freeze({\n acquire(kind: WorkspaceActivityKind): WorkspaceActivityLease | undefined {\n if (active !== undefined) return undefined;\n active = kind;\n let released = false;\n return Object.freeze({\n release(): void {\n if (released) return;\n released = true;\n if (active === kind) active = undefined;\n },\n });\n },\n current(): WorkspaceActivityKind | undefined {\n return active;\n },\n });\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { StaticDataFlowAnalyzerOptions } from \"@spotpatch/analyzer\";\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 type SpotPatchRuntimeConfig,\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 { ContextualAskManager } from \"../contextual-ask/manager.js\";\nimport {\n handleContextualAskRequest,\n matchContextualAskPath,\n} from \"../contextual-ask/http.js\";\nimport type { AgentJobManager } from \"../agent/job-manager.js\";\nimport {\n handleExternalHandoffBrowserRequest,\n matchExternalHandoffBrowserPath,\n} from \"../external-handoff/browser-http.js\";\nimport type { ExternalHandoffService } from \"../external-handoff/service.js\";\nimport {\n createExternalAgentBrowserController,\n matchExternalAgentBrowserPath,\n} from \"../external-agent/browser-http.js\";\nimport type { ExternalAgentControlPort } from \"../external-agent/control-port.js\";\nimport { handleAgentRequest, matchAgentRequestPath } from \"./agent-http.js\";\nimport { type EditorLauncher, launchConfiguredEditor } from \"./editor.js\";\nimport {\n createDataFlowAnalyzer,\n handleComponentDataFlowReport,\n handlePageDataFlowReport,\n} from \"./data-flow-http.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { assertRequestAuthorized } from \"./request-security.js\";\nimport {\n readRuntimeBootstrap,\n resolveRuntimeBootstrapOptions,\n type RuntimeBootstrapOptions,\n} from \"./runtime-bootstrap.js\";\nimport { readSourceContext } from \"./source-context.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\nexport type SpotPatchNext = (error?: unknown) => void;\nexport interface SpotPatchMiddleware {\n (request: IncomingMessage, response: ServerResponse, next: SpotPatchNext): void;\n dispose(): void;\n}\n\nexport interface SpotPatchServerLogger {\n warn(message: string): void;\n}\n\nexport interface CreateMiddlewareOptions {\n readonly projectDataFlowSource?: StaticDataFlowAnalyzerOptions[\"projectSource\"];\n readonly agentManager?: AgentJobManager;\n readonly contextualAskManager?: ContextualAskManager;\n readonly bootstrap?: RuntimeBootstrapOptions;\n readonly editorLauncher?: EditorLauncher;\n readonly externalAgentControl?: ExternalAgentControlPort;\n readonly externalHandoffService?: ExternalHandoffService;\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.DATA_FLOW_DISABLED]: 404,\n [ERROR_CODES.DATA_FLOW_SOURCE_STALE]: 409,\n [ERROR_CODES.DATA_FLOW_ANALYSIS_CANCELLED]: 409,\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.EXTERNAL_HANDOFF_DISABLED]: 404,\n [ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE]: 503,\n [ERROR_CODES.HANDOFF_VALIDATION_FAILED]: 422,\n [ERROR_CODES.HANDOFF_SOURCE_STALE]: 409,\n [ERROR_CODES.HANDOFF_NOT_FOUND]: 404,\n [ERROR_CODES.HANDOFF_EXPIRED]: 410,\n [ERROR_CODES.HANDOFF_CURSOR_INVALID]: 409,\n [ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE]: 413,\n [ERROR_CODES.BRIDGE_UNAUTHORIZED]: 401,\n [ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH]: 409,\n [ERROR_CODES.BRIDGE_BUSY]: 429,\n [ERROR_CODES.EXTERNAL_AGENT_BUSY]: 409,\n [ERROR_CODES.ACTIVE_ADAPTER_CONFLICT]: 409,\n [ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID]: 409,\n [ERROR_CODES.ACTIVE_DISPATCH_INVALID]: 409,\n [ERROR_CODES.SESSION_NOT_FOUND]: 404,\n [ERROR_CODES.SESSION_AMBIGUOUS]: 409,\n [ERROR_CODES.SESSION_CLOSED]: 410,\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_ARGUMENTS_INVALID]: 422,\n [ERROR_CODES.TOOL_CALL_ID_CONFLICT]: 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.DATA_FLOW_DISABLED]: \"Component data-flow analysis is not enabled.\",\n [ERROR_CODES.DATA_FLOW_SOURCE_STALE]: \"The selected source version is stale.\",\n [ERROR_CODES.DATA_FLOW_ANALYSIS_CANCELLED]: \"The data-flow analysis was cancelled.\",\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.EXTERNAL_HANDOFF_DISABLED]: \"External Agent handoff is not enabled.\",\n [ERROR_CODES.EXTERNAL_HANDOFF_UNAVAILABLE]:\n \"External Agent handoff is temporarily unavailable.\",\n [ERROR_CODES.HANDOFF_VALIDATION_FAILED]: \"The handoff content is invalid.\",\n [ERROR_CODES.HANDOFF_SOURCE_STALE]: \"The selected source is stale.\",\n [ERROR_CODES.HANDOFF_NOT_FOUND]: \"No current handoff is available.\",\n [ERROR_CODES.HANDOFF_EXPIRED]: \"The handoff has expired.\",\n [ERROR_CODES.HANDOFF_CURSOR_INVALID]: \"The handoff cursor is invalid.\",\n [ERROR_CODES.HANDOFF_RESPONSE_TOO_LARGE]: \"The handoff exceeds the size limit.\",\n [ERROR_CODES.BRIDGE_UNAUTHORIZED]: \"The local bridge request is unauthorized.\",\n [ERROR_CODES.BRIDGE_PROTOCOL_MISMATCH]: \"The local bridge protocol is incompatible.\",\n [ERROR_CODES.BRIDGE_BUSY]: \"The local bridge is busy.\",\n [ERROR_CODES.EXTERNAL_AGENT_BUSY]: \"The connected external Agent is busy.\",\n [ERROR_CODES.ACTIVE_ADAPTER_CONFLICT]: \"Another active Agent adapter is connected.\",\n [ERROR_CODES.ACTIVE_ADAPTER_LEASE_INVALID]:\n \"The active Agent adapter lease is invalid.\",\n [ERROR_CODES.ACTIVE_DISPATCH_INVALID]:\n \"The active Agent dispatch transition is invalid.\",\n [ERROR_CODES.SESSION_NOT_FOUND]: \"No active SpotPatch session was found.\",\n [ERROR_CODES.SESSION_AMBIGUOUS]: \"More than one SpotPatch session matches.\",\n [ERROR_CODES.SESSION_CLOSED]: \"The SpotPatch session has closed.\",\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_ARGUMENTS_INVALID]: \"The Agent tool arguments are invalid.\",\n [ERROR_CODES.TOOL_CALL_ID_CONFLICT]:\n \"A tool call ID conflicts within one Agent turn.\",\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 const bootstrap =\n options.bootstrap === undefined\n ? undefined\n : resolveRuntimeBootstrapOptions(options.bootstrap);\n const dataFlowAnalyzer = createDataFlowAnalyzer(options);\n const externalAgentController =\n options.externalAgentControl === undefined\n ? undefined\n : createExternalAgentBrowserController(options.externalAgentControl);\n\n const middleware = (\n request: IncomingMessage,\n response: ServerResponse,\n next: SpotPatchNext,\n ): void => {\n const path = requestPath(request);\n const agentRoute = matchAgentRequestPath(path);\n const askRoute = matchContextualAskPath(path);\n const externalAgentRoute = matchExternalAgentBrowserPath(path);\n const externalHandoffRoute = matchExternalHandoffBrowserPath(path);\n\n if (\n path !== SPOTPATCH_ENDPOINTS.sourceContext &&\n path !== SPOTPATCH_ENDPOINTS.openEditor &&\n path !== SPOTPATCH_ENDPOINTS.dataFlowComponentReport &&\n path !== SPOTPATCH_ENDPOINTS.dataFlowPageReport &&\n agentRoute === undefined &&\n askRoute === undefined &&\n externalAgentRoute === undefined &&\n externalHandoffRoute === undefined &&\n !path.startsWith(`${SPOTPATCH_API_BASE}/`)\n ) {\n next();\n return;\n }\n\n const handle = async (): Promise<void> => {\n if (path === SPOTPATCH_ENDPOINTS.bootstrap && bootstrap !== undefined) {\n const data: SpotPatchRuntimeConfig = await readRuntimeBootstrap(\n request,\n bootstrap,\n );\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n assertRequestAuthorized(request, {\n allowLan: options.options.allowLan,\n sessionToken: options.session.token,\n });\n\n if (askRoute !== undefined) {\n await handleContextualAskRequest(\n request,\n response,\n askRoute,\n options.contextualAskManager,\n options.logger,\n );\n return;\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 (path === SPOTPATCH_ENDPOINTS.dataFlowComponentReport) {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n const data = await handleComponentDataFlowReport(\n request,\n dataFlowAnalyzer,\n options,\n );\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (path === SPOTPATCH_ENDPOINTS.dataFlowPageReport) {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n const data = await handlePageDataFlowReport(request, dataFlowAnalyzer, options);\n writeJson(response, 200, { ok: true, data });\n return;\n }\n\n if (externalAgentRoute !== undefined) {\n if (\n !options.options.externalAgent.enabled ||\n externalAgentController === undefined\n ) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_HANDOFF_DISABLED);\n }\n await externalAgentController.handle(\n request,\n response,\n externalAgentRoute,\n (target, status, data) => {\n writeJson(target, status, { ok: true, data });\n },\n );\n return;\n }\n\n if (externalHandoffRoute !== undefined) {\n await handleExternalHandoffBrowserRequest(\n request,\n response,\n externalHandoffRoute,\n {\n options: options.options,\n registry: options.registry,\n root: options.root,\n ...(options.externalHandoffService === undefined\n ? {}\n : { service: options.externalHandoffService }),\n },\n (target, status, data) => {\n writeJson(target, status, { ok: true, data });\n },\n );\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 return Object.assign(middleware, {\n dispose(): void {\n externalAgentController?.dispose();\n },\n });\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n askJobActionRequestSchema,\n askJobCreateRequestSchema,\n askJobEventsRequestSchema,\n CONTEXTUAL_ASK_LIMITS,\n SPOTPATCH_ENDPOINTS,\n type ContextualAskErrorCode,\n} from \"@spotpatch/shared\";\n\nimport { readJsonRequestBody } from \"../server/request-body.js\";\nimport type { SpotPatchServerLogger } from \"../server/middleware.js\";\nimport { ContextualAskError } from \"./error.js\";\nimport type { ContextualAskManager } from \"./manager.js\";\n\nexport type ContextualAskRoute =\n | Readonly<{ kind: \"capability\" }>\n | Readonly<{ kind: \"create\" }>\n | Readonly<{ kind: \"job\"; action: \"events\" | \"result\" | \"cancel\"; jobId: string }>;\n\nconst STATUS_BY_ERROR = Object.freeze({\n ASK_DISABLED: 404,\n ASK_SELECTION_REQUIRED: 422,\n ASK_SELECTION_STALE: 409,\n ASK_QUESTION_INVALID: 422,\n ASK_EXECUTOR_UNAVAILABLE: 503,\n ASK_TIMEOUT: 504,\n ASK_CONSENT_REQUIRED: 403,\n ASK_BUSY: 409,\n ASK_IDEMPOTENCY_CONFLICT: 409,\n ASK_SOURCE_SCOPE_DENIED: 403,\n ASK_LIMIT_EXCEEDED: 413,\n ASK_ANSWER_INVALID: 502,\n ASK_WRITE_ATTEMPTED: 403,\n ASK_CANCELLED: 409,\n ASK_RESULT_EXPIRED: 410,\n ASK_PROTOCOL_INCOMPATIBLE: 400,\n} satisfies Record<ContextualAskErrorCode, number>);\n\nconst PUBLIC_MESSAGES = Object.freeze({\n ASK_DISABLED: \"Contextual Ask is not enabled.\",\n ASK_SELECTION_REQUIRED: \"Select at least one source-backed element.\",\n ASK_SELECTION_STALE: \"The selected source is stale.\",\n ASK_QUESTION_INVALID: \"The question is invalid.\",\n ASK_EXECUTOR_UNAVAILABLE: \"The selected Ask executor is unavailable.\",\n ASK_TIMEOUT: \"The Ask executor did not answer before the deadline.\",\n ASK_CONSENT_REQUIRED: \"Provider data consent is required.\",\n ASK_BUSY: \"Another workspace task is active.\",\n ASK_IDEMPOTENCY_CONFLICT: \"The request ID was reused with different content.\",\n ASK_SOURCE_SCOPE_DENIED: \"The requested source scope was denied.\",\n ASK_LIMIT_EXCEEDED: \"The Ask request exceeded a safety limit.\",\n ASK_ANSWER_INVALID: \"The executor returned an invalid answer.\",\n ASK_WRITE_ATTEMPTED: \"Ask executors cannot write project files.\",\n ASK_CANCELLED: \"The Ask job was cancelled.\",\n ASK_RESULT_EXPIRED: \"The Ask result has expired.\",\n ASK_PROTOCOL_INCOMPATIBLE: \"The Ask protocol request is incompatible.\",\n} satisfies Record<ContextualAskErrorCode, string>);\n\nfunction writeJson(response: ServerResponse, status: number, data: unknown): 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({ ok: true, data }));\n}\n\nfunction writeError(\n response: ServerResponse,\n error: unknown,\n logger: SpotPatchServerLogger | undefined,\n): void {\n const normalized =\n error instanceof ContextualAskError\n ? error\n : new ContextualAskError(\"ASK_EXECUTOR_UNAVAILABLE\", { cause: error });\n if (normalized.code === \"ASK_EXECUTOR_UNAVAILABLE\" && error !== normalized) {\n logger?.warn(\"[spotpatch:ask] Internal contextual Ask request failure.\");\n }\n response.statusCode = STATUS_BY_ERROR[normalized.code];\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.end(\n JSON.stringify({\n ok: false,\n error: {\n code: normalized.code,\n message: PUBLIC_MESSAGES[normalized.code],\n },\n }),\n );\n}\n\nexport function matchContextualAskPath(\n pathname: string,\n): ContextualAskRoute | undefined {\n if (pathname === SPOTPATCH_ENDPOINTS.askCapability) {\n return Object.freeze({ kind: \"capability\" });\n }\n if (pathname === SPOTPATCH_ENDPOINTS.askJobs) {\n return Object.freeze({ kind: \"create\" });\n }\n const prefix = `${SPOTPATCH_ENDPOINTS.askJobs}/`;\n if (!pathname.startsWith(prefix)) return undefined;\n const segments = pathname.slice(prefix.length).split(\"/\");\n if (segments.length !== 2) return undefined;\n let jobId: string;\n try {\n jobId = decodeURIComponent(segments[0] ?? \"\");\n } catch {\n return undefined;\n }\n const action = segments[1];\n if (\n !/^[A-Za-z0-9_-]{1,128}$/u.test(jobId) ||\n (action !== \"events\" && action !== \"result\" && action !== \"cancel\")\n ) {\n return undefined;\n }\n return Object.freeze({ kind: \"job\", action, jobId });\n}\n\nfunction parseAfterSequence(request: IncomingMessage): number {\n let url: URL;\n try {\n url = new URL(request.url ?? \"/\", \"http://spotpatch.invalid\");\n } catch {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n }\n if ([...url.searchParams.keys()].some((key) => key !== \"afterSequence\")) {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n }\n const raw = url.searchParams.get(\"afterSequence\");\n if (raw === null) return 0;\n if (!/^\\d+$/u.test(raw)) throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n const parsed = askJobEventsRequestSchema.safeParse({ afterSequence: Number(raw) });\n if (!parsed.success || !Number.isSafeInteger(parsed.data.afterSequence)) {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n }\n return parsed.data.afterSequence ?? 0;\n}\n\nfunction streamEvents(\n request: IncomingMessage,\n response: ServerResponse,\n manager: ContextualAskManager,\n jobId: string,\n): void {\n const afterSequence = parseAfterSequence(request);\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 let unsubscribe = (): void => undefined;\n const heartbeat = setInterval(\n () => response.write(\"\\n\"),\n CONTEXTUAL_ASK_LIMITS.eventHeartbeatMs,\n );\n heartbeat.unref();\n const cleanup = (): void => {\n clearInterval(heartbeat);\n unsubscribe();\n };\n unsubscribe = manager.subscribe(jobId, (event) => {\n response.write(`${JSON.stringify(event)}\\n`);\n if ([\"answered\", \"cancelled\", \"failed\"].includes(event.status)) {\n cleanup();\n response.end();\n }\n });\n // subscribe() and events() are synchronous Manager operations. Establishing\n // the listener first closes the replay/live hand-off gap without duplicates.\n const replay = manager.events(jobId, afterSequence);\n for (const event of replay) response.write(`${JSON.stringify(event)}\\n`);\n const latest = replay.at(-1);\n const currentStatus = latest?.status ?? manager.snapshot(jobId).status;\n if ([\"answered\", \"cancelled\", \"failed\"].includes(currentStatus)) {\n cleanup();\n response.end();\n return;\n }\n request.once(\"close\", cleanup);\n response.once(\"close\", cleanup);\n}\n\nfunction hasEmptySelection(value: unknown): boolean {\n if (typeof value !== \"object\" || value === null) return false;\n const envelope = (value as { envelope?: unknown }).envelope;\n if (typeof envelope !== \"object\" || envelope === null) return false;\n const selection = (envelope as { selection?: unknown }).selection;\n if (typeof selection !== \"object\" || selection === null) return false;\n return (\n Array.isArray((selection as { targets?: unknown }).targets) &&\n (selection as { targets: unknown[] }).targets.length === 0\n );\n}\n\nfunction lacksProviderDataConsent(value: unknown): boolean {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { providerDataConsent?: unknown }).providerDataConsent !== true\n );\n}\n\nexport async function handleContextualAskRequest(\n request: IncomingMessage,\n response: ServerResponse,\n route: ContextualAskRoute,\n manager: ContextualAskManager | undefined,\n logger?: SpotPatchServerLogger,\n): Promise<void> {\n try {\n if (manager === undefined) throw new ContextualAskError(\"ASK_DISABLED\");\n if (route.kind === \"capability\") {\n if (request.method !== \"GET\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n writeJson(\n response,\n 200,\n await manager.capability(\n AbortSignal.timeout(CONTEXTUAL_ASK_LIMITS.capabilityTimeoutMs),\n ),\n );\n return;\n }\n if (route.kind === \"create\") {\n if (request.method !== \"POST\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n const raw = await readJsonRequestBody(\n request,\n CONTEXTUAL_ASK_LIMITS.maximumRequestBodyBytes,\n ).catch((error: unknown) => {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\", { cause: error });\n });\n const parsed = askJobCreateRequestSchema.safeParse(raw);\n if (!parsed.success) {\n throw new ContextualAskError(\n hasEmptySelection(raw)\n ? \"ASK_SELECTION_REQUIRED\"\n : lacksProviderDataConsent(raw)\n ? \"ASK_CONSENT_REQUIRED\"\n : \"ASK_PROTOCOL_INCOMPATIBLE\",\n );\n }\n writeJson(response, 202, await manager.create(parsed.data));\n return;\n }\n if (route.action === \"events\") {\n if (request.method !== \"GET\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n streamEvents(request, response, manager, route.jobId);\n return;\n }\n if (route.action === \"result\") {\n if (request.method !== \"GET\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n writeJson(response, 200, await manager.result(route.jobId));\n return;\n }\n if (request.method !== \"POST\")\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n const action = askJobActionRequestSchema.safeParse(\n await readJsonRequestBody(request).catch((error: unknown) => {\n throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\", { cause: error });\n }),\n );\n if (!action.success) throw new ContextualAskError(\"ASK_PROTOCOL_INCOMPATIBLE\");\n writeJson(response, 200, manager.cancel(route.jobId));\n } catch (error: unknown) {\n writeError(response, error, logger);\n }\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_HANDOFF_LIMITS,\n SPOTPATCH_ENDPOINTS,\n SpotPatchError,\n externalHandoffCapabilityRequestSchema,\n externalHandoffPublishRequestSchema,\n externalHandoffResolveDeliveryRequestSchema,\n externalHandoffStatusRequestSchema,\n} from \"@spotpatch/shared\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { authorizeAnnotation } from \"../server/annotation-authorizer.js\";\nimport { readJsonRequestBody } from \"../server/request-body.js\";\nimport type { ExternalHandoffService } from \"./service.js\";\n\nexport type ExternalHandoffBrowserRoute =\n \"capability\" | \"publish\" | \"resolve-delivery\" | \"status\";\n\nexport interface ExternalHandoffBrowserOptions {\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly root: string;\n readonly service?: ExternalHandoffService;\n}\n\nexport type WriteExternalHandoffSuccess = (\n response: ServerResponse,\n status: number,\n data: unknown,\n) => void;\n\nexport function matchExternalHandoffBrowserPath(\n path: string,\n): ExternalHandoffBrowserRoute | undefined {\n if (path === SPOTPATCH_ENDPOINTS.externalHandoffCapability) return \"capability\";\n if (path === SPOTPATCH_ENDPOINTS.externalHandoffPublish) return \"publish\";\n if (path === SPOTPATCH_ENDPOINTS.externalHandoffStatus) return \"status\";\n if (path === SPOTPATCH_ENDPOINTS.externalHandoffResolveDelivery) {\n return \"resolve-delivery\";\n }\n return undefined;\n}\n\nfunction requireService(\n options: ExternalHandoffBrowserOptions,\n): ExternalHandoffService {\n if (!options.options.externalAgent.enabled || options.service === undefined) {\n throw new SpotPatchError(ERROR_CODES.EXTERNAL_HANDOFF_DISABLED);\n }\n\n return options.service;\n}\n\nfunction remapAuthorizationError(error: unknown): never {\n if (error instanceof SpotPatchError) {\n if (\n error.code === ERROR_CODES.SOURCE_NOT_FOUND ||\n error.code === ERROR_CODES.SOURCE_OUTSIDE_ROOT ||\n error.code === ERROR_CODES.SOURCE_TOO_LARGE\n ) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_SOURCE_STALE, undefined, {\n cause: error,\n });\n }\n\n if (error.code === ERROR_CODES.INVALID_REQUEST) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_VALIDATION_FAILED, undefined, {\n cause: error,\n });\n }\n }\n\n throw error;\n}\n\nexport async function handleExternalHandoffBrowserRequest(\n request: IncomingMessage,\n response: ServerResponse,\n route: ExternalHandoffBrowserRoute,\n options: ExternalHandoffBrowserOptions,\n writeSuccess: WriteExternalHandoffSuccess,\n): Promise<void> {\n if (request.method !== \"POST\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const service = requireService(options);\n\n if (route === \"capability\") {\n const parsed = externalHandoffCapabilityRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(response, 200, service.capability());\n return;\n }\n\n if (route === \"status\") {\n const parsed = externalHandoffStatusRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(response, 200, service.status(parsed.data.cursor));\n return;\n }\n\n if (route === \"resolve-delivery\") {\n const parsed = externalHandoffResolveDeliveryRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(response, 200, service.resolveDelivery(parsed.data.cursor));\n return;\n }\n\n const parsed = externalHandoffPublishRequestSchema.safeParse(\n await readJsonRequestBody(request, EXTERNAL_HANDOFF_LIMITS.maximumPublishBodyBytes),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_VALIDATION_FAILED);\n }\n\n const result = await service.publish(parsed.data, async (annotation) => {\n try {\n return await authorizeAnnotation({\n annotation,\n options: options.options,\n registry: options.registry,\n root: options.root,\n });\n } catch (error: unknown) {\n remapAuthorizationError(error);\n }\n });\n writeSuccess(response, result.replayed ? 200 : 201, result);\n}\n","import { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n ELEMENT_INSTANCE_LIMITS,\n ERROR_CODES,\n SpotPatchError,\n redactSensitiveText,\n sanitizeUrl,\n type MatchedStyleRule,\n type PageContext,\n type SourceRef,\n type SpotAnnotation,\n type SpotTargetContext,\n type spotAnnotationRequestSchema,\n} 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 AuthorizeAnnotationOptions {\n readonly annotation: z.output<typeof spotAnnotationRequestSchema>;\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly root: string;\n}\n\ntype ParsedTarget = AuthorizeAnnotationOptions[\"annotation\"][\"targets\"][number];\n\nfunction sanitizePageContext(page: Readonly<PageContext>): Readonly<PageContext> {\n return Object.freeze({\n url: sanitizeUrl(page.url, page.url),\n pathname: redactSensitiveText(page.pathname),\n title: redactSensitiveText(page.title),\n viewportWidth: page.viewportWidth,\n viewportHeight: page.viewportHeight,\n devicePixelRatio: page.devicePixelRatio,\n });\n}\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 =\n source.origin === \"jsx-host\" ||\n source.origin === \"astro-host\" ||\n 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({ fileId: source.fileId, registry, root });\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({ ...compactSourceRef(source), relativePath });\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 if (target.element.instance !== undefined)\n return `instance:${target.element.instance.id}`;\n // Legacy captures have no opaque instance identity. Never equate source identity\n // with a rendered target; page and DOM evidence must also agree.\n return JSON.stringify([\n target.page?.url ?? \"\",\n target.source,\n target.element.selector,\n target.element.sanitizedHtml,\n ]);\n}\n\nasync function authorizeTarget(\n target: ParsedTarget,\n input: AuthorizeAnnotationOptions,\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 ...(target.page === undefined ? {} : { page: sanitizePageContext(target.page) }),\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 ...(target.element.instance === undefined\n ? {}\n : {\n instance: Object.freeze({\n ...target.element.instance,\n label: redactSensitiveText(target.element.instance.label).slice(\n 0,\n ELEMENT_INSTANCE_LIMITS.labelCharacters,\n ),\n context: redactSensitiveText(target.element.instance.context).slice(\n 0,\n ELEMENT_INSTANCE_LIMITS.contextCharacters,\n ),\n }),\n }),\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 authorizeAnnotation(\n input: AuthorizeAnnotationOptions,\n): Promise<SpotAnnotation> {\n const requestedTargets = input.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 return Object.freeze({\n schemaVersion: 3,\n id: input.annotation.id,\n locale: input.annotation.locale,\n page: sanitizePageContext(input.annotation.page),\n targets,\n createdAt: input.annotation.createdAt,\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 === \".astro\" ? \"astro\" : 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 if (options.language === \"astro\") return nearbyContext(options);\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\", \".astro\"]);\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","import type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport {\n ERROR_CODES,\n EXTERNAL_AGENT_CONTROL_LIMITS,\n SPOTPATCH_ENDPOINTS,\n SpotPatchError,\n externalAgentControlCancelRequestSchema,\n externalAgentControlConnectRequestSchema,\n externalAgentControlDisconnectRequestSchema,\n externalAgentControlStatusRequestSchema,\n externalAgentControlStatusSchema,\n externalAgentEventSchema,\n externalAgentEventsRequestSchema,\n externalAgentManagedResultSchema,\n externalAgentResultRequestSchema,\n type ExternalAgentEvent,\n} from \"@spotpatch/shared\";\n\nimport { readJsonRequestBody } from \"../server/request-body.js\";\nimport type { ExternalAgentControlPort } from \"./control-port.js\";\n\nexport type ExternalAgentBrowserRoute =\n \"cancel\" | \"connect\" | \"disconnect\" | \"events\" | \"result\" | \"status\";\n\nexport interface ExternalAgentBrowserController {\n handle(\n request: IncomingMessage,\n response: ServerResponse,\n route: ExternalAgentBrowserRoute,\n writeSuccess: (response: ServerResponse, status: number, data: unknown) => void,\n ): Promise<void>;\n dispose(): void;\n}\n\nexport function matchExternalAgentBrowserPath(\n path: string,\n): ExternalAgentBrowserRoute | undefined {\n if (path === SPOTPATCH_ENDPOINTS.externalAgentControlStatus) return \"status\";\n if (path === SPOTPATCH_ENDPOINTS.externalAgentControlConnect) return \"connect\";\n if (path === SPOTPATCH_ENDPOINTS.externalAgentControlDisconnect) {\n return \"disconnect\";\n }\n if (path === SPOTPATCH_ENDPOINTS.externalAgentControlCancel) return \"cancel\";\n if (path === SPOTPATCH_ENDPOINTS.externalAgentEvents) return \"events\";\n if (path === SPOTPATCH_ENDPOINTS.externalAgentResult) return \"result\";\n return undefined;\n}\n\nfunction writeEvent(response: ServerResponse, event: ExternalAgentEvent): void {\n response.write(`${JSON.stringify(externalAgentEventSchema.parse(event))}\\n`);\n}\n\nexport function createExternalAgentBrowserController(\n port: ExternalAgentControlPort,\n): ExternalAgentBrowserController {\n const streams = new Set<ServerResponse>();\n let disposed = false;\n\n const handleEvents = async (\n request: IncomingMessage,\n response: ServerResponse,\n ): Promise<void> => {\n const parsed = externalAgentEventsRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n if (\n disposed ||\n streams.size >= EXTERNAL_AGENT_CONTROL_LIMITS.maximumEventSubscribers\n ) {\n throw new SpotPatchError(ERROR_CODES.BRIDGE_BUSY);\n }\n\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 streams.add(response);\n const initial = externalAgentControlStatusSchema.parse(port.getStatus());\n writeEvent(response, { type: \"status\", data: initial });\n\n const unsubscribe = port.subscribe((status) => {\n if (!response.destroyed && status.sequence > (parsed.data.afterSequence ?? -1)) {\n writeEvent(response, { type: \"status\", data: status });\n }\n });\n const heartbeat = setInterval(() => {\n if (!response.destroyed) {\n const status = port.getStatus();\n writeEvent(response, {\n type: \"heartbeat\",\n sequence: status.sequence,\n emittedAt: new Date().toISOString(),\n });\n }\n }, EXTERNAL_AGENT_CONTROL_LIMITS.eventHeartbeatMs);\n heartbeat.unref();\n\n await new Promise<void>((resolve) => {\n const close = (): void => {\n response.off(\"close\", close);\n clearInterval(heartbeat);\n unsubscribe();\n streams.delete(response);\n resolve();\n };\n response.once(\"close\", close);\n });\n };\n\n return Object.freeze({\n async handle(\n request: IncomingMessage,\n response: ServerResponse,\n route: ExternalAgentBrowserRoute,\n writeSuccess: (response: ServerResponse, status: number, data: unknown) => void,\n ): Promise<void> {\n if (request.method !== \"POST\" || disposed) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n if (route === \"events\") {\n await handleEvents(request, response);\n return;\n }\n if (route === \"status\") {\n const parsed = externalAgentControlStatusRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(\n response,\n 200,\n externalAgentControlStatusSchema.parse(port.getStatus()),\n );\n return;\n }\n if (route === \"connect\") {\n const parsed = externalAgentControlConnectRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const controller = new AbortController();\n response.once(\"close\", () => {\n if (!response.writableEnded) controller.abort(\"browser-disconnected\");\n });\n writeSuccess(\n response,\n 200,\n externalAgentControlStatusSchema.parse(\n await port.connect(parsed.data, controller.signal),\n ),\n );\n return;\n }\n if (route === \"disconnect\") {\n const parsed = externalAgentControlDisconnectRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(\n response,\n 200,\n externalAgentControlStatusSchema.parse(await port.disconnect(parsed.data)),\n );\n return;\n }\n if (route === \"cancel\") {\n const parsed = externalAgentControlCancelRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n writeSuccess(\n response,\n 200,\n externalAgentControlStatusSchema.parse(await port.cancel(parsed.data)),\n );\n return;\n }\n\n const parsed = externalAgentResultRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n if (!parsed.success) throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n const result = port.getResult(parsed.data.revision);\n if (result === undefined) {\n throw new SpotPatchError(ERROR_CODES.HANDOFF_NOT_FOUND);\n }\n writeSuccess(response, 200, externalAgentManagedResultSchema.parse(result));\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n for (const response of streams) response.end();\n streams.clear();\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 {\n type AgentJobCreateRequest,\n type agentJobCreateRequestSchema,\n} from \"@spotpatch/shared\";\nimport type { z } from \"zod\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { authorizeAnnotation } from \"./annotation-authorizer.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\nexport async function authorizeAgentJobRequest(\n input: AuthorizeAgentJobRequestOptions,\n): Promise<AgentJobCreateRequest> {\n const annotation = await authorizeAnnotation({\n annotation: input.request.annotation,\n options: input.options,\n registry: input.registry,\n root: input.root,\n });\n\n return Object.freeze({\n annotation,\n ...(input.request.applyMode === undefined\n ? {}\n : { applyMode: input.request.applyMode }),\n providerProfileId: input.request.providerProfileId,\n modelProfileId: input.request.modelProfileId,\n providerDataConsent: true,\n ...(input.request.trustedFastModeConsent === true\n ? { trustedFastModeConsent: true as const }\n : {}),\n workingTreeMode: input.request.workingTreeMode,\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 { createHash } from \"node:crypto\";\nimport type { IncomingMessage } from \"node:http\";\n\nimport {\n createStaticDataFlowAnalyzer,\n type StaticDataFlowAnalyzer,\n} from \"@spotpatch/analyzer\";\nimport {\n DATA_FLOW_SCHEMA_VERSION,\n ERROR_CODES,\n SpotPatchError,\n dataFlowComponentReportRequestSchema,\n dataFlowPageReportRequestSchema,\n limitDataFlowReportCollections,\n type ComponentDataFlowReport,\n type DataFlowComponentReportRequest,\n type PageDataFlowReport,\n} from \"@spotpatch/shared\";\n\nimport type { CreateMiddlewareOptions } from \"./middleware.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { resolveSourceFile } from \"./source-file.js\";\n\ntype DataFlowReport = ComponentDataFlowReport | PageDataFlowReport;\n\nfunction envelopeBytes(report: DataFlowReport): number {\n return Buffer.byteLength(JSON.stringify({ ok: true, data: report }), \"utf8\");\n}\n\nexport function limitDataFlowReportToBytes(\n report: ComponentDataFlowReport,\n maximumBytes: number,\n): ComponentDataFlowReport;\nexport function limitDataFlowReportToBytes(\n report: PageDataFlowReport,\n maximumBytes: number,\n): PageDataFlowReport;\nexport function limitDataFlowReportToBytes(\n report: DataFlowReport,\n maximumBytes: number,\n): DataFlowReport {\n const structurallyLimited = limitDataFlowReportCollections(report);\n if (envelopeBytes(structurallyLimited) <= maximumBytes) {\n return structurallyLimited;\n }\n\n let limited = limitDataFlowReportCollections(structurallyLimited, {\n forceTruncation: true,\n maximumDependencies: 0,\n truncatedBy: \"bytes\",\n });\n if (envelopeBytes(limited) > maximumBytes) {\n throw new SpotPatchError(ERROR_CODES.INTERNAL_ERROR);\n }\n\n for (\n let maximumDependencies = 1;\n maximumDependencies <= structurallyLimited.dependencies.length;\n maximumDependencies += 1\n ) {\n const candidate = limitDataFlowReportCollections(structurallyLimited, {\n forceTruncation: true,\n maximumDependencies,\n truncatedBy: \"bytes\",\n });\n if (envelopeBytes(candidate) > maximumBytes) break;\n limited = candidate;\n }\n return limited;\n}\n\nexport function createDataFlowAnalyzer(\n options: CreateMiddlewareOptions,\n): StaticDataFlowAnalyzer | undefined {\n if (!options.options.dataFlow.enabled) return undefined;\n\n return createStaticDataFlowAnalyzer({\n root: options.root,\n registryEpoch: options.session.id,\n registerSource: (absolutePath) => options.registry.register(absolutePath),\n limits: options.options.dataFlow.limits,\n ...(options.projectDataFlowSource === undefined\n ? {}\n : { projectSource: options.projectDataFlowSource }),\n });\n}\n\nasync function analyzeTarget(\n request: DataFlowComponentReportRequest,\n analyzer: StaticDataFlowAnalyzer,\n options: CreateMiddlewareOptions,\n): Promise<ComponentDataFlowReport> {\n const resolvedRequest = (() => {\n if (\"componentSourceId\" in request) {\n const anchor = options.registry.resolveDataFlowComponent(\n request.componentSourceId,\n );\n if (anchor?.sourceVersion !== request.sourceVersion) {\n throw new SpotPatchError(ERROR_CODES.DATA_FLOW_SOURCE_STALE);\n }\n return anchor;\n }\n return request;\n })();\n const absolutePath = await resolveSourceFile({\n fileId: resolvedRequest.fileId,\n registry: options.registry,\n root: options.root,\n });\n const report = analyzer.analyzeComponent({\n absolutePath,\n line: resolvedRequest.line,\n column: resolvedRequest.column,\n });\n\n if (\n resolvedRequest.sourceVersion !== undefined &&\n resolvedRequest.sourceVersion !== report.component.source.sourceVersion\n ) {\n throw new SpotPatchError(ERROR_CODES.DATA_FLOW_SOURCE_STALE);\n }\n\n return limitDataFlowReportToBytes(\n report,\n options.options.dataFlow.limits.reportMaxBytes,\n );\n}\n\nfunction requireAnalyzer(\n analyzer: StaticDataFlowAnalyzer | undefined,\n): StaticDataFlowAnalyzer {\n if (analyzer === undefined) {\n throw new SpotPatchError(ERROR_CODES.DATA_FLOW_DISABLED);\n }\n return analyzer;\n}\n\nexport async function handleComponentDataFlowReport(\n request: IncomingMessage,\n analyzer: StaticDataFlowAnalyzer | undefined,\n options: CreateMiddlewareOptions,\n): Promise<ComponentDataFlowReport> {\n const parsed = dataFlowComponentReportRequestSchema.safeParse(\n await readJsonRequestBody(\n request,\n options.options.dataFlow.limits.protocolRequestMaxBytes,\n ),\n );\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return analyzeTarget(parsed.data, requireAnalyzer(analyzer), options);\n}\n\nexport async function handlePageDataFlowReport(\n request: IncomingMessage,\n analyzer: StaticDataFlowAnalyzer | undefined,\n options: CreateMiddlewareOptions,\n): Promise<PageDataFlowReport> {\n const parsed = dataFlowPageReportRequestSchema.safeParse(\n await readJsonRequestBody(\n request,\n options.options.dataFlow.limits.protocolRequestMaxBytes,\n ),\n );\n if (!parsed.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n const activeAnalyzer = requireAnalyzer(analyzer);\n const componentReports = await Promise.all(\n parsed.data.targets.map((target) => analyzeTarget(target, activeAnalyzer, options)),\n );\n const dependencies = new Map(\n componentReports.flatMap((report) =>\n report.dependencies.map((dependency) => [dependency.id, dependency] as const),\n ),\n );\n const evidence = new Map(\n componentReports.flatMap((report) =>\n report.evidence.map((entry) => [entry.id, entry] as const),\n ),\n );\n const diagnostics = new Map(\n componentReports.flatMap((report) =>\n report.diagnostics.map((entry) => [entry.id, entry] as const),\n ),\n );\n const analyzedVersions = new Set(\n componentReports.flatMap((report) => report.baseline.analyzedSourceVersions),\n );\n const reportId = `page_${createHash(\"sha256\")\n .update(componentReports.map((report) => report.reportId).join(\"\\0\"))\n .digest(\"base64url\")\n .slice(0, 22)}`;\n const complete = componentReports.every((report) => report.completeness.complete);\n\n const report = Object.freeze({\n schemaVersion: DATA_FLOW_SCHEMA_VERSION,\n reportId,\n baseline: Object.freeze({\n registryEpoch: options.session.id,\n analyzerVersion: componentReports[0]?.baseline.analyzerVersion ?? \"unavailable\",\n adapterSetHash: componentReports[0]?.baseline.adapterSetHash ?? \"unavailable\",\n analyzedSourceVersions: Object.freeze([...analyzedVersions].sort()),\n }),\n capability: Object.freeze({\n enabled: true,\n staticAnalysis: complete ? \"available\" : \"partial\",\n runtimeObservation: \"dispatch-only\",\n responseShape: \"consumed-fields-only\",\n aiAssistance: \"disabled\",\n reasons: Object.freeze(\n componentReports.flatMap((report) => report.capability.reasons),\n ),\n }),\n dependencies: Object.freeze([...dependencies.values()]),\n evidence: Object.freeze([...evidence.values()]),\n diagnostics: Object.freeze([...diagnostics.values()]),\n completeness: Object.freeze({\n complete,\n visitedModules: componentReports.reduce(\n (total, report) => total + report.completeness.visitedModules,\n 0,\n ),\n visitedCallsites: componentReports.reduce(\n (total, report) => total + report.completeness.visitedCallsites,\n 0,\n ),\n frontierCount: componentReports.reduce(\n (total, report) => total + report.completeness.frontierCount,\n 0,\n ),\n }),\n });\n return limitDataFlowReportToBytes(\n report,\n options.options.dataFlow.limits.reportMaxBytes,\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\nfunction isSameOriginBrowserGet(request: IncomingMessage): boolean {\n return (\n request.method === \"GET\" &&\n getSingleHeader(request, \"sec-fetch-site\")?.toLowerCase() === \"same-origin\" &&\n getSingleHeader(request, \"sec-fetch-mode\")?.toLowerCase() === \"cors\" &&\n getSingleHeader(request, \"sec-fetch-dest\")?.toLowerCase() === \"empty\"\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) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n\n const hostIsLoopback = isLoopbackHostname(host.hostname);\n\n // Browsers omit Origin on same-origin GET fetches. Fetch Metadata is browser-\n // controlled and lets those reads pass without weakening token validation or\n // accepting cross-site requests. Non-browser clients can continue to send Origin.\n if (origin === undefined) {\n if (!isSameOriginBrowserGet(request) || (!options.allowLan && !hostIsLoopback)) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n return;\n }\n\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 type { IncomingMessage } from \"node:http\";\n\nimport {\n ERROR_CODES,\n SpotPatchError,\n runtimeBootstrapRequestSchema,\n runtimeConfigSchema,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { isLoopbackHostname } from \"./request-security.js\";\n\nexport interface RuntimeBootstrapOptions {\n readonly expectedOrigin: string;\n readonly runtimeConfig: SpotPatchRuntimeConfig;\n}\n\nexport interface ResolvedRuntimeBootstrapOptions {\n readonly expectedOrigin: string;\n readonly runtimeConfig: SpotPatchRuntimeConfig;\n}\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\nexport function resolveRuntimeBootstrapOptions(\n options: RuntimeBootstrapOptions,\n): ResolvedRuntimeBootstrapOptions {\n let expectedOrigin: URL;\n\n try {\n expectedOrigin = new URL(options.expectedOrigin);\n } catch {\n throw new TypeError(\"The SpotPatch bootstrap origin is invalid.\");\n }\n\n if (\n expectedOrigin.origin !== options.expectedOrigin ||\n expectedOrigin.protocol !== \"http:\" ||\n !isLoopbackHostname(expectedOrigin.hostname)\n ) {\n throw new TypeError(\"The SpotPatch bootstrap origin must be a loopback origin.\");\n }\n\n const parsedConfig = runtimeConfigSchema.safeParse(options.runtimeConfig);\n\n if (!parsedConfig.success) {\n throw new TypeError(\"The SpotPatch Runtime configuration is invalid.\");\n }\n\n return Object.freeze({\n expectedOrigin: expectedOrigin.origin,\n runtimeConfig: parsedConfig.data,\n });\n}\n\nfunction assertRuntimeBootstrapRequest(\n request: IncomingMessage,\n expectedOrigin: string,\n): void {\n const contentType = getSingleHeader(request, \"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase();\n\n if (request.method !== \"POST\" || contentType !== \"application/json\") {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n const host = getSingleHeader(request, \"host\");\n let hostIsLoopback = false;\n\n if (host !== undefined) {\n try {\n hostIsLoopback = isLoopbackHostname(new URL(`http://${host}`).hostname);\n } catch {\n hostIsLoopback = false;\n }\n }\n\n if (\n !hostIsLoopback ||\n getSingleHeader(request, \"origin\") !== expectedOrigin ||\n getSingleHeader(request, \"sec-fetch-site\") !== \"same-origin\"\n ) {\n throw new SpotPatchError(ERROR_CODES.ORIGIN_NOT_ALLOWED);\n }\n}\n\nexport async function readRuntimeBootstrap(\n request: IncomingMessage,\n options: ResolvedRuntimeBootstrapOptions,\n): Promise<SpotPatchRuntimeConfig> {\n assertRuntimeBootstrapRequest(request, options.expectedOrigin);\n const parsedBody = runtimeBootstrapRequestSchema.safeParse(\n await readJsonRequestBody(request),\n );\n\n if (!parsedBody.success) {\n throw new SpotPatchError(ERROR_CODES.INVALID_REQUEST);\n }\n\n return options.runtimeConfig;\n}\n","import { timingSafeEqual } from \"node:crypto\";\nimport { lstat, readFile, realpath } from \"node:fs/promises\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport path from \"node:path\";\n\nimport {\n createDataFlowSourceFilter,\n createDataFlowSourceVersion,\n createSourceFilter,\n} from \"@spotpatch/compiler\";\nimport { DEFAULT_DATA_FLOW_LIMITS } from \"@spotpatch/shared\";\nimport { z } from \"zod\";\n\nimport type { ResolvedSpotPatchOptions } from \"../options.js\";\nimport type { SourceRegistry } from \"../registry/source-registry.js\";\nimport { readJsonRequestBody } from \"./request-body.js\";\nimport { isLoopbackHostname } from \"./request-security.js\";\n\nconst REGISTRATION_BODY_LIMIT_BYTES = DEFAULT_DATA_FLOW_LIMITS.protocolRequestMaxBytes;\nconst REGISTRATION_IDENTITY_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst DATA_FLOW_IDENTITY_PATTERN = /^[A-Za-z0-9_-]{1,128}$/u;\nconst INTERNAL_SECRET_HEADER = \"x-spotpatch-internal\";\nconst FORBIDDEN_SOURCE_SEGMENTS = new Set([\".next\", \"node_modules\"]);\nconst registrationRequestSchema = z.strictObject({\n epoch: z.string().regex(REGISTRATION_IDENTITY_PATTERN),\n resourcePath: z.string().min(1).max(3_072),\n dataFlow: z\n .strictObject({\n sourceVersion: z.string().regex(DATA_FLOW_IDENTITY_PATTERN),\n components: z\n .array(\n z.strictObject({\n componentSourceId: z.string().regex(DATA_FLOW_IDENTITY_PATTERN),\n line: z.number().int().positive().max(10_000_000),\n column: z.number().int().positive().max(10_000_000),\n }),\n )\n .max(DEFAULT_DATA_FLOW_LIMITS.sourceMaxComponents),\n })\n .optional(),\n});\n\nexport interface SourceRegistrationServiceOptions {\n readonly internalSecret: string;\n readonly options: ResolvedSpotPatchOptions;\n readonly registry: SourceRegistry;\n readonly registryEpoch: string;\n readonly root: string;\n}\n\nexport type SourceRegistrationHandler = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nexport interface SourceRegistrationService {\n readonly handler: SourceRegistrationHandler;\n readonly root: string;\n}\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 identitiesMatch(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 return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\n\nfunction isWithinRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction hasForbiddenSegment(root: string, candidate: string): boolean {\n return path\n .relative(root, candidate)\n .split(path.sep)\n .some((segment) => FORBIDDEN_SOURCE_SEGMENTS.has(segment));\n}\n\nfunction writeJson(\n response: ServerResponse,\n statusCode: number,\n payload: unknown,\n): void {\n const body = JSON.stringify(payload);\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nfunction requestComesFromLoopbackWorker(request: IncomingMessage): boolean {\n const host = getSingleHeader(request, \"host\");\n\n if (host === undefined || getSingleHeader(request, \"origin\") !== undefined) {\n return false;\n }\n\n try {\n return isLoopbackHostname(new URL(`http://${host}`).hostname);\n } catch {\n return false;\n }\n}\n\nasync function resolveAuthorizedSource(\n root: string,\n requestedPath: string,\n shouldTransform: (absolutePath: string) => boolean,\n): Promise<string | undefined> {\n if (!path.isAbsolute(requestedPath) || requestedPath.includes(\"\\0\")) {\n return undefined;\n }\n\n try {\n const sourceStat = await lstat(requestedPath);\n\n if (!sourceStat.isFile() || sourceStat.isSymbolicLink()) {\n return undefined;\n }\n\n const resolvedPath = await realpath(requestedPath);\n\n if (\n !isWithinRoot(root, resolvedPath) ||\n hasForbiddenSegment(root, resolvedPath) ||\n !shouldTransform(resolvedPath)\n ) {\n return undefined;\n }\n\n return resolvedPath;\n } catch {\n return undefined;\n }\n}\n\nexport async function createSourceRegistrationService(\n input: SourceRegistrationServiceOptions,\n): Promise<SourceRegistrationService> {\n if (\n !REGISTRATION_IDENTITY_PATTERN.test(input.internalSecret) ||\n !REGISTRATION_IDENTITY_PATTERN.test(input.registryEpoch)\n ) {\n throw new TypeError(\"The source registration identity is invalid.\");\n }\n\n const root = await realpath(input.root);\n const sourceFilter = createSourceFilter(root, input.options);\n const dataFlowFilter = createDataFlowSourceFilter(root, input.options);\n const registrationQueues = new Map<string, Promise<void>>();\n\n async function registerCurrentSource(\n sourcePath: string,\n dataFlow: z.infer<typeof registrationRequestSchema>[\"dataFlow\"],\n ): Promise<string | undefined> {\n if (dataFlow === undefined) {\n return input.registry.register(sourcePath);\n }\n\n let fileId: string | undefined;\n const previous = registrationQueues.get(sourcePath) ?? Promise.resolve();\n const current = previous\n .catch(() => undefined)\n .then(async () => {\n const currentSource = await readFile(sourcePath, \"utf8\");\n if (createDataFlowSourceVersion(currentSource) !== dataFlow.sourceVersion) {\n return;\n }\n fileId = input.registry.registerDataFlowComponents(\n sourcePath,\n dataFlow.sourceVersion,\n dataFlow.components,\n );\n });\n registrationQueues.set(sourcePath, current);\n await current.finally(() => {\n if (registrationQueues.get(sourcePath) === current) {\n registrationQueues.delete(sourcePath);\n }\n });\n return fileId;\n }\n\n const handler: SourceRegistrationHandler = (request, response) => {\n const handle = async (): Promise<void> => {\n const contentType = getSingleHeader(request, \"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase();\n\n if (\n request.method !== \"POST\" ||\n contentType !== \"application/json\" ||\n !requestComesFromLoopbackWorker(request) ||\n !identitiesMatch(\n getSingleHeader(request, INTERNAL_SECRET_HEADER),\n input.internalSecret,\n )\n ) {\n writeJson(response, 403, { ok: false });\n return;\n }\n\n const parsed = registrationRequestSchema.safeParse(\n await readJsonRequestBody(request, REGISTRATION_BODY_LIMIT_BYTES),\n );\n\n if (!parsed.success || parsed.data.epoch !== input.registryEpoch) {\n writeJson(response, 400, { ok: false });\n return;\n }\n\n const sourcePath = await resolveAuthorizedSource(\n root,\n parsed.data.resourcePath,\n (absolutePath) =>\n parsed.data.dataFlow === undefined\n ? sourceFilter.shouldTransform(absolutePath, \"<\")\n : dataFlowFilter.shouldTransform(absolutePath, \"\"),\n );\n\n if (sourcePath === undefined) {\n writeJson(response, 403, { ok: false });\n return;\n }\n\n const fileId = await registerCurrentSource(sourcePath, parsed.data.dataFlow);\n if (fileId === undefined) {\n writeJson(response, 409, { ok: false });\n return;\n }\n\n writeJson(response, 200, { epoch: input.registryEpoch, fileId });\n };\n\n void handle().catch(() => {\n if (!response.headersSent) {\n writeJson(response, 400, { ok: false });\n } else {\n response.destroy();\n }\n });\n };\n\n return Object.freeze({ handler, root });\n}\n","import { randomBytes } from \"node:crypto\";\n\nexport interface SpotPatchSession {\n readonly id: string;\n readonly token: string;\n}\n\nexport function createSession(): SpotPatchSession {\n return Object.freeze({\n id: randomBytes(16).toString(\"base64url\"),\n token: randomBytes(16).toString(\"base64url\"),\n });\n}\n","import type {\n AiOptions,\n ContextBudget,\n ContextualAskOptions,\n ResolvedAiOptions,\n SpotPatchEditorPreference,\n SpotPatchLocalePreference,\n} from \"@spotpatch/shared\";\n\nimport {\n resolveOptions,\n type FilterEntry,\n type ResolvedSpotPatchOptions,\n type SpotPatchDataFlowOptions,\n} from \"./options.js\";\n\ninterface SerializedStringFilter {\n readonly kind: \"string\";\n readonly value: string;\n}\n\ninterface SerializedRegExpFilter {\n readonly flags: string;\n readonly kind: \"regexp\";\n readonly source: string;\n}\n\nexport type SerializedFilterEntry = SerializedRegExpFilter | SerializedStringFilter;\n\nexport interface SerializedSpotPatchOptions {\n readonly ai: false | AiOptions;\n readonly allowLan: boolean;\n readonly budget: Readonly<ContextBudget>;\n readonly debug: boolean;\n readonly dataFlow: false | SpotPatchDataFlowOptions;\n readonly contextualAsk: ContextualAskOptions;\n readonly editor: SpotPatchEditorPreference;\n readonly enabled: boolean;\n readonly externalAgent: boolean;\n readonly exclude: readonly SerializedFilterEntry[];\n readonly include: readonly SerializedFilterEntry[];\n readonly locale: SpotPatchLocalePreference;\n readonly maxTargets: number;\n readonly redact: boolean;\n readonly shortcut: string;\n}\n\nconst OPTION_KEYS = Object.freeze([\n \"ai\",\n \"allowLan\",\n \"budget\",\n \"debug\",\n \"dataFlow\",\n \"contextualAsk\",\n \"editor\",\n \"enabled\",\n \"externalAgent\",\n \"exclude\",\n \"include\",\n \"locale\",\n \"maxTargets\",\n \"redact\",\n \"shortcut\",\n] as const);\nconst BUDGET_KEYS = Object.freeze([\n \"totalCharacters\",\n \"domCharacters\",\n \"cssCharacters\",\n \"codeCharacters\",\n \"maxCodeLines\",\n \"maxComponentDepth\",\n] as const);\nconst REGEXP_FLAGS_PATTERN = /^(?!.*(.).*\\1)[dgimsuvy]*$/u;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(\n value: Readonly<Record<string, unknown>>,\n keys: readonly string[],\n): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...keys].sort();\n return (\n actual.length === expected.length &&\n actual.every((key, index) => key === expected[index])\n );\n}\n\nfunction serializeFilter(entry: FilterEntry): SerializedFilterEntry {\n return typeof entry === \"string\"\n ? Object.freeze({ kind: \"string\", value: entry })\n : Object.freeze({\n flags: entry.flags,\n kind: \"regexp\",\n source: entry.source,\n });\n}\n\nfunction serializeAiOptions(options: ResolvedAiOptions): AiOptions {\n return Object.freeze({\n providers: Object.freeze(\n Object.fromEntries(\n Object.entries(options.providers).map(([id, provider]) => [\n id,\n Object.freeze({\n type: provider.type,\n label: provider.label,\n protocol: provider.protocol,\n authentication: provider.authentication,\n baseURL: provider.baseURL,\n apiKeyEnv: provider.apiKeyEnv,\n models: Object.freeze(\n Object.fromEntries(\n Object.entries(provider.models).map(([modelId, model]) => [\n modelId,\n Object.freeze({ label: model.label, model: model.model }),\n ]),\n ),\n ),\n defaultModel: provider.defaultModel,\n }),\n ]),\n ),\n ),\n defaultProvider: options.defaultProvider,\n execution: Object.freeze({\n isolation: options.execution.isolation,\n applyMode: options.execution.applyMode,\n checks: Object.freeze(\n Object.fromEntries(\n Object.entries(options.execution.checks).map(([id, check]) => [\n id,\n Object.freeze({\n label: check.label,\n command: check.command,\n args: check.args,\n required: check.required,\n timeoutMs: check.timeoutMs,\n }),\n ]),\n ),\n ),\n limits: options.execution.limits,\n }),\n });\n}\n\nexport function serializeResolvedSpotPatchOptions(\n options: ResolvedSpotPatchOptions,\n): SerializedSpotPatchOptions {\n return Object.freeze({\n ai: options.ai === false ? false : serializeAiOptions(options.ai),\n allowLan: options.allowLan,\n budget: options.budget,\n debug: options.debug,\n dataFlow: options.dataFlow.enabled\n ? Object.freeze({\n runtime: options.dataFlow.runtime,\n })\n : false,\n contextualAsk: options.contextualAsk.enabled\n ? Object.freeze({\n ...(options.contextualAsk.defaultExecutor === undefined\n ? {}\n : { defaultExecutor: options.contextualAsk.defaultExecutor }),\n })\n : false,\n editor: options.editor,\n enabled: options.enabled,\n externalAgent: options.externalAgent.enabled,\n exclude: Object.freeze(options.exclude.map(serializeFilter)),\n include: Object.freeze(options.include.map(serializeFilter)),\n locale: options.locale,\n maxTargets: options.maxTargets,\n redact: options.redact,\n shortcut: options.shortcut,\n });\n}\n\nfunction parseFilterList(value: unknown): readonly FilterEntry[] {\n if (!Array.isArray(value) || value.length > 256) {\n throw new TypeError(\"The SpotPatch filter transport is invalid.\");\n }\n\n return Object.freeze(\n value.map((entry: unknown): FilterEntry => {\n if (!isRecord(entry)) {\n throw new TypeError(\"The SpotPatch filter transport is invalid.\");\n }\n\n if (\n entry.kind === \"string\" &&\n hasExactKeys(entry, [\"kind\", \"value\"]) &&\n typeof entry.value === \"string\" &&\n entry.value.length > 0 &&\n entry.value.length <= 1_024 &&\n !entry.value.includes(\"\\0\")\n ) {\n return entry.value;\n }\n\n if (\n entry.kind === \"regexp\" &&\n hasExactKeys(entry, [\"flags\", \"kind\", \"source\"]) &&\n typeof entry.source === \"string\" &&\n entry.source.length <= 1_024 &&\n typeof entry.flags === \"string\" &&\n REGEXP_FLAGS_PATTERN.test(entry.flags)\n ) {\n try {\n return new RegExp(entry.source, entry.flags);\n } catch {\n throw new TypeError(\"The SpotPatch filter transport is invalid.\");\n }\n }\n\n throw new TypeError(\"The SpotPatch filter transport is invalid.\");\n }),\n );\n}\n\nfunction parseBudget(value: unknown): Readonly<ContextBudget> {\n if (!isRecord(value) || !hasExactKeys(value, BUDGET_KEYS)) {\n throw new TypeError(\"The SpotPatch budget transport is invalid.\");\n }\n\n const budget = Object.fromEntries(\n BUDGET_KEYS.map((key) => [key, value[key]]),\n ) as unknown as ContextBudget;\n\n return Object.freeze(budget);\n}\n\nfunction parseDataFlow(value: unknown): false | SpotPatchDataFlowOptions {\n if (value === false) return false;\n\n if (\n !isRecord(value) ||\n !hasExactKeys(value, [\"runtime\"]) ||\n value.runtime !== \"dispatch\"\n ) {\n throw new TypeError(\"The SpotPatch data-flow transport is invalid.\");\n }\n\n return Object.freeze({\n runtime: value.runtime,\n });\n}\n\nfunction parseContextualAsk(value: unknown): ContextualAskOptions {\n if (value === false || value === true) return value;\n if (!isRecord(value)) {\n throw new TypeError(\"The SpotPatch contextual Ask transport is invalid.\");\n }\n const keys = Object.keys(value);\n if (keys.length === 0) return Object.freeze({});\n if (!hasExactKeys(value, [\"defaultExecutor\"]) || !isRecord(value.defaultExecutor)) {\n throw new TypeError(\"The SpotPatch contextual Ask transport is invalid.\");\n }\n const preference = value.defaultExecutor;\n if (\n (preference.kind === \"managed-codex\" || preference.kind === \"claude-code\") &&\n hasExactKeys(preference, [\"kind\"])\n ) {\n return Object.freeze({\n defaultExecutor: Object.freeze({ kind: preference.kind }),\n });\n }\n if (\n preference.kind === \"configured-key\" &&\n hasExactKeys(preference, [\"kind\", \"modelProfileId\", \"providerProfileId\"]) &&\n typeof preference.providerProfileId === \"string\" &&\n typeof preference.modelProfileId === \"string\"\n ) {\n return Object.freeze({\n defaultExecutor: Object.freeze({\n kind: \"configured-key\",\n providerProfileId: preference.providerProfileId,\n modelProfileId: preference.modelProfileId,\n }),\n });\n }\n throw new TypeError(\"The SpotPatch contextual Ask transport is invalid.\");\n}\n\nexport function parseSerializedSpotPatchOptions(\n value: unknown,\n): ResolvedSpotPatchOptions {\n if (!isRecord(value) || !hasExactKeys(value, OPTION_KEYS)) {\n throw new TypeError(\"The SpotPatch options transport is invalid.\");\n }\n\n if (\n typeof value.enabled !== \"boolean\" ||\n typeof value.externalAgent !== \"boolean\" ||\n typeof value.redact !== \"boolean\" ||\n typeof value.allowLan !== \"boolean\" ||\n typeof value.debug !== \"boolean\" ||\n typeof value.shortcut !== \"string\" ||\n typeof value.maxTargets !== \"number\" ||\n typeof value.editor !== \"string\" ||\n typeof value.locale !== \"string\" ||\n (value.ai !== false && !isRecord(value.ai))\n ) {\n throw new TypeError(\"The SpotPatch options transport is invalid.\");\n }\n\n try {\n return resolveOptions({\n ai: value.ai as AiOptions | false,\n allowLan: value.allowLan,\n budget: parseBudget(value.budget),\n debug: value.debug,\n dataFlow: parseDataFlow(value.dataFlow),\n contextualAsk: parseContextualAsk(value.contextualAsk),\n editor: value.editor as SpotPatchEditorPreference,\n enabled: value.enabled,\n externalAgent: value.externalAgent,\n exclude: parseFilterList(value.exclude),\n include: parseFilterList(value.include),\n locale: value.locale as SpotPatchLocalePreference,\n maxTargets: value.maxTargets,\n redact: value.redact,\n shortcut: value.shortcut,\n });\n } catch (error: unknown) {\n throw new TypeError(\"The SpotPatch options transport is invalid.\", {\n cause: error,\n });\n }\n}\n","import type { ExternalHandoffFramework } from \"@spotpatch/shared\";\n\nimport { createAgentJobManager } from \"./agent/job-manager.js\";\nimport { createWorkspaceActivityCoordinator } from \"./workspace/activity-coordinator.js\";\nimport { createConfiguredKeyAskExecutors } from \"./contextual-ask/configured-key-executors.js\";\nimport {\n composeContextualAskExecutors,\n type ManagedAskExecutors,\n} from \"./contextual-ask/executors.js\";\nimport {\n createContextualAskManager,\n type CreateContextualAskManagerOptions,\n} from \"./contextual-ask/manager.js\";\nimport type { ExternalAgentControlPort } from \"./external-agent/control-port.js\";\nimport { createExternalHandoffService } from \"./external-handoff/service.js\";\nimport {\n resolveManagedExecutionValidation,\n type ResolvedManagedExecutionValidation,\n} from \"./project-validation.js\";\nimport {\n createSpotPatchMiddleware,\n type CreateMiddlewareOptions,\n type SpotPatchMiddleware,\n} from \"./server/middleware.js\";\n\nexport interface DevelopmentSessionInput extends Omit<\n CreateMiddlewareOptions,\n | \"agentManager\"\n | \"contextualAskManager\"\n | \"externalAgentControl\"\n | \"externalHandoffService\"\n> {\n readonly framework: ExternalHandoffFramework;\n readonly resolveSourceImports?: CreateContextualAskManagerOptions[\"resolveSourceImports\"];\n readonly environment: Readonly<Record<string, string | undefined>>;\n readonly executionRoot?: string;\n readonly createManagedAskExecutors: () => ManagedAskExecutors;\n readonly createExternalAgentControl: (\n validation: ResolvedManagedExecutionValidation,\n ) => Promise<ExternalAgentControlPort>;\n readonly resolveValidation?: () => Promise<ResolvedManagedExecutionValidation>;\n}\n\nexport interface DevelopmentSession {\n readonly middleware: SpotPatchMiddleware;\n readonly close: () => Promise<void>;\n}\n\n/** Owns feature services, not HTTP listeners or framework-specific transports. */\nexport async function createDevelopmentSession(\n input: DevelopmentSessionInput,\n): Promise<DevelopmentSession> {\n const cleanups: (() => void | Promise<void>)[] = [\n () => {\n input.registry.clear();\n },\n ];\n let closing: Promise<void> | undefined;\n const close = (): Promise<void> =>\n (closing ??= (async () => {\n const errors: unknown[] = [];\n // Stop consumers before their dependencies, including after partial startup.\n for (const cleanup of cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0)\n throw new AggregateError(errors, \"SpotPatch service cleanup failed.\");\n })());\n const warn = (message: string): void => {\n input.logger?.warn(`[spotpatch:${input.framework}] ${message}`);\n };\n try {\n const { options, root, registry } = input;\n const coordinator = createWorkspaceActivityCoordinator();\n const agentManager =\n options.ai === false\n ? undefined\n : createAgentJobManager({\n ai: options.ai,\n environment: input.environment,\n root: input.executionRoot ?? root,\n coordinator,\n });\n if (agentManager !== undefined) cleanups.push(() => agentManager.close());\n const preference =\n options.contextualAsk.defaultExecutor === undefined\n ? {}\n : { defaultExecutor: options.contextualAsk.defaultExecutor };\n const contextualAskManager = !options.contextualAsk.enabled\n ? undefined\n : createContextualAskManager({\n coordinator,\n enabled: true,\n registry,\n root,\n ...(input.resolveSourceImports === undefined\n ? {}\n : { resolveSourceImports: input.resolveSourceImports }),\n executors: composeContextualAskExecutors({\n configuredKey:\n options.ai === false\n ? []\n : createConfiguredKeyAskExecutors({\n ai: options.ai,\n environment: input.environment,\n ...preference,\n }),\n managed: input.createManagedAskExecutors(),\n ...preference,\n }),\n });\n if (contextualAskManager !== undefined)\n cleanups.push(() => contextualAskManager.close());\n const externalHandoffService = !options.externalAgent.enabled\n ? undefined\n : createExternalHandoffService({\n framework: input.framework,\n root,\n sessionId: input.session.id,\n });\n let externalAgentControl: ExternalAgentControlPort | undefined;\n if (externalHandoffService !== undefined) {\n cleanups.push(() => externalHandoffService.close());\n try {\n await externalHandoffService.start();\n } catch {\n warn(\"External Agent handoff is unavailable; core tools remain active.\");\n }\n if (externalHandoffService.capability().brokerReady) {\n try {\n const validation = await (input.resolveValidation?.() ??\n resolveManagedExecutionValidation({ ai: options.ai, appRoot: root }));\n const control = await input.createExternalAgentControl(validation);\n externalAgentControl = control;\n cleanups.push(() => control.dispose());\n } catch {\n warn(\"Managed Agent control is unavailable; Inbox remains active.\");\n }\n }\n }\n const middleware = createSpotPatchMiddleware({\n options,\n root,\n registry,\n session: input.session,\n ...(input.projectDataFlowSource === undefined\n ? {}\n : { projectDataFlowSource: input.projectDataFlowSource }),\n ...(input.bootstrap === undefined ? {} : { bootstrap: input.bootstrap }),\n ...(input.logger === undefined ? {} : { logger: input.logger }),\n ...(input.editorLauncher === undefined\n ? {}\n : { editorLauncher: input.editorLauncher }),\n ...(agentManager === undefined ? {} : { agentManager }),\n ...(contextualAskManager === undefined ? {} : { contextualAskManager }),\n ...(externalHandoffService === undefined ? {} : { externalHandoffService }),\n ...(externalAgentControl === undefined ? {} : { externalAgentControl }),\n });\n cleanups.push(() => {\n middleware.dispose();\n });\n return Object.freeze({ middleware, close });\n } catch (error) {\n try {\n await close();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n \"SpotPatch service startup and cleanup failed.\",\n );\n }\n throw error;\n }\n}\n"],"mappings":"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","names":["import_shared","import_external_agent_node","import_node_crypto","import_shared","import_node_crypto","import_shared","import_shared","normalizeError","snapshot","import_node_crypto","import_shared","import_external_agent_node","path","import_node_crypto","import_node_crypto","import_shared","defaultRandomId","snapshot","fingerprint","fingerprint","import_node_crypto","import_promises","import_node_path","path","import_shared","import_promises","import_node_path","import_shared","path","import_node_path","import_node_crypto","path","import_node_crypto","import_shared","import_agent","import_node_crypto","import_promises","import_node_path","import_shared","path","snapshot","DEFAULT_DEPENDENCIES","snapshot","import_agent","import_shared","import_shared","writeJson","import_shared","import_promises","import_node_path","import_shared","import_promises","import_node_path","import_shared","import_oxc_parser","import_promises","import_node_path","import_shared","path","path","path","path","parsed","import_shared","path","parsed","import_shared","import_shared","path","import_node_child_process","DEFAULT_DEPENDENCIES","launchEditor","import_node_crypto","import_shared","report","import_node_crypto","import_shared","tokensMatch","import_shared","getSingleHeader","STATUS_BY_ERROR","PUBLIC_MESSAGES","writeJson","writeError","path","import_node_crypto","import_promises","import_node_path","import_shared","import_zod","getSingleHeader","path","writeJson","import_node_crypto","isRecord"]}
|