{"version":3,"sources":["../src/config/tier-limits.json","../src/config/token-costs.json","../src/errors/index.ts","../src/utils/RateLimiter.ts","../src/client/pins/index.ts","../src/client/pinboards/index.ts","../src/client/datasets/index.ts","../src/client/blocks/index.ts","../src/client/collaborators/index.ts","../src/client/PindownClient.ts"],"names":["tier_limits_default","token_costs_default","PindownError","message","AuthenticationError","ForbiddenError","NotFoundError","resource","ValidationError","details","RateLimitError","params","ServerError","statusCode","NetworkError","TIER_LIMITS","TOKEN_COSTS","RateLimiter","tier","method","endpoint","body","cost","minuteWindow","hourWindow","limits","used","hourUsed","ops","pins","now","window","current","minuteUsed","twoHoursAgo","key","windowKey","parts","year","month","day","hour","minute","PinsMethods","client","request","pinId","options","query","pinIds","updates","title","additionalMetadata","data","url","PinboardsMethods","boardId","pinboardIds","layout","roleId","userId","roleIds","DatasetsMethods","datasetId","datasetIds","datasets","BlocksMethods","blockId","blockIds","blocks","CollaboratorsMethods","PindownClient","config","headers","requestOptions","response","error","errorData","tierHeader"],"mappings":"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","file":"index.cjs","sourcesContent":["{\r\n  \"starter\": {\r\n    \"tokensPerHour\": 16,\r\n    \"tokensPerMinute\": null\r\n  },\r\n  \"hobby\": {\r\n    \"tokensPerHour\": 6000,\r\n    \"tokensPerMinute\": 100\r\n  },\r\n  \"pro\": {\r\n    \"tokensPerHour\": 24000,\r\n    \"tokensPerMinute\": 400\r\n  },\r\n  \"teams\": {\r\n    \"tokensPerHour\": 60000,\r\n    \"tokensPerMinute\": 1000\r\n  },\r\n  \"agency\": {\r\n    \"tokensPerHour\": 240000,\r\n    \"tokensPerMinute\": 4000\r\n  }\r\n}\r\n\r\n","{\r\n  \"GET\": 1,\r\n  \"POST\": 1,\r\n  \"PUT\": 1,\r\n  \"DELETE\": 1,\r\n  \"INVITE\": 3,\r\n  \"SHARE\": 3,\r\n  \"BATCH_1_10\": 3,\r\n  \"BATCH_11_25\": 5,\r\n  \"BATCH_26_50\": 10\r\n}\r\n","/**\r\n * Error classes for Pindown API Client\r\n */\r\n\r\nimport type { Tier } from '../types/config'\r\n\r\nexport class PindownError extends Error {\r\n  constructor(message: string) {\r\n    super(message)\r\n    this.name = 'PindownError'\r\n  }\r\n}\r\n\r\nexport class AuthenticationError extends PindownError {\r\n  constructor(message: string = 'Authentication failed') {\r\n    super(message)\r\n    this.name = 'AuthenticationError'\r\n  }\r\n}\r\n\r\nexport class ForbiddenError extends PindownError {\r\n  constructor(message: string = 'Access forbidden') {\r\n    super(message)\r\n    this.name = 'ForbiddenError'\r\n  }\r\n}\r\n\r\nexport class NotFoundError extends PindownError {\r\n  constructor(resource: string) {\r\n    super(`${resource} not found`)\r\n    this.name = 'NotFoundError'\r\n  }\r\n}\r\n\r\nexport class ValidationError extends PindownError {\r\n  public details?: any\r\n\r\n  constructor(message: string, details?: any) {\r\n    super(message)\r\n    this.name = 'ValidationError'\r\n    this.details = details\r\n  }\r\n}\r\n\r\nexport class RateLimitError extends PindownError {\r\n  public window: 'minute' | 'hour'\r\n  public limit: number\r\n  public used: number\r\n  public remaining: number\r\n  public resetAt: Date\r\n  public tier: Tier\r\n\r\n  constructor(params: {\r\n    window: 'minute' | 'hour'\r\n    limit: number\r\n    used: number\r\n    remaining: number\r\n    resetAt: Date\r\n    tier: Tier\r\n  }) {\r\n    super(\r\n      `Rate limit exceeded: ${params.used}/${params.limit} tokens used in ${params.window} window. ` +\r\n      `Resets at ${params.resetAt.toISOString()}`\r\n    )\r\n    this.name = 'RateLimitError'\r\n    this.window = params.window\r\n    this.limit = params.limit\r\n    this.used = params.used\r\n    this.remaining = params.remaining\r\n    this.resetAt = params.resetAt\r\n    this.tier = params.tier\r\n  }\r\n}\r\n\r\nexport class ServerError extends PindownError {\r\n  public statusCode: number\r\n\r\n  constructor(message: string, statusCode: number = 500) {\r\n    super(message)\r\n    this.name = 'ServerError'\r\n    this.statusCode = statusCode\r\n  }\r\n}\r\n\r\nexport class NetworkError extends PindownError {\r\n  constructor(message: string = 'Network request failed') {\r\n    super(message)\r\n    this.name = 'NetworkError'\r\n  }\r\n}\r\n\r\n","/**\r\n * Rate Limiter - Client-side rate limiting with in-memory counters\r\n */\r\n\r\nimport tierLimitsJson from '../config/tier-limits.json'\r\nimport tokenCostsJson from '../config/token-costs.json'\r\nimport { RateLimitError } from '../errors'\r\nimport type { Tier } from '../types/config'\r\nimport type { RateLimitInfo } from '../types/api'\r\n\r\nconst TIER_LIMITS = tierLimitsJson as Record<Tier, { tokensPerHour: number; tokensPerMinute: number | null }>\r\nconst TOKEN_COSTS = tokenCostsJson as Record<string, number>\r\n\r\nexport class RateLimiter {\r\n  private tier: Tier\r\n  private minuteTokens = new Map<string, number>()\r\n  private hourTokens = new Map<string, number>()\r\n  private cleanupInterval: NodeJS.Timeout | number\r\n\r\n  constructor(tier: Tier) {\r\n    this.tier = tier\r\n    \r\n    // Auto-cleanup expired windows every 5 minutes\r\n    this.cleanupInterval = setInterval(() => this.cleanup(), 5 * 60 * 1000)\r\n  }\r\n\r\n  /**\r\n   * Check if request is allowed, throw RateLimitError if limit reached\r\n   */\r\n  checkLimit(method: string, endpoint: string, body?: any): void {\r\n    const cost = this.calculateTokenCost(method, endpoint, body)\r\n    const minuteWindow = this.getMinuteWindow()\r\n    const hourWindow = this.getHourWindow()\r\n    \r\n    const limits = TIER_LIMITS[this.tier]\r\n    \r\n    // Check minute limit (if exists)\r\n    if (limits.tokensPerMinute !== null) {\r\n      const used = this.minuteTokens.get(minuteWindow) || 0\r\n      if (used + cost > limits.tokensPerMinute) {\r\n        throw new RateLimitError({\r\n          window: 'minute',\r\n          limit: limits.tokensPerMinute,\r\n          used,\r\n          remaining: Math.max(0, limits.tokensPerMinute - used),\r\n          resetAt: this.getMinuteResetTime(),\r\n          tier: this.tier\r\n        })\r\n      }\r\n    }\r\n    \r\n    // Check hour limit\r\n    const hourUsed = this.hourTokens.get(hourWindow) || 0\r\n    if (hourUsed + cost > limits.tokensPerHour) {\r\n      throw new RateLimitError({\r\n        window: 'hour',\r\n        limit: limits.tokensPerHour,\r\n        used: hourUsed,\r\n        remaining: Math.max(0, limits.tokensPerHour - hourUsed),\r\n        resetAt: this.getHourResetTime(),\r\n        tier: this.tier\r\n      })\r\n    }\r\n    \r\n    // Increment counters\r\n    this.incrementToken(minuteWindow, cost)\r\n    this.incrementToken(hourWindow, cost)\r\n  }\r\n\r\n  /**\r\n   * Calculate token cost for a request\r\n   */\r\n  private calculateTokenCost(method: string, endpoint: string, body?: any): number {\r\n    // Check for batch endpoints\r\n    if (endpoint.includes('/batch') || endpoint.includes('/sync')) {\r\n      if (body?.operations) {\r\n        const ops = Array.isArray(body.operations) ? body.operations.length : 0\r\n        if (ops <= 10) return TOKEN_COSTS.BATCH_1_10\r\n        if (ops <= 25) return TOKEN_COSTS.BATCH_11_25\r\n        if (ops <= 50) return TOKEN_COSTS.BATCH_26_50\r\n        return TOKEN_COSTS.BATCH_26_50 // Cap at 50\r\n      }\r\n      // For /sync endpoints, check pins array\r\n      if (body?.pins) {\r\n        const pins = Array.isArray(body.pins) ? body.pins.length : 0\r\n        if (pins <= 16) return 5 // As per RATE_LIMITING_STRATEGY.md\r\n        if (pins <= 32) return 8\r\n        return 8 // Cap at 32\r\n      }\r\n    }\r\n    \r\n    // Check for invite/share endpoints\r\n    if (endpoint.includes('/collaborators') || endpoint.includes('/invite') || endpoint.includes('/share')) {\r\n      return TOKEN_COSTS.INVITE\r\n    }\r\n    \r\n    // Standard methods (all cost 1 token)\r\n    return TOKEN_COSTS[method] || 1\r\n  }\r\n\r\n  /**\r\n   * Get current minute window key\r\n   */\r\n  private getMinuteWindow(): string {\r\n    const now = new Date()\r\n    return `minute_${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}-${String(now.getHours()).padStart(2, '0')}-${String(now.getMinutes()).padStart(2, '0')}`\r\n  }\r\n\r\n  /**\r\n   * Get current hour window key\r\n   */\r\n  private getHourWindow(): string {\r\n    const now = new Date()\r\n    return `hour_${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}-${String(now.getHours()).padStart(2, '0')}`\r\n  }\r\n\r\n  /**\r\n   * Increment token count for a window\r\n   */\r\n  private incrementToken(window: string, cost: number): void {\r\n    if (window.startsWith('minute')) {\r\n      const current = this.minuteTokens.get(window) || 0\r\n      this.minuteTokens.set(window, current + cost)\r\n    } else {\r\n      const current = this.hourTokens.get(window) || 0\r\n      this.hourTokens.set(window, current + cost)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get reset time for current minute window\r\n   */\r\n  private getMinuteResetTime(): Date {\r\n    const now = new Date()\r\n    return new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), now.getMinutes() + 1, 0, 0)\r\n  }\r\n\r\n  /**\r\n   * Get reset time for current hour window\r\n   */\r\n  private getHourResetTime(): Date {\r\n    const now = new Date()\r\n    return new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours() + 1, 0, 0, 0)\r\n  }\r\n\r\n  /**\r\n   * Get current rate limit info\r\n   */\r\n  getRateLimitInfo(): RateLimitInfo {\r\n    const limits = TIER_LIMITS[this.tier]\r\n    const minuteWindow = this.getMinuteWindow()\r\n    const hourWindow = this.getHourWindow()\r\n    \r\n    const minuteUsed = this.minuteTokens.get(minuteWindow) || 0\r\n    const hourUsed = this.hourTokens.get(hourWindow) || 0\r\n    \r\n    return {\r\n      tier: this.tier,\r\n      minute: {\r\n        limit: limits.tokensPerMinute || 0,\r\n        used: minuteUsed,\r\n        remaining: limits.tokensPerMinute \r\n          ? Math.max(0, limits.tokensPerMinute - minuteUsed)\r\n          : Infinity,\r\n        resetAt: this.getMinuteResetTime()\r\n      },\r\n      hour: {\r\n        limit: limits.tokensPerHour,\r\n        used: hourUsed,\r\n        remaining: Math.max(0, limits.tokensPerHour - hourUsed),\r\n        resetAt: this.getHourResetTime()\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Cleanup expired windows (older than 2 hours)\r\n   */\r\n  private cleanup(): void {\r\n    const now = Date.now()\r\n    const twoHoursAgo = now - 2 * 60 * 60 * 1000\r\n    \r\n    // Parse and remove old minute windows\r\n    for (const [key] of this.minuteTokens) {\r\n      if (this.parseWindowTimestamp(key) < twoHoursAgo) {\r\n        this.minuteTokens.delete(key)\r\n      }\r\n    }\r\n    \r\n    // Parse and remove old hour windows\r\n    for (const [key] of this.hourTokens) {\r\n      if (this.parseWindowTimestamp(key) < twoHoursAgo) {\r\n        this.hourTokens.delete(key)\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Parse timestamp from window key\r\n   */\r\n  private parseWindowTimestamp(windowKey: string): number {\r\n    const parts = windowKey.split('_')[1].split('-')\r\n    const year = parseInt(parts[0])\r\n    const month = parseInt(parts[1]) - 1\r\n    const day = parseInt(parts[2])\r\n    const hour = parseInt(parts[3])\r\n    const minute = windowKey.startsWith('minute') ? parseInt(parts[4]) : 0\r\n    \r\n    return new Date(year, month, day, hour, minute).getTime()\r\n  }\r\n\r\n  /**\r\n   * Destroy the rate limiter (cleanup interval)\r\n   */\r\n  destroy(): void {\r\n    if (this.cleanupInterval) {\r\n      clearInterval(this.cleanupInterval as NodeJS.Timeout)\r\n    }\r\n  }\r\n}\r\n\r\n","/**\r\n * Pins API Methods\r\n */\r\n\r\nimport type { PindownClient } from '../PindownClient'\r\nimport type {\r\n  Pin,\r\n  CreatePinRequest,\r\n  UpdatePinRequest,\r\n  SharePinRequest,\r\n  ListPinsOptions,\r\n  PaginatedResponse\r\n} from '../../types/api'\r\n\r\nexport class PinsMethods {\r\n  constructor(private client: PindownClient) {}\r\n\r\n  /**\r\n   * Create a new pin\r\n   */\r\n  async create(request: CreatePinRequest): Promise<Pin> {\r\n    return this.client.request<Pin>('POST', '/pins', request)\r\n  }\r\n\r\n  /**\r\n   * Get a pin by ID\r\n   */\r\n  async get(pinId: string): Promise<Pin> {\r\n    return this.client.request<Pin>('GET', `/pins/${pinId}`)\r\n  }\r\n\r\n  /**\r\n   * List all pins\r\n   */\r\n  async list(options?: ListPinsOptions): Promise<PaginatedResponse<Pin>> {\r\n    const params = new URLSearchParams()\r\n    if (options?.limit) params.append('limit', options.limit.toString())\r\n    if (options?.offset) params.append('offset', options.offset.toString())\r\n\r\n    const query = params.toString()\r\n    const endpoint = query ? `/pins?${query}` : '/pins'\r\n\r\n    return this.client.request<PaginatedResponse<Pin>>('GET', endpoint)\r\n  }\r\n\r\n  /**\r\n   * Update a pin\r\n   */\r\n  async update(pinId: string, request: UpdatePinRequest): Promise<Pin> {\r\n    return this.client.request<Pin>('PUT', `/pins/${pinId}`, request)\r\n  }\r\n\r\n  /**\r\n   * Delete a pin\r\n   */\r\n  async delete(pinId: string): Promise<void> {\r\n    return this.client.request<void>('DELETE', `/pins/${pinId}`)\r\n  }\r\n\r\n  /**\r\n   * Update pin sharing settings\r\n   */\r\n  async share(pinId: string, request: SharePinRequest): Promise<Pin> {\r\n    return this.client.request<Pin>('POST', `/pins/${pinId}/share`, request)\r\n  }\r\n\r\n  // ============================================\r\n  // Batch Operations\r\n  // ============================================\r\n\r\n  /**\r\n   * Get multiple pins by IDs in a single request (max 100 pins)\r\n   */\r\n  async batchGet(pinIds: string[]): Promise<{\r\n    found: Pin[]\r\n    not_found: string[]\r\n    permission_denied: string[]\r\n  }> {\r\n    return this.client.request<{\r\n      found: Pin[]\r\n      not_found: string[]\r\n      permission_denied: string[]\r\n    }>('POST', '/pins/batch/get', {\r\n      pin_ids: pinIds\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Create multiple pins in a single request (max 50 pins)\r\n   */\r\n  async batchCreate(pins: CreatePinRequest[]): Promise<{\r\n    created: Array<{ id: string; index: number; created_at: number }>\r\n    failed: Array<{ index: number; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      created: Array<{ id: string; index: number; created_at: number }>\r\n      failed: Array<{ index: number; error: string }>\r\n    }>('POST', '/pins/batch', {\r\n      pins\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Update multiple pins in a single request (max 50 pins)\r\n   */\r\n  async batchUpdate(updates: Array<{ id: string } & UpdatePinRequest>): Promise<{\r\n    updated: string[]\r\n    failed: Array<{ id: string; error: string }>\r\n    updated_at: number\r\n  }> {\r\n    return this.client.request<{\r\n      updated: string[]\r\n      failed: Array<{ id: string; error: string }>\r\n      updated_at: number\r\n    }>('PATCH', '/pins/batch', {\r\n      updates\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Delete multiple pins in a single request (max 50 pins)\r\n   */\r\n  async batchDelete(pinIds: string[]): Promise<{\r\n    deleted: string[]\r\n    failed: Array<{ id: string; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      deleted: string[]\r\n      failed: Array<{ id: string; error: string }>\r\n    }>('DELETE', '/pins/batch', {\r\n      pin_ids: pinIds\r\n    })\r\n  }\r\n\r\n  // ============================================\r\n  // Helper methods for common pin types\r\n  // ============================================\r\n\r\n  /**\r\n   * Create a markdown pin (content comes from blocks)\r\n   */\r\n  async createMarkdown(title: string, additionalMetadata?: Partial<CreatePinRequest['metadata']>): Promise<Pin> {\r\n    return this.create({\r\n      data_type: 'markdown',\r\n      metadata: {\r\n        title,\r\n        ...additionalMetadata\r\n      }\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Create a stat card pin\r\n   */\r\n  async createStatCard(data: {\r\n    title: string\r\n    value: string | number\r\n    change?: string\r\n    icon?: string\r\n  }, title: string, additionalMetadata?: Partial<CreatePinRequest['metadata']>): Promise<Pin> {\r\n    return this.create({\r\n      data_type: 'pin-card',\r\n      metadata: {\r\n        title,\r\n        pin_card_type: 'stat-cards',\r\n        pin_card_config: [data],\r\n        ...additionalMetadata\r\n      }\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Create a flexible table pin\r\n   */\r\n  async createTable(data: {\r\n    columns: Array<{ id: string; label: string; type?: string }>\r\n    rows: Array<Record<string, any>>\r\n  }, title: string, additionalMetadata?: Partial<CreatePinRequest['metadata']>): Promise<Pin> {\r\n    return this.create({\r\n      data_type: 'pin-card',\r\n      metadata: {\r\n        title,\r\n        pin_card_type: 'flexible-table',\r\n        pin_card_config: data,\r\n        ...additionalMetadata\r\n      }\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Create an embed pin (YouTube, Figma, etc.)\r\n   */\r\n  async createEmbed(url: string, title: string, additionalMetadata?: Partial<CreatePinRequest['metadata']>): Promise<Pin> {\r\n    return this.create({\r\n      data_type: 'pin-card',\r\n      metadata: {\r\n        title,\r\n        pin_card_type: 'embed',\r\n        pin_card_config: { url },\r\n        ...additionalMetadata\r\n      }\r\n    })\r\n  }\r\n}\r\n\r\n","/**\r\n * Pinboards API Methods\r\n */\r\n\r\nimport type { PindownClient } from '../PindownClient'\r\nimport type {\r\n  Pinboard,\r\n  CreatePinboardRequest,\r\n  UpdatePinboardRequest,\r\n  AddPinToPinboardRequest,\r\n  UpdatePinboardLayoutRequest\r\n} from '../../types/api'\r\n\r\nexport class PinboardsMethods {\r\n  constructor(private client: PindownClient) {}\r\n\r\n  /**\r\n   * Create a new pinboard\r\n   */\r\n  async create(request: CreatePinboardRequest): Promise<Pinboard> {\r\n    return this.client.request<Pinboard>('POST', '/pinboards', request)\r\n  }\r\n\r\n  /**\r\n   * Get a pinboard by ID\r\n   */\r\n  async get(boardId: string): Promise<Pinboard> {\r\n    return this.client.request<Pinboard>('GET', `/pinboards/${boardId}`)\r\n  }\r\n\r\n  /**\r\n   * List all pinboards\r\n   */\r\n  async list(): Promise<Pinboard[]> {\r\n    return this.client.request<Pinboard[]>('GET', '/pinboards')\r\n  }\r\n\r\n  /**\r\n   * Update a pinboard\r\n   */\r\n  async update(boardId: string, request: UpdatePinboardRequest): Promise<Pinboard> {\r\n    return this.client.request<Pinboard>('PUT', `/pinboards/${boardId}`, request)\r\n  }\r\n\r\n  /**\r\n   * Delete a pinboard\r\n   */\r\n  async delete(boardId: string): Promise<void> {\r\n    return this.client.request<void>('DELETE', `/pinboards/${boardId}`)\r\n  }\r\n\r\n  /**\r\n   * Add a pin to a pinboard\r\n   */\r\n  async addPin(boardId: string, request: AddPinToPinboardRequest): Promise<Pinboard> {\r\n    return this.client.request<Pinboard>('POST', `/pinboards/${boardId}/pins`, request)\r\n  }\r\n\r\n  /**\r\n   * Remove a pin from a pinboard\r\n   */\r\n  async removePin(boardId: string, pinId: string): Promise<void> {\r\n    return this.client.request<void>('DELETE', `/pinboards/${boardId}/pins/${pinId}`)\r\n  }\r\n\r\n  /**\r\n   * Update pinboard layout\r\n   */\r\n  async updateLayout(boardId: string, request: UpdatePinboardLayoutRequest): Promise<Pinboard> {\r\n    return this.client.request<Pinboard>('PUT', `/pinboards/${boardId}/layout`, request)\r\n  }\r\n\r\n  /**\r\n   * Update pinboard sharing settings\r\n   */\r\n  async share(boardId: string, request: {\r\n    is_public?: boolean\r\n    require_sign_in?: boolean\r\n    allow_comments?: boolean\r\n  }): Promise<Pinboard> {\r\n    return this.client.request<Pinboard>('POST', `/pinboards/${boardId}/share`, request)\r\n  }\r\n\r\n  // ============================================\r\n  // Batch Operations\r\n  // ============================================\r\n\r\n  /**\r\n   * Get multiple pinboards by IDs in a single request (max 100 pinboards)\r\n   */\r\n  async batchGet(pinboardIds: string[]): Promise<{\r\n    found: Pinboard[]\r\n    not_found: string[]\r\n    permission_denied: string[]\r\n  }> {\r\n    return this.client.request<{\r\n      found: Pinboard[]\r\n      not_found: string[]\r\n      permission_denied: string[]\r\n    }>('POST', '/pinboards/batch/get', {\r\n      pinboard_ids: pinboardIds\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Add multiple pins to a pinboard with layout in a single request (max 50 pins)\r\n   */\r\n  async batchAddPins(boardId: string, pinIds: string[], layout?: Record<string, {\r\n    x: number\r\n    y: number\r\n    w: number\r\n    h: number\r\n  }>): Promise<{\r\n    added: string[]\r\n    failed: Array<{ id: string; error: string }>\r\n    layout_updated: boolean\r\n  }> {\r\n    return this.client.request<{\r\n      added: string[]\r\n      failed: Array<{ id: string; error: string }>\r\n      layout_updated: boolean\r\n    }>('POST', `/pinboards/${boardId}/pins/batch`, {\r\n      pin_ids: pinIds,\r\n      layout\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Remove multiple pins from a pinboard in a single request (max 50 pins)\r\n   */\r\n  async batchRemovePins(boardId: string, pinIds: string[]): Promise<{\r\n    removed: string[]\r\n    failed: Array<{ id: string; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      removed: string[]\r\n      failed: Array<{ id: string; error: string }>\r\n    }>('DELETE', `/pinboards/${boardId}/pins/batch`, {\r\n      pin_ids: pinIds\r\n    })\r\n  }\r\n\r\n  // ============================================\r\n  // Custom Roles\r\n  // ============================================\r\n\r\n  /**\r\n   * Create a custom role for a pinboard (max 5 roles per pinboard)\r\n   */\r\n  async createRole(boardId: string, request: {\r\n    name: string\r\n    color: string\r\n    permissions?: Record<string, any>\r\n  }): Promise<{ roleId: string; name: string; color: string }> {\r\n    return this.client.request<{ roleId: string; name: string; color: string }>('POST', `/pinboards/${boardId}/roles`, request)\r\n  }\r\n\r\n  /**\r\n   * List custom roles for a pinboard\r\n   */\r\n  async listRoles(boardId: string): Promise<Record<string, any>> {\r\n    return this.client.request<Record<string, any>>('GET', `/pinboards/${boardId}/roles`)\r\n  }\r\n\r\n  /**\r\n   * Update a custom role\r\n   */\r\n  async updateRole(boardId: string, roleId: string, request: {\r\n    name?: string\r\n    color?: string\r\n    permissions?: Record<string, any>\r\n  }): Promise<void> {\r\n    return this.client.request<void>('PUT', `/pinboards/${boardId}/roles/${roleId}`, request)\r\n  }\r\n\r\n  /**\r\n   * Delete a custom role\r\n   */\r\n  async deleteRole(boardId: string, roleId: string): Promise<void> {\r\n    return this.client.request<void>('DELETE', `/pinboards/${boardId}/roles/${roleId}`)\r\n  }\r\n\r\n  /**\r\n   * Assign custom roles to a user (user must be a collaborator first)\r\n   */\r\n  async assignUserRoles(boardId: string, userId: string, roleIds: string[]): Promise<void> {\r\n    return this.client.request<void>('PUT', `/pinboards/${boardId}/users/${userId}/custom-roles`, { roleIds })\r\n  }\r\n\r\n  /**\r\n   * Set role requirements for a pin (only users with these roles can see the pin)\r\n   */\r\n  async setPinRoleRequirements(boardId: string, pinId: string, roleIds: string[]): Promise<void> {\r\n    return this.client.request<void>('PUT', `/pinboards/${boardId}/pins/${pinId}/required-roles`, { roleIds })\r\n  }\r\n}\r\n\r\n","/**\r\n * Datasets API Methods\r\n */\r\n\r\nimport type { PindownClient } from '../PindownClient'\r\nimport type {\r\n  Dataset,\r\n  CreateDatasetRequest,\r\n  UpdateDatasetRequest\r\n} from '../../types/api'\r\n\r\nexport class DatasetsMethods {\r\n  constructor(private client: PindownClient) {}\r\n\r\n  /**\r\n   * Create a new dataset\r\n   */\r\n  async create(request: CreateDatasetRequest): Promise<Dataset> {\r\n    return this.client.request<Dataset>('POST', '/datasets', request)\r\n  }\r\n\r\n  /**\r\n   * Get a dataset by ID\r\n   */\r\n  async get(datasetId: string): Promise<Dataset> {\r\n    return this.client.request<Dataset>('GET', `/datasets/${datasetId}`)\r\n  }\r\n\r\n  /**\r\n   * List all datasets\r\n   */\r\n  async list(): Promise<Dataset[]> {\r\n    return this.client.request<Dataset[]>('GET', '/datasets')\r\n  }\r\n\r\n  /**\r\n   * Update a dataset\r\n   */\r\n  async update(datasetId: string, request: UpdateDatasetRequest): Promise<Dataset> {\r\n    return this.client.request<Dataset>('PUT', `/datasets/${datasetId}`, request)\r\n  }\r\n\r\n  /**\r\n   * Delete a dataset\r\n   */\r\n  async delete(datasetId: string): Promise<void> {\r\n    return this.client.request<void>('DELETE', `/datasets/${datasetId}`)\r\n  }\r\n\r\n  /**\r\n   * Invite a collaborator to a dataset\r\n   */\r\n  async inviteCollaborator(\r\n    datasetId: string,\r\n    request: { email: string; role: 'editor' | 'viewer' }\r\n  ): Promise<{ email: string; role: 'editor' | 'viewer'; inviteToken: string; expiresAt: number }> {\r\n    return this.client.request<{ email: string; role: 'editor' | 'viewer'; inviteToken: string; expiresAt: number }>(\r\n      'POST',\r\n      `/datasets/${datasetId}/collaborators`,\r\n      request\r\n    )\r\n  }\r\n\r\n  // ============================================\r\n  // Batch Operations\r\n  // ============================================\r\n\r\n  /**\r\n   * Get multiple datasets by IDs in a single request (max 100 datasets)\r\n   */\r\n  async batchGet(datasetIds: string[]): Promise<{\r\n    found: Dataset[]\r\n    not_found: string[]\r\n    permission_denied: string[]\r\n  }> {\r\n    return this.client.request<{\r\n      found: Dataset[]\r\n      not_found: string[]\r\n      permission_denied: string[]\r\n    }>('POST', '/datasets/batch/get', {\r\n      dataset_ids: datasetIds\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Create multiple datasets in a single request (max 50 datasets)\r\n   */\r\n  async batchCreate(datasets: Array<{\r\n    name: string\r\n    schema?: any\r\n    data?: any\r\n    is_public?: boolean\r\n  }>): Promise<{\r\n    created: Dataset[]\r\n    failed: Array<{ index: number; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      created: Dataset[]\r\n      failed: Array<{ index: number; error: string }>\r\n    }>('POST', '/datasets/batch', {\r\n      datasets\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Update multiple datasets in a single request (max 50 datasets)\r\n   */\r\n  async batchUpdate(updates: Array<{\r\n    id: string\r\n    name?: string\r\n    schema?: any\r\n    data?: any\r\n    is_public?: boolean\r\n  }>): Promise<{\r\n    updated: string[]\r\n    failed: Array<{ id: string; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      updated: string[]\r\n      failed: Array<{ id: string; error: string }>\r\n    }>('PATCH', '/datasets/batch', {\r\n      updates\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Delete multiple datasets in a single request (max 50 datasets)\r\n   */\r\n  async batchDelete(datasetIds: string[]): Promise<{\r\n    deleted: string[]\r\n    failed: Array<{ id: string; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      deleted: string[]\r\n      failed: Array<{ id: string; error: string }>\r\n    }>('DELETE', '/datasets/batch', {\r\n      dataset_ids: datasetIds\r\n    })\r\n  }\r\n}\r\n\r\n","/**\r\n * Blocks API Methods\r\n */\r\n\r\nimport type { PindownClient } from '../PindownClient'\r\nimport type {\r\n  Block,\r\n  CreateBlockRequest,\r\n  UpdateBlockRequest\r\n} from '../../types/api'\r\n\r\nexport class BlocksMethods {\r\n  constructor(private client: PindownClient) {}\r\n\r\n  /**\r\n   * Create a new block for a pin\r\n   */\r\n  async create(pinId: string, request: CreateBlockRequest): Promise<Block> {\r\n    return this.client.request<Block>('POST', `/pins/${pinId}/blocks`, request)\r\n  }\r\n\r\n  /**\r\n   * Get a block by ID\r\n   */\r\n  async get(pinId: string, blockId: string): Promise<Block> {\r\n    return this.client.request<Block>('GET', `/pins/${pinId}/blocks/${blockId}`)\r\n  }\r\n\r\n  /**\r\n   * List all blocks in a pin\r\n   */\r\n  async list(pinId: string): Promise<Block[]> {\r\n    return this.client.request<Block[]>('GET', `/pins/${pinId}/blocks`)\r\n  }\r\n\r\n  /**\r\n   * Update a block\r\n   */\r\n  async update(pinId: string, blockId: string, request: UpdateBlockRequest): Promise<Block> {\r\n    return this.client.request<Block>('PUT', `/pins/${pinId}/blocks/${blockId}`, request)\r\n  }\r\n\r\n  /**\r\n   * Delete a block\r\n   */\r\n  async delete(pinId: string, blockId: string): Promise<void> {\r\n    return this.client.request<void>('DELETE', `/pins/${pinId}/blocks/${blockId}`)\r\n  }\r\n\r\n  // ============================================\r\n  // Batch Operations\r\n  // ============================================\r\n\r\n  /**\r\n   * Get multiple blocks by IDs in a single request (max 100 blocks)\r\n   */\r\n  async batchGet(blockIds: Array<{ pin_id: string; block_id: string }>): Promise<{\r\n    found: Block[]\r\n    not_found: Array<{ pin_id: string; block_id: string }>\r\n    permission_denied: Array<{ pin_id: string; block_id: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      found: Block[]\r\n      not_found: Array<{ pin_id: string; block_id: string }>\r\n      permission_denied: Array<{ pin_id: string; block_id: string }>\r\n    }>('POST', '/blocks/batch/get', {\r\n      block_ids: blockIds\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Create multiple blocks for a pin in a single request (max 50 blocks)\r\n   */\r\n  async batchCreate(pinId: string, blocks: Array<{\r\n    title: string\r\n    type?: 'markdown' | 'code' | 'text' | 'image'\r\n    template?: string\r\n    order?: number\r\n  }>): Promise<{\r\n    created: Block[]\r\n    failed: Array<{ index: number; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      created: Block[]\r\n      failed: Array<{ index: number; error: string }>\r\n    }>('POST', '/blocks/batch', {\r\n      pin_id: pinId,\r\n      blocks\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Update multiple blocks in a single request (max 50 blocks)\r\n   */\r\n  async batchUpdate(updates: Array<{\r\n    pin_id: string\r\n    block_id: string\r\n    title?: string\r\n    type?: 'markdown' | 'code' | 'text' | 'image'\r\n    template?: string\r\n    order?: number\r\n  }>): Promise<{\r\n    updated: Array<{ pin_id: string; block_id: string }>\r\n    failed: Array<{ pin_id: string; block_id: string; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      updated: Array<{ pin_id: string; block_id: string }>\r\n      failed: Array<{ pin_id: string; block_id: string; error: string }>\r\n    }>('PATCH', '/blocks/batch', {\r\n      updates\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Delete multiple blocks in a single request (max 50 blocks)\r\n   */\r\n  async batchDelete(blockIds: Array<{ pin_id: string; block_id: string }>): Promise<{\r\n    deleted: Array<{ pin_id: string; block_id: string }>\r\n    failed: Array<{ pin_id: string; block_id: string; error: string }>\r\n  }> {\r\n    return this.client.request<{\r\n      deleted: Array<{ pin_id: string; block_id: string }>\r\n      failed: Array<{ pin_id: string; block_id: string; error: string }>\r\n    }>('DELETE', '/blocks/batch', {\r\n      block_ids: blockIds\r\n    })\r\n  }\r\n}\r\n\r\n","/**\r\n * Collaborators API Methods\r\n */\r\n\r\nimport type { PindownClient } from '../PindownClient'\r\nimport type {\r\n  Collaborator,\r\n  InviteCollaboratorRequest,\r\n  UpdateCollaboratorRoleRequest,\r\n  Permissions\r\n} from '../../types/api'\r\n\r\nexport class CollaboratorsMethods {\r\n  constructor(private client: PindownClient) {}\r\n\r\n  // ============================================\r\n  // Pin Collaborators\r\n  // ============================================\r\n\r\n  /**\r\n   * List collaborators for a pin\r\n   */\r\n  async listForPin(pinId: string): Promise<{\r\n    owner: Collaborator\r\n    collaborators: Collaborator[]\r\n    pending_invites: Array<{ email: string; role: string; invited_at: string }>\r\n  }> {\r\n    return this.client.request('GET', `/pins/${pinId}/collaborators`)\r\n  }\r\n\r\n  /**\r\n   * Invite a collaborator to a pin\r\n   */\r\n  async inviteToPin(pinId: string, request: InviteCollaboratorRequest): Promise<void> {\r\n    return this.client.request('POST', `/pins/${pinId}/collaborators`, request)\r\n  }\r\n\r\n  /**\r\n   * Update a pin collaborator's role\r\n   */\r\n  async updatePinRole(pinId: string, userId: string, request: UpdateCollaboratorRoleRequest): Promise<void> {\r\n    return this.client.request('PUT', `/pins/${pinId}/collaborators/${userId}`, request)\r\n  }\r\n\r\n  /**\r\n   * Remove a collaborator from a pin\r\n   */\r\n  async removeFromPin(pinId: string, userId: string): Promise<void> {\r\n    return this.client.request('DELETE', `/pins/${pinId}/collaborators/${userId}`)\r\n  }\r\n\r\n  /**\r\n   * Get current user's permissions for a pin\r\n   */\r\n  async getPinPermissions(pinId: string): Promise<Permissions> {\r\n    return this.client.request('GET', `/pins/${pinId}/permissions`)\r\n  }\r\n\r\n  // ============================================\r\n  // Pinboard Collaborators\r\n  // ============================================\r\n\r\n  /**\r\n   * List collaborators for a pinboard\r\n   */\r\n  async listForPinboard(boardId: string): Promise<{\r\n    owner: Collaborator\r\n    collaborators: Collaborator[]\r\n    pending_invites: Array<{ email: string; role: string; invited_at: string }>\r\n  }> {\r\n    return this.client.request('GET', `/pinboards/${boardId}/collaborators`)\r\n  }\r\n\r\n  /**\r\n   * Invite a collaborator to a pinboard\r\n   */\r\n  async inviteToPinboard(boardId: string, request: InviteCollaboratorRequest): Promise<void> {\r\n    return this.client.request('POST', `/pinboards/${boardId}/collaborators`, request)\r\n  }\r\n\r\n  /**\r\n   * Update a pinboard collaborator's role\r\n   */\r\n  async updatePinboardRole(boardId: string, userId: string, request: UpdateCollaboratorRoleRequest): Promise<void> {\r\n    return this.client.request('PUT', `/pinboards/${boardId}/collaborators/${userId}`, request)\r\n  }\r\n\r\n  /**\r\n   * Remove a collaborator from a pinboard\r\n   */\r\n  async removeFromPinboard(boardId: string, userId: string): Promise<void> {\r\n    return this.client.request('DELETE', `/pinboards/${boardId}/collaborators/${userId}`)\r\n  }\r\n\r\n  /**\r\n   * Get current user's permissions for a pinboard\r\n   */\r\n  async getPinboardPermissions(boardId: string): Promise<Permissions> {\r\n    return this.client.request('GET', `/pinboards/${boardId}/permissions`)\r\n  }\r\n}\r\n\r\n","/**\n * Pindown API Client\n */\n\nimport { RateLimiter } from '../utils/RateLimiter'\nimport { PinsMethods } from './pins'\nimport { PinboardsMethods } from './pinboards'\nimport { DatasetsMethods } from './datasets'\nimport { BlocksMethods } from './blocks'\nimport { CollaboratorsMethods } from './collaborators'\nimport type { PindownConfig, Tier } from '../types/config'\nimport type { RateLimitInfo } from '../types/api'\nimport {\n  AuthenticationError,\n  ForbiddenError,\n  NotFoundError,\n  ValidationError,\n  ServerError,\n  NetworkError\n} from '../errors'\n\nexport class PindownClient {\n  private config: Omit<Required<PindownConfig>, 'tier'> & { tier?: Tier }\n  private rateLimiter?: RateLimiter\n  private tierDetected: boolean = false\n\n  public readonly pins: PinsMethods\n  public readonly pinboards: PinboardsMethods\n  public readonly datasets: DatasetsMethods\n  public readonly blocks: BlocksMethods\n  public readonly collaborators: CollaboratorsMethods\n\n  constructor(config: PindownConfig) {\n    // Validate required config\n    if (!config.apiKey) {\n      throw new Error('API key is required')\n    }\n\n    // Set defaults\n    this.config = {\n      apiKey: config.apiKey,\n      tier: config.tier, // Optional - will be auto-detected\n      baseURL: config.baseURL || 'https://api.pindown.ai/v1',\n      enableRateLimitTracking: config.enableRateLimitTracking ?? true,\n      maxRetries: config.maxRetries ?? 3,\n      timeout: config.timeout ?? 30000\n    }\n\n    // Initialize rate limiter if tier is provided\n    if (this.config.tier) {\n      this.rateLimiter = new RateLimiter(this.config.tier)\n      this.tierDetected = true\n    }\n\n    // Initialize API methods\n    this.pins = new PinsMethods(this)\n    this.pinboards = new PinboardsMethods(this)\n    this.datasets = new DatasetsMethods(this)\n    this.blocks = new BlocksMethods(this)\n    this.collaborators = new CollaboratorsMethods(this)\n  }\n\n  /**\n   * Core request method\n   */\n  async request<T = any>(\n    method: string,\n    endpoint: string,\n    data?: any\n  ): Promise<T> {\n    // Check rate limit BEFORE making request (if tier is detected)\n    if (this.config.enableRateLimitTracking && this.rateLimiter) {\n      this.rateLimiter.checkLimit(method, endpoint, data)\n    }\n\n    const url = `${this.config.baseURL}${endpoint}`\n    const headers: Record<string, string> = {\n      'Authorization': `Bearer ${this.config.apiKey}`\n    }\n\n    // Only set Content-Type for methods with body\n    if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH' || method === 'DELETE')) {\n      headers['Content-Type'] = 'application/json'\n    }\n\n    const requestOptions: RequestInit = {\n      method,\n      headers,\n      signal: AbortSignal.timeout(this.config.timeout)\n    }\n\n    if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH' || method === 'DELETE')) {\n      requestOptions.body = JSON.stringify(data)\n    }\n\n    try {\n      const response = await fetch(url, requestOptions)\n\n      // Auto-detect tier from response headers (if not already detected)\n      if (!this.tierDetected && this.config.enableRateLimitTracking) {\n        this.detectTierFromHeaders(response.headers)\n      }\n\n      // Handle error responses\n      if (!response.ok) {\n        await this.handleErrorResponse(response)\n      }\n\n      // Parse JSON response\n      const result = await response.json()\n      return result.data as T\n    } catch (error: any) {\n      // Re-throw our custom errors\n      if (\n        error instanceof AuthenticationError ||\n        error instanceof ForbiddenError ||\n        error instanceof NotFoundError ||\n        error instanceof ValidationError ||\n        error instanceof ServerError\n      ) {\n        throw error\n      }\n\n      // Network or timeout errors\n      if (error.name === 'AbortError' || error.name === 'TimeoutError') {\n        throw new NetworkError('Request timeout')\n      }\n\n      throw new NetworkError(error.message || 'Network request failed')\n    }\n  }\n\n  /**\n   * Handle error responses from API\n   */\n  private async handleErrorResponse(response: Response): Promise<never> {\n    let errorData: any\n\n    try {\n      errorData = await response.json()\n    } catch {\n      errorData = { message: response.statusText }\n    }\n\n    const message = errorData.error?.message || errorData.message || 'Unknown error'\n\n    switch (response.status) {\n      case 401:\n        throw new AuthenticationError(message)\n      case 403:\n        throw new ForbiddenError(message)\n      case 404:\n        throw new NotFoundError(message)\n      case 400:\n      case 422:\n        throw new ValidationError(message, errorData.error?.details)\n      case 429:\n        // Rate limit error from server (should rarely happen with client-side limiting)\n        throw new ValidationError('Rate limit exceeded (server)', errorData)\n      case 500:\n      case 502:\n      case 503:\n        throw new ServerError(message, response.status)\n      default:\n        throw new ServerError(message, response.status)\n    }\n  }\n\n  /**\n   * Detect tier from response headers\n   */\n  private detectTierFromHeaders(headers: Headers): void {\n    const tierHeader = headers.get('X-RateLimit-Tier')\n    if (tierHeader && !this.rateLimiter) {\n      const tier = tierHeader.toLowerCase() as Tier\n      console.log(`[Pindown Client] Auto-detected tier: ${tier}`)\n      this.config.tier = tier\n      this.rateLimiter = new RateLimiter(tier)\n      this.tierDetected = true\n    }\n  }\n\n  /**\n   * Get current rate limit info\n   */\n  getRateLimitInfo(): RateLimitInfo | null {\n    if (!this.rateLimiter) {\n      return null\n    }\n    return this.rateLimiter.getRateLimitInfo()\n  }\n\n  /**\n   * Get current tier\n   */\n  getTier(): Tier | null {\n    return this.config.tier || null\n  }\n\n  /**\n   * Destroy the client (cleanup resources)\n   */\n  destroy(): void {\n    if (this.rateLimiter) {\n      this.rateLimiter.destroy()\n    }\n  }\n}\n\n"]}