@chronary/sdk 0.4.2 → 0.5.0

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/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.4.2";
44
+ var VERSION = "0.5.0";
45
45
 
46
46
  // src/error.ts
47
47
  var ChronaryError = class extends Error {
@@ -583,13 +583,22 @@ var EventsClient = class {
583
583
  options
584
584
  );
585
585
  }
586
+ /**
587
+ * Delete an event (or, for a recurring series, the whole series). Pass
588
+ * `occurrence_start` to cancel just one occurrence of a recurring series
589
+ * instead — the series lives on and the updated series master is returned.
590
+ * Plain deletes resolve to void. With `occurrence_start`, fails with 400 if
591
+ * the timestamp is not an active occurrence, or 409 if the event is not a
592
+ * recurring series.
593
+ */
586
594
  async delete(calendarId, eventId, options) {
587
- await this.client.request(
595
+ const { occurrence_start, ...requestOptions } = options ?? {};
596
+ return this.client.request(
588
597
  "DELETE",
589
598
  `/v1/calendars/${calendarId}/events/${eventId}`,
590
599
  void 0,
591
- void 0,
592
- options
600
+ occurrence_start !== void 0 ? { occurrence_start } : void 0,
601
+ requestOptions
593
602
  );
594
603
  }
595
604
  /**
@@ -620,15 +629,20 @@ var EventsClient = class {
620
629
  }
621
630
  /**
622
631
  * Delete an event by ID alone. The calendar is resolved internally from the
623
- * event, so no calendar ID is required.
632
+ * event, so no calendar ID is required. Pass `occurrence_start` to cancel
633
+ * just one occurrence of a recurring series — the series lives on and the
634
+ * updated series master is returned; plain deletes resolve to void. With
635
+ * `occurrence_start`, fails with 400 if the timestamp is not an active
636
+ * occurrence, or 409 if the event is not a recurring series.
624
637
  */
625
638
  async deleteById(eventId, options) {
626
- await this.client.request(
639
+ const { occurrence_start, ...requestOptions } = options ?? {};
640
+ return this.client.request(
627
641
  "DELETE",
628
642
  `/v1/events/${eventId}`,
629
643
  void 0,
630
- void 0,
631
- options
644
+ occurrence_start !== void 0 ? { occurrence_start } : void 0,
645
+ requestOptions
632
646
  );
633
647
  }
634
648
  /**
@@ -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/resources/terms.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 { TermsClient } from './resources/terms';\nimport { verifySignature, constructEvent } from './webhook-verify';\nimport type { ChronaryConfig } from './types';\n\nexport class Chronary {\n readonly agents: AgentsClient;\n readonly calendars: CalendarsClient;\n readonly events: EventsClient;\n readonly availability: AvailabilityClient;\n readonly webhooks: WebhooksClient;\n readonly icalSubscriptions: ICalSubscriptionsClient;\n readonly scheduling: SchedulingClient;\n readonly usage: UsageClient;\n readonly auditLog: AuditLogClient;\n readonly keys: KeysClient;\n readonly agentAuth: AgentAuthClient;\n readonly waitlist: WaitlistClient;\n readonly feedback: FeedbackClient;\n readonly plans: PlansClient;\n readonly account: AccountClient;\n readonly terms: TermsClient;\n\n constructor(config?: ChronaryConfig) {\n const client = new CoreClient(config);\n this.agents = new AgentsClient(client);\n this.calendars = new CalendarsClient(client);\n this.events = new EventsClient(client);\n this.availability = new AvailabilityClient(client);\n this.webhooks = new WebhooksClient(client);\n this.icalSubscriptions = new ICalSubscriptionsClient(client);\n this.scheduling = new SchedulingClient(client);\n this.usage = new UsageClient(client);\n this.auditLog = new AuditLogClient(client);\n this.keys = new KeysClient(client);\n this.agentAuth = new AgentAuthClient(client);\n this.waitlist = new WaitlistClient(client);\n this.feedback = new FeedbackClient(client);\n this.plans = new PlansClient(client);\n this.account = new AccountClient(client);\n this.terms = new TermsClient(client);\n }\n\n static webhooks = {\n verifySignature,\n constructEvent,\n };\n}\n\n// Re-export everything\nexport { CoreClient } from './client';\nexport { APIPromise } from './api-promise';\nexport type { QuotaSnapshot, RawResponse, WithResponse } from './api-promise';\nexport { PageIterator } from './pagination';\nexport { verifySignature, constructEvent } from './webhook-verify';\nexport { VERSION } from './version';\nexport { isAgentSignUpNewOrg } from './resources/agent-auth';\n\nexport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\n\nexport type {\n ChronaryConfig,\n LogLevel,\n AppInfo,\n RequestOptions,\n PageResponse,\n Page,\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AgentStatus,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n WorkingHours,\n WorkingHoursDay,\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n SlotDuration,\n AvailabilitySlot,\n BusyBlock,\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n WebhookDelivery,\n WebhookDeliveryStats,\n WebhookDeliveryListResponse,\n ListWebhookDeliveriesParams,\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n Proposal,\n ProposalSummary,\n ProposalSlot,\n ProposalResponse,\n ProposalStatus,\n ProposalResponseAction,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n Usage,\n UsageMetric,\n AuditLogEntry,\n ListAuditLogParams,\n AuditLogResponse,\n ScopedApiKey,\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n AcceptTermsParams,\n AcceptTermsResult,\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentSignUpExistingOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n WaitlistJoinParams,\n WaitlistJoinResponse,\n WaitlistedOrg,\n FeedbackType,\n SubmitFeedbackParams,\n FeedbackAcceptedResponse,\n PlanId,\n PlanLimits,\n Plan,\n PlansListResponse,\n WebhookEventType,\n WebhookEvent,\n VerifyOptions,\n DataExport,\n} from './types';\n\nexport default Chronary;\n","export const VERSION = '0.4.2';\n","export class ChronaryError extends Error {\n readonly status: number;\n readonly requestId: string | undefined;\n readonly headers: Headers | undefined;\n readonly errorType: string | undefined;\n\n constructor(\n message: string,\n status: number,\n requestId?: string,\n headers?: Headers,\n errorType?: string,\n ) {\n super(message);\n this.name = 'ChronaryError';\n this.status = status;\n this.requestId = requestId;\n this.headers = headers;\n this.errorType = errorType;\n }\n}\n\nexport class AuthenticationError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 401, requestId, headers, 'authentication_error');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class RateLimitError extends ChronaryError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 429, requestId, headers, 'rate_limit_error');\n this.name = 'RateLimitError';\n if (headers) {\n const ra = headers.get('retry-after');\n if (ra) this.retryAfter = parseInt(ra, 10);\n }\n }\n}\n\nexport class NotFoundError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 404, requestId, headers, 'not_found');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends ChronaryError {\n constructor(message: string, status: number, requestId?: string, headers?: Headers) {\n super(message, status, requestId, headers, 'validation_error');\n this.name = 'ValidationError';\n }\n}\n\nexport class QuotaExceededError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 402, requestId, headers, 'quota_exceeded');\n this.name = 'QuotaExceededError';\n }\n}\n\nexport class TimeoutError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'TimeoutError';\n }\n}\n\nexport class ConnectionError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * APIPromise wraps a fetch call as a thenable so callers can `await` it\n * for parsed data, or call `.withResponse()` to get both parsed data and the raw\n * Response (headers, status, etc.).\n *\n * ```ts\n * // Normal — just the data\n * const agent = await client.agents.get('agt_1');\n *\n * // With response access\n * const { data, response } = await client.agents.get('agt_1').withResponse();\n * console.log(response.status);\n * console.log(response.headers.get('x-request-id'));\n * ```\n */\n/**\n * Parsed quota snapshot from the IETF `RateLimit` / `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Present on responses from endpoints\n * that enforce quotas (most authenticated routes); absent on unauthenticated\n * or unlimited-plan responses.\n */\nexport interface QuotaSnapshot {\n /** Configured ceiling (e.g. `1_000_000` API calls/month). Parsed from `RateLimit-Policy`. */\n limit: number;\n /** Remaining quota in the current window. Parsed from `RateLimit`. */\n remaining: number;\n /** Wall-clock time when the window resets. Computed from the `t=` delta-seconds in `RateLimit`. */\n resetAt: Date;\n}\n\nexport interface RawResponse {\n status: number;\n headers: Headers;\n url: string;\n /**\n * Typed view of the IETF RateLimit headers when present. Use this instead of\n * parsing `headers.get('ratelimit')` yourself. `undefined` for responses\n * that don't emit quota headers (public endpoints, unlimited plans).\n */\n quota?: QuotaSnapshot;\n}\n\nexport interface WithResponse<T> {\n data: T;\n response: RawResponse;\n}\n\n/**\n * APIPromise is a thenable that resolves to `T` when awaited, but also\n * exposes `.withResponse()` to get both the data and raw HTTP response.\n *\n * Because it implements `.then()`, it can be awaited, used with `Promise.all()`,\n * and chained with `.then()` / `.catch()` / `.finally()`.\n */\nexport class APIPromise<T> implements PromiseLike<T> {\n private innerPromise: Promise<{ data: T; rawResponse: RawResponse }>;\n\n constructor(\n responsePromise: Promise<{ data: T; rawResponse: RawResponse }>,\n ) {\n this.innerPromise = responsePromise;\n }\n\n /**\n * Returns both the parsed data and the raw HTTP response.\n */\n async withResponse(): Promise<WithResponse<T>> {\n const { data, rawResponse } = await this.innerPromise;\n return { data, response: rawResponse };\n }\n\n /**\n * Implements the thenable interface. When awaited, resolves to just the parsed data `T`.\n */\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.innerPromise.then(\n (result) => (onfulfilled ? onfulfilled(result.data) : result.data as unknown as TResult1),\n onrejected,\n );\n }\n\n /**\n * Attaches a rejection handler.\n */\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n ): Promise<T | TResult> {\n return this.then(undefined, onrejected);\n }\n\n /**\n * Attaches a handler that runs on both fulfillment and rejection.\n */\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then(\n (value) => { onfinally?.(); return value; },\n (reason) => { onfinally?.(); throw reason; },\n );\n }\n}\n","import { VERSION } from './version';\nimport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\nimport { APIPromise } from './api-promise';\nimport type { QuotaSnapshot, RawResponse } from './api-promise';\nimport type { ChronaryConfig, LogLevel, RequestOptions, ApiErrorBody } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.chronary.ai';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\nconst MAX_RETRY_DELAY = 60_000;\n\nfunction getEnvVar(name: string): string | undefined {\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n } catch {\n // process.env not available (browser, CF Workers, etc.)\n }\n return undefined;\n}\n\nfunction resolveLogLevel(config: ChronaryConfig): LogLevel {\n if (config.logLevel) return config.logLevel;\n const envLog = getEnvVar('CHRONARY_LOG');\n if (envLog && ['debug', 'info', 'warn', 'error', 'off'].includes(envLog)) {\n return envLog as LogLevel;\n }\n return 'off';\n}\n\nconst LOG_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n off: 4,\n};\n\nexport class CoreClient {\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly logLevel: LogLevel;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly userAgent: string;\n private readonly extraHeaders: Record<string, string>;\n\n constructor(config: ChronaryConfig = {}) {\n // apiKey is optional at construction — some endpoints (agentAuth.signUp,\n // plans.list) do not require auth. When a caller invokes an authed\n // endpoint without a key, the server returns 401 and the SDK surfaces it\n // as AuthenticationError — same error shape either way.\n this.apiKey = config.apiKey ?? getEnvVar('CHRONARY_API_KEY') ?? '';\n\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.logLevel = resolveLogLevel(config);\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.extraHeaders = config.extraHeaders ?? {};\n\n let ua = `chronary-ts/${VERSION}`;\n if (config.appInfo) {\n ua += ` ${config.appInfo.name}`;\n if (config.appInfo.version) ua += `/${config.appInfo.version}`;\n }\n try {\n if (typeof process !== 'undefined' && process.version) {\n ua += ` node/${process.version.replace('v', '')}`;\n }\n } catch {\n // Not in Node\n }\n this.userAgent = ua;\n }\n\n private log(level: LogLevel, message: string) {\n if (level === 'off' || LOG_PRIORITY[level] < LOG_PRIORITY[this.logLevel]) return;\n const prefix = `[chronary:${level}]`;\n switch (level) {\n case 'debug': console.debug(prefix, message); break;\n case 'info': console.info(prefix, message); break;\n case 'warn': console.warn(prefix, message); break;\n case 'error': console.error(prefix, message); break;\n }\n }\n\n request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): APIPromise<T> {\n return new APIPromise<T>(this._request<T>(method, path, body, query, options));\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): Promise<{ data: T; rawResponse: RawResponse }> {\n const url = this.buildUrl(path, query);\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n 'X-Chronary-SDK-Version': VERSION,\n ...this.extraHeaders,\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (MUTATING_METHODS.has(method)) {\n headers['Idempotency-Key'] = options?.idempotencyKey ?? crypto.randomUUID();\n }\n\n const requestTimeout = options?.timeout ?? this.timeout;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.retryDelay(attempt, lastError);\n this.log('info', `Retry #${attempt} after ${delay}ms`);\n await sleep(delay);\n }\n\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n this.log('debug', `${method} ${path}`);\n const startTime = Date.now();\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n const elapsed = Date.now() - startTime;\n const requestId = response.headers.get('x-request-id') ?? undefined;\n\n this.log('debug', `${method} ${path} → ${response.status} in ${elapsed}ms${requestId ? ` (${requestId})` : ''}`);\n\n if (response.ok) {\n const rawResponse: RawResponse = {\n status: response.status,\n headers: response.headers,\n url: response.url,\n quota: parseQuotaSnapshot(response.headers),\n };\n if (response.status === 204) {\n return { data: undefined as T, rawResponse };\n }\n const data = await response.json() as T;\n return { data, rawResponse };\n }\n\n // Retryable?\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.maxRetries) {\n lastError = await this.buildError(response, requestId);\n continue;\n }\n\n throw await this.buildError(response, requestId);\n } catch (err) {\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n\n if (err instanceof ChronaryError) throw err;\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n throw new TimeoutError(`Request timed out after ${requestTimeout}ms`);\n }\n\n if (attempt < this.maxRetries) {\n lastError = err as Error;\n continue;\n }\n\n throw new ConnectionError(`Connection failed: ${(err as Error).message}`);\n }\n }\n\n throw lastError ?? new ConnectionError('Request failed after retries');\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n const base = `${this.baseUrl}${path}`;\n if (!query) return base;\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n private async buildError(response: Response, requestId?: string): Promise<ChronaryError> {\n let errorBody: ApiErrorBody | undefined;\n try {\n errorBody = await response.json() as ApiErrorBody;\n } catch {\n // Non-JSON response\n }\n\n const message = errorBody?.error?.message ?? `HTTP ${response.status}`;\n const rid = requestId ?? errorBody?.error?.request_id;\n const errorType = errorBody?.error?.type;\n\n switch (response.status) {\n case 400:\n if (errorType === 'validation_error') {\n return new ValidationError(message, response.status, rid, response.headers);\n }\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n case 401:\n return new AuthenticationError(message, rid, response.headers);\n case 402:\n return new QuotaExceededError(message, rid, response.headers);\n case 404:\n return new NotFoundError(message, rid, response.headers);\n case 422:\n return new ValidationError(message, response.status, rid, response.headers);\n case 429: {\n if (errorType === 'quota_exceeded') {\n return new QuotaExceededError(message, rid, response.headers);\n }\n return new RateLimitError(message, rid, response.headers);\n }\n default:\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n }\n }\n\n private retryDelay(attempt: number, lastError?: Error): number {\n // Respect Retry-After header\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n return Math.min(lastError.retryAfter * 1000, MAX_RETRY_DELAY);\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = 500;\n const exponential = base * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base;\n return Math.min(exponential + jitter, MAX_RETRY_DELAY);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the IETF structured-field `RateLimit` and `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Returns `undefined` if either header\n * is missing or unparseable — callers can still reach the raw header strings\n * via `response.headers`.\n *\n * `RateLimit` value example: `\"quota\";r=985477;t=187200`\n * `RateLimit-Policy` value example: `\"quota\";q=1000000;w=2592000;pk=org_abc`\n */\nfunction parseQuotaSnapshot(headers: Headers): QuotaSnapshot | undefined {\n const rateLimit = headers.get('ratelimit');\n const policy = headers.get('ratelimit-policy');\n if (!rateLimit || !policy) return undefined;\n\n const remaining = parseStructuredParam(rateLimit, 'r');\n const resetSeconds = parseStructuredParam(rateLimit, 't');\n const limit = parseStructuredParam(policy, 'q');\n if (remaining === undefined || resetSeconds === undefined || limit === undefined) {\n return undefined;\n }\n\n return {\n limit,\n remaining,\n resetAt: new Date(Date.now() + resetSeconds * 1000),\n };\n}\n\nfunction parseStructuredParam(header: string, key: string): number | undefined {\n // Match `;<key>=<digits>` — guards against partial matches inside other tokens.\n const re = new RegExp(`(?:^|;)\\\\s*${key}=(-?\\\\d+)(?:;|$)`);\n const match = re.exec(header);\n if (!match) return undefined;\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : undefined;\n}\n","import type { PageResponse, Page } from './types';\n\nexport class PageIterator<T> implements AsyncIterable<T> {\n private readonly fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>;\n private readonly defaultLimit: number;\n private readonly initialOffset: number;\n\n constructor(\n fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>,\n defaultLimit: number = 50,\n initialOffset: number = 0,\n ) {\n this.fetchPage = fetchPage;\n this.defaultLimit = defaultLimit;\n this.initialOffset = initialOffset;\n }\n\n async getPage(offset: number = this.initialOffset, limit?: number): Promise<Page<T>> {\n const l = limit ?? this.defaultLimit;\n const response = await this.fetchPage(offset, l);\n return {\n ...response,\n hasMore: offset + response.data.length < response.total,\n };\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let offset = this.initialOffset;\n const limit = this.defaultLimit;\n\n while (true) {\n const page = await this.fetchPage(offset, limit);\n for (const item of page.data) {\n yield item;\n }\n offset += page.data.length;\n if (offset >= page.total || page.data.length === 0) break;\n }\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register your agent with Chronary. Creates a Chronary identity for an agent\n * that already exists in your system, so it can own calendars, events, and webhooks.\n */\n async create(params: CreateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('POST', '/v1/agents', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('GET', `/v1/agents/${id}`, undefined, undefined, options);\n }\n\n list(params: ListAgentsParams = {}): PageIterator<Agent> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<Agent>(\n (offset, l) =>\n this.client.request<PageResponse<Agent>>('GET', '/v1/agents', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('PATCH', `/v1/agents/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/agents/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class CalendarsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateCalendarParams & { agentId?: string }, options?: RequestOptions): Promise<Calendar> {\n const { agentId, ...body } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return this.client.request<Calendar>('POST', path, body, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('GET', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n list(params: ListCalendarsParams = {}): PageIterator<Calendar> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return new PageIterator<Calendar>(\n (offset, l) =>\n this.client.request<PageResponse<Calendar>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateCalendarParams, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('PATCH', `/v1/calendars/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n async getContext(id: string, options?: RequestOptions): Promise<CalendarContext> {\n return this.client.request<CalendarContext>(\n 'GET', `/v1/calendars/${id}/context`, undefined, undefined, options,\n );\n }\n\n async setAvailabilityRules(\n id: string,\n params: SetAvailabilityRulesParams,\n options?: RequestOptions,\n ): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'PUT', `/v1/calendars/${id}/availability-rules`, params, undefined, options,\n );\n }\n\n async getAvailabilityRules(id: string, options?: RequestOptions): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'GET', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n\n async deleteAvailabilityRules(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class EventsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(calendarId: string, params: CreateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'POST', `/v1/calendars/${calendarId}/events`, params, undefined, options,\n );\n }\n\n async get(calendarId: string, eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n list(params: ListEventsParams = {}): PageIterator<CalendarEvent> {\n const { calendarId, agentId, limit = 50, offset = 0, ...filters } = params;\n\n let path: string;\n if (agentId) {\n path = `/v1/agents/${agentId}/events`;\n } else if (calendarId) {\n path = `/v1/calendars/${calendarId}/events`;\n } else {\n throw new Error('Either calendarId or agentId is required for events.list()');\n }\n\n return new PageIterator<CalendarEvent>(\n (offset, l) =>\n this.client.request<PageResponse<CalendarEvent>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(calendarId: string, eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/calendars/${calendarId}/events/${eventId}`, params, undefined, options,\n );\n }\n\n async delete(calendarId: string, eventId: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Fetch an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async getById(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Update an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async updateById(eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async deleteById(eventId: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Promote a held event (status='hold') to status='confirmed'. Fails with 409\n * if the event is not a hold, or if the hold has already expired.\n */\n async confirm(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/confirm`, undefined, undefined, options,\n );\n }\n\n /**\n * Manually release a held event before its TTL, freeing the slot. Fails with\n * 409 if the event is not a hold.\n */\n async release(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/release`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n RequestOptions,\n} from '../types';\n\nexport class AvailabilityClient {\n constructor(private readonly client: CoreClient) {}\n\n async forAgent(agentId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/agents/${agentId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async forCalendar(calendarId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/calendars/${calendarId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async check(params: CrossAgentAvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', '/v1/availability', undefined,\n {\n agents: params.agents.join(','),\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n calendars: params.calendars?.join(','),\n include_busy: params.include_busy,\n },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n ListWebhookDeliveriesParams,\n WebhookDeliveryListResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class WebhooksClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('POST', '/v1/webhooks', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('GET', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n list(params: ListWebhooksParams = {}): PageIterator<Webhook> {\n const { limit = 20, offset = 0, ...filters } = params;\n return new PageIterator<Webhook>(\n (offset, l) =>\n this.client.request<PageResponse<Webhook>>('GET', '/v1/webhooks', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('PATCH', `/v1/webhooks/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n async listDeliveries(\n webhookId: string,\n params: ListWebhookDeliveriesParams = {},\n options?: RequestOptions,\n ): Promise<WebhookDeliveryListResponse> {\n const { limit = 20, offset = 0, status, include_payload } = params;\n return this.client.request<WebhookDeliveryListResponse>(\n 'GET',\n `/v1/webhooks/${webhookId}/deliveries`,\n undefined,\n { limit, offset, ...(status !== undefined && { status }), ...(include_payload !== undefined && { include_payload }) },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class ICalSubscriptionsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(agentId: string, params: CreateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'POST', `/v1/agents/${agentId}/ical-subscriptions`, params, undefined, options,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'GET', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n list(params: ListICalSubscriptionsParams & { agentId: string }): PageIterator<ICalSubscription> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ICalSubscription>(\n (offset, l) =>\n this.client.request<PageResponse<ICalSubscription>>(\n 'GET', `/v1/agents/${agentId}/ical-subscriptions`, undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'PATCH', `/v1/ical-subscriptions/${id}`, params, undefined, options,\n );\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n async sync(id: string, options?: RequestOptions): Promise<{ status: string }> {\n return this.client.request<{ status: string }>(\n 'POST', `/v1/ical-subscriptions/${id}/sync`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Proposal,\n ProposalSummary,\n ProposalResponse,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class SchedulingClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateProposalParams, options?: RequestOptions): Promise<ProposalSummary> {\n return this.client.request<ProposalSummary>(\n 'POST', '/v1/scheduling/proposals', params, undefined, options,\n );\n }\n\n list(params: ListProposalsParams = {}): PageIterator<ProposalSummary> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ProposalSummary>(\n (offset, l) =>\n this.client.request<PageResponse<ProposalSummary>>(\n 'GET', '/v1/scheduling/proposals', undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<Proposal> {\n return this.client.request<Proposal>(\n 'GET', `/v1/scheduling/proposals/${id}`, undefined, undefined, options,\n );\n }\n\n async respond(\n id: string,\n params: RespondToProposalParams,\n options?: RequestOptions,\n ): Promise<ProposalResponse> {\n return this.client.request<ProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/respond`, params, undefined, options,\n );\n }\n\n async resolve(id: string, options?: RequestOptions): Promise<ResolveProposalResponse> {\n return this.client.request<ResolveProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/resolve`, undefined, undefined, options,\n );\n }\n\n async cancel(id: string, options?: RequestOptions): Promise<CancelProposalResponse> {\n return this.client.request<CancelProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/cancel`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { Usage, RequestOptions } from '../types';\n\nexport class UsageClient {\n constructor(private readonly client: CoreClient) {}\n\n async get(options?: RequestOptions): Promise<Usage> {\n return this.client.request<Usage>('GET', '/v1/usage', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AuditLogResponse, ListAuditLogParams, RequestOptions } from '../types';\n\nexport class AuditLogClient {\n constructor(private readonly client: CoreClient) {}\n\n async list(params?: ListAuditLogParams, options?: RequestOptions): Promise<AuditLogResponse> {\n // CoreClient.request serializes the query map into the URL; passing\n // `undefined` values strips them. Keeps the path literal static so the\n // surface-coverage audit script can match it against the canonical route.\n const query: Record<string, string | number | boolean | undefined> = {\n from: params?.from,\n to: params?.to,\n action: params?.action,\n actor_key_prefix: params?.actor_key_prefix,\n cursor: params?.cursor,\n limit: params?.limit,\n };\n return this.client.request<AuditLogResponse>('GET', '/v1/audit-log', undefined, query, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n RequestOptions,\n ScopedApiKey,\n} from '../types';\n\ninterface ListScopedApiKeysResponse {\n keys: ScopedApiKey[];\n}\n\nexport class KeysClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(\n params: CreateScopedApiKeyParams,\n options?: RequestOptions,\n ): Promise<CreatedScopedApiKey> {\n return this.client.request<CreatedScopedApiKey>('POST', '/v1/keys', params, undefined, options);\n }\n\n async list(options?: RequestOptions): Promise<ScopedApiKey[]> {\n const response = await this.client.request<ListScopedApiKeysResponse>(\n 'GET',\n '/v1/keys',\n undefined,\n undefined,\n options,\n );\n return response.keys;\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/keys/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentAuthClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register a new agent + org. Sends an OTP to the provided email.\n *\n * No authentication required — callers may construct a `Chronary` client\n * with no `apiKey` to invoke this method.\n *\n * The response is a discriminated union:\n * - **New org path** — returns `org_id`, `agent_id`, and `api_key`.\n * The `api_key` is restricted to the verify endpoint until the OTP\n * is submitted successfully; after verification it unlocks the full API.\n * - **Existing-org dedup** — returns only `message`. No credentials are\n * leaked when the email matches an existing org (enumeration defense).\n *\n * Use `isAgentSignUpNewOrg()` to narrow the union before accessing keys.\n *\n * @throws ChronaryError (409 `tos_version_stale`) if `tos_version` is not\n * the currently-published version — retry with the value from the\n * `current_version` field on the error body.\n */\n async signUp(\n params: AgentSignUpParams,\n options?: RequestOptions,\n ): Promise<AgentSignUpResponse> {\n return this.client.request<AgentSignUpResponse>(\n 'POST',\n '/v1/agent/sign-up',\n params,\n undefined,\n options,\n );\n }\n\n /**\n * Submit the OTP sent during `signUp()` to unlock the API key.\n *\n * Must be invoked on a `Chronary` client constructed with the restricted\n * `api_key` returned by `signUp()` — NOT on the client that issued\n * `signUp()` itself (which had no key).\n *\n * @throws ChronaryError (status 400) when the OTP is wrong or expired.\n * The SDK's `ValidationError` class is reserved for HTTP 422; the\n * API returns 400 for invalid/expired OTPs, which surfaces as a\n * generic `ChronaryError` with the original message.\n */\n async verify(\n params: AgentVerifyParams,\n options?: RequestOptions,\n ): Promise<AgentVerifyResponse> {\n return this.client.request<AgentVerifyResponse>(\n 'POST',\n '/v1/agent/verify',\n params,\n undefined,\n options,\n );\n }\n}\n\n/**\n * Type guard — narrows an `AgentSignUpResponse` to the new-org branch.\n * The existing-org dedup branch returns only `message`, so this is the\n * caller's cue that credentials are present.\n */\nexport function isAgentSignUpNewOrg(\n response: AgentSignUpResponse,\n): response is AgentSignUpNewOrgResponse {\n return 'api_key' in response;\n}\n","import type { CoreClient } from '../client';\nimport type {\n WaitlistJoinParams,\n WaitlistJoinResponse,\n RequestOptions,\n} from '../types';\n\nexport class WaitlistClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Join the Chronary waitlist (#442). Used during private preview when open\n * signup is gated. Creates a real organization row flagged as\n * `is_waitlisted: true`; an admin flips the flag to activate the account.\n *\n * No authentication required — invoke on a `Chronary` client constructed\n * with no `apiKey`.\n *\n * Idempotent on repeat hits: a second call with the same email returns\n * the existing waitlisted org instead of erroring. An active (non-waitlisted)\n * account at the same email returns 409 `email_taken`.\n *\n * @throws ChronaryError (409 `email_taken`) when an active account already\n * exists for this email — direct the user to sign-in instead.\n * @throws ChronaryError (409 `tos_version_stale`) when the supplied\n * `tos_version` doesn't match the currently-published version.\n * @throws ChronaryError (429 `rate_limit_error`) on the per-IP / per-email\n * waitlist limiter.\n */\n async join(\n params: WaitlistJoinParams,\n options?: RequestOptions,\n ): Promise<WaitlistJoinResponse> {\n return this.client.request<WaitlistJoinResponse>(\n 'POST',\n '/v1/waitlist',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n FeedbackAcceptedResponse,\n RequestOptions,\n SubmitFeedbackParams,\n} from '../types';\n\nexport class FeedbackClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Submit structured feedback (bug, feature, or friction) to Chronary.\n *\n * Rate-limited to 25 submissions per day per organization (UTC day).\n * Available on all plans, including free. The 26th submission returns\n * HTTP 429 with a `Retry-After` header set to the seconds until the\n * next UTC midnight.\n */\n async submit(\n params: SubmitFeedbackParams,\n options?: RequestOptions,\n ): Promise<FeedbackAcceptedResponse> {\n return this.client.request<FeedbackAcceptedResponse>(\n 'POST',\n '/v1/feedback',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { PlansListResponse, RequestOptions } from '../types';\n\nexport class PlansClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Fetch the public plan catalog (`GET /v1/plans`).\n *\n * Returns all sellable tiers (free, pro, scale) plus the enterprise\n * tier with `custom_pricing: true`. No authentication required.\n * Responses are cacheable for 5 minutes at the edge.\n */\n async list(options?: RequestOptions): Promise<PlansListResponse> {\n return this.client.request<PlansListResponse>('GET', '/v1/plans', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { DataExport, RequestOptions } from '../types';\n\nexport class AccountClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Export every row this org owns as a single JSON payload (GDPR Art. 15 + 20\n * portability / CCPA right-to-know / EU Data Act interoperability).\n *\n * **Authentication:** This endpoint is JWT-only — it returns decrypted\n * webhook secrets and iCal subscription URLs that aren't normally accessible\n * via API-key endpoints. Configure the SDK with a console JWT (e.g. cookie\n * value or Bearer token from the console session) as the `apiKey` config to\n * call this. API keys (`chr_sk_*` / `chr_ak_*`) will return 401.\n *\n * In most cases, end users should download via the console UI at\n * `console.chronary.ai/settings`. The SDK method exists for programmatic\n * use cases (e.g. server-side compliance tooling holding a delegated JWT).\n *\n * **Rate limit:** 10 exports/hour/org.\n */\n async export(options?: RequestOptions): Promise<DataExport> {\n return this.client.request<DataExport>(\n 'GET',\n '/v1/auth/export',\n undefined,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AcceptTermsParams, AcceptTermsResult, RequestOptions } from '../types';\n\nexport class TermsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Re-accept the current Chronary terms of service for the calling org.\n *\n * Use this when a response carries the `Chronary-Terms-Upgrade-Required`\n * header after a material ToS bump — it clears the upgrade requirement for\n * Bearer-key (SDK / MCP) clients that have no console session. Read the\n * current version from `GET /v1/auth/terms/current` and pass it verbatim.\n *\n * **Authentication:** org-level API keys (`chr_sk_*`) only — agent-scoped\n * keys cannot accept org-wide terms (403). A stale version returns 409\n * `tos_version_stale` with the current version in the error body.\n */\n async accept(params: AcceptTermsParams, options?: RequestOptions): Promise<AcceptTermsResult> {\n return this.client.request<AcceptTermsResult>(\n 'POST',\n '/v1/terms/accept',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { WebhookEvent, VerifyOptions } from './types';\nimport { ChronaryError } from './error';\n\nconst DEFAULT_TOLERANCE = 5 * 60 * 1000; // 5 minutes\n\nfunction bufToHex(buf: ArrayBuffer): string {\n return Array.from(new Uint8Array(buf))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nasync function computeSignature(secret: string, timestamp: string, payload: string): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const message = encoder.encode(`${timestamp}.${payload}`);\n const sig = await crypto.subtle.sign('HMAC', key, message);\n return `sha256=${bufToHex(sig)}`;\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const aBuf = encoder.encode(a);\n const bBuf = encoder.encode(b);\n if (aBuf.length !== bBuf.length) return false;\n let diff = 0;\n for (let i = 0; i < aBuf.length; i++) diff |= aBuf[i] ^ bBuf[i];\n return diff === 0;\n}\n\nfunction getHeader(headers: Headers | Record<string, string>, name: string): string | null {\n if (headers instanceof Headers) return headers.get(name);\n\n const record = headers as Record<string, string>;\n const direct = record[name] ?? record[name.toLowerCase()];\n if (direct !== undefined) return direct;\n\n const lowerName = name.toLowerCase();\n for (const [key, value] of Object.entries(record)) {\n if (key.toLowerCase() === lowerName) return value;\n }\n return null;\n}\n\nfunction extractHeaders(headers: Headers | Record<string, string>): { signature: string; timestamp: string } {\n const get = (name: string): string | null => {\n return getHeader(headers, name);\n };\n\n const signature = get('X-Signature') ?? get('x-signature');\n const timestamp = get('X-Timestamp') ?? get('x-timestamp');\n\n if (!signature) throw new ChronaryError('Missing X-Signature header', 0);\n if (!timestamp) throw new ChronaryError('Missing X-Timestamp header', 0);\n\n return { signature, timestamp };\n}\n\nexport async function verifySignature(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<void> {\n if (typeof rawBody !== 'string') {\n throw new ChronaryError(\n 'rawBody must be a string. If you parsed the JSON body, pass the raw string instead.',\n 0,\n );\n }\n\n const { signature, timestamp } = extractHeaders(headers);\n const tolerance = options?.tolerance ?? DEFAULT_TOLERANCE;\n\n // Timestamp tolerance check for replay prevention\n const tsMs = parseInt(timestamp, 10) * 1000;\n const now = Date.now();\n if (Math.abs(now - tsMs) > tolerance) {\n throw new ChronaryError(\n `Webhook timestamp too old. Received ${timestamp}, current time ${Math.floor(now / 1000)}. Tolerance: ${tolerance / 1000}s`,\n 0,\n );\n }\n\n const expected = await computeSignature(secret, timestamp, rawBody);\n if (!constantTimeEqual(expected, signature)) {\n throw new ChronaryError('Webhook signature verification failed', 0);\n }\n}\n\nexport async function constructEvent(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<WebhookEvent> {\n await verifySignature(rawBody, headers, secret, options);\n\n const type = getHeader(headers, 'X-Chronary-Event-Type');\n if (!type) throw new ChronaryError('Missing X-Chronary-Event-Type header', 0);\n\n const data = JSON.parse(rawBody);\n return { type, data } as WebhookEvent;\n}\n"],"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/resources/terms.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 { TermsClient } from './resources/terms';\nimport { verifySignature, constructEvent } from './webhook-verify';\nimport type { ChronaryConfig } from './types';\n\nexport class Chronary {\n readonly agents: AgentsClient;\n readonly calendars: CalendarsClient;\n readonly events: EventsClient;\n readonly availability: AvailabilityClient;\n readonly webhooks: WebhooksClient;\n readonly icalSubscriptions: ICalSubscriptionsClient;\n readonly scheduling: SchedulingClient;\n readonly usage: UsageClient;\n readonly auditLog: AuditLogClient;\n readonly keys: KeysClient;\n readonly agentAuth: AgentAuthClient;\n readonly waitlist: WaitlistClient;\n readonly feedback: FeedbackClient;\n readonly plans: PlansClient;\n readonly account: AccountClient;\n readonly terms: TermsClient;\n\n constructor(config?: ChronaryConfig) {\n const client = new CoreClient(config);\n this.agents = new AgentsClient(client);\n this.calendars = new CalendarsClient(client);\n this.events = new EventsClient(client);\n this.availability = new AvailabilityClient(client);\n this.webhooks = new WebhooksClient(client);\n this.icalSubscriptions = new ICalSubscriptionsClient(client);\n this.scheduling = new SchedulingClient(client);\n this.usage = new UsageClient(client);\n this.auditLog = new AuditLogClient(client);\n this.keys = new KeysClient(client);\n this.agentAuth = new AgentAuthClient(client);\n this.waitlist = new WaitlistClient(client);\n this.feedback = new FeedbackClient(client);\n this.plans = new PlansClient(client);\n this.account = new AccountClient(client);\n this.terms = new TermsClient(client);\n }\n\n static webhooks = {\n verifySignature,\n constructEvent,\n };\n}\n\n// Re-export everything\nexport { CoreClient } from './client';\nexport { APIPromise } from './api-promise';\nexport type { QuotaSnapshot, RawResponse, WithResponse } from './api-promise';\nexport { PageIterator } from './pagination';\nexport { verifySignature, constructEvent } from './webhook-verify';\nexport { VERSION } from './version';\nexport { isAgentSignUpNewOrg } from './resources/agent-auth';\n\nexport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\n\nexport type {\n ChronaryConfig,\n LogLevel,\n AppInfo,\n RequestOptions,\n PageResponse,\n Page,\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AgentStatus,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n WorkingHours,\n WorkingHoursDay,\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DeleteEventOptions,\n SlotDuration,\n AvailabilitySlot,\n BusyBlock,\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n WebhookDelivery,\n WebhookDeliveryStats,\n WebhookDeliveryListResponse,\n ListWebhookDeliveriesParams,\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n Proposal,\n ProposalSummary,\n ProposalSlot,\n ProposalResponse,\n ProposalStatus,\n ProposalResponseAction,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n Usage,\n UsageMetric,\n AuditLogEntry,\n ListAuditLogParams,\n AuditLogResponse,\n ScopedApiKey,\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n AcceptTermsParams,\n AcceptTermsResult,\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentSignUpExistingOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n WaitlistJoinParams,\n WaitlistJoinResponse,\n WaitlistedOrg,\n FeedbackType,\n SubmitFeedbackParams,\n FeedbackAcceptedResponse,\n PlanId,\n PlanLimits,\n Plan,\n PlansListResponse,\n WebhookEventType,\n WebhookEvent,\n VerifyOptions,\n DataExport,\n} from './types';\n\nexport default Chronary;\n","export const VERSION = '0.5.0';\n","export class ChronaryError extends Error {\n readonly status: number;\n readonly requestId: string | undefined;\n readonly headers: Headers | undefined;\n readonly errorType: string | undefined;\n\n constructor(\n message: string,\n status: number,\n requestId?: string,\n headers?: Headers,\n errorType?: string,\n ) {\n super(message);\n this.name = 'ChronaryError';\n this.status = status;\n this.requestId = requestId;\n this.headers = headers;\n this.errorType = errorType;\n }\n}\n\nexport class AuthenticationError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 401, requestId, headers, 'authentication_error');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class RateLimitError extends ChronaryError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 429, requestId, headers, 'rate_limit_error');\n this.name = 'RateLimitError';\n if (headers) {\n const ra = headers.get('retry-after');\n if (ra) this.retryAfter = parseInt(ra, 10);\n }\n }\n}\n\nexport class NotFoundError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 404, requestId, headers, 'not_found');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends ChronaryError {\n constructor(message: string, status: number, requestId?: string, headers?: Headers) {\n super(message, status, requestId, headers, 'validation_error');\n this.name = 'ValidationError';\n }\n}\n\nexport class QuotaExceededError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 402, requestId, headers, 'quota_exceeded');\n this.name = 'QuotaExceededError';\n }\n}\n\nexport class TimeoutError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'TimeoutError';\n }\n}\n\nexport class ConnectionError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * APIPromise wraps a fetch call as a thenable so callers can `await` it\n * for parsed data, or call `.withResponse()` to get both parsed data and the raw\n * Response (headers, status, etc.).\n *\n * ```ts\n * // Normal — just the data\n * const agent = await client.agents.get('agt_1');\n *\n * // With response access\n * const { data, response } = await client.agents.get('agt_1').withResponse();\n * console.log(response.status);\n * console.log(response.headers.get('x-request-id'));\n * ```\n */\n/**\n * Parsed quota snapshot from the IETF `RateLimit` / `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Present on responses from endpoints\n * that enforce quotas (most authenticated routes); absent on unauthenticated\n * or unlimited-plan responses.\n */\nexport interface QuotaSnapshot {\n /** Configured ceiling (e.g. `1_000_000` API calls/month). Parsed from `RateLimit-Policy`. */\n limit: number;\n /** Remaining quota in the current window. Parsed from `RateLimit`. */\n remaining: number;\n /** Wall-clock time when the window resets. Computed from the `t=` delta-seconds in `RateLimit`. */\n resetAt: Date;\n}\n\nexport interface RawResponse {\n status: number;\n headers: Headers;\n url: string;\n /**\n * Typed view of the IETF RateLimit headers when present. Use this instead of\n * parsing `headers.get('ratelimit')` yourself. `undefined` for responses\n * that don't emit quota headers (public endpoints, unlimited plans).\n */\n quota?: QuotaSnapshot;\n}\n\nexport interface WithResponse<T> {\n data: T;\n response: RawResponse;\n}\n\n/**\n * APIPromise is a thenable that resolves to `T` when awaited, but also\n * exposes `.withResponse()` to get both the data and raw HTTP response.\n *\n * Because it implements `.then()`, it can be awaited, used with `Promise.all()`,\n * and chained with `.then()` / `.catch()` / `.finally()`.\n */\nexport class APIPromise<T> implements PromiseLike<T> {\n private innerPromise: Promise<{ data: T; rawResponse: RawResponse }>;\n\n constructor(\n responsePromise: Promise<{ data: T; rawResponse: RawResponse }>,\n ) {\n this.innerPromise = responsePromise;\n }\n\n /**\n * Returns both the parsed data and the raw HTTP response.\n */\n async withResponse(): Promise<WithResponse<T>> {\n const { data, rawResponse } = await this.innerPromise;\n return { data, response: rawResponse };\n }\n\n /**\n * Implements the thenable interface. When awaited, resolves to just the parsed data `T`.\n */\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.innerPromise.then(\n (result) => (onfulfilled ? onfulfilled(result.data) : result.data as unknown as TResult1),\n onrejected,\n );\n }\n\n /**\n * Attaches a rejection handler.\n */\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n ): Promise<T | TResult> {\n return this.then(undefined, onrejected);\n }\n\n /**\n * Attaches a handler that runs on both fulfillment and rejection.\n */\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then(\n (value) => { onfinally?.(); return value; },\n (reason) => { onfinally?.(); throw reason; },\n );\n }\n}\n","import { VERSION } from './version';\nimport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\nimport { APIPromise } from './api-promise';\nimport type { QuotaSnapshot, RawResponse } from './api-promise';\nimport type { ChronaryConfig, LogLevel, RequestOptions, ApiErrorBody } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.chronary.ai';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\nconst MAX_RETRY_DELAY = 60_000;\n\nfunction getEnvVar(name: string): string | undefined {\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n } catch {\n // process.env not available (browser, CF Workers, etc.)\n }\n return undefined;\n}\n\nfunction resolveLogLevel(config: ChronaryConfig): LogLevel {\n if (config.logLevel) return config.logLevel;\n const envLog = getEnvVar('CHRONARY_LOG');\n if (envLog && ['debug', 'info', 'warn', 'error', 'off'].includes(envLog)) {\n return envLog as LogLevel;\n }\n return 'off';\n}\n\nconst LOG_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n off: 4,\n};\n\nexport class CoreClient {\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly logLevel: LogLevel;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly userAgent: string;\n private readonly extraHeaders: Record<string, string>;\n\n constructor(config: ChronaryConfig = {}) {\n // apiKey is optional at construction — some endpoints (agentAuth.signUp,\n // plans.list) do not require auth. When a caller invokes an authed\n // endpoint without a key, the server returns 401 and the SDK surfaces it\n // as AuthenticationError — same error shape either way.\n this.apiKey = config.apiKey ?? getEnvVar('CHRONARY_API_KEY') ?? '';\n\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.logLevel = resolveLogLevel(config);\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.extraHeaders = config.extraHeaders ?? {};\n\n let ua = `chronary-ts/${VERSION}`;\n if (config.appInfo) {\n ua += ` ${config.appInfo.name}`;\n if (config.appInfo.version) ua += `/${config.appInfo.version}`;\n }\n try {\n if (typeof process !== 'undefined' && process.version) {\n ua += ` node/${process.version.replace('v', '')}`;\n }\n } catch {\n // Not in Node\n }\n this.userAgent = ua;\n }\n\n private log(level: LogLevel, message: string) {\n if (level === 'off' || LOG_PRIORITY[level] < LOG_PRIORITY[this.logLevel]) return;\n const prefix = `[chronary:${level}]`;\n switch (level) {\n case 'debug': console.debug(prefix, message); break;\n case 'info': console.info(prefix, message); break;\n case 'warn': console.warn(prefix, message); break;\n case 'error': console.error(prefix, message); break;\n }\n }\n\n request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): APIPromise<T> {\n return new APIPromise<T>(this._request<T>(method, path, body, query, options));\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): Promise<{ data: T; rawResponse: RawResponse }> {\n const url = this.buildUrl(path, query);\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n 'X-Chronary-SDK-Version': VERSION,\n ...this.extraHeaders,\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (MUTATING_METHODS.has(method)) {\n headers['Idempotency-Key'] = options?.idempotencyKey ?? crypto.randomUUID();\n }\n\n const requestTimeout = options?.timeout ?? this.timeout;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.retryDelay(attempt, lastError);\n this.log('info', `Retry #${attempt} after ${delay}ms`);\n await sleep(delay);\n }\n\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n this.log('debug', `${method} ${path}`);\n const startTime = Date.now();\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n const elapsed = Date.now() - startTime;\n const requestId = response.headers.get('x-request-id') ?? undefined;\n\n this.log('debug', `${method} ${path} → ${response.status} in ${elapsed}ms${requestId ? ` (${requestId})` : ''}`);\n\n if (response.ok) {\n const rawResponse: RawResponse = {\n status: response.status,\n headers: response.headers,\n url: response.url,\n quota: parseQuotaSnapshot(response.headers),\n };\n if (response.status === 204) {\n return { data: undefined as T, rawResponse };\n }\n const data = await response.json() as T;\n return { data, rawResponse };\n }\n\n // Retryable?\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.maxRetries) {\n lastError = await this.buildError(response, requestId);\n continue;\n }\n\n throw await this.buildError(response, requestId);\n } catch (err) {\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n\n if (err instanceof ChronaryError) throw err;\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n throw new TimeoutError(`Request timed out after ${requestTimeout}ms`);\n }\n\n if (attempt < this.maxRetries) {\n lastError = err as Error;\n continue;\n }\n\n throw new ConnectionError(`Connection failed: ${(err as Error).message}`);\n }\n }\n\n throw lastError ?? new ConnectionError('Request failed after retries');\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n const base = `${this.baseUrl}${path}`;\n if (!query) return base;\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n private async buildError(response: Response, requestId?: string): Promise<ChronaryError> {\n let errorBody: ApiErrorBody | undefined;\n try {\n errorBody = await response.json() as ApiErrorBody;\n } catch {\n // Non-JSON response\n }\n\n const message = errorBody?.error?.message ?? `HTTP ${response.status}`;\n const rid = requestId ?? errorBody?.error?.request_id;\n const errorType = errorBody?.error?.type;\n\n switch (response.status) {\n case 400:\n if (errorType === 'validation_error') {\n return new ValidationError(message, response.status, rid, response.headers);\n }\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n case 401:\n return new AuthenticationError(message, rid, response.headers);\n case 402:\n return new QuotaExceededError(message, rid, response.headers);\n case 404:\n return new NotFoundError(message, rid, response.headers);\n case 422:\n return new ValidationError(message, response.status, rid, response.headers);\n case 429: {\n if (errorType === 'quota_exceeded') {\n return new QuotaExceededError(message, rid, response.headers);\n }\n return new RateLimitError(message, rid, response.headers);\n }\n default:\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n }\n }\n\n private retryDelay(attempt: number, lastError?: Error): number {\n // Respect Retry-After header\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n return Math.min(lastError.retryAfter * 1000, MAX_RETRY_DELAY);\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = 500;\n const exponential = base * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base;\n return Math.min(exponential + jitter, MAX_RETRY_DELAY);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the IETF structured-field `RateLimit` and `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Returns `undefined` if either header\n * is missing or unparseable — callers can still reach the raw header strings\n * via `response.headers`.\n *\n * `RateLimit` value example: `\"quota\";r=985477;t=187200`\n * `RateLimit-Policy` value example: `\"quota\";q=1000000;w=2592000;pk=org_abc`\n */\nfunction parseQuotaSnapshot(headers: Headers): QuotaSnapshot | undefined {\n const rateLimit = headers.get('ratelimit');\n const policy = headers.get('ratelimit-policy');\n if (!rateLimit || !policy) return undefined;\n\n const remaining = parseStructuredParam(rateLimit, 'r');\n const resetSeconds = parseStructuredParam(rateLimit, 't');\n const limit = parseStructuredParam(policy, 'q');\n if (remaining === undefined || resetSeconds === undefined || limit === undefined) {\n return undefined;\n }\n\n return {\n limit,\n remaining,\n resetAt: new Date(Date.now() + resetSeconds * 1000),\n };\n}\n\nfunction parseStructuredParam(header: string, key: string): number | undefined {\n // Match `;<key>=<digits>` — guards against partial matches inside other tokens.\n const re = new RegExp(`(?:^|;)\\\\s*${key}=(-?\\\\d+)(?:;|$)`);\n const match = re.exec(header);\n if (!match) return undefined;\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : undefined;\n}\n","import type { PageResponse, Page } from './types';\n\nexport class PageIterator<T> implements AsyncIterable<T> {\n private readonly fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>;\n private readonly defaultLimit: number;\n private readonly initialOffset: number;\n\n constructor(\n fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>,\n defaultLimit: number = 50,\n initialOffset: number = 0,\n ) {\n this.fetchPage = fetchPage;\n this.defaultLimit = defaultLimit;\n this.initialOffset = initialOffset;\n }\n\n async getPage(offset: number = this.initialOffset, limit?: number): Promise<Page<T>> {\n const l = limit ?? this.defaultLimit;\n const response = await this.fetchPage(offset, l);\n return {\n ...response,\n hasMore: offset + response.data.length < response.total,\n };\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let offset = this.initialOffset;\n const limit = this.defaultLimit;\n\n while (true) {\n const page = await this.fetchPage(offset, limit);\n for (const item of page.data) {\n yield item;\n }\n offset += page.data.length;\n if (offset >= page.total || page.data.length === 0) break;\n }\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register your agent with Chronary. Creates a Chronary identity for an agent\n * that already exists in your system, so it can own calendars, events, and webhooks.\n */\n async create(params: CreateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('POST', '/v1/agents', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('GET', `/v1/agents/${id}`, undefined, undefined, options);\n }\n\n list(params: ListAgentsParams = {}): PageIterator<Agent> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<Agent>(\n (offset, l) =>\n this.client.request<PageResponse<Agent>>('GET', '/v1/agents', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('PATCH', `/v1/agents/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/agents/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class CalendarsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateCalendarParams & { agentId?: string }, options?: RequestOptions): Promise<Calendar> {\n const { agentId, ...body } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return this.client.request<Calendar>('POST', path, body, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('GET', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n list(params: ListCalendarsParams = {}): PageIterator<Calendar> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return new PageIterator<Calendar>(\n (offset, l) =>\n this.client.request<PageResponse<Calendar>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateCalendarParams, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('PATCH', `/v1/calendars/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n async getContext(id: string, options?: RequestOptions): Promise<CalendarContext> {\n return this.client.request<CalendarContext>(\n 'GET', `/v1/calendars/${id}/context`, undefined, undefined, options,\n );\n }\n\n async setAvailabilityRules(\n id: string,\n params: SetAvailabilityRulesParams,\n options?: RequestOptions,\n ): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'PUT', `/v1/calendars/${id}/availability-rules`, params, undefined, options,\n );\n }\n\n async getAvailabilityRules(id: string, options?: RequestOptions): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'GET', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n\n async deleteAvailabilityRules(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DeleteEventOptions,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class EventsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(calendarId: string, params: CreateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'POST', `/v1/calendars/${calendarId}/events`, params, undefined, options,\n );\n }\n\n async get(calendarId: string, eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n list(params: ListEventsParams = {}): PageIterator<CalendarEvent> {\n const { calendarId, agentId, limit = 50, offset = 0, ...filters } = params;\n\n let path: string;\n if (agentId) {\n path = `/v1/agents/${agentId}/events`;\n } else if (calendarId) {\n path = `/v1/calendars/${calendarId}/events`;\n } else {\n throw new Error('Either calendarId or agentId is required for events.list()');\n }\n\n return new PageIterator<CalendarEvent>(\n (offset, l) =>\n this.client.request<PageResponse<CalendarEvent>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(calendarId: string, eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/calendars/${calendarId}/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event (or, for a recurring series, the whole series). Pass\n * `occurrence_start` to cancel just one occurrence of a recurring series\n * instead — the series lives on and the updated series master is returned.\n * Plain deletes resolve to void. With `occurrence_start`, fails with 400 if\n * the timestamp is not an active occurrence, or 409 if the event is not a\n * recurring series.\n */\n async delete(calendarId: string, eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void> {\n const { occurrence_start, ...requestOptions } = options ?? {};\n return this.client.request<CalendarEvent | void>(\n 'DELETE',\n `/v1/calendars/${calendarId}/events/${eventId}`,\n undefined,\n occurrence_start !== undefined ? { occurrence_start } : undefined,\n requestOptions,\n );\n }\n\n /**\n * Fetch an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async getById(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Update an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async updateById(eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required. Pass `occurrence_start` to cancel\n * just one occurrence of a recurring series — the series lives on and the\n * updated series master is returned; plain deletes resolve to void. With\n * `occurrence_start`, fails with 400 if the timestamp is not an active\n * occurrence, or 409 if the event is not a recurring series.\n */\n async deleteById(eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void> {\n const { occurrence_start, ...requestOptions } = options ?? {};\n return this.client.request<CalendarEvent | void>(\n 'DELETE',\n `/v1/events/${eventId}`,\n undefined,\n occurrence_start !== undefined ? { occurrence_start } : undefined,\n requestOptions,\n );\n }\n\n /**\n * Promote a held event (status='hold') to status='confirmed'. Fails with 409\n * if the event is not a hold, or if the hold has already expired.\n */\n async confirm(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/confirm`, undefined, undefined, options,\n );\n }\n\n /**\n * Manually release a held event before its TTL, freeing the slot. Fails with\n * 409 if the event is not a hold.\n */\n async release(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/release`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n RequestOptions,\n} from '../types';\n\nexport class AvailabilityClient {\n constructor(private readonly client: CoreClient) {}\n\n async forAgent(agentId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/agents/${agentId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async forCalendar(calendarId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/calendars/${calendarId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async check(params: CrossAgentAvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', '/v1/availability', undefined,\n {\n agents: params.agents.join(','),\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n calendars: params.calendars?.join(','),\n include_busy: params.include_busy,\n },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n ListWebhookDeliveriesParams,\n WebhookDeliveryListResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class WebhooksClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('POST', '/v1/webhooks', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('GET', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n list(params: ListWebhooksParams = {}): PageIterator<Webhook> {\n const { limit = 20, offset = 0, ...filters } = params;\n return new PageIterator<Webhook>(\n (offset, l) =>\n this.client.request<PageResponse<Webhook>>('GET', '/v1/webhooks', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('PATCH', `/v1/webhooks/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n async listDeliveries(\n webhookId: string,\n params: ListWebhookDeliveriesParams = {},\n options?: RequestOptions,\n ): Promise<WebhookDeliveryListResponse> {\n const { limit = 20, offset = 0, status, include_payload } = params;\n return this.client.request<WebhookDeliveryListResponse>(\n 'GET',\n `/v1/webhooks/${webhookId}/deliveries`,\n undefined,\n { limit, offset, ...(status !== undefined && { status }), ...(include_payload !== undefined && { include_payload }) },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class ICalSubscriptionsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(agentId: string, params: CreateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'POST', `/v1/agents/${agentId}/ical-subscriptions`, params, undefined, options,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'GET', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n list(params: ListICalSubscriptionsParams & { agentId: string }): PageIterator<ICalSubscription> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ICalSubscription>(\n (offset, l) =>\n this.client.request<PageResponse<ICalSubscription>>(\n 'GET', `/v1/agents/${agentId}/ical-subscriptions`, undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'PATCH', `/v1/ical-subscriptions/${id}`, params, undefined, options,\n );\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n async sync(id: string, options?: RequestOptions): Promise<{ status: string }> {\n return this.client.request<{ status: string }>(\n 'POST', `/v1/ical-subscriptions/${id}/sync`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Proposal,\n ProposalSummary,\n ProposalResponse,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class SchedulingClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateProposalParams, options?: RequestOptions): Promise<ProposalSummary> {\n return this.client.request<ProposalSummary>(\n 'POST', '/v1/scheduling/proposals', params, undefined, options,\n );\n }\n\n list(params: ListProposalsParams = {}): PageIterator<ProposalSummary> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ProposalSummary>(\n (offset, l) =>\n this.client.request<PageResponse<ProposalSummary>>(\n 'GET', '/v1/scheduling/proposals', undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<Proposal> {\n return this.client.request<Proposal>(\n 'GET', `/v1/scheduling/proposals/${id}`, undefined, undefined, options,\n );\n }\n\n async respond(\n id: string,\n params: RespondToProposalParams,\n options?: RequestOptions,\n ): Promise<ProposalResponse> {\n return this.client.request<ProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/respond`, params, undefined, options,\n );\n }\n\n async resolve(id: string, options?: RequestOptions): Promise<ResolveProposalResponse> {\n return this.client.request<ResolveProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/resolve`, undefined, undefined, options,\n );\n }\n\n async cancel(id: string, options?: RequestOptions): Promise<CancelProposalResponse> {\n return this.client.request<CancelProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/cancel`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { Usage, RequestOptions } from '../types';\n\nexport class UsageClient {\n constructor(private readonly client: CoreClient) {}\n\n async get(options?: RequestOptions): Promise<Usage> {\n return this.client.request<Usage>('GET', '/v1/usage', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AuditLogResponse, ListAuditLogParams, RequestOptions } from '../types';\n\nexport class AuditLogClient {\n constructor(private readonly client: CoreClient) {}\n\n async list(params?: ListAuditLogParams, options?: RequestOptions): Promise<AuditLogResponse> {\n // CoreClient.request serializes the query map into the URL; passing\n // `undefined` values strips them. Keeps the path literal static so the\n // surface-coverage audit script can match it against the canonical route.\n const query: Record<string, string | number | boolean | undefined> = {\n from: params?.from,\n to: params?.to,\n action: params?.action,\n actor_key_prefix: params?.actor_key_prefix,\n cursor: params?.cursor,\n limit: params?.limit,\n };\n return this.client.request<AuditLogResponse>('GET', '/v1/audit-log', undefined, query, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n RequestOptions,\n ScopedApiKey,\n} from '../types';\n\ninterface ListScopedApiKeysResponse {\n keys: ScopedApiKey[];\n}\n\nexport class KeysClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(\n params: CreateScopedApiKeyParams,\n options?: RequestOptions,\n ): Promise<CreatedScopedApiKey> {\n return this.client.request<CreatedScopedApiKey>('POST', '/v1/keys', params, undefined, options);\n }\n\n async list(options?: RequestOptions): Promise<ScopedApiKey[]> {\n const response = await this.client.request<ListScopedApiKeysResponse>(\n 'GET',\n '/v1/keys',\n undefined,\n undefined,\n options,\n );\n return response.keys;\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/keys/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentAuthClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register a new agent + org. Sends an OTP to the provided email.\n *\n * No authentication required — callers may construct a `Chronary` client\n * with no `apiKey` to invoke this method.\n *\n * The response is a discriminated union:\n * - **New org path** — returns `org_id`, `agent_id`, and `api_key`.\n * The `api_key` is restricted to the verify endpoint until the OTP\n * is submitted successfully; after verification it unlocks the full API.\n * - **Existing-org dedup** — returns only `message`. No credentials are\n * leaked when the email matches an existing org (enumeration defense).\n *\n * Use `isAgentSignUpNewOrg()` to narrow the union before accessing keys.\n *\n * @throws ChronaryError (409 `tos_version_stale`) if `tos_version` is not\n * the currently-published version — retry with the value from the\n * `current_version` field on the error body.\n */\n async signUp(\n params: AgentSignUpParams,\n options?: RequestOptions,\n ): Promise<AgentSignUpResponse> {\n return this.client.request<AgentSignUpResponse>(\n 'POST',\n '/v1/agent/sign-up',\n params,\n undefined,\n options,\n );\n }\n\n /**\n * Submit the OTP sent during `signUp()` to unlock the API key.\n *\n * Must be invoked on a `Chronary` client constructed with the restricted\n * `api_key` returned by `signUp()` — NOT on the client that issued\n * `signUp()` itself (which had no key).\n *\n * @throws ChronaryError (status 400) when the OTP is wrong or expired.\n * The SDK's `ValidationError` class is reserved for HTTP 422; the\n * API returns 400 for invalid/expired OTPs, which surfaces as a\n * generic `ChronaryError` with the original message.\n */\n async verify(\n params: AgentVerifyParams,\n options?: RequestOptions,\n ): Promise<AgentVerifyResponse> {\n return this.client.request<AgentVerifyResponse>(\n 'POST',\n '/v1/agent/verify',\n params,\n undefined,\n options,\n );\n }\n}\n\n/**\n * Type guard — narrows an `AgentSignUpResponse` to the new-org branch.\n * The existing-org dedup branch returns only `message`, so this is the\n * caller's cue that credentials are present.\n */\nexport function isAgentSignUpNewOrg(\n response: AgentSignUpResponse,\n): response is AgentSignUpNewOrgResponse {\n return 'api_key' in response;\n}\n","import type { CoreClient } from '../client';\nimport type {\n WaitlistJoinParams,\n WaitlistJoinResponse,\n RequestOptions,\n} from '../types';\n\nexport class WaitlistClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Join the Chronary waitlist (#442). Used during private preview when open\n * signup is gated. Creates a real organization row flagged as\n * `is_waitlisted: true`; an admin flips the flag to activate the account.\n *\n * No authentication required — invoke on a `Chronary` client constructed\n * with no `apiKey`.\n *\n * Idempotent on repeat hits: a second call with the same email returns\n * the existing waitlisted org instead of erroring. An active (non-waitlisted)\n * account at the same email returns 409 `email_taken`.\n *\n * @throws ChronaryError (409 `email_taken`) when an active account already\n * exists for this email — direct the user to sign-in instead.\n * @throws ChronaryError (409 `tos_version_stale`) when the supplied\n * `tos_version` doesn't match the currently-published version.\n * @throws ChronaryError (429 `rate_limit_error`) on the per-IP / per-email\n * waitlist limiter.\n */\n async join(\n params: WaitlistJoinParams,\n options?: RequestOptions,\n ): Promise<WaitlistJoinResponse> {\n return this.client.request<WaitlistJoinResponse>(\n 'POST',\n '/v1/waitlist',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n FeedbackAcceptedResponse,\n RequestOptions,\n SubmitFeedbackParams,\n} from '../types';\n\nexport class FeedbackClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Submit structured feedback (bug, feature, or friction) to Chronary.\n *\n * Rate-limited to 25 submissions per day per organization (UTC day).\n * Available on all plans, including free. The 26th submission returns\n * HTTP 429 with a `Retry-After` header set to the seconds until the\n * next UTC midnight.\n */\n async submit(\n params: SubmitFeedbackParams,\n options?: RequestOptions,\n ): Promise<FeedbackAcceptedResponse> {\n return this.client.request<FeedbackAcceptedResponse>(\n 'POST',\n '/v1/feedback',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { PlansListResponse, RequestOptions } from '../types';\n\nexport class PlansClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Fetch the public plan catalog (`GET /v1/plans`).\n *\n * Returns all sellable tiers (free, pro, scale) plus the enterprise\n * tier with `custom_pricing: true`. No authentication required.\n * Responses are cacheable for 5 minutes at the edge.\n */\n async list(options?: RequestOptions): Promise<PlansListResponse> {\n return this.client.request<PlansListResponse>('GET', '/v1/plans', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { DataExport, RequestOptions } from '../types';\n\nexport class AccountClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Export every row this org owns as a single JSON payload (GDPR Art. 15 + 20\n * portability / CCPA right-to-know / EU Data Act interoperability).\n *\n * **Authentication:** This endpoint is JWT-only — it returns decrypted\n * webhook secrets and iCal subscription URLs that aren't normally accessible\n * via API-key endpoints. Configure the SDK with a console JWT (e.g. cookie\n * value or Bearer token from the console session) as the `apiKey` config to\n * call this. API keys (`chr_sk_*` / `chr_ak_*`) will return 401.\n *\n * In most cases, end users should download via the console UI at\n * `console.chronary.ai/settings`. The SDK method exists for programmatic\n * use cases (e.g. server-side compliance tooling holding a delegated JWT).\n *\n * **Rate limit:** 10 exports/hour/org.\n */\n async export(options?: RequestOptions): Promise<DataExport> {\n return this.client.request<DataExport>(\n 'GET',\n '/v1/auth/export',\n undefined,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AcceptTermsParams, AcceptTermsResult, RequestOptions } from '../types';\n\nexport class TermsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Re-accept the current Chronary terms of service for the calling org.\n *\n * Use this when a response carries the `Chronary-Terms-Upgrade-Required`\n * header after a material ToS bump — it clears the upgrade requirement for\n * Bearer-key (SDK / MCP) clients that have no console session. Read the\n * current version from `GET /v1/auth/terms/current` and pass it verbatim.\n *\n * **Authentication:** org-level API keys (`chr_sk_*`) only — agent-scoped\n * keys cannot accept org-wide terms (403). A stale version returns 409\n * `tos_version_stale` with the current version in the error body.\n */\n async accept(params: AcceptTermsParams, options?: RequestOptions): Promise<AcceptTermsResult> {\n return this.client.request<AcceptTermsResult>(\n 'POST',\n '/v1/terms/accept',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { 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
@@ -195,6 +195,14 @@ interface CalendarEvent {
195
195
  metadata: Record<string, unknown>;
196
196
  /** Reminder offsets (minutes before start). null = inherit calendar default (then system default of 10 min); [] = no reminders. */
197
197
  reminders: number[] | null;
198
+ /** RFC 5545 RRULE subset (no "RRULE:" prefix) when this event is a recurring series master, e.g. "FREQ=WEEKLY;BYDAY=MO,WE;COUNT=12". null = one-off event. */
199
+ recurrenceRule: string | null;
200
+ /** ISO 8601 starts of individually cancelled occurrences (EXDATE). */
201
+ recurrenceExdates: string[];
202
+ /** Present only on expanded instances (`expand: true` lists): id of the recurring series master this instance belongs to. */
203
+ recurringEventId?: string;
204
+ /** Present only on expanded instances: the occurrence start this instance was generated for. */
205
+ originalStartTime?: string;
198
206
  holdExpiresAt: string | null;
199
207
  holdPriority: number | null;
200
208
  deletedAt: string | null;
@@ -215,6 +223,15 @@ interface CreateEventParams {
215
223
  hold_expires_at?: string;
216
224
  /** Priority for conflict resolution. Only valid with status='hold'. 0-100. */
217
225
  hold_priority?: number;
226
+ /**
227
+ * RFC 5545 RRULE subset (no "RRULE:" prefix), e.g. "FREQ=WEEKLY;BYDAY=MO,WE;COUNT=12" —
228
+ * makes the event a recurring series master. Not allowed with status='hold'.
229
+ * Fails with 400 on an invalid rule; 429 when the plan's active
230
+ * recurring-series cap is reached (free: 5, Pro: 250 — see
231
+ * `usage.recurring_events`); 403 plan_required when the series is unbounded
232
+ * or ends more than 90 days out on the free plan (Pro allows unbounded).
233
+ */
234
+ recurrence_rule?: string;
218
235
  }
219
236
  interface UpdateEventParams {
220
237
  title?: string;
@@ -227,6 +244,16 @@ interface UpdateEventParams {
227
244
  metadata?: Record<string, unknown>;
228
245
  /** Reminder offsets in minutes before start. null = inherit calendar default; [] = no reminders. */
229
246
  reminders?: number[] | null;
247
+ /**
248
+ * Full-series edit of the recurrence rule (RFC 5545 RRULE subset, no
249
+ * "RRULE:" prefix). null clears the rule, turning the series back into a
250
+ * one-off event. Fails with 400 on an invalid rule; 429 when converting a
251
+ * one-off to recurring and the plan's active recurring-series cap is
252
+ * reached (free: 5, Pro: 250); 403 plan_required when the series is
253
+ * unbounded or ends more than 90 days out on the free plan (Pro allows
254
+ * unbounded).
255
+ */
256
+ recurrence_rule?: string | null;
230
257
  }
231
258
  interface ListEventsParams {
232
259
  calendarId?: string;
@@ -237,6 +264,25 @@ interface ListEventsParams {
237
264
  source?: 'internal' | 'external_ical';
238
265
  limit?: number;
239
266
  offset?: number;
267
+ /**
268
+ * Expand recurring series into individual occurrence instances within the
269
+ * window. When true, both `start_after` and `start_before` are required
270
+ * (max 366 days apart) — the API returns 400 otherwise. Expanded instances
271
+ * carry `recurringEventId` + `originalStartTime`.
272
+ */
273
+ expand?: boolean;
274
+ }
275
+ /** Options for event delete calls — `RequestOptions` plus recurrence controls. */
276
+ interface DeleteEventOptions extends RequestOptions {
277
+ /**
278
+ * For recurring series only: ISO 8601 start of the single occurrence to
279
+ * cancel (recorded as an EXDATE). The series lives on and the delete call
280
+ * resolves to the updated series master event instead of void. Fails with
281
+ * 400 if the timestamp is not an active occurrence of the series, or 409
282
+ * if the event is not a recurring series. Omit to delete the whole
283
+ * event/series (resolves to void).
284
+ */
285
+ occurrence_start?: string;
240
286
  }
241
287
  type SlotDuration = '15m' | '30m' | '45m' | '1h' | '2h';
242
288
  interface AvailabilitySlot {
@@ -520,6 +566,8 @@ interface Usage {
520
566
  availability_queries: UsageMetric;
521
567
  ical_subscriptions: UsageMetric;
522
568
  proposals: UsageMetric;
569
+ /** Active recurring series masters vs. the plan cap (free: 5, Pro: 250; null = unlimited). */
570
+ recurring_events: UsageMetric;
523
571
  holds: HoldsUsage;
524
572
  cross_calendar_queries: CrossCalendarQueriesUsage;
525
573
  }
@@ -793,7 +841,15 @@ declare class EventsClient {
793
841
  get(calendarId: string, eventId: string, options?: RequestOptions): Promise<CalendarEvent>;
794
842
  list(params?: ListEventsParams): PageIterator<CalendarEvent>;
795
843
  update(calendarId: string, eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent>;
796
- delete(calendarId: string, eventId: string, options?: RequestOptions): Promise<void>;
844
+ /**
845
+ * Delete an event (or, for a recurring series, the whole series). Pass
846
+ * `occurrence_start` to cancel just one occurrence of a recurring series
847
+ * instead — the series lives on and the updated series master is returned.
848
+ * Plain deletes resolve to void. With `occurrence_start`, fails with 400 if
849
+ * the timestamp is not an active occurrence, or 409 if the event is not a
850
+ * recurring series.
851
+ */
852
+ delete(calendarId: string, eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void>;
797
853
  /**
798
854
  * Fetch an event by ID alone. The calendar is resolved internally from the
799
855
  * event, so no calendar ID is required.
@@ -806,9 +862,13 @@ declare class EventsClient {
806
862
  updateById(eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent>;
807
863
  /**
808
864
  * Delete an event by ID alone. The calendar is resolved internally from the
809
- * event, so no calendar ID is required.
865
+ * event, so no calendar ID is required. Pass `occurrence_start` to cancel
866
+ * just one occurrence of a recurring series — the series lives on and the
867
+ * updated series master is returned; plain deletes resolve to void. With
868
+ * `occurrence_start`, fails with 400 if the timestamp is not an active
869
+ * occurrence, or 409 if the event is not a recurring series.
810
870
  */
811
- deleteById(eventId: string, options?: RequestOptions): Promise<void>;
871
+ deleteById(eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void>;
812
872
  /**
813
873
  * Promote a held event (status='hold') to status='confirmed'. Fails with 409
814
874
  * if the event is not a hold, or if the hold has already expired.
@@ -1025,7 +1085,7 @@ declare class TermsClient {
1025
1085
  declare function verifySignature(rawBody: string, headers: Headers | Record<string, string>, secret: string, options?: VerifyOptions): Promise<void>;
1026
1086
  declare function constructEvent(rawBody: string, headers: Headers | Record<string, string>, secret: string, options?: VerifyOptions): Promise<WebhookEvent>;
1027
1087
 
1028
- declare const VERSION = "0.4.2";
1088
+ declare const VERSION = "0.5.0";
1029
1089
 
1030
1090
  declare class ChronaryError extends Error {
1031
1091
  readonly status: number;
@@ -1081,4 +1141,4 @@ declare class Chronary {
1081
1141
  };
1082
1142
  }
1083
1143
 
1084
- export { APIPromise, type AcceptTermsParams, type AcceptTermsResult, type Agent, type AgentSignUpExistingOrgResponse, type AgentSignUpNewOrgResponse, type AgentSignUpParams, type AgentSignUpResponse, type AgentStatus, type AgentVerifyParams, type AgentVerifyResponse, type AppInfo, type AuditLogEntry, type AuditLogResponse, AuthenticationError, type AvailabilityParams, type AvailabilityResponse, type AvailabilityRules, type AvailabilitySlot, type BusyBlock, type Calendar, type CalendarContext, type CalendarEvent, type CancelProposalResponse, Chronary, type ChronaryConfig, ChronaryError, ConnectionError, CoreClient, type CreateAgentParams, type CreateCalendarParams, type CreateEventParams, type CreateICalSubscriptionParams, type CreateProposalParams, type CreateScopedApiKeyParams, type CreateWebhookParams, type CreatedScopedApiKey, type CrossAgentAvailabilityParams, type DataExport, type FeedbackAcceptedResponse, type FeedbackType, type ICalSubscription, type ListAgentsParams, type ListAuditLogParams, type ListCalendarsParams, type ListEventsParams, type ListICalSubscriptionsParams, type ListProposalsParams, type ListWebhookDeliveriesParams, type ListWebhooksParams, type LogLevel, NotFoundError, type Page, PageIterator, type PageResponse, type Plan, type PlanId, type PlanLimits, type PlansListResponse, type Proposal, type ProposalResponse, type ProposalResponseAction, type ProposalSlot, type ProposalStatus, type ProposalSummary, QuotaExceededError, type QuotaSnapshot, RateLimitError, type RawResponse, type RequestOptions, type ResolveProposalResponse, type RespondToProposalParams, type ScopedApiKey, type SetAvailabilityRulesParams, type SlotDuration, type SubmitFeedbackParams, TimeoutError, type UpdateAgentParams, type UpdateCalendarParams, type UpdateEventParams, type UpdateICalSubscriptionParams, type UpdateWebhookParams, type Usage, type UsageMetric, VERSION, ValidationError, type VerifyOptions, type WaitlistJoinParams, type WaitlistJoinResponse, type WaitlistedOrg, type Webhook, type WebhookDelivery, type WebhookDeliveryListResponse, type WebhookDeliveryStats, type WebhookEvent, type WebhookEventType, type WithResponse, type WorkingHours, type WorkingHoursDay, constructEvent, Chronary as default, isAgentSignUpNewOrg, verifySignature };
1144
+ export { APIPromise, type AcceptTermsParams, type AcceptTermsResult, type Agent, type AgentSignUpExistingOrgResponse, type AgentSignUpNewOrgResponse, type AgentSignUpParams, type AgentSignUpResponse, type AgentStatus, type AgentVerifyParams, type AgentVerifyResponse, type AppInfo, type AuditLogEntry, type AuditLogResponse, AuthenticationError, type AvailabilityParams, type AvailabilityResponse, type AvailabilityRules, type AvailabilitySlot, type BusyBlock, type Calendar, type CalendarContext, type CalendarEvent, type CancelProposalResponse, Chronary, type ChronaryConfig, ChronaryError, ConnectionError, CoreClient, type CreateAgentParams, type CreateCalendarParams, type CreateEventParams, type CreateICalSubscriptionParams, type CreateProposalParams, type CreateScopedApiKeyParams, type CreateWebhookParams, type CreatedScopedApiKey, type CrossAgentAvailabilityParams, type DataExport, type DeleteEventOptions, type FeedbackAcceptedResponse, type FeedbackType, type ICalSubscription, type ListAgentsParams, type ListAuditLogParams, type ListCalendarsParams, type ListEventsParams, type ListICalSubscriptionsParams, type ListProposalsParams, type ListWebhookDeliveriesParams, type ListWebhooksParams, type LogLevel, NotFoundError, type Page, PageIterator, type PageResponse, type Plan, type PlanId, type PlanLimits, type PlansListResponse, type Proposal, type ProposalResponse, type ProposalResponseAction, type ProposalSlot, type ProposalStatus, type ProposalSummary, QuotaExceededError, type QuotaSnapshot, RateLimitError, type RawResponse, type RequestOptions, type ResolveProposalResponse, type RespondToProposalParams, type ScopedApiKey, type SetAvailabilityRulesParams, type SlotDuration, type SubmitFeedbackParams, TimeoutError, type UpdateAgentParams, type UpdateCalendarParams, type UpdateEventParams, type UpdateICalSubscriptionParams, type UpdateWebhookParams, type Usage, type UsageMetric, VERSION, ValidationError, type VerifyOptions, type WaitlistJoinParams, type WaitlistJoinResponse, type WaitlistedOrg, type Webhook, type WebhookDelivery, type WebhookDeliveryListResponse, type WebhookDeliveryStats, type WebhookEvent, type WebhookEventType, type WithResponse, type WorkingHours, type WorkingHoursDay, constructEvent, Chronary as default, isAgentSignUpNewOrg, verifySignature };
package/dist/index.d.ts CHANGED
@@ -195,6 +195,14 @@ interface CalendarEvent {
195
195
  metadata: Record<string, unknown>;
196
196
  /** Reminder offsets (minutes before start). null = inherit calendar default (then system default of 10 min); [] = no reminders. */
197
197
  reminders: number[] | null;
198
+ /** RFC 5545 RRULE subset (no "RRULE:" prefix) when this event is a recurring series master, e.g. "FREQ=WEEKLY;BYDAY=MO,WE;COUNT=12". null = one-off event. */
199
+ recurrenceRule: string | null;
200
+ /** ISO 8601 starts of individually cancelled occurrences (EXDATE). */
201
+ recurrenceExdates: string[];
202
+ /** Present only on expanded instances (`expand: true` lists): id of the recurring series master this instance belongs to. */
203
+ recurringEventId?: string;
204
+ /** Present only on expanded instances: the occurrence start this instance was generated for. */
205
+ originalStartTime?: string;
198
206
  holdExpiresAt: string | null;
199
207
  holdPriority: number | null;
200
208
  deletedAt: string | null;
@@ -215,6 +223,15 @@ interface CreateEventParams {
215
223
  hold_expires_at?: string;
216
224
  /** Priority for conflict resolution. Only valid with status='hold'. 0-100. */
217
225
  hold_priority?: number;
226
+ /**
227
+ * RFC 5545 RRULE subset (no "RRULE:" prefix), e.g. "FREQ=WEEKLY;BYDAY=MO,WE;COUNT=12" —
228
+ * makes the event a recurring series master. Not allowed with status='hold'.
229
+ * Fails with 400 on an invalid rule; 429 when the plan's active
230
+ * recurring-series cap is reached (free: 5, Pro: 250 — see
231
+ * `usage.recurring_events`); 403 plan_required when the series is unbounded
232
+ * or ends more than 90 days out on the free plan (Pro allows unbounded).
233
+ */
234
+ recurrence_rule?: string;
218
235
  }
219
236
  interface UpdateEventParams {
220
237
  title?: string;
@@ -227,6 +244,16 @@ interface UpdateEventParams {
227
244
  metadata?: Record<string, unknown>;
228
245
  /** Reminder offsets in minutes before start. null = inherit calendar default; [] = no reminders. */
229
246
  reminders?: number[] | null;
247
+ /**
248
+ * Full-series edit of the recurrence rule (RFC 5545 RRULE subset, no
249
+ * "RRULE:" prefix). null clears the rule, turning the series back into a
250
+ * one-off event. Fails with 400 on an invalid rule; 429 when converting a
251
+ * one-off to recurring and the plan's active recurring-series cap is
252
+ * reached (free: 5, Pro: 250); 403 plan_required when the series is
253
+ * unbounded or ends more than 90 days out on the free plan (Pro allows
254
+ * unbounded).
255
+ */
256
+ recurrence_rule?: string | null;
230
257
  }
231
258
  interface ListEventsParams {
232
259
  calendarId?: string;
@@ -237,6 +264,25 @@ interface ListEventsParams {
237
264
  source?: 'internal' | 'external_ical';
238
265
  limit?: number;
239
266
  offset?: number;
267
+ /**
268
+ * Expand recurring series into individual occurrence instances within the
269
+ * window. When true, both `start_after` and `start_before` are required
270
+ * (max 366 days apart) — the API returns 400 otherwise. Expanded instances
271
+ * carry `recurringEventId` + `originalStartTime`.
272
+ */
273
+ expand?: boolean;
274
+ }
275
+ /** Options for event delete calls — `RequestOptions` plus recurrence controls. */
276
+ interface DeleteEventOptions extends RequestOptions {
277
+ /**
278
+ * For recurring series only: ISO 8601 start of the single occurrence to
279
+ * cancel (recorded as an EXDATE). The series lives on and the delete call
280
+ * resolves to the updated series master event instead of void. Fails with
281
+ * 400 if the timestamp is not an active occurrence of the series, or 409
282
+ * if the event is not a recurring series. Omit to delete the whole
283
+ * event/series (resolves to void).
284
+ */
285
+ occurrence_start?: string;
240
286
  }
241
287
  type SlotDuration = '15m' | '30m' | '45m' | '1h' | '2h';
242
288
  interface AvailabilitySlot {
@@ -520,6 +566,8 @@ interface Usage {
520
566
  availability_queries: UsageMetric;
521
567
  ical_subscriptions: UsageMetric;
522
568
  proposals: UsageMetric;
569
+ /** Active recurring series masters vs. the plan cap (free: 5, Pro: 250; null = unlimited). */
570
+ recurring_events: UsageMetric;
523
571
  holds: HoldsUsage;
524
572
  cross_calendar_queries: CrossCalendarQueriesUsage;
525
573
  }
@@ -793,7 +841,15 @@ declare class EventsClient {
793
841
  get(calendarId: string, eventId: string, options?: RequestOptions): Promise<CalendarEvent>;
794
842
  list(params?: ListEventsParams): PageIterator<CalendarEvent>;
795
843
  update(calendarId: string, eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent>;
796
- delete(calendarId: string, eventId: string, options?: RequestOptions): Promise<void>;
844
+ /**
845
+ * Delete an event (or, for a recurring series, the whole series). Pass
846
+ * `occurrence_start` to cancel just one occurrence of a recurring series
847
+ * instead — the series lives on and the updated series master is returned.
848
+ * Plain deletes resolve to void. With `occurrence_start`, fails with 400 if
849
+ * the timestamp is not an active occurrence, or 409 if the event is not a
850
+ * recurring series.
851
+ */
852
+ delete(calendarId: string, eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void>;
797
853
  /**
798
854
  * Fetch an event by ID alone. The calendar is resolved internally from the
799
855
  * event, so no calendar ID is required.
@@ -806,9 +862,13 @@ declare class EventsClient {
806
862
  updateById(eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent>;
807
863
  /**
808
864
  * Delete an event by ID alone. The calendar is resolved internally from the
809
- * event, so no calendar ID is required.
865
+ * event, so no calendar ID is required. Pass `occurrence_start` to cancel
866
+ * just one occurrence of a recurring series — the series lives on and the
867
+ * updated series master is returned; plain deletes resolve to void. With
868
+ * `occurrence_start`, fails with 400 if the timestamp is not an active
869
+ * occurrence, or 409 if the event is not a recurring series.
810
870
  */
811
- deleteById(eventId: string, options?: RequestOptions): Promise<void>;
871
+ deleteById(eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void>;
812
872
  /**
813
873
  * Promote a held event (status='hold') to status='confirmed'. Fails with 409
814
874
  * if the event is not a hold, or if the hold has already expired.
@@ -1025,7 +1085,7 @@ declare class TermsClient {
1025
1085
  declare function verifySignature(rawBody: string, headers: Headers | Record<string, string>, secret: string, options?: VerifyOptions): Promise<void>;
1026
1086
  declare function constructEvent(rawBody: string, headers: Headers | Record<string, string>, secret: string, options?: VerifyOptions): Promise<WebhookEvent>;
1027
1087
 
1028
- declare const VERSION = "0.4.2";
1088
+ declare const VERSION = "0.5.0";
1029
1089
 
1030
1090
  declare class ChronaryError extends Error {
1031
1091
  readonly status: number;
@@ -1081,4 +1141,4 @@ declare class Chronary {
1081
1141
  };
1082
1142
  }
1083
1143
 
1084
- export { APIPromise, type AcceptTermsParams, type AcceptTermsResult, type Agent, type AgentSignUpExistingOrgResponse, type AgentSignUpNewOrgResponse, type AgentSignUpParams, type AgentSignUpResponse, type AgentStatus, type AgentVerifyParams, type AgentVerifyResponse, type AppInfo, type AuditLogEntry, type AuditLogResponse, AuthenticationError, type AvailabilityParams, type AvailabilityResponse, type AvailabilityRules, type AvailabilitySlot, type BusyBlock, type Calendar, type CalendarContext, type CalendarEvent, type CancelProposalResponse, Chronary, type ChronaryConfig, ChronaryError, ConnectionError, CoreClient, type CreateAgentParams, type CreateCalendarParams, type CreateEventParams, type CreateICalSubscriptionParams, type CreateProposalParams, type CreateScopedApiKeyParams, type CreateWebhookParams, type CreatedScopedApiKey, type CrossAgentAvailabilityParams, type DataExport, type FeedbackAcceptedResponse, type FeedbackType, type ICalSubscription, type ListAgentsParams, type ListAuditLogParams, type ListCalendarsParams, type ListEventsParams, type ListICalSubscriptionsParams, type ListProposalsParams, type ListWebhookDeliveriesParams, type ListWebhooksParams, type LogLevel, NotFoundError, type Page, PageIterator, type PageResponse, type Plan, type PlanId, type PlanLimits, type PlansListResponse, type Proposal, type ProposalResponse, type ProposalResponseAction, type ProposalSlot, type ProposalStatus, type ProposalSummary, QuotaExceededError, type QuotaSnapshot, RateLimitError, type RawResponse, type RequestOptions, type ResolveProposalResponse, type RespondToProposalParams, type ScopedApiKey, type SetAvailabilityRulesParams, type SlotDuration, type SubmitFeedbackParams, TimeoutError, type UpdateAgentParams, type UpdateCalendarParams, type UpdateEventParams, type UpdateICalSubscriptionParams, type UpdateWebhookParams, type Usage, type UsageMetric, VERSION, ValidationError, type VerifyOptions, type WaitlistJoinParams, type WaitlistJoinResponse, type WaitlistedOrg, type Webhook, type WebhookDelivery, type WebhookDeliveryListResponse, type WebhookDeliveryStats, type WebhookEvent, type WebhookEventType, type WithResponse, type WorkingHours, type WorkingHoursDay, constructEvent, Chronary as default, isAgentSignUpNewOrg, verifySignature };
1144
+ export { APIPromise, type AcceptTermsParams, type AcceptTermsResult, type Agent, type AgentSignUpExistingOrgResponse, type AgentSignUpNewOrgResponse, type AgentSignUpParams, type AgentSignUpResponse, type AgentStatus, type AgentVerifyParams, type AgentVerifyResponse, type AppInfo, type AuditLogEntry, type AuditLogResponse, AuthenticationError, type AvailabilityParams, type AvailabilityResponse, type AvailabilityRules, type AvailabilitySlot, type BusyBlock, type Calendar, type CalendarContext, type CalendarEvent, type CancelProposalResponse, Chronary, type ChronaryConfig, ChronaryError, ConnectionError, CoreClient, type CreateAgentParams, type CreateCalendarParams, type CreateEventParams, type CreateICalSubscriptionParams, type CreateProposalParams, type CreateScopedApiKeyParams, type CreateWebhookParams, type CreatedScopedApiKey, type CrossAgentAvailabilityParams, type DataExport, type DeleteEventOptions, type FeedbackAcceptedResponse, type FeedbackType, type ICalSubscription, type ListAgentsParams, type ListAuditLogParams, type ListCalendarsParams, type ListEventsParams, type ListICalSubscriptionsParams, type ListProposalsParams, type ListWebhookDeliveriesParams, type ListWebhooksParams, type LogLevel, NotFoundError, type Page, PageIterator, type PageResponse, type Plan, type PlanId, type PlanLimits, type PlansListResponse, type Proposal, type ProposalResponse, type ProposalResponseAction, type ProposalSlot, type ProposalStatus, type ProposalSummary, QuotaExceededError, type QuotaSnapshot, RateLimitError, type RawResponse, type RequestOptions, type ResolveProposalResponse, type RespondToProposalParams, type ScopedApiKey, type SetAvailabilityRulesParams, type SlotDuration, type SubmitFeedbackParams, TimeoutError, type UpdateAgentParams, type UpdateCalendarParams, type UpdateEventParams, type UpdateICalSubscriptionParams, type UpdateWebhookParams, type Usage, type UsageMetric, VERSION, ValidationError, type VerifyOptions, type WaitlistJoinParams, type WaitlistJoinResponse, type WaitlistedOrg, type Webhook, type WebhookDelivery, type WebhookDeliveryListResponse, type WebhookDeliveryStats, type WebhookEvent, type WebhookEventType, type WithResponse, type WorkingHours, type WorkingHoursDay, constructEvent, Chronary as default, isAgentSignUpNewOrg, verifySignature };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "0.4.2";
2
+ var VERSION = "0.5.0";
3
3
 
4
4
  // src/error.ts
5
5
  var ChronaryError = class extends Error {
@@ -541,13 +541,22 @@ var EventsClient = class {
541
541
  options
542
542
  );
543
543
  }
544
+ /**
545
+ * Delete an event (or, for a recurring series, the whole series). Pass
546
+ * `occurrence_start` to cancel just one occurrence of a recurring series
547
+ * instead — the series lives on and the updated series master is returned.
548
+ * Plain deletes resolve to void. With `occurrence_start`, fails with 400 if
549
+ * the timestamp is not an active occurrence, or 409 if the event is not a
550
+ * recurring series.
551
+ */
544
552
  async delete(calendarId, eventId, options) {
545
- await this.client.request(
553
+ const { occurrence_start, ...requestOptions } = options ?? {};
554
+ return this.client.request(
546
555
  "DELETE",
547
556
  `/v1/calendars/${calendarId}/events/${eventId}`,
548
557
  void 0,
549
- void 0,
550
- options
558
+ occurrence_start !== void 0 ? { occurrence_start } : void 0,
559
+ requestOptions
551
560
  );
552
561
  }
553
562
  /**
@@ -578,15 +587,20 @@ var EventsClient = class {
578
587
  }
579
588
  /**
580
589
  * Delete an event by ID alone. The calendar is resolved internally from the
581
- * event, so no calendar ID is required.
590
+ * event, so no calendar ID is required. Pass `occurrence_start` to cancel
591
+ * just one occurrence of a recurring series — the series lives on and the
592
+ * updated series master is returned; plain deletes resolve to void. With
593
+ * `occurrence_start`, fails with 400 if the timestamp is not an active
594
+ * occurrence, or 409 if the event is not a recurring series.
582
595
  */
583
596
  async deleteById(eventId, options) {
584
- await this.client.request(
597
+ const { occurrence_start, ...requestOptions } = options ?? {};
598
+ return this.client.request(
585
599
  "DELETE",
586
600
  `/v1/events/${eventId}`,
587
601
  void 0,
588
- void 0,
589
- options
602
+ occurrence_start !== void 0 ? { occurrence_start } : void 0,
603
+ requestOptions
590
604
  );
591
605
  }
592
606
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/error.ts","../src/api-promise.ts","../src/client.ts","../src/pagination.ts","../src/resources/agents.ts","../src/resources/calendars.ts","../src/resources/events.ts","../src/resources/availability.ts","../src/resources/webhooks.ts","../src/resources/ical-subscriptions.ts","../src/resources/scheduling.ts","../src/resources/usage.ts","../src/resources/audit-log.ts","../src/resources/keys.ts","../src/resources/agent-auth.ts","../src/resources/waitlist.ts","../src/resources/feedback.ts","../src/resources/plans.ts","../src/resources/account.ts","../src/resources/terms.ts","../src/webhook-verify.ts","../src/index.ts"],"sourcesContent":["export const VERSION = '0.4.2';\n","export class ChronaryError extends Error {\n readonly status: number;\n readonly requestId: string | undefined;\n readonly headers: Headers | undefined;\n readonly errorType: string | undefined;\n\n constructor(\n message: string,\n status: number,\n requestId?: string,\n headers?: Headers,\n errorType?: string,\n ) {\n super(message);\n this.name = 'ChronaryError';\n this.status = status;\n this.requestId = requestId;\n this.headers = headers;\n this.errorType = errorType;\n }\n}\n\nexport class AuthenticationError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 401, requestId, headers, 'authentication_error');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class RateLimitError extends ChronaryError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 429, requestId, headers, 'rate_limit_error');\n this.name = 'RateLimitError';\n if (headers) {\n const ra = headers.get('retry-after');\n if (ra) this.retryAfter = parseInt(ra, 10);\n }\n }\n}\n\nexport class NotFoundError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 404, requestId, headers, 'not_found');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends ChronaryError {\n constructor(message: string, status: number, requestId?: string, headers?: Headers) {\n super(message, status, requestId, headers, 'validation_error');\n this.name = 'ValidationError';\n }\n}\n\nexport class QuotaExceededError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 402, requestId, headers, 'quota_exceeded');\n this.name = 'QuotaExceededError';\n }\n}\n\nexport class TimeoutError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'TimeoutError';\n }\n}\n\nexport class ConnectionError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * APIPromise wraps a fetch call as a thenable so callers can `await` it\n * for parsed data, or call `.withResponse()` to get both parsed data and the raw\n * Response (headers, status, etc.).\n *\n * ```ts\n * // Normal — just the data\n * const agent = await client.agents.get('agt_1');\n *\n * // With response access\n * const { data, response } = await client.agents.get('agt_1').withResponse();\n * console.log(response.status);\n * console.log(response.headers.get('x-request-id'));\n * ```\n */\n/**\n * Parsed quota snapshot from the IETF `RateLimit` / `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Present on responses from endpoints\n * that enforce quotas (most authenticated routes); absent on unauthenticated\n * or unlimited-plan responses.\n */\nexport interface QuotaSnapshot {\n /** Configured ceiling (e.g. `1_000_000` API calls/month). Parsed from `RateLimit-Policy`. */\n limit: number;\n /** Remaining quota in the current window. Parsed from `RateLimit`. */\n remaining: number;\n /** Wall-clock time when the window resets. Computed from the `t=` delta-seconds in `RateLimit`. */\n resetAt: Date;\n}\n\nexport interface RawResponse {\n status: number;\n headers: Headers;\n url: string;\n /**\n * Typed view of the IETF RateLimit headers when present. Use this instead of\n * parsing `headers.get('ratelimit')` yourself. `undefined` for responses\n * that don't emit quota headers (public endpoints, unlimited plans).\n */\n quota?: QuotaSnapshot;\n}\n\nexport interface WithResponse<T> {\n data: T;\n response: RawResponse;\n}\n\n/**\n * APIPromise is a thenable that resolves to `T` when awaited, but also\n * exposes `.withResponse()` to get both the data and raw HTTP response.\n *\n * Because it implements `.then()`, it can be awaited, used with `Promise.all()`,\n * and chained with `.then()` / `.catch()` / `.finally()`.\n */\nexport class APIPromise<T> implements PromiseLike<T> {\n private innerPromise: Promise<{ data: T; rawResponse: RawResponse }>;\n\n constructor(\n responsePromise: Promise<{ data: T; rawResponse: RawResponse }>,\n ) {\n this.innerPromise = responsePromise;\n }\n\n /**\n * Returns both the parsed data and the raw HTTP response.\n */\n async withResponse(): Promise<WithResponse<T>> {\n const { data, rawResponse } = await this.innerPromise;\n return { data, response: rawResponse };\n }\n\n /**\n * Implements the thenable interface. When awaited, resolves to just the parsed data `T`.\n */\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.innerPromise.then(\n (result) => (onfulfilled ? onfulfilled(result.data) : result.data as unknown as TResult1),\n onrejected,\n );\n }\n\n /**\n * Attaches a rejection handler.\n */\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n ): Promise<T | TResult> {\n return this.then(undefined, onrejected);\n }\n\n /**\n * Attaches a handler that runs on both fulfillment and rejection.\n */\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then(\n (value) => { onfinally?.(); return value; },\n (reason) => { onfinally?.(); throw reason; },\n );\n }\n}\n","import { VERSION } from './version';\nimport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\nimport { APIPromise } from './api-promise';\nimport type { QuotaSnapshot, RawResponse } from './api-promise';\nimport type { ChronaryConfig, LogLevel, RequestOptions, ApiErrorBody } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.chronary.ai';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\nconst MAX_RETRY_DELAY = 60_000;\n\nfunction getEnvVar(name: string): string | undefined {\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n } catch {\n // process.env not available (browser, CF Workers, etc.)\n }\n return undefined;\n}\n\nfunction resolveLogLevel(config: ChronaryConfig): LogLevel {\n if (config.logLevel) return config.logLevel;\n const envLog = getEnvVar('CHRONARY_LOG');\n if (envLog && ['debug', 'info', 'warn', 'error', 'off'].includes(envLog)) {\n return envLog as LogLevel;\n }\n return 'off';\n}\n\nconst LOG_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n off: 4,\n};\n\nexport class CoreClient {\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly logLevel: LogLevel;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly userAgent: string;\n private readonly extraHeaders: Record<string, string>;\n\n constructor(config: ChronaryConfig = {}) {\n // apiKey is optional at construction — some endpoints (agentAuth.signUp,\n // plans.list) do not require auth. When a caller invokes an authed\n // endpoint without a key, the server returns 401 and the SDK surfaces it\n // as AuthenticationError — same error shape either way.\n this.apiKey = config.apiKey ?? getEnvVar('CHRONARY_API_KEY') ?? '';\n\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.logLevel = resolveLogLevel(config);\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.extraHeaders = config.extraHeaders ?? {};\n\n let ua = `chronary-ts/${VERSION}`;\n if (config.appInfo) {\n ua += ` ${config.appInfo.name}`;\n if (config.appInfo.version) ua += `/${config.appInfo.version}`;\n }\n try {\n if (typeof process !== 'undefined' && process.version) {\n ua += ` node/${process.version.replace('v', '')}`;\n }\n } catch {\n // Not in Node\n }\n this.userAgent = ua;\n }\n\n private log(level: LogLevel, message: string) {\n if (level === 'off' || LOG_PRIORITY[level] < LOG_PRIORITY[this.logLevel]) return;\n const prefix = `[chronary:${level}]`;\n switch (level) {\n case 'debug': console.debug(prefix, message); break;\n case 'info': console.info(prefix, message); break;\n case 'warn': console.warn(prefix, message); break;\n case 'error': console.error(prefix, message); break;\n }\n }\n\n request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): APIPromise<T> {\n return new APIPromise<T>(this._request<T>(method, path, body, query, options));\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): Promise<{ data: T; rawResponse: RawResponse }> {\n const url = this.buildUrl(path, query);\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n 'X-Chronary-SDK-Version': VERSION,\n ...this.extraHeaders,\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (MUTATING_METHODS.has(method)) {\n headers['Idempotency-Key'] = options?.idempotencyKey ?? crypto.randomUUID();\n }\n\n const requestTimeout = options?.timeout ?? this.timeout;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.retryDelay(attempt, lastError);\n this.log('info', `Retry #${attempt} after ${delay}ms`);\n await sleep(delay);\n }\n\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n this.log('debug', `${method} ${path}`);\n const startTime = Date.now();\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n const elapsed = Date.now() - startTime;\n const requestId = response.headers.get('x-request-id') ?? undefined;\n\n this.log('debug', `${method} ${path} → ${response.status} in ${elapsed}ms${requestId ? ` (${requestId})` : ''}`);\n\n if (response.ok) {\n const rawResponse: RawResponse = {\n status: response.status,\n headers: response.headers,\n url: response.url,\n quota: parseQuotaSnapshot(response.headers),\n };\n if (response.status === 204) {\n return { data: undefined as T, rawResponse };\n }\n const data = await response.json() as T;\n return { data, rawResponse };\n }\n\n // Retryable?\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.maxRetries) {\n lastError = await this.buildError(response, requestId);\n continue;\n }\n\n throw await this.buildError(response, requestId);\n } catch (err) {\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n\n if (err instanceof ChronaryError) throw err;\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n throw new TimeoutError(`Request timed out after ${requestTimeout}ms`);\n }\n\n if (attempt < this.maxRetries) {\n lastError = err as Error;\n continue;\n }\n\n throw new ConnectionError(`Connection failed: ${(err as Error).message}`);\n }\n }\n\n throw lastError ?? new ConnectionError('Request failed after retries');\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n const base = `${this.baseUrl}${path}`;\n if (!query) return base;\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n private async buildError(response: Response, requestId?: string): Promise<ChronaryError> {\n let errorBody: ApiErrorBody | undefined;\n try {\n errorBody = await response.json() as ApiErrorBody;\n } catch {\n // Non-JSON response\n }\n\n const message = errorBody?.error?.message ?? `HTTP ${response.status}`;\n const rid = requestId ?? errorBody?.error?.request_id;\n const errorType = errorBody?.error?.type;\n\n switch (response.status) {\n case 400:\n if (errorType === 'validation_error') {\n return new ValidationError(message, response.status, rid, response.headers);\n }\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n case 401:\n return new AuthenticationError(message, rid, response.headers);\n case 402:\n return new QuotaExceededError(message, rid, response.headers);\n case 404:\n return new NotFoundError(message, rid, response.headers);\n case 422:\n return new ValidationError(message, response.status, rid, response.headers);\n case 429: {\n if (errorType === 'quota_exceeded') {\n return new QuotaExceededError(message, rid, response.headers);\n }\n return new RateLimitError(message, rid, response.headers);\n }\n default:\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n }\n }\n\n private retryDelay(attempt: number, lastError?: Error): number {\n // Respect Retry-After header\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n return Math.min(lastError.retryAfter * 1000, MAX_RETRY_DELAY);\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = 500;\n const exponential = base * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base;\n return Math.min(exponential + jitter, MAX_RETRY_DELAY);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the IETF structured-field `RateLimit` and `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Returns `undefined` if either header\n * is missing or unparseable — callers can still reach the raw header strings\n * via `response.headers`.\n *\n * `RateLimit` value example: `\"quota\";r=985477;t=187200`\n * `RateLimit-Policy` value example: `\"quota\";q=1000000;w=2592000;pk=org_abc`\n */\nfunction parseQuotaSnapshot(headers: Headers): QuotaSnapshot | undefined {\n const rateLimit = headers.get('ratelimit');\n const policy = headers.get('ratelimit-policy');\n if (!rateLimit || !policy) return undefined;\n\n const remaining = parseStructuredParam(rateLimit, 'r');\n const resetSeconds = parseStructuredParam(rateLimit, 't');\n const limit = parseStructuredParam(policy, 'q');\n if (remaining === undefined || resetSeconds === undefined || limit === undefined) {\n return undefined;\n }\n\n return {\n limit,\n remaining,\n resetAt: new Date(Date.now() + resetSeconds * 1000),\n };\n}\n\nfunction parseStructuredParam(header: string, key: string): number | undefined {\n // Match `;<key>=<digits>` — guards against partial matches inside other tokens.\n const re = new RegExp(`(?:^|;)\\\\s*${key}=(-?\\\\d+)(?:;|$)`);\n const match = re.exec(header);\n if (!match) return undefined;\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : undefined;\n}\n","import type { PageResponse, Page } from './types';\n\nexport class PageIterator<T> implements AsyncIterable<T> {\n private readonly fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>;\n private readonly defaultLimit: number;\n private readonly initialOffset: number;\n\n constructor(\n fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>,\n defaultLimit: number = 50,\n initialOffset: number = 0,\n ) {\n this.fetchPage = fetchPage;\n this.defaultLimit = defaultLimit;\n this.initialOffset = initialOffset;\n }\n\n async getPage(offset: number = this.initialOffset, limit?: number): Promise<Page<T>> {\n const l = limit ?? this.defaultLimit;\n const response = await this.fetchPage(offset, l);\n return {\n ...response,\n hasMore: offset + response.data.length < response.total,\n };\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let offset = this.initialOffset;\n const limit = this.defaultLimit;\n\n while (true) {\n const page = await this.fetchPage(offset, limit);\n for (const item of page.data) {\n yield item;\n }\n offset += page.data.length;\n if (offset >= page.total || page.data.length === 0) break;\n }\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register your agent with Chronary. Creates a Chronary identity for an agent\n * that already exists in your system, so it can own calendars, events, and webhooks.\n */\n async create(params: CreateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('POST', '/v1/agents', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('GET', `/v1/agents/${id}`, undefined, undefined, options);\n }\n\n list(params: ListAgentsParams = {}): PageIterator<Agent> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<Agent>(\n (offset, l) =>\n this.client.request<PageResponse<Agent>>('GET', '/v1/agents', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('PATCH', `/v1/agents/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/agents/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class CalendarsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateCalendarParams & { agentId?: string }, options?: RequestOptions): Promise<Calendar> {\n const { agentId, ...body } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return this.client.request<Calendar>('POST', path, body, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('GET', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n list(params: ListCalendarsParams = {}): PageIterator<Calendar> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return new PageIterator<Calendar>(\n (offset, l) =>\n this.client.request<PageResponse<Calendar>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateCalendarParams, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('PATCH', `/v1/calendars/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n async getContext(id: string, options?: RequestOptions): Promise<CalendarContext> {\n return this.client.request<CalendarContext>(\n 'GET', `/v1/calendars/${id}/context`, undefined, undefined, options,\n );\n }\n\n async setAvailabilityRules(\n id: string,\n params: SetAvailabilityRulesParams,\n options?: RequestOptions,\n ): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'PUT', `/v1/calendars/${id}/availability-rules`, params, undefined, options,\n );\n }\n\n async getAvailabilityRules(id: string, options?: RequestOptions): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'GET', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n\n async deleteAvailabilityRules(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class EventsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(calendarId: string, params: CreateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'POST', `/v1/calendars/${calendarId}/events`, params, undefined, options,\n );\n }\n\n async get(calendarId: string, eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n list(params: ListEventsParams = {}): PageIterator<CalendarEvent> {\n const { calendarId, agentId, limit = 50, offset = 0, ...filters } = params;\n\n let path: string;\n if (agentId) {\n path = `/v1/agents/${agentId}/events`;\n } else if (calendarId) {\n path = `/v1/calendars/${calendarId}/events`;\n } else {\n throw new Error('Either calendarId or agentId is required for events.list()');\n }\n\n return new PageIterator<CalendarEvent>(\n (offset, l) =>\n this.client.request<PageResponse<CalendarEvent>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(calendarId: string, eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/calendars/${calendarId}/events/${eventId}`, params, undefined, options,\n );\n }\n\n async delete(calendarId: string, eventId: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Fetch an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async getById(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Update an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async updateById(eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async deleteById(eventId: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Promote a held event (status='hold') to status='confirmed'. Fails with 409\n * if the event is not a hold, or if the hold has already expired.\n */\n async confirm(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/confirm`, undefined, undefined, options,\n );\n }\n\n /**\n * Manually release a held event before its TTL, freeing the slot. Fails with\n * 409 if the event is not a hold.\n */\n async release(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/release`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n RequestOptions,\n} from '../types';\n\nexport class AvailabilityClient {\n constructor(private readonly client: CoreClient) {}\n\n async forAgent(agentId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/agents/${agentId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async forCalendar(calendarId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/calendars/${calendarId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async check(params: CrossAgentAvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', '/v1/availability', undefined,\n {\n agents: params.agents.join(','),\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n calendars: params.calendars?.join(','),\n include_busy: params.include_busy,\n },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n ListWebhookDeliveriesParams,\n WebhookDeliveryListResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class WebhooksClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('POST', '/v1/webhooks', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('GET', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n list(params: ListWebhooksParams = {}): PageIterator<Webhook> {\n const { limit = 20, offset = 0, ...filters } = params;\n return new PageIterator<Webhook>(\n (offset, l) =>\n this.client.request<PageResponse<Webhook>>('GET', '/v1/webhooks', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('PATCH', `/v1/webhooks/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n async listDeliveries(\n webhookId: string,\n params: ListWebhookDeliveriesParams = {},\n options?: RequestOptions,\n ): Promise<WebhookDeliveryListResponse> {\n const { limit = 20, offset = 0, status, include_payload } = params;\n return this.client.request<WebhookDeliveryListResponse>(\n 'GET',\n `/v1/webhooks/${webhookId}/deliveries`,\n undefined,\n { limit, offset, ...(status !== undefined && { status }), ...(include_payload !== undefined && { include_payload }) },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class ICalSubscriptionsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(agentId: string, params: CreateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'POST', `/v1/agents/${agentId}/ical-subscriptions`, params, undefined, options,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'GET', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n list(params: ListICalSubscriptionsParams & { agentId: string }): PageIterator<ICalSubscription> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ICalSubscription>(\n (offset, l) =>\n this.client.request<PageResponse<ICalSubscription>>(\n 'GET', `/v1/agents/${agentId}/ical-subscriptions`, undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'PATCH', `/v1/ical-subscriptions/${id}`, params, undefined, options,\n );\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n async sync(id: string, options?: RequestOptions): Promise<{ status: string }> {\n return this.client.request<{ status: string }>(\n 'POST', `/v1/ical-subscriptions/${id}/sync`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Proposal,\n ProposalSummary,\n ProposalResponse,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class SchedulingClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateProposalParams, options?: RequestOptions): Promise<ProposalSummary> {\n return this.client.request<ProposalSummary>(\n 'POST', '/v1/scheduling/proposals', params, undefined, options,\n );\n }\n\n list(params: ListProposalsParams = {}): PageIterator<ProposalSummary> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ProposalSummary>(\n (offset, l) =>\n this.client.request<PageResponse<ProposalSummary>>(\n 'GET', '/v1/scheduling/proposals', undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<Proposal> {\n return this.client.request<Proposal>(\n 'GET', `/v1/scheduling/proposals/${id}`, undefined, undefined, options,\n );\n }\n\n async respond(\n id: string,\n params: RespondToProposalParams,\n options?: RequestOptions,\n ): Promise<ProposalResponse> {\n return this.client.request<ProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/respond`, params, undefined, options,\n );\n }\n\n async resolve(id: string, options?: RequestOptions): Promise<ResolveProposalResponse> {\n return this.client.request<ResolveProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/resolve`, undefined, undefined, options,\n );\n }\n\n async cancel(id: string, options?: RequestOptions): Promise<CancelProposalResponse> {\n return this.client.request<CancelProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/cancel`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { Usage, RequestOptions } from '../types';\n\nexport class UsageClient {\n constructor(private readonly client: CoreClient) {}\n\n async get(options?: RequestOptions): Promise<Usage> {\n return this.client.request<Usage>('GET', '/v1/usage', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AuditLogResponse, ListAuditLogParams, RequestOptions } from '../types';\n\nexport class AuditLogClient {\n constructor(private readonly client: CoreClient) {}\n\n async list(params?: ListAuditLogParams, options?: RequestOptions): Promise<AuditLogResponse> {\n // CoreClient.request serializes the query map into the URL; passing\n // `undefined` values strips them. Keeps the path literal static so the\n // surface-coverage audit script can match it against the canonical route.\n const query: Record<string, string | number | boolean | undefined> = {\n from: params?.from,\n to: params?.to,\n action: params?.action,\n actor_key_prefix: params?.actor_key_prefix,\n cursor: params?.cursor,\n limit: params?.limit,\n };\n return this.client.request<AuditLogResponse>('GET', '/v1/audit-log', undefined, query, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n RequestOptions,\n ScopedApiKey,\n} from '../types';\n\ninterface ListScopedApiKeysResponse {\n keys: ScopedApiKey[];\n}\n\nexport class KeysClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(\n params: CreateScopedApiKeyParams,\n options?: RequestOptions,\n ): Promise<CreatedScopedApiKey> {\n return this.client.request<CreatedScopedApiKey>('POST', '/v1/keys', params, undefined, options);\n }\n\n async list(options?: RequestOptions): Promise<ScopedApiKey[]> {\n const response = await this.client.request<ListScopedApiKeysResponse>(\n 'GET',\n '/v1/keys',\n undefined,\n undefined,\n options,\n );\n return response.keys;\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/keys/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentAuthClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register a new agent + org. Sends an OTP to the provided email.\n *\n * No authentication required — callers may construct a `Chronary` client\n * with no `apiKey` to invoke this method.\n *\n * The response is a discriminated union:\n * - **New org path** — returns `org_id`, `agent_id`, and `api_key`.\n * The `api_key` is restricted to the verify endpoint until the OTP\n * is submitted successfully; after verification it unlocks the full API.\n * - **Existing-org dedup** — returns only `message`. No credentials are\n * leaked when the email matches an existing org (enumeration defense).\n *\n * Use `isAgentSignUpNewOrg()` to narrow the union before accessing keys.\n *\n * @throws ChronaryError (409 `tos_version_stale`) if `tos_version` is not\n * the currently-published version — retry with the value from the\n * `current_version` field on the error body.\n */\n async signUp(\n params: AgentSignUpParams,\n options?: RequestOptions,\n ): Promise<AgentSignUpResponse> {\n return this.client.request<AgentSignUpResponse>(\n 'POST',\n '/v1/agent/sign-up',\n params,\n undefined,\n options,\n );\n }\n\n /**\n * Submit the OTP sent during `signUp()` to unlock the API key.\n *\n * Must be invoked on a `Chronary` client constructed with the restricted\n * `api_key` returned by `signUp()` — NOT on the client that issued\n * `signUp()` itself (which had no key).\n *\n * @throws ChronaryError (status 400) when the OTP is wrong or expired.\n * The SDK's `ValidationError` class is reserved for HTTP 422; the\n * API returns 400 for invalid/expired OTPs, which surfaces as a\n * generic `ChronaryError` with the original message.\n */\n async verify(\n params: AgentVerifyParams,\n options?: RequestOptions,\n ): Promise<AgentVerifyResponse> {\n return this.client.request<AgentVerifyResponse>(\n 'POST',\n '/v1/agent/verify',\n params,\n undefined,\n options,\n );\n }\n}\n\n/**\n * Type guard — narrows an `AgentSignUpResponse` to the new-org branch.\n * The existing-org dedup branch returns only `message`, so this is the\n * caller's cue that credentials are present.\n */\nexport function isAgentSignUpNewOrg(\n response: AgentSignUpResponse,\n): response is AgentSignUpNewOrgResponse {\n return 'api_key' in response;\n}\n","import type { CoreClient } from '../client';\nimport type {\n WaitlistJoinParams,\n WaitlistJoinResponse,\n RequestOptions,\n} from '../types';\n\nexport class WaitlistClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Join the Chronary waitlist (#442). Used during private preview when open\n * signup is gated. Creates a real organization row flagged as\n * `is_waitlisted: true`; an admin flips the flag to activate the account.\n *\n * No authentication required — invoke on a `Chronary` client constructed\n * with no `apiKey`.\n *\n * Idempotent on repeat hits: a second call with the same email returns\n * the existing waitlisted org instead of erroring. An active (non-waitlisted)\n * account at the same email returns 409 `email_taken`.\n *\n * @throws ChronaryError (409 `email_taken`) when an active account already\n * exists for this email — direct the user to sign-in instead.\n * @throws ChronaryError (409 `tos_version_stale`) when the supplied\n * `tos_version` doesn't match the currently-published version.\n * @throws ChronaryError (429 `rate_limit_error`) on the per-IP / per-email\n * waitlist limiter.\n */\n async join(\n params: WaitlistJoinParams,\n options?: RequestOptions,\n ): Promise<WaitlistJoinResponse> {\n return this.client.request<WaitlistJoinResponse>(\n 'POST',\n '/v1/waitlist',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n FeedbackAcceptedResponse,\n RequestOptions,\n SubmitFeedbackParams,\n} from '../types';\n\nexport class FeedbackClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Submit structured feedback (bug, feature, or friction) to Chronary.\n *\n * Rate-limited to 25 submissions per day per organization (UTC day).\n * Available on all plans, including free. The 26th submission returns\n * HTTP 429 with a `Retry-After` header set to the seconds until the\n * next UTC midnight.\n */\n async submit(\n params: SubmitFeedbackParams,\n options?: RequestOptions,\n ): Promise<FeedbackAcceptedResponse> {\n return this.client.request<FeedbackAcceptedResponse>(\n 'POST',\n '/v1/feedback',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { PlansListResponse, RequestOptions } from '../types';\n\nexport class PlansClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Fetch the public plan catalog (`GET /v1/plans`).\n *\n * Returns all sellable tiers (free, pro, scale) plus the enterprise\n * tier with `custom_pricing: true`. No authentication required.\n * Responses are cacheable for 5 minutes at the edge.\n */\n async list(options?: RequestOptions): Promise<PlansListResponse> {\n return this.client.request<PlansListResponse>('GET', '/v1/plans', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { DataExport, RequestOptions } from '../types';\n\nexport class AccountClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Export every row this org owns as a single JSON payload (GDPR Art. 15 + 20\n * portability / CCPA right-to-know / EU Data Act interoperability).\n *\n * **Authentication:** This endpoint is JWT-only — it returns decrypted\n * webhook secrets and iCal subscription URLs that aren't normally accessible\n * via API-key endpoints. Configure the SDK with a console JWT (e.g. cookie\n * value or Bearer token from the console session) as the `apiKey` config to\n * call this. API keys (`chr_sk_*` / `chr_ak_*`) will return 401.\n *\n * In most cases, end users should download via the console UI at\n * `console.chronary.ai/settings`. The SDK method exists for programmatic\n * use cases (e.g. server-side compliance tooling holding a delegated JWT).\n *\n * **Rate limit:** 10 exports/hour/org.\n */\n async export(options?: RequestOptions): Promise<DataExport> {\n return this.client.request<DataExport>(\n 'GET',\n '/v1/auth/export',\n undefined,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AcceptTermsParams, AcceptTermsResult, RequestOptions } from '../types';\n\nexport class TermsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Re-accept the current Chronary terms of service for the calling org.\n *\n * Use this when a response carries the `Chronary-Terms-Upgrade-Required`\n * header after a material ToS bump — it clears the upgrade requirement for\n * Bearer-key (SDK / MCP) clients that have no console session. Read the\n * current version from `GET /v1/auth/terms/current` and pass it verbatim.\n *\n * **Authentication:** org-level API keys (`chr_sk_*`) only — agent-scoped\n * keys cannot accept org-wide terms (403). A stale version returns 409\n * `tos_version_stale` with the current version in the error body.\n */\n async accept(params: AcceptTermsParams, options?: RequestOptions): Promise<AcceptTermsResult> {\n return this.client.request<AcceptTermsResult>(\n 'POST',\n '/v1/terms/accept',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { WebhookEvent, VerifyOptions } from './types';\nimport { ChronaryError } from './error';\n\nconst DEFAULT_TOLERANCE = 5 * 60 * 1000; // 5 minutes\n\nfunction bufToHex(buf: ArrayBuffer): string {\n return Array.from(new Uint8Array(buf))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nasync function computeSignature(secret: string, timestamp: string, payload: string): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const message = encoder.encode(`${timestamp}.${payload}`);\n const sig = await crypto.subtle.sign('HMAC', key, message);\n return `sha256=${bufToHex(sig)}`;\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const aBuf = encoder.encode(a);\n const bBuf = encoder.encode(b);\n if (aBuf.length !== bBuf.length) return false;\n let diff = 0;\n for (let i = 0; i < aBuf.length; i++) diff |= aBuf[i] ^ bBuf[i];\n return diff === 0;\n}\n\nfunction getHeader(headers: Headers | Record<string, string>, name: string): string | null {\n if (headers instanceof Headers) return headers.get(name);\n\n const record = headers as Record<string, string>;\n const direct = record[name] ?? record[name.toLowerCase()];\n if (direct !== undefined) return direct;\n\n const lowerName = name.toLowerCase();\n for (const [key, value] of Object.entries(record)) {\n if (key.toLowerCase() === lowerName) return value;\n }\n return null;\n}\n\nfunction extractHeaders(headers: Headers | Record<string, string>): { signature: string; timestamp: string } {\n const get = (name: string): string | null => {\n return getHeader(headers, name);\n };\n\n const signature = get('X-Signature') ?? get('x-signature');\n const timestamp = get('X-Timestamp') ?? get('x-timestamp');\n\n if (!signature) throw new ChronaryError('Missing X-Signature header', 0);\n if (!timestamp) throw new ChronaryError('Missing X-Timestamp header', 0);\n\n return { signature, timestamp };\n}\n\nexport async function verifySignature(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<void> {\n if (typeof rawBody !== 'string') {\n throw new ChronaryError(\n 'rawBody must be a string. If you parsed the JSON body, pass the raw string instead.',\n 0,\n );\n }\n\n const { signature, timestamp } = extractHeaders(headers);\n const tolerance = options?.tolerance ?? DEFAULT_TOLERANCE;\n\n // Timestamp tolerance check for replay prevention\n const tsMs = parseInt(timestamp, 10) * 1000;\n const now = Date.now();\n if (Math.abs(now - tsMs) > tolerance) {\n throw new ChronaryError(\n `Webhook timestamp too old. Received ${timestamp}, current time ${Math.floor(now / 1000)}. Tolerance: ${tolerance / 1000}s`,\n 0,\n );\n }\n\n const expected = await computeSignature(secret, timestamp, rawBody);\n if (!constantTimeEqual(expected, signature)) {\n throw new ChronaryError('Webhook signature verification failed', 0);\n }\n}\n\nexport async function constructEvent(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<WebhookEvent> {\n await verifySignature(rawBody, headers, secret, options);\n\n const type = getHeader(headers, 'X-Chronary-Event-Type');\n if (!type) throw new ChronaryError('Missing X-Chronary-Event-Type header', 0);\n\n const data = JSON.parse(rawBody);\n return { type, data } as WebhookEvent;\n}\n","import { CoreClient } from './client';\nimport { AgentsClient } from './resources/agents';\nimport { CalendarsClient } from './resources/calendars';\nimport { EventsClient } from './resources/events';\nimport { AvailabilityClient } from './resources/availability';\nimport { WebhooksClient } from './resources/webhooks';\nimport { ICalSubscriptionsClient } from './resources/ical-subscriptions';\nimport { SchedulingClient } from './resources/scheduling';\nimport { UsageClient } from './resources/usage';\nimport { AuditLogClient } from './resources/audit-log';\nimport { KeysClient } from './resources/keys';\nimport { AgentAuthClient } from './resources/agent-auth';\nimport { WaitlistClient } from './resources/waitlist';\nimport { FeedbackClient } from './resources/feedback';\nimport { PlansClient } from './resources/plans';\nimport { AccountClient } from './resources/account';\nimport { TermsClient } from './resources/terms';\nimport { verifySignature, constructEvent } from './webhook-verify';\nimport type { ChronaryConfig } from './types';\n\nexport class Chronary {\n readonly agents: AgentsClient;\n readonly calendars: CalendarsClient;\n readonly events: EventsClient;\n readonly availability: AvailabilityClient;\n readonly webhooks: WebhooksClient;\n readonly icalSubscriptions: ICalSubscriptionsClient;\n readonly scheduling: SchedulingClient;\n readonly usage: UsageClient;\n readonly auditLog: AuditLogClient;\n readonly keys: KeysClient;\n readonly agentAuth: AgentAuthClient;\n readonly waitlist: WaitlistClient;\n readonly feedback: FeedbackClient;\n readonly plans: PlansClient;\n readonly account: AccountClient;\n readonly terms: TermsClient;\n\n constructor(config?: ChronaryConfig) {\n const client = new CoreClient(config);\n this.agents = new AgentsClient(client);\n this.calendars = new CalendarsClient(client);\n this.events = new EventsClient(client);\n this.availability = new AvailabilityClient(client);\n this.webhooks = new WebhooksClient(client);\n this.icalSubscriptions = new ICalSubscriptionsClient(client);\n this.scheduling = new SchedulingClient(client);\n this.usage = new UsageClient(client);\n this.auditLog = new AuditLogClient(client);\n this.keys = new KeysClient(client);\n this.agentAuth = new AgentAuthClient(client);\n this.waitlist = new WaitlistClient(client);\n this.feedback = new FeedbackClient(client);\n this.plans = new PlansClient(client);\n this.account = new AccountClient(client);\n this.terms = new TermsClient(client);\n }\n\n static webhooks = {\n verifySignature,\n constructEvent,\n };\n}\n\n// Re-export everything\nexport { CoreClient } from './client';\nexport { APIPromise } from './api-promise';\nexport type { QuotaSnapshot, RawResponse, WithResponse } from './api-promise';\nexport { PageIterator } from './pagination';\nexport { verifySignature, constructEvent } from './webhook-verify';\nexport { VERSION } from './version';\nexport { isAgentSignUpNewOrg } from './resources/agent-auth';\n\nexport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\n\nexport type {\n ChronaryConfig,\n LogLevel,\n AppInfo,\n RequestOptions,\n PageResponse,\n Page,\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AgentStatus,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n WorkingHours,\n WorkingHoursDay,\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n SlotDuration,\n AvailabilitySlot,\n BusyBlock,\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n WebhookDelivery,\n WebhookDeliveryStats,\n WebhookDeliveryListResponse,\n ListWebhookDeliveriesParams,\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n Proposal,\n ProposalSummary,\n ProposalSlot,\n ProposalResponse,\n ProposalStatus,\n ProposalResponseAction,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n Usage,\n UsageMetric,\n AuditLogEntry,\n ListAuditLogParams,\n AuditLogResponse,\n ScopedApiKey,\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n AcceptTermsParams,\n AcceptTermsResult,\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentSignUpExistingOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n WaitlistJoinParams,\n WaitlistJoinResponse,\n WaitlistedOrg,\n FeedbackType,\n SubmitFeedbackParams,\n FeedbackAcceptedResponse,\n PlanId,\n PlanLimits,\n Plan,\n PlansListResponse,\n WebhookEventType,\n WebhookEvent,\n VerifyOptions,\n DataExport,\n} from './types';\n\nexport default Chronary;\n"],"mappings":"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","names":["offset","offset","offset","offset","offset","offset"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/error.ts","../src/api-promise.ts","../src/client.ts","../src/pagination.ts","../src/resources/agents.ts","../src/resources/calendars.ts","../src/resources/events.ts","../src/resources/availability.ts","../src/resources/webhooks.ts","../src/resources/ical-subscriptions.ts","../src/resources/scheduling.ts","../src/resources/usage.ts","../src/resources/audit-log.ts","../src/resources/keys.ts","../src/resources/agent-auth.ts","../src/resources/waitlist.ts","../src/resources/feedback.ts","../src/resources/plans.ts","../src/resources/account.ts","../src/resources/terms.ts","../src/webhook-verify.ts","../src/index.ts"],"sourcesContent":["export const VERSION = '0.5.0';\n","export class ChronaryError extends Error {\n readonly status: number;\n readonly requestId: string | undefined;\n readonly headers: Headers | undefined;\n readonly errorType: string | undefined;\n\n constructor(\n message: string,\n status: number,\n requestId?: string,\n headers?: Headers,\n errorType?: string,\n ) {\n super(message);\n this.name = 'ChronaryError';\n this.status = status;\n this.requestId = requestId;\n this.headers = headers;\n this.errorType = errorType;\n }\n}\n\nexport class AuthenticationError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 401, requestId, headers, 'authentication_error');\n this.name = 'AuthenticationError';\n }\n}\n\nexport class RateLimitError extends ChronaryError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 429, requestId, headers, 'rate_limit_error');\n this.name = 'RateLimitError';\n if (headers) {\n const ra = headers.get('retry-after');\n if (ra) this.retryAfter = parseInt(ra, 10);\n }\n }\n}\n\nexport class NotFoundError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 404, requestId, headers, 'not_found');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ValidationError extends ChronaryError {\n constructor(message: string, status: number, requestId?: string, headers?: Headers) {\n super(message, status, requestId, headers, 'validation_error');\n this.name = 'ValidationError';\n }\n}\n\nexport class QuotaExceededError extends ChronaryError {\n constructor(message: string, requestId?: string, headers?: Headers) {\n super(message, 402, requestId, headers, 'quota_exceeded');\n this.name = 'QuotaExceededError';\n }\n}\n\nexport class TimeoutError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'TimeoutError';\n }\n}\n\nexport class ConnectionError extends ChronaryError {\n constructor(message: string) {\n super(message, 0);\n this.name = 'ConnectionError';\n }\n}\n","/**\n * APIPromise wraps a fetch call as a thenable so callers can `await` it\n * for parsed data, or call `.withResponse()` to get both parsed data and the raw\n * Response (headers, status, etc.).\n *\n * ```ts\n * // Normal — just the data\n * const agent = await client.agents.get('agt_1');\n *\n * // With response access\n * const { data, response } = await client.agents.get('agt_1').withResponse();\n * console.log(response.status);\n * console.log(response.headers.get('x-request-id'));\n * ```\n */\n/**\n * Parsed quota snapshot from the IETF `RateLimit` / `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Present on responses from endpoints\n * that enforce quotas (most authenticated routes); absent on unauthenticated\n * or unlimited-plan responses.\n */\nexport interface QuotaSnapshot {\n /** Configured ceiling (e.g. `1_000_000` API calls/month). Parsed from `RateLimit-Policy`. */\n limit: number;\n /** Remaining quota in the current window. Parsed from `RateLimit`. */\n remaining: number;\n /** Wall-clock time when the window resets. Computed from the `t=` delta-seconds in `RateLimit`. */\n resetAt: Date;\n}\n\nexport interface RawResponse {\n status: number;\n headers: Headers;\n url: string;\n /**\n * Typed view of the IETF RateLimit headers when present. Use this instead of\n * parsing `headers.get('ratelimit')` yourself. `undefined` for responses\n * that don't emit quota headers (public endpoints, unlimited plans).\n */\n quota?: QuotaSnapshot;\n}\n\nexport interface WithResponse<T> {\n data: T;\n response: RawResponse;\n}\n\n/**\n * APIPromise is a thenable that resolves to `T` when awaited, but also\n * exposes `.withResponse()` to get both the data and raw HTTP response.\n *\n * Because it implements `.then()`, it can be awaited, used with `Promise.all()`,\n * and chained with `.then()` / `.catch()` / `.finally()`.\n */\nexport class APIPromise<T> implements PromiseLike<T> {\n private innerPromise: Promise<{ data: T; rawResponse: RawResponse }>;\n\n constructor(\n responsePromise: Promise<{ data: T; rawResponse: RawResponse }>,\n ) {\n this.innerPromise = responsePromise;\n }\n\n /**\n * Returns both the parsed data and the raw HTTP response.\n */\n async withResponse(): Promise<WithResponse<T>> {\n const { data, rawResponse } = await this.innerPromise;\n return { data, response: rawResponse };\n }\n\n /**\n * Implements the thenable interface. When awaited, resolves to just the parsed data `T`.\n */\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.innerPromise.then(\n (result) => (onfulfilled ? onfulfilled(result.data) : result.data as unknown as TResult1),\n onrejected,\n );\n }\n\n /**\n * Attaches a rejection handler.\n */\n catch<TResult = never>(\n onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,\n ): Promise<T | TResult> {\n return this.then(undefined, onrejected);\n }\n\n /**\n * Attaches a handler that runs on both fulfillment and rejection.\n */\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.then(\n (value) => { onfinally?.(); return value; },\n (reason) => { onfinally?.(); throw reason; },\n );\n }\n}\n","import { VERSION } from './version';\nimport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\nimport { APIPromise } from './api-promise';\nimport type { QuotaSnapshot, RawResponse } from './api-promise';\nimport type { ChronaryConfig, LogLevel, RequestOptions, ApiErrorBody } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.chronary.ai';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRYABLE_STATUS_CODES = new Set([408, 429, 500, 502, 503, 504]);\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\nconst MAX_RETRY_DELAY = 60_000;\n\nfunction getEnvVar(name: string): string | undefined {\n try {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n } catch {\n // process.env not available (browser, CF Workers, etc.)\n }\n return undefined;\n}\n\nfunction resolveLogLevel(config: ChronaryConfig): LogLevel {\n if (config.logLevel) return config.logLevel;\n const envLog = getEnvVar('CHRONARY_LOG');\n if (envLog && ['debug', 'info', 'warn', 'error', 'off'].includes(envLog)) {\n return envLog as LogLevel;\n }\n return 'off';\n}\n\nconst LOG_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n off: 4,\n};\n\nexport class CoreClient {\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly logLevel: LogLevel;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly userAgent: string;\n private readonly extraHeaders: Record<string, string>;\n\n constructor(config: ChronaryConfig = {}) {\n // apiKey is optional at construction — some endpoints (agentAuth.signUp,\n // plans.list) do not require auth. When a caller invokes an authed\n // endpoint without a key, the server returns 401 and the SDK surfaces it\n // as AuthenticationError — same error shape either way.\n this.apiKey = config.apiKey ?? getEnvVar('CHRONARY_API_KEY') ?? '';\n\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.logLevel = resolveLogLevel(config);\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);\n this.extraHeaders = config.extraHeaders ?? {};\n\n let ua = `chronary-ts/${VERSION}`;\n if (config.appInfo) {\n ua += ` ${config.appInfo.name}`;\n if (config.appInfo.version) ua += `/${config.appInfo.version}`;\n }\n try {\n if (typeof process !== 'undefined' && process.version) {\n ua += ` node/${process.version.replace('v', '')}`;\n }\n } catch {\n // Not in Node\n }\n this.userAgent = ua;\n }\n\n private log(level: LogLevel, message: string) {\n if (level === 'off' || LOG_PRIORITY[level] < LOG_PRIORITY[this.logLevel]) return;\n const prefix = `[chronary:${level}]`;\n switch (level) {\n case 'debug': console.debug(prefix, message); break;\n case 'info': console.info(prefix, message); break;\n case 'warn': console.warn(prefix, message); break;\n case 'error': console.error(prefix, message); break;\n }\n }\n\n request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): APIPromise<T> {\n return new APIPromise<T>(this._request<T>(method, path, body, query, options));\n }\n\n private async _request<T>(\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: RequestOptions,\n ): Promise<{ data: T; rawResponse: RawResponse }> {\n const url = this.buildUrl(path, query);\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n 'X-Chronary-SDK-Version': VERSION,\n ...this.extraHeaders,\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n if (MUTATING_METHODS.has(method)) {\n headers['Idempotency-Key'] = options?.idempotencyKey ?? crypto.randomUUID();\n }\n\n const requestTimeout = options?.timeout ?? this.timeout;\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n const delay = this.retryDelay(attempt, lastError);\n this.log('info', `Retry #${attempt} after ${delay}ms`);\n await sleep(delay);\n }\n\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n\n const controller = new AbortController();\n const abortFromCaller = () => controller.abort(options?.signal?.reason);\n options?.signal?.addEventListener('abort', abortFromCaller, { once: true });\n\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n this.log('debug', `${method} ${path}`);\n const startTime = Date.now();\n\n const response = await this.fetchFn(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n const elapsed = Date.now() - startTime;\n const requestId = response.headers.get('x-request-id') ?? undefined;\n\n this.log('debug', `${method} ${path} → ${response.status} in ${elapsed}ms${requestId ? ` (${requestId})` : ''}`);\n\n if (response.ok) {\n const rawResponse: RawResponse = {\n status: response.status,\n headers: response.headers,\n url: response.url,\n quota: parseQuotaSnapshot(response.headers),\n };\n if (response.status === 204) {\n return { data: undefined as T, rawResponse };\n }\n const data = await response.json() as T;\n return { data, rawResponse };\n }\n\n // Retryable?\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < this.maxRetries) {\n lastError = await this.buildError(response, requestId);\n continue;\n }\n\n throw await this.buildError(response, requestId);\n } catch (err) {\n clearTimeout(timeoutId);\n options?.signal?.removeEventListener('abort', abortFromCaller);\n\n if (err instanceof ChronaryError) throw err;\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n if (options?.signal?.aborted) throw new ChronaryError('Request aborted', 0);\n throw new TimeoutError(`Request timed out after ${requestTimeout}ms`);\n }\n\n if (attempt < this.maxRetries) {\n lastError = err as Error;\n continue;\n }\n\n throw new ConnectionError(`Connection failed: ${(err as Error).message}`);\n }\n }\n\n throw lastError ?? new ConnectionError('Request failed after retries');\n }\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n const base = `${this.baseUrl}${path}`;\n if (!query) return base;\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n private async buildError(response: Response, requestId?: string): Promise<ChronaryError> {\n let errorBody: ApiErrorBody | undefined;\n try {\n errorBody = await response.json() as ApiErrorBody;\n } catch {\n // Non-JSON response\n }\n\n const message = errorBody?.error?.message ?? `HTTP ${response.status}`;\n const rid = requestId ?? errorBody?.error?.request_id;\n const errorType = errorBody?.error?.type;\n\n switch (response.status) {\n case 400:\n if (errorType === 'validation_error') {\n return new ValidationError(message, response.status, rid, response.headers);\n }\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n case 401:\n return new AuthenticationError(message, rid, response.headers);\n case 402:\n return new QuotaExceededError(message, rid, response.headers);\n case 404:\n return new NotFoundError(message, rid, response.headers);\n case 422:\n return new ValidationError(message, response.status, rid, response.headers);\n case 429: {\n if (errorType === 'quota_exceeded') {\n return new QuotaExceededError(message, rid, response.headers);\n }\n return new RateLimitError(message, rid, response.headers);\n }\n default:\n return new ChronaryError(message, response.status, rid, response.headers, errorType);\n }\n }\n\n private retryDelay(attempt: number, lastError?: Error): number {\n // Respect Retry-After header\n if (lastError instanceof RateLimitError && lastError.retryAfter) {\n return Math.min(lastError.retryAfter * 1000, MAX_RETRY_DELAY);\n }\n\n // Exponential backoff with jitter: base * 2^attempt + random jitter\n const base = 500;\n const exponential = base * Math.pow(2, attempt - 1);\n const jitter = Math.random() * base;\n return Math.min(exponential + jitter, MAX_RETRY_DELAY);\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Parse the IETF structured-field `RateLimit` and `RateLimit-Policy` headers\n * (draft-ietf-httpapi-ratelimit-headers). Returns `undefined` if either header\n * is missing or unparseable — callers can still reach the raw header strings\n * via `response.headers`.\n *\n * `RateLimit` value example: `\"quota\";r=985477;t=187200`\n * `RateLimit-Policy` value example: `\"quota\";q=1000000;w=2592000;pk=org_abc`\n */\nfunction parseQuotaSnapshot(headers: Headers): QuotaSnapshot | undefined {\n const rateLimit = headers.get('ratelimit');\n const policy = headers.get('ratelimit-policy');\n if (!rateLimit || !policy) return undefined;\n\n const remaining = parseStructuredParam(rateLimit, 'r');\n const resetSeconds = parseStructuredParam(rateLimit, 't');\n const limit = parseStructuredParam(policy, 'q');\n if (remaining === undefined || resetSeconds === undefined || limit === undefined) {\n return undefined;\n }\n\n return {\n limit,\n remaining,\n resetAt: new Date(Date.now() + resetSeconds * 1000),\n };\n}\n\nfunction parseStructuredParam(header: string, key: string): number | undefined {\n // Match `;<key>=<digits>` — guards against partial matches inside other tokens.\n const re = new RegExp(`(?:^|;)\\\\s*${key}=(-?\\\\d+)(?:;|$)`);\n const match = re.exec(header);\n if (!match) return undefined;\n const n = Number(match[1]);\n return Number.isFinite(n) ? n : undefined;\n}\n","import type { PageResponse, Page } from './types';\n\nexport class PageIterator<T> implements AsyncIterable<T> {\n private readonly fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>;\n private readonly defaultLimit: number;\n private readonly initialOffset: number;\n\n constructor(\n fetchPage: (offset: number, limit: number) => PromiseLike<PageResponse<T>>,\n defaultLimit: number = 50,\n initialOffset: number = 0,\n ) {\n this.fetchPage = fetchPage;\n this.defaultLimit = defaultLimit;\n this.initialOffset = initialOffset;\n }\n\n async getPage(offset: number = this.initialOffset, limit?: number): Promise<Page<T>> {\n const l = limit ?? this.defaultLimit;\n const response = await this.fetchPage(offset, l);\n return {\n ...response,\n hasMore: offset + response.data.length < response.total,\n };\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let offset = this.initialOffset;\n const limit = this.defaultLimit;\n\n while (true) {\n const page = await this.fetchPage(offset, limit);\n for (const item of page.data) {\n yield item;\n }\n offset += page.data.length;\n if (offset >= page.total || page.data.length === 0) break;\n }\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register your agent with Chronary. Creates a Chronary identity for an agent\n * that already exists in your system, so it can own calendars, events, and webhooks.\n */\n async create(params: CreateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('POST', '/v1/agents', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('GET', `/v1/agents/${id}`, undefined, undefined, options);\n }\n\n list(params: ListAgentsParams = {}): PageIterator<Agent> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<Agent>(\n (offset, l) =>\n this.client.request<PageResponse<Agent>>('GET', '/v1/agents', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateAgentParams, options?: RequestOptions): Promise<Agent> {\n return this.client.request<Agent>('PATCH', `/v1/agents/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/agents/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class CalendarsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateCalendarParams & { agentId?: string }, options?: RequestOptions): Promise<Calendar> {\n const { agentId, ...body } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return this.client.request<Calendar>('POST', path, body, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('GET', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n list(params: ListCalendarsParams = {}): PageIterator<Calendar> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n const path = agentId ? `/v1/agents/${agentId}/calendars` : '/v1/calendars';\n return new PageIterator<Calendar>(\n (offset, l) =>\n this.client.request<PageResponse<Calendar>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateCalendarParams, options?: RequestOptions): Promise<Calendar> {\n return this.client.request<Calendar>('PATCH', `/v1/calendars/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/calendars/${id}`, undefined, undefined, options);\n }\n\n async getContext(id: string, options?: RequestOptions): Promise<CalendarContext> {\n return this.client.request<CalendarContext>(\n 'GET', `/v1/calendars/${id}/context`, undefined, undefined, options,\n );\n }\n\n async setAvailabilityRules(\n id: string,\n params: SetAvailabilityRulesParams,\n options?: RequestOptions,\n ): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'PUT', `/v1/calendars/${id}/availability-rules`, params, undefined, options,\n );\n }\n\n async getAvailabilityRules(id: string, options?: RequestOptions): Promise<AvailabilityRules> {\n return this.client.request<AvailabilityRules>(\n 'GET', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n\n async deleteAvailabilityRules(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/calendars/${id}/availability-rules`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DeleteEventOptions,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class EventsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(calendarId: string, params: CreateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'POST', `/v1/calendars/${calendarId}/events`, params, undefined, options,\n );\n }\n\n async get(calendarId: string, eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/calendars/${calendarId}/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n list(params: ListEventsParams = {}): PageIterator<CalendarEvent> {\n const { calendarId, agentId, limit = 50, offset = 0, ...filters } = params;\n\n let path: string;\n if (agentId) {\n path = `/v1/agents/${agentId}/events`;\n } else if (calendarId) {\n path = `/v1/calendars/${calendarId}/events`;\n } else {\n throw new Error('Either calendarId or agentId is required for events.list()');\n }\n\n return new PageIterator<CalendarEvent>(\n (offset, l) =>\n this.client.request<PageResponse<CalendarEvent>>('GET', path, undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(calendarId: string, eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/calendars/${calendarId}/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event (or, for a recurring series, the whole series). Pass\n * `occurrence_start` to cancel just one occurrence of a recurring series\n * instead — the series lives on and the updated series master is returned.\n * Plain deletes resolve to void. With `occurrence_start`, fails with 400 if\n * the timestamp is not an active occurrence, or 409 if the event is not a\n * recurring series.\n */\n async delete(calendarId: string, eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void> {\n const { occurrence_start, ...requestOptions } = options ?? {};\n return this.client.request<CalendarEvent | void>(\n 'DELETE',\n `/v1/calendars/${calendarId}/events/${eventId}`,\n undefined,\n occurrence_start !== undefined ? { occurrence_start } : undefined,\n requestOptions,\n );\n }\n\n /**\n * Fetch an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async getById(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'GET', `/v1/events/${eventId}`, undefined, undefined, options,\n );\n }\n\n /**\n * Update an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required.\n */\n async updateById(eventId: string, params: UpdateEventParams, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PATCH', `/v1/events/${eventId}`, params, undefined, options,\n );\n }\n\n /**\n * Delete an event by ID alone. The calendar is resolved internally from the\n * event, so no calendar ID is required. Pass `occurrence_start` to cancel\n * just one occurrence of a recurring series — the series lives on and the\n * updated series master is returned; plain deletes resolve to void. With\n * `occurrence_start`, fails with 400 if the timestamp is not an active\n * occurrence, or 409 if the event is not a recurring series.\n */\n async deleteById(eventId: string, options?: DeleteEventOptions): Promise<CalendarEvent | void> {\n const { occurrence_start, ...requestOptions } = options ?? {};\n return this.client.request<CalendarEvent | void>(\n 'DELETE',\n `/v1/events/${eventId}`,\n undefined,\n occurrence_start !== undefined ? { occurrence_start } : undefined,\n requestOptions,\n );\n }\n\n /**\n * Promote a held event (status='hold') to status='confirmed'. Fails with 409\n * if the event is not a hold, or if the hold has already expired.\n */\n async confirm(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/confirm`, undefined, undefined, options,\n );\n }\n\n /**\n * Manually release a held event before its TTL, freeing the slot. Fails with\n * 409 if the event is not a hold.\n */\n async release(eventId: string, options?: RequestOptions): Promise<CalendarEvent> {\n return this.client.request<CalendarEvent>(\n 'PUT', `/v1/events/${eventId}/release`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n RequestOptions,\n} from '../types';\n\nexport class AvailabilityClient {\n constructor(private readonly client: CoreClient) {}\n\n async forAgent(agentId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/agents/${agentId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async forCalendar(calendarId: string, params: AvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', `/v1/calendars/${calendarId}/availability`, undefined,\n {\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n include_busy: params.include_busy,\n },\n options,\n );\n }\n\n async check(params: CrossAgentAvailabilityParams, options?: RequestOptions): Promise<AvailabilityResponse> {\n return this.client.request<AvailabilityResponse>(\n 'GET', '/v1/availability', undefined,\n {\n agents: params.agents.join(','),\n start: params.start,\n end: params.end,\n duration: params.duration,\n slot_duration: params.slot_duration,\n calendars: params.calendars?.join(','),\n include_busy: params.include_busy,\n },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n ListWebhookDeliveriesParams,\n WebhookDeliveryListResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class WebhooksClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('POST', '/v1/webhooks', params, undefined, options);\n }\n\n async get(id: string, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('GET', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n list(params: ListWebhooksParams = {}): PageIterator<Webhook> {\n const { limit = 20, offset = 0, ...filters } = params;\n return new PageIterator<Webhook>(\n (offset, l) =>\n this.client.request<PageResponse<Webhook>>('GET', '/v1/webhooks', undefined, {\n ...filters,\n limit: l,\n offset,\n }),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateWebhookParams, options?: RequestOptions): Promise<Webhook> {\n return this.client.request<Webhook>('PATCH', `/v1/webhooks/${id}`, params, undefined, options);\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/webhooks/${id}`, undefined, undefined, options);\n }\n\n async listDeliveries(\n webhookId: string,\n params: ListWebhookDeliveriesParams = {},\n options?: RequestOptions,\n ): Promise<WebhookDeliveryListResponse> {\n const { limit = 20, offset = 0, status, include_payload } = params;\n return this.client.request<WebhookDeliveryListResponse>(\n 'GET',\n `/v1/webhooks/${webhookId}/deliveries`,\n undefined,\n { limit, offset, ...(status !== undefined && { status }), ...(include_payload !== undefined && { include_payload }) },\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class ICalSubscriptionsClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(agentId: string, params: CreateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'POST', `/v1/agents/${agentId}/ical-subscriptions`, params, undefined, options,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'GET', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n list(params: ListICalSubscriptionsParams & { agentId: string }): PageIterator<ICalSubscription> {\n const { agentId, limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ICalSubscription>(\n (offset, l) =>\n this.client.request<PageResponse<ICalSubscription>>(\n 'GET', `/v1/agents/${agentId}/ical-subscriptions`, undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async update(id: string, params: UpdateICalSubscriptionParams, options?: RequestOptions): Promise<ICalSubscription> {\n return this.client.request<ICalSubscription>(\n 'PATCH', `/v1/ical-subscriptions/${id}`, params, undefined, options,\n );\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>(\n 'DELETE', `/v1/ical-subscriptions/${id}`, undefined, undefined, options,\n );\n }\n\n async sync(id: string, options?: RequestOptions): Promise<{ status: string }> {\n return this.client.request<{ status: string }>(\n 'POST', `/v1/ical-subscriptions/${id}/sync`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport { PageIterator } from '../pagination';\nimport type {\n Proposal,\n ProposalSummary,\n ProposalResponse,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n PageResponse,\n RequestOptions,\n} from '../types';\n\nexport class SchedulingClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(params: CreateProposalParams, options?: RequestOptions): Promise<ProposalSummary> {\n return this.client.request<ProposalSummary>(\n 'POST', '/v1/scheduling/proposals', params, undefined, options,\n );\n }\n\n list(params: ListProposalsParams = {}): PageIterator<ProposalSummary> {\n const { limit = 50, offset = 0, ...filters } = params;\n return new PageIterator<ProposalSummary>(\n (offset, l) =>\n this.client.request<PageResponse<ProposalSummary>>(\n 'GET', '/v1/scheduling/proposals', undefined,\n { ...filters, limit: l, offset },\n ),\n limit,\n offset,\n );\n }\n\n async get(id: string, options?: RequestOptions): Promise<Proposal> {\n return this.client.request<Proposal>(\n 'GET', `/v1/scheduling/proposals/${id}`, undefined, undefined, options,\n );\n }\n\n async respond(\n id: string,\n params: RespondToProposalParams,\n options?: RequestOptions,\n ): Promise<ProposalResponse> {\n return this.client.request<ProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/respond`, params, undefined, options,\n );\n }\n\n async resolve(id: string, options?: RequestOptions): Promise<ResolveProposalResponse> {\n return this.client.request<ResolveProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/resolve`, undefined, undefined, options,\n );\n }\n\n async cancel(id: string, options?: RequestOptions): Promise<CancelProposalResponse> {\n return this.client.request<CancelProposalResponse>(\n 'POST', `/v1/scheduling/proposals/${id}/cancel`, undefined, undefined, options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { Usage, RequestOptions } from '../types';\n\nexport class UsageClient {\n constructor(private readonly client: CoreClient) {}\n\n async get(options?: RequestOptions): Promise<Usage> {\n return this.client.request<Usage>('GET', '/v1/usage', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AuditLogResponse, ListAuditLogParams, RequestOptions } from '../types';\n\nexport class AuditLogClient {\n constructor(private readonly client: CoreClient) {}\n\n async list(params?: ListAuditLogParams, options?: RequestOptions): Promise<AuditLogResponse> {\n // CoreClient.request serializes the query map into the URL; passing\n // `undefined` values strips them. Keeps the path literal static so the\n // surface-coverage audit script can match it against the canonical route.\n const query: Record<string, string | number | boolean | undefined> = {\n from: params?.from,\n to: params?.to,\n action: params?.action,\n actor_key_prefix: params?.actor_key_prefix,\n cursor: params?.cursor,\n limit: params?.limit,\n };\n return this.client.request<AuditLogResponse>('GET', '/v1/audit-log', undefined, query, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n RequestOptions,\n ScopedApiKey,\n} from '../types';\n\ninterface ListScopedApiKeysResponse {\n keys: ScopedApiKey[];\n}\n\nexport class KeysClient {\n constructor(private readonly client: CoreClient) {}\n\n async create(\n params: CreateScopedApiKeyParams,\n options?: RequestOptions,\n ): Promise<CreatedScopedApiKey> {\n return this.client.request<CreatedScopedApiKey>('POST', '/v1/keys', params, undefined, options);\n }\n\n async list(options?: RequestOptions): Promise<ScopedApiKey[]> {\n const response = await this.client.request<ListScopedApiKeysResponse>(\n 'GET',\n '/v1/keys',\n undefined,\n undefined,\n options,\n );\n return response.keys;\n }\n\n async delete(id: string, options?: RequestOptions): Promise<void> {\n await this.client.request<void>('DELETE', `/v1/keys/${id}`, undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n RequestOptions,\n} from '../types';\n\nexport class AgentAuthClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Register a new agent + org. Sends an OTP to the provided email.\n *\n * No authentication required — callers may construct a `Chronary` client\n * with no `apiKey` to invoke this method.\n *\n * The response is a discriminated union:\n * - **New org path** — returns `org_id`, `agent_id`, and `api_key`.\n * The `api_key` is restricted to the verify endpoint until the OTP\n * is submitted successfully; after verification it unlocks the full API.\n * - **Existing-org dedup** — returns only `message`. No credentials are\n * leaked when the email matches an existing org (enumeration defense).\n *\n * Use `isAgentSignUpNewOrg()` to narrow the union before accessing keys.\n *\n * @throws ChronaryError (409 `tos_version_stale`) if `tos_version` is not\n * the currently-published version — retry with the value from the\n * `current_version` field on the error body.\n */\n async signUp(\n params: AgentSignUpParams,\n options?: RequestOptions,\n ): Promise<AgentSignUpResponse> {\n return this.client.request<AgentSignUpResponse>(\n 'POST',\n '/v1/agent/sign-up',\n params,\n undefined,\n options,\n );\n }\n\n /**\n * Submit the OTP sent during `signUp()` to unlock the API key.\n *\n * Must be invoked on a `Chronary` client constructed with the restricted\n * `api_key` returned by `signUp()` — NOT on the client that issued\n * `signUp()` itself (which had no key).\n *\n * @throws ChronaryError (status 400) when the OTP is wrong or expired.\n * The SDK's `ValidationError` class is reserved for HTTP 422; the\n * API returns 400 for invalid/expired OTPs, which surfaces as a\n * generic `ChronaryError` with the original message.\n */\n async verify(\n params: AgentVerifyParams,\n options?: RequestOptions,\n ): Promise<AgentVerifyResponse> {\n return this.client.request<AgentVerifyResponse>(\n 'POST',\n '/v1/agent/verify',\n params,\n undefined,\n options,\n );\n }\n}\n\n/**\n * Type guard — narrows an `AgentSignUpResponse` to the new-org branch.\n * The existing-org dedup branch returns only `message`, so this is the\n * caller's cue that credentials are present.\n */\nexport function isAgentSignUpNewOrg(\n response: AgentSignUpResponse,\n): response is AgentSignUpNewOrgResponse {\n return 'api_key' in response;\n}\n","import type { CoreClient } from '../client';\nimport type {\n WaitlistJoinParams,\n WaitlistJoinResponse,\n RequestOptions,\n} from '../types';\n\nexport class WaitlistClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Join the Chronary waitlist (#442). Used during private preview when open\n * signup is gated. Creates a real organization row flagged as\n * `is_waitlisted: true`; an admin flips the flag to activate the account.\n *\n * No authentication required — invoke on a `Chronary` client constructed\n * with no `apiKey`.\n *\n * Idempotent on repeat hits: a second call with the same email returns\n * the existing waitlisted org instead of erroring. An active (non-waitlisted)\n * account at the same email returns 409 `email_taken`.\n *\n * @throws ChronaryError (409 `email_taken`) when an active account already\n * exists for this email — direct the user to sign-in instead.\n * @throws ChronaryError (409 `tos_version_stale`) when the supplied\n * `tos_version` doesn't match the currently-published version.\n * @throws ChronaryError (429 `rate_limit_error`) on the per-IP / per-email\n * waitlist limiter.\n */\n async join(\n params: WaitlistJoinParams,\n options?: RequestOptions,\n ): Promise<WaitlistJoinResponse> {\n return this.client.request<WaitlistJoinResponse>(\n 'POST',\n '/v1/waitlist',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type {\n FeedbackAcceptedResponse,\n RequestOptions,\n SubmitFeedbackParams,\n} from '../types';\n\nexport class FeedbackClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Submit structured feedback (bug, feature, or friction) to Chronary.\n *\n * Rate-limited to 25 submissions per day per organization (UTC day).\n * Available on all plans, including free. The 26th submission returns\n * HTTP 429 with a `Retry-After` header set to the seconds until the\n * next UTC midnight.\n */\n async submit(\n params: SubmitFeedbackParams,\n options?: RequestOptions,\n ): Promise<FeedbackAcceptedResponse> {\n return this.client.request<FeedbackAcceptedResponse>(\n 'POST',\n '/v1/feedback',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { PlansListResponse, RequestOptions } from '../types';\n\nexport class PlansClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Fetch the public plan catalog (`GET /v1/plans`).\n *\n * Returns all sellable tiers (free, pro, scale) plus the enterprise\n * tier with `custom_pricing: true`. No authentication required.\n * Responses are cacheable for 5 minutes at the edge.\n */\n async list(options?: RequestOptions): Promise<PlansListResponse> {\n return this.client.request<PlansListResponse>('GET', '/v1/plans', undefined, undefined, options);\n }\n}\n","import type { CoreClient } from '../client';\nimport type { DataExport, RequestOptions } from '../types';\n\nexport class AccountClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Export every row this org owns as a single JSON payload (GDPR Art. 15 + 20\n * portability / CCPA right-to-know / EU Data Act interoperability).\n *\n * **Authentication:** This endpoint is JWT-only — it returns decrypted\n * webhook secrets and iCal subscription URLs that aren't normally accessible\n * via API-key endpoints. Configure the SDK with a console JWT (e.g. cookie\n * value or Bearer token from the console session) as the `apiKey` config to\n * call this. API keys (`chr_sk_*` / `chr_ak_*`) will return 401.\n *\n * In most cases, end users should download via the console UI at\n * `console.chronary.ai/settings`. The SDK method exists for programmatic\n * use cases (e.g. server-side compliance tooling holding a delegated JWT).\n *\n * **Rate limit:** 10 exports/hour/org.\n */\n async export(options?: RequestOptions): Promise<DataExport> {\n return this.client.request<DataExport>(\n 'GET',\n '/v1/auth/export',\n undefined,\n undefined,\n options,\n );\n }\n}\n","import type { CoreClient } from '../client';\nimport type { AcceptTermsParams, AcceptTermsResult, RequestOptions } from '../types';\n\nexport class TermsClient {\n constructor(private readonly client: CoreClient) {}\n\n /**\n * Re-accept the current Chronary terms of service for the calling org.\n *\n * Use this when a response carries the `Chronary-Terms-Upgrade-Required`\n * header after a material ToS bump — it clears the upgrade requirement for\n * Bearer-key (SDK / MCP) clients that have no console session. Read the\n * current version from `GET /v1/auth/terms/current` and pass it verbatim.\n *\n * **Authentication:** org-level API keys (`chr_sk_*`) only — agent-scoped\n * keys cannot accept org-wide terms (403). A stale version returns 409\n * `tos_version_stale` with the current version in the error body.\n */\n async accept(params: AcceptTermsParams, options?: RequestOptions): Promise<AcceptTermsResult> {\n return this.client.request<AcceptTermsResult>(\n 'POST',\n '/v1/terms/accept',\n params,\n undefined,\n options,\n );\n }\n}\n","import type { WebhookEvent, VerifyOptions } from './types';\nimport { ChronaryError } from './error';\n\nconst DEFAULT_TOLERANCE = 5 * 60 * 1000; // 5 minutes\n\nfunction bufToHex(buf: ArrayBuffer): string {\n return Array.from(new Uint8Array(buf))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nasync function computeSignature(secret: string, timestamp: string, payload: string): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const message = encoder.encode(`${timestamp}.${payload}`);\n const sig = await crypto.subtle.sign('HMAC', key, message);\n return `sha256=${bufToHex(sig)}`;\n}\n\nfunction constantTimeEqual(a: string, b: string): boolean {\n const encoder = new TextEncoder();\n const aBuf = encoder.encode(a);\n const bBuf = encoder.encode(b);\n if (aBuf.length !== bBuf.length) return false;\n let diff = 0;\n for (let i = 0; i < aBuf.length; i++) diff |= aBuf[i] ^ bBuf[i];\n return diff === 0;\n}\n\nfunction getHeader(headers: Headers | Record<string, string>, name: string): string | null {\n if (headers instanceof Headers) return headers.get(name);\n\n const record = headers as Record<string, string>;\n const direct = record[name] ?? record[name.toLowerCase()];\n if (direct !== undefined) return direct;\n\n const lowerName = name.toLowerCase();\n for (const [key, value] of Object.entries(record)) {\n if (key.toLowerCase() === lowerName) return value;\n }\n return null;\n}\n\nfunction extractHeaders(headers: Headers | Record<string, string>): { signature: string; timestamp: string } {\n const get = (name: string): string | null => {\n return getHeader(headers, name);\n };\n\n const signature = get('X-Signature') ?? get('x-signature');\n const timestamp = get('X-Timestamp') ?? get('x-timestamp');\n\n if (!signature) throw new ChronaryError('Missing X-Signature header', 0);\n if (!timestamp) throw new ChronaryError('Missing X-Timestamp header', 0);\n\n return { signature, timestamp };\n}\n\nexport async function verifySignature(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<void> {\n if (typeof rawBody !== 'string') {\n throw new ChronaryError(\n 'rawBody must be a string. If you parsed the JSON body, pass the raw string instead.',\n 0,\n );\n }\n\n const { signature, timestamp } = extractHeaders(headers);\n const tolerance = options?.tolerance ?? DEFAULT_TOLERANCE;\n\n // Timestamp tolerance check for replay prevention\n const tsMs = parseInt(timestamp, 10) * 1000;\n const now = Date.now();\n if (Math.abs(now - tsMs) > tolerance) {\n throw new ChronaryError(\n `Webhook timestamp too old. Received ${timestamp}, current time ${Math.floor(now / 1000)}. Tolerance: ${tolerance / 1000}s`,\n 0,\n );\n }\n\n const expected = await computeSignature(secret, timestamp, rawBody);\n if (!constantTimeEqual(expected, signature)) {\n throw new ChronaryError('Webhook signature verification failed', 0);\n }\n}\n\nexport async function constructEvent(\n rawBody: string,\n headers: Headers | Record<string, string>,\n secret: string,\n options?: VerifyOptions,\n): Promise<WebhookEvent> {\n await verifySignature(rawBody, headers, secret, options);\n\n const type = getHeader(headers, 'X-Chronary-Event-Type');\n if (!type) throw new ChronaryError('Missing X-Chronary-Event-Type header', 0);\n\n const data = JSON.parse(rawBody);\n return { type, data } as WebhookEvent;\n}\n","import { CoreClient } from './client';\nimport { AgentsClient } from './resources/agents';\nimport { CalendarsClient } from './resources/calendars';\nimport { EventsClient } from './resources/events';\nimport { AvailabilityClient } from './resources/availability';\nimport { WebhooksClient } from './resources/webhooks';\nimport { ICalSubscriptionsClient } from './resources/ical-subscriptions';\nimport { SchedulingClient } from './resources/scheduling';\nimport { UsageClient } from './resources/usage';\nimport { AuditLogClient } from './resources/audit-log';\nimport { KeysClient } from './resources/keys';\nimport { AgentAuthClient } from './resources/agent-auth';\nimport { WaitlistClient } from './resources/waitlist';\nimport { FeedbackClient } from './resources/feedback';\nimport { PlansClient } from './resources/plans';\nimport { AccountClient } from './resources/account';\nimport { TermsClient } from './resources/terms';\nimport { verifySignature, constructEvent } from './webhook-verify';\nimport type { ChronaryConfig } from './types';\n\nexport class Chronary {\n readonly agents: AgentsClient;\n readonly calendars: CalendarsClient;\n readonly events: EventsClient;\n readonly availability: AvailabilityClient;\n readonly webhooks: WebhooksClient;\n readonly icalSubscriptions: ICalSubscriptionsClient;\n readonly scheduling: SchedulingClient;\n readonly usage: UsageClient;\n readonly auditLog: AuditLogClient;\n readonly keys: KeysClient;\n readonly agentAuth: AgentAuthClient;\n readonly waitlist: WaitlistClient;\n readonly feedback: FeedbackClient;\n readonly plans: PlansClient;\n readonly account: AccountClient;\n readonly terms: TermsClient;\n\n constructor(config?: ChronaryConfig) {\n const client = new CoreClient(config);\n this.agents = new AgentsClient(client);\n this.calendars = new CalendarsClient(client);\n this.events = new EventsClient(client);\n this.availability = new AvailabilityClient(client);\n this.webhooks = new WebhooksClient(client);\n this.icalSubscriptions = new ICalSubscriptionsClient(client);\n this.scheduling = new SchedulingClient(client);\n this.usage = new UsageClient(client);\n this.auditLog = new AuditLogClient(client);\n this.keys = new KeysClient(client);\n this.agentAuth = new AgentAuthClient(client);\n this.waitlist = new WaitlistClient(client);\n this.feedback = new FeedbackClient(client);\n this.plans = new PlansClient(client);\n this.account = new AccountClient(client);\n this.terms = new TermsClient(client);\n }\n\n static webhooks = {\n verifySignature,\n constructEvent,\n };\n}\n\n// Re-export everything\nexport { CoreClient } from './client';\nexport { APIPromise } from './api-promise';\nexport type { QuotaSnapshot, RawResponse, WithResponse } from './api-promise';\nexport { PageIterator } from './pagination';\nexport { verifySignature, constructEvent } from './webhook-verify';\nexport { VERSION } from './version';\nexport { isAgentSignUpNewOrg } from './resources/agent-auth';\n\nexport {\n ChronaryError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n QuotaExceededError,\n TimeoutError,\n ConnectionError,\n} from './error';\n\nexport type {\n ChronaryConfig,\n LogLevel,\n AppInfo,\n RequestOptions,\n PageResponse,\n Page,\n Agent,\n CreateAgentParams,\n UpdateAgentParams,\n ListAgentsParams,\n Calendar,\n CreateCalendarParams,\n UpdateCalendarParams,\n ListCalendarsParams,\n CalendarContext,\n AgentStatus,\n AvailabilityRules,\n SetAvailabilityRulesParams,\n WorkingHours,\n WorkingHoursDay,\n CalendarEvent,\n CreateEventParams,\n UpdateEventParams,\n ListEventsParams,\n DeleteEventOptions,\n SlotDuration,\n AvailabilitySlot,\n BusyBlock,\n AvailabilityParams,\n CrossAgentAvailabilityParams,\n AvailabilityResponse,\n Webhook,\n CreateWebhookParams,\n UpdateWebhookParams,\n ListWebhooksParams,\n WebhookDelivery,\n WebhookDeliveryStats,\n WebhookDeliveryListResponse,\n ListWebhookDeliveriesParams,\n ICalSubscription,\n CreateICalSubscriptionParams,\n UpdateICalSubscriptionParams,\n ListICalSubscriptionsParams,\n Proposal,\n ProposalSummary,\n ProposalSlot,\n ProposalResponse,\n ProposalStatus,\n ProposalResponseAction,\n CreateProposalParams,\n RespondToProposalParams,\n ListProposalsParams,\n ResolveProposalResponse,\n CancelProposalResponse,\n Usage,\n UsageMetric,\n AuditLogEntry,\n ListAuditLogParams,\n AuditLogResponse,\n ScopedApiKey,\n CreatedScopedApiKey,\n CreateScopedApiKeyParams,\n AcceptTermsParams,\n AcceptTermsResult,\n AgentSignUpParams,\n AgentSignUpResponse,\n AgentSignUpNewOrgResponse,\n AgentSignUpExistingOrgResponse,\n AgentVerifyParams,\n AgentVerifyResponse,\n WaitlistJoinParams,\n WaitlistJoinResponse,\n WaitlistedOrg,\n FeedbackType,\n SubmitFeedbackParams,\n FeedbackAcceptedResponse,\n PlanId,\n PlanLimits,\n Plan,\n PlansListResponse,\n WebhookEventType,\n WebhookEvent,\n VerifyOptions,\n DataExport,\n} from './types';\n\nexport default Chronary;\n"],"mappings":"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","names":["offset","offset","offset","offset","offset","offset"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chronary/sdk",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Official TypeScript SDK for the Chronary calendar-as-a-service API",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",