105 lines · 3.6 KB · TypeScript
RawDownload
import type {  DesktopControlCommand,  DesktopControlPayloadMap,} from '../../frontend/src/lib/desktopControlContract';import {  controlCommandCapability as resolveCommandCapability,  extractGateTargetRef,  sessionProfileCapabilities as capabilitiesForProfile,} from '../../frontend/src/lib/desktopControlContract';import { createSettingsHandlers } from './handlers/settingsHandlers';import { createUpdateHandlers } from './handlers/updateHandlers';import { createWormholeHandlers } from './handlers/wormholeHandlers';import type {  NativeControlExecutor,  NativeControlHandlerContext,  NativeControlHandlerMap,  NativeControlInvokeMeta,} from './types'; function createHandlerMap(): NativeControlHandlerMap {  return {    ...createWormholeHandlers(),    ...createSettingsHandlers(),    ...createUpdateHandlers(),  };} export function createNativeControlRouter(  ctx: NativeControlHandlerContext,  exec: NativeControlExecutor,) {  const handlers = createHandlerMap();  return {    async invoke<C extends DesktopControlCommand>(      command: C,      payload: DesktopControlPayloadMap[C],      meta?: NativeControlInvokeMeta,    ): Promise<unknown> {      const handler = handlers[command];      if (!handler) {        throw new Error(`native_control_handler_missing:${command}`);      }      const expectedCapability = resolveCommandCapability(command);      const profile = ctx.sessionProfile;      const profileCapabilities = profile ? capabilitiesForProfile(profile) : [];      const profileAllows =        !profile || profileCapabilities.length === 0 || profileCapabilities.includes(expectedCapability);      const profileEnforced = Boolean((ctx.enforceSessionProfile || meta?.enforceProfileHint) && profile);      const allowedCapabilitiesConfigured =        Array.isArray(ctx.allowedCapabilities) && ctx.allowedCapabilities.length > 0;      const capabilityDenied =        allowedCapabilitiesConfigured && !ctx.allowedCapabilities!.includes(expectedCapability);      const targetRef = extractGateTargetRef(command, payload);      const auditBase = {        command,        expectedCapability,        declaredCapability: meta?.capability,        ...(targetRef ? { targetRef } : {}),        sessionProfile: profile,        sessionProfileHint: meta?.sessionProfileHint,        enforceProfileHint: meta?.enforceProfileHint,        profileAllows,        allowedCapabilitiesConfigured,        enforced: profileEnforced,      } as const;      if (meta?.capability && meta.capability !== expectedCapability) {        ctx.auditControlUse?.({          ...auditBase,          outcome: 'capability_mismatch',        });        throw new Error(          `native_control_capability_mismatch:${meta.capability}:${expectedCapability}`,        );      }      if (capabilityDenied) {        ctx.auditControlUse?.({          ...auditBase,          outcome: 'capability_denied',        });        throw new Error(`native_control_capability_denied:${expectedCapability}`);      }      if (!profileAllows) {        const profileMessage = `native_control_profile_mismatch:${profile}:${expectedCapability}`;        ctx.auditControlUse?.({          ...auditBase,          outcome: profileEnforced ? 'profile_denied' : 'profile_warn',        });        if (profileEnforced) {          throw new Error(profileMessage);        }        console.warn(profileMessage, {          command,          sessionProfileHint: meta?.sessionProfileHint,        });      }      if (profileAllows) {        ctx.auditControlUse?.({          ...auditBase,          outcome: 'allowed',        });      }      return handler(payload, ctx, exec);    },  };}