{"version":3,"sources":["../src/lib/types/actor-v3.ts","../src/lib/types/config.ts","../src/lib/api/actor-v3-client.ts","../src/lib/api/chat-client.ts","../src/hooks/use-actor-v3.ts","../src/hooks/use-gftd-chat.ts","../src/lib/config/sdk-config-manager.ts","../src/lib/git/gitlab-client.ts","../src/lib/git/git-embedding-sdk.ts","../src/lib/git/git-fs.ts","../src/lib/git/git-vector-store.ts","../src/lib/git/actor-git-manager.ts","../src/lib/utils/uuid.ts","../src/lib/git/actor-repository-manager.ts","../src/lib/git/chat-git-manager.ts","../src/lib/git/chat-history-utils.ts","../src/lib/auth/auth-middleware.ts","../src/lib/auth/gftd-auth-client.ts","../src/lib/embedding/vector-store.ts","../src/lib/utils.ts","../src/lib/index.ts"],"sourcesContent":["/**\n * Actor v3 API型定義\n * プロセス代数とLangChain.js互換性\n * https://actor.gftd.ai/api/v3/actor\n */\n\n// UUID generation - using Web Crypto API\n\n// ===== Core Types =====\n\nexport type ActorID = string\n\nexport interface Message {\n  id: string\n  label: string\n  payload: Record<string, any>\n  timestamp: string\n  sender?: ActorID\n}\n\nexport interface State {\n  [key: string]: any\n}\n\nexport interface OutAction {\n  type: 'send' | 'spawn' | 'terminate'\n  target?: ActorID\n  message?: Message\n  behavior?: Behavior\n}\n\nexport interface BehaviorResult {\n  new_state: State\n  actions: OutAction[]\n  error?: string\n}\n\nexport interface Behavior {\n  id: string\n  name: string\n  description: string\n  version: string\n  handler: (message: Message, state: State) => Promise<BehaviorResult>\n  metadata: {\n    created_at: string\n    updated_at: string\n    author: string\n    tags: string[]\n    capabilities: string[]\n  }\n  process_algebra: {\n    notation: 'CCS' | 'π-calculus' | 'ACP'\n    expression: string\n    channels: string[]\n  }\n}\n\n// ===== API Request/Response Types =====\n\nexport interface CreateActorRequest {\n  behavior: Behavior\n  organization_id: string\n  initial_state?: State\n}\n\nexport interface CreateActorResponse {\n  actor_id: ActorID\n  status: 'created'\n  timestamp: string\n}\n\nexport interface SendMessageRequest {\n  target: ActorID\n  message: Omit<Message, 'id' | 'timestamp'>\n}\n\nexport interface SendMessageResponse {\n  message_id: string\n  status: 'sent'\n  timestamp: string\n}\n\nexport interface ReceiveMessagesRequest {\n  max_messages?: number\n  timeout?: number\n  filter?: {\n    labels?: string[]\n    sender?: ActorID\n  }\n}\n\nexport interface ReceiveMessagesResponse {\n  messages: Message[]\n  behavior_results: BehaviorResult[]\n  timestamp: string\n}\n\nexport interface ListActorsResponse {\n  actors: {\n    actor_id: ActorID\n    behavior_name: string\n    status: 'active' | 'inactive' | 'terminated'\n    created_at: string\n  }[]\n  total_count: number\n}\n\nexport interface ActorSystemConfig {\n  process_algebra_analysis: {\n    deadlock_free: boolean\n    livelock_free: boolean\n    deadlock_actors?: ActorID[]\n    livelock_patterns?: string[]\n  }\n  communication_topology: {\n    edges: {\n      from: ActorID\n      to: ActorID\n      channel: string\n      weight: number\n    }[]\n  }\n}\n\nexport interface SystemStatsResponse {\n  stats: {\n    active_actors: number\n    total_messages: number\n    average_latency_ms: number\n  }\n  detailed_metrics: {\n    performance_metrics: {\n      throughput: number\n      latency_p95: number\n    }\n  }\n}\n\n// ===== LangChain.js Compatibility Types =====\n\nexport interface LangChainMessage {\n  role: \"user\" | \"assistant\" | \"system\"\n  content: string\n  name?: string\n  function_call?: any\n}\n\nexport interface RunnableConfig {\n  timeout?: number\n  maxMessages?: number\n}\n\nexport interface ActorV3RunnableInterface {\n  invoke(input: any, config?: RunnableConfig): Promise<any>\n  stream(input: any, config?: RunnableConfig): AsyncGenerator<any, any, unknown>\n  batch(inputs: any[], config?: RunnableConfig): Promise<any[]>\n  pipe<T>(next: T): T\n  withFallbacks(fallbacks: any[]): any\n}\n\n// ===== Utility Functions =====\n\nexport function createMessage(label: string, payload: Record<string, any>, sender?: ActorID): Message {\n  return {\n    id: crypto.randomUUID(),\n    label,\n    payload,\n    timestamp: new Date().toISOString(),\n    sender\n  }\n}\n\nexport function langChainToActorV3(lcMsg: LangChainMessage): Message {\n  return {\n    id: crypto.randomUUID(),\n    label: lcMsg.name || 'langchain_message',\n    payload: { content: lcMsg.content },\n    timestamp: new Date().toISOString(),\n    sender: lcMsg.role === 'user' ? 'user' : undefined\n  }\n}\n\nexport function actorV3ToLangChain(actorMsg: Message): LangChainMessage {\n  return {\n    role: actorMsg.sender ? \"user\" : \"assistant\",\n    content: typeof actorMsg.payload === 'string' ? actorMsg.payload : JSON.stringify(actorMsg.payload),\n    name: actorMsg.label\n  }\n}\n\n// ===== Error Types =====\n\nexport interface ActorV3Error {\n  code: string\n  message: string\n  details?: Record<string, any>\n}\n\nexport interface ApiV3Response<T> {\n  success: boolean\n  data?: T\n  error?: ActorV3Error\n} ","/**\n * @file lib/types/config.ts\n * @description Actor SDK Config 設定システム\n * @author GFTD Co., Ltd.\n */\n\nimport { SessionConfig } from './session'\nimport { GitConfig } from '../git/git-fs'\nimport { ChatGitConfig } from './chat-git'\n\n/**\n * GFTD認証設定\n */\nexport interface GFTDAuthConfig {\n  /** 認証必須かどうか */\n  required?: boolean\n  /** 認証サーバーURL */\n  authUrl?: string\n  /** 認証APIキー */\n  apiKey?: string\n  /** 認証トークンの有効期限 (秒) */\n  tokenExpiry?: number\n  /** 認証プロバイダー */\n  provider?: 'gftd' | 'custom'\n  /** 認証スコープ */\n  scopes?: string[]\n  /** 自動リフレッシュ設定 */\n  autoRefresh?: boolean\n  /** リダイレクトURL */\n  redirectUrl?: string\n}\n\n/**\n * ツール機能設定\n */\nexport interface ToolsConfig {\n  /** Actor管理機能 */\n  actorManagement: boolean\n  /** セッション管理機能 */\n  sessionManagement: boolean\n  /** ストリーミング機能 */\n  streaming: boolean\n  /** Embedding & Vector Search機能 */\n  embedding: boolean\n  /** Git統合機能 */\n  gitIntegration: boolean\n  /** チャット履歴Git管理 */\n  chatGitManagement: boolean\n  /** モニタリング & アナリティクス */\n  monitoring: boolean\n  /** React UI コンポーネント */\n  uiComponents: boolean\n}\n\n/**\n * Actor API設定\n */\nexport interface ActorApiConfig {\n  /** API ベース URL */\n  baseUrl: string\n  /** API キー */\n  apiKey?: string\n  /** タイムアウト設定 (秒) */\n  timeout?: number\n  /** リトライ回数 */\n  retryCount?: number\n  /** リクエストヘッダー */\n  headers?: Record<string, string>\n}\n\n/**\n * Embedding設定\n */\nexport interface EmbeddingConfig {\n  /** モデル名 */\n  modelName?: string\n  /** ベクトル次元数 */\n  dimensions?: number\n  /** キャッシュディレクトリ */\n  cacheDir?: string\n  /** バッチサイズ */\n  batchSize?: number\n}\n\n/**\n * Git統合設定\n */\nexport interface GitIntegrationConfig {\n  /** GitLab設定 */\n  gitlab?: {\n    url: string\n    token: string\n    defaultVisibility?: 'private' | 'internal' | 'public'\n  }\n  /** Git作成者情報 */\n  author?: {\n    name: string\n    email: string\n  }\n  /** 自動コミット設定 */\n  autoCommit?: boolean\n  /** 自動プッシュ設定 */\n  autoPush?: boolean\n  /** デフォルトブランチ名 */\n  defaultBranch?: string\n}\n\n/**\n * ストリーミング設定\n */\nexport interface StreamingConfig {\n  /** ストリーミング有効化 */\n  enabled: boolean\n  /** チャンクサイズ */\n  chunkSize?: number\n  /** タイムアウト設定 (秒) */\n  timeout?: number\n  /** 再接続設定 */\n  reconnect?: {\n    enabled: boolean\n    maxAttempts?: number\n    interval?: number\n  }\n}\n\n/**\n * モニタリング設定\n */\nexport interface MonitoringConfig {\n  /** メトリクス収集 */\n  metricsEnabled: boolean\n  /** ログレベル */\n  logLevel?: 'debug' | 'info' | 'warn' | 'error'\n  /** パフォーマンス追跡 */\n  performanceTracking?: boolean\n  /** エラー自動レポート */\n  errorReporting?: boolean\n}\n\n/**\n * UI設定\n */\nexport interface UIConfig {\n  /** テーマ */\n  theme?: 'light' | 'dark' | 'auto'\n  /** 言語設定 */\n  locale?: string\n  /** デフォルトページサイズ */\n  defaultPageSize?: number\n  /** アニメーション有効化 */\n  animations?: boolean\n  /** カスタムCSS */\n  customStyles?: string\n}\n\n/**\n * デバッグ設定\n */\nexport interface DebugConfig {\n  /** デバッグモード */\n  enabled: boolean\n  /** 詳細ログ */\n  verboseLogging?: boolean\n  /** API呼び出しログ */\n  logApiCalls?: boolean\n  /** Git操作ログ */\n  logGitOperations?: boolean\n  /** パフォーマンス計測 */\n  measurePerformance?: boolean\n}\n\n/**\n * Actor SDK 包括的設定\n */\nexport interface ActorSDKConfig {\n  /** 有効化するtools */\n  tools: ToolsConfig\n  \n  /** Actor API設定 */\n  api: ActorApiConfig\n  \n  /** GFTD認証設定 */\n  auth?: GFTDAuthConfig\n  \n  /** セッション管理のデフォルト設定 */\n  session?: SessionConfig\n  \n  /** Embedding設定 */\n  embedding?: EmbeddingConfig\n  \n  /** Git統合設定 */\n  git?: GitIntegrationConfig\n  \n  /** チャット履歴Git管理設定 */\n  chatGit?: ChatGitConfig\n  \n  /** ストリーミング設定 */\n  streaming?: StreamingConfig\n  \n  /** モニタリング設定 */\n  monitoring?: MonitoringConfig\n  \n  /** UI設定 */\n  ui?: UIConfig\n  \n  /** デバッグ設定 */\n  debug?: DebugConfig\n  \n  /** カスタム設定 */\n  custom?: Record<string, any>\n}\n\n/**\n * デフォルト設定を生成\n */\nexport function createDefaultConfig(): ActorSDKConfig {\n  return {\n    api: {\n      baseUrl: 'https://actor.gftd.ai/api/v3',\n      timeout: 30000,\n      retryCount: 3\n    },\n    tools: {\n      actorManagement: true,\n      sessionManagement: true,\n      streaming: true,\n      embedding: false,\n      gitIntegration: false,\n      chatGitManagement: false,\n      monitoring: true,\n      uiComponents: true\n    },\n    auth: {\n      required: false,\n      provider: 'gftd'\n    },\n    session: {\n      max_iterations: 100,\n      auto_save: true\n    },\n    streaming: {\n      enabled: true,\n      chunkSize: 1024,\n      timeout: 60,\n      reconnect: {\n        enabled: true,\n        maxAttempts: 3,\n        interval: 5000\n      }\n    },\n    monitoring: {\n      metricsEnabled: true,\n      logLevel: 'info',\n      performanceTracking: false,\n      errorReporting: false\n    },\n    ui: {\n      theme: 'auto',\n      locale: 'ja',\n      defaultPageSize: 20,\n      animations: true\n    },\n    debug: {\n      enabled: false,\n      verboseLogging: false,\n      logApiCalls: false,\n      logGitOperations: false,\n      measurePerformance: false\n    }\n  }\n}\n\n/**\n * 開発環境用設定を生成\n */\nexport function createDevelopmentConfig(): ActorSDKConfig {\n  const baseConfig = createDefaultConfig()\n  return {\n    ...baseConfig,\n    api: {\n      ...baseConfig.api,\n      baseUrl: 'https://actor.gftd.ai/api/v3'\n    },\n    tools: {\n      ...baseConfig.tools,\n      gitIntegration: true,\n      chatGitManagement: true,\n      embedding: true,\n      monitoring: true\n    },\n    auth: {\n      required: false,\n      provider: 'gftd'\n    },\n    debug: {\n      enabled: true,\n      logApiCalls: true,\n      logGitOperations: true\n    }\n  }\n}\n\n/**\n * プロダクション環境用設定を生成\n */\nexport function createProductionConfig(): ActorSDKConfig {\n  const baseConfig = createDefaultConfig()\n  return {\n    ...baseConfig,\n    api: {\n      ...baseConfig.api,\n      baseUrl: 'https://actor.gftd.ai/api/v3'\n    },\n    auth: {\n      required: true,\n      provider: 'gftd'\n    },\n    debug: {\n      enabled: false,\n      logApiCalls: false,\n      logGitOperations: false\n    }\n  }\n}\n\n/**\n * 設定をマージ\n */\nexport function mergeConfig(...configs: Partial<ActorSDKConfig>[]): ActorSDKConfig {\n  // デフォルト設定をベースとして開始\n  const baseConfig = {\n    tools: {\n      actorManagement: true,\n      sessionManagement: true,\n      streaming: true,\n      embedding: false,\n      gitIntegration: false,\n      chatGitManagement: false,\n      monitoring: true,\n      uiComponents: true\n    },\n    api: {\n      baseUrl: process.env.ACTOR_API_BASE_URL || 'https://api.gftd.ai',\n      timeout: 30,\n      retryCount: 3\n    }\n  } as ActorSDKConfig\n\n  return configs.reduce<ActorSDKConfig>((acc, config) => {\n    if (!config) return acc\n    \n    return {\n      ...acc,\n      ...config,\n      tools: config.tools ? { ...acc.tools, ...config.tools } : acc.tools,\n      api: config.api ? { ...acc.api, ...config.api } : acc.api,\n      auth: config.auth ? { ...acc.auth, ...config.auth } : acc.auth,\n      session: config.session ? { ...acc.session, ...config.session } : acc.session,\n      embedding: config.embedding ? { ...acc.embedding, ...config.embedding } : acc.embedding,\n      git: config.git ? { ...acc.git, ...config.git } : acc.git,\n      chatGit: config.chatGit ? { ...acc.chatGit, ...config.chatGit } : acc.chatGit,\n      streaming: config.streaming ? { ...acc.streaming, ...config.streaming } : acc.streaming,\n      monitoring: config.monitoring ? { ...acc.monitoring, ...config.monitoring } : acc.monitoring,\n      ui: config.ui ? { ...acc.ui, ...config.ui } : acc.ui,\n      debug: config.debug ? { ...acc.debug, ...config.debug } : acc.debug,\n      custom: config.custom ? { ...acc.custom, ...config.custom } : acc.custom,\n    }\n  }, baseConfig)\n}\n\n/**\n * 設定の検証\n */\nexport function validateConfig(config: ActorSDKConfig): { valid: boolean; errors: string[] } {\n  const errors: string[] = []\n\n  // 必須フィールドのチェック\n  if (!config.api?.baseUrl) {\n    errors.push('api.baseUrl is required')\n  }\n\n  return {\n    valid: errors.length === 0,\n    errors\n  }\n}\n\n/**\n * 設定が有効かチェック\n */\nexport function isToolEnabled(config: ActorSDKConfig, tool: keyof ToolsConfig): boolean {\n  return config.tools[tool] === true\n}\n\n/**\n * 環境変数から設定を生成\n */\nexport function createConfigFromEnv(): Partial<ActorSDKConfig> {\n  const config: Partial<ActorSDKConfig> = {}\n\n  // API設定\n  if (process.env.ACTOR_API_BASE_URL) {\n    config.api = {\n      baseUrl: process.env.ACTOR_API_BASE_URL,\n      apiKey: process.env.ACTOR_API_KEY,\n      timeout: process.env.ACTOR_API_TIMEOUT ? parseInt(process.env.ACTOR_API_TIMEOUT) : undefined,\n    }\n  }\n\n  // GFTD認証設定（環境変数から生成）\n  if (process.env.GFTD_AUTH_URL || process.env.GFTD_AUTH_API_KEY) {\n    config.auth = {\n      required: process.env.GFTD_AUTH_REQUIRED !== 'false',\n      authUrl: process.env.GFTD_AUTH_URL || 'https://auth.gftd.ai',\n      apiKey: process.env.GFTD_AUTH_API_KEY,\n      provider: 'gftd',\n      tokenExpiry: process.env.GFTD_AUTH_TOKEN_EXPIRY ? parseInt(process.env.GFTD_AUTH_TOKEN_EXPIRY) : 3600,\n      scopes: process.env.GFTD_AUTH_SCOPES ? process.env.GFTD_AUTH_SCOPES.split(',') : ['read', 'write'],\n      autoRefresh: process.env.GFTD_AUTH_AUTO_REFRESH !== 'false',\n      redirectUrl: process.env.GFTD_AUTH_REDIRECT_URL\n    }\n  }\n  // デバッグ設定\n  if (process.env.NODE_ENV === 'development') {\n    config.debug = {\n      enabled: true,\n      verboseLogging: true,\n      logApiCalls: true,\n      logGitOperations: true\n    }\n  }\n\n  return config\n}\n\n/**\n * 開発環境設定を生成（統一されたAPIエンドポイント使用）\n */\nexport function createLocalDevelopmentConfig(organizationId?: string): ActorSDKConfig {\n  const baseConfig = createDevelopmentConfig()\n  return {\n    ...baseConfig,\n    api: {\n      ...baseConfig.api,\n      baseUrl: 'https://actor.gftd.ai/api/v3'\n    },\n    tools: {\n      ...baseConfig.tools,\n      gitIntegration: true,\n      chatGitManagement: true,\n      embedding: true,\n      monitoring: true\n    },\n    auth: {\n      required: false,\n      provider: 'gftd'\n    },\n    debug: {\n      enabled: true,\n      logApiCalls: true,\n      logGitOperations: true\n    }\n  }\n}\n\n/**\n * 環境判定: 開発環境かどうか\n */\nexport function isLocalDevelopment(): boolean {\n  return process.env.NODE_ENV === 'development'\n}\n\n/**\n * GitLabデフォルト設定付きSDK設定を生成\n */\nexport function createConfigWithDefaultGitLab(overrides?: Partial<ActorSDKConfig>): ActorSDKConfig {\n  const defaultGitLabConfig = {\n    git: {\n      autoCommit: process.env.GIT_AUTO_COMMIT === 'true',\n      autoPush: process.env.GIT_AUTO_PUSH === 'true',\n      defaultBranch: process.env.GIT_DEFAULT_BRANCH || 'main'\n    },\n    tools: {\n      gitIntegration: true,\n      chatGitManagement: true,\n      actorManagement: true,\n      sessionManagement: true,\n      streaming: true,\n      embedding: false,\n      monitoring: true,\n      uiComponents: true\n    }\n  }\n  const baseConfig = createDefaultConfig()\n  \n  return mergeConfig(baseConfig, defaultGitLabConfig, overrides || {})\n} ","/**\n * Actor v3 APIクライアント\n * プロセス代数とLangChain.js互換性対応\n * https://actor.gftd.ai/api/v3/actor\n */\n\nimport {\n  ActorID,\n  Message,\n  State,\n  Behavior,\n  CreateActorRequest,\n  CreateActorResponse,\n  SendMessageRequest,\n  SendMessageResponse,\n  ReceiveMessagesRequest,\n  ReceiveMessagesResponse,\n  ListActorsResponse,\n  ActorSystemConfig,\n  SystemStatsResponse,\n  ApiV3Response,\n  ActorV3Error,\n  RunnableConfig,\n  LangChainMessage,\n  langChainToActorV3,\n  actorV3ToLangChain,\n  createMessage\n} from \"@/lib/types/actor-v3\"\n\n/**\n * Actor v3 メインクライアント\n */\nexport class ActorV3Client {\n  private baseUrl: string\n  private apiKey?: string\n\n  constructor(config: { apiKey?: string; baseUrl?: string } = {}) {\n    this.baseUrl = config.baseUrl || \"https://actor.gftd.ai/api/v3\"\n    this.apiKey = config.apiKey\n  }\n\n  private async request<T>(\n    endpoint: string,\n    options: RequestInit = {}\n  ): Promise<ApiV3Response<T>> {\n    const url = `${this.baseUrl}${endpoint}`\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n      ...(options.headers as Record<string, string>),\n    }\n\n    if (this.apiKey) {\n      headers.Authorization = `Bearer ${this.apiKey}`\n    }\n\n    try {\n      const response = await fetch(url, {\n        ...options,\n        headers,\n      })\n\n      const data = await response.json()\n\n      if (!response.ok) {\n        return {\n          success: false,\n          error: {\n            code: data.code || 'HTTP_ERROR',\n            message: data.message || `HTTP ${response.status}: ${response.statusText}`,\n            details: data.details\n          }\n        }\n      }\n\n      return {\n        success: true,\n        data: data as T\n      }\n    } catch (error) {\n      return {\n        success: false,\n        error: {\n          code: 'NETWORK_ERROR',\n          message: error instanceof Error ? error.message : 'Unknown network error'\n        }\n      }\n    }\n  }\n\n  /**\n   * アクター管理API\n   */\n  actors = {\n    /**\n     * 新しいアクターを作成\n     */\n    create: async (request: CreateActorRequest): Promise<ApiV3Response<CreateActorResponse>> => {\n      return this.request<CreateActorResponse>(\"/actor\", {\n        method: \"POST\",\n        body: JSON.stringify(request),\n      })\n    },\n\n    /**\n     * アクター一覧を取得\n     */\n    list: async (organizationId?: string): Promise<ApiV3Response<ListActorsResponse>> => {\n      const params = organizationId ? `?organization_id=${organizationId}` : \"\"\n      return this.request<ListActorsResponse>(`/actor${params}`)\n    },\n\n    /**\n     * アクターにメッセージを送信\n     */\n    send: async (actorId: ActorID, request: SendMessageRequest): Promise<ApiV3Response<SendMessageResponse>> => {\n      const messageWithMetadata = {\n        ...request.message,\n        id: crypto.randomUUID(),\n        timestamp: new Date().toISOString()\n      }\n\n      return this.request<SendMessageResponse>(`/actor/${actorId}/send`, {\n        method: \"POST\",\n        body: JSON.stringify({\n          ...request,\n          message: messageWithMetadata\n        }),\n      })\n    },\n\n    /**\n     * アクターからメッセージを受信\n     */\n    receive: async (actorId: ActorID, request: ReceiveMessagesRequest = {}): Promise<ApiV3Response<ReceiveMessagesResponse>> => {\n      const params = new URLSearchParams()\n      if (request.max_messages) params.append(\"max_messages\", request.max_messages.toString())\n      if (request.timeout) params.append(\"timeout\", request.timeout.toString())\n      if (request.filter?.labels) params.append(\"filter_labels\", request.filter.labels.join(\",\"))\n      if (request.filter?.sender) params.append(\"filter_sender\", request.filter.sender)\n\n      const queryString = params.toString()\n      const url = `/actor/${actorId}/receive${queryString ? `?${queryString}` : \"\"}`\n\n      return this.request<ReceiveMessagesResponse>(url)\n    },\n\n    /**\n     * アクターを削除\n     */\n    delete: async (actorId: ActorID): Promise<ApiV3Response<{ status: 'deleted' }>> => {\n      return this.request(`/actor/${actorId}`, {\n        method: \"DELETE\",\n      })\n    }\n  }\n\n  /**\n   * システム管理API\n   */\n  system = {\n    /**\n     * システム設定を取得（プロセス代数分析含む）\n     */\n    getConfig: async (): Promise<ApiV3Response<ActorSystemConfig>> => {\n      return this.request<ActorSystemConfig>(\"/system/config\")\n    },\n\n    /**\n     * システム統計を取得\n     */\n    getStats: async (): Promise<ApiV3Response<SystemStatsResponse>> => {\n      return this.request<SystemStatsResponse>(\"/system/stats\")\n    }\n  }\n}\n\n/**\n * LangChain.js互換性ラッパー\n */\nexport class ActorV3Runnable {\n  constructor(\n    private actorId: ActorID,\n    private client: ActorV3Client\n  ) {}\n\n  /**\n   * LangChain.js invoke() 互換メソッド\n   */\n  async invoke(input: any, config?: RunnableConfig): Promise<any> {\n    // 1. LangChain input → Actor v3 Message\n    const message = typeof input === 'string' \n      ? createMessage('invoke', { content: input })\n      : langChainToActorV3({\n          role: 'user',\n          content: typeof input === 'string' ? input : JSON.stringify(input)\n        })\n\n    // 2. Actor v3 send operation\n    const sendResult = await this.client.actors.send(this.actorId, {\n      target: this.actorId,\n      message\n    })\n\n    if (!sendResult.success) {\n      throw new Error(`Failed to send message: ${sendResult.error?.message}`)\n    }\n\n    // 3. Actor v3 receive operation\n    const receiveResult = await this.client.actors.receive(this.actorId, {\n      max_messages: 1,\n      timeout: config?.timeout || 30000\n    })\n\n    if (!receiveResult.success) {\n      throw new Error(`Failed to receive message: ${receiveResult.error?.message}`)\n    }\n\n    // 4. Actor v3 result → LangChain output\n    const { messages, behavior_results } = receiveResult.data!\n    \n    if (behavior_results.length > 0 && behavior_results[0].actions.length > 0) {\n      const outAction = behavior_results[0].actions[0]\n      if (outAction.type === 'send' && outAction.message) {\n        return actorV3ToLangChain(outAction.message)\n      }\n    }\n\n    if (messages.length > 0) {\n      return actorV3ToLangChain(messages[0])\n    }\n\n    return { role: 'assistant', content: 'No response generated' }\n  }\n\n  /**\n   * LangChain.js stream() 互換メソッド\n   */\n  async *stream(input: any, config?: RunnableConfig): AsyncGenerator<any, any, unknown> {\n    const message = typeof input === 'string'\n      ? createMessage('stream', { content: input })\n      : langChainToActorV3({\n          role: 'user',\n          content: typeof input === 'string' ? input : JSON.stringify(input)\n        })\n\n    await this.client.actors.send(this.actorId, {\n      target: this.actorId,\n      message\n    })\n\n    // Poll for messages with streaming-like behavior\n    let receivedCount = 0\n    const maxMessages = config?.maxMessages || 10\n\n    while (receivedCount < maxMessages) {\n      const { data } = await this.client.actors.receive(this.actorId, {\n        max_messages: 1,\n        timeout: 1000\n      })\n\n      if (data?.messages && data.messages.length > 0) {\n        for (const msg of data.messages) {\n          yield actorV3ToLangChain(msg)\n          receivedCount++\n        }\n      } else {\n        // No more messages, break\n        break\n      }\n    }\n  }\n\n  /**\n   * LangChain.js batch() 互換メソッド\n   */\n  async batch(inputs: any[], config?: RunnableConfig): Promise<any[]> {\n    const promises = inputs.map(input => this.invoke(input, config))\n    return Promise.all(promises)\n  }\n\n  /**\n   * LangChain.js pipe() 互換メソッド\n   */\n  pipe<T>(next: T): T {\n    // 簡単な実装。実際にはパイプライン機能を実装する必要がある\n    return next\n  }\n\n  /**\n   * LangChain.js withFallbacks() 互換メソッド\n   */\n  withFallbacks(fallbacks: any[]): ActorV3Runnable {\n    // 簡単な実装。実際にはフォールバック機能を実装する必要がある\n    return this\n  }\n}\n\n/**\n * デフォルトクライアントインスタンス\n */\nexport const actorV3Api = new ActorV3Client()\n\n/**\n * サンプルBehavior作成ヘルパー\n */\nexport function createSampleBehavior(name: string, description: string): Behavior {\n  return {\n    id: crypto.randomUUID(),\n    name,\n    description,\n    version: '1.0.0',\n    handler: async (message: Message, state: State) => {\n      // サンプル実装：エコー機能\n      return {\n        new_state: { ...state, last_message: message },\n        actions: [{\n          type: 'send',\n          target: message.sender,\n          message: createMessage('response', {\n            content: `Echo: ${JSON.stringify(message.payload)}`\n          })\n        }]\n      }\n    },\n    metadata: {\n      created_at: new Date().toISOString(),\n      updated_at: new Date().toISOString(),\n      author: 'system',\n      tags: ['sample', 'echo'],\n      capabilities: ['message_processing']\n    },\n    process_algebra: {\n      notation: 'CCS',\n      expression: `${name}(x) = x?.input(msg).x!output(echo(msg)).${name}(x)`,\n      channels: ['input', 'output']\n    }\n  }\n} ","/**\n * Actor v3 LangChain Chat API クライアント\n * https://api.actor.gftd.ai/v3/langchain/actor を使用したチャット機能を提供\n */\n\nexport interface ChatMessage {\n  id: string\n  role: \"user\" | \"assistant\" | \"system\"\n  content: string\n  timestamp: Date\n}\n\nexport interface LangChainActorConfig {\n  name: string\n  description?: string\n  model?: \"gpt-4o\" | \"gpt-4o-mini\" | \"gpt-4-turbo\" | \"gpt-4\" | \"gpt-3.5-turbo\"\n  temperature?: number\n  max_tokens?: number\n  system_prompt?: string\n  organization_id: string\n  openai_api_key?: string\n  max_history_length?: number\n  actor_id?: string\n}\n\nexport interface LangChainActorResponse {\n  actor_id: string\n  actor: any // ActorState\n  config: LangChainActorConfig\n  endpoints: {\n    chat: string\n    system_prompt: string\n    config_update: string\n    stats: string\n  }\n}\n\nexport interface ChatRequest {\n  message: string\n  conversation_id?: string\n  timeout?: number\n  stream?: boolean\n}\n\nexport interface ChatResponse {\n  content: string\n  usage: {\n    total_tokens: number\n    prompt_tokens: number\n    completion_tokens: number\n  }\n  model: string\n  conversation_id: string\n  execution_time_ms: number\n  timestamp: string\n}\n\n/**\n * Actor v3 LangChain Chat API クライアントクラス\n * Actor v3のLangChain統合機能を使用したチャット機能を提供\n */\nexport class ActorV3ChatClient {\n  private baseUrl: string\n  private headers: HeadersInit\n  private organizationId: string\n  private currentActorId: string | null = null\n\n  constructor(\n    baseUrl = \"https://actor.gftd.ai/api/v3\",\n    organizationId = \"actors\",\n    apiKey?: string\n  ) {\n    this.baseUrl = baseUrl.replace(/\\/$/, \"\") // 末尾のスラッシュを削除\n    this.organizationId = organizationId\n    this.headers = {\n      \"Content-Type\": \"application/json\",\n      \"Accept\": \"application/json\",\n    }\n\n    if (apiKey) {\n      this.headers[\"Authorization\"] = `Bearer ${apiKey}`\n    }\n  }\n\n  /**\n   * LangChain Actor を作成\n   * @param config LangChain Actor設定\n   * @returns LangChain Actor作成レスポンス\n   */\n  async createLangChainActor(config: Partial<LangChainActorConfig>): Promise<LangChainActorResponse> {\n    try {\n      const actorConfig: LangChainActorConfig = {\n        name: config.name || \"GFTD Chat Assistant\",\n        description: config.description || \"AI会話アシスタント\",\n        model: config.model || \"gpt-3.5-turbo\",\n        temperature: config.temperature || 0.7,\n        max_tokens: config.max_tokens || 1000,\n        system_prompt: config.system_prompt || \"あなたは親切で知識豊富なAIアシスタントです。\",\n        organization_id: this.organizationId,\n        max_history_length: config.max_history_length || 50,\n        ...config,\n      }\n\n      const response = await fetch(`${this.baseUrl}/langchain/actor`, {\n        method: \"POST\",\n        headers: this.headers,\n        body: JSON.stringify(actorConfig),\n      })\n\n      if (!response.ok) {\n        throw new Error(`LangChain Actor作成エラー: ${response.status} ${response.statusText}`)\n      }\n\n      const data = await response.json()\n      this.currentActorId = data.actor_id\n      return data as LangChainActorResponse\n    } catch (error) {\n      console.error(\"LangChain Actor作成エラー:\", error)\n      throw error\n    }\n  }\n\n  /**\n   * チャットメッセージを送信\n   * @param actorId Actor ID\n   * @param request チャットリクエスト\n   * @returns チャットレスポンス\n   */\n  async sendChatMessage(actorId: string, request: ChatRequest): Promise<ChatResponse> {\n    try {\n      const response = await fetch(`${this.baseUrl}/langchain/actor/${actorId}/chat`, {\n        method: \"POST\",\n        headers: this.headers,\n        body: JSON.stringify(request),\n      })\n\n      if (!response.ok) {\n        throw new Error(`チャットメッセージ送信エラー: ${response.status} ${response.statusText}`)\n      }\n\n      const data = await response.json()\n      return data as ChatResponse\n    } catch (error) {\n      console.error(\"チャットメッセージ送信エラー:\", error)\n      throw error\n    }\n  }\n\n  /**\n   * 現在のActorでチャット（簡易版）\n   * @param message メッセージ内容\n   * @param conversationId 会話ID（オプション）\n   * @returns チャットレスポンス\n   */\n  async chat(message: string, conversationId?: string): Promise<ChatResponse> {\n    // Actorが存在しない場合は作成\n    if (!this.currentActorId) {\n      await this.createLangChainActor({})\n    }\n\n    if (!this.currentActorId) {\n      throw new Error(\"LangChain Actorの作成に失敗しました\")\n    }\n\n    return this.sendChatMessage(this.currentActorId, {\n      message,\n      conversation_id: conversationId || \"default-conversation\",\n    })\n  }\n\n  /**\n   * システムプロンプトを更新\n   * @param actorId Actor ID\n   * @param systemPrompt 新しいシステムプロンプト\n   */\n  async updateSystemPrompt(actorId: string, systemPrompt: string): Promise<void> {\n    try {\n      const response = await fetch(`${this.baseUrl}/langchain/actor/${actorId}/system-prompt`, {\n        method: \"PUT\",\n        headers: this.headers,\n        body: JSON.stringify({ system_prompt: systemPrompt }),\n      })\n\n      if (!response.ok) {\n        throw new Error(`システムプロンプト更新エラー: ${response.status} ${response.statusText}`)\n      }\n    } catch (error) {\n      console.error(\"システムプロンプト更新エラー:\", error)\n      throw error\n    }\n  }\n\n  /**\n   * APIの健全性をチェック\n   * @returns APIが利用可能かどうか\n   */\n  async healthCheck(): Promise<boolean> {\n    try {\n      const response = await fetch(`${this.baseUrl}/actor`, {\n        method: \"GET\",\n        headers: { \"Accept\": \"application/json\" },\n        // タイムアウトを追加\n        signal: AbortSignal.timeout(5000)\n      })\n      return response.ok\n    } catch (error) {\n      // ネットワークエラーは静かに処理\n      return false\n    }\n  }\n\n  /**\n   * 現在のActor IDを取得\n   * @returns 現在のActor ID\n   */\n  getCurrentActorId(): string | null {\n    return this.currentActorId\n  }\n\n  /**\n   * Actor IDを手動設定\n   * @param actorId 設定するActor ID\n   */\n  setCurrentActorId(actorId: string): void {\n    this.currentActorId = actorId\n  }\n}\n\n/**\n * デフォルトのActor v3 Chat APIクライアントインスタンス\n */\nexport const actorV3ChatClient = new ActorV3ChatClient() ","\"use client\"\n\n/**\n * Actor v3 管理用React Hooks\n * プロセス代数とLangChain.js互換性対応\n * https://actor.gftd.ai/api/v3/actor\n */\n\nimport { useState, useEffect, useCallback } from \"react\"\nimport {\n  ActorV3Client,\n  ActorV3Runnable,\n  actorV3Api,\n  createSampleBehavior\n} from \"@/lib/api/actor-v3-client\"\nimport {\n  ActorID,\n  Message,\n  State,\n  Behavior,\n  CreateActorRequest,\n  CreateActorResponse,\n  SendMessageRequest,\n  ReceiveMessagesRequest,\n  ListActorsResponse,\n  ActorSystemConfig,\n  SystemStatsResponse,\n  ApiV3Response,\n  createMessage\n} from \"@/lib/types/actor-v3\"\n\n/**\n * Actor v3 一覧管理Hook\n */\nexport function useActorV3List(organizationId?: string) {\n  const [actors, setActors] = useState<ListActorsResponse[\"actors\"]>([])\n  const [loading, setLoading] = useState<boolean>(false)\n  const [error, setError] = useState<string | null>(null)\n  const [totalCount, setTotalCount] = useState<number>(0)\n\n  const fetchActors = useCallback(async () => {\n    setLoading(true)\n    setError(null)\n\n    try {\n      console.log('🎭 Fetching v3 actors with process algebra support:', organizationId)\n      const response = await actorV3Api.actors.list(organizationId)\n      \n      if (response.success && response.data) {\n        // 安全なデータ取得\n        const actors = response.data.actors || []\n        const totalCount = response.data.total_count || 0\n        \n        setActors(actors)\n        setTotalCount(totalCount)\n        \n        console.log('✅ v3 actors loaded:', {\n          count: actors.length,\n          total: totalCount,\n          actors: actors.map(a => ({\n            id: a?.actor_id || 'unknown',\n            name: a?.behavior_name || 'unnamed',\n            status: a?.status || 'unknown'\n          }))\n        })\n      } else {\n        setError(response.error?.message || \"Failed to fetch v3 actors\")\n        console.error('❌ v3 actors fetch failed:', response.error)\n      }\n    } catch (err) {\n      const errorMsg = err instanceof Error ? err.message : \"Unknown error\"\n      setError(errorMsg)\n      console.warn('❌ v3 actors fetch error:', err)\n    } finally {\n      setLoading(false)\n    }\n  }, [organizationId])\n\n  // APIが利用可能になったので自動実行を有効化\n  useEffect(() => {\n    fetchActors()\n  }, [fetchActors])\n\n  const refetch = useCallback(() => {\n    fetchActors()\n  }, [fetchActors])\n\n  return {\n    actors,\n    loading,\n    error,\n    totalCount,\n    refetch,\n  }\n}\n\n/**\n * Actor v3 作成Hook\n */\nexport function useActorV3Creation() {\n  const [loading, setLoading] = useState<boolean>(false)\n  const [error, setError] = useState<string | null>(null)\n\n  const createActor = useCallback(async (\n    behavior: Behavior,\n    organizationId: string,\n    initialState?: State\n  ): Promise<CreateActorResponse | null> => {\n    setLoading(true)\n    setError(null)\n\n    try {\n      console.log('🎭 Creating v3 actor with process algebra behavior:', {\n        name: behavior.name,\n        version: behavior.version,\n        processAlgebra: behavior.process_algebra,\n        capabilities: behavior.metadata.capabilities\n      })\n\n      const request: CreateActorRequest = {\n        behavior,\n        organization_id: organizationId,\n        initial_state: initialState\n      }\n\n      const response = await actorV3Api.actors.create(request)\n      \n      if (response.success && response.data) {\n        console.log('✅ v3 actor created:', {\n          actor_id: response.data.actor_id,\n          status: response.data.status,\n          timestamp: response.data.timestamp\n        })\n        return response.data\n      } else {\n        setError(response.error?.message || \"Failed to create v3 actor\")\n        console.error('❌ v3 actor creation failed:', response.error)\n        return null\n      }\n    } catch (err) {\n      const errorMsg = err instanceof Error ? err.message : \"Unknown error\"\n      setError(errorMsg)\n      console.error('❌ v3 actor creation error:', err)\n      return null\n    } finally {\n      setLoading(false)\n    }\n  }, [])\n\n  const createSampleActor = useCallback(async (\n    name: string,\n    description: string,\n    organizationId: string\n  ) => {\n    const behavior = createSampleBehavior(name, description)\n    return createActor(behavior, organizationId)\n  }, [createActor])\n\n  return {\n    createActor,\n    createSampleActor,\n    loading,\n    error,\n  }\n}\n\n/**\n * Actor v3 メッセージング Hook\n */\nexport function useActorV3Messaging(actorId: ActorID) {\n  const [loading, setLoading] = useState<boolean>(false)\n  const [error, setError] = useState<string | null>(null)\n  const [messages, setMessages] = useState<Message[]>([])\n\n  const sendMessage = useCallback(async (\n    label: string,\n    payload: Record<string, any>,\n    target?: ActorID\n  ) => {\n    setLoading(true)\n    setError(null)\n\n    try {\n      const message = createMessage(label, payload)\n      const request: SendMessageRequest = {\n        target: target || actorId,\n        message\n      }\n\n      console.log('📨 Sending v3 message:', {\n        actorId,\n        label,\n        payload,\n        target: target || actorId\n      })\n\n      const response = await actorV3Api.actors.send(actorId, request)\n      \n      if (response.success) {\n        console.log('✅ v3 message sent:', response.data)\n        return response.data\n      } else {\n        setError(response.error?.message || \"Failed to send message\")\n        console.error('❌ v3 message send failed:', response.error)\n        return null\n      }\n    } catch (err) {\n      const errorMsg = err instanceof Error ? err.message : \"Unknown error\"\n      setError(errorMsg)\n      console.error('❌ v3 message send error:', err)\n      return null\n    } finally {\n      setLoading(false)\n    }\n  }, [actorId])\n\n  const receiveMessages = useCallback(async (\n    request: ReceiveMessagesRequest = {}\n  ) => {\n    setLoading(true)\n    setError(null)\n\n    try {\n      console.log('📬 Receiving v3 messages:', { actorId, request })\n      \n      const response = await actorV3Api.actors.receive(actorId, request)\n      \n      if (response.success && response.data) {\n        const newMessages = response.data.messages\n        setMessages(prev => [...prev, ...newMessages])\n        \n        console.log('✅ v3 messages received:', {\n          count: newMessages.length,\n          behavior_results: response.data.behavior_results.length\n        })\n        \n        return response.data\n      } else {\n        setError(response.error?.message || \"Failed to receive messages\")\n        console.error('❌ v3 message receive failed:', response.error)\n        return null\n      }\n    } catch (err) {\n      const errorMsg = err instanceof Error ? err.message : \"Unknown error\"\n      setError(errorMsg)\n      console.error('❌ v3 message receive error:', err)\n      return null\n    } finally {\n      setLoading(false)\n    }\n  }, [actorId])\n\n  const clearMessages = useCallback(() => {\n    setMessages([])\n  }, [])\n\n  return {\n    sendMessage,\n    receiveMessages,\n    clearMessages,\n    messages,\n    loading,\n    error,\n  }\n}\n\n/**\n * LangChain.js互換 Actor v3 Hook\n */\nexport function useActorV3Runnable(actorId: ActorID) {\n  const [runnable] = useState(() => new ActorV3Runnable(actorId, actorV3Api))\n  const [loading, setLoading] = useState<boolean>(false)\n  const [error, setError] = useState<string | null>(null)\n\n  const invoke = useCallback(async (input: any, config?: any) => {\n    setLoading(true)\n    setError(null)\n\n    try {\n      console.log('🔄 v3 LangChain invoke:', { actorId, input })\n      const result = await runnable.invoke(input, config)\n      console.log('✅ v3 LangChain invoke result:', result)\n      return result\n    } catch (err) {\n      const errorMsg = err instanceof Error ? err.message : \"Invoke failed\"\n      setError(errorMsg)\n      console.error('❌ v3 LangChain invoke error:', err)\n      throw err\n    } finally {\n      setLoading(false)\n    }\n  }, [runnable, actorId])\n\n  const batch = useCallback(async (inputs: any[], config?: any) => {\n    setLoading(true)\n    setError(null)\n\n    try {\n      console.log('🔄 v3 LangChain batch:', { actorId, inputs })\n      const results = await runnable.batch(inputs, config)\n      console.log('✅ v3 LangChain batch results:', results)\n      return results\n    } catch (err) {\n      const errorMsg = err instanceof Error ? err.message : \"Batch failed\"\n      setError(errorMsg)\n      console.error('❌ v3 LangChain batch error:', err)\n      throw err\n    } finally {\n      setLoading(false)\n    }\n  }, [runnable, actorId])\n\n  return {\n    runnable,\n    invoke,\n    batch,\n    loading,\n    error,\n  }\n}\n\n/**\n * Actor v3 システム管理Hook\n */\nexport function useActorV3System() {\n  const [config, setConfig] = useState<ActorSystemConfig | null>(null)\n  const [stats, setStats] = useState<SystemStatsResponse | null>(null)\n  const [loading, setLoading] = useState<boolean>(false)\n  const [error, setError] = useState<string | null>(null)\n\n  const fetchConfig = useCallback(async () => {\n    setLoading(true)\n    setError(null)\n\n    try {\n      console.log('⚙️ Fetching v3 system config with process algebra analysis')\n      const response = await actorV3Api.system.getConfig()\n      \n      if (response.success && response.data) {\n        setConfig(response.data)\n        console.log('✅ v3 system config loaded:', {\n          deadlock_free: response.data.process_algebra_analysis.deadlock_free,\n          livelock_free: response.data.process_algebra_analysis.livelock_free,\n          topology_edges: response.data.communication_topology.edges.length\n        })\n      } else {\n        const errorMsg = response.error?.message || \"Failed to fetch system config\"\n        setError(errorMsg)\n        console.warn('⚠️ v3 system config fetch failed:', response.error)\n      }\n    } catch (err) {\n      const errorMsg = err instanceof Error ? err.message : \"Unknown error\"\n      setError(errorMsg)\n      console.warn('❌ v3 system config fetch error:', err)\n    } finally {\n      setLoading(false)\n    }\n  }, [])\n\n  const fetchStats = useCallback(async () => {\n    setLoading(true)\n    setError(null)\n\n    try {\n      console.log('📊 Fetching v3 system stats')\n      const response = await actorV3Api.system.getStats()\n      \n      if (response.success && response.data) {\n        setStats(response.data)\n        console.log('✅ v3 system stats loaded:', {\n          active_actors: response.data.stats.active_actors,\n          total_messages: response.data.stats.total_messages,\n          throughput: response.data.detailed_metrics.performance_metrics.throughput\n        })\n      } else {\n        const errorMsg = response.error?.message || \"Failed to fetch system stats\"\n        setError(errorMsg)\n        console.warn('⚠️ v3 system stats fetch failed:', response.error)\n      }\n    } catch (err) {\n      const errorMsg = err instanceof Error ? err.message : \"Unknown error\"\n      setError(errorMsg)\n      console.warn('❌ v3 system stats fetch error:', err)\n    } finally {\n      setLoading(false)\n    }\n  }, [])\n\n  const refreshAll = useCallback(async () => {\n    await Promise.all([fetchConfig(), fetchStats()])\n  }, [fetchConfig, fetchStats])\n\n  // 自動実行は無効化 - 必要に応じて手動でrefreshAllを呼び出す\n  // useEffect(() => {\n  //   refreshAll()\n  // }, [refreshAll])\n\n  return {\n    config,\n    stats,\n    loading,\n    error,\n    fetchConfig,\n    fetchStats,\n    refreshAll,\n  }\n}\n\n/**\n * Actor v3 ヘルスチェック Hook\n */\nexport function useActorV3Health() {\n  const [status, setStatus] = useState<'checking' | 'healthy' | 'unhealthy' | 'unknown'>('unknown')\n  const [lastChecked, setLastChecked] = useState<string | null>(null)\n  const [error, setError] = useState<string | null>(null)\n\n  const checkHealth = useCallback(async () => {\n    setStatus('checking')\n    setError(null)\n\n    try {\n      console.log('🏥 Checking v3 API health')\n      \n      // 簡単なヘルスチェック：actor一覧を取得\n      const response = await actorV3Api.actors.list()\n      \n      if (response.success) {\n        setStatus('healthy')\n        setLastChecked(new Date().toISOString())\n        console.log('✅ v3 API is healthy')\n      } else {\n        setStatus('unhealthy')\n        setError(response.error?.message || \"Health check failed\")\n        console.warn('❌ v3 API health check failed:', response.error)\n      }\n    } catch (err) {\n      setStatus('unhealthy')\n      const errorMsg = err instanceof Error ? err.message : \"Health check error\"\n      setError(errorMsg)\n      console.warn('❌ v3 API health check error:', err)\n    }\n  }, [])\n\n  // APIが利用可能になったのでヘルスチェックを有効化\n  useEffect(() => {\n    checkHealth()\n    \n    // 定期的なヘルスチェック（1分間隔）\n    const interval = setInterval(checkHealth, 60000)\n    return () => clearInterval(interval)\n  }, [checkHealth])\n\n  return {\n    status,\n    lastChecked,\n    error,\n    checkHealth,\n  }\n} ","/**\n * Actor v3 LangChain Chat API用Reactフック\n * Actor v3のLangChain統合を使用したチャット機能の状態管理とAPI呼び出しを提供\n */\n\nimport { useState, useCallback, useRef, useEffect } from \"react\"\nimport { actorV3ChatClient, type ChatMessage, type ChatRequest } from \"@/lib/api/chat-client\"\n\nexport interface UseGftdChatOptions {\n  initialMessages?: ChatMessage[]\n  model?: string\n  temperature?: number\n  maxTokens?: number\n}\n\nexport interface UseGftdChatReturn {\n  messages: ChatMessage[]\n  isLoading: boolean\n  error: string | null\n  isConnected: boolean\n  sendMessage: (content: string) => Promise<void>\n  clearMessages: () => void\n  retryLastMessage: () => Promise<void>\n  setMessages: (messages: ChatMessage[]) => void\n}\n\n/**\n * GFTD Chat APIを使用するためのカスタムフック\n * @param options チャット設定オプション\n * @returns チャット機能のインターフェース\n */\nexport function useGftdChat(options: UseGftdChatOptions = {}): UseGftdChatReturn {\n  const {\n    initialMessages = [],\n    model = \"gpt-3.5-turbo\",\n    temperature = 0.7,\n    maxTokens = 1000,\n  } = options\n\n  const [messages, setMessages] = useState<ChatMessage[]>(initialMessages)\n  const [isLoading, setIsLoading] = useState(false)\n  const [error, setError] = useState<string | null>(null)\n  const [isConnected, setIsConnected] = useState(false)\n  const lastUserMessageRef = useRef<string>(\"\")\n\n  // API接続状態を定期的にチェック\n  useEffect(() => {\n    const checkConnection = async () => {\n      try {\n        const connected = await actorV3ChatClient.healthCheck()\n        setIsConnected(connected)\n      } catch (error) {\n        setIsConnected(false)\n      }\n    }\n\n    // 初回チェック\n    checkConnection()\n\n    // 5分ごとにヘルスチェック（頻度を下げてエラーログを減らす）\n    const interval = setInterval(checkConnection, 300000)\n\n    return () => clearInterval(interval)\n  }, [])\n\n  /**\n   * ユーザーメッセージを送信してAIからの返答を取得\n   * @param content ユーザーのメッセージ内容\n   */\n  const sendMessage = useCallback(async (content: string) => {\n    if (!content.trim()) return\n    if (isLoading) return\n\n    setError(null)\n    setIsLoading(true)\n    lastUserMessageRef.current = content\n\n    // ユーザーメッセージを追加\n    const userMessage: ChatMessage = {\n      id: `user-${Date.now()}`,\n      role: \"user\",\n      content: content.trim(),\n      timestamp: new Date(),\n    }\n\n    setMessages(prevMessages => [...prevMessages, userMessage])\n\n    try {\n      // Actor v3 LangChain統合のAPI呼び出し\n      const response = await actorV3ChatClient.chat(content, \"default-conversation\")\n\n      // レスポンスの安全性確認\n      if (!response || typeof response.content !== 'string') {\n        throw new Error(\"APIから無効な応答が返されました\")\n      }\n\n      const assistantMessage: ChatMessage = {\n        id: `assistant-${Date.now()}`,\n        role: \"assistant\",\n        content: response.content,\n        timestamp: new Date(),\n      }\n\n      setMessages(prevMessages => [...prevMessages, assistantMessage])\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : \"メッセージの送信に失敗しました\"\n      setError(errorMessage)\n\n      // ネットワークエラーは静かに処理\n      if (errorMessage.includes('fetch') || errorMessage.includes('network')) {\n        console.warn(\"チャットAPI接続エラー:\", errorMessage)\n      } else {\n        console.error(\"チャットメッセージ送信エラー:\", error)\n        \n        // エラーメッセージを表示\n        const errorChatMessage: ChatMessage = {\n          id: `error-${Date.now()}`,\n          role: \"assistant\",\n          content: `❌ エラー: ${errorMessage}`,\n          timestamp: new Date(),\n        }\n\n        setMessages(prevMessages => [...prevMessages, errorChatMessage])\n      }\n    } finally {\n      setIsLoading(false)\n    }\n  }, [messages, isLoading, model, temperature, maxTokens])\n\n  /**\n   * 最後のユーザーメッセージを再送信\n   */\n  const retryLastMessage = useCallback(async () => {\n    if (lastUserMessageRef.current && !isLoading) {\n      await sendMessage(lastUserMessageRef.current)\n    }\n  }, [sendMessage, isLoading])\n\n  /**\n   * メッセージ履歴をクリア\n   */\n  const clearMessages = useCallback(() => {\n    setMessages([])\n    setError(null)\n    lastUserMessageRef.current = \"\"\n  }, [])\n\n  return {\n    messages,\n    isLoading,\n    error,\n    isConnected,\n    sendMessage,\n    clearMessages,\n    retryLastMessage,\n    setMessages,\n  }\n} ","/**\n * @file lib/config/sdk-config-manager.ts\n * @description SDK起動時のconfigファイル管理\n * @author GFTD Co., Ltd.\n */\n\nexport interface SDKConfig {\n  version: string\n  initialized: boolean\n  defaultActorId?: string\n  actors: {\n    [key: string]: {\n      id: string\n      name: string\n      type: string\n      repositoryType: 'local' | 'online'\n      repositoryPath: string\n      repositoryUrl?: string\n      gitConfig?: any\n      lastAccessed: string\n      isDefault?: boolean\n    }\n  }\n  settings: {\n    theme: 'light' | 'dark'\n    autoSave: boolean\n    showWelcome: boolean\n    defaultView: 'actors' | 'code' | 'preview'\n  }\n  created: string\n  lastModified: string\n}\n\n/**\n * デフォルトアクター設定テンプレート\n */\nexport interface DefaultActorTemplate {\n  name: string\n  description: string\n  type: string\n  repositoryType: 'local'\n  gitConfig: {\n    user: {\n      name: string\n      email: string\n    }\n    remoteUrl?: string\n    defaultBranch: string\n    autoCommit: boolean\n    autoSync: boolean\n  }\n}\n\n/**\n * 利用可能なデフォルトアクタータイプ\n */\nexport const DEFAULT_ACTOR_TEMPLATES: Record<string, DefaultActorTemplate> = {\n  'chat-assistant': {\n    name: 'Chat Assistant',\n    description: 'AI-powered chat assistant for conversations and Q&A',\n    type: 'chat-assistant',\n    repositoryType: 'local',\n    gitConfig: {\n      user: {\n        name: 'Actor SDK User',\n        email: 'user@actor-sdk.local'\n      },\n      defaultBranch: 'main',\n      autoCommit: true,\n      autoSync: false\n    }\n  },\n  'code-generator': {\n    name: 'Code Generator',\n    description: 'AI assistant specialized in code generation and programming help',\n    type: 'code-generator', \n    repositoryType: 'local',\n    gitConfig: {\n      user: {\n        name: 'Actor SDK User',\n        email: 'user@actor-sdk.local'\n      },\n      defaultBranch: 'main',\n      autoCommit: true,\n      autoSync: false\n    }\n  },\n  'document-processor': {\n    name: 'Document Processor',\n    description: 'AI assistant for document analysis and processing',\n    type: 'document-processor',\n    repositoryType: 'local',\n    gitConfig: {\n      user: {\n        name: 'Actor SDK User',\n        email: 'user@actor-sdk.local'\n      },\n      defaultBranch: 'main',\n      autoCommit: true,\n      autoSync: false\n    }\n  }\n}\n\n/**\n * デフォルトのSDK設定\n */\nexport function createDefaultSDKConfig(): SDKConfig {\n  return {\n    version: '1.0.0',\n    initialized: false,\n    actors: {},\n    settings: {\n      theme: 'light',\n      autoSave: true,\n      showWelcome: true,\n      defaultView: 'actors'\n    },\n    created: new Date().toISOString(),\n    lastModified: new Date().toISOString()\n  }\n}\n\n/**\n * SDK設定管理クラス\n */\nexport class SDKConfigManager {\n  private static readonly CONFIG_FILE_PATH = '/sdk.config.json'\n  private static readonly LOCAL_STORAGE_KEY = 'actor-sdk-config'\n\n  /**\n   * 実行環境がブラウザかチェック\n   */\n  private static isBrowser(): boolean {\n    return typeof window !== 'undefined' && typeof localStorage !== 'undefined'\n  }\n\n  /**\n   * 実行環境がNode.jsかチェック\n   */\n  private static isNode(): boolean {\n    return typeof process !== 'undefined' && \n           process.versions !== undefined && \n           process.versions.node !== undefined &&\n           typeof window === 'undefined'\n  }\n\n  /**\n   * configファイルが存在するかチェック\n   */\n  static async hasConfig(): Promise<boolean> {\n    try {\n      // ブラウザ環境では localStorage を使用\n      if (this.isBrowser()) {\n        const config = localStorage.getItem(this.LOCAL_STORAGE_KEY)\n        return config !== null\n      }\n\n      // Node.js環境では動的にfsを読み込み（サーバーサイドのみ）\n      if (this.isNode()) {\n        try {\n          const fs = await import('fs')\n          return fs.existsSync(this.CONFIG_FILE_PATH)\n        } catch (fsError) {\n          console.warn('fs module not available:', fsError)\n          return false\n        }\n      }\n\n      // どちらでもない場合（Edge case）\n      console.warn('Unknown environment, using fallback behavior')\n      return false\n    } catch (error) {\n      console.error('Failed to check config existence:', error)\n      return false\n    }\n  }\n\n  /**\n   * configファイルを読み込み\n   */\n  static async loadConfig(): Promise<SDKConfig | null> {\n    try {\n      // ブラウザ環境\n      if (this.isBrowser()) {\n        const configStr = localStorage.getItem(this.LOCAL_STORAGE_KEY)\n        if (configStr) {\n          const config = JSON.parse(configStr)\n          return this.validateAndMigrateConfig(config)\n        }\n        return null\n      }\n\n      // Node.js環境\n      if (this.isNode()) {\n        try {\n          const fs = await import('fs')\n          if (fs.existsSync(this.CONFIG_FILE_PATH)) {\n            const configStr = fs.readFileSync(this.CONFIG_FILE_PATH, 'utf8')\n            const config = JSON.parse(configStr)\n            return this.validateAndMigrateConfig(config)\n          }\n        } catch (fsError) {\n          console.warn('fs module not available:', fsError)\n          return null\n        }\n      }\n\n      return null\n    } catch (error) {\n      console.error('Failed to load config:', error)\n      return null\n    }\n  }\n\n  /**\n   * configファイルを保存\n   */\n  static async saveConfig(config: SDKConfig): Promise<boolean> {\n    try {\n      config.lastModified = new Date().toISOString()\n      const configStr = JSON.stringify(config, null, 2)\n\n      // ブラウザ環境\n      if (this.isBrowser()) {\n        localStorage.setItem(this.LOCAL_STORAGE_KEY, configStr)\n        return true\n      }\n\n      // Node.js環境\n      if (this.isNode()) {\n        try {\n          const fs = await import('fs')\n          fs.writeFileSync(this.CONFIG_FILE_PATH, configStr)\n          return true\n        } catch (fsError) {\n          console.warn('fs module not available:', fsError)\n          return false\n        }\n      }\n\n      return false\n    } catch (error) {\n      console.error('Failed to save config:', error)\n      return false\n    }\n  }\n\n  /**\n   * configにアクターを追加\n   */\n  static async addActor(actorData: {\n    id: string\n    name: string\n    type: string\n    repositoryType: 'local' | 'online'\n    repositoryPath: string\n    repositoryUrl?: string\n    gitConfig?: any\n  }): Promise<boolean> {\n    try {\n      let config = await this.loadConfig()\n      if (!config) {\n        config = createDefaultSDKConfig()\n      }\n\n      config.actors[actorData.id] = {\n        ...actorData,\n        lastAccessed: new Date().toISOString(),\n        isDefault: Object.keys(config.actors).length === 0 // 最初のアクターをデフォルトに\n      }\n\n      if (!config.defaultActorId && Object.keys(config.actors).length === 1) {\n        config.defaultActorId = actorData.id\n      }\n\n      config.initialized = true\n      return await this.saveConfig(config)\n    } catch (error) {\n      console.error('Failed to add actor to config:', error)\n      return false\n    }\n  }\n\n  /**\n   * デフォルトアクターを設定\n   */\n  static async setDefaultActor(actorId: string): Promise<boolean> {\n    try {\n      const config = await this.loadConfig()\n      if (!config || !config.actors[actorId]) {\n        return false\n      }\n\n      // 既存のデフォルトを解除\n      Object.values(config.actors).forEach(actor => {\n        actor.isDefault = false\n      })\n\n      // 新しいデフォルトを設定\n      config.actors[actorId].isDefault = true\n      config.defaultActorId = actorId\n\n      return await this.saveConfig(config)\n    } catch (error) {\n      console.error('Failed to set default actor:', error)\n      return false\n    }\n  }\n\n  /**\n   * アクターのアクセス時刻を更新\n   */\n  static async updateActorAccess(actorId: string): Promise<boolean> {\n    try {\n      const config = await this.loadConfig()\n      if (!config || !config.actors[actorId]) {\n        return false\n      }\n\n      config.actors[actorId].lastAccessed = new Date().toISOString()\n      return await this.saveConfig(config)\n    } catch (error) {\n      console.error('Failed to update actor access:', error)\n      return false\n    }\n  }\n\n  /**\n   * 設定を更新\n   */\n  static async updateSettings(settings: Partial<SDKConfig['settings']>): Promise<boolean> {\n    try {\n      let config = await this.loadConfig()\n      if (!config) {\n        config = createDefaultSDKConfig()\n      }\n\n      config.settings = { ...config.settings, ...settings }\n      return await this.saveConfig(config)\n    } catch (error) {\n      console.error('Failed to update settings:', error)\n      return false\n    }\n  }\n\n  /**\n   * configを初期化済みにマーク\n   */\n  static async markAsInitialized(): Promise<boolean> {\n    try {\n      let config = await this.loadConfig()\n      if (!config) {\n        config = createDefaultSDKConfig()\n      }\n\n      config.initialized = true\n      config.settings.showWelcome = false\n      return await this.saveConfig(config)\n    } catch (error) {\n      console.error('Failed to mark as initialized:', error)\n      return false\n    }\n  }\n\n  /**\n   * configを検証・マイグレーション\n   */\n  private static validateAndMigrateConfig(config: any): SDKConfig {\n    const defaultConfig = createDefaultSDKConfig()\n\n    // 基本的な検証とデフォルト値の補完\n    const validatedConfig: SDKConfig = {\n      version: config.version || defaultConfig.version,\n      initialized: Boolean(config.initialized),\n      defaultActorId: config.defaultActorId,\n      actors: config.actors || {},\n      settings: {\n        theme: config.settings?.theme || defaultConfig.settings.theme,\n        autoSave: config.settings?.autoSave !== undefined ? config.settings.autoSave : defaultConfig.settings.autoSave,\n        showWelcome: config.settings?.showWelcome !== undefined ? config.settings.showWelcome : defaultConfig.settings.showWelcome,\n        defaultView: config.settings?.defaultView || defaultConfig.settings.defaultView\n      },\n      created: config.created || defaultConfig.created,\n      lastModified: config.lastModified || defaultConfig.lastModified\n    }\n\n    return validatedConfig\n  }\n\n  /**\n   * configをリセット（開発用）\n   */\n  static async resetConfig(): Promise<boolean> {\n    try {\n      // ブラウザ環境\n      if (this.isBrowser()) {\n        localStorage.removeItem(this.LOCAL_STORAGE_KEY)\n        return true\n      }\n\n      // Node.js環境\n      if (this.isNode()) {\n        try {\n          const fs = await import('fs')\n          if (fs.existsSync(this.CONFIG_FILE_PATH)) {\n            fs.unlinkSync(this.CONFIG_FILE_PATH)\n          }\n          return true\n        } catch (fsError) {\n          console.warn('fs module not available:', fsError)\n          return false\n        }\n      }\n\n      return false\n    } catch (error) {\n      console.error('Failed to reset config:', error)\n      return false\n    }\n  }\n\n  /**\n   * デバッグ情報を出力（ブラウザのコンソールに表示）\n   */\n  static async debugConfig(): Promise<void> {\n    try {\n      const config = await this.loadConfig()\n      console.group('🔧 Actor SDK Configuration Debug')\n      console.log('Config exists:', config !== null)\n      console.log('Environment:', this.isBrowser() ? 'Browser' : this.isNode() ? 'Node.js' : 'Unknown')\n      console.log('Storage method:', this.isBrowser() ? 'localStorage' : 'File System')\n      \n      if (config) {\n        console.log('Configuration:', config)\n        console.log('Actors count:', Object.keys(config.actors).length)\n        console.log('Default actor:', config.defaultActorId)\n        console.log('Initialized:', config.initialized)\n      } else {\n        console.log('No configuration found')\n      }\n      console.groupEnd()\n    } catch (error) {\n      console.error('Failed to debug config:', error)\n    }\n  }\n\n  /**\n   * デフォルトアクターを作成\n   */\n  static async createDefaultActor(template: keyof typeof DEFAULT_ACTOR_TEMPLATES = 'chat-assistant'): Promise<{ success: boolean; actorId?: string; error?: string }> {\n    try {\n      const actorTemplate = DEFAULT_ACTOR_TEMPLATES[template]\n      if (!actorTemplate) {\n        return { success: false, error: `Unknown template: ${template}` }\n      }\n\n      // UUIDライクなIDを生成\n      const actorId = `${template}-${Math.random().toString(36).substring(2, 15)}`\n      const timestamp = new Date().toISOString()\n\n      // リポジトリパスを生成\n      const repositoryPath = `/actors/${actorId}`\n\n      // configを読み込みまたは作成\n      let config = await this.loadConfig()\n      if (!config) {\n        config = createDefaultSDKConfig()\n      }\n\n      // デフォルトアクターを追加\n      config.actors[actorId] = {\n        id: actorId,\n        name: actorTemplate.name,\n        type: actorTemplate.type,\n        repositoryType: actorTemplate.repositoryType,\n        repositoryPath: repositoryPath,\n        gitConfig: actorTemplate.gitConfig,\n        lastAccessed: timestamp,\n        isDefault: true\n      }\n\n      // デフォルトアクターとして設定\n      config.defaultActorId = actorId\n      config.lastModified = timestamp\n\n      // 設定を保存\n      const saved = await this.saveConfig(config)\n      if (!saved) {\n        return { success: false, error: 'Failed to save configuration' }\n      }\n\n      console.log(`✅ Default actor created: ${actorTemplate.name} (${actorId})`)\n      return { success: true, actorId }\n    } catch (error) {\n      console.error('Failed to create default actor:', error)\n      return { success: false, error: error instanceof Error ? error.message : 'Unknown error' }\n    }\n  }\n\n  /**\n   * 初期セットアップ - デフォルトアクターと設定を作成\n   */\n  static async performInitialSetup(actorTemplate: keyof typeof DEFAULT_ACTOR_TEMPLATES = 'chat-assistant'): Promise<{ success: boolean; config?: SDKConfig; error?: string }> {\n    try {\n      console.log('🚀 Starting initial Actor SDK setup...')\n\n      // デフォルトアクターを作成\n      const actorResult = await this.createDefaultActor(actorTemplate)\n      if (!actorResult.success) {\n        return { success: false, error: actorResult.error }\n      }\n\n      // 初期化完了をマーク\n      const marked = await this.markAsInitialized()\n      if (!marked) {\n        return { success: false, error: 'Failed to mark as initialized' }\n      }\n\n      // 最新の設定を取得\n      const config = await this.loadConfig()\n      if (!config) {\n        return { success: false, error: 'Failed to load configuration after setup' }\n      }\n\n      console.log('✅ Initial setup completed successfully!')\n      return { success: true, config }\n    } catch (error) {\n      console.error('Failed to perform initial setup:', error)\n      return { success: false, error: error instanceof Error ? error.message : 'Unknown error' }\n    }\n  }\n\n  /**\n   * 利用可能なデフォルトアクタータイプのリストを取得\n   */\n  static getAvailableTemplates(): Array<{ key: string; template: DefaultActorTemplate }> {\n    return Object.entries(DEFAULT_ACTOR_TEMPLATES).map(([key, template]) => ({\n      key,\n      template\n    }))\n  }\n} ","/**\n * @file lib/git/gitlab-client.ts\n * @description GitLab API クライアント\n * @author GFTD Co., Ltd.\n */\n\nimport { Gitlab } from '@gitbeaker/browser';\n\n/**\n * GitLab設定インターフェース\n */\nexport interface GitLabConfig {\n  /** GitLabのURL */\n  url: string;\n  /** Personal Access Token */\n  token: string;\n  /** デフォルトプロジェクトの可視性 */\n  defaultVisibility?: 'private' | 'internal' | 'public';\n}\n\n/**\n * プロジェクト作成設定\n */\nexport interface CreateProjectConfig {\n  /** プロジェクト名 */\n  name: string;\n  /** 説明 */\n  description?: string;\n  /** 可視性 */\n  visibility?: 'private' | 'internal' | 'public';\n  /** 初期化設定 */\n  initialize_with_readme?: boolean;\n  /** デフォルトブランチ */\n  default_branch?: string;\n}\n\n/**\n * ブランチ作成設定\n */\nexport interface CreateBranchConfig {\n  /** ブランチ名 */\n  name: string;\n  /** 基点となるブランチまたはコミット */\n  ref: string;\n}\n\n/**\n * GitLab APIクライアント\n */\nexport class GitLabClient {\n  private client: InstanceType<typeof Gitlab>;\n  private config: GitLabConfig;\n\n  constructor(config: GitLabConfig) {\n    this.config = config;\n    this.client = new Gitlab({\n      host: config.url,\n      token: config.token,\n    });\n  }\n\n  /**\n   * 新しいプロジェクト（Actor）を作成\n   * @param config プロジェクト作成設定\n   * @returns プロジェクト情報\n   */\n  async createActor(config: CreateProjectConfig) {\n    try {\n      const project = await this.client.Projects.create({\n        name: config.name,\n        description: config.description || `Actor: ${config.name}`,\n        visibility: config.visibility || this.config.defaultVisibility || 'private',\n        initialize_with_readme: config.initialize_with_readme ?? true,\n        default_branch: config.default_branch || 'main',\n      });\n\n      return {\n        id: project.id,\n        name: project.name,\n        description: project.description,\n        clone_url: project.http_url_to_repo,\n        ssh_url: project.ssh_url_to_repo,\n        web_url: project.web_url,\n        default_branch: project.default_branch,\n        created_at: project.created_at,\n      };\n    } catch (error) {\n      console.error('Failed to create actor project:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * プロジェクトを取得\n   * @param projectId プロジェクトID\n   * @returns プロジェクト情報\n   */\n  async getActor(projectId: number | string) {\n    try {\n      const project = await this.client.Projects.show(projectId);\n      \n      return {\n        id: project.id,\n        name: project.name,\n        description: project.description,\n        clone_url: project.http_url_to_repo,\n        ssh_url: project.ssh_url_to_repo,\n        web_url: project.web_url,\n        default_branch: project.default_branch,\n        created_at: project.created_at,\n        updated_at: project.last_activity_at,\n      };\n    } catch (error) {\n      console.error('Failed to get actor project:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 新しいブランチ（Session）を作成\n   * 概念: new session -> new_branch\n   * @param projectId プロジェクトID\n   * @param config ブランチ作成設定\n   * @returns ブランチ情報\n   */\n  async createSession(projectId: number | string, config: CreateBranchConfig) {\n    try {\n      const branch = await this.client.Branches.create(projectId, config.name, config.ref);\n\n      return {\n        name: branch.name,\n        commit: {\n          id: branch.commit.id,\n          message: branch.commit.message,\n          author_name: branch.commit.author_name,\n          author_email: branch.commit.author_email,\n          created_at: branch.commit.created_at,\n        },\n        protected: branch.protected,\n        can_push: branch.can_push,\n        web_url: branch.web_url,\n      };\n    } catch (error) {\n      console.error('Failed to create session branch:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ブランチ（Session）を取得\n   * 概念: session = Git branch\n   * @param projectId プロジェクトID\n   * @param branchName ブランチ名（Session ID）\n   * @returns ブランチ情報\n   */\n  async getSession(projectId: number | string, branchName: string) {\n    try {\n      const branch = await this.client.Branches.show(projectId, branchName);\n      \n      return {\n        name: branch.name,\n        commit: {\n          id: branch.commit.id,\n          message: branch.commit.message,\n          author_name: branch.commit.author_name,\n          author_email: branch.commit.author_email,\n          created_at: branch.commit.created_at,\n        },\n        protected: branch.protected,\n        can_push: branch.can_push,\n        web_url: branch.web_url,\n      };\n    } catch (error) {\n      console.error('Failed to get session branch:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * プロジェクトの全ブランチ（Sessions）を取得\n   * 概念: sessions = Git branches\n   * @param projectId プロジェクトID\n   * @returns ブランチ一覧（Session一覧）\n   */\n  async listSessions(projectId: number | string) {\n    try {\n      const branches = await this.client.Branches.all(projectId);\n      \n      return branches.map(branch => ({\n        name: branch.name,\n        commit: {\n          id: branch.commit.id,\n          message: branch.commit.message,\n          author_name: branch.commit.author_name,\n          author_email: branch.commit.author_email,\n          created_at: branch.commit.created_at,\n        },\n        protected: branch.protected,\n        can_push: branch.can_push,\n        web_url: branch.web_url,\n      }));\n    } catch (error) {\n      console.error('Failed to list session branches:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ブランチを削除\n   * @param projectId プロジェクトID\n   * @param branchName ブランチ名\n   */\n  async deleteSession(projectId: number | string, branchName: string) {\n    try {\n      await this.client.Branches.remove(projectId, branchName);\n      return true;\n    } catch (error) {\n      console.error('Failed to delete session branch:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * プロジェクトを削除\n   * @param projectId プロジェクトID\n   */\n  async deleteActor(projectId: number | string) {\n    try {\n      await this.client.Projects.remove(projectId);\n      return true;\n    } catch (error) {\n      console.error('Failed to delete actor project:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルを作成または更新\n   * @param projectId プロジェクトID\n   * @param filePath ファイルパス\n   * @param content ファイル内容\n   * @param commitMessage コミットメッセージ\n   * @param branch ブランチ名\n   */\n  async createOrUpdateFile(\n    projectId: number | string,\n    filePath: string,\n    content: string,\n    commitMessage: string,\n    branch: string = 'main'\n  ): Promise<any> {\n    try {\n      // ファイルが存在するかチェック\n      let fileExists = false;\n      try {\n        await this.client.RepositoryFiles.show(projectId, filePath, branch);\n        fileExists = true;\n      } catch (error) {\n        // ファイルが存在しない場合\n        fileExists = false;\n      }\n\n      if (fileExists) {\n        // ファイルを更新\n        return await this.client.RepositoryFiles.edit(projectId, filePath, branch, content, commitMessage);\n      } else {\n        // ファイルを作成\n        return await this.client.RepositoryFiles.create(projectId, filePath, branch, content, commitMessage);\n      }\n    } catch (error) {\n      console.error('Failed to create or update file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルを取得\n   * @param projectId プロジェクトID\n   * @param filePath ファイルパス\n   * @param branch ブランチ名\n   */\n  async getFile(\n    projectId: number | string,\n    filePath: string,\n    branch: string = 'main'\n  ): Promise<any> {\n    try {\n      const file = await this.client.RepositoryFiles.show(projectId, filePath, branch);\n      \n      // Base64でエンコードされている場合はデコード\n      const content = file.encoding === 'base64' \n        ? atob(file.content)\n        : file.content;\n\n      return {\n        file_name: file.file_name,\n        file_path: file.file_path,\n        size: file.size,\n        encoding: file.encoding,\n        content,\n        content_sha256: file.content_sha256,\n        ref: file.ref,\n        blob_id: file.blob_id,\n        commit_id: file.commit_id,\n        last_commit_id: file.last_commit_id,\n      };\n    } catch (error) {\n      console.error('Failed to get file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルを削除\n   * @param projectId プロジェクトID\n   * @param filePath ファイルパス\n   * @param commitMessage コミットメッセージ\n   * @param branch ブランチ名\n   */\n  async deleteFile(\n    projectId: number | string,\n    filePath: string,\n    commitMessage: string,\n    branch: string = 'main'\n  ): Promise<any> {\n    try {\n      return await this.client.RepositoryFiles.remove(projectId, filePath, branch, commitMessage);\n    } catch (error) {\n      console.error('Failed to delete file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * リポジトリのファイル一覧を取得\n   * @param projectId プロジェクトID\n   * @param path パス（オプション）\n   * @param branch ブランチ名\n   */\n  async listFiles(\n    projectId: number | string,\n    path: string = '',\n    branch: string = 'main'\n  ): Promise<any[]> {\n    try {\n      const tree = await this.client.Repositories.tree(projectId, {\n        path,\n        ref: branch,\n        recursive: true,\n      });\n\n      return tree.map(item => ({\n        id: item.id,\n        name: item.name,\n        type: item.type,\n        path: item.path,\n        mode: item.mode,\n      }));\n    } catch (error) {\n      console.error('Failed to list files:', error);\n      throw error;\n    }\n  }\n}\n\nexport default GitLabClient; ","/**\n * @file lib/git/git-embedding-sdk.ts\n * @description Git対応のEmbeddingSDK\n * @author GFTD Co., Ltd.\n */\n\nimport { HuggingFaceTransformersEmbeddings } from '@langchain/community/embeddings/hf_transformers';\nimport { Document } from '@langchain/core/documents';\nimport { GitFileSystem, GitConfig } from './git-fs';\nimport { GitVectorStore, GitSearchResult } from './git-vector-store';\n\n/**\n * Git対応Embedding設定インターフェース\n */\nexport interface GitEmbeddingConfig {\n  /** Git設定 */\n  git: GitConfig;\n  /** モデル名 (デフォルト: 'Xenova/all-MiniLM-L6-v2') */\n  modelName?: string;\n  /** ベクトル次元数 */\n  dimensions?: number;\n}\n\n/**\n * Git対応EmbeddingSDKクラス\n * HuggingFaceTransformersEmbeddingsとGitを使用してテキストをベクトル化し、\n * Gitリポジトリで管理\n */\nexport class GitEmbeddingSDK {\n  private embeddings: HuggingFaceTransformersEmbeddings;\n  private gitFs: GitFileSystem;\n  private vectorStore: GitVectorStore;\n  private config: GitEmbeddingConfig;\n  private isInitialized = false;\n\n  constructor(config: GitEmbeddingConfig) {\n    this.config = config;\n\n    // HuggingFaceTransformersEmbeddingsの初期化\n    this.embeddings = new HuggingFaceTransformersEmbeddings({\n      modelName: config.modelName || 'Xenova/all-MiniLM-L6-v2',\n    });\n\n    // GitFileSystemの初期化\n    this.gitFs = new GitFileSystem(config.git);\n    \n    // GitVectorStoreの初期化\n    this.vectorStore = new GitVectorStore(this.gitFs, config.dimensions || 384);\n  }\n\n  /**\n   * SDKの初期化\n   */\n  async initialize(): Promise<void> {\n    if (this.isInitialized) {\n      return;\n    }\n\n    try {\n      // GitVectorStoreの初期化（GitFileSystemも含む）\n      await this.vectorStore.initialize();\n\n      this.isInitialized = true;\n    } catch (error) {\n      console.error('Failed to initialize GitEmbeddingSDK:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * テキストをembeddingに変換\n   * @param text テキスト\n   * @returns embedding vector\n   */\n  async embedText(text: string): Promise<number[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const vectors = await this.embeddings.embedQuery(text);\n      return vectors;\n    } catch (error) {\n      console.error('Failed to embed text:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 複数のテキストをembeddingに変換\n   * @param texts テキスト配列\n   * @returns embedding vectors\n   */\n  async embedTexts(texts: string[]): Promise<number[][]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const vectors = await this.embeddings.embedDocuments(texts);\n      return vectors;\n    } catch (error) {\n      console.error('Failed to embed texts:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ドキュメントをembeddingに変換してVectorStoreに追加\n   * @param documents ドキュメント配列\n   * @returns 追加されたドキュメントのID配列\n   */\n  async addDocuments(documents: Document[]): Promise<string[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const texts = documents.map(doc => doc.pageContent);\n      const vectors = await this.embedTexts(texts);\n      \n      const ids: string[] = [];\n      \n      for (let i = 0; i < documents.length; i++) {\n        const id = await this.vectorStore.add(vectors[i], documents[i]);\n        ids.push(id);\n      }\n\n      return ids;\n    } catch (error) {\n      console.error('Failed to add documents:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 類似検索\n   * @param query 検索クエリ\n   * @param k 返す結果数\n   * @returns 類似ドキュメント配列\n   */\n  async search(query: string, k: number = 5): Promise<{ document: Document; score: number; id: string; commitSha?: string }[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const queryVector = await this.embedText(query);\n      const results = await this.vectorStore.search(queryVector, k);\n      \n      return results.map((result: GitSearchResult) => ({\n        document: result.document,\n        score: result.score,\n        id: result.id,\n        commitSha: result.commitSha,\n      }));\n    } catch (error) {\n      console.error('Failed to search:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 新しいセッション（ブランチ）を作成\n   * @param sessionName セッション名\n   * @param baseBranch 基点となるブランチ（デフォルト: 現在のブランチ）\n   */\n  async createSession(sessionName: string, baseBranch?: string): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      // 現在のブランチを基点として新しいブランチを作成\n      const currentBranch = baseBranch || this.vectorStore.getCurrentBranch();\n      await this.vectorStore.switchBranch(sessionName, true);\n      \n      console.log(`Created new session: ${sessionName} from ${currentBranch}`);\n    } catch (error) {\n      console.error('Failed to create session:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * セッション（ブランチ）を切り替え\n   * @param sessionName セッション名\n   */\n  async switchSession(sessionName: string): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await this.vectorStore.switchBranch(sessionName, false);\n      console.log(`Switched to session: ${sessionName}`);\n    } catch (error) {\n      console.error('Failed to switch session:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 現在のセッション（ブランチ）を取得\n   */\n  getCurrentSession(): string {\n    return this.vectorStore.getCurrentBranch();\n  }\n\n  /**\n   * セッション（ブランチ）一覧を取得\n   */\n  async listSessions(): Promise<string[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    return this.vectorStore.listBranches();\n  }\n\n  /**\n   * リモートにプッシュ\n   */\n  async push(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await this.vectorStore.push();\n      console.log('Pushed to remote repository');\n    } catch (error) {\n      console.error('Failed to push:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * リモートからプル\n   */\n  async pull(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await this.vectorStore.pull();\n      console.log('Pulled from remote repository');\n    } catch (error) {\n      console.error('Failed to pull:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルをGitリポジトリに保存\n   * @param filePath ファイルパス\n   * @param content ファイル内容\n   * @param commitMessage コミットメッセージ\n   */\n  async saveFile(filePath: string, content: string, commitMessage?: string): Promise<string> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await this.gitFs.writeFile(filePath, content);\n      \n      const message = commitMessage || `Save file: ${filePath}`;\n      const commitSha = await this.gitFs.commit(message, [filePath]);\n      \n      return commitSha;\n    } catch (error) {\n      console.error('Failed to save file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルをGitリポジトリから読み込み\n   * @param filePath ファイルパス\n   * @returns ファイル内容\n   */\n  async loadFile(filePath: string): Promise<string> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      return await this.gitFs.readFile(filePath);\n    } catch (error) {\n      console.error('Failed to load file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルが存在するかチェック\n   * @param filePath ファイルパス\n   */\n  async fileExists(filePath: string): Promise<boolean> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    return this.gitFs.exists(filePath);\n  }\n\n  /**\n   * ディレクトリの内容を一覧取得\n   * @param dirPath ディレクトリパス\n   */\n  async listFiles(dirPath: string = ''): Promise<string[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    return this.gitFs.readDir(dirPath);\n  }\n\n  /**\n   * インデックスサイズを取得\n   */\n  async getIndexSize(): Promise<number> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    return this.vectorStore.size();\n  }\n\n  /**\n   * コミット履歴を取得\n   * @param depth 取得する履歴の深さ\n   */\n  async getCommitHistory(depth: number = 10): Promise<any[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    return this.vectorStore.getCommitHistory(depth);\n  }\n\n  /**\n   * Gitリポジトリの状態を取得\n   */\n  async getStatus(): Promise<any[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    return this.gitFs.getStatus();\n  }\n\n  /**\n   * 構造化データをJSONとして保存\n   * @param filePath ファイルパス\n   * @param data データオブジェクト\n   * @param commitMessage コミットメッセージ\n   */\n  async saveJSON(filePath: string, data: any, commitMessage?: string): Promise<string> {\n    const content = JSON.stringify(data, null, 2);\n    return this.saveFile(filePath, content, commitMessage);\n  }\n\n  /**\n   * JSONファイルを読み込み\n   * @param filePath ファイルパス\n   * @returns パースされたデータ\n   */\n  async loadJSON(filePath: string): Promise<any> {\n    const content = await this.loadFile(filePath);\n    return JSON.parse(content);\n  }\n\n  /**\n   * セッション設定を保存\n   * @param config セッション設定\n   */\n  async saveSessionConfig(config: any): Promise<string> {\n    const sessionName = this.getCurrentSession();\n    const filePath = `session-configs/${sessionName}.json`;\n    \n    return this.saveJSON(filePath, {\n      sessionName,\n      config,\n      timestamp: new Date().toISOString(),\n    }, `Save session config for ${sessionName}`);\n  }\n\n  /**\n   * セッション設定を読み込み\n   * @param sessionName セッション名（省略時は現在のセッション）\n   */\n  async loadSessionConfig(sessionName?: string): Promise<any> {\n    const session = sessionName || this.getCurrentSession();\n    const filePath = `session-configs/${session}.json`;\n    \n    try {\n      return await this.loadJSON(filePath);\n    } catch (error) {\n      console.warn('Session config not found:', filePath);\n      return null;\n    }\n  }\n\n  /**\n   * ベクトルストアを直接取得（高度な操作用）\n   */\n  getVectorStore(): GitVectorStore {\n    return this.vectorStore;\n  }\n\n  /**\n   * GitFileSystemを直接取得（高度な操作用）\n   */\n  getGitFileSystem(): GitFileSystem {\n    return this.gitFs;\n  }\n\n  /**\n   * リソースのクリーンアップ\n   */\n  async cleanup(): Promise<void> {\n    try {\n      await this.vectorStore.cleanup();\n      this.isInitialized = false;\n    } catch (error) {\n      console.error('Failed to cleanup GitEmbeddingSDK:', error);\n      throw error;\n    }\n  }\n}\n\nexport default GitEmbeddingSDK; ","/**\n * @file lib/git/git-fs.ts\n * @description isomorphic-gitを使用したGitファイルシステム\n * @author GFTD Co., Ltd.\n */\n\nimport git from 'isomorphic-git';\nimport http from 'isomorphic-git/http/web';\nconst LightningFS = require('@isomorphic-git/lightning-fs');\n\n/**\n * Git設定インターフェース\n */\nexport interface GitConfig {\n  /** リポジトリURL */\n  url: string;\n  /** Personal Access Token */\n  token: string;\n  /** 作成者情報 */\n  author: {\n    name: string;\n    email: string;\n  };\n  /** ブランチ名 */\n  branch?: string;\n  /** ローカルディレクトリ名 */\n  dir?: string;\n}\n\n/**\n * GitFileSystemクラス\n * isomorphic-gitを使用してGitリポジトリをファイルシステムとして操作\n */\nexport class GitFileSystem {\n  private fs: any;\n  private config: GitConfig;\n  private dir: string;\n  private currentBranch: string;\n  private isInitialized = false;\n\n  constructor(config: GitConfig) {\n    this.config = config;\n    this.dir = config.dir || '/repo';\n    this.currentBranch = config.branch || 'main';\n    \n    // MemoryFSBackendを使用して、ブラウザ環境でも動作するように\n    this.fs = new LightningFS('git-fs', {\n      wipe: true // 初期化時にクリア\n    });\n  }\n\n  /**\n   * ディレクトリを再帰的に作成\n   */\n  private async ensureDir(dirPath: string): Promise<void> {\n    try {\n      await this.fs.promises.mkdir(dirPath);\n    } catch (error: any) {\n      if (error.code === 'ENOENT') {\n        // 親ディレクトリが存在しない場合、親から作成\n        const parentDir = dirPath.substring(0, dirPath.lastIndexOf('/'));\n        if (parentDir && parentDir !== dirPath) {\n          await this.ensureDir(parentDir);\n          await this.fs.promises.mkdir(dirPath);\n        }\n      } else if (error.code !== 'EEXIST') {\n        // EEXIST以外のエラーは再スロー\n        throw error;\n      }\n    }\n  }\n\n  /**\n   * リポジトリを初期化またはクローン\n   */\n  async initialize(): Promise<void> {\n    if (this.isInitialized) {\n      return;\n    }\n\n    try {\n      // ディレクトリを作成\n      await this.ensureDir(this.dir);\n\n      // リポジトリをクローンまたは初期化\n      try {\n        await this.clone();\n      } catch (error) {\n        console.warn('Clone failed, initializing new repository:', error);\n        await this.init();\n      }\n\n      this.isInitialized = true;\n    } catch (error) {\n      console.error('Failed to initialize GitFileSystem:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * リポジトリをクローン\n   */\n  private async clone(): Promise<void> {\n    await git.clone({\n      fs: this.fs,\n      http,\n      dir: this.dir,\n      url: this.config.url,\n      onAuth: () => ({\n        username: 'oauth2',\n        password: this.config.token,\n      }),\n      ref: this.currentBranch,\n      singleBranch: false,\n      depth: 1,\n    });\n  }\n\n  /**\n   * 新しいリポジトリを初期化\n   */\n  private async init(): Promise<void> {\n    await git.init({\n      fs: this.fs,\n      dir: this.dir,\n      defaultBranch: this.currentBranch,\n    });\n\n    // リモートを追加\n    await git.addRemote({\n      fs: this.fs,\n      dir: this.dir,\n      remote: 'origin',\n      url: this.config.url,\n    });\n  }\n\n  /**\n   * ブランチを切り替え\n   * @param branchName ブランチ名\n   * @param createIfNotExists 存在しない場合は作成\n   */\n  async switchBranch(branchName: string, createIfNotExists: boolean = false): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      // ブランチが存在するかチェック\n      const branches = await git.listBranches({\n        fs: this.fs,\n        dir: this.dir,\n      });\n\n      if (!branches.includes(branchName)) {\n        if (createIfNotExists) {\n          // 新しいブランチを作成\n          await git.branch({\n            fs: this.fs,\n            dir: this.dir,\n            ref: branchName,\n          });\n        } else {\n          throw new Error(`Branch \"${branchName}\" does not exist`);\n        }\n      }\n\n      // ブランチをチェックアウト\n      await git.checkout({\n        fs: this.fs,\n        dir: this.dir,\n        ref: branchName,\n      });\n\n      this.currentBranch = branchName;\n    } catch (error) {\n      console.error('Failed to switch branch:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルを書き込み\n   * @param filePath ファイルパス\n   * @param content ファイル内容\n   */\n  async writeFile(filePath: string, content: string): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const fullPath = `${this.dir}/${filePath}`;\n      \n      // ディレクトリを作成（必要に応じて）\n      const dirname = fullPath.substring(0, fullPath.lastIndexOf('/'));\n      await this.ensureDir(dirname);\n\n      // ファイルを書き込み\n      await this.fs.promises.writeFile(fullPath, content, 'utf8');\n    } catch (error) {\n      console.error('Failed to write file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルを読み込み\n   * @param filePath ファイルパス\n   * @returns ファイル内容\n   */\n  async readFile(filePath: string): Promise<string> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const fullPath = `${this.dir}/${filePath}`;\n      const content = await this.fs.promises.readFile(fullPath, 'utf8');\n      return content;\n    } catch (error) {\n      console.error('Failed to read file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルを削除\n   * @param filePath ファイルパス\n   */\n  async deleteFile(filePath: string): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const fullPath = `${this.dir}/${filePath}`;\n      await this.fs.promises.unlink(fullPath);\n    } catch (error) {\n      console.error('Failed to delete file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ディレクトリの内容を一覧取得\n   * @param dirPath ディレクトリパス\n   * @returns ファイル・ディレクトリ一覧\n   */\n  async readDir(dirPath: string = ''): Promise<string[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const fullPath = dirPath ? `${this.dir}/${dirPath}` : this.dir;\n      const entries = await this.fs.promises.readdir(fullPath);\n      \n      // .gitディレクトリを除外\n      return entries.filter((entry: string) => entry !== '.git');\n    } catch (error) {\n      console.error('Failed to read directory:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルが存在するかチェック\n   * @param filePath ファイルパス\n   * @returns 存在するかどうか\n   */\n  async exists(filePath: string): Promise<boolean> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const fullPath = `${this.dir}/${filePath}`;\n      await this.fs.promises.stat(fullPath);\n      return true;\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * 変更をコミット\n   * @param message コミットメッセージ\n   * @param filePaths コミットするファイルパス（空の場合は全て）\n   */\n  async commit(message: string, filePaths?: string[]): Promise<string> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      // ファイルをステージング\n      if (filePaths && filePaths.length > 0) {\n        for (const filePath of filePaths) {\n          await git.add({\n            fs: this.fs,\n            dir: this.dir,\n            filepath: filePath,\n          });\n        }\n      } else {\n        // 全ファイルを追加\n        await git.add({\n          fs: this.fs,\n          dir: this.dir,\n          filepath: '.',\n        });\n      }\n\n      // コミット\n      const sha = await git.commit({\n        fs: this.fs,\n        dir: this.dir,\n        message,\n        author: this.config.author,\n      });\n\n      return sha;\n    } catch (error) {\n      console.error('Failed to commit:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * リモートにプッシュ\n   */\n  async push(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await git.push({\n        fs: this.fs,\n        http,\n        dir: this.dir,\n        remote: 'origin',\n        ref: this.currentBranch,\n        onAuth: () => ({\n          username: 'oauth2',\n          password: this.config.token,\n        }),\n      });\n    } catch (error) {\n      console.error('Failed to push:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * リモートからプル\n   */\n  async pull(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await git.pull({\n        fs: this.fs,\n        http,\n        dir: this.dir,\n        ref: this.currentBranch,\n        author: this.config.author,\n        onAuth: () => ({\n          username: 'oauth2',\n          password: this.config.token,\n        }),\n      });\n    } catch (error) {\n      console.error('Failed to pull:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ブランチ一覧を取得\n   * @returns ブランチ一覧\n   */\n  async listBranches(): Promise<string[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      return await git.listBranches({\n        fs: this.fs,\n        dir: this.dir,\n      });\n    } catch (error) {\n      console.error('Failed to list branches:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 現在のブランチを取得\n   * @returns 現在のブランチ名\n   */\n  getCurrentBranch(): string {\n    return this.currentBranch;\n  }\n\n  /**\n   * コミット履歴を取得\n   * @param depth 取得する履歴の深さ\n   * @returns コミット履歴\n   */\n  async getCommitHistory(depth: number = 10): Promise<any[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const commits = await git.log({\n        fs: this.fs,\n        dir: this.dir,\n        depth,\n      });\n\n      return commits.map(commit => ({\n        oid: commit.oid,\n        message: commit.commit.message,\n        author: commit.commit.author,\n        committer: commit.commit.committer,\n      }));\n    } catch (error) {\n      console.error('Failed to get commit history:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 作業ディレクトリの状態を取得\n   * @returns ファイルの状態一覧\n   */\n  async getStatus(): Promise<any[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const status = await git.statusMatrix({\n        fs: this.fs,\n        dir: this.dir,\n      });\n\n      return status.map(([filepath, headStatus, workdirStatus, stageStatus]) => ({\n        filepath,\n        headStatus,\n        workdirStatus,\n        stageStatus,\n        status: this.getFileStatus(headStatus, workdirStatus, stageStatus),\n      }));\n    } catch (error) {\n      console.error('Failed to get status:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルの状態を判定\n   */\n  private getFileStatus(headStatus: number, workdirStatus: number, stageStatus: number): string {\n    if (headStatus === 1 && workdirStatus === 2 && stageStatus === 2) return 'modified';\n    if (headStatus === 0 && workdirStatus === 2 && stageStatus === 2) return 'added';\n    if (headStatus === 1 && workdirStatus === 0 && stageStatus === 0) return 'deleted';\n    if (headStatus === 1 && workdirStatus === 1 && stageStatus === 1) return 'unmodified';\n    if (headStatus === 0 && workdirStatus === 2 && stageStatus === 0) return 'untracked';\n    return 'unknown';\n  }\n\n  /**\n   * リソースのクリーンアップ\n   */\n  async cleanup(): Promise<void> {\n    try {\n      // 必要に応じてリソースをクリーンアップ\n      this.isInitialized = false;\n    } catch (error) {\n      console.error('Failed to cleanup GitFileSystem:', error);\n      throw error;\n    }\n  }\n}\n\nexport default GitFileSystem; ","/**\n * @file lib/git/git-vector-store.ts\n * @description Git対応のベクトルストア\n * @author GFTD Co., Ltd.\n */\n\nimport { Index } from 'usearch';\nimport { Document } from '@langchain/core/documents';\nimport { GitFileSystem } from './git-fs';\nimport { randomUUID } from 'crypto';\n\n/**\n * Git対応ベクトルストアエントリー\n */\nexport interface GitVectorStoreEntry {\n  id: string;\n  vector: number[];\n  document: Document;\n  timestamp: number;\n  commitSha?: string;\n}\n\n/**\n * Git検索結果\n */\nexport interface GitSearchResult {\n  document: Document;\n  score: number;\n  id: string;\n  commitSha?: string;\n}\n\n/**\n * Git対応のベクトルストアクラス\n * usearchとGitを組み合わせて、ベクトル検索データをGitリポジトリで管理\n */\nexport class GitVectorStore {\n  private index: Index;\n  private gitFs: GitFileSystem;\n  private entries: Map<string, GitVectorStoreEntry>;\n  private dimensions: number;\n  private isInitialized = false;\n  private vectorsDir = 'vectors';\n  private metadataDir = 'metadata';\n  private indexFile = 'index.json';\n\n  constructor(gitFs: GitFileSystem, dimensions: number = 384) {\n    this.gitFs = gitFs;\n    this.dimensions = dimensions;\n    this.entries = new Map();\n    \n    // usearchインデックスの初期化\n    this.index = new Index(this.dimensions);\n  }\n\n  /**\n   * ベクトルストアの初期化\n   */\n  async initialize(): Promise<void> {\n    if (this.isInitialized) {\n      return;\n    }\n\n    try {\n      // GitFileSystemの初期化\n      await this.gitFs.initialize();\n\n      // 必要なディレクトリを作成\n      await this.initializeDirectories();\n\n      // 既存のインデックスを読み込み\n      await this.loadExistingIndex();\n\n      this.isInitialized = true;\n    } catch (error) {\n      console.error('Failed to initialize GitVectorStore:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 必要なディレクトリを初期化\n   */\n  private async initializeDirectories(): Promise<void> {\n    try {\n      // ディレクトリ構造を作成\n      const dirs = [this.vectorsDir, this.metadataDir];\n      \n      for (const dir of dirs) {\n        const exists = await this.gitFs.exists(dir);\n        if (!exists) {\n          await this.gitFs.writeFile(`${dir}/.gitkeep`, '');\n        }\n      }\n    } catch (error) {\n      console.error('Failed to initialize directories:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 既存のインデックスを読み込み\n   */\n  private async loadExistingIndex(): Promise<void> {\n    try {\n      const indexExists = await this.gitFs.exists(this.indexFile);\n      if (!indexExists) {\n        return;\n      }\n\n      const indexData = await this.gitFs.readFile(this.indexFile);\n      const indexInfo = JSON.parse(indexData);\n\n      // エントリーを復元\n      this.entries.clear();\n      const entriesArray = indexInfo.entries || [];\n      \n      for (const entryData of entriesArray) {\n        const entry: GitVectorStoreEntry = {\n          id: entryData.id,\n          vector: entryData.vector,\n          document: new Document({\n            pageContent: entryData.document.pageContent,\n            metadata: entryData.document.metadata,\n          }),\n          timestamp: entryData.timestamp,\n          commitSha: entryData.commitSha,\n        };\n\n        this.entries.set(entry.id, entry);\n\n        // usearchインデックスに追加\n        this.index.add(BigInt(this.entries.size - 1), new Float32Array(entry.vector));\n      }\n\n    } catch (error) {\n      console.warn('Failed to load existing index:', error);\n      // エラーが発生しても続行\n    }\n  }\n\n  /**\n   * ベクトルとドキュメントを追加\n   * @param vector ベクトル\n   * @param document ドキュメント\n   * @returns エントリーID\n   */\n  async add(vector: number[], document: Document): Promise<string> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const id = randomUUID();\n      const entry: GitVectorStoreEntry = {\n        id,\n        vector,\n        document,\n        timestamp: Date.now(),\n      };\n\n      // usearchインデックスに追加\n      this.index.add(BigInt(this.entries.size), new Float32Array(vector));\n\n      // エントリーを保存\n      this.entries.set(id, entry);\n\n      // ファイルシステムに保存\n      await this.saveEntry(entry);\n\n      // インデックスファイルを更新\n      await this.saveIndexFile();\n\n      // Gitにコミット\n      const commitSha = await this.commitChanges(`Add vector entry: ${id}`);\n      entry.commitSha = commitSha;\n\n      return id;\n    } catch (error) {\n      console.error('Failed to add vector:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ベクトル検索\n   * @param query クエリベクトル\n   * @param k 返す結果数\n   * @returns 検索結果\n   */\n  async search(query: number[], k: number = 5): Promise<GitSearchResult[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const queryVector = new Float32Array(query);\n      const results = this.index.search(queryVector, k);\n\n      const searchResults: GitSearchResult[] = [];\n      const entriesArray = Array.from(this.entries.values());\n\n      for (let i = 0; i < results.keys.length; i++) {\n        const index = Number(results.keys[i]);\n        const score = results.distances[i];\n\n        if (index < entriesArray.length) {\n          const entry = entriesArray[index];\n          searchResults.push({\n            document: entry.document,\n            score: 1 - score, // cosine similarityに変換\n            id: entry.id,\n            commitSha: entry.commitSha,\n          });\n        }\n      }\n\n      return searchResults;\n    } catch (error) {\n      console.error('Failed to search vectors:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * エントリーをファイルシステムに保存\n   */\n  private async saveEntry(entry: GitVectorStoreEntry): Promise<void> {\n    try {\n      // ベクトルデータを保存\n      const vectorFilePath = `${this.vectorsDir}/${entry.id}.json`;\n      const vectorData = {\n        id: entry.id,\n        vector: entry.vector,\n        timestamp: entry.timestamp,\n      };\n      \n      await this.gitFs.writeFile(vectorFilePath, JSON.stringify(vectorData, null, 2));\n\n      // メタデータを保存\n      const metadataFilePath = `${this.metadataDir}/${entry.id}.json`;\n      const metadataData = {\n        id: entry.id,\n        document: {\n          pageContent: entry.document.pageContent,\n          metadata: entry.document.metadata,\n        },\n        timestamp: entry.timestamp,\n      };\n      \n      await this.gitFs.writeFile(metadataFilePath, JSON.stringify(metadataData, null, 2));\n    } catch (error) {\n      console.error('Failed to save entry:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * インデックスファイルを保存\n   */\n  private async saveIndexFile(): Promise<void> {\n    try {\n      const indexData = {\n        dimensions: this.dimensions,\n        size: this.entries.size,\n        timestamp: Date.now(),\n        entries: Array.from(this.entries.values()).map(entry => ({\n          id: entry.id,\n          vector: entry.vector,\n          document: {\n            pageContent: entry.document.pageContent,\n            metadata: entry.document.metadata,\n          },\n          timestamp: entry.timestamp,\n          commitSha: entry.commitSha,\n        })),\n      };\n\n      await this.gitFs.writeFile(this.indexFile, JSON.stringify(indexData, null, 2));\n    } catch (error) {\n      console.error('Failed to save index file:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 変更をGitにコミット\n   */\n  private async commitChanges(message: string): Promise<string> {\n    try {\n      return await this.gitFs.commit(message);\n    } catch (error) {\n      console.error('Failed to commit changes:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * リモートにプッシュ\n   */\n  async push(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await this.gitFs.push();\n    } catch (error) {\n      console.error('Failed to push to remote:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * リモートからプル\n   */\n  async pull(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await this.gitFs.pull();\n      \n      // プル後にインデックスを再読み込み\n      await this.loadExistingIndex();\n    } catch (error) {\n      console.error('Failed to pull from remote:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * インデックスサイズを取得\n   */\n  size(): number {\n    return this.index.size();\n  }\n\n  /**\n   * エントリーをIDで取得\n   */\n  getEntry(id: string): GitVectorStoreEntry | undefined {\n    return this.entries.get(id);\n  }\n\n  /**\n   * エントリーをIDで削除\n   */\n  async remove(id: string): Promise<boolean> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const entry = this.entries.get(id);\n      if (!entry) {\n        return false;\n      }\n\n      // エントリーを削除\n      this.entries.delete(id);\n\n      // ファイルを削除\n      try {\n        await this.gitFs.deleteFile(`${this.vectorsDir}/${id}.json`);\n        await this.gitFs.deleteFile(`${this.metadataDir}/${id}.json`);\n      } catch (error) {\n        console.warn('Failed to remove entry files:', error);\n      }\n\n      // インデックスファイルを更新\n      await this.saveIndexFile();\n\n      // インデックスを再構築\n      await this.rebuildIndex();\n\n      // Gitにコミット\n      await this.commitChanges(`Remove vector entry: ${id}`);\n\n      return true;\n    } catch (error) {\n      console.error('Failed to remove entry:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * インデックスを再構築\n   */\n  private async rebuildIndex(): Promise<void> {\n    try {\n      // 新しいインデックスを作成\n      this.index = new Index(this.dimensions);\n\n      // エントリーを再追加\n      let i = 0;\n      for (const entry of this.entries.values()) {\n        this.index.add(BigInt(i), new Float32Array(entry.vector));\n        i++;\n      }\n    } catch (error) {\n      console.error('Failed to rebuild index:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * すべてのエントリーをクリア\n   */\n  async clear(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      // インデックスをクリア\n      this.index = new Index(this.dimensions);\n\n      // エントリーをクリア\n      this.entries.clear();\n\n      // ファイルを削除\n      const vectorFiles = await this.gitFs.readDir(this.vectorsDir);\n      const metadataFiles = await this.gitFs.readDir(this.metadataDir);\n\n      for (const file of vectorFiles) {\n        if (file.endsWith('.json')) {\n          await this.gitFs.deleteFile(`${this.vectorsDir}/${file}`);\n        }\n      }\n\n      for (const file of metadataFiles) {\n        if (file.endsWith('.json')) {\n          await this.gitFs.deleteFile(`${this.metadataDir}/${file}`);\n        }\n      }\n\n      // インデックスファイルを更新\n      await this.saveIndexFile();\n\n      // Gitにコミット\n      await this.commitChanges('Clear all vector entries');\n    } catch (error) {\n      console.error('Failed to clear vector store:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ブランチを切り替え\n   * @param branchName ブランチ名\n   * @param createIfNotExists 存在しない場合は作成\n   */\n  async switchBranch(branchName: string, createIfNotExists: boolean = false): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      await this.gitFs.switchBranch(branchName, createIfNotExists);\n      \n      // ブランチ切り替え後にインデックスを再読み込み\n      await this.loadExistingIndex();\n    } catch (error) {\n      console.error('Failed to switch branch:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 現在のブランチを取得\n   */\n  getCurrentBranch(): string {\n    return this.gitFs.getCurrentBranch();\n  }\n\n  /**\n   * ブランチ一覧を取得\n   */\n  async listBranches(): Promise<string[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    return this.gitFs.listBranches();\n  }\n\n  /**\n   * コミット履歴を取得\n   */\n  async getCommitHistory(depth: number = 10): Promise<any[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    return this.gitFs.getCommitHistory(depth);\n  }\n\n  /**\n   * リソースのクリーンアップ\n   */\n  async cleanup(): Promise<void> {\n    try {\n      await this.gitFs.cleanup();\n      this.isInitialized = false;\n    } catch (error) {\n      console.error('Failed to cleanup GitVectorStore:', error);\n      throw error;\n    }\n  }\n}\n\nexport default GitVectorStore; ","/**\n * @file lib/git/actor-git-manager.ts\n * @description Actor/Session管理のGitマネージャー\n * @author GFTD Co., Ltd.\n */\n\nimport { GitLabClient, GitLabConfig, CreateProjectConfig, CreateBranchConfig } from './gitlab-client';\nimport { GitEmbeddingSDK, GitEmbeddingConfig } from './git-embedding-sdk';\nimport { GitConfig } from './git-fs';\nimport { Document } from '@langchain/core/documents';\n\n/**\n * Actor情報インターフェース\n * GitLabプロジェクトとしてのActor表現\n */\nexport interface ActorInfo {\n  /** GitLab Project ID (数値) - 内部的にはproject_idだが、actor_id概念ではrepository_name(UUID)を使用 */\n  id: number;\n  /** Repository name with UUID (actor_id概念での実際の識別子) */\n  name: string;\n  description?: string;\n  clone_url: string;\n  web_url: string;\n  default_branch: string;\n  created_at: string;\n  updated_at?: string;\n}\n\n/**\n * Session情報インターフェース\n */\nexport interface SessionInfo {\n  name: string;\n  commit: {\n    id: string;\n    message: string;\n    author_name: string;\n    author_email: string;\n    created_at: string;\n  };\n  protected: boolean;\n  can_push: boolean;\n  web_url?: string;\n}\n\n/**\n * ActorGitManager設定インターフェース\n */\nexport interface ActorGitManagerConfig {\n  /** GitLab設定 */\n  gitlab: GitLabConfig;\n  /** Embedding設定（モデル名など） */\n  embedding?: {\n    modelName?: string;\n    dimensions?: number;\n  };\n  /** 作成者情報 */\n  author: {\n    name: string;\n    email: string;\n  };\n}\n\n/**\n * ActorGitManagerクラス\n * GitLabとGitEmbeddingSDKを統合したActor/Session管理システム\n */\nexport class ActorGitManager {\n  private gitlabClient: GitLabClient;\n  private config: ActorGitManagerConfig;\n  private embeddingSDKs: Map<number, GitEmbeddingSDK> = new Map();\n\n  constructor(config: ActorGitManagerConfig) {\n    this.config = config;\n    this.gitlabClient = new GitLabClient(config.gitlab);\n  }\n\n  /**\n   * 新しいActor（プロジェクト）を作成\n   * @param actorConfig Actor作成設定\n   * @returns Actor情報\n   */\n  async createActor(actorConfig: CreateProjectConfig): Promise<ActorInfo> {\n    try {\n      const project = await this.gitlabClient.createActor(actorConfig);\n      \n      const actorInfo: ActorInfo = {\n        id: project.id,\n        name: project.name,\n        description: project.description,\n        clone_url: project.clone_url,\n        web_url: project.web_url,\n        default_branch: project.default_branch || 'main',\n        created_at: project.created_at,\n      };\n      \n      console.log(`Created new actor: ${actorInfo.name} (ID: ${actorInfo.id})`);\n      return actorInfo;\n    } catch (error) {\n      console.error('Failed to create actor:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Actorを取得\n   * @param actorId Actor ID\n   * @returns Actor情報\n   */\n  async getActor(actorId: number): Promise<ActorInfo> {\n    try {\n      const project = await this.gitlabClient.getActor(actorId);\n      \n      return {\n        id: project.id,\n        name: project.name,\n        description: project.description,\n        clone_url: project.clone_url,\n        web_url: project.web_url,\n        default_branch: project.default_branch || 'main',\n        created_at: project.created_at,\n        updated_at: project.updated_at,\n      };\n    } catch (error) {\n      console.error('Failed to get actor:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 新しいSession（ブランチ）を作成\n   * @param actorId Actor ID\n   * @param sessionConfig Session作成設定\n   * @returns Session情報\n   */\n  async createSession(actorId: number, sessionConfig: CreateBranchConfig): Promise<SessionInfo> {\n    try {\n      const session = await this.gitlabClient.createSession(actorId, sessionConfig);\n      \n      const sessionInfo: SessionInfo = {\n        name: session.name,\n        commit: {\n          id: String(session.commit.id),\n          message: String(session.commit.message),\n          author_name: String(session.commit.author_name),\n          author_email: String(session.commit.author_email),\n          created_at: String(session.commit.created_at),\n        },\n        protected: session.protected,\n        can_push: session.can_push,\n        web_url: session.web_url,\n      };\n      \n      console.log(`Created new session: ${sessionInfo.name} for actor ${actorId}`);\n      return sessionInfo;\n    } catch (error) {\n      console.error('Failed to create session:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Sessionを取得\n   * @param actorId Actor ID\n   * @param sessionName Session名\n   * @returns Session情報\n   */\n  async getSession(actorId: number, sessionName: string): Promise<SessionInfo> {\n    try {\n      const session = await this.gitlabClient.getSession(actorId, sessionName);\n      \n      return {\n        name: session.name,\n        commit: {\n          id: String(session.commit.id),\n          message: String(session.commit.message),\n          author_name: String(session.commit.author_name),\n          author_email: String(session.commit.author_email),\n          created_at: String(session.commit.created_at),\n        },\n        protected: session.protected,\n        can_push: session.can_push,\n        web_url: session.web_url,\n      };\n    } catch (error) {\n      console.error('Failed to get session:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Actorの全Sessionを取得\n   * @param actorId Actor ID\n   * @returns Session一覧\n   */\n  async listSessions(actorId: number): Promise<SessionInfo[]> {\n    try {\n      const sessions = await this.gitlabClient.listSessions(actorId);\n      \n      return sessions.map(session => ({\n        name: session.name,\n        commit: {\n          id: String(session.commit.id),\n          message: String(session.commit.message),\n          author_name: String(session.commit.author_name),\n          author_email: String(session.commit.author_email),\n          created_at: String(session.commit.created_at),\n        },\n        protected: session.protected,\n        can_push: session.can_push,\n        web_url: session.web_url,\n      }));\n    } catch (error) {\n      console.error('Failed to list sessions:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * EmbeddingSDKを初期化\n   * @param actorId Actor ID\n   * @param branch ブランチ名（省略時はdefault_branch）\n   * @returns GitEmbeddingSDK\n   */\n  async initializeEmbeddingSDK(actorId: number, branch?: string): Promise<GitEmbeddingSDK> {\n    try {\n      // 既に初期化済みの場合は再利用\n      if (this.embeddingSDKs.has(actorId)) {\n        const existingSDK = this.embeddingSDKs.get(actorId)!;\n        \n        // ブランチが指定されている場合は切り替え\n        if (branch && existingSDK.getCurrentSession() !== branch) {\n          await existingSDK.switchSession(branch);\n        }\n        \n        return existingSDK;\n      }\n\n      // Actor情報を取得\n      const actor = await this.getActor(actorId);\n      const targetBranch = branch || actor.default_branch;\n\n      // Git設定を作成\n      const gitConfig: GitConfig = {\n        url: actor.clone_url,\n        token: this.config.gitlab.token,\n        author: this.config.author,\n        branch: targetBranch,\n        dir: `/actor-${actorId}`,\n      };\n\n      // EmbeddingSDK設定を作成\n      const embeddingConfig: GitEmbeddingConfig = {\n        git: gitConfig,\n        modelName: this.config.embedding?.modelName,\n        dimensions: this.config.embedding?.dimensions,\n      };\n\n      // EmbeddingSDKを初期化\n      const embeddingSDK = new GitEmbeddingSDK(embeddingConfig);\n      await embeddingSDK.initialize();\n\n      // キャッシュに保存\n      this.embeddingSDKs.set(actorId, embeddingSDK);\n\n      console.log(`Initialized EmbeddingSDK for actor ${actorId}, branch ${targetBranch}`);\n      return embeddingSDK;\n    } catch (error) {\n      console.error('Failed to initialize EmbeddingSDK:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ActorのEmbeddingSDKを取得（未初期化の場合は初期化）\n   * @param actorId Actor ID\n   * @param branch ブランチ名\n   * @returns GitEmbeddingSDK\n   */\n  async getEmbeddingSDK(actorId: number, branch?: string): Promise<GitEmbeddingSDK> {\n    return this.initializeEmbeddingSDK(actorId, branch);\n  }\n\n  /**\n   * Actorにドキュメントを追加\n   * @param actorId Actor ID\n   * @param documents ドキュメント配列\n   * @param sessionName セッション名（省略時は現在のセッション）\n   * @returns 追加されたドキュメントのID配列\n   */\n  async addDocumentsToActor(\n    actorId: number, \n    documents: Document[], \n    sessionName?: string\n  ): Promise<string[]> {\n    try {\n      const embeddingSDK = await this.getEmbeddingSDK(actorId, sessionName);\n      \n      const documentIds = await embeddingSDK.addDocuments(documents);\n      \n      // リモートにプッシュ\n      await embeddingSDK.push();\n      \n      console.log(`Added ${documentIds.length} documents to actor ${actorId}`);\n      return documentIds;\n    } catch (error) {\n      console.error('Failed to add documents to actor:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Actorで検索\n   * @param actorId Actor ID\n   * @param query 検索クエリ\n   * @param k 返す結果数\n   * @param sessionName セッション名（省略時は現在のセッション）\n   * @returns 検索結果\n   */\n  async searchInActor(\n    actorId: number, \n    query: string, \n    k: number = 5, \n    sessionName?: string\n  ): Promise<any[]> {\n    try {\n      const embeddingSDK = await this.getEmbeddingSDK(actorId, sessionName);\n      \n      const results = await embeddingSDK.search(query, k);\n      \n      console.log(`Found ${results.length} results for query \"${query}\" in actor ${actorId}`);\n      return results;\n    } catch (error) {\n      console.error('Failed to search in actor:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ActorでSessionを作成し、EmbeddingSDKを初期化\n   * @param actorId Actor ID\n   * @param sessionName セッション名\n   * @param baseBranch 基点となるブランチ（省略時はdefault_branch）\n   * @returns GitEmbeddingSDK\n   */\n  async createActorSession(\n    actorId: number, \n    sessionName: string, \n    baseBranch?: string\n  ): Promise<GitEmbeddingSDK> {\n    try {\n      const actor = await this.getActor(actorId);\n      const baseRef = baseBranch || actor.default_branch;\n\n      // GitLabでブランチを作成\n      await this.createSession(actorId, {\n        name: sessionName,\n        ref: baseRef,\n      });\n\n      // EmbeddingSDKを初期化してセッションを作成\n      const embeddingSDK = await this.getEmbeddingSDK(actorId);\n      await embeddingSDK.createSession(sessionName, baseRef);\n\n      console.log(`Created session ${sessionName} for actor ${actorId}`);\n      return embeddingSDK;\n    } catch (error) {\n      console.error('Failed to create actor session:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ActorのSessionを切り替え\n   * @param actorId Actor ID\n   * @param sessionName セッション名\n   * @returns GitEmbeddingSDK\n   */\n  async switchActorSession(actorId: number, sessionName: string): Promise<GitEmbeddingSDK> {\n    try {\n      const embeddingSDK = await this.getEmbeddingSDK(actorId);\n      await embeddingSDK.switchSession(sessionName);\n\n      console.log(`Switched to session ${sessionName} for actor ${actorId}`);\n      return embeddingSDK;\n    } catch (error) {\n      console.error('Failed to switch actor session:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Actorのファイルを保存\n   * @param actorId Actor ID\n   * @param filePath ファイルパス\n   * @param content ファイル内容\n   * @param commitMessage コミットメッセージ\n   * @param sessionName セッション名\n   */\n  async saveFileToActor(\n    actorId: number,\n    filePath: string,\n    content: string,\n    commitMessage?: string,\n    sessionName?: string\n  ): Promise<string> {\n    try {\n      const embeddingSDK = await this.getEmbeddingSDK(actorId, sessionName);\n      \n      const commitSha = await embeddingSDK.saveFile(filePath, content, commitMessage);\n      \n      // リモートにプッシュ\n      await embeddingSDK.push();\n      \n      console.log(`Saved file ${filePath} to actor ${actorId}`);\n      return commitSha;\n    } catch (error) {\n      console.error('Failed to save file to actor:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Actorからファイルを読み込み\n   * @param actorId Actor ID\n   * @param filePath ファイルパス\n   * @param sessionName セッション名\n   */\n  async loadFileFromActor(\n    actorId: number,\n    filePath: string,\n    sessionName?: string\n  ): Promise<string> {\n    try {\n      const embeddingSDK = await this.getEmbeddingSDK(actorId, sessionName);\n      \n      const content = await embeddingSDK.loadFile(filePath);\n      \n      console.log(`Loaded file ${filePath} from actor ${actorId}`);\n      return content;\n    } catch (error) {\n      console.error('Failed to load file from actor:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Actorの状態を取得\n   * @param actorId Actor ID\n   * @param sessionName セッション名\n   */\n  async getActorStatus(actorId: number, sessionName?: string): Promise<{\n    actor: ActorInfo;\n    currentSession: string;\n    sessions: SessionInfo[];\n    indexSize: number;\n    status: any[];\n    commitHistory: any[];\n  }> {\n    try {\n      const actor = await this.getActor(actorId);\n      const sessions = await this.listSessions(actorId);\n      const embeddingSDK = await this.getEmbeddingSDK(actorId, sessionName);\n\n      const currentSession = embeddingSDK.getCurrentSession();\n      const indexSize = await embeddingSDK.getIndexSize();\n      const status = await embeddingSDK.getStatus();\n      const commitHistory = await embeddingSDK.getCommitHistory();\n\n      return {\n        actor,\n        currentSession,\n        sessions,\n        indexSize,\n        status,\n        commitHistory,\n      };\n    } catch (error) {\n      console.error('Failed to get actor status:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Actorを削除\n   * @param actorId Actor ID\n   */\n  async deleteActor(actorId: number): Promise<boolean> {\n    try {\n      // EmbeddingSDKをクリーンアップ\n      const embeddingSDK = this.embeddingSDKs.get(actorId);\n      if (embeddingSDK) {\n        await embeddingSDK.cleanup();\n        this.embeddingSDKs.delete(actorId);\n      }\n\n      // GitLabプロジェクトを削除\n      const result = await this.gitlabClient.deleteActor(actorId);\n      \n      console.log(`Deleted actor ${actorId}`);\n      return result;\n    } catch (error) {\n      console.error('Failed to delete actor:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Sessionを削除\n   * @param actorId Actor ID\n   * @param sessionName セッション名\n   */\n  async deleteSession(actorId: number, sessionName: string): Promise<boolean> {\n    try {\n      const result = await this.gitlabClient.deleteSession(actorId, sessionName);\n      \n      console.log(`Deleted session ${sessionName} from actor ${actorId}`);\n      return result;\n    } catch (error) {\n      console.error('Failed to delete session:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * 全てのEmbeddingSDKをクリーンアップ\n   */\n  async cleanup(): Promise<void> {\n    try {\n      for (const [actorId, embeddingSDK] of this.embeddingSDKs) {\n        await embeddingSDK.cleanup();\n        console.log(`Cleaned up EmbeddingSDK for actor ${actorId}`);\n      }\n      \n      this.embeddingSDKs.clear();\n    } catch (error) {\n      console.error('Failed to cleanup ActorGitManager:', error);\n      throw error;\n    }\n  }\n}\n\nexport default ActorGitManager; ","/**\n * @file lib/utils/uuid.ts\n * @description UUID生成ユーティリティ\n * @author GFTD Co., Ltd.\n */\n\n/**\n * シンプルなUUID v4生成（ブラウザ・Node.js両対応）\n */\nexport function generateUUID(): string {\n  // モダンブラウザのcrypto.randomUUID()を優先使用\n  if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n    return crypto.randomUUID()\n  }\n  \n  // フォールバック: RFC4122準拠のUUID v4生成\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n    const r = Math.random() * 16 | 0\n    const v = c === 'x' ? r : (r & 0x3 | 0x8)\n    return v.toString(16)\n  })\n}\n\n/**\n * 短縮UUID生成（8文字、英数字のみ）\n */\nexport function generateShortUUID(): string {\n  const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'\n  let result = ''\n  for (let i = 0; i < 8; i++) {\n    result += chars.charAt(Math.floor(Math.random() * chars.length))\n  }\n  return result\n}\n\n/**\n * アクター用のリポジトリ名生成\n * @param actorName 人間が読める名前\n * @returns UUID付きのリポジトリ名\n */\nexport function generateRepositoryName(actorName: string): string {\n  const uuid = generateShortUUID()\n  const safeName = actorName\n    .toLowerCase()\n    .replace(/[^a-z0-9-]/g, '-')  // 英数字とハイフンのみ\n    .replace(/-+/g, '-')          // 連続するハイフンを1つに\n    .replace(/^-|-$/g, '')        // 先頭・末尾のハイフンを削除\n    .substring(0, 20)             // 20文字まで\n  \n  return `${safeName}-${uuid}`\n}\n\n/**\n * タイムスタンプ付きのUUID生成\n */\nexport function generateTimestampUUID(): string {\n  const timestamp = Date.now().toString(36)\n  const randomPart = generateShortUUID()\n  return `${timestamp}-${randomPart}`\n}\n\n/**\n * UUID検証\n */\nexport function isValidUUID(uuid: string): boolean {\n  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n  return uuidRegex.test(uuid)\n}\n\n/**\n * 短縮UUID検証\n */\nexport function isValidShortUUID(uuid: string): boolean {\n  const shortUuidRegex = /^[a-z0-9]{8}$/\n  return shortUuidRegex.test(uuid)\n} ","/**\n * @file lib/git/actor-repository-manager.ts\n * @description アクターリポジトリの作成・初期化マネージャー\n * @author GFTD Co., Ltd.\n */\n\nimport { GitFileSystem, GitConfig } from './git-fs';\nimport { ChatGitManager } from './chat-git-manager';\nimport { createDefaultChatGitConfig } from './chat-history-utils';\nimport { ChatGitConfig } from '../types/chat-git';\nimport { ActorSession, ActorMessage } from '../types/session';\nimport { generateRepositoryName } from '../utils/uuid';\n\nexport interface ActorRepositoryConfig {\n  name: string;\n  description?: string;\n  type: string;\n  repositoryType: 'local' | 'online';\n  repositoryUrl?: string;\n  gitConfig: ChatGitConfig;\n  localPath?: string;\n  repositoryName?: string;  // UUID付きのリポジトリ名\n}\n\nexport interface RepositoryInitResult {\n  success: boolean;\n  repositoryPath: string;\n  gitConfig: ChatGitConfig;\n  initialCommitSha?: string;\n  error?: string;\n}\n\n/**\n * アクターリポジトリ管理クラス\n * ローカル・オンラインリポジトリの作成と初期化を管理\n */\nexport class ActorRepositoryManager {\n  \n  /**\n   * 新しいアクターリポジトリを作成・初期化\n   */\n  static async createActorRepository(config: ActorRepositoryConfig): Promise<RepositoryInitResult> {\n    try {\n      if (config.repositoryType === 'local') {\n        return await this.createLocalRepository(config);\n      } else {\n        return await this.initializeOnlineRepository(config);\n      }\n    } catch (error) {\n      console.error('Failed to create actor repository:', error);\n      return {\n        success: false,\n        repositoryPath: '',\n        gitConfig: config.gitConfig,\n        error: error instanceof Error ? error.message : 'Unknown error'\n      };\n    }\n  }\n\n  /**\n   * ローカルリポジトリを作成\n   */\n  private static async createLocalRepository(config: ActorRepositoryConfig): Promise<RepositoryInitResult> {\n    // UUID付きのリポジトリ名を使用（既に生成済みの場合はそれを使用）\n    const repositoryName = config.repositoryName || generateRepositoryName(config.name);\n    const repositoryPath = config.localPath || `/actors/${repositoryName}`;\n    \n    // ローカル用のGit設定を作成\n    const localGitConfig: GitConfig = {\n      url: `file://${repositoryPath}`,\n      token: '', // ローカルの場合はトークン不要\n      author: config.gitConfig.git.author,\n      branch: config.gitConfig.git.branch || 'main',\n      dir: repositoryPath\n    };\n\n    try {\n      // GitFileSystemでローカルリポジトリを初期化\n      const gitFs = new GitFileSystem(localGitConfig);\n      await gitFs.initialize();\n\n      // 初期ファイルを作成\n      await this.createInitialFiles(gitFs, config);\n\n      // 初期コミットを作成\n      const initialCommitSha = await gitFs.commit('Initial commit: Actor repository created');\n\n      return {\n        success: true,\n        repositoryPath,\n        gitConfig: {\n          ...config.gitConfig,\n          git: localGitConfig\n        },\n        initialCommitSha\n      };\n\n    } catch (error) {\n      console.error('Failed to create local repository:', error);\n      return {\n        success: false,\n        repositoryPath,\n        gitConfig: config.gitConfig,\n        error: error instanceof Error ? error.message : 'Failed to create local repository'\n      };\n    }\n  }\n\n  /**\n   * オンラインリポジトリを初期化\n   */\n  private static async initializeOnlineRepository(config: ActorRepositoryConfig): Promise<RepositoryInitResult> {\n    if (!config.repositoryUrl) {\n      return {\n        success: false,\n        repositoryPath: '',\n        gitConfig: config.gitConfig,\n        error: 'Repository URL is required for online repositories'\n      };\n    }\n\n    // UUID付きのリポジトリ名を使用（ローカル作業ディレクトリ名として）\n    const repositoryName = config.repositoryName || generateRepositoryName(config.name);\n    const repositoryPath = `/tmp/actors/${repositoryName}`;\n\n    try {\n      // GitFileSystemでオンラインリポジトリをクローンまたは初期化\n      const gitFs = new GitFileSystem(config.gitConfig.git);\n      await gitFs.initialize();\n\n      // 初期ファイルを作成（リポジトリが空の場合）\n      const hasFiles = await this.checkRepositoryHasFiles(gitFs);\n      let initialCommitSha: string | undefined;\n\n      if (!hasFiles) {\n        await this.createInitialFiles(gitFs, config);\n        initialCommitSha = await gitFs.commit('Initial commit: Actor repository setup');\n        \n        // リモートにプッシュ\n        await gitFs.push();\n      }\n\n      return {\n        success: true,\n        repositoryPath,\n        gitConfig: config.gitConfig,\n        initialCommitSha\n      };\n\n    } catch (error) {\n      console.error('Failed to initialize online repository:', error);\n      return {\n        success: false,\n        repositoryPath,\n        gitConfig: config.gitConfig,\n        error: error instanceof Error ? error.message : 'Failed to initialize online repository'\n      };\n    }\n  }\n\n  /**\n   * 初期ファイルを作成\n   */\n  private static async createInitialFiles(gitFs: GitFileSystem, config: ActorRepositoryConfig): Promise<void> {\n    // README.md を作成\n    const readmeContent = this.generateReadmeContent(config);\n    await gitFs.writeFile('README.md', readmeContent);\n\n    // .gitignore を作成\n    const gitignoreContent = this.generateGitignoreContent();\n    await gitFs.writeFile('.gitignore', gitignoreContent);\n\n    // actor.config.json を作成\n    const actorConfigContent = this.generateActorConfig(config);\n    await gitFs.writeFile('actor.config.json', JSON.stringify(actorConfigContent, null, 2));\n\n    // package.json を作成（Node.js系のactorの場合）\n    if (this.shouldCreatePackageJson(config.type)) {\n      const packageJsonContent = this.generatePackageJson(config);\n      await gitFs.writeFile('package.json', JSON.stringify(packageJsonContent, null, 2));\n    }\n\n    // 基本的なディレクトリ構造を作成\n    await this.createDirectoryStructure(gitFs, config);\n  }\n\n  /**\n   * README.mdの内容を生成\n   */\n  private static generateReadmeContent(config: ActorRepositoryConfig): string {\n    return `# ${config.name}\n\n${config.description || 'Actor for automation and intelligent task processing'}\n\n## Overview\n\nThis is an Actor repository created with the Actor SDK. Actors are intelligent automation agents that can process data, interact with APIs, and perform complex tasks.\n\n**Actor Type**: ${config.type}\n**Repository Type**: ${config.repositoryType}\n\n## Features\n\n- 🤖 Intelligent automation capabilities\n- 📝 Chat history management with Git integration\n- 🔄 Version control and collaboration\n- 📊 Session tracking and analytics\n\n## Setup\n\n1. Install dependencies:\n   \\`\\`\\`bash\n   npm install\n   \\`\\`\\`\n\n2. Configure your environment variables in \\`.env\\`\n\n3. Start the actor:\n   \\`\\`\\`bash\n   npm start\n   \\`\\`\\`\n\n## Development\n\n### Project Structure\n\n- \\`src/\\` - Source code\n- \\`sessions/\\` - Chat history and session data\n- \\`config/\\` - Configuration files\n- \\`tests/\\` - Test files\n\n### Commands\n\n- \\`npm run dev\\` - Start development mode\n- \\`npm run build\\` - Build for production\n- \\`npm run test\\` - Run tests\n- \\`npm run lint\\` - Check code quality\n\n## Documentation\n\nSee the [Actor SDK Documentation](https://docs.actor.gftd.ai) for more information.\n\n## Contributing\n\n1. Create a feature branch\n2. Make your changes\n3. Add tests\n4. Submit a pull request\n\n## License\n\nMIT License - see LICENSE file for details.\n\n---\n\nGenerated by Actor SDK v1.0.0\n`;\n  }\n\n  /**\n   * .gitignoreの内容を生成\n   */\n  private static generateGitignoreContent(): string {\n    return `# Dependencies\nnode_modules/\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Environment variables\n.env\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\n# Build outputs\ndist/\nbuild/\n.next/\nout/\n\n# Cache and temp files\n.cache/\n.tmp/\n.temp/\n\n# IDE files\n.vscode/\n.idea/\n*.swp\n*.swo\n\n# OS files\n.DS_Store\nThumbs.db\n\n# Logs\nlogs/\n*.log\n\n# Actor specific\nsessions/temp/\n*.session.tmp\n\n# Git LFS\n*.lfs.*\n`;\n  }\n\n  /**\n   * Actor設定ファイルを生成\n   */\n  private static generateActorConfig(config: ActorRepositoryConfig): any {\n    return {\n      name: config.name,\n      description: config.description,\n      type: config.type,\n      version: \"1.0.0\",\n      repository: {\n        type: config.repositoryType,\n        url: config.repositoryUrl,\n        path: config.localPath\n      },\n      sdk: {\n        version: \"1.0.0\",\n        features: [\n          \"chat-history\",\n          \"git-integration\",\n          \"session-management\"\n        ]\n      },\n      capabilities: {\n        chatHistory: {\n          enabled: true,\n          format: \"both\",\n          autoCommit: true\n        },\n        sessionManagement: {\n          enabled: true,\n          maxSessions: 100,\n          retentionDays: 30\n        }\n      },\n      created: new Date().toISOString(),\n      metadata: {\n        tags: [config.type, \"actor-sdk\"],\n        category: config.type,\n        language: \"typescript\"\n      }\n    };\n  }\n\n  /**\n   * package.jsonを生成\n   */\n  private static generatePackageJson(config: ActorRepositoryConfig): any {\n    return {\n      name: config.name,\n      version: \"1.0.0\",\n      description: config.description || `Actor for ${config.type}`,\n      main: \"dist/index.js\",\n      scripts: {\n        \"dev\": \"tsx watch src/index.ts\",\n        \"build\": \"tsup src/index.ts --format cjs,esm --dts\",\n        \"start\": \"node dist/index.js\",\n        \"test\": \"vitest\",\n        \"lint\": \"eslint src/\",\n        \"type-check\": \"tsc --noEmit\"\n      },\n      dependencies: {\n        \"@gftdcojp/actor-sdk-ui\": \"^1.0.0\"\n      },\n      devDependencies: {\n        \"@types/node\": \"^20.0.0\",\n        \"tsx\": \"^4.0.0\",\n        \"tsup\": \"^8.0.0\",\n        \"typescript\": \"^5.0.0\",\n        \"vitest\": \"^1.0.0\",\n        \"eslint\": \"^8.0.0\"\n      },\n      keywords: [\n        \"actor\",\n        \"automation\",\n        config.type,\n        \"actor-sdk\"\n      ],\n      author: config.gitConfig.git.author.name,\n      license: \"MIT\"\n    };\n  }\n\n  /**\n   * package.jsonを作成すべきかチェック\n   */\n  private static shouldCreatePackageJson(type: string): boolean {\n    const nodeBasedTypes = [\n      'chat-assistant',\n      'api-client',\n      'automation',\n      'data-processor',\n      'web-scraper'\n    ];\n    return nodeBasedTypes.includes(type);\n  }\n\n  /**\n   * ディレクトリ構造を作成\n   */\n  private static async createDirectoryStructure(gitFs: GitFileSystem, config: ActorRepositoryConfig): Promise<void> {\n    // 基本ディレクトリ\n    await gitFs.writeFile('src/.gitkeep', '');\n    await gitFs.writeFile('config/.gitkeep', '');\n    await gitFs.writeFile('sessions/.gitkeep', '');\n    await gitFs.writeFile('tests/.gitkeep', '');\n\n    // 簡単なindex.tsファイルを作成\n    if (this.shouldCreatePackageJson(config.type)) {\n      const indexContent = this.generateIndexFile(config);\n      await gitFs.writeFile('src/index.ts', indexContent);\n    }\n  }\n\n  /**\n   * index.tsファイルを生成\n   */\n  private static generateIndexFile(config: ActorRepositoryConfig): string {\n    return `/**\n * ${config.name} - Actor Implementation\n * Generated by Actor SDK\n */\n\nimport { ActorSDK } from '@gftdcojp/actor-sdk-ui';\n\nexport class ${this.toPascalCase(config.name)}Actor {\n  private sdk: ActorSDK;\n\n  constructor() {\n    this.sdk = new ActorSDK();\n  }\n\n  /**\n   * Initialize the actor\n   */\n  async initialize(): Promise<void> {\n    console.log('Initializing ${config.name} actor...');\n    // Add your initialization logic here\n  }\n\n  /**\n   * Process a message or task\n   */\n  async process(input: any): Promise<any> {\n    console.log('Processing input:', input);\n    \n    // Add your processing logic here\n    return {\n      message: 'Hello from ${config.name}!',\n      timestamp: new Date().toISOString(),\n      input\n    };\n  }\n\n  /**\n   * Clean up resources\n   */\n  async cleanup(): Promise<void> {\n    console.log('Cleaning up ${config.name} actor...');\n    // Add your cleanup logic here\n  }\n}\n\n// Export default instance\nexport default new ${this.toPascalCase(config.name)}Actor();\n`;\n  }\n\n  /**\n   * PascalCaseに変換\n   */\n  private static toPascalCase(str: string): string {\n    return str\n      .split(/[-_\\s]+/)\n      .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n      .join('');\n  }\n\n  /**\n   * リポジトリにファイルが存在するかチェック\n   */\n  private static async checkRepositoryHasFiles(gitFs: GitFileSystem): Promise<boolean> {\n    try {\n      const files = await gitFs.readDir('.');\n      return files.length > 0;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * アクターリポジトリの設定を検証\n   */\n  static validateActorConfig(config: ActorRepositoryConfig): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    if (!config.name || config.name.trim().length === 0) {\n      errors.push('Actor name is required');\n    }\n\n    // アクター名の検証は緩和（表示名なので）\n    if (config.name && config.name.trim().length > 100) {\n      errors.push('Actor name must be 100 characters or less');\n    }\n\n    if (!config.type || config.type.trim().length === 0) {\n      errors.push('Actor type is required');\n    }\n\n    if (!config.repositoryType) {\n      errors.push('Repository type is required');\n    }\n\n    if (config.repositoryType === 'online' && !config.repositoryUrl) {\n      errors.push('Repository URL is required for online repositories');\n    }\n\n    if (config.repositoryType === 'online' && config.repositoryUrl) {\n      try {\n        new URL(config.repositoryUrl);\n      } catch {\n        errors.push('Invalid repository URL format');\n      }\n    }\n\n    if (!config.gitConfig?.git?.author?.name) {\n      errors.push('Git author name is required');\n    }\n\n    if (!config.gitConfig?.git?.author?.email) {\n      errors.push('Git author email is required');\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors\n    };\n  }\n} ","/**\n * @file lib/git/chat-git-manager.ts\n * @description チャット履歴のGit管理マネージャー\n * @author GFTD Co., Ltd.\n */\n\nimport { GitFileSystem } from './git-fs';\nimport { ActorSession, ActorMessage } from '../types/session';\nimport {\n  ChatGitConfig,\n  ChatHistoryFile,\n  ChatHistoryMetadata,\n  ChatGitSaveResult,\n  ChatHistorySearchQuery,\n  ChatHistorySearchResult,\n  ChatHistoryFileNaming,\n  MarkdownExportOptions,\n  IChatGitManager\n} from '../types/chat-git';\n\n/**\n * チャット履歴のGit管理クラス\n * セッション管理とGit操作を統合し、チャット履歴をファイルとして永続化\n */\nexport class ChatGitManager implements IChatGitManager {\n  private gitFs: GitFileSystem;\n  private config: ChatGitConfig;\n  private fileNaming: ChatHistoryFileNaming;\n  private markdownOptions: MarkdownExportOptions;\n  private isInitialized = false;\n\n  constructor(\n    config: ChatGitConfig,\n    fileNaming?: Partial<ChatHistoryFileNaming>,\n    markdownOptions?: Partial<MarkdownExportOptions>\n  ) {\n    this.config = config;\n    this.gitFs = new GitFileSystem(config.git);\n\n    // ファイル命名規則のデフォルト設定\n    this.fileNaming = {\n      sessionDirPattern: 'sessions/{actorId}/{sessionId}',\n      markdownFilePattern: 'chat-history.md',\n      jsonFilePattern: 'chat-history.json',\n      metadataFilePattern: 'metadata.json',\n      ...fileNaming\n    };\n\n    // Markdownエクスポート設定のデフォルト\n    this.markdownOptions = {\n      titleFormat: '# Chat History - Session {sessionId}',\n      messageFormat: '## {role} ({timestamp})\\n\\n{content}\\n',\n      timestampFormat: 'YYYY-MM-DD HH:mm:ss',\n      includeToc: true,\n      includeMetadata: true,\n      ...markdownOptions\n    };\n  }\n\n  /**\n   * 初期化\n   */\n  private async initialize(): Promise<void> {\n    if (this.isInitialized) {\n      return;\n    }\n\n    try {\n      await this.gitFs.initialize();\n      this.isInitialized = true;\n    } catch (error) {\n      console.error('Failed to initialize ChatGitManager:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * チャット履歴を保存\n   */\n  async saveHistory(\n    session: ActorSession,\n    messages: ActorMessage[],\n    commitMessage?: string\n  ): Promise<ChatGitSaveResult> {\n    try {\n      await this.initialize();\n\n      const metadata: ChatHistoryMetadata = {\n        sessionId: session.id,\n        actorId: session.actor_id,\n        createdAt: session.created_at,\n        updatedAt: session.updated_at,\n        messageCount: messages.length,\n        format: this.config.format,\n        branch: await this.gitFs.getCurrentBranch()\n      };\n\n      const historyFile: ChatHistoryFile = {\n        metadata,\n        session,\n        messages,\n        additionalInfo: {\n          exportedAt: new Date().toISOString(),\n          exportVersion: '1.0.0'\n        }\n      };\n\n      const sessionDir = this.getSessionDirectory(session.actor_id, session.id);\n      const filePaths: string[] = [];\n\n      // ディレクトリを作成（parentディレクトリを経由して作成）\n      try {\n        await this.gitFs.writeFile(`${sessionDir}/.gitkeep`, '');\n      } catch (error) {\n        // ディレクトリが存在しない場合の処理\n        console.warn('Failed to create directory:', error);\n      }\n\n      // JSON形式で保存\n      if (this.config.format === 'json' || this.config.format === 'both') {\n        const jsonPath = `${sessionDir}/${this.fileNaming.jsonFilePattern}`;\n        await this.gitFs.writeFile(jsonPath, JSON.stringify(historyFile, null, 2));\n        filePaths.push(jsonPath);\n      }\n\n      // Markdown形式で保存\n      if (this.config.format === 'markdown' || this.config.format === 'both') {\n        const markdownPath = `${sessionDir}/${this.fileNaming.markdownFilePattern}`;\n        const markdownContent = this.convertToMarkdown(historyFile);\n        await this.gitFs.writeFile(markdownPath, markdownContent);\n        filePaths.push(markdownPath);\n      }\n\n      // メタデータファイルを保存\n      const metadataPath = `${sessionDir}/${this.fileNaming.metadataFilePattern}`;\n      await this.gitFs.writeFile(metadataPath, JSON.stringify(metadata, null, 2));\n      filePaths.push(metadataPath);\n\n      // 自動コミット\n      let commitSha: string | undefined;\n      if (this.config.autoCommit) {\n        const message = commitMessage || this.generateCommitMessage(session, messages.length);\n        commitSha = await this.gitFs.commit(message, filePaths);\n        metadata.commitSha = commitSha;\n      }\n\n      return {\n        success: true,\n        commitSha,\n        filePaths\n      };\n\n    } catch (error) {\n      console.error('Failed to save chat history:', error);\n      return {\n        success: false,\n        filePaths: [],\n        error: error instanceof Error ? error.message : 'Unknown error'\n      };\n    }\n  }\n\n  /**\n   * チャット履歴を読み込み\n   */\n  async loadHistory(sessionId: string, branch?: string): Promise<ChatHistoryFile | null> {\n    try {\n      await this.initialize();\n\n      if (branch) {\n        await this.gitFs.switchBranch(branch);\n      }\n\n      // メタデータファイルからactorIdを取得\n      const sessionDirs = await this.findSessionDirectories(sessionId);\n      if (sessionDirs.length === 0) {\n        return null;\n      }\n\n      const sessionDir = sessionDirs[0]; // 最初の結果を使用\n\n             // JSON形式を優先して読み込み\n       const jsonPath = `${sessionDir}/${this.fileNaming.jsonFilePattern}`;\n       if (await this.gitFs.exists(jsonPath)) {\n         const content = await this.gitFs.readFile(jsonPath);\n         return JSON.parse(content) as ChatHistoryFile;\n       }\n\n       // JSONが存在しない場合、メタデータとMarkdownから復元\n       const metadataPath = `${sessionDir}/${this.fileNaming.metadataFilePattern}`;\n       if (await this.gitFs.exists(metadataPath)) {\n        const metadataContent = await this.gitFs.readFile(metadataPath);\n        const metadata = JSON.parse(metadataContent) as ChatHistoryMetadata;\n        \n        // 基本的な構造を返す（メッセージはAPIから取得することを想定）\n        return {\n          metadata,\n          session: {\n            id: metadata.sessionId,\n            actor_id: metadata.actorId,\n            created_at: metadata.createdAt,\n            updated_at: metadata.updatedAt,\n            status: 'active',\n            message_count: metadata.messageCount\n          },\n          messages: [] // 実際の実装ではAPIから取得\n        };\n      }\n\n      return null;\n\n    } catch (error) {\n      console.error('Failed to load chat history:', error);\n      return null;\n    }\n  }\n\n  /**\n   * チャット履歴を検索\n   */\n  async searchHistory(query: ChatHistorySearchQuery): Promise<ChatHistorySearchResult[]> {\n    try {\n      await this.initialize();\n\n      const results: ChatHistorySearchResult[] = [];\n      const sessionDirs = await this.getAllSessionDirectories();\n\n      for (const sessionDir of sessionDirs) {\n                 try {\n           const metadataPath = `${sessionDir}/${this.fileNaming.metadataFilePattern}`;\n           if (!(await this.gitFs.exists(metadataPath))) {\n             continue;\n           }\n\n          const metadataContent = await this.gitFs.readFile(metadataPath);\n          const metadata = JSON.parse(metadataContent) as ChatHistoryMetadata;\n\n          // フィルタリング\n          if (!this.matchesQuery(metadata, query)) {\n            continue;\n          }\n\n          // 履歴ファイルを読み込み\n          const historyFile = await this.loadHistoryFromDirectory(sessionDir);\n          if (!historyFile) {\n            continue;\n          }\n\n          // キーワード検索\n          const matchedIndices = this.findMatchingMessages(historyFile.messages, query.keyword);\n\n          results.push({\n            historyFile,\n            matchedMessageIndices: matchedIndices.length > 0 ? matchedIndices : undefined,\n            score: this.calculateScore(historyFile, query),\n            filePath: sessionDir\n          });\n\n        } catch (error) {\n          console.warn(`Failed to process session directory ${sessionDir}:`, error);\n        }\n      }\n\n      // スコア順でソート\n      results.sort((a, b) => (b.score || 0) - (a.score || 0));\n\n      // 件数制限\n      return query.limit ? results.slice(0, query.limit) : results;\n\n    } catch (error) {\n      console.error('Failed to search chat history:', error);\n      return [];\n    }\n  }\n\n  /**\n   * メッセージを追加保存\n   */\n  async appendMessages(\n    sessionId: string,\n    newMessages: ActorMessage[],\n    commitMessage?: string\n  ): Promise<ChatGitSaveResult> {\n    try {\n      await this.initialize();\n\n      // 既存の履歴を読み込み\n      const existingHistory = await this.loadHistory(sessionId);\n      if (!existingHistory) {\n        throw new Error(`Session history not found: ${sessionId}`);\n      }\n\n      // メッセージを追加\n      const updatedMessages = [...existingHistory.messages, ...newMessages];\n      \n      // セッション情報を更新\n      const updatedSession = {\n        ...existingHistory.session,\n        updated_at: new Date().toISOString(),\n        message_count: updatedMessages.length\n      };\n\n      // 保存\n      return await this.saveHistory(updatedSession, updatedMessages, commitMessage);\n\n    } catch (error) {\n      console.error('Failed to append messages:', error);\n      return {\n        success: false,\n        filePaths: [],\n        error: error instanceof Error ? error.message : 'Unknown error'\n      };\n    }\n  }\n\n  /**\n   * セッションのブランチを作成\n   */\n  async createSessionBranch(\n    sessionId: string,\n    branchName: string,\n    baseBranch?: string\n  ): Promise<boolean> {\n    try {\n      await this.initialize();\n\n      if (baseBranch) {\n        await this.gitFs.switchBranch(baseBranch);\n      }\n\n      await this.gitFs.switchBranch(branchName, true);\n      return true;\n\n    } catch (error) {\n      console.error('Failed to create session branch:', error);\n      return false;\n    }\n  }\n\n  /**\n   * 履歴のGitステータス取得\n   */\n  async getHistoryStatus(sessionId: string): Promise<{\n    hasChanges: boolean;\n    lastCommitSha?: string;\n    lastCommitMessage?: string;\n    branch: string;\n  }> {\n    try {\n      await this.initialize();\n\n      const status = await this.gitFs.getStatus();\n      const commits = await this.gitFs.getCommitHistory(1);\n      const branch = await this.gitFs.getCurrentBranch();\n\n      return {\n        hasChanges: status.some(s => s.status !== 'unmodified'),\n        lastCommitSha: commits[0]?.oid,\n        lastCommitMessage: commits[0]?.message,\n        branch\n      };\n\n    } catch (error) {\n      console.error('Failed to get history status:', error);\n      return {\n        hasChanges: false,\n        branch: 'main'\n      };\n    }\n  }\n\n  /**\n   * コミット履歴取得\n   */\n  async getCommitHistory(sessionId: string, limit: number = 10): Promise<{\n    commitSha: string;\n    message: string;\n    author: string;\n    date: string;\n    messageCount: number;\n  }[]> {\n    try {\n      await this.initialize();\n\n      const commits = await this.gitFs.getCommitHistory(limit);\n      \n      return commits.map(commit => ({\n        commitSha: commit.oid,\n        message: commit.message,\n        author: commit.author.name,\n        date: new Date(commit.author.timestamp * 1000).toISOString(),\n        messageCount: 0 // TODO: コミット時のメッセージ数を追跡\n      }));\n\n    } catch (error) {\n      console.error('Failed to get commit history:', error);\n      return [];\n    }\n  }\n\n  // プライベートメソッド\n\n  /**\n   * セッションディレクトリのパスを取得\n   */\n  private getSessionDirectory(actorId: string, sessionId: string): string {\n    const baseDir = this.config.baseDirectory || '';\n    const pattern = this.fileNaming.sessionDirPattern\n      .replace('{actorId}', actorId)\n      .replace('{sessionId}', sessionId);\n    \n    return baseDir ? `${baseDir}/${pattern}` : pattern;\n  }\n\n  /**\n   * Markdownに変換\n   */\n  private convertToMarkdown(historyFile: ChatHistoryFile): string {\n    const { metadata, session, messages } = historyFile;\n    let markdown = '';\n\n    // タイトル\n    const title = this.markdownOptions.titleFormat\n      .replace('{sessionId}', session.id)\n      .replace('{actorId}', session.actor_id);\n    markdown += `${title}\\n\\n`;\n\n    // メタデータ\n    if (this.markdownOptions.includeMetadata) {\n      markdown += '## Metadata\\n\\n';\n      markdown += `- **Session ID**: ${metadata.sessionId}\\n`;\n      markdown += `- **Actor ID**: ${metadata.actorId}\\n`;\n      markdown += `- **Created**: ${metadata.createdAt}\\n`;\n      markdown += `- **Updated**: ${metadata.updatedAt}\\n`;\n      markdown += `- **Message Count**: ${metadata.messageCount}\\n`;\n      markdown += `- **Branch**: ${metadata.branch}\\n\\n`;\n    }\n\n    // 目次\n    if (this.markdownOptions.includeToc) {\n      markdown += '## Table of Contents\\n\\n';\n      messages.forEach((msg, index) => {\n        const timestamp = new Date(msg.created_at).toLocaleString();\n        markdown += `${index + 1}. [${msg.role} (${timestamp})](#message-${index + 1})\\n`;\n      });\n      markdown += '\\n';\n    }\n\n    // メッセージ\n    markdown += '## Messages\\n\\n';\n    messages.forEach((msg, index) => {\n      const timestamp = new Date(msg.created_at).toLocaleString();\n      const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content, null, 2);\n      \n      markdown += `### Message ${index + 1}\\n\\n`;\n      markdown += `**Role**: ${msg.role}  \\n`;\n      markdown += `**Timestamp**: ${timestamp}  \\n`;\n      markdown += `**ID**: ${msg.id}\\n\\n`;\n      markdown += `${content}\\n\\n`;\n      markdown += '---\\n\\n';\n    });\n\n    return markdown;\n  }\n\n  /**\n   * コミットメッセージを生成\n   */\n  private generateCommitMessage(session: ActorSession, messageCount: number): string {\n    const template = this.config.commitMessageTemplate || \n      'チャット履歴を更新: セッション {sessionId} ({messageCount} メッセージ)';\n    \n    return template\n      .replace('{sessionId}', session.id)\n      .replace('{actorId}', session.actor_id)\n      .replace('{messageCount}', messageCount.toString());\n  }\n\n     /**\n    * セッションディレクトリを検索\n    */\n   private async findSessionDirectories(sessionId: string): Promise<string[]> {\n     // 簡易実装：実際にはGitファイルシステムで検索\n     const baseDir = this.config.baseDirectory || 'sessions';\n     const searchPattern = new RegExp(`.*/${sessionId}$`);\n     \n     try {\n       const files = await this.gitFs.readDir(baseDir);\n       const result: string[] = [];\n       \n       for (const file of files) {\n         const fullPath = `${baseDir}/${file}`;\n         if (file === sessionId || file.endsWith(`/${sessionId}`)) {\n           result.push(fullPath);\n         }\n       }\n       \n       return result;\n     } catch {\n       return [];\n     }\n   }\n\n     /**\n    * 全セッションディレクトリを取得\n    */\n   private async getAllSessionDirectories(): Promise<string[]> {\n     const baseDir = this.config.baseDirectory || 'sessions';\n     \n     try {\n       const files = await this.gitFs.readDir(baseDir);\n       return files.map(file => `${baseDir}/${file}`);\n     } catch {\n       return [];\n     }\n   }\n\n     /**\n    * ディレクトリから履歴ファイルを読み込み\n    */\n   private async loadHistoryFromDirectory(sessionDir: string): Promise<ChatHistoryFile | null> {\n     try {\n       const jsonPath = `${sessionDir}/${this.fileNaming.jsonFilePattern}`;\n       if (await this.gitFs.exists(jsonPath)) {\n         const content = await this.gitFs.readFile(jsonPath);\n         return JSON.parse(content) as ChatHistoryFile;\n       }\n       return null;\n     } catch {\n       return null;\n     }\n   }\n\n  /**\n   * クエリにマッチするかチェック\n   */\n  private matchesQuery(metadata: ChatHistoryMetadata, query: ChatHistorySearchQuery): boolean {\n    if (query.sessionId && metadata.sessionId !== query.sessionId) return false;\n    if (query.actorId && metadata.actorId !== query.actorId) return false;\n    if (query.branch && metadata.branch !== query.branch) return false;\n    \n    if (query.dateFrom || query.dateTo) {\n      const createdAt = new Date(metadata.createdAt);\n      if (query.dateFrom && createdAt < new Date(query.dateFrom)) return false;\n      if (query.dateTo && createdAt > new Date(query.dateTo)) return false;\n    }\n    \n    return true;\n  }\n\n  /**\n   * キーワードにマッチするメッセージを検索\n   */\n  private findMatchingMessages(messages: ActorMessage[], keyword?: string): number[] {\n    if (!keyword) return [];\n    \n    const lowerKeyword = keyword.toLowerCase();\n    return messages\n      .map((msg, index) => {\n        const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\n        return content.toLowerCase().includes(lowerKeyword) ? index : -1;\n      })\n      .filter(index => index !== -1);\n  }\n\n  /**\n   * 検索スコアを計算\n   */\n  private calculateScore(historyFile: ChatHistoryFile, query: ChatHistorySearchQuery): number {\n    let score = 0;\n    \n    // 完全一致ボーナス\n    if (query.sessionId === historyFile.metadata.sessionId) score += 100;\n    if (query.actorId === historyFile.metadata.actorId) score += 50;\n    \n    // キーワードマッチ\n    if (query.keyword) {\n      const matches = this.findMatchingMessages(historyFile.messages, query.keyword);\n      score += matches.length * 10;\n    }\n    \n    // 新しいセッションにボーナス\n    const ageInDays = (Date.now() - new Date(historyFile.metadata.createdAt).getTime()) / (1000 * 60 * 60 * 24);\n    score += Math.max(0, 10 - ageInDays);\n    \n    return score;\n  }\n} ","/**\n * @file lib/git/chat-history-utils.ts\n * @description チャット履歴の復元・検索ヘルパー関数\n * @author GFTD Co., Ltd.\n */\n\nimport { ChatGitManager } from './chat-git-manager';\nimport { GitConfig } from './git-fs';\nimport {\n  ChatGitConfig,\n  ChatHistoryFile,\n  ChatHistorySearchQuery,\n  ChatHistorySearchResult\n} from '../types/chat-git';\nimport { ActorSession, ActorMessage } from '../types/session';\n\n/**\n * デフォルトのGit設定を作成\n */\nexport function createDefaultChatGitConfig(\n  repoUrl: string,\n  token: string,\n  authorName: string = 'Chat History Manager',\n  authorEmail: string = 'chat@gftd.ai'\n): ChatGitConfig {\n  return {\n    git: {\n      url: repoUrl,\n      token,\n      author: {\n        name: authorName,\n        email: authorEmail\n      },\n      branch: 'main',\n      dir: '/chat-history'\n    },\n    format: 'both',\n    autoCommit: true,\n    commitMessageTemplate: 'チャット履歴更新: {sessionId} ({messageCount}件)',\n    baseDirectory: 'sessions'\n  };\n}\n\n/**\n * チャット履歴をクイック保存\n */\nexport async function saveSessionHistory(\n  session: ActorSession,\n  messages: ActorMessage[],\n  gitConfig: ChatGitConfig,\n  customCommitMessage?: string\n): Promise<boolean> {\n  try {\n    const manager = new ChatGitManager(gitConfig);\n    const result = await manager.saveHistory(session, messages, customCommitMessage);\n    return result.success;\n  } catch (error) {\n    console.error('Failed to save session history:', error);\n    return false;\n  }\n}\n\n/**\n * チャット履歴を検索\n */\nexport async function searchChatHistory(\n  query: ChatHistorySearchQuery,\n  gitConfig: ChatGitConfig\n): Promise<ChatHistorySearchResult[]> {\n  try {\n    const manager = new ChatGitManager(gitConfig);\n    return await manager.searchHistory(query);\n  } catch (error) {\n    console.error('Failed to search chat history:', error);\n    return [];\n  }\n}\n\n/**\n * セッション履歴を復元\n */\nexport async function restoreSessionHistory(\n  sessionId: string,\n  gitConfig: ChatGitConfig,\n  branch?: string\n): Promise<ChatHistoryFile | null> {\n  try {\n    const manager = new ChatGitManager(gitConfig);\n    return await manager.loadHistory(sessionId, branch);\n  } catch (error) {\n    console.error('Failed to restore session history:', error);\n    return null;\n  }\n}\n\n/**\n * アクターの全セッション履歴を検索\n */\nexport async function findActorSessions(\n  actorId: string,\n  gitConfig: ChatGitConfig,\n  limit?: number\n): Promise<ChatHistorySearchResult[]> {\n  return await searchChatHistory(\n    {\n      actorId,\n      limit\n    },\n    gitConfig\n  );\n}\n\n/**\n * 期間で履歴を検索\n */\nexport async function findSessionsByDateRange(\n  dateFrom: string,\n  dateTo: string,\n  gitConfig: ChatGitConfig,\n  actorId?: string\n): Promise<ChatHistorySearchResult[]> {\n  return await searchChatHistory(\n    {\n      dateFrom,\n      dateTo,\n      actorId\n    },\n    gitConfig\n  );\n}\n\n/**\n * キーワードで履歴を検索\n */\nexport async function findSessionsByKeyword(\n  keyword: string,\n  gitConfig: ChatGitConfig,\n  actorId?: string,\n  limit?: number\n): Promise<ChatHistorySearchResult[]> {\n  return await searchChatHistory(\n    {\n      keyword,\n      actorId,\n      limit\n    },\n    gitConfig\n  );\n}\n\n/**\n * セッションの統計情報を取得\n */\nexport async function getSessionStatistics(\n  sessionId: string,\n  gitConfig: ChatGitConfig\n): Promise<{\n  messageCount: number;\n  firstMessageDate: string;\n  lastMessageDate: string;\n  commitCount: number;\n  fileSizes: { markdown?: number; json?: number };\n} | null> {\n  try {\n    const manager = new ChatGitManager(gitConfig);\n    const history = await manager.loadHistory(sessionId);\n    \n    if (!history) {\n      return null;\n    }\n\n    const commits = await manager.getCommitHistory(sessionId, 100);\n    \n    return {\n      messageCount: history.messages.length,\n      firstMessageDate: history.messages[0]?.created_at || '',\n      lastMessageDate: history.messages[history.messages.length - 1]?.created_at || '',\n      commitCount: commits.length,\n      fileSizes: {\n        // ファイルサイズは実装による\n        markdown: 0,\n        json: 0\n      }\n    };\n  } catch (error) {\n    console.error('Failed to get session statistics:', error);\n    return null;\n  }\n}\n\n/**\n * 複数のセッション履歴をまとめて取得\n */\nexport async function bulkRestoreSessions(\n  sessionIds: string[],\n  gitConfig: ChatGitConfig\n): Promise<Map<string, ChatHistoryFile | null>> {\n  const results = new Map<string, ChatHistoryFile | null>();\n  \n  for (const sessionId of sessionIds) {\n    try {\n      const history = await restoreSessionHistory(sessionId, gitConfig);\n      results.set(sessionId, history);\n    } catch (error) {\n      console.error(`Failed to restore session ${sessionId}:`, error);\n      results.set(sessionId, null);\n    }\n  }\n  \n  return results;\n}\n\n/**\n * チャット履歴をMarkdown文字列としてエクスポート\n */\nexport function exportHistoryAsMarkdown(\n  historyFile: ChatHistoryFile,\n  options?: {\n    includeMetadata?: boolean;\n    includeToc?: boolean;\n    timestampFormat?: string;\n  }\n): string {\n  const { metadata, session, messages } = historyFile;\n  const opts = {\n    includeMetadata: true,\n    includeToc: true,\n    timestampFormat: 'YYYY-MM-DD HH:mm:ss',\n    ...options\n  };\n\n  let markdown = '';\n\n  // タイトル\n  markdown += `# Chat History - Session ${session.id}\\n\\n`;\n\n  // メタデータ\n  if (opts.includeMetadata) {\n    markdown += '## Session Information\\n\\n';\n    markdown += `- **Session ID**: ${metadata.sessionId}\\n`;\n    markdown += `- **Actor ID**: ${metadata.actorId}\\n`;\n    markdown += `- **Created**: ${metadata.createdAt}\\n`;\n    markdown += `- **Updated**: ${metadata.updatedAt}\\n`;\n    markdown += `- **Total Messages**: ${metadata.messageCount}\\n`;\n    markdown += `- **Format**: ${metadata.format}\\n`;\n    if (metadata.commitSha) {\n      markdown += `- **Commit SHA**: ${metadata.commitSha}\\n`;\n    }\n    markdown += `- **Branch**: ${metadata.branch}\\n\\n`;\n  }\n\n  // 目次\n  if (opts.includeToc && messages.length > 0) {\n    markdown += '## Table of Contents\\n\\n';\n    messages.forEach((msg, index) => {\n      const timestamp = new Date(msg.created_at).toLocaleString();\n      markdown += `${index + 1}. [${msg.role} (${timestamp})](#message-${index + 1})\\n`;\n    });\n    markdown += '\\n';\n  }\n\n  // メッセージ\n  if (messages.length > 0) {\n    markdown += '## Messages\\n\\n';\n    messages.forEach((msg, index) => {\n      const timestamp = new Date(msg.created_at).toLocaleString();\n      const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content, null, 2);\n      \n      markdown += `<a id=\"message-${index + 1}\"></a>\\n`;\n      markdown += `### Message ${index + 1}\\n\\n`;\n      markdown += `**Role**: ${msg.role}  \\n`;\n      markdown += `**Timestamp**: ${timestamp}  \\n`;\n      markdown += `**ID**: ${msg.id}\\n\\n`;\n      \n      if (typeof msg.content === 'string') {\n        markdown += `${content}\\n\\n`;\n      } else {\n        markdown += '```json\\n';\n        markdown += `${content}\\n`;\n        markdown += '```\\n\\n';\n      }\n      \n      if (msg.metadata) {\n        markdown += '**Metadata**:\\n';\n        markdown += '```json\\n';\n        markdown += `${JSON.stringify(msg.metadata, null, 2)}\\n`;\n        markdown += '```\\n\\n';\n      }\n      \n      markdown += '---\\n\\n';\n    });\n  } else {\n    markdown += '## Messages\\n\\n';\n    markdown += '*No messages in this session.*\\n\\n';\n  }\n\n  return markdown;\n}\n\n/**\n * 高度な検索クエリビルダー\n */\nexport class ChatHistoryQueryBuilder {\n  private query: ChatHistorySearchQuery = {};\n\n  sessionId(id: string): this {\n    this.query.sessionId = id;\n    return this;\n  }\n\n  actorId(id: string): this {\n    this.query.actorId = id;\n    return this;\n  }\n\n  keyword(keyword: string): this {\n    this.query.keyword = keyword;\n    return this;\n  }\n\n  dateRange(from: string, to: string): this {\n    this.query.dateFrom = from;\n    this.query.dateTo = to;\n    return this;\n  }\n\n  branch(branch: string): this {\n    this.query.branch = branch;\n    return this;\n  }\n\n  limit(limit: number): this {\n    this.query.limit = limit;\n    return this;\n  }\n\n  build(): ChatHistorySearchQuery {\n    return { ...this.query };\n  }\n\n  async execute(gitConfig: ChatGitConfig): Promise<ChatHistorySearchResult[]> {\n    return await searchChatHistory(this.query, gitConfig);\n  }\n} ","/**\n * @file lib/auth/auth-middleware.ts\n * @description GFTD認証ミドルウェア\n * @author GFTD Co., Ltd.\n */\n\nimport { NextRequest, NextResponse } from 'next/server'\nimport { GFTDAuthClient, GFTDAuthError } from './gftd-auth-client'\nimport { GFTDAuthConfig } from '../types/config'\n\n/**\n * 認証ミドルウェアのオプション\n */\nexport interface AuthMiddlewareOptions {\n  /** 認証をスキップするパス */\n  skipPaths?: string[]\n  /** 認証エラー時のリダイレクトURL */\n  redirectUrl?: string\n  /** カスタムエラーハンドラー */\n  errorHandler?: (error: GFTDAuthError, req: NextRequest) => NextResponse\n}\n\n/**\n * GFTD認証ミドルウェア\n */\nexport class GFTDAuthMiddleware {\n  private authClient: GFTDAuthClient\n  private options: AuthMiddlewareOptions\n\n  constructor(config: GFTDAuthConfig, options: AuthMiddlewareOptions = {}) {\n    this.authClient = new GFTDAuthClient(config)\n    this.options = options\n  }\n\n  /**\n   * ミドルウェア関数\n   */\n  middleware() {\n    return async (req: NextRequest): Promise<NextResponse> => {\n      try {\n        // 認証をスキップするパスかチェック\n        if (this.shouldSkipAuth(req)) {\n          return NextResponse.next()\n        }\n\n        // 認証が必須でない場合はスキップ\n        if (!this.authClient.isAuthRequired()) {\n          return NextResponse.next()\n        }\n\n        // Authorizationヘッダーから認証情報を取得\n        const authorization = req.headers.get('authorization')\n        if (!authorization) {\n          throw new GFTDAuthError('Authorization header missing', 401, 'AUTH_HEADER_MISSING')\n        }\n\n        // トークンを検証\n        await this.validateToken(authorization)\n\n        // 認証成功 - リクエストを続行\n        return NextResponse.next()\n\n      } catch (error) {\n        if (error instanceof GFTDAuthError) {\n          return this.handleAuthError(error, req)\n        }\n        \n        console.error('Authentication middleware error:', error)\n        return this.handleAuthError(\n          new GFTDAuthError('Internal authentication error', 500, 'INTERNAL_ERROR'),\n          req\n        )\n      }\n    }\n  }\n\n  /**\n   * API Routes用の認証チェック関数\n   */\n  async requireAuth(req: NextRequest): Promise<void> {\n    if (!this.authClient.isAuthRequired()) {\n      return\n    }\n\n    const authorization = req.headers.get('authorization')\n    if (!authorization) {\n      throw new GFTDAuthError('Authorization header missing', 401, 'AUTH_HEADER_MISSING')\n    }\n\n    await this.validateToken(authorization)\n  }\n\n  /**\n   * トークンを検証\n   */\n  private async validateToken(authorization: string): Promise<void> {\n    // Bearer トークンの形式をチェック\n    const [type, token] = authorization.split(' ')\n    if (type !== 'Bearer' || !token) {\n      throw new GFTDAuthError('Invalid authorization format', 401, 'INVALID_AUTH_FORMAT')\n    }\n\n    // トークンを設定して検証\n    this.authClient.setToken({\n      accessToken: token,\n      tokenType: 'Bearer',\n      expiresAt: Date.now() / 1000 + 3600, // 仮の有効期限\n      scope: []\n    })\n\n    // 実際の認証チェック\n    await this.authClient.ensureAuthenticated()\n  }\n\n  /**\n   * 認証をスキップするかどうか\n   */\n  private shouldSkipAuth(req: NextRequest): boolean {\n    const pathname = req.nextUrl.pathname\n\n    // デフォルトでスキップするパス\n    const defaultSkipPaths = [\n      '/api/health',\n      '/api/status',\n      '/favicon.ico',\n      '/_next',\n      '/public'\n    ]\n\n    const skipPaths = [...defaultSkipPaths, ...(this.options.skipPaths || [])]\n    \n    return skipPaths.some(path => pathname.startsWith(path))\n  }\n\n  /**\n   * 認証エラーのハンドリング\n   */\n  private handleAuthError(error: GFTDAuthError, req: NextRequest): NextResponse {\n    // カスタムエラーハンドラーがある場合\n    if (this.options.errorHandler) {\n      return this.options.errorHandler(error, req)\n    }\n\n    // デフォルトエラーハンドリング\n    if (req.nextUrl.pathname.startsWith('/api/')) {\n      // API ルートの場合はJSONエラーレスポンス\n      return NextResponse.json(\n        {\n          error: error.message,\n          code: error.code,\n          statusCode: error.statusCode\n        },\n        { status: error.statusCode }\n      )\n    } else {\n      // 通常のページの場合はログインページにリダイレクト\n      const loginUrl = this.options.redirectUrl || '/login'\n      const url = req.nextUrl.clone()\n      url.pathname = loginUrl\n      url.searchParams.set('redirect', req.nextUrl.pathname)\n      \n      return NextResponse.redirect(url)\n    }\n  }\n\n  /**\n   * 認証クライアントを取得\n   */\n  getAuthClient(): GFTDAuthClient {\n    return this.authClient\n  }\n}\n\n/**\n * 認証ミドルウェアファクトリー関数\n */\nexport function createAuthMiddleware(\n  config: GFTDAuthConfig, \n  options?: AuthMiddlewareOptions\n): GFTDAuthMiddleware {\n  return new GFTDAuthMiddleware(config, options)\n}\n\n/**\n * React Hook用の認証チェック\n */\nexport function useAuth(authClient: GFTDAuthClient) {\n  const checkAuth = async (): Promise<boolean> => {\n    try {\n      await authClient.ensureAuthenticated()\n      return true\n    } catch (error) {\n      console.error('Authentication check failed:', error)\n      return false\n    }\n  }\n\n  const login = (redirectUrl?: string): string => {\n    return authClient.generateLoginUrl(redirectUrl)\n  }\n\n  const logout = async (): Promise<void> => {\n    await authClient.logout()\n  }\n\n  const getCurrentUser = () => {\n    return authClient.getCurrentUser()\n  }\n\n  const isAuthenticated = (): boolean => {\n    return authClient.isAuthenticated()\n  }\n\n  return {\n    checkAuth,\n    login,\n    logout,\n    getCurrentUser,\n    isAuthenticated,\n    authRequired: authClient.isAuthRequired()\n  }\n} ","/**\n * @file lib/auth/gftd-auth-client.ts\n * @description GFTD認証システムクライアント\n * @author GFTD Co., Ltd.\n */\n\nimport { GFTDAuthConfig } from '../types/config'\n\n/**\n * 認証トークン情報\n */\nexport interface AuthToken {\n  /** アクセストークン */\n  accessToken: string\n  /** リフレッシュトークン */\n  refreshToken?: string\n  /** 有効期限 (Unix timestamp) */\n  expiresAt: number\n  /** トークンタイプ */\n  tokenType: string\n  /** スコープ */\n  scope: string[]\n}\n\n/**\n * ユーザー情報\n */\nexport interface UserInfo {\n  /** ユーザーID */\n  id: string\n  /** ユーザー名 */\n  username: string\n  /** メールアドレス */\n  email: string\n  /** ロール */\n  role: string[]\n  /** GitLab組織ID (user_org_id = gitlab organization_id) */\n  user_org_id?: string\n  /** 認証済みかどうか */\n  authenticated: boolean\n}\n\n/**\n * 認証エラー\n */\nexport class GFTDAuthError extends Error {\n  constructor(\n    message: string,\n    public statusCode: number = 401,\n    public code: string = 'AUTH_ERROR'\n  ) {\n    super(message)\n    this.name = 'GFTDAuthError'\n  }\n}\n\n/**\n * GFTD認証クライアント\n */\nexport class GFTDAuthClient {\n  private config: GFTDAuthConfig\n  private currentToken?: AuthToken\n  private userInfo?: UserInfo\n\n  constructor(config: GFTDAuthConfig) {\n    this.config = config\n  }\n\n  /**\n   * 認証が必須かどうか\n   */\n  isAuthRequired(): boolean {\n    return this.config.required !== false\n  }\n\n  /**\n   * 認証済みかどうか\n   */\n  isAuthenticated(): boolean {\n    return !!this.currentToken && this.isTokenValid(this.currentToken)\n  }\n\n  /**\n   * トークンが有効かどうか\n   */\n  private isTokenValid(token: AuthToken): boolean {\n    return Date.now() < token.expiresAt * 1000\n  }\n\n  /**\n   * 現在のユーザー情報を取得\n   */\n  getCurrentUser(): UserInfo | null {\n    return this.userInfo || null\n  }\n\n  /**\n   * 認証トークンを設定\n   */\n  setToken(token: AuthToken): void {\n    this.currentToken = token\n  }\n\n  /**\n   * 認証トークンを取得\n   */\n  getToken(): AuthToken | null {\n    return this.currentToken || null\n  }\n\n  /**\n   * ログインURLを生成\n   */\n  generateLoginUrl(redirectUrl?: string): string {\n    const authUrl = this.config.authUrl || 'https://auth.gftd.ai'\n    const params = new URLSearchParams({\n      response_type: 'code',\n      client_id: this.config.apiKey || '',\n      redirect_uri: redirectUrl || this.config.redirectUrl || '',\n      scope: this.config.scopes?.join(' ') || 'read write',\n      state: this.generateState()\n    })\n\n    return `${authUrl}/oauth/authorize?${params.toString()}`\n  }\n\n  /**\n   * 認証コードからトークンを取得\n   */\n  async exchangeCodeForToken(code: string, redirectUri?: string): Promise<AuthToken> {\n    if (!this.config.authUrl) {\n      throw new GFTDAuthError('Auth URL not configured')\n    }\n\n    try {\n      const response = await fetch(`${this.config.authUrl}/oauth/token`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          grant_type: 'authorization_code',\n          code,\n          client_id: this.config.apiKey,\n          redirect_uri: redirectUri || this.config.redirectUrl\n        })\n      })\n\n      if (!response.ok) {\n        throw new GFTDAuthError(`Authentication failed: ${response.statusText}`, response.status)\n      }\n\n      const tokenData = await response.json()\n      const token: AuthToken = {\n        accessToken: tokenData.access_token,\n        refreshToken: tokenData.refresh_token,\n        expiresAt: Date.now() / 1000 + (tokenData.expires_in || this.config.tokenExpiry || 3600),\n        tokenType: tokenData.token_type || 'Bearer',\n        scope: tokenData.scope ? tokenData.scope.split(' ') : this.config.scopes || []\n      }\n\n      this.setToken(token)\n      await this.loadUserInfo()\n\n      return token\n    } catch (error) {\n      if (error instanceof GFTDAuthError) {\n        throw error\n      }\n      throw new GFTDAuthError(`Token exchange failed: ${error}`)\n    }\n  }\n\n  /**\n   * トークンを更新\n   */\n  async refreshToken(): Promise<AuthToken> {\n    if (!this.currentToken?.refreshToken) {\n      throw new GFTDAuthError('No refresh token available')\n    }\n\n    if (!this.config.authUrl) {\n      throw new GFTDAuthError('Auth URL not configured')\n    }\n\n    try {\n      const response = await fetch(`${this.config.authUrl}/oauth/token`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Accept': 'application/json'\n        },\n        body: JSON.stringify({\n          grant_type: 'refresh_token',\n          refresh_token: this.currentToken.refreshToken,\n          client_id: this.config.apiKey\n        })\n      })\n\n      if (!response.ok) {\n        throw new GFTDAuthError(`Token refresh failed: ${response.statusText}`, response.status)\n      }\n\n      const tokenData = await response.json()\n      const newToken: AuthToken = {\n        accessToken: tokenData.access_token,\n        refreshToken: tokenData.refresh_token || this.currentToken.refreshToken,\n        expiresAt: Date.now() / 1000 + (tokenData.expires_in || this.config.tokenExpiry || 3600),\n        tokenType: tokenData.token_type || 'Bearer',\n        scope: tokenData.scope ? tokenData.scope.split(' ') : this.currentToken.scope\n      }\n\n      this.setToken(newToken)\n      return newToken\n    } catch (error) {\n      if (error instanceof GFTDAuthError) {\n        throw error\n      }\n      throw new GFTDAuthError(`Token refresh failed: ${error}`)\n    }\n  }\n\n  /**\n   * ユーザー情報を読み込み\n   */\n  async loadUserInfo(): Promise<UserInfo> {\n    if (!this.currentToken) {\n      throw new GFTDAuthError('No authentication token available')\n    }\n\n    if (!this.config.authUrl) {\n      throw new GFTDAuthError('Auth URL not configured')\n    }\n\n    try {\n      const response = await fetch(`${this.config.authUrl}/api/user`, {\n        headers: {\n          'Authorization': `${this.currentToken.tokenType} ${this.currentToken.accessToken}`,\n          'Accept': 'application/json'\n        }\n      })\n\n      if (!response.ok) {\n        throw new GFTDAuthError(`Failed to load user info: ${response.statusText}`, response.status)\n      }\n\n      const userData = await response.json()\n      this.userInfo = {\n        id: userData.id,\n        username: userData.username,\n        email: userData.email,\n        role: userData.roles || [],\n        user_org_id: userData.organization_id,\n        authenticated: true\n      }\n\n      return this.userInfo\n    } catch (error) {\n      if (error instanceof GFTDAuthError) {\n        throw error\n      }\n      throw new GFTDAuthError(`Failed to load user info: ${error}`)\n    }\n  }\n\n  /**\n   * ログアウト\n   */\n  async logout(): Promise<void> {\n    if (this.currentToken && this.config.authUrl) {\n      try {\n        await fetch(`${this.config.authUrl}/oauth/revoke`, {\n          method: 'POST',\n          headers: {\n            'Authorization': `${this.currentToken.tokenType} ${this.currentToken.accessToken}`,\n            'Content-Type': 'application/json'\n          },\n          body: JSON.stringify({\n            token: this.currentToken.accessToken\n          })\n        })\n      } catch (error) {\n        console.warn('Failed to revoke token:', error)\n      }\n    }\n\n    this.currentToken = undefined\n    this.userInfo = undefined\n  }\n\n  /**\n   * 認証が必要な場合のチェック\n   */\n  async ensureAuthenticated(): Promise<void> {\n    if (!this.isAuthRequired()) {\n      return\n    }\n\n    if (!this.isAuthenticated()) {\n      throw new GFTDAuthError('Authentication required', 401, 'AUTH_REQUIRED')\n    }\n\n    // トークンの自動更新\n    if (this.config.autoRefresh && this.currentToken && this.needsRefresh()) {\n      try {\n        await this.refreshToken()\n      } catch (error) {\n        throw new GFTDAuthError('Failed to refresh authentication token', 401, 'TOKEN_REFRESH_FAILED')\n      }\n    }\n  }\n\n  /**\n   * トークンの更新が必要かどうか\n   */\n  private needsRefresh(): boolean {\n    if (!this.currentToken) return false\n    // 有効期限の5分前に更新\n    const refreshThreshold = this.currentToken.expiresAt - 300\n    return Date.now() / 1000 > refreshThreshold\n  }\n\n  /**\n   * 状態文字列を生成\n   */\n  private generateState(): string {\n    return Math.random().toString(36).substring(2, 15) + \n           Math.random().toString(36).substring(2, 15)\n  }\n\n  /**\n   * Authorizationヘッダーを取得\n   */\n  getAuthHeader(): string | null {\n    if (!this.currentToken) return null\n    return `${this.currentToken.tokenType} ${this.currentToken.accessToken}`\n  }\n} ","/**\n * @file lib/embedding/vector-store.ts\n * @description usearchを使用したベクトルストアの実装\n * @author GFTD Co., Ltd.\n */\n\nimport { Index } from 'usearch';\nimport { Document } from '@langchain/core/documents';\nimport LightningFS from '@isomorphic-git/lightning-fs';\nimport { randomUUID } from 'crypto';\n\n/**\n * ベクトルストアエントリー\n */\nexport interface VectorStoreEntry {\n  id: string;\n  vector: number[];\n  document: Document;\n  timestamp: number;\n}\n\n/**\n * 検索結果\n */\nexport interface SearchResult {\n  document: Document;\n  score: number;\n  id: string;\n}\n\n/**\n * VectorStoreクラス\n * usearchを使用した高速ベクトル検索\n */\nexport class VectorStore {\n  private index: Index;\n  private fs: LightningFS;\n  private entries: Map<string, VectorStoreEntry>;\n  private dimensions: number;\n  private isInitialized = false;\n\n  constructor(fs: LightningFS, dimensions: number = 384) {\n    this.fs = fs;\n    this.dimensions = dimensions;\n    this.entries = new Map();\n    \n    // usearchインデックスの初期化（基本的なコンストラクタ）\n    this.index = new Index(this.dimensions);\n  }\n\n  /**\n   * ベクトルストアの初期化\n   */\n  async initialize(): Promise<void> {\n    if (this.isInitialized) {\n      return;\n    }\n\n    try {\n      // ファイルシステムの初期化\n      await this.initializeFileSystem();\n      \n      this.isInitialized = true;\n    } catch (error) {\n      console.error('Failed to initialize VectorStore:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ファイルシステムの初期化\n   */\n  private async initializeFileSystem(): Promise<void> {\n    try {\n      const dirs = ['vectors', 'metadata'];\n      \n      for (const dir of dirs) {\n        try {\n          await this.fs.promises.mkdir(`/${dir}`);\n        } catch (error) {\n          // ディレクトリが既に存在する場合は無視\n          if ((error as any).code !== 'EEXIST') {\n            throw error;\n          }\n        }\n      }\n    } catch (error) {\n      console.error('Failed to initialize file system:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ベクトルとドキュメントを追加\n   * @param vector ベクトル\n   * @param document ドキュメント\n   * @returns エントリーID\n   */\n  async add(vector: number[], document: Document): Promise<string> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const id = randomUUID();\n      const entry: VectorStoreEntry = {\n        id,\n        vector,\n        document,\n        timestamp: Date.now(),\n      };\n\n      // usearchインデックスに追加\n      this.index.add(BigInt(this.entries.size), new Float32Array(vector));\n\n      // エントリーを保存\n      this.entries.set(id, entry);\n\n      // ファイルシステムにメタデータを保存\n      await this.saveEntry(entry);\n\n      return id;\n    } catch (error) {\n      console.error('Failed to add vector:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * ベクトル検索\n   * @param query クエリベクトル\n   * @param k 返す結果数\n   * @returns 検索結果\n   */\n  async search(query: number[], k: number = 5): Promise<SearchResult[]> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const queryVector = new Float32Array(query);\n      const results = this.index.search(queryVector, k);\n\n      const searchResults: SearchResult[] = [];\n      const entriesArray = Array.from(this.entries.values());\n\n      for (let i = 0; i < results.keys.length; i++) {\n        const index = Number(results.keys[i]);\n        const score = results.distances[i];\n\n        if (index < entriesArray.length) {\n          const entry = entriesArray[index];\n          searchResults.push({\n            document: entry.document,\n            score: 1 - score, // cosine similarityに変換\n            id: entry.id,\n          });\n        }\n      }\n\n      return searchResults;\n    } catch (error) {\n      console.error('Failed to search vectors:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * エントリーをファイルシステムに保存\n   */\n  private async saveEntry(entry: VectorStoreEntry): Promise<void> {\n    try {\n      const filename = `/metadata/${entry.id}.json`;\n      const data = JSON.stringify(entry, null, 2);\n      \n      await this.fs.promises.writeFile(filename, data, 'utf8');\n    } catch (error) {\n      console.error('Failed to save entry:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * インデックスをファイルに保存\n   */\n  async save(filename: string): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      // usearchインデックスを保存\n      this.index.save(filename);\n\n      // エントリーメタデータを保存\n      const entriesData = JSON.stringify(Array.from(this.entries.entries()), null, 2);\n      const entriesFilename = filename.replace('.bin', '_entries.json');\n      \n      await this.fs.promises.writeFile(entriesFilename, entriesData, 'utf8');\n    } catch (error) {\n      console.error('Failed to save index:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * インデックスをファイルから読み込み\n   */\n  async load(filename: string): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      // usearchインデックスを読み込み\n      this.index.load(filename);\n\n      // エントリーメタデータを読み込み\n      const entriesFilename = filename.replace('.bin', '_entries.json');\n      \n      try {\n        const entriesData = await this.fs.promises.readFile(entriesFilename, 'utf8');\n        const entriesArray = JSON.parse(entriesData);\n        \n        this.entries.clear();\n        for (const [id, entry] of entriesArray) {\n          this.entries.set(id, entry);\n        }\n      } catch (error) {\n        console.warn('Failed to load entries metadata:', error);\n      }\n    } catch (error) {\n      console.error('Failed to load index:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * インデックスサイズを取得\n   */\n  size(): number {\n    return this.index.size();\n  }\n\n  /**\n   * エントリーをIDで取得\n   */\n  getEntry(id: string): VectorStoreEntry | undefined {\n    return this.entries.get(id);\n  }\n\n  /**\n   * エントリーをIDで削除\n   */\n  async remove(id: string): Promise<boolean> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      const entry = this.entries.get(id);\n      if (!entry) {\n        return false;\n      }\n\n      // エントリーを削除\n      this.entries.delete(id);\n\n      // ファイルシステムからメタデータを削除\n      try {\n        await this.fs.promises.unlink(`/metadata/${id}.json`);\n      } catch (error) {\n        console.warn('Failed to remove entry metadata:', error);\n      }\n\n      return true;\n    } catch (error) {\n      console.error('Failed to remove entry:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * すべてのエントリーをクリア\n   */\n  async clear(): Promise<void> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    try {\n      // インデックスをクリア\n      this.index = new Index(this.dimensions);\n\n      // エントリーをクリア\n      this.entries.clear();\n\n      // ファイルシステムのメタデータをクリア\n      try {\n        const files = await this.fs.promises.readdir('/metadata');\n        for (const file of files) {\n          await this.fs.promises.unlink(`/metadata/${file}`);\n        }\n      } catch (error) {\n        console.warn('Failed to clear metadata files:', error);\n      }\n    } catch (error) {\n      console.error('Failed to clear vector store:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * リソースのクリーンアップ\n   */\n  async cleanup(): Promise<void> {\n    try {\n      // 特に必要なクリーンアップ処理はないが、\n      // 将来的にリソースの解放が必要な場合のために用意\n      this.isInitialized = false;\n    } catch (error) {\n      console.error('Failed to cleanup VectorStore:', error);\n      throw error;\n    }\n  }\n}\n\nexport default VectorStore; ","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n","/**\n * Actor SDK エクスポート\n * Actor v3 プロセス代数 & LangChain.js互換性対応\n * https://actor.gftd.ai/api/v3/actor\n */\n\n// === Actor v3 Types ===\nexport * from \"./types/actor-v3\"\n\n// === Core Types (共通) ===\nexport * from \"./types/config\"\nexport * from \"./types/session\"\nexport * from \"./types/chat-git\"\n\n// === LangChain Types (v3と重複しない型のみ) ===\nexport type {\n  MessageLike,\n  HumanMessage,\n  AIMessage,\n  SystemMessage,\n  ToolMessage,\n  ToolCall,\n  StructuredTool,\n  RunnableInput,\n  InvokeRequest,\n  StreamRequest,\n  BatchRequest,\n  InvokeResponse,\n  BatchResponse,\n  ErrorResponse\n} from \"./types/langchain\"\n\n// === Actor v3 API Client ===\nexport * from \"./api/actor-v3-client\"\n\n// === Chat API Client ===\nexport * from \"./api/chat-client\"\n\n// === Actor v3 React Hooks ===\nexport * from \"../hooks/use-actor-v3\"\n\n// === Chat React Hooks ===\nexport * from \"../hooks/use-gftd-chat\"\n\n// === Configuration ===\n// export * from \"./actor-sdk-config\" // TODO: v3 migration - disabled temporarily\nexport * from \"./config/sdk-config-manager\"\n\n// === Git Integration (共通) ===\nexport * from \"./git/actor-git-manager\"\nexport * from \"./git/actor-repository-manager\"\nexport * from \"./git/chat-git-manager\"\nexport * from \"./git/chat-history-utils\"\nexport * from \"./git/git-embedding-sdk\"\nexport * from \"./git/git-fs\"\nexport * from \"./git/git-vector-store\"\nexport * from \"./git/gitlab-client\"\n\n// === Authentication (共通) ===\nexport * from \"./auth/auth-middleware\"\nexport * from \"./auth/gftd-auth-client\"\n\n// === Embedding & Vector Store (共通) ===\nexport type { EmbeddingConfig as ActorEmbeddingConfig } from \"./embedding\"\nexport * from \"./embedding/vector-store\"\n\n// === Utilities (共通) ===\nexport * from \"./utils\"\nexport * from \"./utils/uuid\"\n\n// === Configuration Constants ===\nexport const SDK_VERSION = \"3.0.0\"\nexport const API_VERSION = \"v3\"\nexport const PROCESS_ALGEBRA_ENABLED = true\n\n/**\n * Actor v3 機能フラグ\n */\nexport const Features = {\n  PROCESS_ALGEBRA: true,\n  LANGCHAIN_COMPATIBILITY: true,\n  FORMAL_VERIFICATION: true,\n  DEADLOCK_DETECTION: true,\n  LIVELOCK_DETECTION: true,\n  COMMUNICATION_TOPOLOGY: true,\n  PERFORMANCE_METRICS: true\n} as const\n\n/**\n * Process Algebra Support\n */\nexport const ProcessAlgebra = {\n  NOTATIONS: ['CCS', 'π-calculus', 'ACP'] as const,\n  ANALYSIS_FEATURES: ['deadlock_detection', 'livelock_detection', 'reachability_analysis'] as const,\n  COMMUNICATION_PATTERNS: ['send_receive', 'parallel_composition', 'choice', 'recursion'] as const\n} as const\n\n/**\n * LangChain.js 互換性サポート\n */\nexport const LangChainCompatibility = {\n  RUNNABLE_INTERFACE: true,\n  INVOKE_METHOD: true,\n  STREAM_METHOD: true,\n  BATCH_METHOD: true,\n  PIPE_METHOD: true,\n  FALLBACK_METHOD: true\n} as const "],"mappings":"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","names":["actors","totalCount","useState","useCallback","useEffect","useState","useEffect","error","useCallback","Index","randomUUID"]}