@chronary/sdk 0.4.2 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/index.cjs +43 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +87 -5
- package/dist/index.d.ts +87 -5
- package/dist/index.js +42 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/error.ts","../src/api-promise.ts","../src/client.ts","../src/pagination.ts","../src/resources/agents.ts","../src/resources/calendars.ts","../src/resources/events.ts","../src/resources/availability.ts","../src/resources/webhooks.ts","../src/resources/ical-subscriptions.ts","../src/resources/scheduling.ts","../src/resources/usage.ts","../src/resources/audit-log.ts","../src/resources/keys.ts","../src/resources/agent-auth.ts","../src/resources/waitlist.ts","../src/resources/feedback.ts","../src/resources/plans.ts","../src/resources/account.ts","../src/resources/terms.ts","../src/webhook-verify.ts","../src/index.ts"],"sourcesContent":["export const VERSION = '0.4.2';\n","export class ChronaryError extends Error {\n readonly status: number;\n readonly requestId: string | undefined;\n readonly headers: Headers | undefined;\n readonly errorType: string | undefined;\n\n constructor(\n message: string,\n status: number,\n requestId?: string,\n headers?: Headers,\n errorType?: string,\n ) {\n super(message);\n this.name = 'ChronaryError';\n this.status = status;\n this.requestId = requestId;\n this.headers = headers;\n this.errorType = errorType;\n }\n}\n\nexport class AuthenticationError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 401, requestId, headers, 'authentication_error');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class RateLimitError extends ChronaryError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 429, requestId, headers, 'rate_limit_error');\n this.name = 'RateLimitError';\n if (headers) {\n const ra = headers.get('retry-after');\n if (ra) this.retryAfter = parseInt(ra, 10);\n }\n }\n}\n\nexport class NotFoundError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 404, requestId, headers, 'not_found');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends ChronaryError {\n constructor(message: string, status: number, requestId?: string, headers?: Headers) {\n super(message, status, requestId, headers, 'validation_error');\n this.name = 'ValidationError';\n }\n}\n\nexport class QuotaExceededError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 402, requestId, headers, 'quota_exceeded');\n this.name = 'QuotaExceededError';\n }\n}\n\nexport class TimeoutError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'TimeoutError';\n }\n}\n\nexport class ConnectionError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * APIPromise wraps a fetch call as a thenable so callers can `await` it\n * for parsed data, or call `.withResponse()` to get both parsed data and the raw\n * Response (headers, status, etc.).\n *\n * ```ts\n * // Normal — just the data\n * const agent = await client.agents.get('agt_1');\n *\n * // With response access\n * const { data, response } = await client.agents.get('agt_1').withResponse();\n * console.log(response.status);\n * console.log(response.headers.get('x-request-id'));\n * ```\n */\n/**\n * Parsed quota snapshot from the IETF `RateLimit` / `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Present on responses from endpoints\n * that enforce quotas (most authenticated routes); absent on unauthenticated\n * or unlimited-plan responses.\n */\nexport interface QuotaSnapshot {\n /** Configured ceiling (e.g. `1_000_000` API calls/month). Parsed from `RateLimit-Policy`. */\n limit: number;\n /** Remaining quota in the current window. Parsed from `RateLimit`. */\n remaining: number;\n /** Wall-clock time when the window resets. Computed from the `t=` delta-seconds in `RateLimit`. */\n resetAt: Date;\n}\n\nexport interface RawResponse {\n status: number;\n headers: Headers;\n url: string;\n /**\n * Typed view of the IETF RateLimit headers when present. Use this instead of\n * parsing `headers.get('ratelimit')` yourself. `undefined` for responses\n * that don't emit quota headers (public endpoints, unlimited plans).\n */\n quota?: QuotaSnapshot;\n}\n\nexport interface WithResponse<T> {\n data: T;\n response: RawResponse;\n}\n\n/**\n * APIPromise is a thenable that resolves to `T` when awaited, but also\n * exposes `.withResponse()` to get both the data and raw HTTP response.\n *\n * Because it implements `.then()`, it can be awaited, used with `Promise.all()`,\n * and chained with `.then()` / `.catch()` / `.finally()`.\n */\nexport class APIPromise<T> implements PromiseLike<T> {\n private innerPromise: Promise<{ data: T; rawResponse: RawResponse }>;\n\n constructor(\n responsePromise: Promise<{ data: T; rawResponse: RawResponse }>,\n ) {\n this.innerPromise = responsePromise;\n }\n\n /**\n * Returns both the parsed data and the raw HTTP response.\n */\n async withResponse(): Promise<WithResponse<T>> {\n const { data, rawResponse } = await this.innerPromise;\n return { data, response: rawResponse };\n }\n\n /**\n * Implements the thenable interface. When awaited, resolves to just the parsed data `T`.\n */\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.innerPromise.then(\n (result) => (onfulfilled ? onfulfilled(result.data) : result.data as unknown as TResult1),\n onrejected,\n );\n }\n\n /**\n * Attaches a rejection handler.\n */\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n ): Promise<T | TResult> {\n return this.then(undefined, onrejected);\n }\n\n /**\n * Attaches a handler that runs on both fulfillment and rejection.\n */\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then(\n (value) => { onfinally?.(); return value; },\n (reason) => { onfinally?.(); throw reason; },\n );\n }\n}\n","import { VERSION } from './version';\nimport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\nimport { APIPromise } from './api-promise';\nimport type { QuotaSnapshot, RawResponse } from './api-promise';\nimport type { ChronaryConfig, LogLevel, RequestOptions, ApiErrorBody } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.chronary.ai';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\nconst MAX_RETRY_DELAY = 60_000;\n\nfunction getEnvVar(name: string): string | undefined {\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n } catch {\n // process.env not available (browser, CF Workers, etc.)\n }\n return undefined;\n}\n\nfunction resolveLogLevel(config: ChronaryConfig): LogLevel {\n if (config.logLevel) return config.logLevel;\n const envLog = getEnvVar('CHRONARY_LOG');\n if (envLog && ['debug', 'info', 'warn', 'error', 'off'].includes(envLog)) {\n return envLog as LogLevel;\n }\n return 'off';\n}\n\nconst LOG_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n off: 4,\n};\n\nexport class CoreClient {\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly logLevel: LogLevel;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly userAgent: string;\n private readonly extraHeaders: Record<string, string>;\n\n constructor(config: ChronaryConfig = {}) {\n // apiKey is optional at construction — some endpoints (agentAuth.signUp,\n // plans.list) do not require auth. When a caller invokes an authed\n // endpoint without a key, the server returns 401 and the SDK surfaces it\n // as AuthenticationError — same error shape either way.\n this.apiKey = config.apiKey ?? getEnvVar('CHRONARY_API_KEY') ?? '';\n\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.logLevel = resolveLogLevel(config);\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.extraHeaders = config.extraHeaders ?? {};\n\n let ua = `chronary-ts/${VERSION}`;\n if (config.appInfo) {\n ua += ` ${config.appInfo.name}`;\n if (config.appInfo.version) ua += `/${config.appInfo.version}`;\n }\n try {\n if (typeof process !== 'undefined' && process.version) {\n ua += ` node/${process.version.replace('v', '')}`;\n }\n } catch {\n // Not in Node\n }\n this.userAgent = ua;\n }\n\n private log(level: LogLevel, message: string) {\n if (level === 'off' || LOG_PRIORITY[level] < LOG_PRIORITY[this.logLevel]) return;\n const prefix = `[chronary:${level}]`;\n switch (level) {\n case 'debug': console.debug(prefix, message); break;\n case 'info': console.info(prefix, message); break;\n case 'warn': console.warn(prefix, message); break;\n case 'error': console.error(prefix, message); break;\n }\n }\n\n request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): APIPromise<T> {\n return new APIPromise<T>(this._request<T>(method, path, body, query, options));\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): Promise<{ data: T; rawResponse: RawResponse }> {\n const url = this.buildUrl(path, query);\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n 'X-Chronary-SDK-Version': VERSION,\n ...this.extraHeaders,\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (MUTATING_METHODS.has(method)) {\n headers['Idempotency-Key'] = options?.idempotencyKey ?? crypto.randomUUID();\n }\n\n const requestTimeout = options?.timeout ?? this.timeout;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.retryDelay(attempt, lastError);\n this.log('info', `Retry #${attempt} after ${delay}ms`);\n await sleep(delay);\n }\n\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n this.log('debug', `${method} ${path}`);\n const startTime = Date.now();\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n const elapsed = Date.now() - startTime;\n const requestId = response.headers.get('x-request-id') ?? undefined;\n\n this.log('debug', `${method} ${path} → ${response.status} in ${elapsed}ms${requestId ? ` (${requestId})` : ''}`);\n\n if (response.ok) {\n const rawResponse: RawResponse = {\n status: response.status,\n headers: response.headers,\n url: response.url,\n quota: parseQuotaSnapshot(response.headers),\n };\n if (response.status === 204) {\n return { data: undefined as T, rawResponse };\n }\n const data = await response.json() as T;\n return { data, rawResponse };\n }\n\n // Retryable?\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.maxRetries) {\n lastError = await this.buildError(response, requestId);\n continue;\n }\n\n throw await this.buildError(response, requestId);\n } catch (err) {\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n\n if (err instanceof ChronaryError) throw err;\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n throw new TimeoutError(`Request timed out after ${requestTimeout}ms`);\n }\n\n if (attempt < this.maxRetries) {\n lastError = err as Error;\n continue;\n }\n\n throw new ConnectionError(`Connection failed: ${(err as Error).message}`);\n }\n }\n\n throw lastError ?? new ConnectionError('Request failed after retries');\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n const base = `${this.baseUrl}${path}`;\n if (!query) return base;\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n private async buildError(response: Response, requestId?: string): Promise<ChronaryError> {\n let errorBody: ApiErrorBody | undefined;\n try {\n errorBody = await response.json() as ApiErrorBody;\n } catch {\n // Non-JSON response\n }\n\n const message = errorBody?.error?.message ?? `HTTP ${response.status}`;\n const rid = requestId ?? errorBody?.error?.request_id;\n const errorType = errorBody?.error?.type;\n\n switch (response.status) {\n case 400:\n if (errorType === 'validation_error') {\n return new ValidationError(message, response.status, rid, response.headers);\n }\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n case 401:\n return new AuthenticationError(message, rid, response.headers);\n case 402:\n return new QuotaExceededError(message, rid, response.headers);\n case 404:\n return new NotFoundError(message, rid, response.headers);\n case 422:\n return new ValidationError(message, response.status, rid, response.headers);\n case 429: {\n if (errorType === 'quota_exceeded') {\n return new QuotaExceededError(message, rid, response.headers);\n }\n return new RateLimitError(message, rid, response.headers);\n }\n default:\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n }\n }\n\n private retryDelay(attempt: number, lastError?: Error): number {\n // Respect Retry-After header\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n return Math.min(lastError.retryAfter * 1000, MAX_RETRY_DELAY);\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = 500;\n const exponential = base * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base;\n return Math.min(exponential + jitter, MAX_RETRY_DELAY);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the IETF structured-field `RateLimit` and `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Returns `undefined` if either header\n * is missing or unparseable — callers can still reach the raw header strings\n * via `response.headers`.\n *\n * `RateLimit` value example: `\"quota\";r=985477;t=187200`\n * `RateLimit-Policy` value example: `\"quota\";q=1000000;w=2592000;pk=org_abc`\n */\nfunction parseQuotaSnapshot(headers: Headers): QuotaSnapshot | undefined {\n const rateLimit = headers.get('ratelimit');\n const policy = headers.get('ratelimit-policy');\n if (!rateLimit || !policy) return undefined;\n\n const remaining = parseStructuredParam(rateLimit, 'r');\n const resetSeconds = parseStructuredParam(rateLimit, 't');\n const limit = parseStructuredParam(policy, 'q');\n if (remaining === undefined || resetSeconds === undefined || limit === undefined) {\n return undefined;\n }\n\n return {\n limit,\n remaining,\n resetAt: new Date(Date.now() + resetSeconds * 1000),\n };\n}\n\nfunction parseStructuredParam(header: string, key: string): number | undefined {\n // Match `;<key>=<digits>` — guards against partial matches inside other tokens.\n const re = new RegExp(`(?:^|;)\\\\s*${key}=(-?\\\\d+)(?:;|$)`);\n const match = re.exec(header);\n if (!match) return undefined;\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : undefined;\n}\n","import type { PageResponse, Page } from './types';\n\nexport class PageIterator<T> implements AsyncIterable<T> {\n private readonly fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>;\n private readonly defaultLimit: number;\n private readonly initialOffset: number;\n\n constructor(\n fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>,\n defaultLimit: number = 50,\n initialOffset: number = 0,\n ) {\n this.fetchPage = fetchPage;\n this.defaultLimit = defaultLimit;\n this.initialOffset = initialOffset;\n }\n\n async getPage(offset: number = this.initialOffset, limit?: number): Promise<Page<T>> {\n const l = limit ?? this.defaultLimit;\n const response = await this.fetchPage(offset, l);\n return {\n ...response,\n hasMore: offset + response.data.length < response.total,\n };\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let offset = this.initialOffset;\n const limit = this.defaultLimit;\n\n while (true) {\n const page = await this.fetchPage(offset, limit);\n for (const item of page.data) {\n yield item;\n }\n offset += page.data.length;\n if (offset >= page.total || page.data.length === 0) break;\n }\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register your agent with Chronary. Creates a Chronary identity for an agent\n * that already exists in your system, so it can own calendars, events, and webhooks.\n */\n async create(params: CreateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('POST', '/v1/agents', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('GET', `/v1/agents/${id}`, undefined, undefined, options);\n }\n\n list(params: ListAgentsParams = {}): PageIterator<Agent> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<Agent>(\n (offset, l) =>\n this.client.request<PageResponse<Agent>>('GET', '/v1/agents', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('PATCH', `/v1/agents/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/agents/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class CalendarsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateCalendarParams & { agentId?: string }, options?: RequestOptions): Promise<Calendar> {\n const { agentId, ...body } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return this.client.request<Calendar>('POST', path, body, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('GET', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n list(params: ListCalendarsParams = {}): PageIterator<Calendar> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return new PageIterator<Calendar>(\n (offset, l) =>\n this.client.request<PageResponse<Calendar>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateCalendarParams, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('PATCH', `/v1/calendars/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n async getContext(id: string, options?: RequestOptions): Promise<CalendarContext> {\n return this.client.request<CalendarContext>(\n 'GET', `/v1/calendars/${id}/context`, undefined, undefined, options,\n );\n }\n\n async setAvailabilityRules(\n id: string,\n params: SetAvailabilityRulesParams,\n options?: RequestOptions,\n ): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'PUT', `/v1/calendars/${id}/availability-rules`, params, undefined, options,\n );\n }\n\n async getAvailabilityRules(id: string, options?: RequestOptions): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'GET', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n\n async deleteAvailabilityRules(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class EventsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(calendarId: string, params: CreateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'POST', `/v1/calendars/${calendarId}/events`, params, undefined, options,\n );\n }\n\n async get(calendarId: string, eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n list(params: ListEventsParams = {}): PageIterator<CalendarEvent> {\n const { calendarId, agentId, limit = 50, offset = 0, ...filters } = params;\n\n let path: string;\n if (agentId) {\n path = `/v1/agents/${agentId}/events`;\n } else if (calendarId) {\n path = `/v1/calendars/${calendarId}/events`;\n } else {\n throw new Error('Either calendarId or agentId is required for events.list()');\n }\n\n return new PageIterator<CalendarEvent>(\n (offset, l) =>\n this.client.request<PageResponse<CalendarEvent>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(calendarId: string, eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/calendars/${calendarId}/events/${eventId}`, params, undefined, options,\n );\n }\n\n async delete(calendarId: string, eventId: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Fetch an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async getById(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Update an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async updateById(eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async deleteById(eventId: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Promote a held event (status='hold') to status='confirmed'. Fails with 409\n * if the event is not a hold, or if the hold has already expired.\n */\n async confirm(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/confirm`, undefined, undefined, options,\n );\n }\n\n /**\n * Manually release a held event before its TTL, freeing the slot. Fails with\n * 409 if the event is not a hold.\n */\n async release(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/release`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n RequestOptions,\n} from '../types';\n\nexport class AvailabilityClient {\n constructor(private readonly client: CoreClient) {}\n\n async forAgent(agentId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/agents/${agentId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async forCalendar(calendarId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/calendars/${calendarId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async check(params: CrossAgentAvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', '/v1/availability', undefined,\n {\n agents: params.agents.join(','),\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n calendars: params.calendars?.join(','),\n include_busy: params.include_busy,\n },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n ListWebhookDeliveriesParams,\n WebhookDeliveryListResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class WebhooksClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('POST', '/v1/webhooks', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('GET', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n list(params: ListWebhooksParams = {}): PageIterator<Webhook> {\n const { limit = 20, offset = 0, ...filters } = params;\n return new PageIterator<Webhook>(\n (offset, l) =>\n this.client.request<PageResponse<Webhook>>('GET', '/v1/webhooks', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('PATCH', `/v1/webhooks/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n async listDeliveries(\n webhookId: string,\n params: ListWebhookDeliveriesParams = {},\n options?: RequestOptions,\n ): Promise<WebhookDeliveryListResponse> {\n const { limit = 20, offset = 0, status, include_payload } = params;\n return this.client.request<WebhookDeliveryListResponse>(\n 'GET',\n `/v1/webhooks/${webhookId}/deliveries`,\n undefined,\n { limit, offset, ...(status !== undefined && { status }), ...(include_payload !== undefined && { include_payload }) },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class ICalSubscriptionsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(agentId: string, params: CreateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'POST', `/v1/agents/${agentId}/ical-subscriptions`, params, undefined, options,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'GET', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n list(params: ListICalSubscriptionsParams & { agentId: string }): PageIterator<ICalSubscription> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ICalSubscription>(\n (offset, l) =>\n this.client.request<PageResponse<ICalSubscription>>(\n 'GET', `/v1/agents/${agentId}/ical-subscriptions`, undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'PATCH', `/v1/ical-subscriptions/${id}`, params, undefined, options,\n );\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n async sync(id: string, options?: RequestOptions): Promise<{ status: string }> {\n return this.client.request<{ status: string }>(\n 'POST', `/v1/ical-subscriptions/${id}/sync`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Proposal,\n ProposalSummary,\n ProposalResponse,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class SchedulingClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateProposalParams, options?: RequestOptions): Promise<ProposalSummary> {\n return this.client.request<ProposalSummary>(\n 'POST', '/v1/scheduling/proposals', params, undefined, options,\n );\n }\n\n list(params: ListProposalsParams = {}): PageIterator<ProposalSummary> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ProposalSummary>(\n (offset, l) =>\n this.client.request<PageResponse<ProposalSummary>>(\n 'GET', '/v1/scheduling/proposals', undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<Proposal> {\n return this.client.request<Proposal>(\n 'GET', `/v1/scheduling/proposals/${id}`, undefined, undefined, options,\n );\n }\n\n async respond(\n id: string,\n params: RespondToProposalParams,\n options?: RequestOptions,\n ): Promise<ProposalResponse> {\n return this.client.request<ProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/respond`, params, undefined, options,\n );\n }\n\n async resolve(id: string, options?: RequestOptions): Promise<ResolveProposalResponse> {\n return this.client.request<ResolveProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/resolve`, undefined, undefined, options,\n );\n }\n\n async cancel(id: string, options?: RequestOptions): Promise<CancelProposalResponse> {\n return this.client.request<CancelProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/cancel`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { Usage, RequestOptions } from '../types';\n\nexport class UsageClient {\n constructor(private readonly client: CoreClient) {}\n\n async get(options?: RequestOptions): Promise<Usage> {\n return this.client.request<Usage>('GET', '/v1/usage', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AuditLogResponse, ListAuditLogParams, RequestOptions } from '../types';\n\nexport class AuditLogClient {\n constructor(private readonly client: CoreClient) {}\n\n async list(params?: ListAuditLogParams, options?: RequestOptions): Promise<AuditLogResponse> {\n // CoreClient.request serializes the query map into the URL; passing\n // `undefined` values strips them. Keeps the path literal static so the\n // surface-coverage audit script can match it against the canonical route.\n const query: Record<string, string | number | boolean | undefined> = {\n from: params?.from,\n to: params?.to,\n action: params?.action,\n actor_key_prefix: params?.actor_key_prefix,\n cursor: params?.cursor,\n limit: params?.limit,\n };\n return this.client.request<AuditLogResponse>('GET', '/v1/audit-log', undefined, query, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n RequestOptions,\n ScopedApiKey,\n} from '../types';\n\ninterface ListScopedApiKeysResponse {\n keys: ScopedApiKey[];\n}\n\nexport class KeysClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(\n params: CreateScopedApiKeyParams,\n options?: RequestOptions,\n ): Promise<CreatedScopedApiKey> {\n return this.client.request<CreatedScopedApiKey>('POST', '/v1/keys', params, undefined, options);\n }\n\n async list(options?: RequestOptions): Promise<ScopedApiKey[]> {\n const response = await this.client.request<ListScopedApiKeysResponse>(\n 'GET',\n '/v1/keys',\n undefined,\n undefined,\n options,\n );\n return response.keys;\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/keys/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentAuthClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register a new agent + org. Sends an OTP to the provided email.\n *\n * No authentication required — callers may construct a `Chronary` client\n * with no `apiKey` to invoke this method.\n *\n * The response is a discriminated union:\n * - **New org path** — returns `org_id`, `agent_id`, and `api_key`.\n * The `api_key` is restricted to the verify endpoint until the OTP\n * is submitted successfully; after verification it unlocks the full API.\n * - **Existing-org dedup** — returns only `message`. No credentials are\n * leaked when the email matches an existing org (enumeration defense).\n *\n * Use `isAgentSignUpNewOrg()` to narrow the union before accessing keys.\n *\n * @throws ChronaryError (409 `tos_version_stale`) if `tos_version` is not\n * the currently-published version — retry with the value from the\n * `current_version` field on the error body.\n */\n async signUp(\n params: AgentSignUpParams,\n options?: RequestOptions,\n ): Promise<AgentSignUpResponse> {\n return this.client.request<AgentSignUpResponse>(\n 'POST',\n '/v1/agent/sign-up',\n params,\n undefined,\n options,\n );\n }\n\n /**\n * Submit the OTP sent during `signUp()` to unlock the API key.\n *\n * Must be invoked on a `Chronary` client constructed with the restricted\n * `api_key` returned by `signUp()` — NOT on the client that issued\n * `signUp()` itself (which had no key).\n *\n * @throws ChronaryError (status 400) when the OTP is wrong or expired.\n * The SDK's `ValidationError` class is reserved for HTTP 422; the\n * API returns 400 for invalid/expired OTPs, which surfaces as a\n * generic `ChronaryError` with the original message.\n */\n async verify(\n params: AgentVerifyParams,\n options?: RequestOptions,\n ): Promise<AgentVerifyResponse> {\n return this.client.request<AgentVerifyResponse>(\n 'POST',\n '/v1/agent/verify',\n params,\n undefined,\n options,\n );\n }\n}\n\n/**\n * Type guard — narrows an `AgentSignUpResponse` to the new-org branch.\n * The existing-org dedup branch returns only `message`, so this is the\n * caller's cue that credentials are present.\n */\nexport function isAgentSignUpNewOrg(\n response: AgentSignUpResponse,\n): response is AgentSignUpNewOrgResponse {\n return 'api_key' in response;\n}\n","import type { CoreClient } from '../client';\nimport type {\n WaitlistJoinParams,\n WaitlistJoinResponse,\n RequestOptions,\n} from '../types';\n\nexport class WaitlistClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Join the Chronary waitlist (#442). Used during private preview when open\n * signup is gated. Creates a real organization row flagged as\n * `is_waitlisted: true`; an admin flips the flag to activate the account.\n *\n * No authentication required — invoke on a `Chronary` client constructed\n * with no `apiKey`.\n *\n * Idempotent on repeat hits: a second call with the same email returns\n * the existing waitlisted org instead of erroring. An active (non-waitlisted)\n * account at the same email returns 409 `email_taken`.\n *\n * @throws ChronaryError (409 `email_taken`) when an active account already\n * exists for this email — direct the user to sign-in instead.\n * @throws ChronaryError (409 `tos_version_stale`) when the supplied\n * `tos_version` doesn't match the currently-published version.\n * @throws ChronaryError (429 `rate_limit_error`) on the per-IP / per-email\n * waitlist limiter.\n */\n async join(\n params: WaitlistJoinParams,\n options?: RequestOptions,\n ): Promise<WaitlistJoinResponse> {\n return this.client.request<WaitlistJoinResponse>(\n 'POST',\n '/v1/waitlist',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n FeedbackAcceptedResponse,\n RequestOptions,\n SubmitFeedbackParams,\n} from '../types';\n\nexport class FeedbackClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Submit structured feedback (bug, feature, or friction) to Chronary.\n *\n * Rate-limited to 25 submissions per day per organization (UTC day).\n * Available on all plans, including free. The 26th submission returns\n * HTTP 429 with a `Retry-After` header set to the seconds until the\n * next UTC midnight.\n */\n async submit(\n params: SubmitFeedbackParams,\n options?: RequestOptions,\n ): Promise<FeedbackAcceptedResponse> {\n return this.client.request<FeedbackAcceptedResponse>(\n 'POST',\n '/v1/feedback',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { PlansListResponse, RequestOptions } from '../types';\n\nexport class PlansClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Fetch the public plan catalog (`GET /v1/plans`).\n *\n * Returns all sellable tiers (free, pro, scale) plus the enterprise\n * tier with `custom_pricing: true`. No authentication required.\n * Responses are cacheable for 5 minutes at the edge.\n */\n async list(options?: RequestOptions): Promise<PlansListResponse> {\n return this.client.request<PlansListResponse>('GET', '/v1/plans', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { DataExport, RequestOptions } from '../types';\n\nexport class AccountClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Export every row this org owns as a single JSON payload (GDPR Art. 15 + 20\n * portability / CCPA right-to-know / EU Data Act interoperability).\n *\n * **Authentication:** This endpoint is JWT-only — it returns decrypted\n * webhook secrets and iCal subscription URLs that aren't normally accessible\n * via API-key endpoints. Configure the SDK with a console JWT (e.g. cookie\n * value or Bearer token from the console session) as the `apiKey` config to\n * call this. API keys (`chr_sk_*` / `chr_ak_*`) will return 401.\n *\n * In most cases, end users should download via the console UI at\n * `console.chronary.ai/settings`. The SDK method exists for programmatic\n * use cases (e.g. server-side compliance tooling holding a delegated JWT).\n *\n * **Rate limit:** 10 exports/hour/org.\n */\n async export(options?: RequestOptions): Promise<DataExport> {\n return this.client.request<DataExport>(\n 'GET',\n '/v1/auth/export',\n undefined,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AcceptTermsParams, AcceptTermsResult, RequestOptions } from '../types';\n\nexport class TermsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Re-accept the current Chronary terms of service for the calling org.\n *\n * Use this when a response carries the `Chronary-Terms-Upgrade-Required`\n * header after a material ToS bump — it clears the upgrade requirement for\n * Bearer-key (SDK / MCP) clients that have no console session. Read the\n * current version from `GET /v1/auth/terms/current` and pass it verbatim.\n *\n * **Authentication:** org-level API keys (`chr_sk_*`) only — agent-scoped\n * keys cannot accept org-wide terms (403). A stale version returns 409\n * `tos_version_stale` with the current version in the error body.\n */\n async accept(params: AcceptTermsParams, options?: RequestOptions): Promise<AcceptTermsResult> {\n return this.client.request<AcceptTermsResult>(\n 'POST',\n '/v1/terms/accept',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { WebhookEvent, VerifyOptions } from './types';\nimport { ChronaryError } from './error';\n\nconst DEFAULT_TOLERANCE = 5 * 60 * 1000; // 5 minutes\n\nfunction bufToHex(buf: ArrayBuffer): string {\n return Array.from(new Uint8Array(buf))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nasync function computeSignature(secret: string, timestamp: string, payload: string): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const message = encoder.encode(`${timestamp}.${payload}`);\n const sig = await crypto.subtle.sign('HMAC', key, message);\n return `sha256=${bufToHex(sig)}`;\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const aBuf = encoder.encode(a);\n const bBuf = encoder.encode(b);\n if (aBuf.length !== bBuf.length) return false;\n let diff = 0;\n for (let i = 0; i < aBuf.length; i++) diff |= aBuf[i] ^ bBuf[i];\n return diff === 0;\n}\n\nfunction getHeader(headers: Headers | Record<string, string>, name: string): string | null {\n if (headers instanceof Headers) return headers.get(name);\n\n const record = headers as Record<string, string>;\n const direct = record[name] ?? record[name.toLowerCase()];\n if (direct !== undefined) return direct;\n\n const lowerName = name.toLowerCase();\n for (const [key, value] of Object.entries(record)) {\n if (key.toLowerCase() === lowerName) return value;\n }\n return null;\n}\n\nfunction extractHeaders(headers: Headers | Record<string, string>): { signature: string; timestamp: string } {\n const get = (name: string): string | null => {\n return getHeader(headers, name);\n };\n\n const signature = get('X-Signature') ?? get('x-signature');\n const timestamp = get('X-Timestamp') ?? get('x-timestamp');\n\n if (!signature) throw new ChronaryError('Missing X-Signature header', 0);\n if (!timestamp) throw new ChronaryError('Missing X-Timestamp header', 0);\n\n return { signature, timestamp };\n}\n\nexport async function verifySignature(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<void> {\n if (typeof rawBody !== 'string') {\n throw new ChronaryError(\n 'rawBody must be a string. If you parsed the JSON body, pass the raw string instead.',\n 0,\n );\n }\n\n const { signature, timestamp } = extractHeaders(headers);\n const tolerance = options?.tolerance ?? DEFAULT_TOLERANCE;\n\n // Timestamp tolerance check for replay prevention\n const tsMs = parseInt(timestamp, 10) * 1000;\n const now = Date.now();\n if (Math.abs(now - tsMs) > tolerance) {\n throw new ChronaryError(\n `Webhook timestamp too old. Received ${timestamp}, current time ${Math.floor(now / 1000)}. Tolerance: ${tolerance / 1000}s`,\n 0,\n );\n }\n\n const expected = await computeSignature(secret, timestamp, rawBody);\n if (!constantTimeEqual(expected, signature)) {\n throw new ChronaryError('Webhook signature verification failed', 0);\n }\n}\n\nexport async function constructEvent(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<WebhookEvent> {\n await verifySignature(rawBody, headers, secret, options);\n\n const type = getHeader(headers, 'X-Chronary-Event-Type');\n if (!type) throw new ChronaryError('Missing X-Chronary-Event-Type header', 0);\n\n const data = JSON.parse(rawBody);\n return { type, data } as WebhookEvent;\n}\n","import { CoreClient } from './client';\nimport { AgentsClient } from './resources/agents';\nimport { CalendarsClient } from './resources/calendars';\nimport { EventsClient } from './resources/events';\nimport { AvailabilityClient } from './resources/availability';\nimport { WebhooksClient } from './resources/webhooks';\nimport { ICalSubscriptionsClient } from './resources/ical-subscriptions';\nimport { SchedulingClient } from './resources/scheduling';\nimport { UsageClient } from './resources/usage';\nimport { AuditLogClient } from './resources/audit-log';\nimport { KeysClient } from './resources/keys';\nimport { AgentAuthClient } from './resources/agent-auth';\nimport { WaitlistClient } from './resources/waitlist';\nimport { FeedbackClient } from './resources/feedback';\nimport { PlansClient } from './resources/plans';\nimport { AccountClient } from './resources/account';\nimport { TermsClient } from './resources/terms';\nimport { verifySignature, constructEvent } from './webhook-verify';\nimport type { ChronaryConfig } from './types';\n\nexport class Chronary {\n readonly agents: AgentsClient;\n readonly calendars: CalendarsClient;\n readonly events: EventsClient;\n readonly availability: AvailabilityClient;\n readonly webhooks: WebhooksClient;\n readonly icalSubscriptions: ICalSubscriptionsClient;\n readonly scheduling: SchedulingClient;\n readonly usage: UsageClient;\n readonly auditLog: AuditLogClient;\n readonly keys: KeysClient;\n readonly agentAuth: AgentAuthClient;\n readonly waitlist: WaitlistClient;\n readonly feedback: FeedbackClient;\n readonly plans: PlansClient;\n readonly account: AccountClient;\n readonly terms: TermsClient;\n\n constructor(config?: ChronaryConfig) {\n const client = new CoreClient(config);\n this.agents = new AgentsClient(client);\n this.calendars = new CalendarsClient(client);\n this.events = new EventsClient(client);\n this.availability = new AvailabilityClient(client);\n this.webhooks = new WebhooksClient(client);\n this.icalSubscriptions = new ICalSubscriptionsClient(client);\n this.scheduling = new SchedulingClient(client);\n this.usage = new UsageClient(client);\n this.auditLog = new AuditLogClient(client);\n this.keys = new KeysClient(client);\n this.agentAuth = new AgentAuthClient(client);\n this.waitlist = new WaitlistClient(client);\n this.feedback = new FeedbackClient(client);\n this.plans = new PlansClient(client);\n this.account = new AccountClient(client);\n this.terms = new TermsClient(client);\n }\n\n static webhooks = {\n verifySignature,\n constructEvent,\n };\n}\n\n// Re-export everything\nexport { CoreClient } from './client';\nexport { APIPromise } from './api-promise';\nexport type { QuotaSnapshot, RawResponse, WithResponse } from './api-promise';\nexport { PageIterator } from './pagination';\nexport { verifySignature, constructEvent } from './webhook-verify';\nexport { VERSION } from './version';\nexport { isAgentSignUpNewOrg } from './resources/agent-auth';\n\nexport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\n\nexport type {\n ChronaryConfig,\n LogLevel,\n AppInfo,\n RequestOptions,\n PageResponse,\n Page,\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AgentStatus,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n WorkingHours,\n WorkingHoursDay,\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n SlotDuration,\n AvailabilitySlot,\n BusyBlock,\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n WebhookDelivery,\n WebhookDeliveryStats,\n WebhookDeliveryListResponse,\n ListWebhookDeliveriesParams,\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n Proposal,\n ProposalSummary,\n ProposalSlot,\n ProposalResponse,\n ProposalStatus,\n ProposalResponseAction,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n Usage,\n UsageMetric,\n AuditLogEntry,\n ListAuditLogParams,\n AuditLogResponse,\n ScopedApiKey,\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n AcceptTermsParams,\n AcceptTermsResult,\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentSignUpExistingOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n WaitlistJoinParams,\n WaitlistJoinResponse,\n WaitlistedOrg,\n FeedbackType,\n SubmitFeedbackParams,\n FeedbackAcceptedResponse,\n PlanId,\n PlanLimits,\n Plan,\n PlansListResponse,\n WebhookEventType,\n WebhookEvent,\n VerifyOptions,\n DataExport,\n} from './types';\n\nexport default Chronary;\n"],"mappings":"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","names":["offset","offset","offset","offset","offset","offset"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/error.ts","../src/api-promise.ts","../src/client.ts","../src/pagination.ts","../src/resources/agents.ts","../src/resources/calendars.ts","../src/resources/events.ts","../src/resources/availability.ts","../src/resources/webhooks.ts","../src/resources/ical-subscriptions.ts","../src/resources/scheduling.ts","../src/resources/usage.ts","../src/resources/audit-log.ts","../src/resources/keys.ts","../src/resources/agent-auth.ts","../src/resources/waitlist.ts","../src/resources/feedback.ts","../src/resources/plans.ts","../src/resources/account.ts","../src/resources/terms.ts","../src/resources/connection-links.ts","../src/webhook-verify.ts","../src/index.ts"],"sourcesContent":["export const VERSION = '0.5.1';\n","export class ChronaryError extends Error {\n readonly status: number;\n readonly requestId: string | undefined;\n readonly headers: Headers | undefined;\n readonly errorType: string | undefined;\n\n constructor(\n message: string,\n status: number,\n requestId?: string,\n headers?: Headers,\n errorType?: string,\n ) {\n super(message);\n this.name = 'ChronaryError';\n this.status = status;\n this.requestId = requestId;\n this.headers = headers;\n this.errorType = errorType;\n }\n}\n\nexport class AuthenticationError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 401, requestId, headers, 'authentication_error');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class RateLimitError extends ChronaryError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 429, requestId, headers, 'rate_limit_error');\n this.name = 'RateLimitError';\n if (headers) {\n const ra = headers.get('retry-after');\n if (ra) this.retryAfter = parseInt(ra, 10);\n }\n }\n}\n\nexport class NotFoundError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 404, requestId, headers, 'not_found');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends ChronaryError {\n constructor(message: string, status: number, requestId?: string, headers?: Headers) {\n super(message, status, requestId, headers, 'validation_error');\n this.name = 'ValidationError';\n }\n}\n\nexport class QuotaExceededError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 402, requestId, headers, 'quota_exceeded');\n this.name = 'QuotaExceededError';\n }\n}\n\nexport class TimeoutError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'TimeoutError';\n }\n}\n\nexport class ConnectionError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * APIPromise wraps a fetch call as a thenable so callers can `await` it\n * for parsed data, or call `.withResponse()` to get both parsed data and the raw\n * Response (headers, status, etc.).\n *\n * ```ts\n * // Normal — just the data\n * const agent = await client.agents.get('agt_1');\n *\n * // With response access\n * const { data, response } = await client.agents.get('agt_1').withResponse();\n * console.log(response.status);\n * console.log(response.headers.get('x-request-id'));\n * ```\n */\n/**\n * Parsed quota snapshot from the IETF `RateLimit` / `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Present on responses from endpoints\n * that enforce quotas (most authenticated routes); absent on unauthenticated\n * or unlimited-plan responses.\n */\nexport interface QuotaSnapshot {\n /** Configured ceiling (e.g. `1_000_000` API calls/month). Parsed from `RateLimit-Policy`. */\n limit: number;\n /** Remaining quota in the current window. Parsed from `RateLimit`. */\n remaining: number;\n /** Wall-clock time when the window resets. Computed from the `t=` delta-seconds in `RateLimit`. */\n resetAt: Date;\n}\n\nexport interface RawResponse {\n status: number;\n headers: Headers;\n url: string;\n /**\n * Typed view of the IETF RateLimit headers when present. Use this instead of\n * parsing `headers.get('ratelimit')` yourself. `undefined` for responses\n * that don't emit quota headers (public endpoints, unlimited plans).\n */\n quota?: QuotaSnapshot;\n}\n\nexport interface WithResponse<T> {\n data: T;\n response: RawResponse;\n}\n\n/**\n * APIPromise is a thenable that resolves to `T` when awaited, but also\n * exposes `.withResponse()` to get both the data and raw HTTP response.\n *\n * Because it implements `.then()`, it can be awaited, used with `Promise.all()`,\n * and chained with `.then()` / `.catch()` / `.finally()`.\n */\nexport class APIPromise<T> implements PromiseLike<T> {\n private innerPromise: Promise<{ data: T; rawResponse: RawResponse }>;\n\n constructor(\n responsePromise: Promise<{ data: T; rawResponse: RawResponse }>,\n ) {\n this.innerPromise = responsePromise;\n }\n\n /**\n * Returns both the parsed data and the raw HTTP response.\n */\n async withResponse(): Promise<WithResponse<T>> {\n const { data, rawResponse } = await this.innerPromise;\n return { data, response: rawResponse };\n }\n\n /**\n * Implements the thenable interface. When awaited, resolves to just the parsed data `T`.\n */\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.innerPromise.then(\n (result) => (onfulfilled ? onfulfilled(result.data) : result.data as unknown as TResult1),\n onrejected,\n );\n }\n\n /**\n * Attaches a rejection handler.\n */\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n ): Promise<T | TResult> {\n return this.then(undefined, onrejected);\n }\n\n /**\n * Attaches a handler that runs on both fulfillment and rejection.\n */\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then(\n (value) => { onfinally?.(); return value; },\n (reason) => { onfinally?.(); throw reason; },\n );\n }\n}\n","import { VERSION } from './version';\nimport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\nimport { APIPromise } from './api-promise';\nimport type { QuotaSnapshot, RawResponse } from './api-promise';\nimport type { ChronaryConfig, LogLevel, RequestOptions, ApiErrorBody } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.chronary.ai';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\nconst MAX_RETRY_DELAY = 60_000;\n\nfunction getEnvVar(name: string): string | undefined {\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n } catch {\n // process.env not available (browser, CF Workers, etc.)\n }\n return undefined;\n}\n\nfunction resolveLogLevel(config: ChronaryConfig): LogLevel {\n if (config.logLevel) return config.logLevel;\n const envLog = getEnvVar('CHRONARY_LOG');\n if (envLog && ['debug', 'info', 'warn', 'error', 'off'].includes(envLog)) {\n return envLog as LogLevel;\n }\n return 'off';\n}\n\nconst LOG_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n off: 4,\n};\n\nexport class CoreClient {\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly logLevel: LogLevel;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly userAgent: string;\n private readonly extraHeaders: Record<string, string>;\n\n constructor(config: ChronaryConfig = {}) {\n // apiKey is optional at construction — some endpoints (agentAuth.signUp,\n // plans.list) do not require auth. When a caller invokes an authed\n // endpoint without a key, the server returns 401 and the SDK surfaces it\n // as AuthenticationError — same error shape either way.\n this.apiKey = config.apiKey ?? getEnvVar('CHRONARY_API_KEY') ?? '';\n\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.logLevel = resolveLogLevel(config);\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.extraHeaders = config.extraHeaders ?? {};\n\n let ua = `chronary-ts/${VERSION}`;\n if (config.appInfo) {\n ua += ` ${config.appInfo.name}`;\n if (config.appInfo.version) ua += `/${config.appInfo.version}`;\n }\n try {\n if (typeof process !== 'undefined' && process.version) {\n ua += ` node/${process.version.replace('v', '')}`;\n }\n } catch {\n // Not in Node\n }\n this.userAgent = ua;\n }\n\n private log(level: LogLevel, message: string) {\n if (level === 'off' || LOG_PRIORITY[level] < LOG_PRIORITY[this.logLevel]) return;\n const prefix = `[chronary:${level}]`;\n switch (level) {\n case 'debug': console.debug(prefix, message); break;\n case 'info': console.info(prefix, message); break;\n case 'warn': console.warn(prefix, message); break;\n case 'error': console.error(prefix, message); break;\n }\n }\n\n request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): APIPromise<T> {\n return new APIPromise<T>(this._request<T>(method, path, body, query, options));\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): Promise<{ data: T; rawResponse: RawResponse }> {\n const url = this.buildUrl(path, query);\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n 'X-Chronary-SDK-Version': VERSION,\n ...this.extraHeaders,\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (MUTATING_METHODS.has(method)) {\n headers['Idempotency-Key'] = options?.idempotencyKey ?? crypto.randomUUID();\n }\n\n const requestTimeout = options?.timeout ?? this.timeout;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.retryDelay(attempt, lastError);\n this.log('info', `Retry #${attempt} after ${delay}ms`);\n await sleep(delay);\n }\n\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n this.log('debug', `${method} ${path}`);\n const startTime = Date.now();\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n const elapsed = Date.now() - startTime;\n const requestId = response.headers.get('x-request-id') ?? undefined;\n\n this.log('debug', `${method} ${path} → ${response.status} in ${elapsed}ms${requestId ? ` (${requestId})` : ''}`);\n\n if (response.ok) {\n const rawResponse: RawResponse = {\n status: response.status,\n headers: response.headers,\n url: response.url,\n quota: parseQuotaSnapshot(response.headers),\n };\n if (response.status === 204) {\n return { data: undefined as T, rawResponse };\n }\n const data = await response.json() as T;\n return { data, rawResponse };\n }\n\n // Retryable?\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.maxRetries) {\n lastError = await this.buildError(response, requestId);\n continue;\n }\n\n throw await this.buildError(response, requestId);\n } catch (err) {\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n\n if (err instanceof ChronaryError) throw err;\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n throw new TimeoutError(`Request timed out after ${requestTimeout}ms`);\n }\n\n if (attempt < this.maxRetries) {\n lastError = err as Error;\n continue;\n }\n\n throw new ConnectionError(`Connection failed: ${(err as Error).message}`);\n }\n }\n\n throw lastError ?? new ConnectionError('Request failed after retries');\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n const base = `${this.baseUrl}${path}`;\n if (!query) return base;\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n private async buildError(response: Response, requestId?: string): Promise<ChronaryError> {\n let errorBody: ApiErrorBody | undefined;\n try {\n errorBody = await response.json() as ApiErrorBody;\n } catch {\n // Non-JSON response\n }\n\n const message = errorBody?.error?.message ?? `HTTP ${response.status}`;\n const rid = requestId ?? errorBody?.error?.request_id;\n const errorType = errorBody?.error?.type;\n\n switch (response.status) {\n case 400:\n if (errorType === 'validation_error') {\n return new ValidationError(message, response.status, rid, response.headers);\n }\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n case 401:\n return new AuthenticationError(message, rid, response.headers);\n case 402:\n return new QuotaExceededError(message, rid, response.headers);\n case 404:\n return new NotFoundError(message, rid, response.headers);\n case 422:\n return new ValidationError(message, response.status, rid, response.headers);\n case 429: {\n if (errorType === 'quota_exceeded') {\n return new QuotaExceededError(message, rid, response.headers);\n }\n return new RateLimitError(message, rid, response.headers);\n }\n default:\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n }\n }\n\n private retryDelay(attempt: number, lastError?: Error): number {\n // Respect Retry-After header\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n return Math.min(lastError.retryAfter * 1000, MAX_RETRY_DELAY);\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = 500;\n const exponential = base * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base;\n return Math.min(exponential + jitter, MAX_RETRY_DELAY);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the IETF structured-field `RateLimit` and `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Returns `undefined` if either header\n * is missing or unparseable — callers can still reach the raw header strings\n * via `response.headers`.\n *\n * `RateLimit` value example: `\"quota\";r=985477;t=187200`\n * `RateLimit-Policy` value example: `\"quota\";q=1000000;w=2592000;pk=org_abc`\n */\nfunction parseQuotaSnapshot(headers: Headers): QuotaSnapshot | undefined {\n const rateLimit = headers.get('ratelimit');\n const policy = headers.get('ratelimit-policy');\n if (!rateLimit || !policy) return undefined;\n\n const remaining = parseStructuredParam(rateLimit, 'r');\n const resetSeconds = parseStructuredParam(rateLimit, 't');\n const limit = parseStructuredParam(policy, 'q');\n if (remaining === undefined || resetSeconds === undefined || limit === undefined) {\n return undefined;\n }\n\n return {\n limit,\n remaining,\n resetAt: new Date(Date.now() + resetSeconds * 1000),\n };\n}\n\nfunction parseStructuredParam(header: string, key: string): number | undefined {\n // Match `;<key>=<digits>` — guards against partial matches inside other tokens.\n const re = new RegExp(`(?:^|;)\\\\s*${key}=(-?\\\\d+)(?:;|$)`);\n const match = re.exec(header);\n if (!match) return undefined;\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : undefined;\n}\n","import type { PageResponse, Page } from './types';\n\nexport class PageIterator<T> implements AsyncIterable<T> {\n private readonly fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>;\n private readonly defaultLimit: number;\n private readonly initialOffset: number;\n\n constructor(\n fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>,\n defaultLimit: number = 50,\n initialOffset: number = 0,\n ) {\n this.fetchPage = fetchPage;\n this.defaultLimit = defaultLimit;\n this.initialOffset = initialOffset;\n }\n\n async getPage(offset: number = this.initialOffset, limit?: number): Promise<Page<T>> {\n const l = limit ?? this.defaultLimit;\n const response = await this.fetchPage(offset, l);\n return {\n ...response,\n hasMore: offset + response.data.length < response.total,\n };\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let offset = this.initialOffset;\n const limit = this.defaultLimit;\n\n while (true) {\n const page = await this.fetchPage(offset, limit);\n for (const item of page.data) {\n yield item;\n }\n offset += page.data.length;\n if (offset >= page.total || page.data.length === 0) break;\n }\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register your agent with Chronary. Creates a Chronary identity for an agent\n * that already exists in your system, so it can own calendars, events, and webhooks.\n */\n async create(params: CreateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('POST', '/v1/agents', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('GET', `/v1/agents/${id}`, undefined, undefined, options);\n }\n\n list(params: ListAgentsParams = {}): PageIterator<Agent> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<Agent>(\n (offset, l) =>\n this.client.request<PageResponse<Agent>>('GET', '/v1/agents', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('PATCH', `/v1/agents/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/agents/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class CalendarsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateCalendarParams & { agentId?: string }, options?: RequestOptions): Promise<Calendar> {\n const { agentId, ...body } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return this.client.request<Calendar>('POST', path, body, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('GET', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n list(params: ListCalendarsParams = {}): PageIterator<Calendar> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return new PageIterator<Calendar>(\n (offset, l) =>\n this.client.request<PageResponse<Calendar>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateCalendarParams, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('PATCH', `/v1/calendars/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n async getContext(id: string, options?: RequestOptions): Promise<CalendarContext> {\n return this.client.request<CalendarContext>(\n 'GET', `/v1/calendars/${id}/context`, undefined, undefined, options,\n );\n }\n\n async setAvailabilityRules(\n id: string,\n params: SetAvailabilityRulesParams,\n options?: RequestOptions,\n ): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'PUT', `/v1/calendars/${id}/availability-rules`, params, undefined, options,\n );\n }\n\n async getAvailabilityRules(id: string, options?: RequestOptions): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'GET', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n\n async deleteAvailabilityRules(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DeleteEventOptions,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class EventsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(calendarId: string, params: CreateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'POST', `/v1/calendars/${calendarId}/events`, params, undefined, options,\n );\n }\n\n async get(calendarId: string, eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n list(params: ListEventsParams = {}): PageIterator<CalendarEvent> {\n const { calendarId, agentId, limit = 50, offset = 0, ...filters } = params;\n\n let path: string;\n if (agentId) {\n path = `/v1/agents/${agentId}/events`;\n } else if (calendarId) {\n path = `/v1/calendars/${calendarId}/events`;\n } else {\n throw new Error('Either calendarId or agentId is required for events.list()');\n }\n\n return new PageIterator<CalendarEvent>(\n (offset, l) =>\n this.client.request<PageResponse<CalendarEvent>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(calendarId: string, eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/calendars/${calendarId}/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event (or, for a recurring series, the whole series). Pass\n * `occurrence_start` to cancel just one occurrence of a recurring series\n * instead — the series lives on and the updated series master is returned.\n * Plain deletes resolve to void. With `occurrence_start`, fails with 400 if\n * the timestamp is not an active occurrence, or 409 if the event is not a\n * recurring series.\n */\n async delete(calendarId: string, eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void> {\n const { occurrence_start, ...requestOptions } = options ?? {};\n return this.client.request<CalendarEvent | void>(\n 'DELETE',\n `/v1/calendars/${calendarId}/events/${eventId}`,\n undefined,\n occurrence_start !== undefined ? { occurrence_start } : undefined,\n requestOptions,\n );\n }\n\n /**\n * Fetch an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async getById(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Update an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async updateById(eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required. Pass `occurrence_start` to cancel\n * just one occurrence of a recurring series — the series lives on and the\n * updated series master is returned; plain deletes resolve to void. With\n * `occurrence_start`, fails with 400 if the timestamp is not an active\n * occurrence, or 409 if the event is not a recurring series.\n */\n async deleteById(eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void> {\n const { occurrence_start, ...requestOptions } = options ?? {};\n return this.client.request<CalendarEvent | void>(\n 'DELETE',\n `/v1/events/${eventId}`,\n undefined,\n occurrence_start !== undefined ? { occurrence_start } : undefined,\n requestOptions,\n );\n }\n\n /**\n * Promote a held event (status='hold') to status='confirmed'. Fails with 409\n * if the event is not a hold, or if the hold has already expired.\n */\n async confirm(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/confirm`, undefined, undefined, options,\n );\n }\n\n /**\n * Manually release a held event before its TTL, freeing the slot. Fails with\n * 409 if the event is not a hold.\n */\n async release(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/release`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n RequestOptions,\n} from '../types';\n\nexport class AvailabilityClient {\n constructor(private readonly client: CoreClient) {}\n\n async forAgent(agentId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/agents/${agentId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async forCalendar(calendarId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/calendars/${calendarId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async check(params: CrossAgentAvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', '/v1/availability', undefined,\n {\n agents: params.agents.join(','),\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n calendars: params.calendars?.join(','),\n include_busy: params.include_busy,\n },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n ListWebhookDeliveriesParams,\n WebhookDeliveryListResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class WebhooksClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('POST', '/v1/webhooks', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('GET', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n list(params: ListWebhooksParams = {}): PageIterator<Webhook> {\n const { limit = 20, offset = 0, ...filters } = params;\n return new PageIterator<Webhook>(\n (offset, l) =>\n this.client.request<PageResponse<Webhook>>('GET', '/v1/webhooks', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('PATCH', `/v1/webhooks/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n async listDeliveries(\n webhookId: string,\n params: ListWebhookDeliveriesParams = {},\n options?: RequestOptions,\n ): Promise<WebhookDeliveryListResponse> {\n const { limit = 20, offset = 0, status, include_payload } = params;\n return this.client.request<WebhookDeliveryListResponse>(\n 'GET',\n `/v1/webhooks/${webhookId}/deliveries`,\n undefined,\n { limit, offset, ...(status !== undefined && { status }), ...(include_payload !== undefined && { include_payload }) },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class ICalSubscriptionsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(agentId: string, params: CreateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'POST', `/v1/agents/${agentId}/ical-subscriptions`, params, undefined, options,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'GET', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n list(params: ListICalSubscriptionsParams & { agentId: string }): PageIterator<ICalSubscription> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ICalSubscription>(\n (offset, l) =>\n this.client.request<PageResponse<ICalSubscription>>(\n 'GET', `/v1/agents/${agentId}/ical-subscriptions`, undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'PATCH', `/v1/ical-subscriptions/${id}`, params, undefined, options,\n );\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n async sync(id: string, options?: RequestOptions): Promise<{ status: string }> {\n return this.client.request<{ status: string }>(\n 'POST', `/v1/ical-subscriptions/${id}/sync`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Proposal,\n ProposalSummary,\n ProposalResponse,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class SchedulingClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateProposalParams, options?: RequestOptions): Promise<ProposalSummary> {\n return this.client.request<ProposalSummary>(\n 'POST', '/v1/scheduling/proposals', params, undefined, options,\n );\n }\n\n list(params: ListProposalsParams = {}): PageIterator<ProposalSummary> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ProposalSummary>(\n (offset, l) =>\n this.client.request<PageResponse<ProposalSummary>>(\n 'GET', '/v1/scheduling/proposals', undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<Proposal> {\n return this.client.request<Proposal>(\n 'GET', `/v1/scheduling/proposals/${id}`, undefined, undefined, options,\n );\n }\n\n async respond(\n id: string,\n params: RespondToProposalParams,\n options?: RequestOptions,\n ): Promise<ProposalResponse> {\n return this.client.request<ProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/respond`, params, undefined, options,\n );\n }\n\n async resolve(id: string, options?: RequestOptions): Promise<ResolveProposalResponse> {\n return this.client.request<ResolveProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/resolve`, undefined, undefined, options,\n );\n }\n\n async cancel(id: string, options?: RequestOptions): Promise<CancelProposalResponse> {\n return this.client.request<CancelProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/cancel`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { Usage, RequestOptions } from '../types';\n\nexport class UsageClient {\n constructor(private readonly client: CoreClient) {}\n\n async get(options?: RequestOptions): Promise<Usage> {\n return this.client.request<Usage>('GET', '/v1/usage', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AuditLogResponse, ListAuditLogParams, RequestOptions } from '../types';\n\nexport class AuditLogClient {\n constructor(private readonly client: CoreClient) {}\n\n async list(params?: ListAuditLogParams, options?: RequestOptions): Promise<AuditLogResponse> {\n // CoreClient.request serializes the query map into the URL; passing\n // `undefined` values strips them. Keeps the path literal static so the\n // surface-coverage audit script can match it against the canonical route.\n const query: Record<string, string | number | boolean | undefined> = {\n from: params?.from,\n to: params?.to,\n action: params?.action,\n actor_key_prefix: params?.actor_key_prefix,\n cursor: params?.cursor,\n limit: params?.limit,\n };\n return this.client.request<AuditLogResponse>('GET', '/v1/audit-log', undefined, query, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n RequestOptions,\n ScopedApiKey,\n} from '../types';\n\ninterface ListScopedApiKeysResponse {\n keys: ScopedApiKey[];\n}\n\nexport class KeysClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(\n params: CreateScopedApiKeyParams,\n options?: RequestOptions,\n ): Promise<CreatedScopedApiKey> {\n return this.client.request<CreatedScopedApiKey>('POST', '/v1/keys', params, undefined, options);\n }\n\n async list(options?: RequestOptions): Promise<ScopedApiKey[]> {\n const response = await this.client.request<ListScopedApiKeysResponse>(\n 'GET',\n '/v1/keys',\n undefined,\n undefined,\n options,\n );\n return response.keys;\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/keys/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentAuthClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register a new agent + org. Sends an OTP to the provided email.\n *\n * No authentication required — callers may construct a `Chronary` client\n * with no `apiKey` to invoke this method.\n *\n * The response is a discriminated union:\n * - **New org path** — returns `org_id`, `agent_id`, and `api_key`.\n * The `api_key` is restricted to the verify endpoint until the OTP\n * is submitted successfully; after verification it unlocks the full API.\n * - **Existing-org dedup** — returns only `message`. No credentials are\n * leaked when the email matches an existing org (enumeration defense).\n *\n * Use `isAgentSignUpNewOrg()` to narrow the union before accessing keys.\n *\n * @throws ChronaryError (409 `tos_version_stale`) if `tos_version` is not\n * the currently-published version — retry with the value from the\n * `current_version` field on the error body.\n */\n async signUp(\n params: AgentSignUpParams,\n options?: RequestOptions,\n ): Promise<AgentSignUpResponse> {\n return this.client.request<AgentSignUpResponse>(\n 'POST',\n '/v1/agent/sign-up',\n params,\n undefined,\n options,\n );\n }\n\n /**\n * Submit the OTP sent during `signUp()` to unlock the API key.\n *\n * Must be invoked on a `Chronary` client constructed with the restricted\n * `api_key` returned by `signUp()` — NOT on the client that issued\n * `signUp()` itself (which had no key).\n *\n * @throws ChronaryError (status 400) when the OTP is wrong or expired.\n * The SDK's `ValidationError` class is reserved for HTTP 422; the\n * API returns 400 for invalid/expired OTPs, which surfaces as a\n * generic `ChronaryError` with the original message.\n */\n async verify(\n params: AgentVerifyParams,\n options?: RequestOptions,\n ): Promise<AgentVerifyResponse> {\n return this.client.request<AgentVerifyResponse>(\n 'POST',\n '/v1/agent/verify',\n params,\n undefined,\n options,\n );\n }\n}\n\n/**\n * Type guard — narrows an `AgentSignUpResponse` to the new-org branch.\n * The existing-org dedup branch returns only `message`, so this is the\n * caller's cue that credentials are present.\n */\nexport function isAgentSignUpNewOrg(\n response: AgentSignUpResponse,\n): response is AgentSignUpNewOrgResponse {\n return 'api_key' in response;\n}\n","import type { CoreClient } from '../client';\nimport type {\n WaitlistJoinParams,\n WaitlistJoinResponse,\n RequestOptions,\n} from '../types';\n\nexport class WaitlistClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Join the Chronary waitlist (#442). Used during private preview when open\n * signup is gated. Creates a real organization row flagged as\n * `is_waitlisted: true`; an admin flips the flag to activate the account.\n *\n * No authentication required — invoke on a `Chronary` client constructed\n * with no `apiKey`.\n *\n * Idempotent on repeat hits: a second call with the same email returns\n * the existing waitlisted org instead of erroring. An active (non-waitlisted)\n * account at the same email returns 409 `email_taken`.\n *\n * @throws ChronaryError (409 `email_taken`) when an active account already\n * exists for this email — direct the user to sign-in instead.\n * @throws ChronaryError (409 `tos_version_stale`) when the supplied\n * `tos_version` doesn't match the currently-published version.\n * @throws ChronaryError (429 `rate_limit_error`) on the per-IP / per-email\n * waitlist limiter.\n */\n async join(\n params: WaitlistJoinParams,\n options?: RequestOptions,\n ): Promise<WaitlistJoinResponse> {\n return this.client.request<WaitlistJoinResponse>(\n 'POST',\n '/v1/waitlist',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n FeedbackAcceptedResponse,\n RequestOptions,\n SubmitFeedbackParams,\n} from '../types';\n\nexport class FeedbackClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Submit structured feedback (bug, feature, or friction) to Chronary.\n *\n * Rate-limited to 25 submissions per day per organization (UTC day).\n * Available on all plans, including free. The 26th submission returns\n * HTTP 429 with a `Retry-After` header set to the seconds until the\n * next UTC midnight.\n */\n async submit(\n params: SubmitFeedbackParams,\n options?: RequestOptions,\n ): Promise<FeedbackAcceptedResponse> {\n return this.client.request<FeedbackAcceptedResponse>(\n 'POST',\n '/v1/feedback',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { PlansListResponse, RequestOptions } from '../types';\n\nexport class PlansClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Fetch the public plan catalog (`GET /v1/plans`).\n *\n * Returns all sellable tiers (free, pro, scale) plus the enterprise\n * tier with `custom_pricing: true`. No authentication required.\n * Responses are cacheable for 5 minutes at the edge.\n */\n async list(options?: RequestOptions): Promise<PlansListResponse> {\n return this.client.request<PlansListResponse>('GET', '/v1/plans', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { DataExport, RequestOptions } from '../types';\n\nexport class AccountClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Export every row this org owns as a single JSON payload (GDPR Art. 15 + 20\n * portability / CCPA right-to-know / EU Data Act interoperability).\n *\n * **Authentication:** This endpoint is JWT-only — it returns decrypted\n * webhook secrets and iCal subscription URLs that aren't normally accessible\n * via API-key endpoints. Configure the SDK with a console JWT (e.g. cookie\n * value or Bearer token from the console session) as the `apiKey` config to\n * call this. API keys (`chr_sk_*` / `chr_ak_*`) will return 401.\n *\n * In most cases, end users should download via the console UI at\n * `console.chronary.ai/settings`. The SDK method exists for programmatic\n * use cases (e.g. server-side compliance tooling holding a delegated JWT).\n *\n * **Rate limit:** 10 exports/hour/org.\n */\n async export(options?: RequestOptions): Promise<DataExport> {\n return this.client.request<DataExport>(\n 'GET',\n '/v1/auth/export',\n undefined,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AcceptTermsParams, AcceptTermsResult, RequestOptions } from '../types';\n\nexport class TermsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Re-accept the current Chronary terms of service for the calling org.\n *\n * Use this when a response carries the `Chronary-Terms-Upgrade-Required`\n * header after a material ToS bump — it clears the upgrade requirement for\n * Bearer-key (SDK / MCP) clients that have no console session. Read the\n * current version from `GET /v1/auth/terms/current` and pass it verbatim.\n *\n * **Authentication:** org-level API keys (`chr_sk_*`) only — agent-scoped\n * keys cannot accept org-wide terms (403). A stale version returns 409\n * `tos_version_stale` with the current version in the error body.\n */\n async accept(params: AcceptTermsParams, options?: RequestOptions): Promise<AcceptTermsResult> {\n return this.client.request<AcceptTermsResult>(\n 'POST',\n '/v1/terms/accept',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { RequestOptions } from '../types';\n\nexport interface CreateConnectionLinkParams {\n capabilities: Array<'availability' | 'publishing'>;\n publication_policy?: 'none' | 'confirmed' | 'confirmed_tentative';\n}\n\nexport interface ConnectionLink {\n id: string;\n calendar_id: string;\n setup_url?: string | null;\n status: 'awaiting_human' | 'in_progress' | 'completed' | 'declined' | 'expired' | 'cancelled';\n expires_at: string;\n connection_id?: string | null;\n reused?: boolean;\n}\n\nexport class ConnectionLinksClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(calendarId: string, params: CreateConnectionLinkParams, options?: RequestOptions): Promise<ConnectionLink> {\n return this.client.request<ConnectionLink>('POST', `/v1/calendars/${calendarId}/connection-links`, params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<ConnectionLink> {\n return this.client.request<ConnectionLink>('GET', `/v1/connection-links/${id}`, undefined, undefined, options);\n }\n\n async cancel(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/connection-links/${id}`, undefined, undefined, options);\n }\n}\n","import type { WebhookEvent, VerifyOptions } from './types';\nimport { ChronaryError } from './error';\n\nconst DEFAULT_TOLERANCE = 5 * 60 * 1000; // 5 minutes\n\nfunction bufToHex(buf: ArrayBuffer): string {\n return Array.from(new Uint8Array(buf))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nasync function computeSignature(secret: string, timestamp: string, payload: string): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const message = encoder.encode(`${timestamp}.${payload}`);\n const sig = await crypto.subtle.sign('HMAC', key, message);\n return `sha256=${bufToHex(sig)}`;\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const aBuf = encoder.encode(a);\n const bBuf = encoder.encode(b);\n if (aBuf.length !== bBuf.length) return false;\n let diff = 0;\n for (let i = 0; i < aBuf.length; i++) diff |= aBuf[i] ^ bBuf[i];\n return diff === 0;\n}\n\nfunction getHeader(headers: Headers | Record<string, string>, name: string): string | null {\n if (headers instanceof Headers) return headers.get(name);\n\n const record = headers as Record<string, string>;\n const direct = record[name] ?? record[name.toLowerCase()];\n if (direct !== undefined) return direct;\n\n const lowerName = name.toLowerCase();\n for (const [key, value] of Object.entries(record)) {\n if (key.toLowerCase() === lowerName) return value;\n }\n return null;\n}\n\nfunction extractHeaders(headers: Headers | Record<string, string>): { signature: string; timestamp: string } {\n const get = (name: string): string | null => {\n return getHeader(headers, name);\n };\n\n const signature = get('X-Signature') ?? get('x-signature');\n const timestamp = get('X-Timestamp') ?? get('x-timestamp');\n\n if (!signature) throw new ChronaryError('Missing X-Signature header', 0);\n if (!timestamp) throw new ChronaryError('Missing X-Timestamp header', 0);\n\n return { signature, timestamp };\n}\n\nexport async function verifySignature(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<void> {\n if (typeof rawBody !== 'string') {\n throw new ChronaryError(\n 'rawBody must be a string. If you parsed the JSON body, pass the raw string instead.',\n 0,\n );\n }\n\n const { signature, timestamp } = extractHeaders(headers);\n const tolerance = options?.tolerance ?? DEFAULT_TOLERANCE;\n\n // Timestamp tolerance check for replay prevention\n const tsMs = parseInt(timestamp, 10) * 1000;\n const now = Date.now();\n if (Math.abs(now - tsMs) > tolerance) {\n throw new ChronaryError(\n `Webhook timestamp too old. Received ${timestamp}, current time ${Math.floor(now / 1000)}. Tolerance: ${tolerance / 1000}s`,\n 0,\n );\n }\n\n const expected = await computeSignature(secret, timestamp, rawBody);\n if (!constantTimeEqual(expected, signature)) {\n throw new ChronaryError('Webhook signature verification failed', 0);\n }\n}\n\nexport async function constructEvent(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<WebhookEvent> {\n await verifySignature(rawBody, headers, secret, options);\n\n const type = getHeader(headers, 'X-Chronary-Event-Type');\n if (!type) throw new ChronaryError('Missing X-Chronary-Event-Type header', 0);\n\n const data = JSON.parse(rawBody);\n return { type, data } as WebhookEvent;\n}\n","import { CoreClient } from './client';\nimport { AgentsClient } from './resources/agents';\nimport { CalendarsClient } from './resources/calendars';\nimport { EventsClient } from './resources/events';\nimport { AvailabilityClient } from './resources/availability';\nimport { WebhooksClient } from './resources/webhooks';\nimport { ICalSubscriptionsClient } from './resources/ical-subscriptions';\nimport { SchedulingClient } from './resources/scheduling';\nimport { UsageClient } from './resources/usage';\nimport { AuditLogClient } from './resources/audit-log';\nimport { KeysClient } from './resources/keys';\nimport { AgentAuthClient } from './resources/agent-auth';\nimport { WaitlistClient } from './resources/waitlist';\nimport { FeedbackClient } from './resources/feedback';\nimport { PlansClient } from './resources/plans';\nimport { AccountClient } from './resources/account';\nimport { TermsClient } from './resources/terms';\nimport { ConnectionLinksClient } from './resources/connection-links';\nimport { verifySignature, constructEvent } from './webhook-verify';\nimport type { ChronaryConfig } from './types';\n\nexport class Chronary {\n readonly agents: AgentsClient;\n readonly calendars: CalendarsClient;\n readonly events: EventsClient;\n readonly availability: AvailabilityClient;\n readonly webhooks: WebhooksClient;\n readonly icalSubscriptions: ICalSubscriptionsClient;\n readonly scheduling: SchedulingClient;\n readonly usage: UsageClient;\n readonly auditLog: AuditLogClient;\n readonly keys: KeysClient;\n readonly agentAuth: AgentAuthClient;\n readonly waitlist: WaitlistClient;\n readonly feedback: FeedbackClient;\n readonly plans: PlansClient;\n readonly account: AccountClient;\n readonly terms: TermsClient;\n readonly connectionLinks: ConnectionLinksClient;\n\n constructor(config?: ChronaryConfig) {\n const client = new CoreClient(config);\n this.agents = new AgentsClient(client);\n this.calendars = new CalendarsClient(client);\n this.events = new EventsClient(client);\n this.availability = new AvailabilityClient(client);\n this.webhooks = new WebhooksClient(client);\n this.icalSubscriptions = new ICalSubscriptionsClient(client);\n this.scheduling = new SchedulingClient(client);\n this.usage = new UsageClient(client);\n this.auditLog = new AuditLogClient(client);\n this.keys = new KeysClient(client);\n this.agentAuth = new AgentAuthClient(client);\n this.waitlist = new WaitlistClient(client);\n this.feedback = new FeedbackClient(client);\n this.plans = new PlansClient(client);\n this.account = new AccountClient(client);\n this.terms = new TermsClient(client);\n this.connectionLinks = new ConnectionLinksClient(client);\n }\n\n static webhooks = {\n verifySignature,\n constructEvent,\n };\n}\n\n// Re-export everything\nexport { CoreClient } from './client';\nexport { APIPromise } from './api-promise';\nexport type { QuotaSnapshot, RawResponse, WithResponse } from './api-promise';\nexport { PageIterator } from './pagination';\nexport { verifySignature, constructEvent } from './webhook-verify';\nexport { VERSION } from './version';\nexport { isAgentSignUpNewOrg } from './resources/agent-auth';\nexport { ConnectionLinksClient } from './resources/connection-links';\nexport type { ConnectionLink, CreateConnectionLinkParams } from './resources/connection-links';\n\nexport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\n\nexport type {\n ChronaryConfig,\n LogLevel,\n AppInfo,\n RequestOptions,\n PageResponse,\n Page,\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AgentStatus,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n WorkingHours,\n WorkingHoursDay,\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DeleteEventOptions,\n SlotDuration,\n AvailabilitySlot,\n BusyBlock,\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n WebhookDelivery,\n WebhookDeliveryStats,\n WebhookDeliveryListResponse,\n ListWebhookDeliveriesParams,\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n Proposal,\n ProposalSummary,\n ProposalSlot,\n ProposalResponse,\n ProposalStatus,\n ProposalResponseAction,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n Usage,\n UsageMetric,\n AuditLogEntry,\n ListAuditLogParams,\n AuditLogResponse,\n ScopedApiKey,\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n AcceptTermsParams,\n AcceptTermsResult,\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentSignUpExistingOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n WaitlistJoinParams,\n WaitlistJoinResponse,\n WaitlistedOrg,\n FeedbackType,\n SubmitFeedbackParams,\n FeedbackAcceptedResponse,\n PlanId,\n PlanLimits,\n Plan,\n PlansListResponse,\n WebhookEventType,\n WebhookEvent,\n VerifyOptions,\n DataExport,\n} from './types';\n\nexport default Chronary;\n"],"mappings":"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","names":["offset","offset","offset","offset","offset","offset"]}
|