@chronary/sdk 0.1.4 → 0.2.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/README.md CHANGED
@@ -57,6 +57,22 @@ If `apiKey` is omitted, the SDK will also check `process.env.CHRONARY_API_KEY`.
57
57
  - `client.keys`
58
58
  - `client.agentAuth`
59
59
 
60
+ ## Plans & limits
61
+
62
+ Chronary enforces a per-key rate limit and per-org monthly quotas that vary by plan:
63
+
64
+ | | Free | Pro |
65
+ |---|---|---|
66
+ | Rate limit | 10 req/s | 50 req/s |
67
+ | Webhook delivery retries | 4 | 8 |
68
+ | Agents | 3 | 50 |
69
+ | Calendars | 10 | 250 |
70
+ | Events / mo | 2,500 | 125,000 |
71
+ | API calls / mo | 50,000 | 1,000,000 |
72
+ | Pro-only features | — | Scheduling proposals, temporal holds, cross-calendar availability, per-agent API keys (`chr_ak_*`) |
73
+
74
+ Pro-only feature calls return `403` with an upgrade hint on Free. See the full matrix and rate-limit handling guidance at <https://docs.chronary.ai/resources/rate-limits/>.
75
+
60
76
  ## Webhook Verification
61
77
 
62
78
  ```ts
package/dist/index.cjs CHANGED
@@ -41,7 +41,7 @@ __export(index_exports, {
41
41
  module.exports = __toCommonJS(index_exports);
42
42
 
43
43
  // src/version.ts
44
- var VERSION = "0.1.4";
44
+ var VERSION = "0.2.1";
45
45
 
46
46
  // src/error.ts
47
47
  var ChronaryError = class extends Error {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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/webhook-verify.ts"],"sourcesContent":["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 { 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\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 }\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 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","export const VERSION = '0.1.4';\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 * 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 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 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 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 { 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"],"mappings":"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","names":["offset","offset","offset","offset","offset","offset"]}
1
+ {"version":3,"sources":["../src/index.ts","../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/webhook-verify.ts"],"sourcesContent":["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 { 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\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 }\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 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","export const VERSION = '0.2.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 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 * 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 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 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 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 { 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"],"mappings":"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","names":["offset","offset","offset","offset","offset","offset"]}
package/dist/index.d.cts CHANGED
@@ -149,6 +149,8 @@ interface Calendar {
149
149
  timezone: string;
150
150
  metadata: Record<string, unknown>;
151
151
  ical_url: string;
152
+ /** Default reminder offsets (minutes before start) inherited by events that don't set their own. null = system default (10 min); [] = no reminders. */
153
+ default_reminders: number[] | null;
152
154
  deletedAt: string | null;
153
155
  createdAt: string;
154
156
  updatedAt: string;
@@ -157,12 +159,15 @@ interface CreateCalendarParams {
157
159
  name: string;
158
160
  timezone: string;
159
161
  agent_status?: 'idle' | 'working' | 'waiting' | 'error';
162
+ /** Default reminder offsets (minutes before start) for events on this calendar. null/omit = system default (10 min); [] = no reminders. */
163
+ default_reminders?: number[] | null;
160
164
  metadata?: Record<string, unknown>;
161
165
  }
162
166
  interface UpdateCalendarParams {
163
167
  name?: string;
164
168
  timezone?: string;
165
169
  agent_status?: 'idle' | 'working' | 'waiting' | 'error';
170
+ default_reminders?: number[] | null;
166
171
  metadata?: Record<string, unknown>;
167
172
  }
168
173
  interface ListCalendarsParams {
@@ -184,6 +189,8 @@ interface CalendarEvent {
184
189
  status: EventStatus;
185
190
  source: 'internal' | 'external_ical';
186
191
  metadata: Record<string, unknown>;
192
+ /** Reminder offsets (minutes before start). null = inherit calendar default (then system default of 10 min); [] = no reminders. */
193
+ reminders: number[] | null;
187
194
  holdExpiresAt: string | null;
188
195
  holdPriority: number | null;
189
196
  deletedAt: string | null;
@@ -198,6 +205,8 @@ interface CreateEventParams {
198
205
  all_day?: boolean;
199
206
  status?: EventStatus;
200
207
  metadata?: Record<string, unknown>;
208
+ /** Reminder offsets in minutes before start (e.g. [10, 1440]). Each fires an event.reminder webhook + VALARM. null/omit = inherit calendar default (then 10 min); [] = no reminders. Max 5, each 1–40320. */
209
+ reminders?: number[] | null;
201
210
  /** ISO 8601 timestamp. Required when status='hold'. Must be 30s-15min in the future. */
202
211
  hold_expires_at?: string;
203
212
  /** Priority for conflict resolution. Only valid with status='hold'. 0-100. */
@@ -212,6 +221,8 @@ interface UpdateEventParams {
212
221
  /** Holds cannot be updated via PATCH — use /confirm or /release instead. */
213
222
  status?: 'confirmed' | 'tentative' | 'cancelled';
214
223
  metadata?: Record<string, unknown>;
224
+ /** Reminder offsets in minutes before start. null = inherit calendar default; [] = no reminders. */
225
+ reminders?: number[] | null;
215
226
  }
216
227
  interface ListEventsParams {
217
228
  calendarId?: string;
@@ -644,7 +655,7 @@ interface SubmitFeedbackParams {
644
655
  interface FeedbackAcceptedResponse {
645
656
  status: 'accepted';
646
657
  }
647
- type WebhookEventType = 'agent.created' | 'agent.updated' | 'event.created' | 'event.updated' | 'event.deleted' | 'event.started' | 'event.ended' | 'event.hold_created' | 'event.hold_expired' | 'event.hold_released' | 'event.hold_confirmed' | 'proposal.created' | 'proposal.responded' | 'proposal.confirmed' | 'proposal.expired' | 'proposal.cancelled' | 'webhook.deactivated';
658
+ type WebhookEventType = 'agent.created' | 'agent.updated' | 'event.created' | 'event.updated' | 'event.deleted' | 'event.started' | 'event.ended' | 'event.reminder' | 'event.hold_created' | 'event.hold_expired' | 'event.hold_released' | 'event.hold_confirmed' | 'proposal.created' | 'proposal.responded' | 'proposal.confirmed' | 'proposal.expired' | 'proposal.cancelled' | 'webhook.deactivated';
648
659
  interface WebhookEvent {
649
660
  type: WebhookEventType;
650
661
  data: Record<string, unknown>;
@@ -958,7 +969,7 @@ declare class AccountClient {
958
969
  declare function verifySignature(rawBody: string, headers: Headers | Record<string, string>, secret: string, options?: VerifyOptions): Promise<void>;
959
970
  declare function constructEvent(rawBody: string, headers: Headers | Record<string, string>, secret: string, options?: VerifyOptions): Promise<WebhookEvent>;
960
971
 
961
- declare const VERSION = "0.1.4";
972
+ declare const VERSION = "0.2.1";
962
973
 
963
974
  declare class ChronaryError extends Error {
964
975
  readonly status: number;
package/dist/index.d.ts CHANGED
@@ -149,6 +149,8 @@ interface Calendar {
149
149
  timezone: string;
150
150
  metadata: Record<string, unknown>;
151
151
  ical_url: string;
152
+ /** Default reminder offsets (minutes before start) inherited by events that don't set their own. null = system default (10 min); [] = no reminders. */
153
+ default_reminders: number[] | null;
152
154
  deletedAt: string | null;
153
155
  createdAt: string;
154
156
  updatedAt: string;
@@ -157,12 +159,15 @@ interface CreateCalendarParams {
157
159
  name: string;
158
160
  timezone: string;
159
161
  agent_status?: 'idle' | 'working' | 'waiting' | 'error';
162
+ /** Default reminder offsets (minutes before start) for events on this calendar. null/omit = system default (10 min); [] = no reminders. */
163
+ default_reminders?: number[] | null;
160
164
  metadata?: Record<string, unknown>;
161
165
  }
162
166
  interface UpdateCalendarParams {
163
167
  name?: string;
164
168
  timezone?: string;
165
169
  agent_status?: 'idle' | 'working' | 'waiting' | 'error';
170
+ default_reminders?: number[] | null;
166
171
  metadata?: Record<string, unknown>;
167
172
  }
168
173
  interface ListCalendarsParams {
@@ -184,6 +189,8 @@ interface CalendarEvent {
184
189
  status: EventStatus;
185
190
  source: 'internal' | 'external_ical';
186
191
  metadata: Record<string, unknown>;
192
+ /** Reminder offsets (minutes before start). null = inherit calendar default (then system default of 10 min); [] = no reminders. */
193
+ reminders: number[] | null;
187
194
  holdExpiresAt: string | null;
188
195
  holdPriority: number | null;
189
196
  deletedAt: string | null;
@@ -198,6 +205,8 @@ interface CreateEventParams {
198
205
  all_day?: boolean;
199
206
  status?: EventStatus;
200
207
  metadata?: Record<string, unknown>;
208
+ /** Reminder offsets in minutes before start (e.g. [10, 1440]). Each fires an event.reminder webhook + VALARM. null/omit = inherit calendar default (then 10 min); [] = no reminders. Max 5, each 1–40320. */
209
+ reminders?: number[] | null;
201
210
  /** ISO 8601 timestamp. Required when status='hold'. Must be 30s-15min in the future. */
202
211
  hold_expires_at?: string;
203
212
  /** Priority for conflict resolution. Only valid with status='hold'. 0-100. */
@@ -212,6 +221,8 @@ interface UpdateEventParams {
212
221
  /** Holds cannot be updated via PATCH — use /confirm or /release instead. */
213
222
  status?: 'confirmed' | 'tentative' | 'cancelled';
214
223
  metadata?: Record<string, unknown>;
224
+ /** Reminder offsets in minutes before start. null = inherit calendar default; [] = no reminders. */
225
+ reminders?: number[] | null;
215
226
  }
216
227
  interface ListEventsParams {
217
228
  calendarId?: string;
@@ -644,7 +655,7 @@ interface SubmitFeedbackParams {
644
655
  interface FeedbackAcceptedResponse {
645
656
  status: 'accepted';
646
657
  }
647
- type WebhookEventType = 'agent.created' | 'agent.updated' | 'event.created' | 'event.updated' | 'event.deleted' | 'event.started' | 'event.ended' | 'event.hold_created' | 'event.hold_expired' | 'event.hold_released' | 'event.hold_confirmed' | 'proposal.created' | 'proposal.responded' | 'proposal.confirmed' | 'proposal.expired' | 'proposal.cancelled' | 'webhook.deactivated';
658
+ type WebhookEventType = 'agent.created' | 'agent.updated' | 'event.created' | 'event.updated' | 'event.deleted' | 'event.started' | 'event.ended' | 'event.reminder' | 'event.hold_created' | 'event.hold_expired' | 'event.hold_released' | 'event.hold_confirmed' | 'proposal.created' | 'proposal.responded' | 'proposal.confirmed' | 'proposal.expired' | 'proposal.cancelled' | 'webhook.deactivated';
648
659
  interface WebhookEvent {
649
660
  type: WebhookEventType;
650
661
  data: Record<string, unknown>;
@@ -958,7 +969,7 @@ declare class AccountClient {
958
969
  declare function verifySignature(rawBody: string, headers: Headers | Record<string, string>, secret: string, options?: VerifyOptions): Promise<void>;
959
970
  declare function constructEvent(rawBody: string, headers: Headers | Record<string, string>, secret: string, options?: VerifyOptions): Promise<WebhookEvent>;
960
971
 
961
- declare const VERSION = "0.1.4";
972
+ declare const VERSION = "0.2.1";
962
973
 
963
974
  declare class ChronaryError extends Error {
964
975
  readonly status: number;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "0.1.4";
2
+ var VERSION = "0.2.1";
3
3
 
4
4
  // src/error.ts
5
5
  var ChronaryError = class extends Error {
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/webhook-verify.ts","../src/index.ts"],"sourcesContent":["export const VERSION = '0.1.4';\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 * 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 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 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 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 { 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 { 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\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 }\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 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/webhook-verify.ts","../src/index.ts"],"sourcesContent":["export const VERSION = '0.2.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 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 * 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 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 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 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 { 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 { 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\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 }\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 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":";AAAO,IAAM,UAAU;;;ACAhB,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,SACA,QACA,WACA,SACA,WACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,YAAY;AAAA,EACnB;AACF;AAEO,IAAM,sBAAN,cAAkC,cAAc;AAAA,EACrD,YAAY,SAAiB,WAAoB,SAAmB;AAClE,UAAM,SAAS,KAAK,WAAW,SAAS,sBAAsB;AAC9D,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EACvC;AAAA,EAET,YAAY,SAAiB,WAAoB,SAAmB;AAClE,UAAM,SAAS,KAAK,WAAW,SAAS,kBAAkB;AAC1D,SAAK,OAAO;AACZ,QAAI,SAAS;AACX,YAAM,KAAK,QAAQ,IAAI,aAAa;AACpC,UAAI,GAAI,MAAK,aAAa,SAAS,IAAI,EAAE;AAAA,IAC3C;AAAA,EACF;AACF;AAEO,IAAM,gBAAN,cAA4B,cAAc;AAAA,EAC/C,YAAY,SAAiB,WAAoB,SAAmB;AAClE,UAAM,SAAS,KAAK,WAAW,SAAS,WAAW;AACnD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,cAAc;AAAA,EACjD,YAAY,SAAiB,QAAgB,WAAoB,SAAmB;AAClF,UAAM,SAAS,QAAQ,WAAW,SAAS,kBAAkB;AAC7D,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,YAAY,SAAiB,WAAoB,SAAmB;AAClE,UAAM,SAAS,KAAK,WAAW,SAAS,gBAAgB;AACxD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,eAAN,cAA2B,cAAc;AAAA,EAC9C,YAAY,SAAiB;AAC3B,UAAM,SAAS,CAAC;AAChB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,cAAc;AAAA,EACjD,YAAY,SAAiB;AAC3B,UAAM,SAAS,CAAC;AAChB,SAAK,OAAO;AAAA,EACd;AACF;;;ACrBO,IAAM,aAAN,MAA8C;AAAA,EAC3C;AAAA,EAER,YACE,iBACA;AACA,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAyC;AAC7C,UAAM,EAAE,MAAM,YAAY,IAAI,MAAM,KAAK;AACzC,WAAO,EAAE,MAAM,UAAU,YAAY;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,KACE,aACA,YAC8B;AAC9B,WAAO,KAAK,aAAa;AAAA,MACvB,CAAC,WAAY,cAAc,YAAY,OAAO,IAAI,IAAI,OAAO;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MACE,YACsB;AACtB,WAAO,KAAK,KAAK,QAAW,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,WAA6C;AACnD,WAAO,KAAK;AAAA,MACV,CAAC,UAAU;AAAE,oBAAY;AAAG,eAAO;AAAA,MAAO;AAAA,MAC1C,CAAC,WAAW;AAAE,oBAAY;AAAG,cAAM;AAAA,MAAQ;AAAA,IAC7C;AAAA,EACF;AACF;;;ACvFA,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AACrE,IAAM,mBAAmB,oBAAI,IAAI,CAAC,QAAQ,OAAO,SAAS,QAAQ,CAAC;AACnE,IAAM,kBAAkB;AAExB,SAAS,UAAU,MAAkC;AACnD,MAAI;AACF,QAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;AACjD,aAAO,QAAQ,IAAI,IAAI;AAAA,IACzB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAkC;AACzD,MAAI,OAAO,SAAU,QAAO,OAAO;AACnC,QAAM,SAAS,UAAU,cAAc;AACvC,MAAI,UAAU,CAAC,SAAS,QAAQ,QAAQ,SAAS,KAAK,EAAE,SAAS,MAAM,GAAG;AACxE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAM,eAAyC;AAAA,EAC7C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AACP;AAEO,IAAM,aAAN,MAAiB;AAAA,EACb;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAAyB,CAAC,GAAG;AAKvC,SAAK,SAAS,OAAO,UAAU,UAAU,kBAAkB,KAAK;AAEhE,SAAK,WAAW,OAAO,WAAW,kBAAkB,QAAQ,QAAQ,EAAE;AACtE,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,aAAa,OAAO,cAAc;AACvC,SAAK,WAAW,gBAAgB,MAAM;AACtC,SAAK,UAAU,OAAO,SAAS,WAAW,MAAM,KAAK,UAAU;AAC/D,SAAK,eAAe,OAAO,gBAAgB,CAAC;AAE5C,QAAI,KAAK,eAAe,OAAO;AAC/B,QAAI,OAAO,SAAS;AAClB,YAAM,IAAI,OAAO,QAAQ,IAAI;AAC7B,UAAI,OAAO,QAAQ,QAAS,OAAM,IAAI,OAAO,QAAQ,OAAO;AAAA,IAC9D;AACA,QAAI;AACF,UAAI,OAAO,YAAY,eAAe,QAAQ,SAAS;AACrD,cAAM,SAAS,QAAQ,QAAQ,QAAQ,KAAK,EAAE,CAAC;AAAA,MACjD;AAAA,IACF,QAAQ;AAAA,IAER;AACA,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,IAAI,OAAiB,SAAiB;AAC5C,QAAI,UAAU,SAAS,aAAa,KAAK,IAAI,aAAa,KAAK,QAAQ,EAAG;AAC1E,UAAM,SAAS,aAAa,KAAK;AACjC,YAAQ,OAAO;AAAA,MACb,KAAK;AAAS,gBAAQ,MAAM,QAAQ,OAAO;AAAG;AAAA,MAC9C,KAAK;AAAQ,gBAAQ,KAAK,QAAQ,OAAO;AAAG;AAAA,MAC5C,KAAK;AAAQ,gBAAQ,KAAK,QAAQ,OAAO;AAAG;AAAA,MAC5C,KAAK;AAAS,gBAAQ,MAAM,QAAQ,OAAO;AAAG;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,QACE,QACA,MACA,MACA,OACA,SACe;AACf,WAAO,IAAI,WAAc,KAAK,SAAY,QAAQ,MAAM,MAAM,OAAO,OAAO,CAAC;AAAA,EAC/E;AAAA,EAEA,MAAc,SACZ,QACA,MACA,MACA,OACA,SACgD;AAChD,UAAM,MAAM,KAAK,SAAS,MAAM,KAAK;AACrC,UAAM,UAAkC;AAAA,MACtC,cAAc,KAAK;AAAA,MACnB,0BAA0B;AAAA,MAC1B,GAAG,KAAK;AAAA,IACV;AACA,QAAI,KAAK,QAAQ;AACf,cAAQ,eAAe,IAAI,UAAU,KAAK,MAAM;AAAA,IAClD;AAEA,QAAI,SAAS,QAAW;AACtB,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,QAAI,iBAAiB,IAAI,MAAM,GAAG;AAChC,cAAQ,iBAAiB,IAAI,SAAS,kBAAkB,OAAO,WAAW;AAAA,IAC5E;AAEA,UAAM,iBAAiB,SAAS,WAAW,KAAK;AAChD,QAAI;AAEJ,aAAS,UAAU,GAAG,WAAW,KAAK,YAAY,WAAW;AAC3D,UAAI,UAAU,GAAG;AACf,cAAM,QAAQ,KAAK,WAAW,SAAS,SAAS;AAChD,aAAK,IAAI,QAAQ,UAAU,OAAO,UAAU,KAAK,IAAI;AACrD,cAAM,MAAM,KAAK;AAAA,MACnB;AAEA,UAAI,SAAS,QAAQ,QAAS,OAAM,IAAI,cAAc,mBAAmB,CAAC;AAE1E,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,kBAAkB,MAAM,WAAW,MAAM,SAAS,QAAQ,MAAM;AACtE,eAAS,QAAQ,iBAAiB,SAAS,iBAAiB,EAAE,MAAM,KAAK,CAAC;AAE1E,YAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,cAAc;AAErE,UAAI;AACF,aAAK,IAAI,SAAS,GAAG,MAAM,IAAI,IAAI,EAAE;AACrC,cAAM,YAAY,KAAK,IAAI;AAE3B,cAAM,WAAW,MAAM,KAAK,QAAQ,KAAK;AAAA,UACvC;AAAA,UACA;AAAA,UACA,MAAM,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,UAClD,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,qBAAa,SAAS;AACtB,iBAAS,QAAQ,oBAAoB,SAAS,eAAe;AAC7D,cAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,cAAM,YAAY,SAAS,QAAQ,IAAI,cAAc,KAAK;AAE1D,aAAK,IAAI,SAAS,GAAG,MAAM,IAAI,IAAI,WAAM,SAAS,MAAM,OAAO,OAAO,KAAK,YAAY,KAAK,SAAS,MAAM,EAAE,EAAE;AAE/G,YAAI,SAAS,IAAI;AACf,gBAAM,cAA2B;AAAA,YAC/B,QAAQ,SAAS;AAAA,YACjB,SAAS,SAAS;AAAA,YAClB,KAAK,SAAS;AAAA,YACd,OAAO,mBAAmB,SAAS,OAAO;AAAA,UAC5C;AACA,cAAI,SAAS,WAAW,KAAK;AAC3B,mBAAO,EAAE,MAAM,QAAgB,YAAY;AAAA,UAC7C;AACA,gBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,iBAAO,EAAE,MAAM,YAAY;AAAA,QAC7B;AAGA,YAAI,uBAAuB,IAAI,SAAS,MAAM,KAAK,UAAU,KAAK,YAAY;AAC5E,sBAAY,MAAM,KAAK,WAAW,UAAU,SAAS;AACrD;AAAA,QACF;AAEA,cAAM,MAAM,KAAK,WAAW,UAAU,SAAS;AAAA,MACjD,SAAS,KAAK;AACZ,qBAAa,SAAS;AACtB,iBAAS,QAAQ,oBAAoB,SAAS,eAAe;AAE7D,YAAI,eAAe,cAAe,OAAM;AAExC,YAAI,eAAe,gBAAgB,IAAI,SAAS,cAAc;AAC5D,cAAI,SAAS,QAAQ,QAAS,OAAM,IAAI,cAAc,mBAAmB,CAAC;AAC1E,gBAAM,IAAI,aAAa,2BAA2B,cAAc,IAAI;AAAA,QACtE;AAEA,YAAI,UAAU,KAAK,YAAY;AAC7B,sBAAY;AACZ;AAAA,QACF;AAEA,cAAM,IAAI,gBAAgB,sBAAuB,IAAc,OAAO,EAAE;AAAA,MAC1E;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,gBAAgB,8BAA8B;AAAA,EACvE;AAAA,EAEQ,SAAS,MAAc,OAAuE;AACpG,UAAM,OAAO,GAAG,KAAK,OAAO,GAAG,IAAI;AACnC,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,SAAS,IAAI,gBAAgB;AACnC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,UAAI,UAAU,OAAW,QAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,IACxD;AACA,UAAM,KAAK,OAAO,SAAS;AAC3B,WAAO,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK;AAAA,EAChC;AAAA,EAEA,MAAc,WAAW,UAAoB,WAA4C;AACvF,QAAI;AACJ,QAAI;AACF,kBAAY,MAAM,SAAS,KAAK;AAAA,IAClC,QAAQ;AAAA,IAER;AAEA,UAAM,UAAU,WAAW,OAAO,WAAW,QAAQ,SAAS,MAAM;AACpE,UAAM,MAAM,aAAa,WAAW,OAAO;AAC3C,UAAM,YAAY,WAAW,OAAO;AAEpC,YAAQ,SAAS,QAAQ;AAAA,MACvB,KAAK;AACH,YAAI,cAAc,oBAAoB;AACpC,iBAAO,IAAI,gBAAgB,SAAS,SAAS,QAAQ,KAAK,SAAS,OAAO;AAAA,QAC5E;AACA,eAAO,IAAI,cAAc,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,SAAS;AAAA,MACrF,KAAK;AACH,eAAO,IAAI,oBAAoB,SAAS,KAAK,SAAS,OAAO;AAAA,MAC/D,KAAK;AACH,eAAO,IAAI,mBAAmB,SAAS,KAAK,SAAS,OAAO;AAAA,MAC9D,KAAK;AACH,eAAO,IAAI,cAAc,SAAS,KAAK,SAAS,OAAO;AAAA,MACzD,KAAK;AACH,eAAO,IAAI,gBAAgB,SAAS,SAAS,QAAQ,KAAK,SAAS,OAAO;AAAA,MAC5E,KAAK,KAAK;AACR,YAAI,cAAc,kBAAkB;AAClC,iBAAO,IAAI,mBAAmB,SAAS,KAAK,SAAS,OAAO;AAAA,QAC9D;AACA,eAAO,IAAI,eAAe,SAAS,KAAK,SAAS,OAAO;AAAA,MAC1D;AAAA,MACA;AACE,eAAO,IAAI,cAAc,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,SAAS;AAAA,IACvF;AAAA,EACF;AAAA,EAEQ,WAAW,SAAiB,WAA2B;AAE7D,QAAI,qBAAqB,kBAAkB,UAAU,YAAY;AAC/D,aAAO,KAAK,IAAI,UAAU,aAAa,KAAM,eAAe;AAAA,IAC9D;AAGA,UAAM,OAAO;AACb,UAAM,cAAc,OAAO,KAAK,IAAI,GAAG,UAAU,CAAC;AAClD,UAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,WAAO,KAAK,IAAI,cAAc,QAAQ,eAAe;AAAA,EACvD;AACF;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAWA,SAAS,mBAAmB,SAA6C;AACvE,QAAM,YAAY,QAAQ,IAAI,WAAW;AACzC,QAAM,SAAS,QAAQ,IAAI,kBAAkB;AAC7C,MAAI,CAAC,aAAa,CAAC,OAAQ,QAAO;AAElC,QAAM,YAAY,qBAAqB,WAAW,GAAG;AACrD,QAAM,eAAe,qBAAqB,WAAW,GAAG;AACxD,QAAM,QAAQ,qBAAqB,QAAQ,GAAG;AAC9C,MAAI,cAAc,UAAa,iBAAiB,UAAa,UAAU,QAAW;AAChF,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,eAAe,GAAI;AAAA,EACpD;AACF;AAEA,SAAS,qBAAqB,QAAgB,KAAiC;AAE7E,QAAM,KAAK,IAAI,OAAO,cAAc,GAAG,kBAAkB;AACzD,QAAM,QAAQ,GAAG,KAAK,MAAM;AAC5B,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,OAAO,MAAM,CAAC,CAAC;AACzB,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;;;AC3TO,IAAM,eAAN,MAAkD;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YACE,WACA,eAAuB,IACvB,gBAAwB,GACxB;AACA,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,MAAM,QAAQ,SAAiB,KAAK,eAAe,OAAkC;AACnF,UAAM,IAAI,SAAS,KAAK;AACxB,UAAM,WAAW,MAAM,KAAK,UAAU,QAAQ,CAAC;AAC/C,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,QAAQ,OAAO,aAAa,IAA8B;AACxD,QAAI,SAAS,KAAK;AAClB,UAAM,QAAQ,KAAK;AAEnB,WAAO,MAAM;AACX,YAAM,OAAO,MAAM,KAAK,UAAU,QAAQ,KAAK;AAC/C,iBAAW,QAAQ,KAAK,MAAM;AAC5B,cAAM;AAAA,MACR;AACA,gBAAU,KAAK,KAAK;AACpB,UAAI,UAAU,KAAK,SAAS,KAAK,KAAK,WAAW,EAAG;AAAA,IACtD;AAAA,EACF;AACF;;;AC5BO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,MAAM,OAAO,QAA2B,SAA0C;AAChF,WAAO,KAAK,OAAO,QAAe,QAAQ,cAAc,QAAQ,QAAW,OAAO;AAAA,EACpF;AAAA,EAEA,MAAM,IAAI,IAAY,SAA0C;AAC9D,WAAO,KAAK,OAAO,QAAe,OAAO,cAAc,EAAE,IAAI,QAAW,QAAW,OAAO;AAAA,EAC5F;AAAA,EAEA,KAAK,SAA2B,CAAC,GAAwB;AACvD,UAAM,EAAE,QAAQ,IAAI,SAAS,GAAG,GAAG,QAAQ,IAAI;AAC/C,WAAO,IAAI;AAAA,MACT,CAACA,SAAQ,MACP,KAAK,OAAO,QAA6B,OAAO,cAAc,QAAW;AAAA,QACvE,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAAA;AAAA,MACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAY,QAA2B,SAA0C;AAC5F,WAAO,KAAK,OAAO,QAAe,SAAS,cAAc,EAAE,IAAI,QAAQ,QAAW,OAAO;AAAA,EAC3F;AAAA,EAEA,MAAM,OAAO,IAAY,SAAyC;AAChE,UAAM,KAAK,OAAO,QAAc,UAAU,cAAc,EAAE,IAAI,QAAW,QAAW,OAAO;AAAA,EAC7F;AACF;;;ACjCO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,OAAO,QAAqD,SAA6C;AAC7G,UAAM,EAAE,SAAS,GAAG,KAAK,IAAI;AAC7B,UAAM,OAAO,UAAU,cAAc,OAAO,eAAe;AAC3D,WAAO,KAAK,OAAO,QAAkB,QAAQ,MAAM,MAAM,QAAW,OAAO;AAAA,EAC7E;AAAA,EAEA,MAAM,IAAI,IAAY,SAA6C;AACjE,WAAO,KAAK,OAAO,QAAkB,OAAO,iBAAiB,EAAE,IAAI,QAAW,QAAW,OAAO;AAAA,EAClG;AAAA,EAEA,KAAK,SAA8B,CAAC,GAA2B;AAC7D,UAAM,EAAE,SAAS,QAAQ,IAAI,SAAS,GAAG,GAAG,QAAQ,IAAI;AACxD,UAAM,OAAO,UAAU,cAAc,OAAO,eAAe;AAC3D,WAAO,IAAI;AAAA,MACT,CAACC,SAAQ,MACP,KAAK,OAAO,QAAgC,OAAO,MAAM,QAAW;AAAA,QAClE,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAAA;AAAA,MACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAY,QAA8B,SAA6C;AAClG,WAAO,KAAK,OAAO,QAAkB,SAAS,iBAAiB,EAAE,IAAI,QAAQ,QAAW,OAAO;AAAA,EACjG;AAAA,EAEA,MAAM,OAAO,IAAY,SAAyC;AAChE,UAAM,KAAK,OAAO,QAAc,UAAU,iBAAiB,EAAE,IAAI,QAAW,QAAW,OAAO;AAAA,EAChG;AAAA,EAEA,MAAM,WAAW,IAAY,SAAoD;AAC/E,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,iBAAiB,EAAE;AAAA,MAAY;AAAA,MAAW;AAAA,MAAW;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,IACA,QACA,SAC4B;AAC5B,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,iBAAiB,EAAE;AAAA,MAAuB;AAAA,MAAQ;AAAA,MAAW;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,IAAY,SAAsD;AAC3F,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,iBAAiB,EAAE;AAAA,MAAuB;AAAA,MAAW;AAAA,MAAW;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAM,wBAAwB,IAAY,SAAyC;AACjF,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MAAU,iBAAiB,EAAE;AAAA,MAAuB;AAAA,MAAW;AAAA,MAAW;AAAA,IAC5E;AAAA,EACF;AACF;;;AClEO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,OAAO,YAAoB,QAA2B,SAAkD;AAC5G,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAQ,iBAAiB,UAAU;AAAA,MAAW;AAAA,MAAQ;AAAA,MAAW;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,YAAoB,SAAiB,SAAkD;AAC/F,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,iBAAiB,UAAU,WAAW,OAAO;AAAA,MAAI;AAAA,MAAW;AAAA,MAAW;AAAA,IAChF;AAAA,EACF;AAAA,EAEA,KAAK,SAA2B,CAAC,GAAgC;AAC/D,UAAM,EAAE,YAAY,SAAS,QAAQ,IAAI,SAAS,GAAG,GAAG,QAAQ,IAAI;AAEpE,QAAI;AACJ,QAAI,SAAS;AACX,aAAO,cAAc,OAAO;AAAA,IAC9B,WAAW,YAAY;AACrB,aAAO,iBAAiB,UAAU;AAAA,IACpC,OAAO;AACL,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAEA,WAAO,IAAI;AAAA,MACT,CAACC,SAAQ,MACP,KAAK,OAAO,QAAqC,OAAO,MAAM,QAAW;AAAA,QACvE,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAAA;AAAA,MACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,YAAoB,SAAiB,QAA2B,SAAkD;AAC7H,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAS,iBAAiB,UAAU,WAAW,OAAO;AAAA,MAAI;AAAA,MAAQ;AAAA,MAAW;AAAA,IAC/E;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,YAAoB,SAAiB,SAAyC;AACzF,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MAAU,iBAAiB,UAAU,WAAW,OAAO;AAAA,MAAI;AAAA,MAAW;AAAA,MAAW;AAAA,IACnF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,SAAiB,SAAkD;AAC/E,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,cAAc,OAAO;AAAA,MAAY;AAAA,MAAW;AAAA,MAAW;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,SAAiB,SAAkD;AAC/E,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,cAAc,OAAO;AAAA,MAAY;AAAA,MAAW;AAAA,MAAW;AAAA,IAChE;AAAA,EACF;AACF;;;ACzEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,SAAS,SAAiB,QAA4B,SAAyD;AACnH,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,cAAc,OAAO;AAAA,MAAiB;AAAA,MAC7C;AAAA,QACE,OAAO,OAAO;AAAA,QACd,KAAK,OAAO;AAAA,QACZ,eAAe,OAAO;AAAA,QACtB,cAAc,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,YAAoB,QAA4B,SAAyD;AACzH,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,iBAAiB,UAAU;AAAA,MAAiB;AAAA,MACnD;AAAA,QACE,OAAO,OAAO;AAAA,QACd,KAAK,OAAO;AAAA,QACZ,eAAe,OAAO;AAAA,QACtB,cAAc,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,QAAsC,SAAyD;AACzG,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO;AAAA,MAAoB;AAAA,MAC3B;AAAA,QACE,QAAQ,OAAO,OAAO,KAAK,GAAG;AAAA,QAC9B,OAAO,OAAO;AAAA,QACd,KAAK,OAAO;AAAA,QACZ,eAAe,OAAO;AAAA,QACtB,WAAW,OAAO,WAAW,KAAK,GAAG;AAAA,QACrC,cAAc,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ACtCO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,OAAO,QAA6B,SAA4C;AACpF,WAAO,KAAK,OAAO,QAAiB,QAAQ,gBAAgB,QAAQ,QAAW,OAAO;AAAA,EACxF;AAAA,EAEA,MAAM,IAAI,IAAY,SAA4C;AAChE,WAAO,KAAK,OAAO,QAAiB,OAAO,gBAAgB,EAAE,IAAI,QAAW,QAAW,OAAO;AAAA,EAChG;AAAA,EAEA,KAAK,SAA6B,CAAC,GAA0B;AAC3D,UAAM,EAAE,QAAQ,IAAI,SAAS,GAAG,GAAG,QAAQ,IAAI;AAC/C,WAAO,IAAI;AAAA,MACT,CAACC,SAAQ,MACP,KAAK,OAAO,QAA+B,OAAO,gBAAgB,QAAW;AAAA,QAC3E,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAAA;AAAA,MACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAY,QAA6B,SAA4C;AAChG,WAAO,KAAK,OAAO,QAAiB,SAAS,gBAAgB,EAAE,IAAI,QAAQ,QAAW,OAAO;AAAA,EAC/F;AAAA,EAEA,MAAM,OAAO,IAAY,SAAyC;AAChE,UAAM,KAAK,OAAO,QAAc,UAAU,gBAAgB,EAAE,IAAI,QAAW,QAAW,OAAO;AAAA,EAC/F;AAAA,EAEA,MAAM,eACJ,WACA,SAAsC,CAAC,GACvC,SACsC;AACtC,UAAM,EAAE,QAAQ,IAAI,SAAS,GAAG,QAAQ,gBAAgB,IAAI;AAC5D,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,gBAAgB,SAAS;AAAA,MACzB;AAAA,MACA,EAAE,OAAO,QAAQ,GAAI,WAAW,UAAa,EAAE,OAAO,GAAI,GAAI,oBAAoB,UAAa,EAAE,gBAAgB,EAAG;AAAA,MACpH;AAAA,IACF;AAAA,EACF;AACF;;;ACjDO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,OAAO,SAAiB,QAAsC,SAAqD;AACvH,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAQ,cAAc,OAAO;AAAA,MAAuB;AAAA,MAAQ;AAAA,MAAW;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,IAAY,SAAqD;AACzE,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,0BAA0B,EAAE;AAAA,MAAI;AAAA,MAAW;AAAA,MAAW;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,KAAK,QAA2F;AAC9F,UAAM,EAAE,SAAS,QAAQ,IAAI,SAAS,GAAG,GAAG,QAAQ,IAAI;AACxD,WAAO,IAAI;AAAA,MACT,CAACC,SAAQ,MACP,KAAK,OAAO;AAAA,QACV;AAAA,QAAO,cAAc,OAAO;AAAA,QAAuB;AAAA,QACnD,EAAE,GAAG,SAAS,OAAO,GAAG,QAAAA,QAAO;AAAA,MACjC;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAY,QAAsC,SAAqD;AAClH,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAS,0BAA0B,EAAE;AAAA,MAAI;AAAA,MAAQ;AAAA,MAAW;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAY,SAAyC;AAChE,UAAM,KAAK,OAAO;AAAA,MAChB;AAAA,MAAU,0BAA0B,EAAE;AAAA,MAAI;AAAA,MAAW;AAAA,MAAW;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,IAAY,SAAuD;AAC5E,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAQ,0BAA0B,EAAE;AAAA,MAAS;AAAA,MAAW;AAAA,MAAW;AAAA,IACrE;AAAA,EACF;AACF;;;ACzCO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,OAAO,QAA8B,SAAoD;AAC7F,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAQ;AAAA,MAA4B;AAAA,MAAQ;AAAA,MAAW;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,KAAK,SAA8B,CAAC,GAAkC;AACpE,UAAM,EAAE,QAAQ,IAAI,SAAS,GAAG,GAAG,QAAQ,IAAI;AAC/C,WAAO,IAAI;AAAA,MACT,CAACC,SAAQ,MACP,KAAK,OAAO;AAAA,QACV;AAAA,QAAO;AAAA,QAA4B;AAAA,QACnC,EAAE,GAAG,SAAS,OAAO,GAAG,QAAAA,QAAO;AAAA,MACjC;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,IAAY,SAA6C;AACjE,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAO,4BAA4B,EAAE;AAAA,MAAI;AAAA,MAAW;AAAA,MAAW;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,IACA,QACA,SAC2B;AAC3B,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAQ,4BAA4B,EAAE;AAAA,MAAY;AAAA,MAAQ;AAAA,MAAW;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAAY,SAA4D;AACpF,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAQ,4BAA4B,EAAE;AAAA,MAAY;AAAA,MAAW;AAAA,MAAW;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,IAAY,SAA2D;AAClF,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MAAQ,4BAA4B,EAAE;AAAA,MAAW;AAAA,MAAW;AAAA,MAAW;AAAA,IACzE;AAAA,EACF;AACF;;;AC7DO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,IAAI,SAA0C;AAClD,WAAO,KAAK,OAAO,QAAe,OAAO,aAAa,QAAW,QAAW,OAAO;AAAA,EACrF;AACF;;;ACNO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,KAAK,QAA6B,SAAqD;AAI3F,UAAM,QAA+D;AAAA,MACnE,MAAM,QAAQ;AAAA,MACd,IAAI,QAAQ;AAAA,MACZ,QAAQ,QAAQ;AAAA,MAChB,kBAAkB,QAAQ;AAAA,MAC1B,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB;AACA,WAAO,KAAK,OAAO,QAA0B,OAAO,iBAAiB,QAAW,OAAO,OAAO;AAAA,EAChG;AACF;;;ACRO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA,EAE7B,MAAM,OACJ,QACA,SAC8B;AAC9B,WAAO,KAAK,OAAO,QAA6B,QAAQ,YAAY,QAAQ,QAAW,OAAO;AAAA,EAChG;AAAA,EAEA,MAAM,KAAK,SAAmD;AAC5D,UAAM,WAAW,MAAM,KAAK,OAAO;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,IAAY,SAAyC;AAChE,UAAM,KAAK,OAAO,QAAc,UAAU,YAAY,EAAE,IAAI,QAAW,QAAW,OAAO;AAAA,EAC3F;AACF;;;AC1BO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqB7B,MAAM,OACJ,QACA,SAC8B;AAC9B,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OACJ,QACA,SAC8B;AAC9B,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,oBACd,UACuC;AACvC,SAAO,aAAa;AACtB;;;ACzEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqB7B,MAAM,KACJ,QACA,SAC+B;AAC/B,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AClCO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU7B,MAAM,OACJ,QACA,SACmC;AACnC,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC3BO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7B,MAAM,KAAK,SAAsD;AAC/D,WAAO,KAAK,OAAO,QAA2B,OAAO,aAAa,QAAW,QAAW,OAAO;AAAA,EACjG;AACF;;;ACbO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAArB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB7B,MAAM,OAAO,SAA+C;AAC1D,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC5BA,IAAM,oBAAoB,IAAI,KAAK;AAEnC,SAAS,SAAS,KAA0B;AAC1C,SAAO,MAAM,KAAK,IAAI,WAAW,GAAG,CAAC,EAClC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AAEA,eAAe,iBAAiB,QAAgB,WAAmB,SAAkC;AACnG,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,QAAQ,OAAO,MAAM;AAAA,IACrB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,OAAO,GAAG,SAAS,IAAI,OAAO,EAAE;AACxD,QAAM,MAAM,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,OAAO;AACzD,SAAO,UAAU,SAAS,GAAG,CAAC;AAChC;AAEA,SAAS,kBAAkB,GAAW,GAAoB;AACxD,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,OAAO,QAAQ,OAAO,CAAC;AAC7B,QAAM,OAAO,QAAQ,OAAO,CAAC;AAC7B,MAAI,KAAK,WAAW,KAAK,OAAQ,QAAO;AACxC,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,SAAQ,KAAK,CAAC,IAAI,KAAK,CAAC;AAC9D,SAAO,SAAS;AAClB;AAEA,SAAS,UAAU,SAA2C,MAA6B;AACzF,MAAI,mBAAmB,QAAS,QAAO,QAAQ,IAAI,IAAI;AAEvD,QAAM,SAAS;AACf,QAAM,SAAS,OAAO,IAAI,KAAK,OAAO,KAAK,YAAY,CAAC;AACxD,MAAI,WAAW,OAAW,QAAO;AAEjC,QAAM,YAAY,KAAK,YAAY;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,IAAI,YAAY,MAAM,UAAW,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAAqF;AAC3G,QAAM,MAAM,CAAC,SAAgC;AAC3C,WAAO,UAAU,SAAS,IAAI;AAAA,EAChC;AAEA,QAAM,YAAY,IAAI,aAAa,KAAK,IAAI,aAAa;AACzD,QAAM,YAAY,IAAI,aAAa,KAAK,IAAI,aAAa;AAEzD,MAAI,CAAC,UAAW,OAAM,IAAI,cAAc,8BAA8B,CAAC;AACvE,MAAI,CAAC,UAAW,OAAM,IAAI,cAAc,8BAA8B,CAAC;AAEvE,SAAO,EAAE,WAAW,UAAU;AAChC;AAEA,eAAsB,gBACpB,SACA,SACA,QACA,SACe;AACf,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,WAAW,UAAU,IAAI,eAAe,OAAO;AACvD,QAAM,YAAY,SAAS,aAAa;AAGxC,QAAM,OAAO,SAAS,WAAW,EAAE,IAAI;AACvC,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,KAAK,IAAI,MAAM,IAAI,IAAI,WAAW;AACpC,UAAM,IAAI;AAAA,MACR,uCAAuC,SAAS,kBAAkB,KAAK,MAAM,MAAM,GAAI,CAAC,gBAAgB,YAAY,GAAI;AAAA,MACxH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,iBAAiB,QAAQ,WAAW,OAAO;AAClE,MAAI,CAAC,kBAAkB,UAAU,SAAS,GAAG;AAC3C,UAAM,IAAI,cAAc,yCAAyC,CAAC;AAAA,EACpE;AACF;AAEA,eAAsB,eACpB,SACA,SACA,QACA,SACuB;AACvB,QAAM,gBAAgB,SAAS,SAAS,QAAQ,OAAO;AAEvD,QAAM,OAAO,UAAU,SAAS,uBAAuB;AACvD,MAAI,CAAC,KAAM,OAAM,IAAI,cAAc,wCAAwC,CAAC;AAE5E,QAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,SAAO,EAAE,MAAM,KAAK;AACtB;;;ACzFO,IAAM,WAAN,MAAe;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAAyB;AACnC,UAAM,SAAS,IAAI,WAAW,MAAM;AACpC,SAAK,SAAS,IAAI,aAAa,MAAM;AACrC,SAAK,YAAY,IAAI,gBAAgB,MAAM;AAC3C,SAAK,SAAS,IAAI,aAAa,MAAM;AACrC,SAAK,eAAe,IAAI,mBAAmB,MAAM;AACjD,SAAK,WAAW,IAAI,eAAe,MAAM;AACzC,SAAK,oBAAoB,IAAI,wBAAwB,MAAM;AAC3D,SAAK,aAAa,IAAI,iBAAiB,MAAM;AAC7C,SAAK,QAAQ,IAAI,YAAY,MAAM;AACnC,SAAK,WAAW,IAAI,eAAe,MAAM;AACzC,SAAK,OAAO,IAAI,WAAW,MAAM;AACjC,SAAK,YAAY,IAAI,gBAAgB,MAAM;AAC3C,SAAK,WAAW,IAAI,eAAe,MAAM;AACzC,SAAK,WAAW,IAAI,eAAe,MAAM;AACzC,SAAK,QAAQ,IAAI,YAAY,MAAM;AACnC,SAAK,UAAU,IAAI,cAAc,MAAM;AAAA,EACzC;AAAA,EAEA,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACF;AA0GA,IAAO,gBAAQ;","names":["offset","offset","offset","offset","offset","offset"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chronary/sdk",
3
- "version": "0.1.4",
3
+ "version": "0.2.1",
4
4
  "description": "Official TypeScript SDK for the Chronary calendar-as-a-service API",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -45,14 +45,14 @@
45
45
  "type": "git",
46
46
  "url": "https://github.com/Chronary/chronary-node"
47
47
  },
48
- "homepage": "https://docs.chronary.ai",
48
+ "homepage": "https://chronary.ai",
49
49
  "bugs": {
50
50
  "url": "https://github.com/Chronary/chronary-node/issues"
51
51
  },
52
52
  "devDependencies": {
53
53
  "tsup": "^8.0.0",
54
- "vitest": "^3.0.0",
55
- "typescript": "^5.7.0"
54
+ "typescript": "^5.7.0",
55
+ "vitest": "^4.1.8"
56
56
  },
57
57
  "scripts": {
58
58
  "build": "tsup",