Files
openchamber/packages/vscode/src/bridge.ts
T

182 lines
5.2 KiB
TypeScript
Raw Normal View History

2025-12-13 16:34:17 +02:00
import * as vscode from 'vscode';
import { type OpenCodeManager } from './opencode';
import { handleStandardGitBridgeMessage } from './bridge-git-runtime';
import { handleSpecialGitBridgeMessage } from './bridge-git-special-runtime';
import { handleFsBridgeMessage } from './bridge-fs-runtime';
import { handleConfigBridgeMessage } from './bridge-config-runtime';
import { handleSystemBridgeMessage } from './bridge-system-runtime';
import { handleProxyBridgeMessage } from './bridge-proxy-runtime';
import { handlePermissionAutoAcceptBridgeMessage } from './bridge-permission-auto-accept-runtime';
import {
fetchOpenCodeSkillsFromApi,
persistSettings,
readSettings,
readMagicPromptOverrides,
saveMagicPromptOverride,
resetMagicPromptOverride,
resetAllMagicPromptOverrides,
} from './bridge-settings-runtime';
import { execGit } from './bridge-git-process-runtime';
import {
parseDroppedFileReference,
readUriAsAttachment,
resolveUserPath,
listDirectoryEntries,
normalizeFsPath,
searchDirectory,
resolveFileReadPath,
fetchModelsMetadata,
} from './bridge-fs-helpers-runtime';
import {
tryHandleLocalFsProxy,
buildUnavailableApiResponse,
sanitizeForwardHeaders,
collectHeaders,
base64EncodeUtf8,
} from './bridge-localfs-proxy-runtime';
2026-01-24 01:57:35 +02:00
2025-12-13 16:34:17 +02:00
export interface BridgeRequest {
id: string;
type: string;
payload?: unknown;
}
export interface BridgeResponse {
id: string;
type: string;
success: boolean;
data?: unknown;
error?: string;
}
export interface BridgeContext {
manager?: OpenCodeManager;
context?: vscode.ExtensionContext;
}
const CLIENT_RELOAD_DELAY_MS = 800;
2025-12-13 16:34:17 +02:00
const UPDATE_CHECK_URL = process.env.OPENCHAMBER_UPDATE_API_URL || 'https://api.openchamber.dev/v1/update/check';
const GITHUB_BACKEND_DISABLED_ERROR = 'OpenChamber VS Code backend GitHub integration is disabled. Use native VS Code GitHub integrations.';
export async function handleBridgeMessage(message: BridgeRequest, ctx?: BridgeContext): Promise<BridgeResponse> {
const { id, type, payload } = message;
try {
const permissionAutoAcceptResponse = await handlePermissionAutoAcceptBridgeMessage(
{ id, type, payload },
ctx?.context,
{
broadcast: (snapshot) => vscode.commands.executeCommand(
'openchamber.internal.permissionAutoAcceptSynced',
snapshot,
),
},
);
if (permissionAutoAcceptResponse) return permissionAutoAcceptResponse;
const standardGitResponse = await handleStandardGitBridgeMessage({ id, type, payload });
if (standardGitResponse) {
return standardGitResponse;
}
const specialGitResponse = await handleSpecialGitBridgeMessage(
{ id, type, payload },
ctx,
{ readSettings, execGit }
);
if (specialGitResponse) {
return specialGitResponse;
}
const fsResponse = await handleFsBridgeMessage(
{ id, type, payload },
{
resolveUserPath,
listDirectoryEntries,
normalizeFsPath,
execGit,
searchDirectory,
resolveFileReadPath,
parseDroppedFileReference,
readUriAsAttachment,
}
);
if (fsResponse) {
return fsResponse;
}
const configResponse = await handleConfigBridgeMessage(
{ id, type, payload },
ctx,
{
readSettings,
persistSettings,
readMagicPromptOverrides,
saveMagicPromptOverride,
resetMagicPromptOverride,
resetAllMagicPromptOverrides,
fetchOpenCodeSkillsFromApi,
clientReloadDelayMs: CLIENT_RELOAD_DELAY_MS,
},
);
if (configResponse) {
return configResponse;
}
const systemResponse = await handleSystemBridgeMessage(
{ id, type, payload },
ctx,
{
resolveUserPath,
fetchModelsMetadata,
updateCheckUrl: UPDATE_CHECK_URL,
clientReloadDelayMs: CLIENT_RELOAD_DELAY_MS,
},
);
if (systemResponse) {
return systemResponse;
}
const proxyResponse = await handleProxyBridgeMessage(
{ id, type, payload },
ctx,
{
tryHandleLocalFsProxy,
buildUnavailableApiResponse,
sanitizeForwardHeaders,
collectHeaders,
base64EncodeUtf8,
},
);
if (proxyResponse) {
return proxyResponse;
}
2025-12-13 16:34:17 +02:00
switch (type) {
case 'api:github/auth:status':
case 'api:github/auth:start':
case 'api:github/auth:complete':
case 'api:github/auth:disconnect':
case 'api:github/auth:activate':
case 'api:github/me':
case 'api:github/pr:status':
case 'api:github/pr:create':
case 'api:github/pr:update':
case 'api:github/pr:merge':
case 'api:github/pr:ready':
case 'api:github/issues:list':
case 'api:github/issues:get':
case 'api:github/issues:comments':
case 'api:github/pulls:list':
case 'api:github/pulls:context':
case 'api:github/repo:upstream':
case 'api:github/repo:branches': {
return { id, type, success: false, error: GITHUB_BACKEND_DISABLED_ERROR };
}
2025-12-13 16:34:17 +02:00
default:
return { id, type, success: false, error: `Unknown message type: ${type}` };
}
} catch (err) {
const errorMessage = err instanceof Error ? err.message : String(err);
return { id, type, success: false, error: errorMessage };
}
}