@zigrivers/surface-mcp 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { pathToFileURL } from \"node:url\";\n\nimport {\n DEFAULT_COMPOSITION_STAGE_IDS,\n DEFAULT_SURFACE_CONFIG,\n createBoundedAlternatives,\n createTrackedFinding,\n createSurfaceComposition,\n createSurfaceError,\n diffTrackedFindings,\n err,\n instantiateLensExecutionPlan,\n isOk,\n ok,\n scoreFinding,\n selectLensExecutionPlan,\n synthesizeBacklog,\n toMcpError,\n transitionTrackedFinding,\n type AlternativesReportData,\n type Evidence,\n type Finding,\n type TrackedFinding,\n type ValidationCheck,\n type Result,\n type SurfaceConfig,\n type SurfaceComposition,\n type SurfaceCompositionOptions,\n type SurfaceError,\n} from \"@zigrivers/surface-core\";\nimport type {\n Backlog,\n Baseline,\n Capture,\n GateResult,\n IssueExport,\n ProjectRunRecord,\n ProjectStateSnapshot,\n Target,\n} from \"@zigrivers/surface-core/interfaces\";\nimport { z } from \"zod\";\n\nexport const SURFACE_MCP_SERVER_NAME = \"surface\";\nexport const SURFACE_MCP_SERVER_VERSION = \"1.0.0\";\nexport const SURFACE_MCP_TOOL_SCHEMA_VERSION = \"1.0.0\";\n\nconst TOOL_ORDER = [\n \"surface_capture\",\n \"surface_audit\",\n \"surface_explain\",\n \"surface_backlog\",\n \"surface_gate\",\n \"surface_validate\",\n \"surface_baseline\",\n \"surface_verdict\",\n \"surface_diff\",\n \"surface_alternatives\",\n \"surface_trace\",\n \"surface_run\",\n \"surface_next\",\n \"surface_status\",\n] as const;\n\nexport type SurfaceMcpToolName = (typeof TOOL_ORDER)[number];\nexport type JsonSchema = Record<string, unknown>;\n\nexport type SurfaceMcpToolDefinition = {\n readonly name: SurfaceMcpToolName;\n readonly title: string;\n readonly description: string;\n readonly schemaVersion: string;\n readonly inputSchema: JsonSchema;\n};\n\ntype InternalSurfaceMcpToolDefinition = SurfaceMcpToolDefinition & {\n readonly inputZodSchema: z.ZodType;\n};\n\nexport type SurfaceMcpToolRegistry = {\n readonly serverInfo: {\n readonly name: typeof SURFACE_MCP_SERVER_NAME;\n readonly version: typeof SURFACE_MCP_SERVER_VERSION;\n };\n listTools(): readonly SurfaceMcpToolDefinition[];\n getTool(name: SurfaceMcpToolName): SurfaceMcpToolDefinition | undefined;\n};\n\nexport type SurfaceMcpServer = {\n readonly composition: SurfaceComposition;\n readonly registry: SurfaceMcpToolRegistry;\n callTool<TName extends SurfaceMcpToolName>(\n name: TName,\n input: unknown,\n ): Promise<Result<SurfaceMcpToolOutputMap[TName]>>;\n listTools(): readonly SurfaceMcpToolDefinition[];\n};\n\nexport type SurfaceMcpServerOptions = SurfaceCompositionOptions & {\n readonly composition?: SurfaceComposition;\n};\n\nexport type McpToolSchemaCompatibilityInput = {\n readonly current: Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">;\n readonly next: Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">;\n};\n\nexport type SurfaceMcpAuditOutput = {\n readonly runId: string;\n readonly backlog: Backlog;\n readonly capture: Capture;\n readonly findings: readonly Finding[];\n readonly skippedLenses: readonly {\n readonly lensId: string;\n readonly message: string;\n readonly reason: string;\n }[];\n};\n\nexport type SurfaceMcpExplainOutput = {\n readonly finding: Finding;\n readonly rationale: string;\n readonly evidence: readonly Evidence[];\n};\n\nexport type SurfaceMcpStatusOutput = {\n readonly currentStage: string;\n readonly progress: {\n readonly completedRuns: number;\n readonly failedRuns: number;\n readonly findings: number;\n };\n readonly runHistory: readonly {\n readonly runId: string;\n readonly status: \"completed\" | \"failed\";\n readonly target?: Target;\n readonly findings: number;\n }[];\n};\n\nexport type SurfaceMcpValidationOutput = {\n readonly checks: readonly {\n readonly id: string;\n readonly findingId?: string;\n readonly passed: boolean;\n readonly validation: ValidationCheck;\n }[];\n};\n\nexport type SurfaceMcpBaselineOutput = {\n readonly baselineId: string;\n readonly count: number;\n readonly reason?: string;\n};\n\nexport type SurfaceMcpVerdictOutput = {\n readonly findingId: string;\n readonly decision: \"accept\" | \"reject\" | \"correct\" | \"defer\";\n readonly rationale: string;\n};\n\nexport type SurfaceMcpDiffOutput = {\n readonly resolved: readonly SurfaceMcpDiffEntry[];\n readonly regressed: readonly SurfaceMcpDiffEntry[];\n readonly introduced: readonly SurfaceMcpDiffEntry[];\n readonly stillFailing: readonly SurfaceMcpDiffEntry[];\n readonly identityBroken: readonly SurfaceMcpDiffEntry[];\n};\n\nexport type SurfaceMcpDiffEntry = {\n readonly findingId?: string;\n readonly identityKey: string;\n readonly status: TrackedFinding[\"status\"];\n};\n\nexport type SurfaceMcpTraceOutput = {\n readonly trackedFinding: TrackedFinding;\n};\n\nexport type SurfaceMcpAlternativesOutput = {\n readonly alternatives: AlternativesReportData;\n};\n\nexport type SurfaceMcpRunOutput = {\n readonly runId: string;\n readonly stage: string;\n readonly status: \"completed\";\n};\n\nexport type SurfaceMcpNextOutput = {\n readonly eligible: readonly string[];\n};\n\nexport type SurfaceMcpToolOutputMap = {\n readonly surface_capture: Capture;\n readonly surface_audit: SurfaceMcpAuditOutput;\n readonly surface_explain: SurfaceMcpExplainOutput;\n readonly surface_backlog: Backlog | IssueExport;\n readonly surface_status: SurfaceMcpStatusOutput;\n readonly surface_gate: GateResult;\n readonly surface_validate: SurfaceMcpValidationOutput;\n readonly surface_baseline: SurfaceMcpBaselineOutput;\n readonly surface_verdict: SurfaceMcpVerdictOutput;\n readonly surface_diff: SurfaceMcpDiffOutput;\n readonly surface_alternatives: SurfaceMcpAlternativesOutput;\n readonly surface_trace: SurfaceMcpTraceOutput;\n readonly surface_run: SurfaceMcpRunOutput;\n readonly surface_next: SurfaceMcpNextOutput;\n};\n\nexport type SurfaceMcpToolOutput = SurfaceMcpToolOutputMap[SurfaceMcpToolName];\n\nconst TargetSchema = z\n .object({\n kind: z.enum([\"url\", \"localhost\", \"route\", \"screenshot\", \"component\", \"dom\"]),\n ref: z.string().min(1),\n theme: z.enum([\"light\", \"dark\"]).optional(),\n viewport: z\n .object({\n height: z.number().int().positive(),\n label: z.enum([\"mobile\", \"tablet\", \"desktop\"]),\n width: z.number().int().positive(),\n })\n .strict()\n .optional(),\n })\n .strict();\nconst AuthStateRefSchema = z.string().min(1);\nconst RunRefSchema = z.object({ runId: z.string().min(1) }).strict();\nconst GatePolicyInputSchema = z.record(z.string(), z.unknown());\ntype ExecutablePipelineStageId = (typeof DEFAULT_COMPOSITION_STAGE_IDS)[number];\n\nconst TOOL_INPUT_SCHEMAS = {\n surface_capture: z\n .object({\n authState: AuthStateRefSchema.optional(),\n target: TargetSchema,\n })\n .strict(),\n surface_audit: z\n .object({\n authState: AuthStateRefSchema.optional(),\n depth: z\n .union([z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5)])\n .optional(),\n persona: z.string().min(1).optional(),\n preset: z.string().min(1).optional(),\n target: TargetSchema,\n task: z.string().min(1).optional(),\n })\n .strict(),\n surface_explain: z.object({ findingId: z.string().min(1) }).strict(),\n surface_backlog: z\n .object({\n exportTarget: z.string().min(1).optional(),\n runId: z.string().min(1).optional(),\n })\n .strict(),\n surface_gate: z\n .object({\n policy: GatePolicyInputSchema.optional(),\n runId: z.string().min(1).optional(),\n })\n .strict(),\n surface_validate: z.object({ runId: z.string().min(1) }).strict(),\n surface_baseline: z.object({ reason: z.string().min(1).optional() }).strict(),\n surface_verdict: z\n .object({\n decision: z.enum([\"accept\", \"reject\", \"correct\", \"defer\"]),\n findingId: z.string().min(1),\n rationale: z.string().min(1),\n })\n .strict(),\n surface_diff: z.object({ after: RunRefSchema, before: RunRefSchema }).strict(),\n surface_alternatives: z\n .object({\n authState: AuthStateRefSchema.optional(),\n target: TargetSchema,\n })\n .strict(),\n surface_trace: z.object({ findingId: z.string().min(1) }).strict(),\n surface_run: z\n .object({\n step: z.string().min(1),\n target: TargetSchema.optional(),\n })\n .strict(),\n surface_next: z.object({}).strict(),\n surface_status: z.object({}).strict(),\n} as const satisfies Record<SurfaceMcpToolName, z.ZodType>;\n\nconst TOOL_METADATA = {\n surface_capture: {\n title: \"Capture Target\",\n description: \"Capture a target into Surface artifacts.\",\n },\n surface_audit: {\n title: \"Audit Target\",\n description: \"Run a Surface audit over a target.\",\n },\n surface_explain: {\n title: \"Explain Finding\",\n description: \"Explain one Surface finding with evidence.\",\n },\n surface_backlog: {\n title: \"Read Backlog\",\n description: \"Return or export the implementation backlog.\",\n },\n surface_gate: {\n title: \"Evaluate Gate\",\n description: \"Evaluate the configured Surface quality gate.\",\n },\n surface_validate: {\n title: \"Validate Run\",\n description: \"Run validation checks for an audit run.\",\n },\n surface_baseline: {\n title: \"Create Baseline\",\n description: \"Baseline current findings for future gate comparisons.\",\n },\n surface_verdict: {\n title: \"Record Verdict\",\n description: \"Record a human verdict for a finding.\",\n },\n surface_diff: {\n title: \"Diff Runs\",\n description: \"Compare findings across two audit runs.\",\n },\n surface_alternatives: {\n title: \"Suggest Alternatives\",\n description: \"Suggest bounded alternatives for a target.\",\n },\n surface_trace: {\n title: \"Trace Finding\",\n description: \"Trace a finding through closed-loop state.\",\n },\n surface_run: {\n title: \"Run Pipeline Step\",\n description: \"Run a Surface pipeline step.\",\n },\n surface_next: {\n title: \"List Next Steps\",\n description: \"List eligible Surface pipeline steps.\",\n },\n surface_status: {\n title: \"Read Status\",\n description: \"Read Surface project status.\",\n },\n} as const satisfies Record<\n SurfaceMcpToolName,\n { readonly title: string; readonly description: string }\n>;\n\nconst INTERNAL_TOOLS = TOOL_ORDER.map((name) => {\n const metadata = TOOL_METADATA[name];\n const inputZodSchema = TOOL_INPUT_SCHEMAS[name];\n\n return {\n name,\n ...metadata,\n inputZodSchema,\n inputSchema: z.toJSONSchema(inputZodSchema),\n schemaVersion: SURFACE_MCP_TOOL_SCHEMA_VERSION,\n };\n}) satisfies readonly InternalSurfaceMcpToolDefinition[];\n\nexport function createSurfaceMcpToolRegistry(): SurfaceMcpToolRegistry {\n const toolsByName = new Map<SurfaceMcpToolName, InternalSurfaceMcpToolDefinition>(\n INTERNAL_TOOLS.map((tool) => [tool.name, tool]),\n );\n\n return {\n serverInfo: {\n name: SURFACE_MCP_SERVER_NAME,\n version: SURFACE_MCP_SERVER_VERSION,\n },\n getTool: (name) => {\n const tool = toolsByName.get(name);\n\n return tool === undefined ? undefined : publicToolDefinition(tool);\n },\n listTools: () => INTERNAL_TOOLS.map(publicToolDefinition),\n };\n}\n\nexport function createSurfaceMcpServer(options: SurfaceMcpServerOptions = {}): SurfaceMcpServer {\n const registry = createSurfaceMcpToolRegistry();\n const composition = options.composition ?? createSurfaceComposition(options);\n const session = createSurfaceMcpSessionState();\n\n return {\n composition,\n callTool: async (name, input) => {\n const hydrated = await hydrateSurfaceMcpSession(composition, session);\n\n if (!hydrated.ok) {\n return hydrated;\n }\n\n return (await callSurfaceMcpTool({\n composition,\n input,\n name,\n session,\n })) as Result<SurfaceMcpToolOutputMap[typeof name]>;\n },\n registry,\n listTools: () => registry.listTools(),\n };\n}\n\nexport function createMcpToolSchemaSnapshot(\n registry: SurfaceMcpToolRegistry = createSurfaceMcpToolRegistry(),\n): readonly Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">[] {\n return registry.listTools().map((tool) => ({\n inputSchema: tool.inputSchema,\n name: tool.name,\n schemaVersion: tool.schemaVersion,\n }));\n}\n\nexport function assertMcpToolSchemaCompatibility(\n input: McpToolSchemaCompatibilityInput,\n): Result<true, SurfaceError> {\n if (input.current.name !== input.next.name) {\n return mcpSchemaIncompatible(\n \"MCP tool names cannot change without a major version bump.\",\n input,\n );\n }\n\n if (!hasMajorVersionIncrement(input.current.schemaVersion, input.next.schemaVersion)) {\n const currentRequired = requiredFields(input.current.inputSchema);\n const nextRequired = requiredFields(input.next.inputSchema);\n const addedRequired = [...nextRequired].filter((field) => !currentRequired.has(field));\n\n if (addedRequired.length > 0) {\n return mcpSchemaIncompatible(\n \"MCP tool schema added required fields without a major version bump.\",\n input,\n { addedRequired },\n );\n }\n }\n\n return ok(true);\n}\n\ntype SurfaceMcpSessionState = {\n readonly baselines: Map<string, SurfaceMcpBaselineRecord>;\n readonly baselineOrder: string[];\n readonly runs: Map<string, SurfaceMcpRunRecord>;\n readonly runOrder: string[];\n readonly trackedByIdentity: Map<string, TrackedFinding>;\n readonly verdicts: Map<string, SurfaceMcpVerdictOutput>;\n nextBaselineSequence: number;\n nextRunSequence: number;\n};\n\ntype SurfaceMcpRunRecord = {\n readonly runId: string;\n readonly status: \"completed\" | \"failed\";\n readonly backlog: Backlog;\n readonly capture: Capture;\n readonly findings: readonly Finding[];\n readonly skippedLenses: SurfaceMcpAuditOutput[\"skippedLenses\"];\n readonly trackedFindings: readonly TrackedFinding[];\n};\n\ntype SurfaceMcpBaselineRecord = {\n readonly baselineId: string;\n readonly identityKeys: ReadonlySet<string>;\n readonly reason?: string;\n};\n\ntype CallSurfaceMcpToolInput = {\n readonly composition: SurfaceComposition;\n readonly input: unknown;\n readonly name: SurfaceMcpToolName;\n readonly session: SurfaceMcpSessionState;\n};\n\nfunction createSurfaceMcpSessionState(): SurfaceMcpSessionState {\n return {\n baselines: new Map(),\n baselineOrder: [],\n runs: new Map(),\n runOrder: [],\n trackedByIdentity: new Map(),\n verdicts: new Map(),\n nextBaselineSequence: 1,\n nextRunSequence: 1,\n };\n}\n\nasync function hydrateSurfaceMcpSession(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n): Promise<Result<void>> {\n const state = await composition.stateStore.readState();\n\n if (!state.ok) {\n return state;\n }\n\n resetSurfaceMcpSessionFromState(session, state.value);\n\n return ok(undefined);\n}\n\nfunction resetSurfaceMcpSessionFromState(\n session: SurfaceMcpSessionState,\n state: ProjectStateSnapshot,\n): void {\n session.baselines.clear();\n session.baselineOrder.length = 0;\n session.runs.clear();\n session.runOrder.length = 0;\n session.trackedByIdentity.clear();\n session.verdicts.clear();\n\n for (const trackedFinding of state.trackedFindings ?? []) {\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n }\n\n for (const record of state.runRecords ?? []) {\n const mcpRecord = surfaceMcpRunRecordFromProjectRecord(record);\n\n if (mcpRecord === undefined) {\n continue;\n }\n\n session.runs.set(mcpRecord.runId, mcpRecord);\n session.runOrder.push(mcpRecord.runId);\n\n for (const trackedFinding of mcpRecord.trackedFindings) {\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n }\n }\n\n for (const baseline of state.baselines ?? []) {\n const mcpBaseline = surfaceMcpBaselineFromProjectBaseline(baseline);\n session.baselines.set(mcpBaseline.baselineId, mcpBaseline);\n session.baselineOrder.push(mcpBaseline.baselineId);\n }\n\n for (const verdict of state.verdicts ?? []) {\n if (isSurfaceMcpVerdict(verdict)) {\n session.verdicts.set(verdict.findingId, verdict);\n }\n }\n\n session.nextRunSequence = nextSequenceFromIds(session.runOrder, \"run_mcp_\");\n session.nextBaselineSequence = nextSequenceFromIds(session.baselineOrder, \"baseline_mcp_\");\n}\n\nfunction surfaceMcpRunRecordFromProjectRecord(\n record: ProjectRunRecord,\n): SurfaceMcpRunRecord | undefined {\n if (\n record.backlog === undefined ||\n record.capture === undefined ||\n record.findings === undefined ||\n record.status === undefined ||\n record.skippedLenses === undefined\n ) {\n return undefined;\n }\n\n return {\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n status: record.status,\n trackedFindings: record.trackedFindings,\n };\n}\n\nfunction surfaceMcpBaselineFromProjectBaseline(baseline: Baseline): SurfaceMcpBaselineRecord {\n return {\n baselineId: baseline.baselineId,\n identityKeys: new Set(baseline.identityKeys),\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n };\n}\n\nfunction isSurfaceMcpVerdict(verdict: {\n readonly decision: string;\n readonly findingId: string;\n readonly rationale: string;\n}): verdict is SurfaceMcpVerdictOutput {\n return (\n verdict.decision === \"accept\" ||\n verdict.decision === \"reject\" ||\n verdict.decision === \"correct\" ||\n verdict.decision === \"defer\"\n );\n}\n\nasync function persistSurfaceMcpSession(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n): Promise<Result<void>> {\n const updateState = stateSnapshotForMcpSession(session);\n\n if (composition.stateStore.updateState !== undefined) {\n const updated = await composition.stateStore.updateState(updateState);\n\n return updated.ok ? ok(undefined) : updated;\n }\n\n const current = await composition.stateStore.readState();\n\n if (!current.ok) {\n return current;\n }\n\n const written = await composition.stateStore.writeState(updateState(current.value));\n\n return written.ok ? ok(undefined) : written;\n}\n\nfunction stateSnapshotForMcpSession(\n session: SurfaceMcpSessionState,\n): (state: ProjectStateSnapshot) => ProjectStateSnapshot {\n return (state) => {\n const runRecords = session.runOrder\n .map((runId) => session.runs.get(runId))\n .filter((record): record is SurfaceMcpRunRecord => record !== undefined)\n .map(projectRunRecordFromSurfaceMcpRecord);\n const latestRun = runRecords.at(-1);\n const baselines = session.baselineOrder\n .map((baselineId) => session.baselines.get(baselineId))\n .filter((baseline): baseline is SurfaceMcpBaselineRecord => baseline !== undefined)\n .map(projectBaselineFromSurfaceMcpBaseline);\n const trackedFindings = [...session.trackedByIdentity.values()];\n const verdicts = [...session.verdicts.values()];\n const currentStage = latestRun?.status ?? state.currentStage;\n\n return {\n ...state,\n ...(latestRun?.backlog === undefined ? {} : { backlog: latestRun.backlog }),\n ...(currentStage === undefined ? {} : { currentStage }),\n ...(latestRun?.findings === undefined ? {} : { findings: latestRun.findings }),\n baselines,\n runRecords,\n trackedFindings,\n verdicts,\n };\n };\n}\n\nfunction projectRunRecordFromSurfaceMcpRecord(record: SurfaceMcpRunRecord): ProjectRunRecord {\n return {\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n status: record.status,\n trackedFindings: record.trackedFindings,\n };\n}\n\nfunction projectBaselineFromSurfaceMcpBaseline(baseline: SurfaceMcpBaselineRecord): Baseline {\n return {\n baselineId: baseline.baselineId,\n identityKeys: [...baseline.identityKeys],\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n waivers: [],\n };\n}\n\nfunction nextSequenceFromIds(ids: readonly string[], prefix: string): number {\n let maxSequence = 0;\n\n for (const id of ids) {\n if (!id.startsWith(prefix)) {\n continue;\n }\n\n const sequence = Number.parseInt(id.slice(prefix.length), 10);\n\n if (Number.isInteger(sequence)) {\n maxSequence = Math.max(maxSequence, sequence);\n }\n }\n\n return maxSequence + 1;\n}\n\nasync function callSurfaceMcpTool(\n input: CallSurfaceMcpToolInput,\n): Promise<Result<SurfaceMcpToolOutput>> {\n switch (input.name) {\n case \"surface_capture\":\n return await callSurfaceCapture(input.composition, input.input);\n case \"surface_audit\":\n return await callSurfaceAudit(input.composition, input.session, input.input);\n case \"surface_explain\":\n return callSurfaceExplain(input.session, input.input);\n case \"surface_backlog\":\n return await callSurfaceBacklog(input.composition, input.session, input.input);\n case \"surface_gate\":\n return await callSurfaceGate(input.composition, input.session, input.input);\n case \"surface_validate\":\n return callSurfaceValidate(input.session, input.input);\n case \"surface_baseline\":\n return await callSurfaceBaseline(input.composition, input.session, input.input);\n case \"surface_verdict\":\n return await callSurfaceVerdict(input.composition, input.session, input.input);\n case \"surface_diff\":\n return callSurfaceDiff(input.session, input.input);\n case \"surface_alternatives\":\n return await callSurfaceAlternatives(input.composition, input.input);\n case \"surface_trace\":\n return callSurfaceTrace(input.session, input.input);\n case \"surface_run\":\n return await callSurfaceRun(input.composition, input.input);\n case \"surface_next\":\n return await callSurfaceNext(input.composition);\n case \"surface_status\":\n return callSurfaceStatus(input.session);\n }\n}\n\nasync function callSurfaceCapture(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<Capture>> {\n const parsed = parseToolInput(\"surface_capture\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n return await composition.captureService.capture(\n targetForCore(parsed.value.target),\n captureOptionsFor(DEFAULT_SURFACE_CONFIG, parsed.value.authState),\n );\n}\n\nasync function callSurfaceAudit(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpAuditOutput>> {\n const parsed = parseToolInput(\"surface_audit\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const config = configForAuditInput(parsed.value);\n const capture = await composition.captureService.capture(\n targetForCore(parsed.value.target),\n captureOptionsFor(config, parsed.value.authState),\n );\n\n if (!capture.ok) {\n return capture;\n }\n\n const evidence = await groundingEvidenceFor(composition, capture.value);\n\n if (!evidence.ok) {\n return evidence;\n }\n\n const plan = selectLensExecutionPlan({\n capture: capture.value,\n config,\n modelAvailability: {\n available: false,\n message: \"No MCP model provider is configured.\",\n reason: \"no-model-configured\",\n },\n registry: composition.lensRegistry,\n });\n const findings = await findingsForPlan(composition, config, capture.value, evidence.value, plan);\n\n if (!findings.ok) {\n return findings;\n }\n\n const runId = nextRunId(session);\n const backlog = synthesizeBacklog(runId, findings.value);\n\n if (!backlog.ok) {\n return backlog;\n }\n\n const trackedFindings = trackedFindingsForRun(session, runId, findings.value);\n\n const record: SurfaceMcpRunRecord = {\n backlog: backlog.value,\n capture: capture.value,\n findings: findings.value,\n runId,\n skippedLenses: plan.skipped,\n status: \"completed\",\n trackedFindings,\n };\n session.runs.set(runId, record);\n session.runOrder.push(runId);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok({\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n });\n}\n\nfunction callSurfaceExplain(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpExplainOutput> {\n const parsed = parseToolInput(\"surface_explain\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const finding = findStoredFinding(session, parsed.value.findingId);\n\n if (finding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No stored MCP finding matched the requested id.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n if (finding.evidence.length === 0) {\n return err(\n createSurfaceError(\"evidence_missing\", \"Stored MCP finding has no evidence to explain.\", {\n details: { findingId: finding.id },\n }),\n );\n }\n\n return ok({\n evidence: finding.evidence,\n finding,\n rationale: finding.rationale,\n });\n}\n\nasync function callSurfaceBacklog(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<Backlog | IssueExport>> {\n const parsed = parseToolInput(\"surface_backlog\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested backlog.\", {\n details: { runId: parsed.value.runId ?? null },\n }),\n );\n }\n\n if (parsed.value.exportTarget === undefined) {\n return ok(record.backlog);\n }\n\n const exporter = composition.issueExporters.find(\n (candidate) => candidate.target === parsed.value.exportTarget,\n );\n\n if (exporter === undefined) {\n return err(\n createSurfaceError(\n \"unknown_export_target\",\n \"No issue exporter matched the MCP backlog target.\",\n {\n details: { exportTarget: parsed.value.exportTarget },\n },\n ),\n );\n }\n\n const artifact = await composition.stateStore.writeArtifact({\n bytes: new TextEncoder().encode(JSON.stringify(record.backlog, null, 2)),\n kind: \"report\",\n relativePath: `reports/${record.runId}/backlog.json`,\n });\n\n if (!artifact.ok) {\n return artifact;\n }\n\n const exported = await exporter.export({\n backlogId: record.backlog.id,\n path: artifact.value.path,\n });\n\n if (!exported.ok) {\n return exported;\n }\n\n if (exported.value.status === \"partial\") {\n return err(\n createSurfaceError(\"export_partial\", \"MCP backlog export completed partially.\", {\n details: { exportId: exported.value.id, target: exported.value.target },\n }),\n );\n }\n\n return ok(exported.value);\n}\n\nasync function callSurfaceGate(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<GateResult>> {\n const parsed = parseToolInput(\"surface_gate\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested gate.\", {\n details: { runId: parsed.value.runId ?? null },\n }),\n );\n }\n\n const baseline = latestBaseline(session);\n const baselineIdentityKeys = baseline?.identityKeys ?? new Set<string>();\n const findings = record.findings.filter((finding) => {\n const tracked = trackedFindingForRunFinding(record, finding.id);\n\n return tracked === undefined || !baselineIdentityKeys.has(tracked.identityKey);\n });\n const policy =\n parsed.value.policy === undefined\n ? DEFAULT_SURFACE_CONFIG.reporting.gatePolicy\n : (parsed.value.policy as SurfaceConfig[\"reporting\"][\"gatePolicy\"]);\n\n return await composition.gateEvaluator.evaluate(findings, policy);\n}\n\nfunction callSurfaceValidate(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpValidationOutput> {\n const parsed = parseToolInput(\"surface_validate\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested validation.\", {\n details: { runId: parsed.value.runId },\n }),\n );\n }\n\n return ok({\n checks: record.trackedFindings.map((trackedFinding) => ({\n id: trackedFinding.identityKey,\n passed: trackedFinding.status !== \"identity-broken\",\n validation: trackedFinding.validation,\n ...(trackedFinding.currentFindingId === undefined\n ? {}\n : { findingId: trackedFinding.currentFindingId }),\n })),\n });\n}\n\nasync function callSurfaceBaseline(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpBaselineOutput>> {\n const parsed = parseToolInput(\"surface_baseline\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, undefined);\n\n if (record === undefined || record.trackedFindings.length === 0) {\n return err(\n createSurfaceError(\"no_findings_to_baseline\", \"No MCP findings are available to baseline.\"),\n );\n }\n\n const baselineId = nextBaselineId(session);\n const baseline: SurfaceMcpBaselineRecord = {\n baselineId,\n identityKeys: new Set(\n record.trackedFindings.map((trackedFinding) => trackedFinding.identityKey),\n ),\n ...(parsed.value.reason === undefined ? {} : { reason: parsed.value.reason }),\n };\n session.baselines.set(baselineId, baseline);\n session.baselineOrder.push(baselineId);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok({\n baselineId,\n count: baseline.identityKeys.size,\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n });\n}\n\nasync function callSurfaceVerdict(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpVerdictOutput>> {\n const parsed = parseToolInput(\"surface_verdict\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const finding = findStoredFinding(session, parsed.value.findingId);\n\n if (finding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No stored MCP finding matched the verdict.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n const verdict = {\n decision: parsed.value.decision,\n findingId: parsed.value.findingId,\n rationale: parsed.value.rationale,\n } satisfies SurfaceMcpVerdictOutput;\n session.verdicts.set(parsed.value.findingId, verdict);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok(verdict);\n}\n\nfunction callSurfaceDiff(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpDiffOutput> {\n const parsed = parseToolInput(\"surface_diff\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const before = runRecordFor(session, parsed.value.before.runId);\n const after = runRecordFor(session, parsed.value.after.runId);\n\n if (before === undefined || after === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"Both MCP diff runs must exist.\", {\n details: { after: parsed.value.after.runId, before: parsed.value.before.runId },\n }),\n );\n }\n\n return ok(diffTrackedFindings(before.trackedFindings, after.trackedFindings));\n}\n\nasync function callSurfaceAlternatives(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpAlternativesOutput>> {\n const parsed = parseToolInput(\"surface_alternatives\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const target = targetForCore(parsed.value.target);\n const capture = await composition.captureService.capture(\n target,\n captureOptionsFor(DEFAULT_SURFACE_CONFIG, parsed.value.authState),\n );\n\n if (!capture.ok) {\n return capture;\n }\n\n return ok({\n alternatives: createBoundedAlternatives(target),\n });\n}\n\nfunction callSurfaceTrace(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpTraceOutput> {\n const parsed = parseToolInput(\"surface_trace\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const trackedFinding = findStoredTrackedFinding(session, parsed.value.findingId);\n\n if (trackedFinding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No tracked MCP finding matched the requested id.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n return ok({ trackedFinding });\n}\n\nasync function callSurfaceRun(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpRunOutput>> {\n const parsed = parseToolInput(\"surface_run\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n if (parsed.value.step !== \"all\" && !isExecutableStageId(parsed.value.step)) {\n return err(\n createSurfaceError(\"unknown_step\", `Unknown MCP pipeline step \"${parsed.value.step}\".`, {\n details: { step: parsed.value.step },\n }),\n );\n }\n\n const runId = nextMcpPipelineRunId();\n const run = await composition.pipelineOrchestrator.run({\n config: DEFAULT_SURFACE_CONFIG,\n runId,\n });\n\n if (!run.ok) {\n return err(\n createSurfaceError(\"step_failed\", `MCP pipeline run ${runId} failed.`, {\n cause: run.error,\n details: { runId, stage: parsed.value.step },\n }),\n );\n }\n\n return ok({\n runId: run.value.runId,\n stage: parsed.value.step,\n status: \"completed\",\n });\n}\n\nasync function callSurfaceNext(\n composition: SurfaceComposition,\n): Promise<Result<SurfaceMcpNextOutput>> {\n const state = await composition.stateStore.readState();\n\n if (!state.ok) {\n return state;\n }\n\n const lastCompletedStage = state.value.pipeline?.lastCompletedStage;\n const eligible =\n lastCompletedStage === undefined\n ? [\"run discovery\", \"run all\"]\n : eligibleStagesAfter(lastCompletedStage).map((stage) => `run ${stage}`);\n\n return ok({ eligible });\n}\n\nfunction callSurfaceStatus(session: SurfaceMcpSessionState): Result<SurfaceMcpStatusOutput> {\n const runHistory = session.runOrder\n .map((runId) => session.runs.get(runId))\n .filter((record): record is SurfaceMcpRunRecord => record !== undefined)\n .map((record) => ({\n findings: record.findings.length,\n runId: record.runId,\n status: record.status,\n target: record.capture.target,\n }));\n const completedRuns = runHistory.filter((entry) => entry.status === \"completed\").length;\n const failedRuns = runHistory.filter((entry) => entry.status === \"failed\").length;\n\n return ok({\n currentStage: runHistory.at(-1)?.status === \"completed\" ? \"completed\" : \"pending\",\n progress: {\n completedRuns,\n failedRuns,\n findings: runHistory.reduce((total, entry) => total + entry.findings, 0),\n },\n runHistory,\n });\n}\n\nasync function groundingEvidenceFor(\n composition: SurfaceComposition,\n capture: Capture,\n): Promise<Result<readonly Evidence[]>> {\n const evidence: Evidence[] = [];\n\n for (const tool of composition.groundingTools) {\n const result = await tool.run(capture);\n\n if (!result.ok) {\n return result;\n }\n\n for (const toolResult of result.value) {\n evidence.push(...toolResult.evidence);\n }\n }\n\n return ok(evidence);\n}\n\nasync function findingsForPlan(\n composition: SurfaceComposition,\n config: SurfaceConfig,\n capture: Capture,\n evidence: readonly Evidence[],\n plan: ReturnType<typeof selectLensExecutionPlan>,\n): Promise<Result<readonly Finding[]>> {\n const findings: Finding[] = [];\n const lenses = instantiateLensExecutionPlan(plan, composition.lensFactoryOptions);\n\n for (const { lens } of lenses) {\n const drafts = await lens.evaluate({\n capture,\n config,\n evidence: [...evidence],\n knowledge: composition.knowledgeSource,\n });\n\n if (!drafts.ok) {\n return drafts;\n }\n\n for (const draft of drafts.value) {\n const scored = scoreFinding(draft, config.findings);\n\n if (!scored.ok) {\n return scored;\n }\n\n findings.push(scored.value);\n }\n }\n\n return ok(findings);\n}\n\nfunction configForAuditInput(\n input: z.infer<(typeof TOOL_INPUT_SCHEMAS)[\"surface_audit\"]>,\n): SurfaceConfig {\n return {\n ...DEFAULT_SURFACE_CONFIG,\n capture: { ...DEFAULT_SURFACE_CONFIG.capture },\n evaluation: {\n ...DEFAULT_SURFACE_CONFIG.evaluation,\n ...(input.depth === undefined ? {} : { depth: input.depth }),\n ...(input.preset === undefined\n ? {}\n : { preset: input.preset as SurfaceConfig[\"evaluation\"][\"preset\"] }),\n },\n findings: { ...DEFAULT_SURFACE_CONFIG.findings },\n reporting: { ...DEFAULT_SURFACE_CONFIG.reporting },\n };\n}\n\nfunction captureOptionsFor(\n config: SurfaceConfig,\n authStateRef: string | undefined,\n): { readonly authStateRef?: string; readonly config: SurfaceConfig[\"capture\"] } {\n return {\n config: config.capture,\n ...(authStateRef === undefined ? {} : { authStateRef }),\n };\n}\n\nfunction targetForCore(input: z.infer<typeof TargetSchema>): Target {\n return {\n kind: input.kind,\n ref: input.ref,\n ...(input.theme === undefined ? {} : { theme: input.theme }),\n ...(input.viewport === undefined\n ? {}\n : {\n viewport: {\n height: input.viewport.height,\n label: input.viewport.label,\n width: input.viewport.width,\n },\n }),\n };\n}\n\nfunction parseToolInput<TName extends SurfaceMcpToolName>(\n name: TName,\n input: unknown,\n): Result<z.infer<(typeof TOOL_INPUT_SCHEMAS)[TName]>> {\n const parsed = TOOL_INPUT_SCHEMAS[name].safeParse(input);\n\n if (!parsed.success) {\n return err(\n createSurfaceError(\"config_invalid\", \"MCP tool input did not match the registered schema.\", {\n cause: parsed.error,\n details: { tool: name },\n }),\n );\n }\n\n return ok(parsed.data as z.infer<(typeof TOOL_INPUT_SCHEMAS)[TName]>);\n}\n\nfunction nextRunId(session: SurfaceMcpSessionState): string {\n const runId = `run_mcp_${session.nextRunSequence.toString().padStart(4, \"0\")}`;\n session.nextRunSequence += 1;\n\n return runId;\n}\n\nfunction nextBaselineId(session: SurfaceMcpSessionState): string {\n const baselineId = `baseline_mcp_${session.nextBaselineSequence.toString().padStart(4, \"0\")}`;\n session.nextBaselineSequence += 1;\n\n return baselineId;\n}\n\nfunction nextMcpPipelineRunId(): string {\n return `run_mcp_pipeline_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction isExecutableStageId(step: string): step is ExecutablePipelineStageId {\n return DEFAULT_COMPOSITION_STAGE_IDS.includes(step as ExecutablePipelineStageId);\n}\n\nfunction eligibleStagesAfter(lastCompletedStage: string): readonly ExecutablePipelineStageId[] {\n const index = DEFAULT_COMPOSITION_STAGE_IDS.findIndex((stage) => stage === lastCompletedStage);\n\n if (index === -1) {\n return DEFAULT_COMPOSITION_STAGE_IDS;\n }\n\n return DEFAULT_COMPOSITION_STAGE_IDS.slice(index + 1);\n}\n\nfunction runRecordFor(\n session: SurfaceMcpSessionState,\n runId: string | undefined,\n): SurfaceMcpRunRecord | undefined {\n if (runId !== undefined) {\n return session.runs.get(runId);\n }\n\n const latestRunId = session.runOrder.at(-1);\n\n return latestRunId === undefined ? undefined : session.runs.get(latestRunId);\n}\n\nfunction findStoredFinding(\n session: SurfaceMcpSessionState,\n findingId: string,\n): Finding | undefined {\n for (const runId of session.runOrder) {\n const record = session.runs.get(runId);\n const finding = record?.findings.find((candidate) => candidate.id === findingId);\n\n if (finding !== undefined) {\n return finding;\n }\n }\n\n return undefined;\n}\n\nfunction trackedFindingsForRun(\n session: SurfaceMcpSessionState,\n runId: string,\n findings: readonly Finding[],\n): readonly TrackedFinding[] {\n return findings.map((finding) => {\n const initial = createTrackedFinding({\n finding,\n runId,\n validation: validationForFinding(finding),\n });\n const previous = session.trackedByIdentity.get(initial.identityKey);\n const trackedFinding =\n previous === undefined\n ? initial\n : transitionTrackedFinding(previous, { finding, kind: \"detected\", runId });\n\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n\n return trackedFinding;\n });\n}\n\nfunction validationForFinding(finding: Finding): ValidationCheck {\n if (finding.method === \"measured\") {\n const toolEvidence = finding.evidence.find((entry) => entry.kind === \"tool-result\");\n\n return {\n expectation:\n toolEvidence === undefined\n ? `${finding.lens}/${finding.issueType} remains resolved.`\n : `${toolEvidence.tool} ${toolEvidence.rule} passes for ${locationLabelFor(finding)}.`,\n kind: \"measured-rule\",\n };\n }\n\n return {\n expectation: `${finding.lens}/${finding.issueType} should be re-evaluated at ${locationLabelFor(\n finding,\n )}.`,\n kind: \"re-evaluate-lens\",\n };\n}\n\nfunction locationLabelFor(finding: Finding): string {\n return (\n finding.location.elementRef ??\n finding.location.selector ??\n finding.location.component ??\n finding.location.file ??\n finding.id\n );\n}\n\nfunction latestBaseline(session: SurfaceMcpSessionState): SurfaceMcpBaselineRecord | undefined {\n const baselineId = session.baselineOrder.at(-1);\n\n return baselineId === undefined ? undefined : session.baselines.get(baselineId);\n}\n\nfunction trackedFindingForRunFinding(\n record: SurfaceMcpRunRecord,\n findingId: string,\n): TrackedFinding | undefined {\n return record.trackedFindings.find(\n (trackedFinding) => trackedFinding.currentFindingId === findingId,\n );\n}\n\nfunction findStoredTrackedFinding(\n session: SurfaceMcpSessionState,\n findingId: string,\n): TrackedFinding | undefined {\n for (const trackedFinding of session.trackedByIdentity.values()) {\n if (trackedFinding.currentFindingId === findingId) {\n return trackedFinding;\n }\n }\n\n return undefined;\n}\n\nexport async function createSurfaceSdkMcpServer(\n options: SurfaceMcpServerOptions = {},\n): Promise<unknown> {\n const surfaceServer = createSurfaceMcpServer(options);\n\n const [{ McpServer }] = await Promise.all([import(\"@modelcontextprotocol/sdk/server/mcp.js\")]);\n const server = new McpServer({\n name: SURFACE_MCP_SERVER_NAME,\n version: SURFACE_MCP_SERVER_VERSION,\n }) as SdkMcpServer;\n\n for (const tool of INTERNAL_TOOLS) {\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.inputZodSchema,\n title: tool.title,\n },\n async (input) => mcpToolCallResult(await surfaceServer.callTool(tool.name, input)),\n );\n }\n\n return server;\n}\n\nexport async function runSurfaceMcpStdioServer(\n options: SurfaceMcpServerOptions = {},\n): Promise<void> {\n const [{ StdioServerTransport }, server] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/stdio.js\"),\n createSurfaceSdkMcpServer(options),\n ]);\n\n await (server as SdkMcpServer).connect(new StdioServerTransport());\n}\n\ntype SdkMcpServer = {\n connect(transport: unknown): Promise<void>;\n registerTool(\n name: string,\n config: {\n readonly description: string;\n readonly inputSchema: unknown;\n readonly title: string;\n },\n handler: (input: unknown) => unknown,\n ): void;\n};\n\nfunction mcpToolCallResult(result: Result<SurfaceMcpToolOutput>): {\n readonly content: readonly { readonly text: string; readonly type: \"text\" }[];\n readonly isError?: true;\n readonly structuredContent: unknown;\n} {\n if (isOk(result)) {\n return {\n content: [{ text: JSON.stringify(result.value, null, 2), type: \"text\" }],\n structuredContent: result.value,\n };\n }\n\n return {\n content: [{ text: result.error.message, type: \"text\" }],\n isError: true,\n structuredContent: toMcpError(result.error),\n };\n}\n\nfunction publicToolDefinition(tool: InternalSurfaceMcpToolDefinition): SurfaceMcpToolDefinition {\n return {\n description: tool.description,\n inputSchema: tool.inputSchema,\n name: tool.name,\n schemaVersion: tool.schemaVersion,\n title: tool.title,\n };\n}\n\nfunction requiredFields(schema: JsonSchema): ReadonlySet<string> {\n const required = schema.required;\n\n return Array.isArray(required)\n ? new Set(required.filter((field): field is string => typeof field === \"string\"))\n : new Set();\n}\n\nfunction hasMajorVersionIncrement(currentVersion: string, nextVersion: string): boolean {\n const currentMajor = majorVersion(currentVersion);\n const nextMajor = majorVersion(nextVersion);\n\n return currentMajor !== undefined && nextMajor !== undefined && nextMajor > currentMajor;\n}\n\nfunction majorVersion(version: string): number | undefined {\n const match = /^(\\d+)\\./u.exec(version);\n const value = match?.[1];\n\n if (value === undefined) {\n return undefined;\n }\n\n const major = Number(value);\n\n return Number.isInteger(major) ? major : undefined;\n}\n\nfunction mcpSchemaIncompatible(\n message: string,\n input: McpToolSchemaCompatibilityInput,\n details: Record<string, unknown> = {},\n): Result<never, SurfaceError> {\n return err(\n createSurfaceError(\"mcp_schema_incompatible\", message, {\n details: {\n current: {\n name: input.current.name,\n schemaVersion: input.current.schemaVersion,\n },\n next: {\n name: input.next.name,\n schemaVersion: input.next.schemaVersion,\n },\n ...details,\n },\n }),\n );\n}\n\nif (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {\n await runSurfaceMcpStdioServer();\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/browser-qa-tools.ts"],"sourcesContent":["import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport {\n DEFAULT_COMPOSITION_STAGE_IDS,\n DEFAULT_SURFACE_CONFIG,\n browserQaFlowRunsForGate,\n browserQaFlowSeverityFromWithFlows,\n browserQaGateTargetCli,\n createBoundedAlternatives,\n createTrackedFinding,\n createSurfaceComposition,\n createSurfaceError,\n diffTrackedFindings,\n err,\n evaluateGateWithQaFlows,\n instantiateLensExecutionPlan,\n isOk,\n ok,\n scoreFinding,\n selectLensExecutionPlan,\n synthesizeBacklog,\n toMcpError,\n transitionTrackedFinding,\n type AlternativesReportData,\n type Evidence,\n type Finding,\n type TrackedFinding,\n type ValidationCheck,\n type Result,\n type SurfaceConfig,\n type SurfaceComposition,\n type SurfaceCompositionOptions,\n type SurfaceError,\n} from \"@zigrivers/surface-core\";\nimport type {\n Backlog,\n Baseline,\n Capture,\n GateResult,\n IssueExport,\n ProjectRunRecord,\n ProjectStateSnapshot,\n Target,\n} from \"@zigrivers/surface-core/interfaces\";\nimport { z } from \"zod\";\n\nimport {\n BROWSER_QA_MCP_SERVER_INPUT_SCHEMAS,\n BROWSER_QA_MCP_SERVER_TOOL_METADATA,\n BROWSER_QA_MCP_SERVER_TOOL_NAMES,\n callBrowserQaMcpTool,\n createBrowserQaMcpHandlers,\n isBrowserQaMcpServerToolName,\n type BrowserQaMcpServerToolOutputMap,\n} from \"./browser-qa-tools.js\";\n\nexport const SURFACE_MCP_SERVER_NAME = \"surface\";\nexport const SURFACE_MCP_SERVER_VERSION = \"1.0.0\";\nexport const SURFACE_MCP_TOOL_SCHEMA_VERSION = \"1.0.0\";\n\nconst TOOL_ORDER = [\n \"surface_capture\",\n \"surface_audit\",\n \"surface_explain\",\n \"surface_backlog\",\n \"surface_gate\",\n \"surface_validate\",\n \"surface_baseline\",\n \"surface_verdict\",\n \"surface_diff\",\n \"surface_alternatives\",\n \"surface_trace\",\n \"surface_run\",\n \"surface_next\",\n \"surface_status\",\n ...BROWSER_QA_MCP_SERVER_TOOL_NAMES,\n] as const;\n\nexport type SurfaceMcpToolName = (typeof TOOL_ORDER)[number];\nexport type JsonSchema = Record<string, unknown>;\n\nexport type SurfaceMcpToolDefinition = {\n readonly name: SurfaceMcpToolName;\n readonly title: string;\n readonly description: string;\n readonly schemaVersion: string;\n readonly inputSchema: JsonSchema;\n};\n\ntype InternalSurfaceMcpToolDefinition = SurfaceMcpToolDefinition & {\n readonly inputZodSchema: z.ZodType;\n};\n\nexport type SurfaceMcpToolRegistry = {\n readonly serverInfo: {\n readonly name: typeof SURFACE_MCP_SERVER_NAME;\n readonly version: typeof SURFACE_MCP_SERVER_VERSION;\n };\n listTools(): readonly SurfaceMcpToolDefinition[];\n getTool(name: SurfaceMcpToolName): SurfaceMcpToolDefinition | undefined;\n};\n\nexport type SurfaceMcpServer = {\n readonly composition: SurfaceComposition;\n readonly registry: SurfaceMcpToolRegistry;\n callTool<TName extends SurfaceMcpToolName>(\n name: TName,\n input: unknown,\n ): Promise<Result<SurfaceMcpToolOutputMap[TName]>>;\n listTools(): readonly SurfaceMcpToolDefinition[];\n};\n\nexport type SurfaceMcpServerOptions = SurfaceCompositionOptions & {\n readonly composition?: SurfaceComposition;\n};\n\nexport type McpToolSchemaCompatibilityInput = {\n readonly current: Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">;\n readonly next: Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">;\n};\n\nexport type SurfaceMcpAuditOutput = {\n readonly runId: string;\n readonly backlog: Backlog;\n readonly capture: Capture;\n readonly findings: readonly Finding[];\n readonly skippedLenses: readonly {\n readonly lensId: string;\n readonly message: string;\n readonly reason: string;\n }[];\n};\n\nexport type SurfaceMcpExplainOutput = {\n readonly finding: Finding;\n readonly rationale: string;\n readonly evidence: readonly Evidence[];\n};\n\nexport type SurfaceMcpStatusOutput = {\n readonly currentStage: string;\n readonly progress: {\n readonly completedRuns: number;\n readonly failedRuns: number;\n readonly findings: number;\n };\n readonly runHistory: readonly {\n readonly runId: string;\n readonly status: \"completed\" | \"failed\";\n readonly target?: Target;\n readonly findings: number;\n }[];\n};\n\nexport type SurfaceMcpValidationOutput = {\n readonly checks: readonly {\n readonly id: string;\n readonly findingId?: string;\n readonly passed: boolean;\n readonly validation: ValidationCheck;\n }[];\n};\n\nexport type SurfaceMcpBaselineOutput = {\n readonly baselineId: string;\n readonly count: number;\n readonly reason?: string;\n};\n\nexport type SurfaceMcpVerdictOutput = {\n readonly decision: \"accept\" | \"reject\" | \"correct\" | \"defer\";\n readonly findingId: string;\n readonly promotion?: unknown;\n readonly rationale: string;\n};\n\nexport type SurfaceMcpDiffOutput = {\n readonly resolved: readonly SurfaceMcpDiffEntry[];\n readonly regressed: readonly SurfaceMcpDiffEntry[];\n readonly introduced: readonly SurfaceMcpDiffEntry[];\n readonly stillFailing: readonly SurfaceMcpDiffEntry[];\n readonly identityBroken: readonly SurfaceMcpDiffEntry[];\n};\n\nexport type SurfaceMcpDiffEntry = {\n readonly findingId?: string;\n readonly identityKey: string;\n readonly status: TrackedFinding[\"status\"];\n};\n\nexport type SurfaceMcpTraceOutput = {\n readonly trackedFinding: TrackedFinding;\n};\n\nexport type SurfaceMcpAlternativesOutput = {\n readonly alternatives: AlternativesReportData;\n};\n\nexport type SurfaceMcpRunOutput = {\n readonly runId: string;\n readonly stage: string;\n readonly status: \"completed\";\n};\n\nexport type SurfaceMcpNextOutput = {\n readonly eligible: readonly string[];\n};\n\nexport type SurfaceMcpToolOutputMap = {\n readonly surface_capture: Capture;\n readonly surface_audit: SurfaceMcpAuditOutput;\n readonly surface_explain: SurfaceMcpExplainOutput;\n readonly surface_backlog: Backlog | IssueExport;\n readonly surface_status: SurfaceMcpStatusOutput;\n readonly surface_gate: GateResult;\n readonly surface_validate: SurfaceMcpValidationOutput;\n readonly surface_baseline: SurfaceMcpBaselineOutput;\n readonly surface_verdict: SurfaceMcpVerdictOutput;\n readonly surface_diff: SurfaceMcpDiffOutput;\n readonly surface_alternatives: SurfaceMcpAlternativesOutput;\n readonly surface_trace: SurfaceMcpTraceOutput;\n readonly surface_run: SurfaceMcpRunOutput;\n readonly surface_next: SurfaceMcpNextOutput;\n} & BrowserQaMcpServerToolOutputMap;\n\nexport type SurfaceMcpToolOutput = SurfaceMcpToolOutputMap[SurfaceMcpToolName];\n\nconst TargetSchema = z\n .object({\n kind: z.enum([\"url\", \"localhost\", \"route\", \"screenshot\", \"component\", \"dom\"]),\n ref: z.string().min(1),\n theme: z.enum([\"light\", \"dark\"]).optional(),\n viewport: z\n .object({\n height: z.number().int().positive(),\n label: z.enum([\"mobile\", \"tablet\", \"desktop\"]),\n width: z.number().int().positive(),\n })\n .strict()\n .optional(),\n })\n .strict();\nconst AuthStateRefSchema = z.string().min(1);\nconst RunRefSchema = z.object({ runId: z.string().min(1) }).strict();\nconst GatePolicyInputSchema = z.record(z.string(), z.unknown());\ntype ExecutablePipelineStageId = (typeof DEFAULT_COMPOSITION_STAGE_IDS)[number];\n\nconst TOOL_INPUT_SCHEMAS = {\n surface_capture: z\n .object({\n authState: AuthStateRefSchema.optional(),\n target: TargetSchema,\n })\n .strict(),\n surface_audit: z\n .object({\n authState: AuthStateRefSchema.optional(),\n depth: z\n .union([z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5)])\n .optional(),\n persona: z.string().min(1).optional(),\n preset: z.string().min(1).optional(),\n target: TargetSchema,\n task: z.string().min(1).optional(),\n })\n .strict(),\n surface_explain: z.object({ findingId: z.string().min(1) }).strict(),\n surface_backlog: z\n .object({\n exportTarget: z.string().min(1).optional(),\n runId: z.string().min(1).optional(),\n })\n .strict(),\n surface_gate: z\n .object({\n actionPolicyRef: z.string().min(1).optional(),\n baseUrl: z.string().min(1).optional(),\n ci: z.boolean().optional(),\n localhost: z.boolean().optional(),\n policy: GatePolicyInputSchema.optional(),\n runId: z.string().min(1).optional(),\n target: z.string().min(1).optional(),\n url: z.string().min(1).optional(),\n withFlows: z.union([z.boolean(), z.string().min(1)]).optional(),\n })\n .strict()\n .refine(\n (input) =>\n [input.target, input.url, input.localhost === true ? \"localhost\" : undefined].filter(\n (value) => value !== undefined,\n ).length <= 1,\n \"Pass at most one of target, url, or localhost.\",\n ),\n surface_validate: z.object({ runId: z.string().min(1) }).strict(),\n surface_baseline: z.object({ reason: z.string().min(1).optional() }).strict(),\n surface_verdict: z\n .object({\n decision: z.enum([\"accept\", \"reject\", \"correct\", \"defer\"]),\n findingId: z.string().min(1),\n promote: z.boolean().optional(),\n rationale: z.string().min(1),\n })\n .strict(),\n surface_diff: z.object({ after: RunRefSchema, before: RunRefSchema }).strict(),\n surface_alternatives: z\n .object({\n authState: AuthStateRefSchema.optional(),\n target: TargetSchema,\n })\n .strict(),\n surface_trace: z.object({ findingId: z.string().min(1) }).strict(),\n surface_run: z\n .object({\n step: z.string().min(1),\n target: TargetSchema.optional(),\n })\n .strict(),\n surface_next: z.object({}).strict(),\n surface_status: z.object({}).strict(),\n ...BROWSER_QA_MCP_SERVER_INPUT_SCHEMAS,\n} as const satisfies Record<SurfaceMcpToolName, z.ZodType>;\n\nconst TOOL_METADATA = {\n surface_capture: {\n title: \"Capture Target\",\n description: \"Capture a target into Surface artifacts.\",\n },\n surface_audit: {\n title: \"Audit Target\",\n description: \"Run a Surface audit over a target.\",\n },\n surface_explain: {\n title: \"Explain Finding\",\n description: \"Explain one Surface finding with evidence.\",\n },\n surface_backlog: {\n title: \"Read Backlog\",\n description: \"Return or export the implementation backlog.\",\n },\n surface_gate: {\n title: \"Evaluate Gate\",\n description: \"Evaluate the configured Surface quality gate.\",\n },\n surface_validate: {\n title: \"Validate Run\",\n description: \"Run validation checks for an audit run.\",\n },\n surface_baseline: {\n title: \"Create Baseline\",\n description: \"Baseline current findings for future gate comparisons.\",\n },\n surface_verdict: {\n title: \"Record Verdict\",\n description: \"Record a human verdict for a finding.\",\n },\n surface_diff: {\n title: \"Diff Runs\",\n description: \"Compare findings across two audit runs.\",\n },\n surface_alternatives: {\n title: \"Suggest Alternatives\",\n description: \"Suggest bounded alternatives for a target.\",\n },\n surface_trace: {\n title: \"Trace Finding\",\n description: \"Trace a finding through closed-loop state.\",\n },\n surface_run: {\n title: \"Run Pipeline Step\",\n description: \"Run a Surface pipeline step.\",\n },\n surface_next: {\n title: \"List Next Steps\",\n description: \"List eligible Surface pipeline steps.\",\n },\n surface_status: {\n title: \"Read Status\",\n description: \"Read Surface project status.\",\n },\n ...BROWSER_QA_MCP_SERVER_TOOL_METADATA,\n} as const satisfies Record<\n SurfaceMcpToolName,\n { readonly title: string; readonly description: string }\n>;\n\nconst INTERNAL_TOOLS = TOOL_ORDER.map((name) => {\n const metadata = TOOL_METADATA[name];\n const inputZodSchema = TOOL_INPUT_SCHEMAS[name];\n\n return {\n name,\n ...metadata,\n inputZodSchema,\n inputSchema: z.toJSONSchema(inputZodSchema),\n schemaVersion: SURFACE_MCP_TOOL_SCHEMA_VERSION,\n };\n}) satisfies readonly InternalSurfaceMcpToolDefinition[];\n\nexport function createSurfaceMcpToolRegistry(): SurfaceMcpToolRegistry {\n const toolsByName = new Map<SurfaceMcpToolName, InternalSurfaceMcpToolDefinition>(\n INTERNAL_TOOLS.map((tool) => [tool.name, tool]),\n );\n\n return {\n serverInfo: {\n name: SURFACE_MCP_SERVER_NAME,\n version: SURFACE_MCP_SERVER_VERSION,\n },\n getTool: (name) => {\n const tool = toolsByName.get(name);\n\n return tool === undefined ? undefined : publicToolDefinition(tool);\n },\n listTools: () => INTERNAL_TOOLS.map(publicToolDefinition),\n };\n}\n\nexport function createSurfaceMcpServer(options: SurfaceMcpServerOptions = {}): SurfaceMcpServer {\n const registry = createSurfaceMcpToolRegistry();\n const projectRoot = path.resolve(options.projectRoot ?? process.cwd());\n const composition = options.composition ?? createSurfaceComposition(options);\n const session = createSurfaceMcpSessionState(projectRoot);\n\n return {\n composition,\n callTool: async (name, input) => {\n const hydrated = await hydrateSurfaceMcpSession(composition, session);\n\n if (!hydrated.ok) {\n return hydrated;\n }\n\n return (await callSurfaceMcpTool({\n composition,\n input,\n name,\n session,\n })) as Result<SurfaceMcpToolOutputMap[typeof name]>;\n },\n registry,\n listTools: () => registry.listTools(),\n };\n}\n\nexport function createMcpToolSchemaSnapshot(\n registry: SurfaceMcpToolRegistry = createSurfaceMcpToolRegistry(),\n): readonly Pick<SurfaceMcpToolDefinition, \"inputSchema\" | \"name\" | \"schemaVersion\">[] {\n return registry.listTools().map((tool) => ({\n inputSchema: tool.inputSchema,\n name: tool.name,\n schemaVersion: tool.schemaVersion,\n }));\n}\n\nexport function assertMcpToolSchemaCompatibility(\n input: McpToolSchemaCompatibilityInput,\n): Result<true, SurfaceError> {\n if (input.current.name !== input.next.name) {\n return mcpSchemaIncompatible(\n \"MCP tool names cannot change without a major version bump.\",\n input,\n );\n }\n\n if (!hasMajorVersionIncrement(input.current.schemaVersion, input.next.schemaVersion)) {\n const currentRequired = requiredFields(input.current.inputSchema);\n const nextRequired = requiredFields(input.next.inputSchema);\n const addedRequired = [...nextRequired].filter((field) => !currentRequired.has(field));\n\n if (addedRequired.length > 0) {\n return mcpSchemaIncompatible(\n \"MCP tool schema added required fields without a major version bump.\",\n input,\n { addedRequired },\n );\n }\n }\n\n return ok(true);\n}\n\ntype SurfaceMcpSessionState = {\n readonly baselines: Map<string, SurfaceMcpBaselineRecord>;\n readonly baselineOrder: string[];\n readonly runs: Map<string, SurfaceMcpRunRecord>;\n readonly runOrder: string[];\n readonly projectRoot: string;\n readonly trackedByIdentity: Map<string, TrackedFinding>;\n readonly verdicts: Map<string, SurfaceMcpVerdictOutput>;\n nextBaselineSequence: number;\n nextRunSequence: number;\n};\n\ntype SurfaceMcpRunRecord = {\n readonly runId: string;\n readonly status: \"completed\" | \"failed\";\n readonly backlog: Backlog;\n readonly capture: Capture;\n readonly findings: readonly Finding[];\n readonly skippedLenses: SurfaceMcpAuditOutput[\"skippedLenses\"];\n readonly trackedFindings: readonly TrackedFinding[];\n};\n\ntype SurfaceMcpBaselineRecord = {\n readonly baselineId: string;\n readonly identityKeys: ReadonlySet<string>;\n readonly reason?: string;\n};\n\ntype CallSurfaceMcpToolInput = {\n readonly composition: SurfaceComposition;\n readonly input: unknown;\n readonly name: SurfaceMcpToolName;\n readonly session: SurfaceMcpSessionState;\n};\n\nfunction createSurfaceMcpSessionState(projectRoot: string): SurfaceMcpSessionState {\n return {\n baselines: new Map(),\n baselineOrder: [],\n runs: new Map(),\n runOrder: [],\n projectRoot,\n trackedByIdentity: new Map(),\n verdicts: new Map(),\n nextBaselineSequence: 1,\n nextRunSequence: 1,\n };\n}\n\nasync function hydrateSurfaceMcpSession(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n): Promise<Result<void>> {\n const state = await composition.stateStore.readState();\n\n if (!state.ok) {\n return state;\n }\n\n resetSurfaceMcpSessionFromState(session, state.value);\n\n return ok(undefined);\n}\n\nfunction resetSurfaceMcpSessionFromState(\n session: SurfaceMcpSessionState,\n state: ProjectStateSnapshot,\n): void {\n session.baselines.clear();\n session.baselineOrder.length = 0;\n session.runs.clear();\n session.runOrder.length = 0;\n session.trackedByIdentity.clear();\n session.verdicts.clear();\n\n for (const trackedFinding of state.trackedFindings ?? []) {\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n }\n\n for (const record of state.runRecords ?? []) {\n const mcpRecord = surfaceMcpRunRecordFromProjectRecord(record);\n\n if (mcpRecord === undefined) {\n continue;\n }\n\n session.runs.set(mcpRecord.runId, mcpRecord);\n session.runOrder.push(mcpRecord.runId);\n\n for (const trackedFinding of mcpRecord.trackedFindings) {\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n }\n }\n\n for (const baseline of state.baselines ?? []) {\n const mcpBaseline = surfaceMcpBaselineFromProjectBaseline(baseline);\n session.baselines.set(mcpBaseline.baselineId, mcpBaseline);\n session.baselineOrder.push(mcpBaseline.baselineId);\n }\n\n for (const verdict of state.verdicts ?? []) {\n if (isSurfaceMcpVerdict(verdict)) {\n session.verdicts.set(verdict.findingId, verdict);\n }\n }\n\n session.nextRunSequence = nextSequenceFromIds(session.runOrder, \"run_mcp_\");\n session.nextBaselineSequence = nextSequenceFromIds(session.baselineOrder, \"baseline_mcp_\");\n}\n\nfunction surfaceMcpRunRecordFromProjectRecord(\n record: ProjectRunRecord,\n): SurfaceMcpRunRecord | undefined {\n if (\n record.backlog === undefined ||\n record.capture === undefined ||\n record.findings === undefined ||\n record.status === undefined ||\n record.skippedLenses === undefined\n ) {\n return undefined;\n }\n\n return {\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n status: record.status,\n trackedFindings: record.trackedFindings,\n };\n}\n\nfunction surfaceMcpBaselineFromProjectBaseline(baseline: Baseline): SurfaceMcpBaselineRecord {\n return {\n baselineId: baseline.baselineId,\n identityKeys: new Set(baseline.identityKeys),\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n };\n}\n\nfunction isSurfaceMcpVerdict(verdict: {\n readonly decision: string;\n readonly findingId: string;\n readonly rationale: string;\n}): verdict is SurfaceMcpVerdictOutput {\n return (\n verdict.decision === \"accept\" ||\n verdict.decision === \"reject\" ||\n verdict.decision === \"correct\" ||\n verdict.decision === \"defer\"\n );\n}\n\nasync function persistSurfaceMcpSession(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n): Promise<Result<void>> {\n const updateState = stateSnapshotForMcpSession(session);\n\n if (composition.stateStore.updateState !== undefined) {\n const updated = await composition.stateStore.updateState(updateState);\n\n return updated.ok ? ok(undefined) : updated;\n }\n\n const current = await composition.stateStore.readState();\n\n if (!current.ok) {\n return current;\n }\n\n const written = await composition.stateStore.writeState(updateState(current.value));\n\n return written.ok ? ok(undefined) : written;\n}\n\nfunction stateSnapshotForMcpSession(\n session: SurfaceMcpSessionState,\n): (state: ProjectStateSnapshot) => ProjectStateSnapshot {\n return (state) => {\n const runRecords = session.runOrder\n .map((runId) => session.runs.get(runId))\n .filter((record): record is SurfaceMcpRunRecord => record !== undefined)\n .map(projectRunRecordFromSurfaceMcpRecord);\n const latestRun = runRecords.at(-1);\n const baselines = session.baselineOrder\n .map((baselineId) => session.baselines.get(baselineId))\n .filter((baseline): baseline is SurfaceMcpBaselineRecord => baseline !== undefined)\n .map(projectBaselineFromSurfaceMcpBaseline);\n const trackedFindings = [...session.trackedByIdentity.values()];\n const verdicts = [...session.verdicts.values()];\n const currentStage = latestRun?.status ?? state.currentStage;\n\n return {\n ...state,\n ...(latestRun?.backlog === undefined ? {} : { backlog: latestRun.backlog }),\n ...(currentStage === undefined ? {} : { currentStage }),\n ...(latestRun?.findings === undefined ? {} : { findings: latestRun.findings }),\n baselines,\n runRecords,\n trackedFindings,\n verdicts,\n };\n };\n}\n\nfunction projectRunRecordFromSurfaceMcpRecord(record: SurfaceMcpRunRecord): ProjectRunRecord {\n return {\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n status: record.status,\n trackedFindings: record.trackedFindings,\n };\n}\n\nfunction projectBaselineFromSurfaceMcpBaseline(baseline: SurfaceMcpBaselineRecord): Baseline {\n return {\n baselineId: baseline.baselineId,\n identityKeys: [...baseline.identityKeys],\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n waivers: [],\n };\n}\n\nfunction nextSequenceFromIds(ids: readonly string[], prefix: string): number {\n let maxSequence = 0;\n\n for (const id of ids) {\n if (!id.startsWith(prefix)) {\n continue;\n }\n\n const sequence = Number.parseInt(id.slice(prefix.length), 10);\n\n if (Number.isInteger(sequence)) {\n maxSequence = Math.max(maxSequence, sequence);\n }\n }\n\n return maxSequence + 1;\n}\n\nasync function callSurfaceMcpTool(\n input: CallSurfaceMcpToolInput,\n): Promise<Result<SurfaceMcpToolOutput>> {\n if (isBrowserQaMcpServerToolName(input.name)) {\n return await callBrowserQaMcpTool({\n handlers: createBrowserQaMcpHandlers(input.composition),\n input: input.input,\n name: input.name,\n });\n }\n\n switch (input.name) {\n case \"surface_capture\":\n return await callSurfaceCapture(input.composition, input.input);\n case \"surface_audit\":\n return await callSurfaceAudit(input.composition, input.session, input.input);\n case \"surface_explain\":\n return callSurfaceExplain(input.session, input.input);\n case \"surface_backlog\":\n return await callSurfaceBacklog(input.composition, input.session, input.input);\n case \"surface_gate\":\n return await callSurfaceGate(input.composition, input.session, input.input);\n case \"surface_validate\":\n return callSurfaceValidate(input.session, input.input);\n case \"surface_baseline\":\n return await callSurfaceBaseline(input.composition, input.session, input.input);\n case \"surface_verdict\":\n return await callSurfaceVerdict(input.composition, input.session, input.input);\n case \"surface_diff\":\n return callSurfaceDiff(input.session, input.input);\n case \"surface_alternatives\":\n return await callSurfaceAlternatives(input.composition, input.input);\n case \"surface_trace\":\n return callSurfaceTrace(input.session, input.input);\n case \"surface_run\":\n return await callSurfaceRun(input.composition, input.input);\n case \"surface_next\":\n return await callSurfaceNext(input.composition);\n case \"surface_status\":\n return callSurfaceStatus(input.session);\n }\n}\n\nasync function callSurfaceCapture(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<Capture>> {\n const parsed = parseToolInput(\"surface_capture\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n return await composition.captureService.capture(\n targetForCore(parsed.value.target),\n captureOptionsFor(DEFAULT_SURFACE_CONFIG, parsed.value.authState),\n );\n}\n\nasync function callSurfaceAudit(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpAuditOutput>> {\n const parsed = parseToolInput(\"surface_audit\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const config = configForAuditInput(parsed.value);\n const capture = await composition.captureService.capture(\n targetForCore(parsed.value.target),\n captureOptionsFor(config, parsed.value.authState),\n );\n\n if (!capture.ok) {\n return capture;\n }\n\n const evidence = await groundingEvidenceFor(composition, capture.value);\n\n if (!evidence.ok) {\n return evidence;\n }\n\n const plan = selectLensExecutionPlan({\n capture: capture.value,\n config,\n modelAvailability: {\n available: false,\n message: \"No MCP model provider is configured.\",\n reason: \"no-model-configured\",\n },\n registry: composition.lensRegistry,\n });\n const findings = await findingsForPlan(composition, config, capture.value, evidence.value, plan);\n\n if (!findings.ok) {\n return findings;\n }\n\n const runId = nextRunId(session);\n const backlog = synthesizeBacklog(runId, findings.value);\n\n if (!backlog.ok) {\n return backlog;\n }\n\n const trackedFindings = trackedFindingsForRun(session, runId, findings.value);\n\n const record: SurfaceMcpRunRecord = {\n backlog: backlog.value,\n capture: capture.value,\n findings: findings.value,\n runId,\n skippedLenses: plan.skipped,\n status: \"completed\",\n trackedFindings,\n };\n session.runs.set(runId, record);\n session.runOrder.push(runId);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok({\n backlog: record.backlog,\n capture: record.capture,\n findings: record.findings,\n runId: record.runId,\n skippedLenses: record.skippedLenses,\n });\n}\n\nfunction callSurfaceExplain(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpExplainOutput> {\n const parsed = parseToolInput(\"surface_explain\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const finding = findStoredFinding(session, parsed.value.findingId);\n\n if (finding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No stored MCP finding matched the requested id.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n if (finding.evidence.length === 0) {\n return err(\n createSurfaceError(\"evidence_missing\", \"Stored MCP finding has no evidence to explain.\", {\n details: { findingId: finding.id },\n }),\n );\n }\n\n return ok({\n evidence: finding.evidence,\n finding,\n rationale: finding.rationale,\n });\n}\n\nasync function callSurfaceBacklog(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<Backlog | IssueExport>> {\n const parsed = parseToolInput(\"surface_backlog\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested backlog.\", {\n details: { runId: parsed.value.runId ?? null },\n }),\n );\n }\n\n if (parsed.value.exportTarget === undefined) {\n return ok(record.backlog);\n }\n\n const exporter = composition.issueExporters.find(\n (candidate) => candidate.target === parsed.value.exportTarget,\n );\n\n if (exporter === undefined) {\n return err(\n createSurfaceError(\n \"unknown_export_target\",\n \"No issue exporter matched the MCP backlog target.\",\n {\n details: { exportTarget: parsed.value.exportTarget },\n },\n ),\n );\n }\n\n const artifact = await composition.stateStore.writeArtifact({\n bytes: new TextEncoder().encode(JSON.stringify(record.backlog, null, 2)),\n kind: \"report\",\n relativePath: `reports/${record.runId}/backlog.json`,\n });\n\n if (!artifact.ok) {\n return artifact;\n }\n\n const exported = await exporter.export({\n backlogId: record.backlog.id,\n path: artifact.value.path,\n });\n\n if (!exported.ok) {\n return exported;\n }\n\n if (exported.value.status === \"partial\") {\n return err(\n createSurfaceError(\"export_partial\", \"MCP backlog export completed partially.\", {\n details: { exportId: exported.value.id, target: exported.value.target },\n }),\n );\n }\n\n return ok(exported.value);\n}\n\nasync function callSurfaceGate(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<GateResult>> {\n const parsed = parseToolInput(\"surface_gate\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested gate.\", {\n details: { runId: parsed.value.runId ?? null },\n }),\n );\n }\n\n const baseline = latestBaseline(session);\n const baselineIdentityKeys = baseline?.identityKeys ?? new Set<string>();\n const findings = record.findings.filter((finding) => {\n const tracked = trackedFindingForRunFinding(record, finding.id);\n\n return tracked === undefined || !baselineIdentityKeys.has(tracked.identityKey);\n });\n const policy =\n parsed.value.policy === undefined\n ? DEFAULT_SURFACE_CONFIG.reporting.gatePolicy\n : (parsed.value.policy as SurfaceConfig[\"reporting\"][\"gatePolicy\"]);\n\n if (parsed.value.withFlows === undefined) {\n return await composition.gateEvaluator.evaluate(findings, policy);\n }\n\n const targetCli = browserQaGateTargetCli(parsed.value);\n if (!targetCli.ok) {\n return targetCli;\n }\n\n const flowRuns = await browserQaFlowRunsForGate(composition, {\n ...(parsed.value.actionPolicyRef === undefined\n ? {}\n : { actionPolicyRef: parsed.value.actionPolicyRef }),\n ci: parsed.value.ci === true,\n projectRoot: session.projectRoot,\n ...(targetCli.value === undefined ? {} : { targetCli: targetCli.value }),\n withFlows: parsed.value.withFlows,\n });\n if (!flowRuns.ok) {\n return flowRuns;\n }\n\n const flowAwareGate = evaluateGateWithQaFlows({\n findings,\n policy: {\n ...policy,\n failOnFlowSeverityAtOrAbove: browserQaFlowSeverityFromWithFlows(parsed.value.withFlows),\n },\n qaFlowRuns: flowRuns.value,\n });\n\n return flowAwareGate;\n}\n\nfunction callSurfaceValidate(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpValidationOutput> {\n const parsed = parseToolInput(\"surface_validate\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, parsed.value.runId);\n\n if (record === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"No stored MCP run matched the requested validation.\", {\n details: { runId: parsed.value.runId },\n }),\n );\n }\n\n return ok({\n checks: record.trackedFindings.map((trackedFinding) => ({\n id: trackedFinding.identityKey,\n passed: trackedFinding.status !== \"identity-broken\",\n validation: trackedFinding.validation,\n ...(trackedFinding.currentFindingId === undefined\n ? {}\n : { findingId: trackedFinding.currentFindingId }),\n })),\n });\n}\n\nasync function callSurfaceBaseline(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpBaselineOutput>> {\n const parsed = parseToolInput(\"surface_baseline\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const record = runRecordFor(session, undefined);\n\n if (record === undefined || record.trackedFindings.length === 0) {\n return err(\n createSurfaceError(\"no_findings_to_baseline\", \"No MCP findings are available to baseline.\"),\n );\n }\n\n const baselineId = nextBaselineId(session);\n const baseline: SurfaceMcpBaselineRecord = {\n baselineId,\n identityKeys: new Set(\n record.trackedFindings.map((trackedFinding) => trackedFinding.identityKey),\n ),\n ...(parsed.value.reason === undefined ? {} : { reason: parsed.value.reason }),\n };\n session.baselines.set(baselineId, baseline);\n session.baselineOrder.push(baselineId);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok({\n baselineId,\n count: baseline.identityKeys.size,\n ...(baseline.reason === undefined ? {} : { reason: baseline.reason }),\n });\n}\n\nasync function callSurfaceVerdict(\n composition: SurfaceComposition,\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpVerdictOutput>> {\n const parsed = parseToolInput(\"surface_verdict\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n if (parsed.value.findingId.startsWith(\"qfc_\")) {\n if (parsed.value.promote !== true) {\n return err(\n createSurfaceError(\"finding_not_found\", \"Browser QA candidate verdicts require promote.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n const promotion = await composition.browserQa.orchestrator.promoteCandidateByVerdict({\n refId: parsed.value.findingId,\n reason: parsed.value.rationale,\n verdictId: `verdict_${Date.now().toString(36)}`,\n });\n\n if (!promotion.ok) {\n return promotion;\n }\n\n return ok({\n decision: parsed.value.decision,\n findingId: parsed.value.findingId,\n promotion: promotion.value,\n rationale: parsed.value.rationale,\n });\n }\n\n const finding = findStoredFinding(session, parsed.value.findingId);\n\n if (finding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No stored MCP finding matched the verdict.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n const verdict = {\n decision: parsed.value.decision,\n findingId: parsed.value.findingId,\n rationale: parsed.value.rationale,\n } satisfies SurfaceMcpVerdictOutput;\n session.verdicts.set(parsed.value.findingId, verdict);\n\n const persisted = await persistSurfaceMcpSession(composition, session);\n\n if (!persisted.ok) {\n return persisted;\n }\n\n return ok(verdict);\n}\n\nfunction callSurfaceDiff(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpDiffOutput> {\n const parsed = parseToolInput(\"surface_diff\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const before = runRecordFor(session, parsed.value.before.runId);\n const after = runRecordFor(session, parsed.value.after.runId);\n\n if (before === undefined || after === undefined) {\n return err(\n createSurfaceError(\"run_not_found\", \"Both MCP diff runs must exist.\", {\n details: { after: parsed.value.after.runId, before: parsed.value.before.runId },\n }),\n );\n }\n\n return ok(diffTrackedFindings(before.trackedFindings, after.trackedFindings));\n}\n\nasync function callSurfaceAlternatives(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpAlternativesOutput>> {\n const parsed = parseToolInput(\"surface_alternatives\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const target = targetForCore(parsed.value.target);\n const capture = await composition.captureService.capture(\n target,\n captureOptionsFor(DEFAULT_SURFACE_CONFIG, parsed.value.authState),\n );\n\n if (!capture.ok) {\n return capture;\n }\n\n return ok({\n alternatives: createBoundedAlternatives(target),\n });\n}\n\nfunction callSurfaceTrace(\n session: SurfaceMcpSessionState,\n rawInput: unknown,\n): Result<SurfaceMcpTraceOutput> {\n const parsed = parseToolInput(\"surface_trace\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n const trackedFinding = findStoredTrackedFinding(session, parsed.value.findingId);\n\n if (trackedFinding === undefined) {\n return err(\n createSurfaceError(\"finding_not_found\", \"No tracked MCP finding matched the requested id.\", {\n details: { findingId: parsed.value.findingId },\n }),\n );\n }\n\n return ok({ trackedFinding });\n}\n\nasync function callSurfaceRun(\n composition: SurfaceComposition,\n rawInput: unknown,\n): Promise<Result<SurfaceMcpRunOutput>> {\n const parsed = parseToolInput(\"surface_run\", rawInput);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n if (parsed.value.step !== \"all\" && !isExecutableStageId(parsed.value.step)) {\n return err(\n createSurfaceError(\"unknown_step\", `Unknown MCP pipeline step \"${parsed.value.step}\".`, {\n details: { step: parsed.value.step },\n }),\n );\n }\n\n const runId = nextMcpPipelineRunId();\n const run = await composition.pipelineOrchestrator.run({\n config: DEFAULT_SURFACE_CONFIG,\n runId,\n });\n\n if (!run.ok) {\n return err(\n createSurfaceError(\"step_failed\", `MCP pipeline run ${runId} failed.`, {\n cause: run.error,\n details: { runId, stage: parsed.value.step },\n }),\n );\n }\n\n return ok({\n runId: run.value.runId,\n stage: parsed.value.step,\n status: \"completed\",\n });\n}\n\nasync function callSurfaceNext(\n composition: SurfaceComposition,\n): Promise<Result<SurfaceMcpNextOutput>> {\n const state = await composition.stateStore.readState();\n\n if (!state.ok) {\n return state;\n }\n\n const lastCompletedStage = state.value.pipeline?.lastCompletedStage;\n const eligible =\n lastCompletedStage === undefined\n ? [\"run discovery\", \"run all\"]\n : eligibleStagesAfter(lastCompletedStage).map((stage) => `run ${stage}`);\n\n return ok({ eligible });\n}\n\nfunction callSurfaceStatus(session: SurfaceMcpSessionState): Result<SurfaceMcpStatusOutput> {\n const runHistory = session.runOrder\n .map((runId) => session.runs.get(runId))\n .filter((record): record is SurfaceMcpRunRecord => record !== undefined)\n .map((record) => ({\n findings: record.findings.length,\n runId: record.runId,\n status: record.status,\n target: record.capture.target,\n }));\n const completedRuns = runHistory.filter((entry) => entry.status === \"completed\").length;\n const failedRuns = runHistory.filter((entry) => entry.status === \"failed\").length;\n\n return ok({\n currentStage: runHistory.at(-1)?.status === \"completed\" ? \"completed\" : \"pending\",\n progress: {\n completedRuns,\n failedRuns,\n findings: runHistory.reduce((total, entry) => total + entry.findings, 0),\n },\n runHistory,\n });\n}\n\nasync function groundingEvidenceFor(\n composition: SurfaceComposition,\n capture: Capture,\n): Promise<Result<readonly Evidence[]>> {\n const evidence: Evidence[] = [];\n\n for (const tool of composition.groundingTools) {\n const result = await tool.run(capture);\n\n if (!result.ok) {\n return result;\n }\n\n for (const toolResult of result.value) {\n evidence.push(...toolResult.evidence);\n }\n }\n\n return ok(evidence);\n}\n\nasync function findingsForPlan(\n composition: SurfaceComposition,\n config: SurfaceConfig,\n capture: Capture,\n evidence: readonly Evidence[],\n plan: ReturnType<typeof selectLensExecutionPlan>,\n): Promise<Result<readonly Finding[]>> {\n const findings: Finding[] = [];\n const lenses = instantiateLensExecutionPlan(plan, composition.lensFactoryOptions);\n\n for (const { lens } of lenses) {\n const drafts = await lens.evaluate({\n capture,\n config,\n evidence: [...evidence],\n knowledge: composition.knowledgeSource,\n });\n\n if (!drafts.ok) {\n return drafts;\n }\n\n for (const draft of drafts.value) {\n const scored = scoreFinding(draft, config.findings);\n\n if (!scored.ok) {\n return scored;\n }\n\n findings.push(scored.value);\n }\n }\n\n return ok(findings);\n}\n\nfunction configForAuditInput(\n input: z.infer<(typeof TOOL_INPUT_SCHEMAS)[\"surface_audit\"]>,\n): SurfaceConfig {\n return {\n ...DEFAULT_SURFACE_CONFIG,\n capture: { ...DEFAULT_SURFACE_CONFIG.capture },\n evaluation: {\n ...DEFAULT_SURFACE_CONFIG.evaluation,\n ...(input.depth === undefined ? {} : { depth: input.depth }),\n ...(input.preset === undefined\n ? {}\n : { preset: input.preset as SurfaceConfig[\"evaluation\"][\"preset\"] }),\n },\n findings: { ...DEFAULT_SURFACE_CONFIG.findings },\n reporting: { ...DEFAULT_SURFACE_CONFIG.reporting },\n };\n}\n\nfunction captureOptionsFor(\n config: SurfaceConfig,\n authStateRef: string | undefined,\n): { readonly authStateRef?: string; readonly config: SurfaceConfig[\"capture\"] } {\n return {\n config: config.capture,\n ...(authStateRef === undefined ? {} : { authStateRef }),\n };\n}\n\nfunction targetForCore(input: z.infer<typeof TargetSchema>): Target {\n return {\n kind: input.kind,\n ref: input.ref,\n ...(input.theme === undefined ? {} : { theme: input.theme }),\n ...(input.viewport === undefined\n ? {}\n : {\n viewport: {\n height: input.viewport.height,\n label: input.viewport.label,\n width: input.viewport.width,\n },\n }),\n };\n}\n\nfunction parseToolInput<TName extends SurfaceMcpToolName>(\n name: TName,\n input: unknown,\n): Result<z.infer<(typeof TOOL_INPUT_SCHEMAS)[TName]>> {\n const parsed = TOOL_INPUT_SCHEMAS[name].safeParse(input);\n\n if (!parsed.success) {\n return err(\n createSurfaceError(\"config_invalid\", \"MCP tool input did not match the registered schema.\", {\n cause: parsed.error,\n details: { tool: name },\n }),\n );\n }\n\n return ok(parsed.data as z.infer<(typeof TOOL_INPUT_SCHEMAS)[TName]>);\n}\n\nfunction nextRunId(session: SurfaceMcpSessionState): string {\n const runId = `run_mcp_${session.nextRunSequence.toString().padStart(4, \"0\")}`;\n session.nextRunSequence += 1;\n\n return runId;\n}\n\nfunction nextBaselineId(session: SurfaceMcpSessionState): string {\n const baselineId = `baseline_mcp_${session.nextBaselineSequence.toString().padStart(4, \"0\")}`;\n session.nextBaselineSequence += 1;\n\n return baselineId;\n}\n\nfunction nextMcpPipelineRunId(): string {\n return `run_mcp_pipeline_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction isExecutableStageId(step: string): step is ExecutablePipelineStageId {\n return DEFAULT_COMPOSITION_STAGE_IDS.includes(step as ExecutablePipelineStageId);\n}\n\nfunction eligibleStagesAfter(lastCompletedStage: string): readonly ExecutablePipelineStageId[] {\n const index = DEFAULT_COMPOSITION_STAGE_IDS.findIndex((stage) => stage === lastCompletedStage);\n\n if (index === -1) {\n return DEFAULT_COMPOSITION_STAGE_IDS;\n }\n\n return DEFAULT_COMPOSITION_STAGE_IDS.slice(index + 1);\n}\n\nfunction runRecordFor(\n session: SurfaceMcpSessionState,\n runId: string | undefined,\n): SurfaceMcpRunRecord | undefined {\n if (runId !== undefined) {\n return session.runs.get(runId);\n }\n\n const latestRunId = session.runOrder.at(-1);\n\n return latestRunId === undefined ? undefined : session.runs.get(latestRunId);\n}\n\nfunction findStoredFinding(\n session: SurfaceMcpSessionState,\n findingId: string,\n): Finding | undefined {\n for (const runId of session.runOrder) {\n const record = session.runs.get(runId);\n const finding = record?.findings.find((candidate) => candidate.id === findingId);\n\n if (finding !== undefined) {\n return finding;\n }\n }\n\n return undefined;\n}\n\nfunction trackedFindingsForRun(\n session: SurfaceMcpSessionState,\n runId: string,\n findings: readonly Finding[],\n): readonly TrackedFinding[] {\n return findings.map((finding) => {\n const initial = createTrackedFinding({\n finding,\n runId,\n validation: validationForFinding(finding),\n });\n const previous = session.trackedByIdentity.get(initial.identityKey);\n const trackedFinding =\n previous === undefined\n ? initial\n : transitionTrackedFinding(previous, { finding, kind: \"detected\", runId });\n\n session.trackedByIdentity.set(trackedFinding.identityKey, trackedFinding);\n\n return trackedFinding;\n });\n}\n\nfunction validationForFinding(finding: Finding): ValidationCheck {\n if (finding.method === \"measured\") {\n const toolEvidence = finding.evidence.find((entry) => entry.kind === \"tool-result\");\n\n return {\n expectation:\n toolEvidence === undefined\n ? `${finding.lens}/${finding.issueType} remains resolved.`\n : `${toolEvidence.tool} ${toolEvidence.rule} passes for ${locationLabelFor(finding)}.`,\n kind: \"measured-rule\",\n };\n }\n\n return {\n expectation: `${finding.lens}/${finding.issueType} should be re-evaluated at ${locationLabelFor(\n finding,\n )}.`,\n kind: \"re-evaluate-lens\",\n };\n}\n\nfunction locationLabelFor(finding: Finding): string {\n return (\n finding.location.elementRef ??\n finding.location.selector ??\n finding.location.component ??\n finding.location.file ??\n finding.id\n );\n}\n\nfunction latestBaseline(session: SurfaceMcpSessionState): SurfaceMcpBaselineRecord | undefined {\n const baselineId = session.baselineOrder.at(-1);\n\n return baselineId === undefined ? undefined : session.baselines.get(baselineId);\n}\n\nfunction trackedFindingForRunFinding(\n record: SurfaceMcpRunRecord,\n findingId: string,\n): TrackedFinding | undefined {\n return record.trackedFindings.find(\n (trackedFinding) => trackedFinding.currentFindingId === findingId,\n );\n}\n\nfunction findStoredTrackedFinding(\n session: SurfaceMcpSessionState,\n findingId: string,\n): TrackedFinding | undefined {\n for (const trackedFinding of session.trackedByIdentity.values()) {\n if (trackedFinding.currentFindingId === findingId) {\n return trackedFinding;\n }\n }\n\n return undefined;\n}\n\nexport async function createSurfaceSdkMcpServer(\n options: SurfaceMcpServerOptions = {},\n): Promise<unknown> {\n const surfaceServer = createSurfaceMcpServer(options);\n\n const [{ McpServer }] = await Promise.all([import(\"@modelcontextprotocol/sdk/server/mcp.js\")]);\n const server = new McpServer({\n name: SURFACE_MCP_SERVER_NAME,\n version: SURFACE_MCP_SERVER_VERSION,\n }) as SdkMcpServer;\n\n for (const tool of INTERNAL_TOOLS) {\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.inputZodSchema,\n title: tool.title,\n },\n async (input) => mcpToolCallResult(await surfaceServer.callTool(tool.name, input)),\n );\n }\n\n return server;\n}\n\nexport async function runSurfaceMcpStdioServer(\n options: SurfaceMcpServerOptions = {},\n): Promise<void> {\n const [{ StdioServerTransport }, server] = await Promise.all([\n import(\"@modelcontextprotocol/sdk/server/stdio.js\"),\n createSurfaceSdkMcpServer(options),\n ]);\n\n await (server as SdkMcpServer).connect(new StdioServerTransport());\n}\n\ntype SdkMcpServer = {\n connect(transport: unknown): Promise<void>;\n registerTool(\n name: string,\n config: {\n readonly description: string;\n readonly inputSchema: unknown;\n readonly title: string;\n },\n handler: (input: unknown) => unknown,\n ): void;\n};\n\nfunction mcpToolCallResult(result: Result<SurfaceMcpToolOutput>): {\n readonly content: readonly { readonly text: string; readonly type: \"text\" }[];\n readonly isError?: true;\n readonly structuredContent: unknown;\n} {\n if (isOk(result)) {\n return {\n content: [{ text: JSON.stringify(result.value, null, 2), type: \"text\" }],\n structuredContent: result.value,\n };\n }\n\n return {\n content: [{ text: result.error.message, type: \"text\" }],\n isError: true,\n structuredContent: toMcpError(result.error),\n };\n}\n\nfunction publicToolDefinition(tool: InternalSurfaceMcpToolDefinition): SurfaceMcpToolDefinition {\n return {\n description: tool.description,\n inputSchema: tool.inputSchema,\n name: tool.name,\n schemaVersion: tool.schemaVersion,\n title: tool.title,\n };\n}\n\nfunction requiredFields(schema: JsonSchema): ReadonlySet<string> {\n const required = schema.required;\n\n return Array.isArray(required)\n ? new Set(required.filter((field): field is string => typeof field === \"string\"))\n : new Set();\n}\n\nfunction hasMajorVersionIncrement(currentVersion: string, nextVersion: string): boolean {\n const currentMajor = majorVersion(currentVersion);\n const nextMajor = majorVersion(nextVersion);\n\n return currentMajor !== undefined && nextMajor !== undefined && nextMajor > currentMajor;\n}\n\nfunction majorVersion(version: string): number | undefined {\n const match = /^(\\d+)\\./u.exec(version);\n const value = match?.[1];\n\n if (value === undefined) {\n return undefined;\n }\n\n const major = Number(value);\n\n return Number.isInteger(major) ? major : undefined;\n}\n\nfunction mcpSchemaIncompatible(\n message: string,\n input: McpToolSchemaCompatibilityInput,\n details: Record<string, unknown> = {},\n): Result<never, SurfaceError> {\n return err(\n createSurfaceError(\"mcp_schema_incompatible\", message, {\n details: {\n current: {\n name: input.current.name,\n schemaVersion: input.current.schemaVersion,\n },\n next: {\n name: input.next.name,\n schemaVersion: input.next.schemaVersion,\n },\n ...details,\n },\n }),\n );\n}\n\nif (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.argv[1]).href) {\n await runSurfaceMcpStdioServer();\n}\n","import {\n createSurfaceError,\n err,\n isOk,\n ok,\n toMcpError,\n type Result,\n type SurfaceError,\n} from \"@zigrivers/surface-core\";\nimport { z } from \"zod\";\n\nexport const BROWSER_QA_MCP_TOOL_NAMES = [\n \"surface_qa\",\n \"surface_explore\",\n \"surface_flow_run\",\n \"surface_flow_list\",\n \"surface_flow_promote\",\n \"surface_evidence\",\n \"surface_replay\",\n \"surface_report_qa\",\n \"surface_artifact_read\",\n] as const;\n\nexport const BROWSER_QA_MCP_SERVER_TOOL_NAMES = [\n \"surface_qa\",\n \"surface_explore\",\n \"surface_flow_run\",\n \"surface_flow_list\",\n \"surface_flow_promote\",\n \"surface_evidence\",\n \"surface_replay\",\n \"surface_report_qa\",\n \"surface_artifact_read\",\n] as const;\n\nexport type BrowserQaMcpToolName = (typeof BROWSER_QA_MCP_TOOL_NAMES)[number];\nexport type BrowserQaMcpServerToolName = (typeof BROWSER_QA_MCP_SERVER_TOOL_NAMES)[number];\n\nexport type BrowserQaMcpServerToolOutputMap = {\n readonly [Name in BrowserQaMcpServerToolName]: unknown;\n};\n\nexport type BrowserQaMcpToolCallResult = {\n readonly content: readonly { readonly text: string; readonly type: \"text\" }[];\n readonly isError?: true;\n readonly structuredContent: unknown;\n};\n\nexport type BrowserQaMcpToolDefinition = {\n readonly description: string;\n readonly handler: (input: unknown) => Promise<BrowserQaMcpToolCallResult>;\n readonly inputSchema: Record<string, unknown>;\n readonly inputZodSchema: z.ZodType;\n readonly name: BrowserQaMcpToolName;\n readonly schemaVersion: string;\n readonly title: string;\n};\n\nexport type BrowserQaMcpHandlers = {\n readonly artifactRead: (input: SurfaceArtifactReadInput) => Promise<Result<unknown>>;\n readonly evidence: (input: SurfaceEvidenceInput) => Promise<Result<unknown>>;\n readonly explore: (input: SurfaceExploreInput) => Promise<Result<unknown>>;\n readonly flowList: (input: SurfaceFlowListInput) => Promise<Result<unknown>>;\n readonly flowPromote: (input: SurfaceFlowPromoteInput) => Promise<Result<unknown>>;\n readonly flowRun: (input: SurfaceFlowRunInput) => Promise<Result<unknown>>;\n readonly qa: (input: SurfaceQaInput) => Promise<Result<unknown>>;\n readonly replay: (input: SurfaceReplayInput) => Promise<Result<unknown>>;\n readonly reportQa: (input: SurfaceReportQaInput) => Promise<Result<unknown>>;\n};\n\nconst BROWSER_QA_MCP_TOOL_SCHEMA_VERSION = \"1.0.0\";\n\nconst TargetInputSchema = z\n .object({\n kind: z.enum([\"url\", \"localhost\", \"route\", \"screenshot\", \"component\", \"dom\"]),\n ref: z.string().min(1),\n theme: z.enum([\"light\", \"dark\"]).optional(),\n viewport: z\n .object({\n height: z.number().int().positive(),\n label: z.enum([\"mobile\", \"tablet\", \"desktop\"]),\n width: z.number().int().positive(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nconst SurfaceQaInputSchema = z\n .object({\n actionPolicyRef: z.string().min(1).optional(),\n allowedDomains: z.array(z.string().min(1)).optional(),\n ci: z.boolean().optional(),\n evidence: z.enum([\"minimal\", \"failures\", \"full\"]).optional(),\n explore: z.boolean().optional(),\n flows: z.array(z.string().min(1)).optional(),\n maxActions: z.number().int().positive().optional(),\n maxDepth: z.number().int().positive().optional(),\n maxStates: z.number().int().positive().optional(),\n network: z.enum([\"summary\", \"har\", \"off\"]).optional(),\n scope: z.string().min(1).optional(),\n sessionMode: z.enum([\"isolated\", \"shared\"]).optional(),\n stateLockTimeoutMs: z.number().int().positive().optional(),\n target: TargetInputSchema,\n task: z.string().min(1).optional(),\n video: z.enum([\"off\", \"failures\", \"all\"]).optional(),\n })\n .strict();\nconst SurfaceExploreInputSchema = z\n .object({\n actionPolicyRef: z.string().min(1).optional(),\n allowedDomains: z.array(z.string().min(1)).optional(),\n evidence: z.enum([\"minimal\", \"failures\", \"full\"]).optional(),\n maxActions: z.number().int().positive().optional(),\n maxDepth: z.number().int().positive().optional(),\n maxStates: z.number().int().positive().optional(),\n network: z.enum([\"summary\", \"har\", \"off\"]).optional(),\n scope: z.string().min(1).optional(),\n sessionMode: z.enum([\"isolated\", \"shared\"]).optional(),\n stateLockTimeoutMs: z.number().int().positive().optional(),\n target: TargetInputSchema,\n task: z.string().min(1).optional(),\n video: z.enum([\"off\", \"failures\", \"all\"]).optional(),\n })\n .strict();\nconst SurfaceFlowRunInputSchema = z\n .object({\n actionPolicyRef: z.string().min(1).optional(),\n baseUrl: z.string().min(1).optional(),\n ci: z.boolean().optional(),\n flowPath: z.string().min(1),\n localhost: z.boolean().optional(),\n target: z.string().min(1).optional(),\n url: z.string().min(1).optional(),\n })\n .strict()\n .refine(\n (input) =>\n [input.target, input.url, input.localhost === true ? \"localhost\" : undefined].filter(\n (value) => value !== undefined,\n ).length <= 1,\n \"Pass at most one of target, url, or localhost.\",\n );\nconst SurfaceFlowListInputSchema = z.object({ candidates: z.boolean().optional() }).strict();\nconst SurfaceFlowPromoteInputSchema = z\n .object({\n candidateFlowId: z.string().min(1),\n outPath: z.string().min(1),\n })\n .strict();\nconst SurfaceEvidenceInputSchema = z.object({ refId: z.string().min(1) }).strict();\nconst SurfaceReplayInputSchema = z\n .object({\n promoteOnRepro: z.boolean().optional(),\n refId: z.string().min(1),\n })\n .strict();\nconst SurfaceReportQaInputSchema = z\n .object({\n format: z.enum([\"md\", \"json\", \"manifest\"]).optional(),\n runId: z.string().min(1),\n })\n .strict();\nconst SurfaceArtifactReadInputSchema = z\n .object({\n artifactId: z.string().min(1),\n maxBytes: z.number().int().positive().max(65_536).optional(),\n refId: z.string().min(1),\n })\n .strict();\n\nexport type SurfaceQaInput = z.infer<typeof SurfaceQaInputSchema>;\nexport type SurfaceExploreInput = z.infer<typeof SurfaceExploreInputSchema>;\nexport type SurfaceFlowRunInput = z.infer<typeof SurfaceFlowRunInputSchema>;\nexport type SurfaceFlowListInput = z.infer<typeof SurfaceFlowListInputSchema>;\nexport type SurfaceFlowPromoteInput = z.infer<typeof SurfaceFlowPromoteInputSchema>;\nexport type SurfaceEvidenceInput = z.infer<typeof SurfaceEvidenceInputSchema>;\nexport type SurfaceReplayInput = z.infer<typeof SurfaceReplayInputSchema>;\nexport type SurfaceReportQaInput = z.infer<typeof SurfaceReportQaInputSchema>;\nexport type SurfaceArtifactReadInput = z.infer<typeof SurfaceArtifactReadInputSchema>;\n\nexport const BROWSER_QA_MCP_SERVER_INPUT_SCHEMAS = {\n surface_qa: SurfaceQaInputSchema,\n surface_explore: SurfaceExploreInputSchema,\n surface_flow_run: SurfaceFlowRunInputSchema,\n surface_flow_list: SurfaceFlowListInputSchema,\n surface_flow_promote: SurfaceFlowPromoteInputSchema,\n surface_evidence: SurfaceEvidenceInputSchema,\n surface_replay: SurfaceReplayInputSchema,\n surface_report_qa: SurfaceReportQaInputSchema,\n surface_artifact_read: SurfaceArtifactReadInputSchema,\n} as const satisfies Record<BrowserQaMcpServerToolName, z.ZodType>;\n\nconst BROWSER_QA_MCP_TOOL_INPUT_SCHEMAS = BROWSER_QA_MCP_SERVER_INPUT_SCHEMAS satisfies Record<\n BrowserQaMcpToolName,\n z.ZodType\n>;\n\nexport const BROWSER_QA_MCP_SERVER_TOOL_METADATA = {\n surface_qa: {\n description: \"Run agent-led browser QA over a target.\",\n title: \"Run Browser QA\",\n },\n surface_explore: {\n description: \"Run bounded browser QA exploration.\",\n title: \"Explore Browser QA\",\n },\n surface_flow_run: {\n description: \"Run a reviewed browser QA flow.\",\n title: \"Run Browser QA Flow\",\n },\n surface_flow_list: {\n description: \"List browser QA flow runs or candidate flows.\",\n title: \"List Browser QA Flows\",\n },\n surface_flow_promote: {\n description: \"Promote a candidate browser QA flow.\",\n title: \"Promote Browser QA Flow\",\n },\n surface_evidence: {\n description: \"Read redacted browser QA evidence metadata.\",\n title: \"Read Browser QA Evidence\",\n },\n surface_replay: {\n description: \"Replay a browser QA candidate or finding.\",\n title: \"Replay Browser QA Finding\",\n },\n surface_report_qa: {\n description: \"Render a browser QA report.\",\n title: \"Render Browser QA Report\",\n },\n surface_artifact_read: {\n description: \"Read a bounded MCP-approved browser QA artifact by registered refs.\",\n title: \"Read Browser QA Artifact\",\n },\n} as const satisfies Record<\n BrowserQaMcpServerToolName,\n { readonly description: string; readonly title: string }\n>;\n\nconst BROWSER_QA_MCP_TOOL_METADATA = BROWSER_QA_MCP_SERVER_TOOL_METADATA satisfies Record<\n BrowserQaMcpToolName,\n { readonly description: string; readonly title: string }\n>;\n\nconst BROWSER_QA_MCP_SERVER_TOOL_NAME_SET = new Set<string>(BROWSER_QA_MCP_SERVER_TOOL_NAMES);\nconst REGISTERED_REF_ID_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9_-]*$/u;\n\nexport function createBrowserQaMcpTools(\n handlers: BrowserQaMcpHandlers,\n): readonly BrowserQaMcpToolDefinition[] {\n return BROWSER_QA_MCP_TOOL_NAMES.map((name) => {\n const metadata = BROWSER_QA_MCP_TOOL_METADATA[name];\n const inputZodSchema = BROWSER_QA_MCP_TOOL_INPUT_SCHEMAS[name];\n\n return {\n name,\n ...metadata,\n handler: async (input) =>\n mcpToolCallResult(await callBrowserQaMcpTool({ handlers, input, name })),\n inputSchema: z.toJSONSchema(inputZodSchema),\n inputZodSchema,\n schemaVersion: BROWSER_QA_MCP_TOOL_SCHEMA_VERSION,\n };\n });\n}\n\nexport function createBrowserQaMcpHandlers(composition: unknown): BrowserQaMcpHandlers {\n const browserQa = browserQaFromComposition(composition);\n const orchestrator = browserQa?.orchestrator;\n const flowService = browserQa?.flowService;\n const evidenceStore = browserQa?.evidenceStore;\n\n return {\n artifactRead: (input) =>\n evidenceStore?.readArtifactByRegisteredRef(input) ??\n Promise.resolve(qaMcpUnavailable(\"Browser QA evidence artifact reads are unavailable.\")),\n evidence: (input) =>\n orchestrator?.readEvidence(input) ??\n Promise.resolve(qaMcpUnavailable(\"Browser QA evidence reads are unavailable.\")),\n explore: (input) =>\n orchestrator?.runExplore({\n ...input,\n maxActions: input.maxActions ?? 25,\n maxDepth: input.maxDepth ?? 2,\n maxStates: input.maxStates ?? 10,\n }) ?? Promise.resolve(qaMcpUnavailable(\"Browser QA exploration is unavailable.\")),\n flowList: (input) =>\n flowService?.listFlows(input) ??\n Promise.resolve(qaMcpUnavailable(\"Browser QA flow listing is unavailable.\")),\n flowPromote: (input) =>\n flowService?.promoteFlow(input) ??\n Promise.resolve(qaMcpUnavailable(\"Browser QA flow promotion is unavailable.\")),\n flowRun: (input) =>\n flowService?.runFlowFile({\n ...(input.actionPolicyRef === undefined ? {} : { actionPolicyRef: input.actionPolicyRef }),\n ...(input.ci === undefined ? {} : { ci: input.ci }),\n flowPath: input.flowPath,\n targetCli: targetCliForFlowRun(input),\n }) ?? Promise.resolve(qaMcpUnavailable(\"Browser QA flow running is unavailable.\")),\n qa: (input) =>\n orchestrator?.runQa(input) ??\n Promise.resolve(qaMcpUnavailable(\"Browser QA orchestration is unavailable.\")),\n replay: (input) =>\n orchestrator?.replay(input) ??\n Promise.resolve(qaMcpUnavailable(\"Browser QA replay is unavailable.\")),\n reportQa: (input) =>\n orchestrator?.reportQa(input) ??\n Promise.resolve(qaMcpUnavailable(\"Browser QA reports are unavailable.\")),\n };\n}\n\nexport function isBrowserQaMcpServerToolName(name: string): name is BrowserQaMcpServerToolName {\n return BROWSER_QA_MCP_SERVER_TOOL_NAME_SET.has(name);\n}\n\nexport async function callBrowserQaMcpTool(input: {\n readonly handlers: BrowserQaMcpHandlers;\n readonly input: unknown;\n readonly name: BrowserQaMcpToolName;\n}): Promise<Result<unknown>> {\n const parsed = parseBrowserQaToolInput(input.name, input.input);\n\n if (!parsed.ok) {\n return parsed;\n }\n\n switch (input.name) {\n case \"surface_qa\":\n return await input.handlers.qa(parsed.value as SurfaceQaInput);\n case \"surface_explore\":\n return await input.handlers.explore(parsed.value as SurfaceExploreInput);\n case \"surface_flow_run\":\n return await input.handlers.flowRun(parsed.value as SurfaceFlowRunInput);\n case \"surface_flow_list\":\n return await input.handlers.flowList(parsed.value as SurfaceFlowListInput);\n case \"surface_flow_promote\":\n return await input.handlers.flowPromote(parsed.value as SurfaceFlowPromoteInput);\n case \"surface_evidence\":\n return await input.handlers.evidence(parsed.value as SurfaceEvidenceInput);\n case \"surface_replay\":\n return await input.handlers.replay(parsed.value as SurfaceReplayInput);\n case \"surface_report_qa\":\n return await input.handlers.reportQa(parsed.value as SurfaceReportQaInput);\n case \"surface_artifact_read\":\n return await callArtifactReadHandler(\n input.handlers,\n parsed.value as SurfaceArtifactReadInput,\n );\n }\n}\n\ntype BrowserQaCompositionLike = {\n readonly browserQa?: {\n readonly evidenceStore?: {\n readonly readArtifactByRegisteredRef: (\n input: SurfaceArtifactReadInput,\n ) => Promise<Result<unknown>>;\n };\n readonly flowService?: {\n readonly listFlows: (input: SurfaceFlowListInput) => Promise<Result<unknown>>;\n readonly promoteFlow: (input: SurfaceFlowPromoteInput) => Promise<Result<unknown>>;\n readonly runFlowFile: (input: {\n readonly actionPolicyRef?: string;\n readonly ci?: boolean;\n readonly flowPath: string;\n readonly targetCli: {\n readonly baseUrl?: string;\n readonly localhost?: boolean;\n readonly target?: string;\n readonly url?: string;\n };\n }) => Promise<Result<unknown>>;\n };\n readonly orchestrator?: {\n readonly readEvidence: (input: SurfaceEvidenceInput) => Promise<Result<unknown>>;\n readonly replay: (input: SurfaceReplayInput) => Promise<Result<unknown>>;\n readonly reportQa: (input: SurfaceReportQaInput) => Promise<Result<unknown>>;\n readonly runExplore: (input: SurfaceExploreInput) => Promise<Result<unknown>>;\n readonly runQa: (input: SurfaceQaInput) => Promise<Result<unknown>>;\n };\n };\n};\n\nfunction parseBrowserQaToolInput(name: BrowserQaMcpToolName, input: unknown): Result<unknown> {\n const parsed = BROWSER_QA_MCP_TOOL_INPUT_SCHEMAS[name].safeParse(input);\n\n if (!parsed.success) {\n return err(\n createSurfaceError(\"config_invalid\", \"Browser QA MCP input did not match its schema.\", {\n cause: parsed.error,\n details: { tool: name },\n }),\n );\n }\n\n return ok(parsed.data);\n}\n\nasync function callArtifactReadHandler(\n handlers: BrowserQaMcpHandlers,\n input: SurfaceArtifactReadInput,\n): Promise<Result<unknown>> {\n const refCheck = validateRegisteredRef(input.refId, \"refId\");\n\n if (!refCheck.ok) {\n return refCheck;\n }\n\n const artifactCheck = validateRegisteredRef(input.artifactId, \"artifactId\");\n\n if (!artifactCheck.ok) {\n return artifactCheck;\n }\n\n return await handlers.artifactRead({ ...input, maxBytes: input.maxBytes ?? 8192 });\n}\n\nfunction validateRegisteredRef(value: string, field: string): Result<true> {\n if (!REGISTERED_REF_ID_PATTERN.test(value) || value.includes(\"..\")) {\n return err(\n createSurfaceError(\"config_invalid\", \"Browser QA artifact reads require registered ids.\", {\n details: { field },\n }),\n );\n }\n\n return ok(true);\n}\n\nfunction browserQaFromComposition(composition: unknown): BrowserQaCompositionLike[\"browserQa\"] {\n return (composition as BrowserQaCompositionLike).browserQa;\n}\n\nfunction targetCliForFlowRun(input: SurfaceFlowRunInput): {\n readonly baseUrl?: string;\n readonly localhost?: boolean;\n readonly target?: string;\n readonly url?: string;\n} {\n return {\n ...(input.baseUrl === undefined ? {} : { baseUrl: input.baseUrl }),\n ...(input.localhost === true ? { localhost: true } : {}),\n ...(input.target === undefined ? {} : { target: input.target }),\n ...(input.url === undefined ? {} : { url: input.url }),\n };\n}\n\nfunction qaMcpUnavailable(message: string): Result<never, SurfaceError> {\n return err(createSurfaceError(\"qa_unavailable\", message));\n}\n\nfunction mcpToolCallResult(result: Result<unknown>): BrowserQaMcpToolCallResult {\n if (isOk(result)) {\n return {\n content: [{ text: JSON.stringify(result.value, null, 2), type: \"text\" }],\n structuredContent: result.value,\n };\n }\n\n return {\n content: [{ text: result.error.message, type: \"text\" }],\n isError: true,\n structuredContent: toMcpError(result.error),\n };\n}\n"],"mappings":"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","names":["createSurfaceError","err","isOk","ok","toMcpError","z","z","ok","err","createSurfaceError","isOk","toMcpError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zigrivers/surface-mcp",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "dependencies": {
19
19
  "@modelcontextprotocol/sdk": "^1.29.0",
20
20
  "zod": "^4.1.13",
21
- "@zigrivers/surface-core": "0.1.1"
21
+ "@zigrivers/surface-core": "0.2.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^22.13.0",