@remixhq/mcp 0.1.2
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/LICENSE +21 -0
- package/README.md +15 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1720 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1708 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +54 -0
- package/dist/server.js +1708 -0
- package/dist/server.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/domain/apiClient.ts","../src/bootstrap/auth.ts","../src/observability/logger.ts","../src/policy/policy.ts","../src/errors/normalizeError.ts","../src/errors/errorCodes.ts","../src/bootstrap/context.ts","../src/tools/collab/register.ts","../src/contracts/collab.ts","../src/contracts/common.ts","../src/domain/coreAdapter.ts","../src/tools/memory/register.ts","../src/contracts/memory.ts","../src/domain/memoryAdapter.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport { createServerContext } from \"./bootstrap/context.js\";\nimport { registerCollabTools } from \"./tools/collab/register.js\";\nimport { registerMemoryTools } from \"./tools/memory/register.js\";\n\nexport function createRemixMcpServer(params: { version: string }) {\n const context = createServerContext({ version: params.version });\n const server = new McpServer({\n name: context.serverName,\n version: context.version,\n });\n\n registerCollabTools(server, context);\n registerMemoryTools(server, context);\n\n return { server, context };\n}\n\nexport async function startStdioServer(params: { version: string }): Promise<void> {\n const { server } = createRemixMcpServer(params);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { createApiClient as createCoreApiClient, resolveConfig, type ApiClient } from \"@remixhq/core\";\nimport type { CollabApiClient } from \"@remixhq/core/collab\";\n\nimport { createRemixTokenProvider } from \"../bootstrap/auth.js\";\n\nexport async function createCollabApiClient(): Promise<CollabApiClient> {\n const config = await resolveConfig();\n const tokenProvider = await createRemixTokenProvider(config);\n const api = createCoreApiClient(config, {\n tokenProvider,\n });\n return api as unknown as CollabApiClient;\n}\n\nexport async function createApiClient(): Promise<ApiClient> {\n const config = await resolveConfig();\n const tokenProvider = await createRemixTokenProvider(config);\n return createCoreApiClient(config, {\n tokenProvider,\n });\n}\n","import { createLocalSessionStore, createStoredSessionTokenProvider, createSupabaseAuthHelpers, resolveConfig, type CoreConfig } from \"@remixhq/core\";\nimport type { TokenProvider } from \"@remixhq/core/auth\";\n\nexport async function createRemixTokenProvider(config?: CoreConfig): Promise<TokenProvider> {\n const resolvedConfig = config ?? (await resolveConfig());\n const sessionStore = createLocalSessionStore();\n return createStoredSessionTokenProvider({\n config: resolvedConfig,\n sessionStore,\n refreshStoredSession: async ({ config: refreshConfig, session }) => {\n const supabase = createSupabaseAuthHelpers(refreshConfig);\n return supabase.refreshWithStoredSession({ session });\n },\n });\n}\n","export type LogLevel = \"info\" | \"error\";\n\nexport type LogEvent = {\n level: LogLevel;\n message: string;\n tool?: string;\n requestId?: string | null;\n durationMs?: number;\n result?: \"success\" | \"error\";\n errorCode?: string | null;\n repoRoot?: string | null;\n appId?: string | null;\n mrId?: string | null;\n truncated?: boolean;\n};\n\nexport type Logger = {\n log(event: LogEvent): void;\n};\n\nexport function createLogger(): Logger {\n return {\n log(event) {\n const payload = {\n timestamp: new Date().toISOString(),\n ...event,\n };\n const line = JSON.stringify(payload);\n if (event.level === \"error\") {\n process.stderr.write(`${line}\\n`);\n return;\n }\n process.stderr.write(`${line}\\n`);\n },\n };\n}\n","import path from \"node:path\";\n\nimport { createPolicyError } from \"../errors/normalizeError.js\";\n\nexport type ToolAccess = \"read\" | \"remote_write\" | \"local_write\";\n\nexport type Policy = {\n allowLocalWrite: boolean;\n allowRemoteWrite: boolean;\n allowedRepoRoots: string[] | null;\n maxDiffBytes: number;\n maxDiffOutputChars: number;\n};\n\nfunction parseBooleanEnv(name: string, fallback: boolean): boolean {\n const raw = process.env[name];\n if (!raw) return fallback;\n const normalized = raw.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nfunction parsePositiveIntEnv(name: string, fallback: number): number {\n const raw = process.env[name];\n if (!raw) return fallback;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\n}\n\nfunction parseAllowedRoots(raw: string | undefined): string[] | null {\n if (!raw) return null;\n const roots = raw\n .split(path.delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map((entry) => path.resolve(entry));\n return roots.length > 0 ? roots : null;\n}\n\nfunction isWithinRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nexport function loadPolicy(): Policy {\n return {\n allowLocalWrite: parseBooleanEnv(\"COMERGE_MCP_ALLOW_LOCAL_WRITE\", true),\n allowRemoteWrite: parseBooleanEnv(\"COMERGE_MCP_ALLOW_REMOTE_WRITE\", true),\n allowedRepoRoots: parseAllowedRoots(process.env.COMERGE_MCP_ALLOWED_REPO_ROOTS),\n maxDiffBytes: parsePositiveIntEnv(\"COMERGE_MCP_MAX_DIFF_BYTES\", 1024 * 1024),\n maxDiffOutputChars: parsePositiveIntEnv(\"COMERGE_MCP_MAX_DIFF_OUTPUT_CHARS\", 20_000),\n };\n}\n\nexport function resolvePolicyCwd(policy: Policy, cwd: string | undefined): string {\n const resolved = path.resolve(cwd?.trim() || process.cwd());\n if (!policy.allowedRepoRoots) return resolved;\n if (policy.allowedRepoRoots.some((root) => isWithinRoot(root, resolved))) return resolved;\n throw createPolicyError(\"Requested working directory is outside the allowed repository roots.\", resolved);\n}\n\nexport function assertToolAccess(policy: Policy, access: ToolAccess): void {\n if (access === \"read\") return;\n if (access === \"remote_write\" && !policy.allowRemoteWrite) {\n throw createPolicyError(\"Remote-mutating Remix tools are disabled by policy.\");\n }\n if (access === \"local_write\" && !policy.allowLocalWrite) {\n throw createPolicyError(\"Local-mutating Remix tools are disabled by policy.\");\n }\n}\n\nexport function assertConfirm(confirm: boolean | undefined, operation: string): void {\n if (confirm) return;\n throw createPolicyError(`${operation} requires explicit confirmation.`, \"Pass confirm=true to run this tool.\");\n}\n\nexport function assertDiffWithinLimit(policy: Policy, diff: string): void {\n const sizeBytes = Buffer.byteLength(diff, \"utf8\");\n if (sizeBytes <= policy.maxDiffBytes) return;\n throw createPolicyError(\n \"Diff exceeds the configured maximum size for Remix MCP.\",\n `Configured limit=${policy.maxDiffBytes} bytes actual=${sizeBytes} bytes.`,\n );\n}\n\nexport function truncateText(policy: Policy, value: string): { value: string; truncated: boolean; originalChars: number } {\n const originalChars = value.length;\n if (originalChars <= policy.maxDiffOutputChars) {\n return { value, truncated: false, originalChars };\n }\n return {\n value: `${value.slice(0, policy.maxDiffOutputChars)}\\n\\n[truncated ${originalChars - policy.maxDiffOutputChars} chars]`,\n truncated: true,\n originalChars,\n };\n}\n","import { ZodError } from \"zod\";\n\nimport { ERROR_CODES, type ErrorCategory, type ErrorCode, type NormalizedToolError, RemixMcpError } from \"./errorCodes.js\";\n\ntype ErrorLike = {\n code?: unknown;\n message?: unknown;\n hint?: unknown;\n exitCode?: unknown;\n};\n\nfunction toStringOrNull(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction makeNormalized(params: {\n code: ErrorCode;\n message: string;\n hint?: string | null;\n retryable?: boolean;\n category: ErrorCategory;\n}): NormalizedToolError {\n return {\n code: params.code,\n message: params.message,\n hint: params.hint ?? null,\n retryable: params.retryable ?? false,\n category: params.category,\n };\n}\n\nfunction normalizeByMessage(err: ErrorLike): NormalizedToolError {\n const code = toStringOrNull(err.code);\n const message = toStringOrNull(err.message) ?? \"Unexpected error.\";\n const hint = toStringOrNull(err.hint);\n\n if (code === ERROR_CODES.REPO_LOCK_HELD) {\n return makeNormalized({\n code: ERROR_CODES.REPO_LOCK_HELD,\n message,\n hint,\n retryable: true,\n category: \"local_state\",\n });\n }\n\n if (code === ERROR_CODES.REPO_LOCK_TIMEOUT) {\n return makeNormalized({\n code: ERROR_CODES.REPO_LOCK_TIMEOUT,\n message,\n hint,\n retryable: true,\n category: \"local_state\",\n });\n }\n\n if (code === ERROR_CODES.REPO_STATE_CHANGED_DURING_OPERATION) {\n return makeNormalized({\n code: ERROR_CODES.REPO_STATE_CHANGED_DURING_OPERATION,\n message,\n hint,\n retryable: true,\n category: \"local_state\",\n });\n }\n\n if (code === ERROR_CODES.REPO_LOCK_STALE_RECOVERED) {\n return makeNormalized({\n code: ERROR_CODES.REPO_LOCK_STALE_RECOVERED,\n message,\n hint,\n retryable: true,\n category: \"local_state\",\n });\n }\n\n if (message === \"Not signed in.\") {\n return makeNormalized({\n code: ERROR_CODES.AUTH_REQUIRED,\n message,\n hint,\n category: \"auth\",\n });\n }\n\n if (message === \"Not inside a git repository.\") {\n return makeNormalized({\n code: ERROR_CODES.NOT_GIT_REPO,\n message,\n hint,\n category: \"local_state\",\n });\n }\n\n if (message === \"Repository is not bound to Remix.\") {\n return makeNormalized({\n code: ERROR_CODES.NOT_BOUND,\n message,\n hint,\n category: \"local_state\",\n });\n }\n\n if (message.includes(\"Working tree must be clean\")) {\n return makeNormalized({\n code: ERROR_CODES.DIRTY_WORKTREE,\n message,\n hint,\n category: \"local_state\",\n });\n }\n\n if (message.includes(\"requires a checked out local branch\") || message.includes(\"detached HEAD\")) {\n return makeNormalized({\n code: ERROR_CODES.DETACHED_HEAD,\n message,\n hint,\n category: \"local_state\",\n });\n }\n\n if (code === ERROR_CODES.PREFERRED_BRANCH_MISMATCH || message.includes(\"preferred branch\")) {\n return makeNormalized({\n code: ERROR_CODES.PREFERRED_BRANCH_MISMATCH,\n message,\n hint,\n category: \"local_state\",\n });\n }\n\n if (message.includes(\"Failed to resolve local HEAD\")) {\n return makeNormalized({\n code: ERROR_CODES.MISSING_HEAD,\n message,\n hint,\n category: \"local_state\",\n });\n }\n\n if (message.includes(\"metadata conflicts with the bound Remix app\") || message.includes(\"manual intervention\")) {\n return makeNormalized({\n code: ERROR_CODES.METADATA_CONFLICT,\n message,\n hint,\n category: \"remote_state\",\n });\n }\n\n if (message.includes(\"Timed out\") || message.includes(\"failed\") || message.includes(\"error state\")) {\n return makeNormalized({\n code: ERROR_CODES.REMOTE_ERROR,\n message,\n hint,\n retryable: true,\n category: \"remote_state\",\n });\n }\n\n return makeNormalized({\n code: ERROR_CODES.INTERNAL_ERROR,\n message,\n hint,\n retryable: true,\n category: \"internal\",\n });\n}\n\nexport function createPolicyError(message: string, hint?: string | null): RemixMcpError {\n return new RemixMcpError(\n makeNormalized({\n code: ERROR_CODES.DESTRUCTIVE_OPERATION_BLOCKED,\n message,\n hint,\n category: \"policy\",\n }),\n );\n}\n\nexport function createAuthRequiredError(hint?: string | null): RemixMcpError {\n return new RemixMcpError(\n makeNormalized({\n code: ERROR_CODES.AUTH_REQUIRED,\n message: \"COMERGE_ACCESS_TOKEN is required.\",\n hint: hint ?? \"Set COMERGE_ACCESS_TOKEN before using Remix MCP tools that call the backend.\",\n category: \"auth\",\n }),\n );\n}\n\nexport function normalizeToolError(error: unknown): NormalizedToolError {\n if (error instanceof RemixMcpError) {\n return error.normalized;\n }\n\n if (error instanceof ZodError) {\n return makeNormalized({\n code: ERROR_CODES.INVALID_INPUT,\n message: \"Tool arguments failed validation.\",\n hint: error.issues.map((issue) => `${issue.path.join(\".\") || \"input\"}: ${issue.message}`).join(\"; \"),\n category: \"validation\",\n });\n }\n\n if (error && typeof error === \"object\") {\n return normalizeByMessage(error as ErrorLike);\n }\n\n return makeNormalized({\n code: ERROR_CODES.INTERNAL_ERROR,\n message: typeof error === \"string\" && error.trim() ? error.trim() : \"Unexpected error.\",\n hint: null,\n retryable: true,\n category: \"internal\",\n });\n}\n","export const ERROR_CODES = {\n AUTH_REQUIRED: \"AUTH_REQUIRED\",\n INVALID_INPUT: \"INVALID_INPUT\",\n NOT_GIT_REPO: \"NOT_GIT_REPO\",\n NOT_BOUND: \"NOT_BOUND\",\n DIRTY_WORKTREE: \"DIRTY_WORKTREE\",\n DETACHED_HEAD: \"DETACHED_HEAD\",\n PREFERRED_BRANCH_MISMATCH: \"PREFERRED_BRANCH_MISMATCH\",\n MISSING_HEAD: \"MISSING_HEAD\",\n REPO_LOCK_HELD: \"REPO_LOCK_HELD\",\n REPO_LOCK_TIMEOUT: \"REPO_LOCK_TIMEOUT\",\n REPO_LOCK_STALE_RECOVERED: \"REPO_LOCK_STALE_RECOVERED\",\n REPO_STATE_CHANGED_DURING_OPERATION: \"REPO_STATE_CHANGED_DURING_OPERATION\",\n REMOTE_ERROR: \"REMOTE_ERROR\",\n METADATA_CONFLICT: \"METADATA_CONFLICT\",\n DESTRUCTIVE_OPERATION_BLOCKED: \"DESTRUCTIVE_OPERATION_BLOCKED\",\n CONFIG_INVALID: \"CONFIG_INVALID\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorCategory = \"auth\" | \"validation\" | \"local_state\" | \"remote_state\" | \"policy\" | \"config\" | \"internal\";\n\nexport type NormalizedToolError = {\n code: ErrorCode;\n message: string;\n hint: string | null;\n retryable: boolean;\n category: ErrorCategory;\n};\n\nexport class RemixMcpError extends Error {\n public readonly normalized: NormalizedToolError;\n\n constructor(normalized: NormalizedToolError) {\n super(normalized.message);\n this.name = \"RemixMcpError\";\n this.normalized = normalized;\n }\n}\n","import type { CollabApiClient } from \"@remixhq/core/collab\";\n\nimport { createCollabApiClient } from \"../domain/apiClient.js\";\nimport { createLogger, type Logger } from \"../observability/logger.js\";\nimport { loadPolicy, type Policy } from \"../policy/policy.js\";\n\nexport type ServerContext = {\n serverName: string;\n version: string;\n policy: Policy;\n logger: Logger;\n getCollabApiClient(): Promise<CollabApiClient>;\n agentMetadata: {\n type: string;\n name?: string;\n version?: string;\n provider?: string;\n };\n};\n\nexport function createServerContext(params: { version: string }): ServerContext {\n return {\n serverName: \"remix-mcp\",\n version: params.version,\n policy: loadPolicy(),\n logger: createLogger(),\n getCollabApiClient: () => createCollabApiClient(),\n agentMetadata: {\n type: process.env.COMERGE_AGENT_TYPE?.trim() || \"agent\",\n name: process.env.COMERGE_AGENT_NAME?.trim() || \"remix-mcp\",\n version: process.env.COMERGE_AGENT_VERSION?.trim() || params.version,\n provider: process.env.COMERGE_AGENT_PROVIDER?.trim() || \"remix\",\n },\n };\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\n\nimport type { ServerContext } from \"../../bootstrap/context.js\";\nimport {\n addInputSchema,\n recordTurnInputSchema,\n addSuccessSchema,\n recordTurnSuccessSchema,\n approveInputSchema,\n approveSuccessSchema,\n inboxInputSchema,\n inboxSuccessSchema,\n initInputSchema,\n initSuccessSchema,\n inviteInputSchema,\n inviteSuccessSchema,\n listInputSchema,\n listSuccessSchema,\n previewInputSchema,\n reconcileSuccessSchema,\n rejectInputSchema,\n rejectSuccessSchema,\n remixInputSchema,\n remixSuccessSchema,\n requestMergeInputSchema,\n requestMergeSuccessSchema,\n statusInputSchema,\n statusSuccessSchema,\n syncSuccessSchema,\n syncUpstreamSuccessSchema,\n viewMergeRequestInputSchema,\n viewMergeRequestSuccessSchema,\n applyInputSchema,\n} from \"../../contracts/collab.js\";\nimport { makeErrorResult, makeErrorSchema, makeSuccessResult, type ErrorEnvelope, type SuccessEnvelope, SCHEMA_VERSION } from \"../../contracts/common.js\";\nimport type { NormalizedToolError } from \"../../errors/errorCodes.js\";\nimport { normalizeToolError } from \"../../errors/normalizeError.js\";\nimport {\n addCollabStep,\n recordCollabTurn,\n approveMergeRequest,\n getStatus,\n inbox,\n initCollab,\n inviteCollaborator,\n listApps,\n reconcile,\n rejectMergeRequest,\n remixCollab,\n requestMerge,\n syncCollab,\n syncUpstream,\n viewMergeRequest,\n} from \"../../domain/coreAdapter.js\";\nimport { assertConfirm, assertDiffWithinLimit, assertToolAccess, resolvePolicyCwd, type ToolAccess } from \"../../policy/policy.js\";\n\ntype ToolExecutionResult<T> = {\n data: T;\n warnings?: string[];\n risks?: string[];\n recommendedNextActions?: string[];\n logContext?: {\n repoRoot?: string | null;\n appId?: string | null;\n mrId?: string | null;\n };\n};\n\nfunction getAnnotations(access: ToolAccess): ToolAnnotations {\n if (access === \"read\") {\n return {\n readOnlyHint: true,\n idempotentHint: true,\n openWorldHint: false,\n };\n }\n return {\n readOnlyHint: false,\n destructiveHint: access === \"local_write\",\n idempotentHint: false,\n openWorldHint: false,\n };\n}\n\nfunction buildSuccessEnvelope<T>(tool: string, requestId: string | undefined, result: ToolExecutionResult<T>): SuccessEnvelope<T> {\n return {\n schemaVersion: SCHEMA_VERSION,\n ok: true,\n tool,\n requestId: requestId ?? null,\n data: result.data,\n warnings: result.warnings ?? [],\n risks: result.risks ?? [],\n recommendedNextActions: result.recommendedNextActions ?? [],\n };\n}\n\nfunction deriveErrorRisks(tool: string, normalized: NormalizedToolError): string[] {\n if (tool === \"remix_collab_add\" && normalized.message === \"Change step succeeded remotely, but automatic local sync failed.\") {\n return [\"The change step succeeded remotely, but the local repository may need manual recovery or a follow-up sync.\"];\n }\n if (normalized.code === \"DESTRUCTIVE_OPERATION_BLOCKED\") {\n return [\"A policy guard blocked a potentially destructive or state-mutating operation.\"];\n }\n if (normalized.code === \"REPO_LOCK_TIMEOUT\") {\n return [\"Another Remix mutation was already in progress for this repository, so the local mutation did not run.\"];\n }\n if (normalized.code === \"REPO_STATE_CHANGED_DURING_OPERATION\") {\n return [\"The repository changed during the operation, so Remix aborted before applying a destructive local mutation.\"];\n }\n return [];\n}\n\nfunction buildErrorEnvelope(tool: string, requestId: string | undefined, error: unknown): ErrorEnvelope {\n const normalized = normalizeToolError(error);\n const recommendedNextActions =\n normalized.code === \"AUTH_REQUIRED\"\n ? [\"Set COMERGE_ACCESS_TOKEN, then retry the tool call.\"]\n : normalized.code === \"REPO_LOCK_TIMEOUT\"\n ? [\"Wait for the active Remix mutation to finish, then retry the tool call.\"]\n : normalized.code === \"REPO_STATE_CHANGED_DURING_OPERATION\"\n ? [\"Review local repository changes, then rerun the tool once the worktree is stable.\"]\n : normalized.code === \"PREFERRED_BRANCH_MISMATCH\"\n ? [\"Switch to the repository's preferred Remix branch, or rerun with allowBranchMismatch=true if intentional.\"]\n : [];\n return {\n schemaVersion: SCHEMA_VERSION,\n ok: false,\n tool,\n requestId: requestId ?? null,\n error: normalized,\n warnings: [],\n risks: deriveErrorRisks(tool, normalized),\n recommendedNextActions,\n };\n}\n\nfunction registerTool<T>(\n server: McpServer,\n context: ServerContext,\n params: {\n name: string;\n description: string;\n access: ToolAccess;\n inputSchema: Record<string, z.ZodTypeAny>;\n outputSchema: z.ZodTypeAny;\n run: (args: Record<string, unknown>) => Promise<ToolExecutionResult<T>>;\n },\n) {\n const errorSchema = makeErrorSchema();\n server.registerTool(\n params.name,\n {\n title: params.name,\n description: params.description,\n inputSchema: params.inputSchema,\n outputSchema: params.outputSchema,\n annotations: getAnnotations(params.access),\n },\n async (rawArgs: Record<string, unknown>) => {\n const requestId = typeof rawArgs.requestId === \"string\" ? rawArgs.requestId : undefined;\n const startedAt = Date.now();\n try {\n assertToolAccess(context.policy, params.access);\n const result = await params.run(rawArgs);\n const envelope = buildSuccessEnvelope(params.name, requestId, result);\n params.outputSchema.parse(envelope);\n context.logger.log({\n level: \"info\",\n message: \"tool_completed\",\n tool: params.name,\n requestId: envelope.requestId,\n durationMs: Date.now() - startedAt,\n result: \"success\",\n repoRoot: result.logContext?.repoRoot ?? null,\n appId: result.logContext?.appId ?? null,\n mrId: result.logContext?.mrId ?? null,\n truncated: result.warnings?.some((warning) => warning.toLowerCase().includes(\"truncated\")) ?? false,\n });\n return makeSuccessResult(envelope);\n } catch (error) {\n const envelope = buildErrorEnvelope(params.name, requestId, error);\n errorSchema.parse(envelope);\n context.logger.log({\n level: \"error\",\n message: \"tool_failed\",\n tool: params.name,\n requestId: envelope.requestId,\n durationMs: Date.now() - startedAt,\n result: \"error\",\n errorCode: envelope.error.code,\n });\n return makeErrorResult(envelope);\n }\n },\n );\n}\n\nexport function registerCollabTools(server: McpServer, context: ServerContext): void {\n registerTool(server, context, {\n name: \"remix_collab_status\",\n description: \"Summarize repository binding, worktree state, merge request counts, and sync or reconcile readiness.\",\n access: \"read\",\n inputSchema: statusInputSchema,\n outputSchema: statusSuccessSchema,\n run: async (args) => {\n const input = z.object(statusInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return getStatus({\n cwd,\n includeRemote: input.includeRemote ?? true,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_init\",\n description: \"Import the current repository into Remix and write the local binding file.\",\n access: \"remote_write\",\n inputSchema: initInputSchema,\n outputSchema: initSuccessSchema,\n run: async (args) => {\n const input = z.object(initInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return initCollab({\n cwd,\n appName: input.appName,\n forceNew: input.forceNew,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_list\",\n description: \"List Remix apps visible to the current authenticated user.\",\n access: \"read\",\n inputSchema: listInputSchema,\n outputSchema: listSuccessSchema,\n run: async (args) => {\n const input = z.object(listInputSchema).parse(args);\n return listApps({ forked: input.forked });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_remix\",\n description: \"Fork a Remix app and materialize a new local checkout bound to the remix. Prefer `outputDir` for an exact destination outside any existing git repo; `cwd` is only the parent-directory fallback.\",\n access: \"remote_write\",\n inputSchema: remixInputSchema,\n outputSchema: remixSuccessSchema,\n run: async (args) => {\n const input = z.object(remixInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return remixCollab({\n cwd,\n appId: input.appId,\n name: input.name,\n outputDir: input.outputDir,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_add\",\n description: \"Record one collaboration change step for the current bound repository, using the live worktree by default.\",\n access: \"local_write\",\n inputSchema: addInputSchema,\n outputSchema: addSuccessSchema,\n run: async (args) => {\n const input = z.object(addInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n const diffSource = input.diffSource ?? \"worktree\";\n if (diffSource === \"external\") {\n const externalDiff = input.externalDiff ?? \"\";\n assertDiffWithinLimit(context.policy, externalDiff);\n }\n return addCollabStep({\n cwd,\n prompt: input.prompt,\n assistantResponse: input.assistantResponse,\n diffSource,\n externalDiff: input.externalDiff,\n allowBranchMismatch: input.allowBranchMismatch ?? false,\n idempotencyKey: input.idempotencyKey,\n agent: context.agentMetadata,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_record_turn\",\n description: \"Record one no-diff collaboration turn for the current bound repository after a completed assistant response.\",\n access: \"remote_write\",\n inputSchema: recordTurnInputSchema,\n outputSchema: recordTurnSuccessSchema,\n run: async (args) => {\n const input = z.object(recordTurnInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return recordCollabTurn({\n cwd,\n prompt: input.prompt,\n assistantResponse: input.assistantResponse,\n allowBranchMismatch: input.allowBranchMismatch ?? false,\n idempotencyKey: input.idempotencyKey,\n agent: context.agentMetadata,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_sync_preview\",\n description: \"Preview whether the current bound repository can be fast-forward synced to the Remix app state.\",\n access: \"read\",\n inputSchema: previewInputSchema,\n outputSchema: syncSuccessSchema,\n run: async (args) => {\n const input = z.object(previewInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return syncCollab({ cwd, dryRun: true });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_sync_apply\",\n description: \"Fast-forward sync the current bound repository to the Remix app state.\",\n access: \"local_write\",\n inputSchema: applyInputSchema,\n outputSchema: syncSuccessSchema,\n run: async (args) => {\n const input = z.object(applyInputSchema).parse(args);\n assertConfirm(input.confirm, \"remix_collab_sync_apply\");\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return syncCollab({ cwd, dryRun: false, allowBranchMismatch: input.allowBranchMismatch ?? false });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_request_merge\",\n description: \"Open a merge request from the current bound repository to its upstream app.\",\n access: \"remote_write\",\n inputSchema: requestMergeInputSchema,\n outputSchema: requestMergeSuccessSchema,\n run: async (args) => {\n const input = z.object(requestMergeInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return requestMerge({ cwd });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_inbox\",\n description: \"List merge requests available for review.\",\n access: \"read\",\n inputSchema: inboxInputSchema,\n outputSchema: inboxSuccessSchema,\n run: async (args) => {\n const input = z.object(inboxInputSchema).parse(args);\n return inbox({ status: input.status });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_view_merge_request\",\n description: \"View merge request metadata, prompts, change steps, and optionally a bounded unified diff.\",\n access: \"read\",\n inputSchema: viewMergeRequestInputSchema,\n outputSchema: viewMergeRequestSuccessSchema,\n run: async (args) => {\n const input = z.object(viewMergeRequestInputSchema).parse(args);\n return viewMergeRequest({\n mrId: input.mrId,\n includeUnifiedDiff: input.includeUnifiedDiff ?? false,\n diffMaxChars: input.diffMaxChars ?? context.policy.maxDiffOutputChars,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_approve_remote\",\n description: \"Approve a merge request remotely and wait for terminal completion without mutating the local repository.\",\n access: \"remote_write\",\n inputSchema: approveInputSchema,\n outputSchema: approveSuccessSchema,\n run: async (args) => {\n const input = z.object(approveInputSchema).parse(args);\n assertConfirm(input.confirm, \"remix_collab_approve_remote\");\n return approveMergeRequest({\n mrId: input.mrId,\n mode: \"remote-only\",\n allowBranchMismatch: input.allowBranchMismatch ?? false,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_approve_and_sync_target\",\n description: \"Approve a merge request, wait for completion, and sync the target repository locally.\",\n access: \"local_write\",\n inputSchema: approveInputSchema,\n outputSchema: approveSuccessSchema,\n run: async (args) => {\n const input = z.object(approveInputSchema).parse(args);\n assertConfirm(input.confirm, \"remix_collab_approve_and_sync_target\");\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return approveMergeRequest({\n mrId: input.mrId,\n cwd,\n mode: \"sync-target-repo\",\n allowBranchMismatch: input.allowBranchMismatch ?? false,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_reject\",\n description: \"Reject a merge request.\",\n access: \"remote_write\",\n inputSchema: rejectInputSchema,\n outputSchema: rejectSuccessSchema,\n run: async (args) => {\n const input = z.object(rejectInputSchema).parse(args);\n assertConfirm(input.confirm, \"remix_collab_reject\");\n return rejectMergeRequest({ mrId: input.mrId });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_sync_upstream\",\n description: \"Sync upstream changes into the current remix and update the local checkout.\",\n access: \"local_write\",\n inputSchema: applyInputSchema,\n outputSchema: syncUpstreamSuccessSchema,\n run: async (args) => {\n const input = z.object(applyInputSchema).parse(args);\n assertConfirm(input.confirm, \"remix_collab_sync_upstream\");\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return syncUpstream({ cwd });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_reconcile_preview\",\n description: \"Preview reconcile readiness when the local repository cannot be fast-forward synced.\",\n access: \"read\",\n inputSchema: previewInputSchema,\n outputSchema: reconcileSuccessSchema,\n run: async (args) => {\n const input = z.object(previewInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return reconcile({ cwd, dryRun: true });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_reconcile_apply\",\n description: \"Reconcile divergent local history against the bound Remix app and update the local checkout.\",\n access: \"local_write\",\n inputSchema: applyInputSchema,\n outputSchema: reconcileSuccessSchema,\n run: async (args) => {\n const input = z.object(applyInputSchema).parse(args);\n assertConfirm(input.confirm, \"remix_collab_reconcile_apply\");\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return reconcile({ cwd, dryRun: false, allowBranchMismatch: input.allowBranchMismatch ?? false });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_invite\",\n description: \"Invite a collaborator to an organization, project, or app, using the current repository binding unless targetId is provided.\",\n access: \"remote_write\",\n inputSchema: inviteInputSchema,\n outputSchema: inviteSuccessSchema,\n run: async (args) => {\n const input = z.object(inviteInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return inviteCollaborator({\n cwd,\n email: input.email,\n role: input.role,\n scope: input.scope,\n targetId: input.targetId,\n ttlDays: input.ttlDays,\n });\n },\n });\n}\n","import { z } from \"zod\";\n\nimport { commonRequestFieldsSchema, makeSuccessSchema } from \"./common.js\";\n\nconst genericRecordSchema = z.record(z.string(), z.unknown());\nconst genericArraySchema = z.array(genericRecordSchema);\n\nexport const statusInputSchema = {\n ...commonRequestFieldsSchema,\n includeRemote: z.boolean().optional(),\n};\n\nexport const initInputSchema = {\n ...commonRequestFieldsSchema,\n appName: z.string().trim().min(1).optional(),\n forceNew: z.boolean().optional(),\n};\n\nexport const listInputSchema = {\n requestId: z.string().trim().min(1).optional(),\n outputMode: z.enum([\"summary\", \"full\"]).optional(),\n forked: z.enum([\"only\", \"exclude\", \"all\"]).optional(),\n};\n\nexport const remixInputSchema = {\n ...commonRequestFieldsSchema,\n appId: z.string().trim().min(1),\n name: z.string().trim().min(1).optional(),\n outputDir: z.string().trim().min(1).optional(),\n};\n\nexport const addInputSchema = {\n ...commonRequestFieldsSchema,\n prompt: z.string().trim().min(1),\n assistantResponse: z.string().trim().min(1).optional(),\n diffSource: z.enum([\"worktree\", \"external\"]).optional(),\n externalDiff: z.string().optional(),\n allowBranchMismatch: z.boolean().optional(),\n idempotencyKey: z.string().trim().min(1).optional(),\n};\n\nexport const recordTurnInputSchema = {\n ...commonRequestFieldsSchema,\n prompt: z.string().trim().min(1),\n assistantResponse: z.string().trim().min(1),\n allowBranchMismatch: z.boolean().optional(),\n idempotencyKey: z.string().trim().min(1).optional(),\n};\n\nexport const previewInputSchema = {\n ...commonRequestFieldsSchema,\n};\n\nexport const applyInputSchema = {\n ...commonRequestFieldsSchema,\n confirm: z.boolean(),\n allowBranchMismatch: z.boolean().optional(),\n};\n\nexport const requestMergeInputSchema = {\n ...commonRequestFieldsSchema,\n};\n\nexport const inboxInputSchema = {\n requestId: z.string().trim().min(1).optional(),\n outputMode: z.enum([\"summary\", \"full\"]).optional(),\n status: z.string().trim().min(1).optional(),\n};\n\nexport const viewMergeRequestInputSchema = {\n requestId: z.string().trim().min(1).optional(),\n outputMode: z.enum([\"summary\", \"full\"]).optional(),\n mrId: z.string().trim().min(1),\n includeUnifiedDiff: z.boolean().optional(),\n diffMaxChars: z.number().int().positive().max(200_000).optional(),\n};\n\nexport const approveInputSchema = {\n ...commonRequestFieldsSchema,\n mrId: z.string().trim().min(1),\n confirm: z.boolean(),\n allowBranchMismatch: z.boolean().optional(),\n};\n\nexport const rejectInputSchema = {\n requestId: z.string().trim().min(1).optional(),\n mrId: z.string().trim().min(1),\n confirm: z.boolean(),\n};\n\nexport const inviteInputSchema = {\n ...commonRequestFieldsSchema,\n email: z.string().email(),\n scope: z.enum([\"organization\", \"project\", \"app\"]).optional(),\n targetId: z.string().trim().min(1).optional(),\n role: z.string().trim().min(1).optional(),\n ttlDays: z.number().int().positive().max(30).optional(),\n};\n\nexport const statusDataSchema = z.object({\n status: genericRecordSchema,\n riskLevel: z.enum([\"low\", \"medium\", \"high\"]),\n});\n\nexport const initDataSchema = z.object({\n reused: z.boolean(),\n projectId: z.string(),\n appId: z.string(),\n upstreamAppId: z.string(),\n bindingPath: z.string(),\n repoRoot: z.string(),\n});\n\nexport const listDataSchema = z.object({\n apps: genericArraySchema,\n});\n\nexport const remixDataSchema = z.object({\n appId: z.string(),\n projectId: z.string(),\n upstreamAppId: z.string(),\n bindingPath: z.string(),\n repoRoot: z.string(),\n});\n\nexport const addDataSchema = z.object({\n changeStep: genericRecordSchema,\n autoSync: genericRecordSchema,\n});\nexport const recordTurnDataSchema = genericRecordSchema;\n\nexport const syncDataSchema = genericRecordSchema;\nexport const requestMergeDataSchema = genericRecordSchema;\nexport const inboxDataSchema = z.object({\n mergeRequests: z.array(genericRecordSchema),\n});\nexport const viewMergeRequestDataSchema = genericRecordSchema;\nexport const approveDataSchema = genericRecordSchema;\nexport const rejectDataSchema = genericRecordSchema;\nexport const syncUpstreamDataSchema = genericRecordSchema;\nexport const reconcileDataSchema = genericRecordSchema;\nexport const inviteDataSchema = genericRecordSchema;\n\nexport const statusSuccessSchema = makeSuccessSchema(statusDataSchema);\nexport const initSuccessSchema = makeSuccessSchema(initDataSchema);\nexport const listSuccessSchema = makeSuccessSchema(listDataSchema);\nexport const remixSuccessSchema = makeSuccessSchema(remixDataSchema);\nexport const addSuccessSchema = makeSuccessSchema(addDataSchema);\nexport const recordTurnSuccessSchema = makeSuccessSchema(recordTurnDataSchema);\nexport const syncSuccessSchema = makeSuccessSchema(syncDataSchema);\nexport const requestMergeSuccessSchema = makeSuccessSchema(requestMergeDataSchema);\nexport const inboxSuccessSchema = makeSuccessSchema(inboxDataSchema);\nexport const viewMergeRequestSuccessSchema = makeSuccessSchema(viewMergeRequestDataSchema);\nexport const approveSuccessSchema = makeSuccessSchema(approveDataSchema);\nexport const rejectSuccessSchema = makeSuccessSchema(rejectDataSchema);\nexport const syncUpstreamSuccessSchema = makeSuccessSchema(syncUpstreamDataSchema);\nexport const reconcileSuccessSchema = makeSuccessSchema(reconcileDataSchema);\nexport const inviteSuccessSchema = makeSuccessSchema(inviteDataSchema);\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\n\nimport type { ErrorCategory, ErrorCode, NormalizedToolError } from \"../errors/errorCodes.js\";\n\nexport const SCHEMA_VERSION = 1 as const;\n\nexport const commonRequestFieldsSchema = {\n cwd: z.string().trim().min(1).optional(),\n requestId: z.string().trim().min(1).optional(),\n outputMode: z.enum([\"summary\", \"full\"]).optional(),\n};\n\nexport const errorEnvelopeSchema = z.object({\n code: z.custom<ErrorCode>(),\n message: z.string().min(1),\n hint: z.string().nullable(),\n retryable: z.boolean(),\n category: z.custom<ErrorCategory>(),\n});\n\nexport function makeSuccessSchema(dataSchema: z.ZodTypeAny) {\n return z.object({\n schemaVersion: z.literal(SCHEMA_VERSION),\n ok: z.literal(true),\n tool: z.string().min(1),\n requestId: z.string().nullable(),\n data: dataSchema,\n warnings: z.array(z.string()),\n risks: z.array(z.string()),\n recommendedNextActions: z.array(z.string()),\n });\n}\n\nexport function makeErrorSchema() {\n return z.object({\n schemaVersion: z.literal(SCHEMA_VERSION),\n ok: z.literal(false),\n tool: z.string().min(1),\n requestId: z.string().nullable(),\n error: errorEnvelopeSchema,\n warnings: z.array(z.string()),\n risks: z.array(z.string()),\n recommendedNextActions: z.array(z.string()),\n });\n}\n\nexport type SuccessEnvelope<T> = {\n schemaVersion: typeof SCHEMA_VERSION;\n ok: true;\n tool: string;\n requestId: string | null;\n data: T;\n warnings: string[];\n risks: string[];\n recommendedNextActions: string[];\n};\n\nexport type ErrorEnvelope = {\n schemaVersion: typeof SCHEMA_VERSION;\n ok: false;\n tool: string;\n requestId: string | null;\n error: NormalizedToolError;\n warnings: string[];\n risks: string[];\n recommendedNextActions: string[];\n};\n\nfunction toJsonText(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nexport function makeSuccessResult<T>(envelope: SuccessEnvelope<T>): CallToolResult {\n return {\n content: [{ type: \"text\", text: toJsonText(envelope) }],\n structuredContent: envelope,\n };\n}\n\nexport function makeErrorResult(envelope: ErrorEnvelope): CallToolResult {\n return {\n content: [{ type: \"text\", text: toJsonText(envelope) }],\n structuredContent: envelope,\n isError: true,\n };\n}\n","import {\n collabAdd as coreCollabAdd,\n collabRecordTurn as coreCollabRecordTurn,\n collabApprove as coreCollabApprove,\n collabInbox as coreCollabInbox,\n collabInit as coreCollabInit,\n collabInvite as coreCollabInvite,\n collabReconcile as coreCollabReconcile,\n collabReject as coreCollabReject,\n collabRemix as coreCollabRemix,\n collabRequestMerge as coreCollabRequestMerge,\n collabStatus as coreCollabStatus,\n collabSync as coreCollabSync,\n collabSyncUpstream as coreCollabSyncUpstream,\n collabView as coreCollabView,\n type CollabStatus,\n type InvitationScopeType,\n} from \"@remixhq/core/collab\";\nimport { findGitRoot, getHeadCommitHash, listUntrackedFiles } from \"@remixhq/core/repo\";\n\nimport { createApiClient, createCollabApiClient } from \"./apiClient.js\";\n\nfunction unwrapResponseObject<T>(resp: any, label: string): T {\n const obj = resp?.responseObject;\n if (obj === undefined || obj === null) {\n throw new Error(typeof resp?.message === \"string\" && resp.message.trim() ? resp.message : `Missing ${label} response`);\n }\n return obj as T;\n}\n\nfunction normalizeMergeRequestsPayload(payload: unknown): Array<Record<string, unknown>> {\n if (Array.isArray(payload)) return payload as Array<Record<string, unknown>>;\n if (!payload || typeof payload !== \"object\") return [];\n return Object.values(payload as Record<string, unknown>).flatMap((value) =>\n Array.isArray(value) ? (value as Array<Record<string, unknown>>) : [],\n );\n}\n\nfunction getRiskLevel(status: CollabStatus): \"low\" | \"medium\" | \"high\" {\n if (status.recommendedAction === \"reconcile\") return \"high\";\n if (status.recommendedAction === \"sync\" || status.remote.incomingOpenMergeRequestCount) return \"medium\";\n if (status.repo.branchMismatch || !status.repo.isGitRepo || !status.binding.isBound || !status.repo.worktree.isClean) return \"medium\";\n return \"low\";\n}\n\nfunction getRecommendedNextActions(status: CollabStatus): string[] {\n if (status.repo.branchMismatch) {\n return [\n `Switch to the preferred branch (${status.binding.preferredBranch ?? \"configured in the binding\"}) before mutating Remix state, or rerun with allowBranchMismatch=true if intentional.`,\n ];\n }\n switch (status.recommendedAction) {\n case \"init\":\n return [\"Run remix_collab_init to bind the repository to Remix.\"];\n case \"sync\":\n return [\"Run remix_collab_sync_preview, then remix_collab_sync_apply if the preview is acceptable.\"];\n case \"reconcile\":\n return [\"Run remix_collab_reconcile_preview before attempting remix_collab_reconcile_apply.\"];\n case \"review_inbox\":\n return [\"Run remix_collab_inbox to inspect open merge requests.\"];\n default:\n return [];\n }\n}\n\nfunction collectWarnings(value: unknown): string[] {\n if (!value || !Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0);\n}\n\nfunction collectResultWarnings<T extends { warnings?: unknown }>(value: T): string[] {\n return collectWarnings(value.warnings);\n}\n\nfunction truncateText(value: string, maxChars: number): { text: string; truncated: boolean; originalChars: number } {\n if (value.length <= maxChars) {\n return {\n text: value,\n truncated: false,\n originalChars: value.length,\n };\n }\n return {\n text: `${value.slice(0, maxChars)}\\n\\n[truncated ${value.length - maxChars} chars]`,\n truncated: true,\n originalChars: value.length,\n };\n}\n\nexport async function getStatus(params: { cwd: string; includeRemote: boolean }) {\n const api = params.includeRemote ? await createCollabApiClient() : null;\n const status = await coreCollabStatus({\n api,\n cwd: params.cwd,\n });\n return {\n data: {\n status,\n riskLevel: getRiskLevel(status),\n },\n warnings: status.warnings,\n recommendedNextActions: getRecommendedNextActions(status),\n logContext: {\n repoRoot: status.repo.repoRoot,\n appId: status.binding.currentAppId,\n },\n };\n}\n\nexport async function initCollab(params: { cwd: string; appName?: string; forceNew?: boolean }) {\n const api = await createCollabApiClient();\n const result = await coreCollabInit({\n api,\n cwd: params.cwd,\n appName: params.appName ?? null,\n forceNew: params.forceNew ?? false,\n });\n return {\n data: result,\n warnings: collectResultWarnings(result as { warnings?: unknown }),\n recommendedNextActions: [\"Run remix_collab_status to inspect sync and merge readiness.\"],\n logContext: {\n repoRoot: result.repoRoot,\n appId: result.appId,\n },\n };\n}\n\nexport async function listApps(params: { forked?: \"only\" | \"exclude\" | \"all\" }) {\n const api = await createApiClient();\n const resp = await api.listApps({ forked: params.forked ?? \"all\" });\n const apps = unwrapResponseObject<Array<Record<string, unknown>>>(resp, \"apps\");\n return {\n data: { apps },\n warnings: [],\n recommendedNextActions: [],\n logContext: {},\n };\n}\n\nexport async function remixCollab(params: { cwd: string; appId: string; name?: string; outputDir?: string }) {\n const api = await createCollabApiClient();\n const result = await coreCollabRemix({\n api,\n cwd: params.cwd,\n appId: params.appId,\n name: params.name ?? null,\n outputDir: params.outputDir ?? null,\n });\n return {\n data: result,\n warnings: collectResultWarnings(result as { warnings?: unknown }),\n recommendedNextActions: [\"Run remix_collab_status inside the remix checkout to inspect its state.\"],\n logContext: {\n repoRoot: result.repoRoot,\n appId: result.appId,\n },\n };\n}\n\nexport async function addCollabStep(params: {\n cwd: string;\n prompt: string;\n assistantResponse?: string;\n diffSource: \"worktree\" | \"external\";\n externalDiff?: string;\n allowBranchMismatch?: boolean;\n idempotencyKey?: string;\n agent: { type: string; name?: string; version?: string; provider?: string };\n}) {\n const api = await createCollabApiClient();\n const repoRoot = await findGitRoot(params.cwd);\n const preHead = await getHeadCommitHash(repoRoot);\n const untrackedBefore = params.diffSource === \"worktree\" ? await listUntrackedFiles(repoRoot) : [];\n\n const changeStep = await coreCollabAdd({\n api,\n cwd: params.cwd,\n prompt: params.prompt,\n assistantResponse: params.assistantResponse ?? null,\n diff: params.externalDiff ?? null,\n diffSource: params.diffSource,\n allowBranchMismatch: params.allowBranchMismatch ?? false,\n idempotencyKey: params.idempotencyKey ?? null,\n actor: params.agent,\n });\n\n const postHead = await getHeadCommitHash(repoRoot);\n const autoSyncEligible = params.diffSource === \"worktree\";\n const localRepoMutated = autoSyncEligible && preHead !== postHead;\n\n return {\n data: {\n changeStep,\n autoSync: {\n requested: true,\n eligible: autoSyncEligible,\n attempted: autoSyncEligible,\n applied: autoSyncEligible,\n trackedChangesDiscarded: autoSyncEligible,\n capturedUntrackedPathsCandidate: untrackedBefore,\n localHeadBefore: preHead,\n localHeadAfter: postHead,\n localRepoMutated,\n },\n },\n warnings:\n [\n ...collectResultWarnings(changeStep as { warnings?: unknown }),\n ...(params.diffSource === \"external\"\n ? [\n \"Automatic local discard+sync was skipped because the diff came from an external source and may not match the current worktree.\",\n ]\n : []),\n ],\n recommendedNextActions: [],\n logContext: {\n repoRoot,\n },\n };\n}\n\nexport async function recordCollabTurn(params: {\n cwd: string;\n prompt: string;\n assistantResponse: string;\n allowBranchMismatch?: boolean;\n idempotencyKey?: string;\n agent: { type: string; name?: string; version?: string; provider?: string };\n}) {\n const api = await createCollabApiClient();\n const result = await coreCollabRecordTurn({\n api,\n cwd: params.cwd,\n prompt: params.prompt,\n assistantResponse: params.assistantResponse,\n allowBranchMismatch: params.allowBranchMismatch ?? false,\n idempotencyKey: params.idempotencyKey ?? null,\n actor: params.agent,\n });\n return {\n data: result,\n warnings: [],\n recommendedNextActions: [],\n logContext: {\n repoRoot: params.cwd,\n appId: result.appId,\n },\n };\n}\n\nexport async function syncCollab(params: { cwd: string; dryRun: boolean; allowBranchMismatch?: boolean }) {\n const api = await createCollabApiClient();\n const result = await coreCollabSync({\n api,\n cwd: params.cwd,\n dryRun: params.dryRun,\n allowBranchMismatch: params.allowBranchMismatch ?? false,\n });\n return {\n data: result,\n warnings: collectResultWarnings(result as { warnings?: unknown }),\n recommendedNextActions: params.dryRun\n ? [\"Run remix_collab_sync_apply with confirm=true to apply this fast-forward update.\"]\n : [],\n logContext: {\n repoRoot: result.repoRoot,\n },\n };\n}\n\nexport async function requestMerge(params: { cwd: string }) {\n const api = await createCollabApiClient();\n const result = await coreCollabRequestMerge({\n api,\n cwd: params.cwd,\n });\n return {\n data: result,\n warnings: [],\n recommendedNextActions: result.id ? [`Run remix_collab_view_merge_request with mrId=${String(result.id)} to inspect the request.`] : [],\n logContext: {\n mrId: typeof result.id === \"string\" ? result.id : null,\n },\n };\n}\n\nexport async function inbox(params: { status?: string }) {\n const api = await createCollabApiClient();\n const result = await coreCollabInbox({ api });\n const mergeRequests = normalizeMergeRequestsPayload(result.mergeRequests).filter((mr) =>\n params.status ? String(mr.status ?? \"\") === params.status : true,\n );\n return {\n data: { mergeRequests },\n warnings: [],\n recommendedNextActions: [],\n logContext: {},\n };\n}\n\nexport async function viewMergeRequest(params: { mrId: string; includeUnifiedDiff: boolean; diffMaxChars: number }) {\n const api = await createCollabApiClient();\n const review = await coreCollabView({\n api,\n mrId: params.mrId,\n });\n const truncatedDiff = params.includeUnifiedDiff ? truncateText(review.unifiedDiff, params.diffMaxChars) : null;\n return {\n data: {\n mergeRequest: review.mergeRequest,\n prompts: review.prompts,\n changeSteps: review.changeSteps,\n stats: review.stats,\n unifiedDiff: truncatedDiff?.text ?? null,\n diffTruncated: truncatedDiff?.truncated ?? false,\n originalUnifiedDiffChars: truncatedDiff?.originalChars ?? review.unifiedDiff.length,\n },\n warnings: truncatedDiff?.truncated ? [\"Unified diff output was truncated to respect the configured output limit.\"] : [],\n recommendedNextActions: [],\n logContext: {\n mrId: params.mrId,\n appId: review.mergeRequest.targetAppId,\n },\n };\n}\n\nexport async function approveMergeRequest(params: {\n mrId: string;\n cwd?: string;\n mode: \"remote-only\" | \"sync-target-repo\";\n allowBranchMismatch?: boolean;\n}) {\n const api = await createCollabApiClient();\n const result = await coreCollabApprove({\n api,\n mrId: params.mrId,\n cwd: params.cwd,\n mode: params.mode,\n allowBranchMismatch: params.allowBranchMismatch ?? false,\n });\n return {\n data: result,\n warnings: collectResultWarnings(result as { warnings?: unknown }),\n recommendedNextActions: [],\n logContext: {\n repoRoot: result.repoRoot ?? null,\n appId: result.targetAppId,\n mrId: result.mergeRequestId,\n },\n };\n}\n\nexport async function rejectMergeRequest(params: { mrId: string }) {\n const api = await createCollabApiClient();\n const result = await coreCollabReject({\n api,\n mrId: params.mrId,\n });\n return {\n data: result,\n warnings: [],\n recommendedNextActions: [],\n logContext: {\n mrId: params.mrId,\n },\n };\n}\n\nexport async function syncUpstream(params: { cwd: string }) {\n const api = await createCollabApiClient();\n const result = await coreCollabSyncUpstream({\n api,\n cwd: params.cwd,\n });\n return {\n data: result,\n warnings: collectResultWarnings(result as { warnings?: unknown }),\n recommendedNextActions: [],\n logContext: {\n repoRoot: result.repoRoot,\n appId: result.appId,\n mrId: \"mergeRequestId\" in result ? result.mergeRequestId ?? null : null,\n },\n };\n}\n\nexport async function reconcile(params: { cwd: string; dryRun: boolean; allowBranchMismatch?: boolean }) {\n const api = await createCollabApiClient();\n const result = await coreCollabReconcile({\n api,\n cwd: params.cwd,\n dryRun: params.dryRun,\n allowBranchMismatch: params.allowBranchMismatch ?? false,\n });\n return {\n data: result,\n warnings: collectWarnings((result as { warnings?: unknown }).warnings),\n recommendedNextActions: params.dryRun\n ? [\"Run remix_collab_reconcile_apply with confirm=true only if the preview is acceptable.\"]\n : [],\n risks: params.dryRun ? [\"Reconcile apply rewrites local history and creates a backup branch.\"] : [],\n logContext: {\n repoRoot: (result as { repoRoot?: string | null }).repoRoot ?? null,\n },\n };\n}\n\nexport async function inviteCollaborator(params: {\n cwd: string;\n email: string;\n role?: string;\n scope?: InvitationScopeType;\n targetId?: string;\n ttlDays?: number;\n}) {\n const api = await createCollabApiClient();\n const result = await coreCollabInvite({\n api,\n cwd: params.cwd,\n email: params.email,\n role: params.role ?? null,\n scope: params.scope ?? \"project\",\n targetId: params.targetId ?? null,\n ttlDays: params.ttlDays,\n });\n return {\n data: result,\n warnings: [],\n recommendedNextActions: [],\n logContext: {},\n };\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\n\nimport type { ServerContext } from \"../../bootstrap/context.js\";\nimport {\n changeStepDiffInputSchema,\n changeStepDiffSuccessSchema,\n memorySearchInputSchema,\n memorySearchSuccessSchema,\n memorySummaryInputSchema,\n memorySummarySuccessSchema,\n memoryTimelineInputSchema,\n memoryTimelineSuccessSchema,\n} from \"../../contracts/memory.js\";\nimport {\n makeErrorResult,\n makeErrorSchema,\n makeSuccessResult,\n type ErrorEnvelope,\n type SuccessEnvelope,\n SCHEMA_VERSION,\n} from \"../../contracts/common.js\";\nimport type { NormalizedToolError } from \"../../errors/errorCodes.js\";\nimport { normalizeToolError } from \"../../errors/normalizeError.js\";\nimport { getChangeStepDiff, getMemorySummary, getMemoryTimeline, searchMemory } from \"../../domain/memoryAdapter.js\";\nimport { assertToolAccess, resolvePolicyCwd, type ToolAccess } from \"../../policy/policy.js\";\n\ntype ToolExecutionResult<T> = {\n data: T;\n warnings?: string[];\n risks?: string[];\n recommendedNextActions?: string[];\n logContext?: {\n repoRoot?: string | null;\n appId?: string | null;\n mrId?: string | null;\n };\n};\n\nfunction getAnnotations(access: ToolAccess): ToolAnnotations {\n return {\n readOnlyHint: access === \"read\",\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n };\n}\n\nfunction buildSuccessEnvelope<T>(tool: string, requestId: string | undefined, result: ToolExecutionResult<T>): SuccessEnvelope<T> {\n return {\n schemaVersion: SCHEMA_VERSION,\n ok: true,\n tool,\n requestId: requestId ?? null,\n data: result.data,\n warnings: result.warnings ?? [],\n risks: result.risks ?? [],\n recommendedNextActions: result.recommendedNextActions ?? [],\n };\n}\n\nfunction buildErrorEnvelope(tool: string, requestId: string | undefined, error: unknown): ErrorEnvelope {\n const normalized = normalizeToolError(error);\n return {\n schemaVersion: SCHEMA_VERSION,\n ok: false,\n tool,\n requestId: requestId ?? null,\n error: normalized,\n warnings: [],\n risks: deriveErrorRisks(normalized),\n recommendedNextActions: normalized.code === \"AUTH_REQUIRED\" ? [\"Run `remix login` or set COMERGE_ACCESS_TOKEN, then retry.\"] : [],\n };\n}\n\nfunction deriveErrorRisks(normalized: NormalizedToolError): string[] {\n if (normalized.code === \"DESTRUCTIVE_OPERATION_BLOCKED\") {\n return [\"A policy guard blocked a disallowed operation.\"];\n }\n return [];\n}\n\nfunction registerTool<T>(\n server: McpServer,\n context: ServerContext,\n params: {\n name: string;\n description: string;\n access: ToolAccess;\n inputSchema: Record<string, z.ZodTypeAny>;\n outputSchema: z.ZodTypeAny;\n run: (args: Record<string, unknown>) => Promise<ToolExecutionResult<T>>;\n },\n) {\n const errorSchema = makeErrorSchema();\n server.registerTool(\n params.name,\n {\n title: params.name,\n description: params.description,\n inputSchema: params.inputSchema,\n outputSchema: params.outputSchema,\n annotations: getAnnotations(params.access),\n },\n async (rawArgs: Record<string, unknown>) => {\n const requestId = typeof rawArgs.requestId === \"string\" ? rawArgs.requestId : undefined;\n const startedAt = Date.now();\n try {\n assertToolAccess(context.policy, params.access);\n const result = await params.run(rawArgs);\n const envelope = buildSuccessEnvelope(params.name, requestId, result);\n params.outputSchema.parse(envelope);\n context.logger.log({\n level: \"info\",\n message: \"tool_completed\",\n tool: params.name,\n requestId: envelope.requestId,\n durationMs: Date.now() - startedAt,\n result: \"success\",\n repoRoot: result.logContext?.repoRoot ?? null,\n appId: result.logContext?.appId ?? null,\n mrId: result.logContext?.mrId ?? null,\n truncated: result.warnings?.some((warning) => warning.toLowerCase().includes(\"truncated\")) ?? false,\n });\n return makeSuccessResult(envelope);\n } catch (error) {\n const envelope = buildErrorEnvelope(params.name, requestId, error);\n errorSchema.parse(envelope);\n context.logger.log({\n level: \"error\",\n message: \"tool_failed\",\n tool: params.name,\n requestId: envelope.requestId,\n durationMs: Date.now() - startedAt,\n result: \"error\",\n errorCode: envelope.error.code,\n });\n return makeErrorResult(envelope);\n }\n },\n );\n}\n\nexport function registerMemoryTools(server: McpServer, context: ServerContext): void {\n registerTool(server, context, {\n name: \"remix_collab_memory_summary\",\n description:\n \"First read for a bound app's current collaboration state, recent reasoning context, and merge or reconcile history before deeper inspection.\",\n access: \"read\",\n inputSchema: memorySummaryInputSchema,\n outputSchema: memorySummarySuccessSchema,\n run: async (args) => {\n const input = z.object(memorySummaryInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return getMemorySummary({\n cwd,\n appId: input.appId,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_memory_search\",\n description:\n \"Default tool for why/history/failed-attempt/user-intent questions. Search prompts, diffs, merge activity, reconciles, and other historical context before using raw git history.\",\n access: \"read\",\n inputSchema: memorySearchInputSchema,\n outputSchema: memorySearchSuccessSchema,\n run: async (args) => {\n const input = z.object(memorySearchInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return searchMemory({\n cwd,\n appId: input.appId,\n query: input.query,\n kinds: input.kinds,\n limit: input.limit,\n offset: input.offset,\n createdAfter: input.createdAfter,\n createdBefore: input.createdBefore,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_memory_timeline\",\n description:\n \"Chronological view of collaboration memory for understanding what happened and in what order, with optional filters for bounded historical inspection.\",\n access: \"read\",\n inputSchema: memoryTimelineInputSchema,\n outputSchema: memoryTimelineSuccessSchema,\n run: async (args) => {\n const input = z.object(memoryTimelineInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return getMemoryTimeline({\n cwd,\n appId: input.appId,\n kinds: input.kinds,\n limit: input.limit,\n offset: input.offset,\n createdAfter: input.createdAfter,\n createdBefore: input.createdBefore,\n });\n },\n });\n\n registerTool(server, context, {\n name: \"remix_collab_memory_change_step_diff\",\n description:\n \"Second-hop expansion tool that fetches the full stored diff for a specific change step after memory search, timeline, or review work has identified the relevant `changeStepId`.\",\n access: \"read\",\n inputSchema: changeStepDiffInputSchema,\n outputSchema: changeStepDiffSuccessSchema,\n run: async (args) => {\n const input = z.object(changeStepDiffInputSchema).parse(args);\n const cwd = resolvePolicyCwd(context.policy, input.cwd);\n return getChangeStepDiff({\n cwd,\n appId: input.appId,\n changeStepId: input.changeStepId,\n });\n },\n });\n}\n","import { z } from \"zod\";\n\nimport { commonRequestFieldsSchema, makeSuccessSchema } from \"./common.js\";\n\nconst genericRecordSchema = z.record(z.string(), z.unknown());\nconst genericArraySchema = z.array(genericRecordSchema);\nconst memoryKindSchema = z.enum([\"collab_turn\", \"change_step\", \"merge_request\", \"reconcile\"]);\nconst paginationSchema = z.object({\n limit: z.number().int().nonnegative(),\n offset: z.number().int().nonnegative(),\n hasMore: z.boolean(),\n});\n\nexport const memorySummaryInputSchema = {\n ...commonRequestFieldsSchema,\n appId: z.string().trim().min(1).optional(),\n};\n\nexport const memorySearchInputSchema = {\n ...commonRequestFieldsSchema,\n appId: z.string().trim().min(1).optional(),\n query: z.string().trim().min(1),\n kinds: z.array(memoryKindSchema).max(4).optional(),\n limit: z.number().int().positive().max(50).optional(),\n offset: z.number().int().nonnegative().optional(),\n createdAfter: z.string().trim().min(1).optional(),\n createdBefore: z.string().trim().min(1).optional(),\n};\n\nexport const memoryTimelineInputSchema = {\n ...commonRequestFieldsSchema,\n appId: z.string().trim().min(1).optional(),\n kinds: z.array(memoryKindSchema).max(4).optional(),\n limit: z.number().int().positive().max(50).optional(),\n offset: z.number().int().nonnegative().optional(),\n createdAfter: z.string().trim().min(1).optional(),\n createdBefore: z.string().trim().min(1).optional(),\n};\n\nexport const changeStepDiffInputSchema = {\n ...commonRequestFieldsSchema,\n appId: z.string().trim().min(1).optional(),\n changeStepId: z.string().trim().min(1),\n};\n\nexport const memorySummaryDataSchema = genericRecordSchema;\nexport const memorySearchDataSchema = z.object({\n items: genericArraySchema,\n pagination: paginationSchema,\n});\nexport const memoryTimelineDataSchema = z.object({\n items: genericArraySchema,\n pagination: paginationSchema,\n});\nexport const changeStepDiffDataSchema = z.object({\n changeStepId: z.string(),\n appId: z.string(),\n diff: z.string(),\n diffSha256: z.string(),\n contentType: z.string(),\n encoding: z.string(),\n expiresIn: z.number().int().positive(),\n});\n\nexport const memorySummarySuccessSchema = makeSuccessSchema(memorySummaryDataSchema);\nexport const memorySearchSuccessSchema = makeSuccessSchema(memorySearchDataSchema);\nexport const memoryTimelineSuccessSchema = makeSuccessSchema(memoryTimelineDataSchema);\nexport const changeStepDiffSuccessSchema = makeSuccessSchema(changeStepDiffDataSchema);\n","import type {\n AgentMemoryKind,\n AgentMemorySearchResponse,\n AgentMemorySummary,\n AgentMemoryTimelineResponse,\n ChangeStepDiffResponse,\n} from \"@remixhq/core\";\nimport { readCollabBinding } from \"@remixhq/core/binding\";\nimport { findGitRoot } from \"@remixhq/core/repo\";\n\nimport { createApiClient } from \"./apiClient.js\";\n\ntype ToolResult<T> = {\n data: T;\n warnings?: string[];\n recommendedNextActions?: string[];\n logContext?: {\n repoRoot?: string | null;\n appId?: string | null;\n };\n};\n\ntype MemoryTarget = {\n appId: string;\n repoRoot: string | null;\n};\n\nfunction buildSummaryNextActions(summary: AgentMemorySummary): string[] {\n const actions: string[] = [];\n\n actions.push(\n \"Use `remix_collab_memory_search` next for focused why/history/failed-attempt questions about this app.\",\n );\n\n const recentItemCount =\n summary.recent.collabTurns.length +\n summary.recent.changeSteps.length +\n summary.recent.mergeRequests.length +\n summary.recent.reconciles.length;\n if (recentItemCount > 0) {\n actions.push(\"Use `remix_collab_memory_timeline` next if you need the chronological sequence of recent activity.\");\n }\n\n if (summary.counts.failedChangeStepCount > 0 || summary.counts.reconcileCount > 0) {\n actions.push(\n \"For prior failures or recovery history, run `remix_collab_memory_search` with a focused query and `kinds` narrowed to `change_step` and `reconcile` when appropriate.\",\n );\n }\n\n return actions;\n}\n\nfunction getFirstChangeStepId(items: Array<{ id: string; kind: AgentMemoryKind }>): string | null {\n const changeStep = items.find((item) => item.kind === \"change_step\");\n return changeStep?.id ?? null;\n}\n\nfunction buildSearchNextActions(result: AgentMemorySearchResponse): string[] {\n if (result.items.length === 0) {\n return [\n \"Try a broader `remix_collab_memory_search` query or fewer `kinds` filters if this topic likely uses different wording.\",\n \"Use `remix_collab_memory_timeline` if you need a bounded chronological scan instead of relevance-ranked search.\",\n ];\n }\n\n const actions: string[] = [\n \"Review the top matched memory items before falling back to raw git history so you keep the reasoning context in view.\",\n ];\n const changeStepId = getFirstChangeStepId(result.items);\n if (changeStepId) {\n actions.push(\n `Use \\`remix_collab_memory_change_step_diff\\` with \\`changeStepId=${changeStepId}\\` if you need the full stored diff for the most relevant change step.`,\n );\n }\n\n if (result.pagination.hasMore) {\n actions.push(\"Narrow the search with `kinds`, `createdAfter`, or `createdBefore` if you need a tighter historical slice.\");\n }\n\n return actions;\n}\n\nfunction buildTimelineNextActions(result: AgentMemoryTimelineResponse): string[] {\n if (result.items.length === 0) {\n return [\n \"Use `remix_collab_memory_summary` for current state, then retry `remix_collab_memory_timeline` with broader filters if needed.\",\n ];\n }\n\n const actions: string[] = [\n \"Use `remix_collab_memory_search` if you need relevance-ranked results for a specific feature, bug, or design decision.\",\n ];\n const changeStepId = getFirstChangeStepId(result.items);\n if (changeStepId) {\n actions.push(\n `Use \\`remix_collab_memory_change_step_diff\\` with \\`changeStepId=${changeStepId}\\` after the timeline identifies the change step you need to inspect.`,\n );\n }\n\n if (result.pagination.hasMore) {\n actions.push(\"Apply `kinds`, `createdAfter`, or `createdBefore` filters to focus the timeline on a smaller historical window.\");\n }\n\n return actions;\n}\n\nfunction buildChangeStepDiffNextActions(changeStepId: string): string[] {\n return [\n `Inspect the stored diff for \\`changeStepId=${changeStepId}\\`, then use raw git only if you still need exact repository-level commit or ancestry details.`,\n ];\n}\n\nfunction unwrapResponseObject<T>(resp: any, label: string): T {\n const obj = resp?.responseObject;\n if (obj === undefined || obj === null) {\n throw new Error(typeof resp?.message === \"string\" && resp.message.trim() ? resp.message : `Missing ${label} response`);\n }\n return obj as T;\n}\n\nfunction makeNotBoundError(): Error & { hint?: string } {\n const error = new Error(\"Repository is not bound to Remix.\") as Error & { hint?: string };\n error.hint = \"Run `remix_collab_init` in this repository, or pass `appId` explicitly for a direct memory read.\";\n return error;\n}\n\nasync function maybeFindGitRoot(cwd: string): Promise<string | null> {\n try {\n return await findGitRoot(cwd);\n } catch {\n return null;\n }\n}\n\nasync function resolveMemoryTarget(params: { cwd: string; appId?: string }): Promise<MemoryTarget> {\n const explicitAppId = params.appId?.trim();\n if (explicitAppId) {\n return {\n appId: explicitAppId,\n repoRoot: await maybeFindGitRoot(params.cwd),\n };\n }\n\n const repoRoot = await findGitRoot(params.cwd);\n const binding = await readCollabBinding(repoRoot);\n if (!binding) {\n throw makeNotBoundError();\n }\n\n return {\n appId: binding.currentAppId,\n repoRoot,\n };\n}\n\nexport async function getMemorySummary(params: { cwd: string; appId?: string }): Promise<ToolResult<AgentMemorySummary>> {\n const target = await resolveMemoryTarget(params);\n const api = await createApiClient();\n const resp = await api.getAgentMemorySummary(target.appId);\n const data = unwrapResponseObject<AgentMemorySummary>(resp, \"agent memory summary\");\n\n return {\n data,\n warnings: [],\n recommendedNextActions: buildSummaryNextActions(data),\n logContext: target,\n };\n}\n\nexport async function searchMemory(params: {\n cwd: string;\n appId?: string;\n query: string;\n kinds?: AgentMemoryKind[];\n limit?: number;\n offset?: number;\n createdAfter?: string;\n createdBefore?: string;\n}): Promise<ToolResult<AgentMemorySearchResponse>> {\n const target = await resolveMemoryTarget(params);\n const api = await createApiClient();\n const resp = await api.searchAgentMemory(target.appId, {\n q: params.query,\n kinds: params.kinds,\n limit: params.limit,\n offset: params.offset,\n createdAfter: params.createdAfter,\n createdBefore: params.createdBefore,\n });\n const data = unwrapResponseObject<AgentMemorySearchResponse>(resp, \"agent memory search\");\n\n return {\n data,\n warnings: [],\n recommendedNextActions: buildSearchNextActions(data),\n logContext: target,\n };\n}\n\nexport async function getMemoryTimeline(params: {\n cwd: string;\n appId?: string;\n kinds?: AgentMemoryKind[];\n limit?: number;\n offset?: number;\n createdAfter?: string;\n createdBefore?: string;\n}): Promise<ToolResult<AgentMemoryTimelineResponse>> {\n const target = await resolveMemoryTarget(params);\n const api = await createApiClient();\n const resp = await api.listAgentMemoryTimeline(target.appId, {\n kinds: params.kinds,\n limit: params.limit,\n offset: params.offset,\n createdAfter: params.createdAfter,\n createdBefore: params.createdBefore,\n });\n const data = unwrapResponseObject<AgentMemoryTimelineResponse>(resp, \"agent memory timeline\");\n\n return {\n data,\n warnings: [],\n recommendedNextActions: buildTimelineNextActions(data),\n logContext: target,\n };\n}\n\nexport async function getChangeStepDiff(params: {\n cwd: string;\n appId?: string;\n changeStepId: string;\n}): Promise<ToolResult<ChangeStepDiffResponse>> {\n const target = await resolveMemoryTarget(params);\n const api = await createApiClient();\n const resp = await api.getChangeStepDiff(target.appId, params.changeStepId);\n const data = unwrapResponseObject<ChangeStepDiffResponse>(resp, \"change step diff\");\n\n return {\n data,\n warnings: [],\n recommendedNextActions: buildChangeStepDiffNextActions(data.changeStepId),\n logContext: target,\n };\n}\n"],"mappings":"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","names":["resolveConfig","resolveConfig","z","z","z","z","z","z","genericRecordSchema","z","genericArraySchema","findGitRoot","unwrapResponseObject","findGitRoot","getAnnotations","buildSuccessEnvelope","buildErrorEnvelope","deriveErrorRisks","registerTool","z"]}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CollabApiClient } from '@remixhq/core/collab';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
|
|
4
|
+
type LogLevel = "info" | "error";
|
|
5
|
+
type LogEvent = {
|
|
6
|
+
level: LogLevel;
|
|
7
|
+
message: string;
|
|
8
|
+
tool?: string;
|
|
9
|
+
requestId?: string | null;
|
|
10
|
+
durationMs?: number;
|
|
11
|
+
result?: "success" | "error";
|
|
12
|
+
errorCode?: string | null;
|
|
13
|
+
repoRoot?: string | null;
|
|
14
|
+
appId?: string | null;
|
|
15
|
+
mrId?: string | null;
|
|
16
|
+
truncated?: boolean;
|
|
17
|
+
};
|
|
18
|
+
type Logger = {
|
|
19
|
+
log(event: LogEvent): void;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type Policy = {
|
|
23
|
+
allowLocalWrite: boolean;
|
|
24
|
+
allowRemoteWrite: boolean;
|
|
25
|
+
allowedRepoRoots: string[] | null;
|
|
26
|
+
maxDiffBytes: number;
|
|
27
|
+
maxDiffOutputChars: number;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
type ServerContext = {
|
|
31
|
+
serverName: string;
|
|
32
|
+
version: string;
|
|
33
|
+
policy: Policy;
|
|
34
|
+
logger: Logger;
|
|
35
|
+
getCollabApiClient(): Promise<CollabApiClient>;
|
|
36
|
+
agentMetadata: {
|
|
37
|
+
type: string;
|
|
38
|
+
name?: string;
|
|
39
|
+
version?: string;
|
|
40
|
+
provider?: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
declare function createRemixMcpServer(params: {
|
|
45
|
+
version: string;
|
|
46
|
+
}): {
|
|
47
|
+
server: McpServer;
|
|
48
|
+
context: ServerContext;
|
|
49
|
+
};
|
|
50
|
+
declare function startStdioServer(params: {
|
|
51
|
+
version: string;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
|
|
54
|
+
export { createRemixMcpServer, startStdioServer };
|