@exayard/sdk 0.3.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.
@@ -0,0 +1,554 @@
1
+ import { type OperationInput, type OperationMethods, type OperationName, type OperationOutput } from './_generated/operations';
2
+ import { WebhookListeners } from './listeners';
3
+ import { type CallOptions } from './options';
4
+ import { constructWebhookEvent, type WebhookEventType } from './webhooks';
5
+ /**
6
+ * Configuration for the Exayard SDK client.
7
+ */
8
+ export interface ExayardOptions {
9
+ /**
10
+ * An API key: an `exa_live_...` or `exa_test_...` key from an app on the Developer page, or an older `ak_...` key or
11
+ * `xa_app_...` app secret. Defaults to the EXAYARD_API_KEY environment variable. This or `bearerToken` is required.
12
+ */
13
+ apiKey?: string | undefined;
14
+ /** OAuth access token (a sign-in from `exayard login`, or a connected app). */
15
+ bearerToken?: string | undefined;
16
+ /**
17
+ * The company calls act in when they name none. Optional: a company key, or an `exa_` key bound to its own
18
+ * company, already implies it. A personal key or sign-in that belongs to several companies names one here or per call.
19
+ */
20
+ organizationId?: string | undefined;
21
+ /**
22
+ * Your own id for the person or account calls are made for, sent on every call as the `Exayard-End-User` header
23
+ * and recorded on its usage. Override per call with `{ endUser }`. 1 to 128 printable characters; never an email.
24
+ */
25
+ endUser?: string | undefined;
26
+ /** Override the base URL. Defaults to https://api.exayard.com/v1. */
27
+ baseUrl?: string | undefined;
28
+ /** Timeout for each attempt, in ms. Defaults to 60000. */
29
+ timeoutMs?: number;
30
+ /** Retries after a 429, a 5xx or a dropped connection, honouring Retry-After. Defaults to 2; 0 turns retries off. */
31
+ maxRetries?: number;
32
+ /** Optional fetch override — for tests or custom runtimes. */
33
+ fetch?: typeof fetch;
34
+ }
35
+ export type VendorQuoteStatus = NonNullable<OperationInput<'list_vendor_quotes'>['status']>;
36
+ export type VendorQuoteLineItem = NonNullable<OperationInput<'create_vendor_quote'>['lineItems']>[number];
37
+ /**
38
+ * Public-link state of a document, returned by `documents.setSharing`.
39
+ *
40
+ * `shareSecret` and `sharePath` are present ONLY while sharing is enabled —
41
+ * the secret is what makes the link work, so a disabled document never echoes
42
+ * it back. Never read `sharePath` unconditionally.
43
+ */
44
+ export type DocumentShare = OperationOutput<'set_document_sharing'>;
45
+ /** A takeoff line item the bid estimator skipped for a missing formula variable. */
46
+ export type BidWarning = NonNullable<OperationOutput<'create_bid'>['warnings']>[number];
47
+ /**
48
+ * Result of a blocking estimate/bid generation that persisted a document.
49
+ * `documentUrl` is app-relative (not an absolute URL): the public share path
50
+ * when the request set `share: true`, the signed-in path otherwise.
51
+ */
52
+ export type GeneratedDocument = OperationOutput<'create_estimate'>;
53
+ /** A company scope for the curated resource methods: optional, as on every call. */
54
+ type OrgQuery = {
55
+ organizationId?: string;
56
+ };
57
+ export declare class Exayard {
58
+ private readonly credential;
59
+ private readonly baseUrl;
60
+ private readonly timeoutMs;
61
+ private readonly maxRetries;
62
+ private readonly fetchImpl;
63
+ private readonly defaultOrganizationId?;
64
+ private readonly defaultEndUser?;
65
+ constructor(opts?: ExayardOptions);
66
+ /** The company a call names, else the client's default; undefined lets the key imply it. */
67
+ private organizationFor;
68
+ private attempt;
69
+ private toError;
70
+ private request;
71
+ /**
72
+ * Call any API operation by its name: the spec's operationId, which is also
73
+ * its MCP tool name and its CLI command. The input is the operation's path,
74
+ * query and body fields merged flat, the same input its MCP tool takes.
75
+ */
76
+ call<N extends OperationName>(name: N, input: OperationInput<N>, opts?: CallOptions): Promise<OperationOutput<N>>;
77
+ /**
78
+ * Every API operation as a typed method, generated from the API spec:
79
+ * `exa.api.listVendorQuotes({ id: projectId })`.
80
+ */
81
+ readonly api: OperationMethods;
82
+ readonly me: {
83
+ get: () => Promise<{
84
+ clerkUserId: string | null;
85
+ clerkOrgId?: string;
86
+ tokenType: 'api_key' | 'oauth_token' | 'session_token' | 'agent_jwt' | 'app_secret';
87
+ memberships: Array<{
88
+ orgId: string;
89
+ role?: string;
90
+ }>;
91
+ app?: {
92
+ publicId: string;
93
+ name: string;
94
+ };
95
+ organizationId?: string;
96
+ }>;
97
+ };
98
+ readonly projects: {
99
+ list: (query: OperationInput<'list_projects'>) => Promise<{
100
+ [key: string]: unknown;
101
+ _id: string;
102
+ _creationTime: number;
103
+ organizationId: string;
104
+ name: string;
105
+ status: 'lead' | 'contacted' | 'qualified' | 'active' | 'archived';
106
+ secret?: string;
107
+ privacy?: 'private' | 'unlisted' | 'public';
108
+ createdAt: number;
109
+ updatedAt: number;
110
+ }[]>;
111
+ get: (id: string, query?: OrgQuery) => Promise<{
112
+ [key: string]: unknown;
113
+ _id: string;
114
+ _creationTime: number;
115
+ organizationId: string;
116
+ name: string;
117
+ status: 'lead' | 'contacted' | 'qualified' | 'active' | 'archived';
118
+ secret?: string;
119
+ privacy?: 'private' | 'unlisted' | 'public';
120
+ createdAt: number;
121
+ updatedAt: number;
122
+ }>;
123
+ create: (body: OperationInput<'create_project'>, opts?: CallOptions) => Promise<{
124
+ id: string;
125
+ secret: string;
126
+ }>;
127
+ export: (id: string, query?: OrgQuery) => Promise<unknown>;
128
+ archive: (id: string, query?: OrgQuery) => Promise<void>;
129
+ };
130
+ readonly files: {
131
+ presign: (body: OperationInput<'presign_file_upload'>) => Promise<{
132
+ fileId: string;
133
+ uploadUrl: string;
134
+ r2Key: string;
135
+ expiresAt: number;
136
+ filename: string;
137
+ }>;
138
+ confirm: (fileId: string, r2Key: string) => Promise<{
139
+ analysisSkipped: boolean;
140
+ }>;
141
+ upload: (body: {
142
+ projectId: string;
143
+ filename: string;
144
+ mimeType: string;
145
+ bytes: Uint8Array | ArrayBuffer;
146
+ folderId?: string;
147
+ }) => Promise<{
148
+ fileId: string;
149
+ }>;
150
+ };
151
+ readonly pages: {
152
+ list: (projectId: string, query?: OrgQuery) => Promise<unknown[]>;
153
+ };
154
+ readonly assessments: {
155
+ list: (projectId: string) => Promise<{
156
+ [key: string]: unknown;
157
+ _id: string;
158
+ _creationTime: number;
159
+ organizationId: string;
160
+ projectId: string;
161
+ status?: string;
162
+ createdAt?: number;
163
+ updatedAt?: number;
164
+ usage?: {
165
+ credits: number;
166
+ amount: number;
167
+ currency: string;
168
+ };
169
+ }[]>;
170
+ latest: (projectId: string) => Promise<{
171
+ [key: string]: unknown;
172
+ _id: string;
173
+ _creationTime: number;
174
+ organizationId: string;
175
+ projectId: string;
176
+ status?: string;
177
+ createdAt?: number;
178
+ updatedAt?: number;
179
+ usage?: {
180
+ credits: number;
181
+ amount: number;
182
+ currency: string;
183
+ };
184
+ takeoffOutcome?: {
185
+ assessmentId: string;
186
+ measured: {
187
+ items: Array<{
188
+ name: string;
189
+ quantity: number;
190
+ unit: string;
191
+ }>;
192
+ moreCount: number;
193
+ ruleVersion: string;
194
+ computedAt: number;
195
+ } | null;
196
+ measuredPairCount: number;
197
+ emptyPairCount: number;
198
+ causeCounts: Record<string, unknown>;
199
+ emptyPairs: Array<{
200
+ item: string;
201
+ sheet: string;
202
+ elementId: string;
203
+ pageId: string;
204
+ cause: 'found-none' | 'no-shape' | 'no-count-view' | 'no-scale' | 'no-symbol' | 'not-an-asked-item' | 'not-on-this-sheet' | 'not-read' | 'failed' | 'no-reason-recorded';
205
+ reason: string;
206
+ }>;
207
+ truncated: boolean;
208
+ };
209
+ } | null>;
210
+ get: (id: string) => Promise<{
211
+ [key: string]: unknown;
212
+ _id: string;
213
+ _creationTime: number;
214
+ organizationId: string;
215
+ projectId: string;
216
+ status?: string;
217
+ createdAt?: number;
218
+ updatedAt?: number;
219
+ usage?: {
220
+ credits: number;
221
+ amount: number;
222
+ currency: string;
223
+ };
224
+ takeoffOutcome?: {
225
+ assessmentId: string;
226
+ measured: {
227
+ items: Array<{
228
+ name: string;
229
+ quantity: number;
230
+ unit: string;
231
+ }>;
232
+ moreCount: number;
233
+ ruleVersion: string;
234
+ computedAt: number;
235
+ } | null;
236
+ measuredPairCount: number;
237
+ emptyPairCount: number;
238
+ causeCounts: Record<string, unknown>;
239
+ emptyPairs: Array<{
240
+ item: string;
241
+ sheet: string;
242
+ elementId: string;
243
+ pageId: string;
244
+ cause: 'found-none' | 'no-shape' | 'no-count-view' | 'no-scale' | 'no-symbol' | 'not-an-asked-item' | 'not-on-this-sheet' | 'not-read' | 'failed' | 'no-reason-recorded';
245
+ reason: string;
246
+ }>;
247
+ truncated: boolean;
248
+ };
249
+ }>;
250
+ takeoffSummary: (projectId: string) => Promise<{
251
+ [key: string]: unknown;
252
+ totalSymbols: number;
253
+ count: number;
254
+ linear: number;
255
+ area: number;
256
+ categories: Record<string, unknown>;
257
+ elements?: Array<{
258
+ symbolId: string;
259
+ name: string;
260
+ type: 'count' | 'linear' | 'area' | 'volume';
261
+ quantity: number;
262
+ unit: 'feet' | 'meter' | null | null;
263
+ uncalibrated?: boolean;
264
+ }>;
265
+ unverifiedSuggestions?: Array<{
266
+ symbolId: string;
267
+ name: string;
268
+ type: 'count' | 'linear' | 'area' | 'volume';
269
+ category: string;
270
+ found: number;
271
+ reason?: string;
272
+ }>;
273
+ unverifiedSuggestionsNote?: string;
274
+ takeoffOutcome?: {
275
+ assessmentId: string;
276
+ measured: {
277
+ items: Array<{
278
+ name: string;
279
+ quantity: number;
280
+ unit: string;
281
+ }>;
282
+ moreCount: number;
283
+ ruleVersion: string;
284
+ computedAt: number;
285
+ } | null;
286
+ measuredPairCount: number;
287
+ emptyPairCount: number;
288
+ causeCounts: Record<string, unknown>;
289
+ emptyPairs: Array<{
290
+ item: string;
291
+ sheet: string;
292
+ elementId: string;
293
+ pageId: string;
294
+ cause: 'found-none' | 'no-shape' | 'no-count-view' | 'no-scale' | 'no-symbol' | 'not-an-asked-item' | 'not-on-this-sheet' | 'not-read' | 'failed' | 'no-reason-recorded';
295
+ reason: string;
296
+ }>;
297
+ truncated: boolean;
298
+ };
299
+ }>;
300
+ propose: (projectId: string, body: Omit<OperationInput<'propose_analysis'>, 'id'>) => Promise<{
301
+ projectId: string;
302
+ pageIds: Array<string>;
303
+ fileIds?: Array<string>;
304
+ elements: Array<{
305
+ id: string;
306
+ name: string;
307
+ category: 'area' | 'linear' | 'count';
308
+ hexColor: string;
309
+ }>;
310
+ prompt: string;
311
+ sample?: true;
312
+ }>;
313
+ run: (projectId: string, body: Omit<OperationInput<'run_approved_analysis'>, 'id'>, opts?: CallOptions) => Promise<{
314
+ _uiType?: 'analysisRunning';
315
+ assessmentId: string;
316
+ pageIds: Array<string>;
317
+ }>;
318
+ };
319
+ readonly estimates: {
320
+ create: (projectId: string, body: Omit<OperationInput<'create_estimate'>, 'id'>, opts?: CallOptions) => Promise<{
321
+ documentId: string;
322
+ documentUrl?: string;
323
+ text: string;
324
+ html: string;
325
+ sourceFiles: Array<string>;
326
+ sample?: true;
327
+ usage?: {
328
+ credits: number;
329
+ amount: number;
330
+ currency: string;
331
+ };
332
+ }>;
333
+ };
334
+ readonly bids: {
335
+ create: (projectId: string, body: Omit<OperationInput<'create_bid'>, 'id'>, opts?: CallOptions) => Promise<{
336
+ documentId: string;
337
+ documentUrl?: string;
338
+ text: string;
339
+ html: string;
340
+ sourceFiles: Array<string>;
341
+ usage?: {
342
+ credits: number;
343
+ amount: number;
344
+ currency: string;
345
+ };
346
+ warnings?: Array<{
347
+ symbolName: string;
348
+ symbolType: 'count' | 'linear' | 'area';
349
+ symbolColor: string;
350
+ lineItemName: string;
351
+ lineItemIndex: number;
352
+ missingFields: Array<string>;
353
+ }>;
354
+ total?: number;
355
+ clientOptionCount?: number;
356
+ notInTotalCurrency?: {
357
+ lineCount: number;
358
+ currencies: Array<string>;
359
+ note: string;
360
+ };
361
+ notPriced?: Array<{
362
+ name: string;
363
+ reason?: string;
364
+ kind?: 'no-quantity' | 'withheld';
365
+ causes?: Array<'found-none' | 'no-shape' | 'no-count-view' | 'no-scale' | 'no-symbol' | 'not-an-asked-item' | 'not-on-this-sheet' | 'not-read' | 'failed' | 'no-reason-recorded'>;
366
+ }>;
367
+ takeoffOutcome?: {
368
+ assessmentId: string;
369
+ measured: {
370
+ items: Array<{
371
+ name: string;
372
+ quantity: number;
373
+ unit: string;
374
+ }>;
375
+ moreCount: number;
376
+ ruleVersion: string;
377
+ computedAt: number;
378
+ } | null;
379
+ measuredPairCount: number;
380
+ emptyPairCount: number;
381
+ causeCounts: Record<string, unknown>;
382
+ emptyPairs: Array<{
383
+ item: string;
384
+ sheet: string;
385
+ elementId: string;
386
+ pageId: string;
387
+ cause: 'found-none' | 'no-shape' | 'no-count-view' | 'no-scale' | 'no-symbol' | 'not-an-asked-item' | 'not-on-this-sheet' | 'not-read' | 'failed' | 'no-reason-recorded';
388
+ reason: string;
389
+ }>;
390
+ truncated: boolean;
391
+ };
392
+ sample?: true;
393
+ }>;
394
+ };
395
+ readonly documents: {
396
+ list: (query: OperationInput<'list_org_documents'>) => Promise<{
397
+ [key: string]: unknown;
398
+ _id: string;
399
+ _creationTime: number;
400
+ organizationId: string;
401
+ projectId?: string;
402
+ name?: string;
403
+ type?: string;
404
+ createdAt?: number;
405
+ updatedAt?: number;
406
+ sample?: true;
407
+ }[]>;
408
+ listByProject: (projectId: string, query?: OrgQuery) => Promise<{
409
+ [key: string]: unknown;
410
+ _id: string;
411
+ _creationTime: number;
412
+ organizationId: string;
413
+ projectId?: string;
414
+ name?: string;
415
+ type?: string;
416
+ createdAt?: number;
417
+ updatedAt?: number;
418
+ sample?: true;
419
+ }[]>;
420
+ get: (id: string, query?: OrgQuery) => Promise<{
421
+ [key: string]: unknown;
422
+ _id: string;
423
+ _creationTime: number;
424
+ organizationId: string;
425
+ projectId?: string;
426
+ name?: string;
427
+ type?: string;
428
+ createdAt?: number;
429
+ updatedAt?: number;
430
+ sample?: true;
431
+ }>;
432
+ setSharing: (id: string, body: {
433
+ organizationId?: string;
434
+ enabled: boolean;
435
+ }, opts?: CallOptions) => Promise<{
436
+ id: string;
437
+ name?: string;
438
+ shareEnabled: boolean;
439
+ shareSecret?: string;
440
+ sharePath?: string;
441
+ }>;
442
+ };
443
+ readonly quotes: {
444
+ list: (projectId: string, query: {
445
+ organizationId?: string;
446
+ status?: VendorQuoteStatus;
447
+ }) => Promise<{
448
+ [key: string]: unknown;
449
+ _id: string;
450
+ _creationTime: number;
451
+ organizationId: string;
452
+ projectId: string;
453
+ vendorId: string;
454
+ quoteNumber: string;
455
+ status: 'requested' | 'received' | 'accepted' | 'rejected' | 'expired';
456
+ subtotal: number;
457
+ total: number;
458
+ }[]>;
459
+ get: (id: string, query?: OrgQuery) => Promise<{
460
+ [key: string]: unknown;
461
+ _id: string;
462
+ _creationTime: number;
463
+ organizationId: string;
464
+ projectId: string;
465
+ vendorId: string;
466
+ quoteNumber: string;
467
+ status: 'requested' | 'received' | 'accepted' | 'rejected' | 'expired';
468
+ subtotal: number;
469
+ total: number;
470
+ }>;
471
+ create: (projectId: string, body: Omit<OperationInput<'create_vendor_quote'>, 'id'>, opts?: CallOptions) => Promise<{
472
+ id: string;
473
+ }>;
474
+ receive: (id: string, body: Omit<OperationInput<'receive_vendor_quote'>, 'id'>, opts?: CallOptions) => Promise<{
475
+ id: string;
476
+ }>;
477
+ updateStatus: (id: string, body: Omit<OperationInput<'update_vendor_quote_status'>, 'id'>, opts?: CallOptions) => Promise<{
478
+ id: string;
479
+ }>;
480
+ };
481
+ readonly help: {
482
+ search: (body: OperationInput<'search_help_articles'>) => Promise<{
483
+ results: Array<{
484
+ id: string;
485
+ section: string;
486
+ title: string;
487
+ description: string;
488
+ url: string;
489
+ score: number;
490
+ matchedTerms: Array<string>;
491
+ }>;
492
+ total: number;
493
+ }>;
494
+ };
495
+ readonly webhooks: {
496
+ listEndpoints: (query?: OrgQuery) => Promise<{
497
+ _id: string;
498
+ organizationId: string;
499
+ url: string;
500
+ events: Array<string>;
501
+ description?: string;
502
+ status: 'active' | 'paused';
503
+ createdAt: number;
504
+ updatedAt: number;
505
+ }[]>;
506
+ createEndpoint: (body: OperationInput<'create_webhook_endpoint'>) => Promise<{
507
+ id: string;
508
+ secret: string;
509
+ }>;
510
+ deleteEndpoint: (id: string, query?: OrgQuery) => Promise<void>;
511
+ listDeliveries: (id: string, query?: {
512
+ organizationId?: string;
513
+ limit?: number;
514
+ }) => Promise<{
515
+ _id: string;
516
+ _creationTime: number;
517
+ endpointId: string;
518
+ organizationId: string;
519
+ eventId: string;
520
+ event: string;
521
+ payload: string;
522
+ status: 'pending' | 'retrying' | 'success' | 'failed';
523
+ attempts: number;
524
+ responseStatus?: number;
525
+ responseBody?: string;
526
+ failureReason?: string;
527
+ deliveredAt?: number;
528
+ nextAttemptAt?: number;
529
+ createdAt: number;
530
+ updatedAt: number;
531
+ test?: boolean;
532
+ resendOf?: string;
533
+ }[]>;
534
+ /** Send a test event of one type to an endpoint, signed as usual, its body marked `"test": true`. */
535
+ sendTestEvent: (id: string, body: {
536
+ type: WebhookEventType;
537
+ organizationId?: string;
538
+ }, opts?: CallOptions) => Promise<{
539
+ deliveryId: string;
540
+ eventId: string;
541
+ }>;
542
+ /** Send a delivery again, as a new delivery with the same event id and body. */
543
+ resendDelivery: (deliveryId: string, body?: OrgQuery, opts?: CallOptions) => Promise<unknown>;
544
+ /** Receive the company's events over a stream, without a public endpoint (what `exayard listen` runs on). */
545
+ listeners: WebhookListeners;
546
+ /**
547
+ * Parse + verify an inbound webhook delivery: `constructEvent(rawBody, signatureHeader, secret)`. Throws
548
+ * WebhookSignatureError on any signature failure — always catch and return 400 to let us retry.
549
+ */
550
+ constructEvent: typeof constructWebhookEvent;
551
+ };
552
+ }
553
+ export {};
554
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}