{"version":3,"sources":["../../src/bridges/ggcoder-rpc.ts"],"sourcesContent":["import type { JsonObject, VoiceBridgeCommand, VoiceBridgeEvent, VoiceTool } from \"../types.js\";\n\nexport interface GGCoderRpcMessageSink {\n  send(message: JsonObject, signal?: AbortSignal): Promise<void>;\n}\n\nexport interface GGCoderRpcBridgeOptions {\n  readonly sink: GGCoderRpcMessageSink;\n  readonly idFactory?: () => string;\n}\n\nexport interface GGCoderRpcBridge {\n  send(command: VoiceBridgeCommand, signal?: AbortSignal): Promise<string>;\n  toTool(): VoiceTool;\n}\n\nexport function createGGCoderRpcBridge(options: GGCoderRpcBridgeOptions): GGCoderRpcBridge {\n  const idFactory = options.idFactory ?? (() => `ggcoder_${Date.now()}`);\n  return {\n    async send(command, signal): Promise<string> {\n      const id = idFactory();\n      await options.sink.send(toGGCoderRpcCommand(id, command), signal);\n      return id;\n    },\n    toTool(): VoiceTool {\n      return createSendToGGCoderTool(this);\n    },\n  };\n}\n\nexport function toGGCoderRpcCommand(id: string, command: VoiceBridgeCommand): JsonObject {\n  switch (command.type) {\n    case \"prompt\":\n      return { id, command: \"prompt\", text: command.text };\n    case \"cancel\":\n      return { id, command: \"abort\" };\n    case \"status\":\n      return { id, command: \"get_state\" };\n    case \"new_session\":\n      return { id, command: \"new_session\" };\n    case \"switch_model\":\n      return { id, command: \"switch_model\", provider: command.provider, model: command.model };\n    case \"switch_project\":\n      return { id, command: \"prompt\", text: `Switch project to ${command.project}` };\n    case \"list_projects\":\n      return { id, command: \"prompt\", text: \"List available GG projects.\" };\n  }\n}\n\nexport function normalizeGGCoderRpcEvent(message: unknown): VoiceBridgeEvent | null {\n  if (!isJsonObject(message)) {\n    return null;\n  }\n  const type = typeof message.type === \"string\" ? message.type : \"\";\n  switch (type) {\n    case \"text_delta\":\n      return { type: \"text_delta\", text: stringValue(message.text) };\n    case \"tool_call_start\":\n      return {\n        type: \"tool_start\",\n        id: stringOrUndefined(message.toolCallId),\n        name: stringValue(message.name),\n      };\n    case \"tool_call_end\":\n      return {\n        type: \"tool_end\",\n        id: stringOrUndefined(message.toolCallId),\n        name: stringValue(message.name),\n        isError: message.isError === true,\n      };\n    case \"agent_done\":\n      return { type: \"completion\" };\n    case \"ready\":\n    case \"session_start\":\n    case \"model_change\":\n      return { type: \"status\", status: message };\n    case \"error\":\n      return { type: \"error\", error: stringValue(message.message ?? message.error) };\n    default:\n      return null;\n  }\n}\n\nfunction createSendToGGCoderTool(bridge: GGCoderRpcBridge): VoiceTool {\n  return {\n    name: \"send_to_ggcoder\",\n    description: \"Send a prompt or control command to a running ggcoder RPC session.\",\n    parameters: {\n      type: \"object\",\n      properties: {\n        text: { type: \"string\", description: \"Prompt text to send to ggcoder.\" },\n      },\n      required: [\"text\"],\n    },\n    async execute(args, context) {\n      const text = typeof args.text === \"string\" ? args.text : \"\";\n      if (!text) {\n        return { error: \"text is required\" };\n      }\n      const id = await bridge.send({ type: \"prompt\", text }, context.signal);\n      return { status: \"sent\", id };\n    },\n  };\n}\n\nfunction stringValue(value: unknown): string {\n  return typeof value === \"string\" ? value : \"\";\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n  return typeof value === \"string\" ? value : undefined;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}