{"version":3,"sources":["../src/index.ts","../src/WorkspaceFileSystem.ts","../src/WorkspaceDatabase.ts","../src/import-export/WorkspaceImporter.ts","../src/credentials/SourceConfigBuilder.ts","../src/import-export/WorkspaceExporter.ts","../src/credentials/CredentialManager.ts"],"sourcesContent":["// Main exports\nexport { WorkspaceFileSystem } from \"./WorkspaceFileSystem\";\nexport { WorkspaceDatabase } from \"./WorkspaceDatabase\";\n\n// Types\nexport * from \"./types\";\n\n// Provider interfaces\nexport type { \n  SourceProvider,\n  PersistableSourceProvider,\n  ConvertibleSourceProvider,\n  ProviderRegistry\n} from \"./interfaces/SourceProvider\";\n\n// Import/Export\nexport * from \"./import-export\";\n\n// Credential Management\nexport { \n  CredentialManager, \n  BrowserCredentialProvider, \n  EnvCredentialProvider,\n  InteractiveCredentialProvider\n} from \"./credentials/CredentialManager\";\nexport { SourceConfigBuilder } from \"./credentials/SourceConfigBuilder\";\n\n// Source loaders removed - now using provider pattern\n\n// Re-export core types for convenience\nexport type {\n  IFileSystem,\n  IReactiveFileSystem,\n  FileEntry,\n  FileStat,\n  FileMetadata,\n  FSEvent,\n  Disposable,\n  FileSystemEventPayloads,\n} from \"@firesystem/core\";\n\n// Re-export values\nexport { FileSystemEvents } from \"@firesystem/core\";\n\n// Test suite for providers - removed from main export to avoid vitest dependency\n","import {\n  IReactiveFileSystem,\n  FileEntry,\n  FileStat,\n  FileSystemEventPayloads,\n  FileSystemEvents,\n  FSEvent,\n  Disposable,\n  TypedEventEmitter,\n  withEvents,\n} from \"@firesystem/core\";\nimport type {\n  Project,\n  ProjectConfig,\n  ProjectSource,\n  ProjectState,\n  WorkspaceConfig,\n  WorkspaceSettings,\n  WorkspaceEventPayloads,\n  WorkspaceStats,\n  ProjectMetrics,\n  SyncOptions,\n  ProjectDiff,\n  OptimizationReport,\n} from \"./types\";\n\n/**\n * Options for deleting a project\n */\nexport interface DeleteProjectOptions {\n  deleteData?: boolean;\n  skipConfirmation?: boolean;\n}\nimport type { SourceProvider, ProviderRegistry } from \"./interfaces/SourceProvider\";\n// Source loaders removed - will use provider pattern instead\nimport { WorkspaceDatabase, StoredProject, WorkspaceState } from \"./WorkspaceDatabase\";\nimport { WorkspaceImporter } from \"./import-export/WorkspaceImporter\";\nimport { WorkspaceExporter, ExportOptions } from \"./import-export/WorkspaceExporter\";\nimport { \n  CredentialManager, \n  BrowserCredentialProvider, \n  EnvCredentialProvider \n} from \"./credentials/CredentialManager\";\nimport { SourceConfigBuilder } from \"./credentials/SourceConfigBuilder\";\n\n/**\n * Multi-project workspace manager for Firesystem\n */\nexport class WorkspaceFileSystem implements IReactiveFileSystem, ProviderRegistry {\n  private projects = new Map<string, Project>();\n  private activeProjectId: string | null = null;\n  private providers = new Map<string, SourceProvider>();\n  private database: WorkspaceDatabase;\n  private credentialManager: CredentialManager;\n  private recentProjectIds: string[] = [];\n  private autoDisableTimers = new Map<string, NodeJS.Timeout>();\n  private settings: WorkspaceSettings = {\n    maxActiveProjects: 10,\n    autoDisableAfter: 30 * 60 * 1000, // 30 minutes\n    keepFocusedActive: true,\n    autoSave: false,\n    autoSaveInterval: 60000, // 1 minute\n    memoryThreshold: 500 * 1024 * 1024, // 500MB\n  };\n\n  /**\n   * Event system for workspace events\n   */\n  public readonly events = new TypedEventEmitter<WorkspaceEventPayloads>();\n\n  constructor(config?: WorkspaceConfig) {\n    // Initialize database\n    this.database = new WorkspaceDatabase();\n    \n    // Initialize credential manager\n    this.credentialManager = new CredentialManager();\n    this.setupCredentialProviders();\n    \n    // Providers are now registered by the user, not built-in\n\n    // Apply settings if provided\n    if (config?.settings) {\n      this.settings = { ...this.settings, ...config.settings };\n    }\n  }\n\n  /**\n   * Initialize workspace with optional config\n   */\n  async initialize(config?: WorkspaceConfig): Promise<void> {\n    this.events.emit(\"workspace:initializing\", undefined);\n\n    // Open database\n    await this.database.open();\n\n    // Try to restore previous state\n    const restored = await this.restoreWorkspaceState();\n\n    if (config) {\n      // Load projects from config\n      for (const projectConfig of config.projects) {\n        await this.loadProject(projectConfig);\n      }\n\n      // Set active project\n      if (config.activeProjectId) {\n        await this.setActiveProject(config.activeProjectId);\n      }\n    }\n    // No default project creation - workspace starts empty\n\n    this.events.emit(\"workspace:initialized\", {\n      projectCount: this.projects.size,\n    });\n  }\n\n  /**\n   * Load a project into the workspace\n   */\n  async loadProject(config: ProjectConfig): Promise<Project> {\n    this.events.emit(\"project:loading\", { projectId: config.id });\n\n    try {\n      // Check if project already exists\n      if (this.projects.has(config.id)) {\n        throw new Error(`Project ${config.id} already loaded`);\n      }\n\n      // Get provider for this source type first\n      const provider = this.getProvider(config.source.type);\n      if (!provider) {\n        throw new Error(`No provider registered for type: ${config.source.type}`);\n      }\n\n      // Validate configuration using provider's validator\n      if (provider.validateConfiguration) {\n        const validation = await provider.validateConfiguration(config.source.config);\n        if (!validation.valid) {\n          throw new Error(`Invalid source config: ${validation.errors?.join(\", \") || \"Validation failed\"}`);\n        }\n      }\n      // Note: If provider doesn't have validateConfiguration, we trust it can handle any config\n\n      // Get credentials for this source\n      const credentials = await this.credentialManager.getCredentials(config.id, config.source);\n\n      // Merge credentials with source config\n      const sourceWithCredentials = {\n        ...config.source,\n        config: {\n          ...config.source.config,\n          ...credentials\n        }\n      };\n\n      // Create file system using provider\n      const fs = await provider.createFileSystem(sourceWithCredentials.config);\n\n      // Create project\n      const project: Project = {\n        id: config.id,\n        name: config.name,\n        source: config.source,\n        fs,\n        metadata: {\n          created: new Date(),\n          modified: new Date(),\n          lastOpened: new Date(),\n          ...config.metadata,\n        },\n        state: \"loaded\",\n        lastAccessed: new Date(),\n        accessCount: 0,\n        memoryUsage: await this.estimateProjectMemoryUsage(fs),\n      };\n\n      // Setup event forwarding\n      this.setupEventForwarding(project);\n\n      // Store project\n      this.projects.set(project.id, project);\n\n      // Save to database\n      const storedProject: StoredProject = {\n        id: project.id,\n        name: project.name,\n        source: project.source,\n        metadata: project.metadata,\n        lastAccessed: new Date()\n      };\n      await this.database.saveProject(storedProject);\n\n      // Emit loaded event\n      this.events.emit(\"project:loaded\", { project });\n\n      // If no active project, set this as active\n      if (!this.activeProjectId) {\n        await this.setActiveProject(project.id);\n      }\n\n      return project;\n    } catch (error) {\n      this.events.emit(\"project:error\", {\n        projectId: config.id,\n        error: error as Error,\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Unload a project from the workspace\n   */\n  async unloadProject(projectId: string): Promise<void> {\n    const project = this.projects.get(projectId);\n    if (!project) {\n      throw new Error(`Project ${projectId} not found`);\n    }\n\n    this.events.emit(\"project:unloading\", { projectId });\n\n    // If this is the active project, deactivate it\n    if (this.activeProjectId === projectId) {\n      this.activeProjectId = null;\n      this.events.emit(\"project:deactivated\", { projectId });\n    }\n\n    // Clean up event listeners\n    if (project.fs.events) {\n      // Remove all listeners (implementation would need cleanup method)\n    }\n\n    // Remove from projects map\n    this.projects.delete(projectId);\n\n    this.events.emit(\"project:unloaded\", { projectId });\n  }\n\n  /**\n   * Get a project by ID\n   */\n  getProject(projectId: string): Project | null {\n    return this.projects.get(projectId) || null;\n  }\n\n  /**\n   * Get all loaded projects\n   */\n  getProjects(): Project[] {\n    return Array.from(this.projects.values());\n  }\n\n  /**\n   * Set the active project\n   */\n  async setActiveProject(projectId: string): Promise<void> {\n    const project = this.projects.get(projectId);\n    if (!project) {\n      throw new Error(`Project ${projectId} not found`);\n    }\n\n    const previousId = this.activeProjectId;\n    this.activeProjectId = projectId;\n\n    // Update recent projects\n    this.recentProjectIds = [projectId, ...this.recentProjectIds.filter(id => id !== projectId)].slice(0, 10);\n\n    // Update database\n    await this.database.touchProject(projectId);\n    await this.saveWorkspaceState();\n\n    this.events.emit(\"project:activated\", { projectId, previousId: previousId || undefined });\n  }\n\n  /**\n   * Get the active project\n   */\n  getActiveProject(): Project | null {\n    if (!this.activeProjectId) return null;\n    return this.projects.get(this.activeProjectId) || null;\n  }\n\n  /**\n   * Disable a project (unload but keep configuration)\n   */\n  async disableProject(projectId: string): Promise<void> {\n    const project = this.projects.get(projectId);\n    if (!project) return;\n\n    // Don't disable the focused project if configured\n    if (this.settings.keepFocusedActive && this.activeProjectId === projectId) {\n      throw new Error(\"Cannot disable the focused project when keepFocusedActive is true\");\n    }\n\n    this.events.emit(\"project:disabling\", { projectId });\n\n    // Store provider info before unloading\n    const provider = this.getProvider(project.source.type);\n    const hasLocalData = provider?.hasLocalData?.() || false;\n\n    // Check if this is the active project\n    const wasActive = this.activeProjectId === projectId;\n\n    // 1. Just unload from memory\n    await this.unloadProject(projectId);\n\n    // 2. Mark as disabled in database\n    await this.database.updateProjectState(projectId, { \n      enabled: false,\n      disabledAt: new Date()\n    });\n\n    // 3. If this was the active project, switch to another one\n    if (wasActive) {\n      const remainingProjects = Array.from(this.projects.keys());\n      if (remainingProjects.length > 0) {\n        await this.setActiveProject(remainingProjects[0]);\n      }\n    }\n\n    // 4. Emit event with useful information\n    this.events.emit(\"project:disabled\", { \n      projectId,\n      hasLocalData,\n      reason: \"manual\"\n    });\n  }\n\n  /**\n   * Enable a disabled project\n   */\n  async enableProject(projectId: string): Promise<void> {\n    // If project is already enabled, return silently\n    if (this.projects.has(projectId)) {\n      return;\n    }\n    \n    const storedProject = await this.database.getProject(projectId);\n    if (!storedProject) {\n      throw new Error(`Project ${projectId} not found in database`);\n    }\n\n    // 1. Recreate filesystem via provider\n    const provider = this.getProvider(storedProject.source.type);\n    if (!provider) {\n      throw new Error(`Provider ${storedProject.source.type} not registered`);\n    }\n\n    const fs = await provider.createFileSystem(storedProject.source.config);\n\n    // 2. Reload in memory\n    const project: Project = {\n      id: storedProject.id,\n      name: storedProject.name,\n      source: storedProject.source,\n      fs,\n      metadata: storedProject.metadata || {},\n      state: \"loaded\" as ProjectState,\n      lastAccessed: new Date(),\n      accessCount: 0,\n      memoryUsage: 0\n    };\n\n    this.projects.set(projectId, project);\n\n    // 3. Update state in database\n    await this.database.updateProjectState(projectId, { \n      enabled: true,\n      enabledAt: new Date()\n    });\n\n    this.events.emit(\"project:enabled\", { projectId });\n  }\n\n  /**\n   * Batch disable projects\n   */\n  async disableProjects(projectIds: string[]): Promise<void> {\n    for (const projectId of projectIds) {\n      await this.disableProject(projectId);\n    }\n  }\n\n  /**\n   * Batch enable projects\n   */\n  async enableProjects(projectIds: string[]): Promise<void> {\n    for (const projectId of projectIds) {\n      await this.enableProject(projectId);\n    }\n  }\n\n  /**\n   * Get disabled projects\n   */\n  async getDisabledProjects(): Promise<StoredProject[]> {\n    const allProjects = await this.database.listProjects();\n    return allProjects.filter(p => p.enabled === false);\n  }\n\n  /**\n   * Check if project is enabled\n   */\n  isProjectEnabled(projectId: string): boolean {\n    return this.projects.has(projectId);\n  }\n\n  /**\n   * Copy files between projects\n   */\n  async copyFiles(\n    sourceId: string,\n    pattern: string,\n    targetId: string,\n    targetPath: string\n  ): Promise<void> {\n    const sourceProject = this.projects.get(sourceId);\n    const targetProject = this.projects.get(targetId);\n\n    if (!sourceProject) throw new Error(`Source project ${sourceId} not found`);\n    if (!targetProject) throw new Error(`Target project ${targetId} not found`);\n\n    const files = await sourceProject.fs.glob(pattern);\n    let copied = 0;\n\n    for (const file of files) {\n      const stat = await sourceProject.fs.stat(file);\n      if (stat.type === \"file\") {\n        const content = await sourceProject.fs.readFile(file);\n        const targetFilePath = (targetPath + file).replace(/\\/+/g, '/');\n        await targetProject.fs.writeFile(targetFilePath, content.content, content.metadata);\n        copied++;\n      }\n    }\n\n    this.events.emit(\"project:files-copied\", { \n      sourceId, \n      targetId, \n      fileCount: copied \n    });\n  }\n\n  /**\n   * Sync projects\n   */\n  async syncProjects(\n    sourceId: string,\n    targetId: string,\n    options: SyncOptions = {}\n  ): Promise<void> {\n    const sourceProject = this.projects.get(sourceId);\n    const targetProject = this.projects.get(targetId);\n\n    if (!sourceProject) throw new Error(`Source project ${sourceId} not found`);\n    if (!targetProject) throw new Error(`Target project ${targetId} not found`);\n\n    const files = await sourceProject.fs.glob(\"**/*\");\n    const total = files.length;\n    let copied = 0;\n\n    for (const file of files) {\n      if (options.filter && !options.filter(file)) continue;\n\n      const stat = await sourceProject.fs.stat(file);\n      if (stat.type === \"file\") {\n        const exists = await targetProject.fs.exists(file);\n        if (!exists || options.overwrite) {\n          const content = await sourceProject.fs.readFile(file);\n          await targetProject.fs.writeFile(file, content.content, content.metadata);\n          copied++;\n          \n          if (options.progress) {\n            options.progress(copied, total);\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Compare projects\n   */\n  async compareProjects(projectId1: string, projectId2: string): Promise<ProjectDiff> {\n    const project1 = this.projects.get(projectId1);\n    const project2 = this.projects.get(projectId2);\n\n    if (!project1) throw new Error(`Project ${projectId1} not found`);\n    if (!project2) throw new Error(`Project ${projectId2} not found`);\n\n    const files1 = new Set(await project1.fs.glob(\"**/*\"));\n    const files2 = new Set(await project2.fs.glob(\"**/*\"));\n\n    const diff: ProjectDiff = {\n      added: [],\n      modified: [],\n      deleted: [],\n      unchanged: [],\n    };\n\n    // Files in project2 but not in project1 (added)\n    for (const file of files2) {\n      if (!files1.has(file)) {\n        diff.added.push(file);\n      }\n    }\n\n    // Files in project1 but not in project2 (deleted)\n    for (const file of files1) {\n      if (!files2.has(file)) {\n        diff.deleted.push(file);\n      }\n    }\n\n    // Files in both - check if modified\n    for (const file of files1) {\n      if (files2.has(file)) {\n        const stat1 = await project1.fs.stat(file);\n        const stat2 = await project2.fs.stat(file);\n        \n        if (stat1.type === \"file\" && stat2.type === \"file\") {\n          const content1 = await project1.fs.readFile(file);\n          const content2 = await project2.fs.readFile(file);\n          \n          if (content1.content !== content2.content) {\n            diff.modified.push(file);\n          } else {\n            diff.unchanged.push(file);\n          }\n        }\n      }\n    }\n\n    return diff;\n  }\n\n  /**\n   * Get workspace statistics\n   */\n  async getProjectStats(): Promise<WorkspaceStats> {\n    const allProjects = await this.database.listProjects();\n    const connections: Record<string, number> = {};\n\n    // Count connections by type\n    for (const project of this.projects.values()) {\n      const type = project.source.type;\n      connections[type] = (connections[type] || 0) + 1;\n    }\n\n    // Calculate total memory usage\n    let totalMemory = 0;\n    for (const project of this.projects.values()) {\n      totalMemory += project.memoryUsage || 0;\n    }\n\n    const disabledCount = allProjects.filter(p => p.enabled === false).length;\n\n    return {\n      total: allProjects.length,\n      active: this.projects.size,\n      disabled: disabledCount,\n      focused: this.activeProjectId,\n      memoryUsage: this.formatBytes(totalMemory),\n      connections,\n    };\n  }\n\n  /**\n   * Get project metrics\n   */\n  async getProjectMetrics(projectId: string): Promise<ProjectMetrics> {\n    const project = this.projects.get(projectId);\n    if (!project) throw new Error(`Project ${projectId} not found`);\n\n    const files = await project.fs.glob(\"**/*\");\n    let totalSize = 0;\n    let fileCount = 0;\n    let largestFile = { path: \"\", size: 0 };\n    let lastModified = new Date(0);\n\n    for (const file of files) {\n      const stat = await project.fs.stat(file);\n      if (stat.type === \"file\") {\n        fileCount++;\n        totalSize += stat.size;\n        \n        if (stat.size > largestFile.size) {\n          largestFile = { path: file, size: stat.size };\n        }\n        \n        if (stat.modified > lastModified) {\n          lastModified = stat.modified;\n        }\n      }\n    }\n\n    return {\n      fileCount,\n      totalSize,\n      lastModified,\n      accessCount: project.accessCount,\n      averageFileSize: fileCount > 0 ? Math.round(totalSize / fileCount) : 0,\n      largestFile,\n    };\n  }\n\n  /**\n   * Optimize memory usage\n   */\n  async optimizeMemoryUsage(): Promise<OptimizationReport> {\n    const report: OptimizationReport = {\n      projectsDisabled: [],\n      memoryFreed: 0,\n      connectionsReleased: 0,\n    };\n\n    // Get current memory usage\n    const stats = await this.getProjectStats();\n    const currentMemory = await this.calculateTotalMemoryUsage();\n\n    if (currentMemory < (this.settings.memoryThreshold || Infinity)) {\n      return report; // No optimization needed\n    }\n\n    // Sort projects by last accessed (oldest first)\n    const projectList = Array.from(this.projects.values())\n      .filter(p => p.id !== this.activeProjectId) // Never disable active project\n      .sort((a, b) => a.lastAccessed.getTime() - b.lastAccessed.getTime());\n\n    // Disable projects until under threshold\n    for (const project of projectList) {\n      if (currentMemory - report.memoryFreed < (this.settings.memoryThreshold || Infinity)) {\n        break;\n      }\n\n      const memoryBefore = project.memoryUsage || 0;\n      await this.disableProject(project.id);\n      \n      report.projectsDisabled.push(project.id);\n      report.memoryFreed += memoryBefore;\n      report.connectionsReleased++;\n    }\n\n    return report;\n  }\n\n  /**\n   * Get active project's file system (for proxying)\n   */\n  private getActiveFS(): IReactiveFileSystem {\n    const project = this.getActiveProject();\n    if (!project) {\n      throw new Error(\"No active project\");\n    }\n    \n    // Track access\n    project.lastAccessed = new Date();\n    project.accessCount++;\n    this.resetAutoDisableTimer(project.id);\n    \n    return project.fs;\n  }\n\n  /**\n   * Reset auto-disable timer for a project\n   */\n  private resetAutoDisableTimer(projectId: string): void {\n    // Clear existing timer\n    const existingTimer = this.autoDisableTimers.get(projectId);\n    if (existingTimer) {\n      clearTimeout(existingTimer);\n    }\n\n    // Don't set timer for focused project if configured\n    if (this.settings.keepFocusedActive && this.activeProjectId === projectId) {\n      return;\n    }\n\n    // Set new timer if auto-disable is configured\n    if (this.settings.autoDisableAfter && this.settings.autoDisableAfter > 0) {\n      const timer = setTimeout(() => {\n        this.disableProject(projectId).catch(error => {\n          console.error(`Failed to auto-disable project ${projectId}:`, error);\n        });\n      }, this.settings.autoDisableAfter);\n\n      this.autoDisableTimers.set(projectId, timer);\n    }\n  }\n\n  /**\n   * Estimate project memory usage\n   */\n  private async estimateProjectMemoryUsage(fs: IReactiveFileSystem): Promise<number> {\n    try {\n      // Basic estimation - can be improved based on FS type\n      const size = await fs.size();\n      // Add overhead for metadata and structures (rough estimate)\n      return size * 1.2;\n    } catch {\n      return 0;\n    }\n  }\n\n  /**\n   * Calculate total memory usage\n   */\n  private async calculateTotalMemoryUsage(): Promise<number> {\n    let total = 0;\n    for (const project of this.projects.values()) {\n      total += project.memoryUsage || 0;\n    }\n    return total;\n  }\n\n  /**\n   * Format bytes to human readable\n   */\n  private formatBytes(bytes: number): string {\n    if (bytes === 0) return \"0 B\";\n    const k = 1024;\n    const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n  }\n\n  // Methods registerSourceLoader and getSourceLoader removed\n  // Now using Provider Registry methods above\n\n  /**\n   * Setup credential providers\n   */\n  private setupCredentialProviders(): void {\n    // Register default providers\n    const isNode = typeof window === \"undefined\";\n    \n    if (isNode) {\n      // Node.js environment - use environment variables\n      this.credentialManager.registerProvider(\"s3\", new EnvCredentialProvider());\n      this.credentialManager.registerProvider(\"github\", new EnvCredentialProvider());\n      this.credentialManager.registerProvider(\"api\", new EnvCredentialProvider());\n    } else {\n      // Browser environment - use browser provider\n      const browserProvider = new BrowserCredentialProvider();\n      this.credentialManager.registerProvider(\"s3\", browserProvider);\n      this.credentialManager.registerProvider(\"github\", browserProvider);\n      this.credentialManager.registerProvider(\"api\", browserProvider);\n    }\n  }\n\n  /**\n   * Provider Registry Implementation\n   */\n  registerProvider(provider: SourceProvider): void {\n    this.providers.set(provider.scheme, provider);\n  }\n\n  unregisterProvider(scheme: string): void {\n    this.providers.delete(scheme);\n  }\n\n  getProvider(scheme: string): SourceProvider | undefined {\n    return this.providers.get(scheme);\n  }\n\n  getRegisteredProviders(): SourceProvider[] {\n    return Array.from(this.providers.values());\n  }\n\n  /**\n   * Setup event forwarding from project to workspace\n   */\n  private setupEventForwarding(project: Project): void {\n    if (!project.fs.events) return;\n\n    // Forward file system events with project context\n    const events = [\n      FileSystemEvents.FILE_READING,\n      FileSystemEvents.FILE_READ,\n      FileSystemEvents.FILE_WRITING,\n      FileSystemEvents.FILE_WRITTEN,\n      FileSystemEvents.FILE_DELETING,\n      FileSystemEvents.FILE_DELETED,\n      FileSystemEvents.DIR_CREATING,\n      FileSystemEvents.DIR_CREATED,\n      FileSystemEvents.DIR_DELETING,\n      FileSystemEvents.DIR_DELETED,\n    ];\n\n    events.forEach((event) => {\n      project.fs.events!.on(event, (payload: any) => {\n        // Map to project-specific event\n        const projectEvent =\n          `project:${event.toLowerCase().replace(/_/g, \":\")}` as keyof WorkspaceEventPayloads;\n\n        // Add projectId to payload\n        const enrichedPayload = { projectId: project.id, ...payload };\n\n        // Emit on workspace events\n        (this.events as any).emit(projectEvent, enrichedPayload);\n      });\n    });\n  }\n\n  /**\n   * Convert a project to a different source\n   */\n  async convertProject(\n    projectId: string,\n    targetSource: ProjectSource,\n  ): Promise<void> {\n    const project = this.getProject(projectId);\n    if (!project) {\n      throw new Error(`Project ${projectId} not found`);\n    }\n\n    this.events.emit(\"project:converting\", { projectId, targetSource });\n\n    // Get target provider\n    const provider = this.getProvider(targetSource.type);\n    if (!provider) {\n      throw new Error(`No provider registered for type: ${targetSource.type}`);\n    }\n\n    // Create new file system\n    const newFs = await provider.createFileSystem(targetSource.config);\n\n    // Copy all files\n    const paths = await project.fs.glob(\"**/*\");\n    for (const path of paths) {\n      const stat = await project.fs.stat(path);\n\n      if (stat.type === \"directory\") {\n        // Skip root directory\n        if (path !== \"/\") {\n          await newFs.mkdir(path, true);\n        }\n      } else {\n        const file = await project.fs.readFile(path);\n        await newFs.writeFile(path, file.content, file.metadata);\n      }\n    }\n\n    // Replace project's file system\n    project.fs = newFs;\n    project.source = targetSource;\n\n    // Re-setup event forwarding\n    this.setupEventForwarding(project);\n\n    this.events.emit(\"project:converted\", { projectId, source: targetSource });\n  }\n\n  /**\n   * Convert to IndexedDB (convenience method)\n   */\n  async convertToIndexedDB(projectId: string): Promise<void> {\n    await this.convertProject(projectId, {\n      type: \"indexeddb\",\n      config: {\n        dbName: `firesystem-${projectId}`,\n      },\n    });\n  }\n\n  /**\n   * Export workspace configuration\n   */\n  async export(): Promise<WorkspaceConfig> {\n    const projects: ProjectConfig[] = Array.from(this.projects.values()).map(\n      (p) => ({\n        id: p.id,\n        name: p.name,\n        source: p.source,\n        metadata: p.metadata,\n      }),\n    );\n\n    return {\n      version: \"1.0.0\",\n      projects,\n      activeProjectId: this.activeProjectId || undefined,\n      settings: this.settings,\n    };\n  }\n\n  /**\n   * Import workspace configuration\n   */\n  async import(config: WorkspaceConfig): Promise<void> {\n    // Clear existing workspace\n    await this.clear();\n\n    // Apply settings\n    if (config.settings) {\n      this.settings = { ...this.settings, ...config.settings };\n    }\n\n    // Load projects\n    for (const projectConfig of config.projects) {\n      await this.loadProject(projectConfig);\n    }\n\n    // Set active project\n    if (config.activeProjectId) {\n      this.setActiveProject(config.activeProjectId);\n    }\n  }\n\n  /**\n   * Clear all projects\n   */\n  async clear(): Promise<void> {\n    this.events.emit(\"workspace:clearing\", undefined);\n\n    // Unload all projects\n    const projectIds = Array.from(this.projects.keys());\n    for (const projectId of projectIds) {\n      await this.unloadProject(projectId);\n    }\n\n    // Clear all projects from database\n    const allStoredProjects = await this.database.listProjects();\n    for (const project of allStoredProjects) {\n      await this.database.deleteProject(project.id);\n    }\n\n    this.activeProjectId = null;\n    this.recentProjectIds = [];\n\n    // Clear workspace state\n    await this.saveWorkspaceState();\n\n    this.events.emit(\"workspace:cleared\", undefined);\n  }\n\n  // IReactiveFileSystem implementation (proxy to active project)\n\n  async readFile(path: string): Promise<FileEntry> {\n    return this.getActiveFS().readFile(path);\n  }\n\n  async writeFile(\n    path: string,\n    content: any,\n    metadata?: Record<string, any>,\n  ): Promise<FileEntry> {\n    return this.getActiveFS().writeFile(path, content, metadata);\n  }\n\n  async deleteFile(path: string): Promise<void> {\n    return this.getActiveFS().deleteFile(path);\n  }\n\n  async mkdir(path: string, recursive?: boolean): Promise<FileEntry> {\n    return this.getActiveFS().mkdir(path, recursive);\n  }\n\n  async rmdir(path: string, recursive?: boolean): Promise<void> {\n    return this.getActiveFS().rmdir(path, recursive);\n  }\n\n  async exists(path: string): Promise<boolean> {\n    return this.getActiveFS().exists(path);\n  }\n\n  async stat(path: string): Promise<FileStat> {\n    return this.getActiveFS().stat(path);\n  }\n\n  async readDir(path: string): Promise<FileEntry[]> {\n    return this.getActiveFS().readDir(path);\n  }\n\n  async rename(oldPath: string, newPath: string): Promise<FileEntry> {\n    return this.getActiveFS().rename(oldPath, newPath);\n  }\n\n  async copy(sourcePath: string, targetPath: string): Promise<FileEntry> {\n    return this.getActiveFS().copy(sourcePath, targetPath);\n  }\n\n  async move(sourcePaths: string[], targetPath: string): Promise<void> {\n    return this.getActiveFS().move(sourcePaths, targetPath);\n  }\n\n  async glob(pattern: string): Promise<string[]> {\n    return this.getActiveFS().glob(pattern);\n  }\n\n  watch(path: string, callback: (event: FSEvent) => void): Disposable {\n    return this.getActiveFS().watch(path, callback);\n  }\n\n  watchGlob?(pattern: string, callback: (event: FSEvent) => void): Disposable {\n    const fs = this.getActiveFS();\n    if ('watchGlob' in fs && typeof fs.watchGlob === 'function') {\n      return fs.watchGlob(pattern, callback);\n    }\n    throw new Error('Active file system does not support watchGlob');\n  }\n\n  async size(): Promise<number> {\n    return this.getActiveFS().size();\n  }\n\n  // Delegate permission methods to active FS\n  async canModify(path: string): Promise<boolean> {\n    return this.getActiveFS().canModify(path);\n  }\n\n  async canCreateIn(parentPath: string): Promise<boolean> {\n    return this.getActiveFS().canCreateIn(parentPath);\n  }\n\n  /**\n   * Check if a project exists and can be accessed\n   */\n  private async isProjectAccessible(projectId: string): Promise<boolean> {\n    try {\n      const storedProject = await this.database.getProject(projectId);\n      if (!storedProject) return false;\n\n      // For IndexedDB projects, also check if the database still exists\n      if (storedProject.source.type === \"indexeddb\") {\n        const dbName = storedProject.source.config.dbName;\n        if (dbName) {\n          try {\n            // Check if IndexedDB is available and can list databases\n            if (typeof indexedDB === \"undefined\" || !indexedDB.databases) {\n              // Fallback: assume accessible if we can't check\n              return true;\n            }\n            \n            // Try to access the project's database\n            const databases = await indexedDB.databases();\n            const projectDbExists = databases.some(db => db.name === dbName);\n            return projectDbExists;\n          } catch (error) {\n            console.warn(`Failed to check database existence for project ${projectId}:`, error);\n            // Fallback: assume accessible if we can't check\n            return true;\n          }\n        }\n      }\n\n      // For other project types (memory, api, github, etc), just check if stored\n      return true;\n    } catch (error) {\n      console.warn(`Failed to check project accessibility for ${projectId}:`, error);\n      return false;\n    }\n  }\n\n  // Persistence methods\n\n  /**\n   * Restore workspace state from database\n   */\n  private async restoreWorkspaceState(): Promise<boolean> {\n    try {\n      // Get stored state\n      const state = await this.database.getWorkspaceState();\n      if (!state) return false;\n\n      // Restore settings (but constructor settings take precedence)\n      if (state.settings) {\n        this.settings = { ...state.settings, ...this.settings };\n      }\n\n      // Validate and clean orphaned references\n      let stateChanged = false;\n      \n      // Validate activeProjectId\n      if (state.activeProjectId) {\n        const activeProjectAccessible = await this.isProjectAccessible(state.activeProjectId);\n        if (!activeProjectAccessible) {\n          console.warn(`Removing orphaned activeProjectId: ${state.activeProjectId}`);\n          state.activeProjectId = null;\n          stateChanged = true;\n        }\n      }\n\n      // Validate recentProjectIds\n      if (state.recentProjectIds && state.recentProjectIds.length > 0) {\n        const validRecentIds: string[] = [];\n        for (const projectId of state.recentProjectIds) {\n          const projectAccessible = await this.isProjectAccessible(projectId);\n          if (projectAccessible) {\n            validRecentIds.push(projectId);\n          } else {\n            console.warn(`Removing orphaned recentProjectId: ${projectId}`);\n            stateChanged = true;\n          }\n        }\n        state.recentProjectIds = validRecentIds;\n      }\n\n      // Save cleaned state if any orphaned references were found\n      if (stateChanged) {\n        await this.database.saveWorkspaceState(state);\n        console.info(\"Workspace state cleaned: removed orphaned project references\");\n      }\n\n      // Restore recent projects\n      this.recentProjectIds = state.recentProjectIds || [];\n\n      // Get stored projects\n      const storedProjects = await this.database.listProjects();\n\n      // Load active project if still valid\n      if (state.activeProjectId) {\n        const activeProject = storedProjects.find(p => p.id === state.activeProjectId);\n        if (activeProject) {\n          try {\n            await this.loadProjectFromStored(activeProject);\n            this.activeProjectId = state.activeProjectId;\n          } catch (error) {\n            console.warn(\"Failed to restore active project:\", error);\n            // Remove active project reference if it can't be loaded\n            this.activeProjectId = null;\n            state.activeProjectId = null;\n            await this.database.saveWorkspaceState(state);\n          }\n        }\n      }\n\n      return true;\n    } catch (error) {\n      console.error(\"Failed to restore workspace state:\", error);\n      return false;\n    }\n  }\n\n  /**\n   * Save current workspace state to database\n   */\n  private async saveWorkspaceState(): Promise<void> {\n    const state: WorkspaceState = {\n      id: \"current\",\n      activeProjectId: this.activeProjectId,\n      recentProjectIds: this.recentProjectIds,\n      settings: this.settings\n    };\n\n    await this.database.saveWorkspaceState(state);\n  }\n\n  /**\n   * Load a project from stored configuration\n   */\n  private async loadProjectFromStored(stored: StoredProject): Promise<Project> {\n    const config: ProjectConfig = {\n      id: stored.id,\n      name: stored.name,\n      source: stored.source,\n      metadata: stored.metadata\n    };\n\n    return this.loadProject(config);\n  }\n\n\n  /**\n   * List all registered projects from database\n   */\n  async listStoredProjects(): Promise<StoredProject[]> {\n    return this.database.listProjects();\n  }\n\n  /**\n   * List recent projects\n   */\n  async listRecentProjects(limit = 10): Promise<StoredProject[]> {\n    return this.database.listRecentProjects(limit);\n  }\n\n  /**\n   * Delete a project from workspace and optionally delete its data\n   */\n  async deleteProject(projectId: string, options: DeleteProjectOptions = {}): Promise<void> {\n    const project = this.projects.get(projectId);\n    if (!project && !await this.database.getProject(projectId)) {\n      // Project doesn't exist, just return silently\n      return;\n    }\n\n    // 1. Emit confirmation event if not skipped\n    if (!options.skipConfirmation) {\n      // Create a cancellable event\n      const confirmEvent: any = {\n        projectId,\n        project: project || await this.database.getProject(projectId),\n        cancelled: false\n      };\n      \n      // Emit confirmation event - listeners can set cancelled to true\n      this.events.emit(\"project:delete-confirm\", confirmEvent);\n      \n      // Check if any listener cancelled the deletion\n      if (confirmEvent.cancelled) {\n        return; // Deletion cancelled\n      }\n    }\n\n    // 2. If requested, ask provider to delete data\n    if (options.deleteData) {\n      const projectData = project || await this.database.getProject(projectId);\n      if (projectData) {\n        const provider = this.getProvider(projectData.source.type);\n        \n        // Provider decides what to do based on type\n        if (provider?.deleteProjectData) {\n          try {\n            await provider.deleteProjectData(projectData.source.config);\n          } catch (error) {\n            console.warn(`Failed to delete project data: ${error instanceof Error ? error.message : String(error)}`);\n            // Continue with deletion even if data deletion fails\n          }\n        }\n      }\n    }\n\n    // 3. Unload if loaded\n    if (this.projects.has(projectId)) {\n      await this.unloadProject(projectId);\n    }\n\n    // 4. Remove from database\n    await this.database.deleteProject(projectId);\n\n    // 5. Update state if this was the active project\n    if (this.activeProjectId === projectId) {\n      this.activeProjectId = null;\n      await this.saveWorkspaceState();\n    }\n\n    // 6. Emit deleted event\n    this.events.emit(\"project:deleted\", { \n      projectId, \n      deletedData: options.deleteData || false \n    });\n  }\n\n  /**\n   * Discover existing IndexedDB projects\n   */\n  async discoverIndexedDBProjects(): Promise<ProjectConfig[]> {\n    const dbNames = await this.database.discoverIndexedDBProjects();\n    \n    return dbNames.map(dbName => ({\n      id: `discovered-${dbName}`,\n      name: dbName.replace(/^(firesystem-|@firesystem\\/)/i, \"\"),\n      source: {\n        type: \"indexeddb\",\n        config: { dbName }\n      }\n    }));\n  }\n\n  /**\n   * Import workspace configuration from URL\n   */\n  async importFromUrl(url: string): Promise<void> {\n    this.events.emit(\"workspace:importing\", { source: url });\n\n    try {\n      const config = await WorkspaceImporter.fromJsonUrl(url);\n      await this.importWorkspaceConfig(config);\n\n      this.events.emit(\"workspace:imported\", { source: url });\n    } catch (error) {\n      this.events.emit(\"workspace:import-failed\", { source: url, error });\n      throw error;\n    }\n  }\n\n  /**\n   * Import workspace from GitHub Gist\n   */\n  async importFromGitHubGist(gistId: string, token?: string): Promise<void> {\n    this.events.emit(\"workspace:importing\", { source: `gist:${gistId}` });\n\n    try {\n      const config = await WorkspaceImporter.fromGitHubGist(gistId, token);\n      await this.importWorkspaceConfig(config);\n\n      this.events.emit(\"workspace:imported\", { source: `gist:${gistId}` });\n    } catch (error) {\n      this.events.emit(\"workspace:import-failed\", { source: `gist:${gistId}`, error });\n      throw error;\n    }\n  }\n\n  /**\n   * Import workspace configuration\n   */\n  private async importWorkspaceConfig(config: WorkspaceConfig): Promise<void> {\n    // Apply settings\n    if (config.settings) {\n      this.settings = { ...this.settings, ...config.settings };\n    }\n\n    // Load projects\n    for (const projectConfig of config.projects) {\n      await this.loadProject(projectConfig);\n    }\n\n    // Set active project\n    if (config.activeProjectId) {\n      await this.setActiveProject(config.activeProjectId);\n    }\n\n    // Save state\n    await this.saveWorkspaceState();\n  }\n\n  /**\n   * Export workspace configuration\n   */\n  async exportWorkspace(options: ExportOptions = {}): Promise<any> {\n    const projects = Array.from(this.projects.values());\n    const exportData = await WorkspaceExporter.toJson(\n      projects,\n      this.activeProjectId,\n      this.settings,\n      options\n    );\n\n    return exportData;\n  }\n\n  /**\n   * Export workspace to GitHub Gist\n   */\n  async exportToGitHubGist(options: {\n    token: string;\n    description?: string;\n    public?: boolean;\n    includeFiles?: boolean;\n  }): Promise<string> {\n    const exportData = await this.exportWorkspace({\n      includeFiles: options.includeFiles\n    });\n\n    const gistId = await WorkspaceExporter.toGitHubGist(exportData, options);\n    return gistId;\n  }\n\n  /**\n   * Export workspace to API endpoint\n   */\n  async exportToApi(url: string, options?: {\n    headers?: Record<string, string>;\n    method?: string;\n    includeFiles?: boolean;\n  }): Promise<void> {\n    const exportData = await this.exportWorkspace({\n      includeFiles: options?.includeFiles\n    });\n\n    await WorkspaceExporter.toApi(exportData, url, options);\n  }\n\n  // Credential Management\n\n  /**\n   * Register a custom credential provider\n   */\n  registerCredentialProvider(sourceType: string, provider: any): void {\n    this.credentialManager.registerProvider(sourceType, provider);\n  }\n\n  /**\n   * Get credentials for a project (useful for debugging)\n   */\n  async getProjectCredentials(projectId: string): Promise<any> {\n    const stored = await this.database.getProject(projectId);\n    if (!stored) throw new Error(\"Project not found\");\n    \n    return this.credentialManager.getCredentials(projectId, stored.source);\n  }\n\n  /**\n   * Clear cached credentials\n   */\n  clearCredentialCache(projectId?: string): void {\n    this.credentialManager.clearCache(projectId);\n  }\n\n  // Helper methods for creating projects with common patterns\n\n  /**\n   * Create a new IndexedDB project\n   */\n  async createIndexedDBProject(name: string, dbName?: string): Promise<Project> {\n    const source = SourceConfigBuilder.indexedDB(dbName);\n    const config: ProjectConfig = {\n      id: `idb-${Date.now()}`,\n      name,\n      source\n    };\n\n    return this.loadProject(config);\n  }\n\n  /**\n   * Create a new Memory project\n   */\n  async createMemoryProject(name: string, initialData?: any): Promise<Project> {\n    const source = SourceConfigBuilder.memory(initialData);\n    const config: ProjectConfig = {\n      id: `mem-${Date.now()}`,\n      name,\n      source\n    };\n\n    return this.loadProject(config);\n  }\n\n  /**\n   * Create a new S3 project\n   */\n  async createS3Project(\n    name: string, \n    bucket: string, \n    options?: {\n      prefix?: string;\n      region?: string;\n      credentials?: { accessKeyId: string; secretAccessKey: string };\n    }\n  ): Promise<Project> {\n    const source = SourceConfigBuilder.s3({\n      bucket,\n      prefix: options?.prefix,\n      region: options?.region,\n      credentials: options?.credentials\n    });\n\n    const config: ProjectConfig = {\n      id: `s3-${bucket}-${Date.now()}`,\n      name,\n      source\n    };\n\n    return this.loadProject(config);\n  }\n\n  /**\n   * Create a new GitHub project\n   */\n  async createGitHubProject(\n    name: string,\n    owner: string,\n    repo: string,\n    options?: {\n      branch?: string;\n      path?: string;\n      token?: string;\n    }\n  ): Promise<Project> {\n    const source = SourceConfigBuilder.github({\n      owner,\n      repo,\n      branch: options?.branch,\n      path: options?.path,\n      token: options?.token\n    });\n\n    const config: ProjectConfig = {\n      id: `gh-${owner}-${repo}-${Date.now()}`,\n      name,\n      source\n    };\n\n    return this.loadProject(config);\n  }\n\n  /**\n   * Close workspace and database connection\n   */\n  async close(): Promise<void> {\n    await this.clear();\n    this.credentialManager.clearCache();\n    this.database.close();\n  }\n}\n","import type { \n  ProjectConfig, \n  WorkspaceSettings,\n  ProjectMetadata \n} from \"./types\";\n\nconst DB_NAME = \"@firesystem/workspace\";\nconst DB_VERSION = 1;\n\nexport interface StoredProject {\n  id: string;\n  name: string;\n  source: any; // ProjectSource\n  metadata: ProjectMetadata;\n  lastAccessed: Date;\n  enabled?: boolean;\n  disabledAt?: Date;\n  enabledAt?: Date;\n}\n\nexport interface WorkspaceState {\n  id: \"current\"; // Single record key\n  activeProjectId: string | null;\n  recentProjectIds: string[];\n  settings: WorkspaceSettings;\n}\n\n/**\n * Manages workspace persistence in IndexedDB\n */\nexport class WorkspaceDatabase {\n  private db: IDBDatabase | null = null;\n  private dbName: string;\n  private dbVersion: number;\n\n  constructor(dbName: string = DB_NAME, dbVersion: number = DB_VERSION) {\n    this.dbName = dbName;\n    this.dbVersion = dbVersion;\n  }\n\n  /**\n   * Open or create the workspace database\n   */\n  async open(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const request = indexedDB.open(this.dbName, this.dbVersion);\n\n      request.onerror = () => {\n        reject(new Error(`Failed to open database: ${request.error}`));\n      };\n\n      request.onsuccess = () => {\n        this.db = request.result;\n        resolve();\n      };\n\n      request.onupgradeneeded = (event) => {\n        const db = request.result;\n        const oldVersion = event.oldVersion;\n\n        // Create object stores for v1\n        if (oldVersion < 1) {\n          // Projects store\n          if (!db.objectStoreNames.contains(\"projects\")) {\n            const projectStore = db.createObjectStore(\"projects\", { \n              keyPath: \"id\" \n            });\n            projectStore.createIndex(\"name\", \"name\", { unique: false });\n            projectStore.createIndex(\"lastAccessed\", \"lastAccessed\", { unique: false });\n          }\n\n          // Workspace state store\n          if (!db.objectStoreNames.contains(\"workspaceState\")) {\n            db.createObjectStore(\"workspaceState\", { keyPath: \"id\" });\n          }\n        }\n      };\n    });\n  }\n\n  /**\n   * Ensure database is open\n   */\n  private ensureOpen(): void {\n    if (!this.db) {\n      throw new Error(\"Database not opened. Call open() first.\");\n    }\n  }\n\n  /**\n   * Close the database\n   */\n  close(): void {\n    if (this.db) {\n      this.db.close();\n      this.db = null;\n    }\n  }\n\n  // Project CRUD operations\n\n  /**\n   * Save or update a project configuration\n   */\n  async saveProject(project: StoredProject): Promise<void> {\n    this.ensureOpen();\n    \n    const tx = this.db!.transaction([\"projects\"], \"readwrite\");\n    const store = tx.objectStore(\"projects\");\n    \n    await new Promise<void>((resolve, reject) => {\n      const request = store.put(project);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * Get a project by ID\n   */\n  async getProject(id: string): Promise<StoredProject | null> {\n    this.ensureOpen();\n    \n    const tx = this.db!.transaction([\"projects\"], \"readonly\");\n    const store = tx.objectStore(\"projects\");\n    \n    return new Promise((resolve, reject) => {\n      const request = store.get(id);\n      request.onsuccess = () => resolve(request.result || null);\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * List all projects\n   */\n  async listProjects(): Promise<StoredProject[]> {\n    this.ensureOpen();\n    \n    const tx = this.db!.transaction([\"projects\"], \"readonly\");\n    const store = tx.objectStore(\"projects\");\n    \n    return new Promise((resolve, reject) => {\n      const request = store.getAll();\n      request.onsuccess = () => resolve(request.result || []);\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * List recent projects\n   */\n  async listRecentProjects(limit = 10): Promise<StoredProject[]> {\n    this.ensureOpen();\n    \n    const tx = this.db!.transaction([\"projects\"], \"readonly\");\n    const index = tx.objectStore(\"projects\").index(\"lastAccessed\");\n    \n    const projects: StoredProject[] = [];\n    \n    return new Promise((resolve, reject) => {\n      // Open cursor in reverse order (most recent first)\n      const request = index.openCursor(null, \"prev\");\n      \n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (cursor && projects.length < limit) {\n          projects.push(cursor.value);\n          cursor.continue();\n        } else {\n          resolve(projects);\n        }\n      };\n      \n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * Delete a project\n   */\n  async deleteProject(id: string): Promise<void> {\n    this.ensureOpen();\n    \n    const tx = this.db!.transaction([\"projects\"], \"readwrite\");\n    const store = tx.objectStore(\"projects\");\n    \n    await new Promise<void>((resolve, reject) => {\n      const request = store.delete(id);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * Update project last accessed time\n   */\n  async touchProject(id: string): Promise<void> {\n    const project = await this.getProject(id);\n    if (project) {\n      project.lastAccessed = new Date();\n      await this.saveProject(project);\n    }\n  }\n\n  /**\n   * Update project state\n   */\n  async updateProjectState(id: string, updates: Partial<Pick<StoredProject, 'enabled' | 'disabledAt' | 'enabledAt'>>): Promise<void> {\n    const project = await this.getProject(id);\n    if (project) {\n      // Apply updates\n      Object.assign(project, updates);\n      await this.saveProject(project);\n    }\n  }\n\n  // Workspace state operations\n\n  /**\n   * Save workspace state\n   */\n  async saveWorkspaceState(state: WorkspaceState): Promise<void> {\n    this.ensureOpen();\n    \n    const tx = this.db!.transaction([\"workspaceState\"], \"readwrite\");\n    const store = tx.objectStore(\"workspaceState\");\n    \n    await new Promise<void>((resolve, reject) => {\n      const request = store.put(state);\n      request.onsuccess = () => resolve();\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * Get workspace state\n   */\n  async getWorkspaceState(): Promise<WorkspaceState | null> {\n    this.ensureOpen();\n    \n    const tx = this.db!.transaction([\"workspaceState\"], \"readonly\");\n    const store = tx.objectStore(\"workspaceState\");\n    \n    return new Promise((resolve, reject) => {\n      const request = store.get(\"current\");\n      request.onsuccess = () => resolve(request.result || null);\n      request.onerror = () => reject(request.error);\n    });\n  }\n\n  /**\n   * Clear all data\n   */\n  async clear(): Promise<void> {\n    this.ensureOpen();\n    \n    const tx = this.db!.transaction([\"projects\", \"workspaceState\"], \"readwrite\");\n    \n    await Promise.all([\n      new Promise<void>((resolve, reject) => {\n        const request = tx.objectStore(\"projects\").clear();\n        request.onsuccess = () => resolve();\n        request.onerror = () => reject(request.error);\n      }),\n      new Promise<void>((resolve, reject) => {\n        const request = tx.objectStore(\"workspaceState\").clear();\n        request.onsuccess = () => resolve();\n        request.onerror = () => reject(request.error);\n      })\n    ]);\n  }\n\n  /**\n   * Check if a project exists by checking IndexedDB databases\n   */\n  static async projectDatabaseExists(dbName: string): Promise<boolean> {\n    if (!(\"databases\" in indexedDB)) {\n      // Fallback for browsers that don't support databases()\n      return new Promise((resolve) => {\n        const testOpen = indexedDB.open(dbName);\n        testOpen.onsuccess = () => {\n          const db = testOpen.result;\n          const exists = db.version > 0;\n          db.close();\n          resolve(exists);\n        };\n        testOpen.onerror = () => resolve(false);\n      });\n    }\n\n    const databases = await indexedDB.databases();\n    return databases.some(db => db.name === dbName);\n  }\n\n  /**\n   * Discover existing Firesystem IndexedDB databases\n   */\n  async discoverIndexedDBProjects(): Promise<string[]> {\n    if (!(\"databases\" in indexedDB)) {\n      console.warn(\"IndexedDB.databases() not supported in this browser\");\n      return [];\n    }\n\n    const databases = await indexedDB.databases();\n    \n    // Filter databases that look like Firesystem projects\n    return databases\n      .filter(db => {\n        const name = db.name || \"\";\n        return name.startsWith(\"firesystem-\") || \n               name.startsWith(\"@firesystem/\") ||\n               name.includes(\"-filesystem\");\n      })\n      .map(db => db.name!);\n  }\n}","import type { WorkspaceConfig, ProjectConfig } from \"../types\";\n\nexport interface WorkspaceExport {\n  version: string;\n  exportedAt: Date;\n  workspace: {\n    settings?: any;\n    activeProjectId?: string;\n  };\n  projects: Array<{\n    id: string;\n    name: string;\n    type: \"memory\" | \"indexeddb\" | \"s3\";\n    config?: any;\n    files?: Array<{\n      path: string;\n      content: string;\n      metadata?: Record<string, any>;\n    }>;\n  }>;\n}\n\n/**\n * Handles import/export of workspace configurations\n */\nexport class WorkspaceImporter {\n  /**\n   * Import workspace from JSON URL\n   */\n  static async fromJsonUrl(url: string): Promise<WorkspaceConfig> {\n    const response = await fetch(url);\n    if (!response.ok) {\n      throw new Error(`Failed to fetch workspace: ${response.statusText}`);\n    }\n\n    const data: WorkspaceExport = await response.json();\n    return this.parseExport(data);\n  }\n\n  /**\n   * Import workspace from GitHub Gist\n   */\n  static async fromGitHubGist(gistId: string, token?: string): Promise<WorkspaceConfig> {\n    const headers: Record<string, string> = {\n      \"Accept\": \"application/vnd.github.v3+json\"\n    };\n\n    if (token) {\n      headers[\"Authorization\"] = `token ${token}`;\n    }\n\n    const response = await fetch(`https://api.github.com/gists/${gistId}`, {\n      headers\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch gist: ${response.statusText}`);\n    }\n\n    const gist = await response.json();\n    \n    // Look for workspace.json file in the gist\n    const workspaceFile = Object.values(gist.files).find(\n      (file: any) => file.filename === \"workspace.json\"\n    ) as any;\n\n    if (!workspaceFile) {\n      throw new Error(\"No workspace.json found in gist\");\n    }\n\n    const data: WorkspaceExport = JSON.parse(workspaceFile.content);\n    return this.parseExport(data);\n  }\n\n  /**\n   * Import workspace from API endpoint\n   */\n  static async fromApi(\n    url: string, \n    options?: {\n      headers?: Record<string, string>;\n      method?: string;\n      body?: any;\n    }\n  ): Promise<WorkspaceConfig> {\n    const response = await fetch(url, {\n      method: options?.method || \"GET\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        ...options?.headers\n      },\n      body: options?.body ? JSON.stringify(options.body) : undefined\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch from API: ${response.statusText}`);\n    }\n\n    const data: WorkspaceExport = await response.json();\n    return this.parseExport(data);\n  }\n\n  /**\n   * Parse export data into workspace config\n   */\n  private static parseExport(data: WorkspaceExport): WorkspaceConfig {\n    // Validate version\n    if (!data.version || !data.version.startsWith(\"1.\")) {\n      throw new Error(`Unsupported workspace version: ${data.version}`);\n    }\n\n    const projects: ProjectConfig[] = data.projects.map(p => {\n      // Determine source based on type and presence of files\n      let source: any;\n\n      if (p.files && p.files.length > 0) {\n        // If files are included, create memory source with initial data\n        source = {\n          type: \"memory\",\n          config: {\n            initialData: p.files.reduce((acc, file) => {\n              acc[file.path] = {\n                content: file.content,\n                metadata: file.metadata\n              };\n              return acc;\n            }, {} as Record<string, any>)\n          }\n        };\n      } else if (p.type === \"indexeddb\") {\n        // IndexedDB reference\n        source = {\n          type: \"indexeddb\",\n          config: {\n            dbName: p.config?.dbName || `firesystem-${p.id}`\n          }\n        };\n      } else if (p.type === \"s3\") {\n        // S3 reference\n        source = {\n          type: \"s3\",\n          config: p.config\n        };\n      } else {\n        // Default to empty memory\n        source = {\n          type: \"memory\",\n          config: {}\n        };\n      }\n\n      return {\n        id: p.id,\n        name: p.name,\n        source\n      };\n    });\n\n    return {\n      version: data.version,\n      projects,\n      activeProjectId: data.workspace.activeProjectId,\n      settings: data.workspace.settings\n    };\n  }\n}","import type { ProjectSource } from \"../types\";\n\n/**\n * Validates and builds source configurations with credentials\n */\nexport class SourceConfigBuilder {\n  /**\n   * Build IndexedDB source config\n   */\n  static indexedDB(dbName?: string): ProjectSource {\n    return {\n      type: \"indexeddb\",\n      config: {\n        dbName: dbName || `firesystem-${Date.now()}`\n      }\n    };\n  }\n\n  /**\n   * Build Memory source config\n   */\n  static memory(initialData?: any): ProjectSource {\n    return {\n      type: \"memory\",\n      config: {\n        initialData\n      }\n    };\n  }\n\n  /**\n   * Build S3 source config\n   */\n  static s3(config: {\n    bucket: string;\n    prefix?: string;\n    region?: string;\n    credentials?: {\n      accessKeyId: string;\n      secretAccessKey: string;\n    };\n  }): ProjectSource {\n    const source: ProjectSource = {\n      type: \"s3\",\n      config: {\n        bucket: config.bucket,\n        prefix: config.prefix || \"\",\n        region: config.region || \"us-east-1\"\n      }\n    };\n\n    // Add auth if credentials provided\n    if (config.credentials) {\n      source.auth = {\n        type: \"token\",\n        credentials: config.credentials\n      };\n    }\n\n    return source;\n  }\n\n  /**\n   * Build GitHub source config\n   */\n  static github(config: {\n    owner: string;\n    repo: string;\n    branch?: string;\n    path?: string;\n    token?: string;\n  }): ProjectSource {\n    const source: ProjectSource = {\n      type: \"github\",\n      config: {\n        owner: config.owner,\n        repo: config.repo,\n        branch: config.branch || \"main\",\n        path: config.path || \"/\"\n      }\n    };\n\n    if (config.token) {\n      source.auth = {\n        type: \"bearer\",\n        credentials: { token: config.token }\n      };\n    }\n\n    return source;\n  }\n\n  /**\n   * Build API source config\n   */\n  static api(config: {\n    baseUrl: string;\n    projectEndpoint?: string;\n    headers?: Record<string, string>;\n    apiKey?: string;\n  }): ProjectSource {\n    const source: ProjectSource = {\n      type: \"api\",\n      config: {\n        baseUrl: config.baseUrl,\n        projectEndpoint: config.projectEndpoint || \"/projects\",\n        headers: config.headers\n      }\n    };\n\n    if (config.apiKey) {\n      source.auth = {\n        type: \"token\",\n        credentials: { apiKey: config.apiKey }\n      };\n    }\n\n    return source;\n  }\n\n  /**\n   * Validate source configuration\n   */\n  static validate(source: ProjectSource): { valid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    switch (source.type) {\n      case \"indexeddb\":\n        if (!source.config.dbName) {\n          errors.push(\"IndexedDB source requires dbName\");\n        }\n        break;\n\n      case \"s3\":\n        if (!source.config.bucket) {\n          errors.push(\"S3 source requires bucket\");\n        }\n        // For validation, we don't require credentials - they can be provided at runtime\n        break;\n\n      case \"github\":\n        if (!source.config.owner || !source.config.repo) {\n          errors.push(\"GitHub source requires owner and repo\");\n        }\n        break;\n\n      case \"api\":\n        if (!source.config.baseUrl) {\n          errors.push(\"API source requires baseUrl\");\n        }\n        break;\n\n      case \"memory\":\n        // Memory source has no required fields\n        break;\n\n      default:\n        errors.push(`Unknown source type: ${source.type}`);\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors\n    };\n  }\n\n  /**\n   * Sanitize source for export (remove credentials)\n   */\n  static sanitize(source: ProjectSource): ProjectSource {\n    const sanitized = { ...source };\n    \n    // Remove auth completely\n    delete sanitized.auth;\n\n    // Clean specific fields based on type\n    switch (source.type) {\n      case \"s3\":\n        // Keep only bucket and prefix\n        sanitized.config = {\n          bucket: source.config.bucket,\n          prefix: source.config.prefix\n        };\n        break;\n\n      case \"api\":\n        // Remove headers that might contain auth\n        const { headers, ...restConfig } = source.config;\n        sanitized.config = restConfig;\n        break;\n\n      // For other types (memory, indexeddb, github), preserve config as-is\n      default:\n        // No special sanitization needed for other types\n        break;\n    }\n\n    return sanitized;\n  }\n}","import type { IReactiveFileSystem } from \"@firesystem/core\";\nimport type { Project, WorkspaceSettings } from \"../types\";\nimport type { WorkspaceExport } from \"./WorkspaceImporter\";\nimport { SourceConfigBuilder } from \"../credentials/SourceConfigBuilder\";\n\nexport interface ExportOptions {\n  includeFiles?: boolean;\n  includeCredentials?: boolean;\n  projectIds?: string[];\n}\n\n/**\n * Handles exporting workspace configurations\n */\nexport class WorkspaceExporter {\n  /**\n   * Export workspace to JSON\n   */\n  static async toJson(\n    projects: Project[],\n    activeProjectId: string | null,\n    settings: WorkspaceSettings,\n    options: ExportOptions = {}\n  ): Promise<WorkspaceExport> {\n    const exportedProjects = await Promise.all(\n      projects\n        .filter(p => !options.projectIds || options.projectIds.includes(p.id))\n        .map(async p => {\n          const exported: any = {\n            id: p.id,\n            name: p.name,\n            type: p.source.type as any\n          };\n\n          // Include config based on credentials option\n          if (p.source.type === \"s3\") {\n            if (options.includeCredentials) {\n              // Include full config with credentials\n              exported.config = { ...p.source.config };\n            } else {\n              // Strip credentials from S3 config\n              exported.config = {\n                bucket: p.source.config.bucket,\n                prefix: p.source.config.prefix\n              };\n            }\n          } else if (p.source.type === \"indexeddb\") {\n            exported.config = {\n              dbName: p.source.config.dbName\n            };\n          } else {\n            // For other types, include full config unless it's sensitive\n            exported.config = options.includeCredentials ? \n              { ...p.source.config } : \n              SourceConfigBuilder.sanitize(p.source).config;\n          }\n\n          // Include files if requested\n          if (options.includeFiles && p.fs) {\n            exported.files = await this.extractFiles(p.fs);\n          }\n\n          return exported;\n        })\n    );\n\n    return {\n      version: \"1.0\",\n      exportedAt: new Date(),\n      workspace: {\n        settings,\n        activeProjectId: activeProjectId || undefined\n      },\n      projects: exportedProjects\n    };\n  }\n\n  /**\n   * Export to GitHub Gist\n   */\n  static async toGitHubGist(\n    exportData: WorkspaceExport,\n    options: {\n      token: string;\n      description?: string;\n      public?: boolean;\n    }\n  ): Promise<string> {\n    const response = await fetch(\"https://api.github.com/gists\", {\n      method: \"POST\",\n      headers: {\n        \"Authorization\": `token ${options.token}`,\n        \"Accept\": \"application/vnd.github.v3+json\",\n        \"Content-Type\": \"application/json\"\n      },\n      body: JSON.stringify({\n        description: options.description || \"Firesystem Workspace Export\",\n        public: options.public ?? false,\n        files: {\n          \"workspace.json\": {\n            content: JSON.stringify(exportData, null, 2)\n          }\n        }\n      })\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to create gist: ${response.statusText}`);\n    }\n\n    const gist = await response.json();\n    return gist.id;\n  }\n\n  /**\n   * Export to API endpoint\n   */\n  static async toApi(\n    exportData: WorkspaceExport,\n    url: string,\n    options?: {\n      headers?: Record<string, string>;\n      method?: string;\n    }\n  ): Promise<void> {\n    const response = await fetch(url, {\n      method: options?.method || \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        ...options?.headers\n      },\n      body: JSON.stringify(exportData)\n    });\n\n    if (!response.ok) {\n      throw new Error(`Failed to export to API: ${response.statusText}`);\n    }\n  }\n\n  /**\n   * Extract all files from a file system\n   */\n  private static async extractFiles(fs: IReactiveFileSystem): Promise<Array<{\n    path: string;\n    content: string;\n    metadata?: Record<string, any>;\n  }>> {\n    const files: any[] = [];\n\n    try {\n      // Check if file system supports glob operations\n      if (!fs.capabilities?.supportsGlob) {\n        console.warn(\"File system does not support glob operations, skipping file extraction\");\n        return files;\n      }\n\n      // Get all file paths\n      const paths = await fs.glob(\"**/*\");\n\n      for (const path of paths) {\n        try {\n          const stat = await fs.stat(path);\n          \n          if (stat.type === \"file\") {\n            const file = await fs.readFile(path);\n            \n            // Convert content to string if needed\n            let content = file.content;\n            if (typeof content !== \"string\") {\n              content = JSON.stringify(content);\n            }\n\n            files.push({\n              path,\n              content,\n              metadata: file.metadata\n            });\n          }\n        } catch (error) {\n          console.warn(`Failed to export file ${path}:`, error);\n        }\n      }\n    } catch (error) {\n      console.warn(\"Failed to glob files:\", error);\n    }\n\n    return files;\n  }\n}","import type { SourceAuth, ProjectSource } from \"../types\";\n\nexport interface CredentialProvider {\n  /**\n   * Get credentials for a specific project\n   */\n  getCredentials(projectId: string, source: ProjectSource): Promise<any>;\n  \n  /**\n   * Store credentials securely\n   */\n  storeCredentials(projectId: string, credentials: any): Promise<void>;\n  \n  /**\n   * Remove stored credentials\n   */\n  removeCredentials(projectId: string): Promise<void>;\n}\n\n/**\n * Manages credentials for different project sources\n */\nexport class CredentialManager {\n  private providers = new Map<string, CredentialProvider>();\n  private memoryCache = new Map<string, any>();\n\n  /**\n   * Register a credential provider\n   */\n  registerProvider(name: string, provider: CredentialProvider): void {\n    this.providers.set(name, provider);\n  }\n\n  /**\n   * Get credentials for a project source\n   */\n  async getCredentials(projectId: string, source: ProjectSource): Promise<any> {\n    // Check memory cache first\n    const cacheKey = `${projectId}:${source.type}`;\n    if (this.memoryCache.has(cacheKey)) {\n      return this.memoryCache.get(cacheKey);\n    }\n\n    // Use provider if available\n    const provider = this.providers.get(source.type);\n    if (provider) {\n      const credentials = await provider.getCredentials(projectId, source);\n      this.memoryCache.set(cacheKey, credentials);\n      return credentials;\n    }\n\n    // Fallback to source auth if provided\n    if (source.auth) {\n      return this.extractCredentials(source.auth);\n    }\n\n    // Return empty object if no credentials needed\n    return {};\n  }\n\n  /**\n   * Extract credentials from auth config\n   */\n  private extractCredentials(auth: SourceAuth): any {\n    switch (auth.type) {\n      case \"bearer\":\n        return { token: auth.credentials.token };\n      case \"basic\":\n        return {\n          username: auth.credentials.username,\n          password: auth.credentials.password\n        };\n      case \"token\":\n        return { apiKey: auth.credentials.apiKey };\n      case \"oauth2\":\n        return {\n          accessToken: auth.credentials.accessToken,\n          refreshToken: auth.credentials.refreshToken\n        };\n      default:\n        return auth.credentials;\n    }\n  }\n\n  /**\n   * Clear cached credentials\n   */\n  clearCache(projectId?: string): void {\n    if (projectId) {\n      // Clear specific project\n      for (const [key] of this.memoryCache) {\n        if (key.startsWith(`${projectId}:`)) {\n          this.memoryCache.delete(key);\n        }\n      }\n    } else {\n      // Clear all\n      this.memoryCache.clear();\n    }\n  }\n}\n\n/**\n * Browser-based credential provider using Web Crypto API\n */\nexport class BrowserCredentialProvider implements CredentialProvider {\n  private dbName = \"@firesystem/credentials\";\n  private storeName = \"credentials\";\n\n  async getCredentials(projectId: string, source: ProjectSource): Promise<any> {\n    // For demo purposes, return config as-is\n    // In production, this would decrypt from secure storage\n    return source.config;\n  }\n\n  async storeCredentials(projectId: string, credentials: any): Promise<void> {\n    // In production, encrypt before storing\n    console.warn(\"Storing credentials in browser - consider security implications\");\n  }\n\n  async removeCredentials(projectId: string): Promise<void> {\n    // Remove from secure storage\n  }\n}\n\n/**\n * Environment variable credential provider (for Node.js)\n */\nexport class EnvCredentialProvider implements CredentialProvider {\n  async getCredentials(projectId: string, source: ProjectSource): Promise<any> {\n    const prefix = `FIRESYSTEM_${source.type.toUpperCase()}_`;\n    \n    switch (source.type) {\n      case \"s3\":\n        return {\n          accessKeyId: process.env[`${prefix}ACCESS_KEY_ID`],\n          secretAccessKey: process.env[`${prefix}SECRET_ACCESS_KEY`],\n          region: process.env[`${prefix}REGION`] || \"us-east-1\",\n          bucket: source.config.bucket // Bucket from config\n        };\n      \n      case \"github\":\n        return {\n          token: process.env[`${prefix}TOKEN`] || process.env.GITHUB_TOKEN\n        };\n      \n      case \"api\":\n        return {\n          apiKey: process.env[`${prefix}API_KEY`],\n          baseUrl: source.config.baseUrl\n        };\n      \n      default:\n        return source.config;\n    }\n  }\n\n  async storeCredentials(): Promise<void> {\n    throw new Error(\"Cannot store credentials in environment variables\");\n  }\n\n  async removeCredentials(): Promise<void> {\n    throw new Error(\"Cannot remove credentials from environment variables\");\n  }\n}\n\n/**\n * Interactive credential provider that prompts user\n */\nexport class InteractiveCredentialProvider implements CredentialProvider {\n  constructor(\n    private prompter: (message: string, secure?: boolean) => Promise<string>\n  ) {}\n\n  async getCredentials(projectId: string, source: ProjectSource): Promise<any> {\n    console.log(`Credentials needed for ${source.type} project: ${projectId}`);\n    \n    switch (source.type) {\n      case \"s3\":\n        return {\n          accessKeyId: await this.prompter(\"AWS Access Key ID:\"),\n          secretAccessKey: await this.prompter(\"AWS Secret Access Key:\", true),\n          region: await this.prompter(\"AWS Region (default: us-east-1):\") || \"us-east-1\",\n          bucket: source.config.bucket\n        };\n      \n      case \"github\":\n        return {\n          token: await this.prompter(\"GitHub Personal Access Token:\", true)\n        };\n      \n      case \"api\":\n        return {\n          apiKey: await this.prompter(\"API Key:\", true),\n          baseUrl: source.config.baseUrl\n        };\n      \n      default:\n        return source.config;\n    }\n  }\n\n  async storeCredentials(): Promise<void> {\n    // No storage in interactive mode\n  }\n\n  async removeCredentials(): Promise<void> {\n    // No storage in interactive mode\n  }\n}"],"mappings":"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","names":["import_core"]}