@serviceai/api-spec 1.2.433 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/openapi.json +2415 -141
  2. package/openapi.yaml +1837 -172
  3. package/package.json +1 -1
  4. package/types.d.ts +1033 -68
package/types.d.ts CHANGED
@@ -129,6 +129,238 @@ export interface paths {
129
129
  patch?: never;
130
130
  trace?: never;
131
131
  };
132
+ "/api/impersonate/native-read-ticket": {
133
+ parameters: {
134
+ query?: never;
135
+ header?: never;
136
+ path?: never;
137
+ cookie?: never;
138
+ };
139
+ get?: never;
140
+ put?: never;
141
+ /**
142
+ * Authorize an exact browser-native download URL for the current support session.
143
+ * @description Requires the current typed support session and X-Support-Impersonation: 1. A narrow fixed GET allowlist only; record permissions still run on every GET. Admission lasts at most 15 minutes and never outlives the original one-hour support grant. The same browser session is required; URL alone is insufficient. GET/Range retries recheck current authority. Response is no-store with no-referrer. No user bearer is issued.
144
+ */
145
+ post: {
146
+ parameters: {
147
+ query?: never;
148
+ header: {
149
+ "X-Support-Impersonation": "1";
150
+ };
151
+ path?: never;
152
+ cookie?: never;
153
+ };
154
+ requestBody: {
155
+ content: {
156
+ "application/json": {
157
+ url: string;
158
+ };
159
+ };
160
+ };
161
+ responses: {
162
+ /** @description Exact relative URL and terminal admission deadline. */
163
+ 200: {
164
+ headers: {
165
+ [name: string]: unknown;
166
+ };
167
+ content: {
168
+ "application/json": {
169
+ url: string;
170
+ expiresAt: number;
171
+ };
172
+ };
173
+ };
174
+ /** @description Unsupported destination or malformed request. */
175
+ 400: {
176
+ headers: {
177
+ [name: string]: unknown;
178
+ };
179
+ content?: never;
180
+ };
181
+ /** @description No authenticated session. */
182
+ 401: {
183
+ headers: {
184
+ [name: string]: unknown;
185
+ };
186
+ content?: never;
187
+ };
188
+ /** @description Support authority unavailable; explicit exit required. */
189
+ 403: {
190
+ headers: {
191
+ [name: string]: unknown;
192
+ };
193
+ content: {
194
+ "application/json": components["schemas"]["StreamAuthenticationError"];
195
+ };
196
+ };
197
+ /** @description Authentication lookup temporarily unavailable. */
198
+ 503: {
199
+ headers: {
200
+ [name: string]: unknown;
201
+ };
202
+ content: {
203
+ "application/json": components["schemas"]["StreamAuthenticationError"];
204
+ };
205
+ };
206
+ };
207
+ };
208
+ delete?: never;
209
+ options?: never;
210
+ head?: never;
211
+ patch?: never;
212
+ trace?: never;
213
+ };
214
+ "/api/events/ticket": {
215
+ parameters: {
216
+ query?: never;
217
+ header?: never;
218
+ path?: never;
219
+ cookie?: never;
220
+ };
221
+ get?: never;
222
+ put?: never;
223
+ /**
224
+ * Create a short-lived stream-only admission ticket from the current authenticated actor.
225
+ * @description Connect within at most 60 seconds using GET /api/events?ticket=.... The ticket preserves the real principal, effective target and original login/impersonation deadlines; it cannot authenticate ordinary API requests. It is never a target-user bearer token. Response Cache-Control is no-store. An invalid temporary context returns 403 and must be explicitly exited, without dropping the real login.
226
+ */
227
+ post: {
228
+ parameters: {
229
+ query?: never;
230
+ header?: never;
231
+ path?: never;
232
+ cookie?: never;
233
+ };
234
+ requestBody?: {
235
+ content: {
236
+ "application/json": Record<string, never>;
237
+ };
238
+ };
239
+ responses: {
240
+ /** @description Opaque ticket, usable only for short-lived stream admission. */
241
+ 200: {
242
+ headers: {
243
+ [name: string]: unknown;
244
+ };
245
+ content: {
246
+ "application/json": components["schemas"]["EventStreamTicketResponse"];
247
+ };
248
+ };
249
+ /** @description Unexpected request fields. */
250
+ 400: {
251
+ headers: {
252
+ [name: string]: unknown;
253
+ };
254
+ content: {
255
+ "application/json": {
256
+ message: string;
257
+ errors: unknown[];
258
+ };
259
+ };
260
+ };
261
+ /** @description Real principal is missing, deleted, revoked or expired. */
262
+ 401: {
263
+ headers: {
264
+ [name: string]: unknown;
265
+ };
266
+ content: {
267
+ "application/json": components["schemas"]["StreamAuthenticationError"];
268
+ };
269
+ };
270
+ /** @description Impersonation is unavailable; explicitly exit before continuing as the real principal. */
271
+ 403: {
272
+ headers: {
273
+ [name: string]: unknown;
274
+ };
275
+ content: {
276
+ "application/json": components["schemas"]["StreamAuthenticationError"];
277
+ };
278
+ };
279
+ /** @description Authentication lookup unavailable; retry without discarding credentials. */
280
+ 503: {
281
+ headers: {
282
+ [name: string]: unknown;
283
+ };
284
+ content: {
285
+ "application/json": components["schemas"]["StreamAuthenticationError"];
286
+ };
287
+ };
288
+ };
289
+ };
290
+ delete?: never;
291
+ options?: never;
292
+ head?: never;
293
+ patch?: never;
294
+ trace?: never;
295
+ };
296
+ "/api/events": {
297
+ parameters: {
298
+ query?: never;
299
+ header?: never;
300
+ path?: never;
301
+ cookie?: never;
302
+ };
303
+ /**
304
+ * Open the authenticated server-sent event stream.
305
+ * @description New clients use a stream-only ticket in the ticket query parameter. Legacy authenticated connections remain supported. A supplied invalid ticket never falls back to another credential. Current user, session and revocation state is rechecked before admission and each delivery batch/heartbeat. Original authority deadlines also close idle or blocked sockets. A stream:resync hint means refresh authorized snapshots; this stream is not a replay log.
306
+ */
307
+ get: {
308
+ parameters: {
309
+ query?: {
310
+ ticket?: string;
311
+ };
312
+ header?: never;
313
+ path?: never;
314
+ cookie?: never;
315
+ };
316
+ requestBody?: never;
317
+ responses: {
318
+ /** @description Bounded SSE hints and heartbeat comments until disconnect or authority expiry. */
319
+ 200: {
320
+ headers: {
321
+ [name: string]: unknown;
322
+ };
323
+ content: {
324
+ "text/event-stream": string;
325
+ };
326
+ };
327
+ /** @description Ticket/source authentication expired, revoked or invalid. */
328
+ 401: {
329
+ headers: {
330
+ [name: string]: unknown;
331
+ };
332
+ content: {
333
+ "application/json": components["schemas"]["StreamAuthenticationError"];
334
+ };
335
+ };
336
+ /** @description Legacy temporary context is unavailable. */
337
+ 403: {
338
+ headers: {
339
+ [name: string]: unknown;
340
+ };
341
+ content: {
342
+ "application/json": components["schemas"]["StreamAuthenticationError"];
343
+ };
344
+ };
345
+ /** @description Authorization temporarily unavailable; retry with backoff. */
346
+ 503: {
347
+ headers: {
348
+ [name: string]: unknown;
349
+ };
350
+ content: {
351
+ "application/json": components["schemas"]["StreamAuthenticationError"];
352
+ };
353
+ };
354
+ };
355
+ };
356
+ put?: never;
357
+ post?: never;
358
+ delete?: never;
359
+ options?: never;
360
+ head?: never;
361
+ patch?: never;
362
+ trace?: never;
363
+ };
132
364
  "/api/jobs/{jobId}/scans/mobile-upload": {
133
365
  parameters: {
134
366
  query?: never;
@@ -746,6 +978,7 @@ export interface paths {
746
978
  customFields?: string | number | boolean | null | {
747
979
  [key: string]: unknown;
748
980
  } | unknown[];
981
+ /** Format: date-time */
749
982
  lastContactDate?: string | null;
750
983
  parentContactId?: number | null;
751
984
  relationship?: string | null;
@@ -771,9 +1004,11 @@ export interface paths {
771
1004
  cachedLng?: number | null;
772
1005
  qboId?: string | null;
773
1006
  qboSyncToken?: string | null;
1007
+ /** Format: date-time */
774
1008
  qboLastPushedAt?: string | null;
775
1009
  qboLastPushedHash?: string | null;
776
1010
  qboLastError?: string | null;
1011
+ /** Format: date-time */
777
1012
  deletedAt?: string | null;
778
1013
  deletedBy?: string | null;
779
1014
  } & {
@@ -819,6 +1054,7 @@ export interface paths {
819
1054
  customFields?: string | number | boolean | null | {
820
1055
  [key: string]: unknown;
821
1056
  } | unknown[];
1057
+ /** Format: date-time */
822
1058
  lastContactDate?: string | null;
823
1059
  parentContactId?: number | null;
824
1060
  relationship?: string | null;
@@ -844,9 +1080,11 @@ export interface paths {
844
1080
  cachedLng?: number | null;
845
1081
  qboId?: string | null;
846
1082
  qboSyncToken?: string | null;
1083
+ /** Format: date-time */
847
1084
  qboLastPushedAt?: string | null;
848
1085
  qboLastPushedHash?: string | null;
849
1086
  qboLastError?: string | null;
1087
+ /** Format: date-time */
850
1088
  deletedAt?: string | null;
851
1089
  deletedBy?: string | null;
852
1090
  };
@@ -872,6 +1110,7 @@ export interface paths {
872
1110
  customFields?: string | number | boolean | null | {
873
1111
  [key: string]: unknown;
874
1112
  } | unknown[];
1113
+ /** Format: date-time */
875
1114
  lastContactDate?: string | null;
876
1115
  parentContactId?: number | null;
877
1116
  relationship?: string | null;
@@ -897,9 +1136,11 @@ export interface paths {
897
1136
  cachedLng?: number | null;
898
1137
  qboId?: string | null;
899
1138
  qboSyncToken?: string | null;
1139
+ /** Format: date-time */
900
1140
  qboLastPushedAt?: string | null;
901
1141
  qboLastPushedHash?: string | null;
902
1142
  qboLastError?: string | null;
1143
+ /** Format: date-time */
903
1144
  deletedAt?: string | null;
904
1145
  deletedBy?: string | null;
905
1146
  } & {
@@ -1073,6 +1314,7 @@ export interface paths {
1073
1314
  };
1074
1315
  width: number;
1075
1316
  height: number;
1317
+ sillHeightM?: number;
1076
1318
  hostWallIndex?: number | null;
1077
1319
  wallIndex?: number;
1078
1320
  /** @enum {string} */
@@ -1095,6 +1337,7 @@ export interface paths {
1095
1337
  };
1096
1338
  width: number;
1097
1339
  height: number;
1340
+ sillHeightM?: number;
1098
1341
  hostWallIndex?: number | null;
1099
1342
  wallIndex?: number;
1100
1343
  /** @enum {string} */
@@ -1110,6 +1353,7 @@ export interface paths {
1110
1353
  };
1111
1354
  width: number;
1112
1355
  height: number;
1356
+ sillHeightM?: number;
1113
1357
  hostWallIndex?: number | null;
1114
1358
  wallIndex?: number;
1115
1359
  /** @enum {string} */
@@ -1211,6 +1455,7 @@ export interface paths {
1211
1455
  };
1212
1456
  width: number;
1213
1457
  height: number;
1458
+ sillHeightM?: number;
1214
1459
  hostWallIndex?: number | null;
1215
1460
  wallIndex?: number;
1216
1461
  /** @enum {string} */
@@ -1233,6 +1478,7 @@ export interface paths {
1233
1478
  };
1234
1479
  width: number;
1235
1480
  height: number;
1481
+ sillHeightM?: number;
1236
1482
  hostWallIndex?: number | null;
1237
1483
  wallIndex?: number;
1238
1484
  /** @enum {string} */
@@ -1248,6 +1494,7 @@ export interface paths {
1248
1494
  };
1249
1495
  width: number;
1250
1496
  height: number;
1497
+ sillHeightM?: number;
1251
1498
  hostWallIndex?: number | null;
1252
1499
  wallIndex?: number;
1253
1500
  /** @enum {string} */
@@ -3649,65 +3896,407 @@ export interface paths {
3649
3896
  patch?: never;
3650
3897
  trace?: never;
3651
3898
  };
3652
- }
3653
- export type webhooks = Record<string, never>;
3654
- export interface components {
3655
- schemas: {
3656
- /** @description Structured error response returned by every endpoint on failure. */
3657
- ErrorEnvelope: {
3658
- /** @example validation_failed */
3659
- error: string;
3660
- /** @example roomPlanJSON is required */
3661
- message: string;
3662
- details?: unknown;
3663
- };
3664
- /** @description Returned with HTTP 426 when the X-Client-Version major is below minClientVersion. */
3665
- UpgradeRequiredEnvelope: {
3666
- /** @enum {string} */
3667
- error: "upgrade_required";
3668
- message: string;
3669
- apiVersion: string;
3670
- minClientVersion: string;
3671
- deprecatedBelow: string;
3672
- clientVersion: string;
3673
- };
3674
- /** @description Cross-platform version handshake manifest. See docs/api-versioning.md. */
3675
- VersionManifest: {
3676
- /** @example 1.2.433 */
3677
- apiVersion: string;
3678
- /** @example 1.0.0 */
3679
- minClientVersion: string;
3680
- /** @example 1.0.0 */
3681
- deprecatedBelow: string;
3682
- /** @description Legacy alias for apiVersion. */
3683
- version: string;
3684
- buildTime: string;
3685
- env?: string | null;
3686
- gitCommit: string;
3899
+ "/api/sketches/{sketchId}/doorway-edits": {
3900
+ parameters: {
3901
+ query?: never;
3902
+ header?: never;
3903
+ path?: never;
3904
+ cookie?: never;
3687
3905
  };
3688
- InsertContact: {
3689
- userId?: string | null;
3690
- organizationId?: string | null;
3691
- customerNumber?: number | null;
3692
- name: string;
3693
- email?: string | null;
3694
- phone?: string | null;
3695
- company?: string | null;
3696
- address?: string | null;
3697
- status?: string | null;
3698
- customFields?: string | number | boolean | null | {
3699
- [key: string]: unknown;
3700
- } | unknown[];
3701
- lastContactDate?: string | null;
3702
- parentContactId?: number | null;
3703
- relationship?: string | null;
3704
- role?: string | null;
3705
- firstName?: string | null;
3706
- lastName?: string | null;
3707
- serviceAddress?: string | null;
3708
- billingAddress?: string | null;
3709
- isCommercial?: boolean | null;
3710
- pointOfContactName?: string | null;
3906
+ get?: never;
3907
+ put?: never;
3908
+ /**
3909
+ * Save a confirmed shared-doorway edit atomically, or undo it.
3910
+ * @description Requires authenticated organization and job access. Delete removes both linked openings and only their doorway connection. Undo receipts are user/scope-bound, expire after eight hours, and reject intervening geometry or connection changes. Connect is supported for sketches only. Room reads provide openingId and openingRevision; existing records are not backfilled.
3911
+ */
3912
+ post: {
3913
+ parameters: {
3914
+ query?: never;
3915
+ header?: never;
3916
+ path: {
3917
+ sketchId: number;
3918
+ };
3919
+ cookie?: never;
3920
+ };
3921
+ requestBody: {
3922
+ content: {
3923
+ "application/json": components["schemas"]["DoorwayEditCommand"];
3924
+ };
3925
+ };
3926
+ responses: {
3927
+ /** @description Committed both rooms and their connection changes; token reverses this action. */
3928
+ 200: {
3929
+ headers: {
3930
+ [name: string]: unknown;
3931
+ };
3932
+ content: {
3933
+ "application/json": components["schemas"]["DoorwayEditResult"];
3934
+ };
3935
+ };
3936
+ /** @description Invalid command or missing explicit confirmation. */
3937
+ 400: {
3938
+ headers: {
3939
+ [name: string]: unknown;
3940
+ };
3941
+ content: {
3942
+ "application/json": components["schemas"]["ErrorEnvelope"];
3943
+ };
3944
+ };
3945
+ /** @description Authentication required. */
3946
+ 401: {
3947
+ headers: {
3948
+ [name: string]: unknown;
3949
+ };
3950
+ content?: never;
3951
+ };
3952
+ /** @description Job access denied. */
3953
+ 403: {
3954
+ headers: {
3955
+ [name: string]: unknown;
3956
+ };
3957
+ content?: never;
3958
+ };
3959
+ /** @description Scope not found in the organization. */
3960
+ 404: {
3961
+ headers: {
3962
+ [name: string]: unknown;
3963
+ };
3964
+ content?: never;
3965
+ };
3966
+ /** @description Stale or ambiguous opening identity, or undo would overwrite newer work. */
3967
+ 409: {
3968
+ headers: {
3969
+ [name: string]: unknown;
3970
+ };
3971
+ content: {
3972
+ "application/json": components["schemas"]["ErrorEnvelope"];
3973
+ };
3974
+ };
3975
+ };
3976
+ };
3977
+ delete?: never;
3978
+ options?: never;
3979
+ head?: never;
3980
+ patch?: never;
3981
+ trace?: never;
3982
+ };
3983
+ "/api/floors/{floorId}/doorway-edits": {
3984
+ parameters: {
3985
+ query?: never;
3986
+ header?: never;
3987
+ path?: never;
3988
+ cookie?: never;
3989
+ };
3990
+ get?: never;
3991
+ put?: never;
3992
+ /**
3993
+ * Save a confirmed shared-doorway edit atomically, or undo it.
3994
+ * @description Requires authenticated organization and job access. Delete removes both linked openings and only their doorway connection. Undo receipts are user/scope-bound, expire after eight hours, and reject intervening geometry or connection changes. Connect is supported for sketches only. Room reads provide openingId and openingRevision; existing records are not backfilled.
3995
+ */
3996
+ post: {
3997
+ parameters: {
3998
+ query?: never;
3999
+ header?: never;
4000
+ path: {
4001
+ floorId: number;
4002
+ };
4003
+ cookie?: never;
4004
+ };
4005
+ requestBody: {
4006
+ content: {
4007
+ "application/json": components["schemas"]["DoorwayEditCommand"];
4008
+ };
4009
+ };
4010
+ responses: {
4011
+ /** @description Committed both rooms and their connection changes; token reverses this action. */
4012
+ 200: {
4013
+ headers: {
4014
+ [name: string]: unknown;
4015
+ };
4016
+ content: {
4017
+ "application/json": components["schemas"]["DoorwayEditResult"];
4018
+ };
4019
+ };
4020
+ /** @description Invalid command or missing explicit confirmation. */
4021
+ 400: {
4022
+ headers: {
4023
+ [name: string]: unknown;
4024
+ };
4025
+ content: {
4026
+ "application/json": components["schemas"]["ErrorEnvelope"];
4027
+ };
4028
+ };
4029
+ /** @description Authentication required. */
4030
+ 401: {
4031
+ headers: {
4032
+ [name: string]: unknown;
4033
+ };
4034
+ content?: never;
4035
+ };
4036
+ /** @description Job access denied. */
4037
+ 403: {
4038
+ headers: {
4039
+ [name: string]: unknown;
4040
+ };
4041
+ content?: never;
4042
+ };
4043
+ /** @description Scope not found in the organization. */
4044
+ 404: {
4045
+ headers: {
4046
+ [name: string]: unknown;
4047
+ };
4048
+ content?: never;
4049
+ };
4050
+ /** @description Stale or ambiguous opening identity, or undo would overwrite newer work. */
4051
+ 409: {
4052
+ headers: {
4053
+ [name: string]: unknown;
4054
+ };
4055
+ content: {
4056
+ "application/json": components["schemas"]["ErrorEnvelope"];
4057
+ };
4058
+ };
4059
+ };
4060
+ };
4061
+ delete?: never;
4062
+ options?: never;
4063
+ head?: never;
4064
+ patch?: never;
4065
+ trace?: never;
4066
+ };
4067
+ "/api/projects/{projectId}/documents/draft-from-walkthrough": {
4068
+ parameters: {
4069
+ query?: never;
4070
+ header?: never;
4071
+ path?: never;
4072
+ cookie?: never;
4073
+ };
4074
+ get?: never;
4075
+ put?: never;
4076
+ /**
4077
+ * Turn a voice walk-through (timed transcript + photos) into a checklist draft.
4078
+ * @description Returns a DRAFT only; nothing is saved to the job. The phone's review screen creates the checklist with POST /api/projects/{projectId}/documents (custom `items`, carrying `referenceMedia`). Sections come from, in order: the camera pose of a scan, the room the tech named (the item's words, the photo's room chip, a section opened), the AI Image Sort's room for the item's photo (add-on), then the last room mentioned; items with no signal go to Not sure. GPS is never used. Item types come from spoken hints only (checkbox unless "photo required", "yes or no" or a reading; "required" sets the flag). Reference photos are the shots taken from 10 s before a sentence to 20 s after it. 200 when the draft is ready at once; 202 with `runId` while the photos go through an AI vision sort (poll the runs route). Requires the job (404 otherwise) and the Create Checklists permission (403). Photos that are not the organization's assets are left out.
4079
+ */
4080
+ post: {
4081
+ parameters: {
4082
+ query?: never;
4083
+ header?: never;
4084
+ path: {
4085
+ projectId: number;
4086
+ };
4087
+ cookie?: never;
4088
+ };
4089
+ requestBody: {
4090
+ content: {
4091
+ "application/json": components["schemas"]["WalkthroughDraftRequest"];
4092
+ };
4093
+ };
4094
+ responses: {
4095
+ /** @description The draft (status completed). */
4096
+ 200: {
4097
+ headers: {
4098
+ [name: string]: unknown;
4099
+ };
4100
+ content: {
4101
+ "application/json": components["schemas"]["WalkthroughDraftResponse"];
4102
+ };
4103
+ };
4104
+ /** @description A vision sort runs first (status running); poll GET …/draft-from-walkthrough/runs/{runId}. */
4105
+ 202: {
4106
+ headers: {
4107
+ [name: string]: unknown;
4108
+ };
4109
+ content: {
4110
+ "application/json": components["schemas"]["WalkthroughDraftResponse"];
4111
+ };
4112
+ };
4113
+ /** @description No transcript, or a wrong shape. */
4114
+ 400: {
4115
+ headers: {
4116
+ [name: string]: unknown;
4117
+ };
4118
+ content: {
4119
+ "application/json": components["schemas"]["ErrorEnvelope"];
4120
+ };
4121
+ };
4122
+ /** @description Authentication required. */
4123
+ 401: {
4124
+ headers: {
4125
+ [name: string]: unknown;
4126
+ };
4127
+ content?: never;
4128
+ };
4129
+ /** @description The role cannot create checklists. */
4130
+ 403: {
4131
+ headers: {
4132
+ [name: string]: unknown;
4133
+ };
4134
+ content: {
4135
+ "application/json": components["schemas"]["ErrorEnvelope"];
4136
+ };
4137
+ };
4138
+ /** @description Job not found. */
4139
+ 404: {
4140
+ headers: {
4141
+ [name: string]: unknown;
4142
+ };
4143
+ content: {
4144
+ "application/json": components["schemas"]["ErrorEnvelope"];
4145
+ };
4146
+ };
4147
+ /** @description The AI's answer could not be used. */
4148
+ 502: {
4149
+ headers: {
4150
+ [name: string]: unknown;
4151
+ };
4152
+ content: {
4153
+ "application/json": components["schemas"]["ErrorEnvelope"];
4154
+ };
4155
+ };
4156
+ /** @description AI is not configured. */
4157
+ 503: {
4158
+ headers: {
4159
+ [name: string]: unknown;
4160
+ };
4161
+ content: {
4162
+ "application/json": components["schemas"]["ErrorEnvelope"];
4163
+ };
4164
+ };
4165
+ };
4166
+ };
4167
+ delete?: never;
4168
+ options?: never;
4169
+ head?: never;
4170
+ patch?: never;
4171
+ trace?: never;
4172
+ };
4173
+ "/api/projects/{projectId}/documents/draft-from-walkthrough/runs/{runId}": {
4174
+ parameters: {
4175
+ query?: never;
4176
+ header?: never;
4177
+ path?: never;
4178
+ cookie?: never;
4179
+ };
4180
+ /**
4181
+ * Poll a walk-through draft that waits for an AI vision sort.
4182
+ * @description Status `running` (with the sort's progress in `sortRun`) until the draft is ready, then `completed` with `draft`, or `failed` with `message`. A run that stops making progress is marked failed on the next poll and never re-run.
4183
+ */
4184
+ get: {
4185
+ parameters: {
4186
+ query?: never;
4187
+ header?: never;
4188
+ path: {
4189
+ projectId: number;
4190
+ runId: number;
4191
+ };
4192
+ cookie?: never;
4193
+ };
4194
+ requestBody?: never;
4195
+ responses: {
4196
+ /** @description The run's envelope. */
4197
+ 200: {
4198
+ headers: {
4199
+ [name: string]: unknown;
4200
+ };
4201
+ content: {
4202
+ "application/json": components["schemas"]["WalkthroughDraftResponse"];
4203
+ };
4204
+ };
4205
+ /** @description Authentication required. */
4206
+ 401: {
4207
+ headers: {
4208
+ [name: string]: unknown;
4209
+ };
4210
+ content?: never;
4211
+ };
4212
+ /** @description The role cannot create checklists. */
4213
+ 403: {
4214
+ headers: {
4215
+ [name: string]: unknown;
4216
+ };
4217
+ content: {
4218
+ "application/json": components["schemas"]["ErrorEnvelope"];
4219
+ };
4220
+ };
4221
+ /** @description Job or run not found. */
4222
+ 404: {
4223
+ headers: {
4224
+ [name: string]: unknown;
4225
+ };
4226
+ content: {
4227
+ "application/json": components["schemas"]["ErrorEnvelope"];
4228
+ };
4229
+ };
4230
+ };
4231
+ };
4232
+ put?: never;
4233
+ post?: never;
4234
+ delete?: never;
4235
+ options?: never;
4236
+ head?: never;
4237
+ patch?: never;
4238
+ trace?: never;
4239
+ };
4240
+ }
4241
+ export type webhooks = Record<string, never>;
4242
+ export interface components {
4243
+ schemas: {
4244
+ /** @description Structured error response returned by every endpoint on failure. */
4245
+ ErrorEnvelope: {
4246
+ /** @example validation_failed */
4247
+ error: string;
4248
+ /** @example roomPlanJSON is required */
4249
+ message: string;
4250
+ details?: unknown;
4251
+ };
4252
+ /** @description Returned with HTTP 426 when the X-Client-Version major is below minClientVersion. */
4253
+ UpgradeRequiredEnvelope: {
4254
+ /** @enum {string} */
4255
+ error: "upgrade_required";
4256
+ message: string;
4257
+ apiVersion: string;
4258
+ minClientVersion: string;
4259
+ deprecatedBelow: string;
4260
+ clientVersion: string;
4261
+ };
4262
+ /** @description Cross-platform version handshake manifest. See docs/api-versioning.md. */
4263
+ VersionManifest: {
4264
+ /** @example 1.6.1 */
4265
+ apiVersion: string;
4266
+ /** @example 1.0.0 */
4267
+ minClientVersion: string;
4268
+ /** @example 1.0.0 */
4269
+ deprecatedBelow: string;
4270
+ /** @description Legacy alias for apiVersion. */
4271
+ version: string;
4272
+ buildTime: string;
4273
+ env?: string | null;
4274
+ gitCommit: string;
4275
+ };
4276
+ InsertContact: {
4277
+ userId?: string | null;
4278
+ organizationId?: string | null;
4279
+ customerNumber?: number | null;
4280
+ name: string;
4281
+ email?: string | null;
4282
+ phone?: string | null;
4283
+ company?: string | null;
4284
+ address?: string | null;
4285
+ status?: string | null;
4286
+ customFields?: string | number | boolean | null | {
4287
+ [key: string]: unknown;
4288
+ } | unknown[];
4289
+ /** Format: date-time */
4290
+ lastContactDate?: string | null;
4291
+ parentContactId?: number | null;
4292
+ relationship?: string | null;
4293
+ role?: string | null;
4294
+ firstName?: string | null;
4295
+ lastName?: string | null;
4296
+ serviceAddress?: string | null;
4297
+ billingAddress?: string | null;
4298
+ isCommercial?: boolean | null;
4299
+ pointOfContactName?: string | null;
3711
4300
  pointOfContactTitle?: string | null;
3712
4301
  pointOfContactPhone?: string | null;
3713
4302
  primaryEmail?: string | null;
@@ -3723,9 +4312,11 @@ export interface components {
3723
4312
  cachedLng?: number | null;
3724
4313
  qboId?: string | null;
3725
4314
  qboSyncToken?: string | null;
4315
+ /** Format: date-time */
3726
4316
  qboLastPushedAt?: string | null;
3727
4317
  qboLastPushedHash?: string | null;
3728
4318
  qboLastError?: string | null;
4319
+ /** Format: date-time */
3729
4320
  deletedAt?: string | null;
3730
4321
  deletedBy?: string | null;
3731
4322
  };
@@ -3790,25 +4381,35 @@ export interface components {
3790
4381
  deviceTrack?: string | number | boolean | null | {
3791
4382
  [key: string]: unknown;
3792
4383
  } | unknown[];
3793
- referencePhotoKeys?: (string | null)[] | null;
4384
+ referencePhotoKeys?: string[] | null;
3794
4385
  metricCorrection?: number | null;
3795
4386
  squareUpAngleRad?: number | null;
3796
4387
  clientMirrorApplied?: boolean | null;
3797
4388
  deviceModel?: string | null;
3798
4389
  appVersion?: string | null;
4390
+ /** Format: date-time */
3799
4391
  captureTimestamp?: string | null;
3800
4392
  captureMode?: string | null;
3801
4393
  sessionId?: string | null;
4394
+ /** Format: date-time */
3802
4395
  sessionCapturedAt?: string | null;
4396
+ clientScanId?: string | null;
3803
4397
  floorPlanAssetId?: string | null;
3804
4398
  floorPlanPixelsPerMeter?: number | null;
3805
4399
  floorPlanOffsetX?: number | null;
3806
4400
  floorPlanOffsetY?: number | null;
3807
4401
  floorPlanWidthPx?: number | null;
3808
4402
  floorPlanHeightPx?: number | null;
4403
+ sourceSketchId?: number | null;
4404
+ takeoffPagePixelsPerMeter?: number | null;
4405
+ takeoffPageOffsetX?: number | null;
4406
+ takeoffPageOffsetY?: number | null;
4407
+ takeoffPageWidthPx?: number | null;
4408
+ takeoffPageHeightPx?: number | null;
3809
4409
  floorId?: number | null;
3810
4410
  shareToVendor?: boolean | null;
3811
4411
  createdBy?: string | null;
4412
+ /** Format: date-time */
3812
4413
  deletedAt?: string | null;
3813
4414
  deletedBy?: string | null;
3814
4415
  };
@@ -3822,7 +4423,9 @@ export interface components {
3822
4423
  description?: string | null;
3823
4424
  taskType?: string | null;
3824
4425
  location?: string | null;
4426
+ /** Format: date-time */
3825
4427
  startDate?: string | null;
4428
+ /** Format: date-time */
3826
4429
  dueDate?: string | null;
3827
4430
  allDay?: boolean | null;
3828
4431
  status?: string | null;
@@ -3847,14 +4450,17 @@ export interface components {
3847
4450
  isRecurring?: boolean | null;
3848
4451
  recurrencePattern?: string | null;
3849
4452
  recurrenceInterval?: number | null;
4453
+ /** Format: date-time */
3850
4454
  recurrenceEndDate?: string | null;
3851
4455
  parentTaskId?: number | null;
4456
+ /** Format: date-time */
3852
4457
  recurrenceDate?: string | null;
3853
4458
  isRecurrenceException?: boolean | null;
3854
4459
  excludedDates?: string | number | boolean | null | {
3855
4460
  [key: string]: unknown;
3856
4461
  } | unknown[];
3857
4462
  displayIndex?: number | null;
4463
+ /** Format: date-time */
3858
4464
  deletedAt?: string | null;
3859
4465
  deletedBy?: string | null;
3860
4466
  };
@@ -3865,6 +4471,7 @@ export interface components {
3865
4471
  content: string;
3866
4472
  userName?: string | null;
3867
4473
  userEmail?: string | null;
4474
+ /** Format: date-time */
3868
4475
  deletedAt?: string | null;
3869
4476
  deletedBy?: string | null;
3870
4477
  };
@@ -3881,8 +4488,9 @@ export interface components {
3881
4488
  metadata?: string | number | boolean | null | {
3882
4489
  [key: string]: unknown;
3883
4490
  } | unknown[];
3884
- tags?: (string | null)[] | null;
4491
+ tags?: string[] | null;
3885
4492
  uploadedBy?: string | null;
4493
+ /** Format: date-time */
3886
4494
  deletedAt?: string | null;
3887
4495
  deletedBy?: string | null;
3888
4496
  };
@@ -3893,6 +4501,7 @@ export interface components {
3893
4501
  isSystemFolder?: boolean | null;
3894
4502
  folderType?: string | null;
3895
4503
  createdBy?: string | null;
4504
+ /** Format: date-time */
3896
4505
  deletedAt?: string | null;
3897
4506
  deletedBy?: string | null;
3898
4507
  };
@@ -3920,12 +4529,17 @@ export interface components {
3920
4529
  terms?: string | null;
3921
4530
  notes?: string | null;
3922
4531
  internalNotes?: string | null;
4532
+ /** Format: date-time */
3923
4533
  validUntil?: string | null;
4534
+ /** Format: date-time */
3924
4535
  sentAt?: string | null;
4536
+ /** Format: date-time */
3925
4537
  approvedAt?: string | null;
3926
4538
  approvedBy?: string | null;
4539
+ /** Format: date-time */
3927
4540
  rejectedAt?: string | null;
3928
4541
  rejectionReason?: string | null;
4542
+ /** Format: date-time */
3929
4543
  signedAt?: string | null;
3930
4544
  signatureMeta?: string | number | boolean | null | {
3931
4545
  [key: string]: unknown;
@@ -3935,10 +4549,13 @@ export interface components {
3935
4549
  signerName?: string | null;
3936
4550
  signerEmail?: string | null;
3937
4551
  signerIp?: string | null;
4552
+ /** Format: date-time */
3938
4553
  revisionRequestedAt?: string | null;
3939
4554
  revisionNotes?: string | null;
4555
+ /** Format: date-time */
3940
4556
  customerResponseAt?: string | null;
3941
4557
  convertedToInvoiceId?: number | null;
4558
+ /** Format: date-time */
3942
4559
  voidedAt?: string | null;
3943
4560
  voidedBy?: string | null;
3944
4561
  voidedReason?: string | null;
@@ -3947,16 +4564,22 @@ export interface components {
3947
4564
  signNowRoleId?: string | null;
3948
4565
  signNowRoleName?: string | null;
3949
4566
  portalVisible?: boolean | null;
4567
+ /** Format: date-time */
3950
4568
  signedCompletionEmailSentAt?: string | null;
3951
4569
  qboId?: string | null;
3952
4570
  qboSyncToken?: string | null;
4571
+ /** Format: date-time */
3953
4572
  qboLastPushedAt?: string | null;
3954
4573
  qboLastPushedHash?: string | null;
3955
4574
  qboLastError?: string | null;
3956
4575
  qboTotalTax?: string | null;
3957
4576
  qboTotalAmount?: string | null;
4577
+ /** Format: date-time */
3958
4578
  qboTotalsAt?: string | null;
4579
+ sourceKind?: string | null;
4580
+ takeoffScanId?: number | null;
3959
4581
  createdBy?: string | null;
4582
+ /** Format: date-time */
3960
4583
  deletedAt?: string | null;
3961
4584
  deletedBy?: string | null;
3962
4585
  };
@@ -3981,12 +4604,12 @@ export interface components {
3981
4604
  MobileUploadRequest: {
3982
4605
  /** @description RoomPlan JSON envelope. `rooms[]` carries the per-room geometry (walls/doors/windows/openings/pins/objects/boundaryPolygon). iOS continues to upload positions in the RoomPlan-native frame; the server applies the view-alignment intake transform once at `/scans/mobile-upload` (see docs/lidar-contract-v4.md). */
3983
4606
  roomPlanJSON: {
3984
- rooms: {
4607
+ rooms: ({
3985
4608
  label?: string;
3986
4609
  name?: string;
3987
4610
  category?: string;
3988
4611
  roomLocalId?: string;
3989
- walls?: {
4612
+ walls?: ({
3990
4613
  start?: {
3991
4614
  x: number;
3992
4615
  y: number;
@@ -4001,9 +4624,13 @@ export interface components {
4001
4624
  identifier?: string;
4002
4625
  isDoor?: boolean;
4003
4626
  isOpening?: boolean;
4627
+ } & {
4628
+ [key: string]: unknown;
4004
4629
  };
4005
4630
  captureMethod?: string;
4006
- }[];
4631
+ } & {
4632
+ [key: string]: unknown;
4633
+ })[];
4007
4634
  doors?: {
4008
4635
  position: {
4009
4636
  x: number;
@@ -4011,6 +4638,7 @@ export interface components {
4011
4638
  };
4012
4639
  width: number;
4013
4640
  height: number;
4641
+ sillHeightM?: number;
4014
4642
  hostWallIndex?: number | null;
4015
4643
  wallIndex?: number;
4016
4644
  /** @enum {string} */
@@ -4025,6 +4653,7 @@ export interface components {
4025
4653
  };
4026
4654
  width: number;
4027
4655
  height: number;
4656
+ sillHeightM?: number;
4028
4657
  hostWallIndex?: number | null;
4029
4658
  wallIndex?: number;
4030
4659
  /** @enum {string} */
@@ -4039,6 +4668,7 @@ export interface components {
4039
4668
  };
4040
4669
  width: number;
4041
4670
  height: number;
4671
+ sillHeightM?: number;
4042
4672
  hostWallIndex?: number | null;
4043
4673
  wallIndex?: number;
4044
4674
  /** @enum {string} */
@@ -4046,7 +4676,7 @@ export interface components {
4046
4676
  /** @enum {string} */
4047
4677
  placementSource?: "auto" | "manual";
4048
4678
  }[];
4049
- pins?: {
4679
+ pins?: ({
4050
4680
  id: string;
4051
4681
  position: {
4052
4682
  x: number;
@@ -4056,8 +4686,10 @@ export interface components {
4056
4686
  roomLocalId?: string;
4057
4687
  kind?: string;
4058
4688
  note?: string;
4059
- }[];
4060
- objects?: {
4689
+ } & {
4690
+ [key: string]: unknown;
4691
+ })[];
4692
+ objects?: ({
4061
4693
  category?: string;
4062
4694
  position?: {
4063
4695
  x: number;
@@ -4069,14 +4701,20 @@ export interface components {
4069
4701
  depth?: number;
4070
4702
  };
4071
4703
  rotation?: number;
4072
- }[];
4704
+ } & {
4705
+ [key: string]: unknown;
4706
+ })[];
4073
4707
  boundaryPolygon?: {
4074
4708
  x: number;
4075
4709
  y: number;
4076
4710
  }[];
4077
4711
  roomNote?: string;
4078
4712
  entryDoorwayId?: string;
4079
- }[];
4713
+ } & {
4714
+ [key: string]: unknown;
4715
+ })[];
4716
+ } & {
4717
+ [key: string]: unknown;
4080
4718
  };
4081
4719
  name: string;
4082
4720
  description?: string;
@@ -4123,6 +4761,8 @@ export interface components {
4123
4761
  x: number;
4124
4762
  y: number;
4125
4763
  };
4764
+ } & {
4765
+ [key: string]: unknown;
4126
4766
  };
4127
4767
  MobileUploadResponse: {
4128
4768
  scanId: number;
@@ -4141,6 +4781,14 @@ export interface components {
4141
4781
  scanRoomSnapshots: boolean;
4142
4782
  roomConnections: boolean;
4143
4783
  };
4784
+ EventStreamTicketResponse: {
4785
+ ticket: string;
4786
+ };
4787
+ StreamAuthenticationError: {
4788
+ message: string;
4789
+ /** @enum {string} */
4790
+ code?: "IMPERSONATION_UNAVAILABLE" | "SUPPORT_IMPERSONATION_UNAVAILABLE" | "auth_unavailable";
4791
+ };
4144
4792
  JobSummary: {
4145
4793
  id: number;
4146
4794
  name: string;
@@ -4759,6 +5407,323 @@ export interface components {
4759
5407
  /** Format: date-time */
4760
5408
  requestedAt: string;
4761
5409
  };
5410
+ DoorwayEditCommand: {
5411
+ /** @enum {string} */
5412
+ action: "delete";
5413
+ roomId: number;
5414
+ openingId: string;
5415
+ revision: string;
5416
+ /** @enum {boolean} */
5417
+ confirmed: true;
5418
+ } | {
5419
+ /** @enum {string} */
5420
+ action: "undo";
5421
+ token: string;
5422
+ } | {
5423
+ /** @enum {string} */
5424
+ action: "connect";
5425
+ rooms: {
5426
+ id: number;
5427
+ revision: string;
5428
+ geometry: {
5429
+ [key: string]: unknown;
5430
+ };
5431
+ }[];
5432
+ links: {
5433
+ roomAId: number;
5434
+ roomBId: number;
5435
+ doorAIndex: number;
5436
+ doorBIndex: number;
5437
+ }[];
5438
+ };
5439
+ DoorwayEditResult: {
5440
+ /** @enum {boolean} */
5441
+ ok: true;
5442
+ token: string;
5443
+ roomIds: number[];
5444
+ };
5445
+ WalkthroughDraftRequest: {
5446
+ transcript: {
5447
+ text: string;
5448
+ /** Format: date-time */
5449
+ startedAt: string;
5450
+ /** Format: date-time */
5451
+ endedAt: string;
5452
+ }[];
5453
+ photos?: {
5454
+ assetId: string;
5455
+ /** Format: date-time */
5456
+ capturedAt: string;
5457
+ roomHint?: string | null;
5458
+ sketchRoomId?: number | null;
5459
+ capturePose?: {
5460
+ x?: number;
5461
+ y?: number;
5462
+ z?: number;
5463
+ floorId?: number | null;
5464
+ sketchId?: number | null;
5465
+ scanSessionId?: string;
5466
+ scanRoomLocalId?: string;
5467
+ scanRoomName?: string;
5468
+ } | null;
5469
+ }[];
5470
+ sections?: {
5471
+ name: string;
5472
+ /** Format: date-time */
5473
+ startedAt: string;
5474
+ sketchRoomId?: number | null;
5475
+ }[];
5476
+ /** @enum {string} */
5477
+ roomsFrom?: "speech" | "scan";
5478
+ };
5479
+ ChecklistDraft: {
5480
+ name: string;
5481
+ sections: {
5482
+ key: string;
5483
+ title: string;
5484
+ sketchRoomId: number | null;
5485
+ /** @enum {string} */
5486
+ kind: "room" | "custom" | "not_sure";
5487
+ items: {
5488
+ key: string;
5489
+ itemText: string;
5490
+ description: string | null;
5491
+ /** @enum {string} */
5492
+ itemType: "checkbox" | "yes/no" | "text" | "number" | "date" | "dropdown" | "multi-select" | "photo" | "signature";
5493
+ required: boolean;
5494
+ options: {
5495
+ [key: string]: unknown;
5496
+ } | null;
5497
+ referenceMedia: {
5498
+ assetId: string;
5499
+ caption?: string | null;
5500
+ order?: number;
5501
+ }[];
5502
+ hints: ("photo_required" | "yes_no" | "required" | "reading")[];
5503
+ /** @enum {string} */
5504
+ roomSource: "pose" | "named" | "vision" | "time" | "none";
5505
+ spokenAt: string;
5506
+ quote: string | null;
5507
+ }[];
5508
+ }[];
5509
+ photos: {
5510
+ assetId: string;
5511
+ capturedAt: string;
5512
+ sectionKey: string | null;
5513
+ /** @enum {string} */
5514
+ roomSource: "pose" | "named" | "vision" | "time" | "none";
5515
+ itemKeys: string[];
5516
+ }[];
5517
+ visionUsed: boolean;
5518
+ model: string | null;
5519
+ promptVersion: string;
5520
+ };
5521
+ WalkthroughDraftResponse: {
5522
+ /** @enum {string} */
5523
+ status: "completed" | "running" | "failed";
5524
+ runId: number | null;
5525
+ draft: {
5526
+ name: string;
5527
+ sections: {
5528
+ key: string;
5529
+ title: string;
5530
+ sketchRoomId: number | null;
5531
+ /** @enum {string} */
5532
+ kind: "room" | "custom" | "not_sure";
5533
+ items: {
5534
+ key: string;
5535
+ itemText: string;
5536
+ description: string | null;
5537
+ /** @enum {string} */
5538
+ itemType: "checkbox" | "yes/no" | "text" | "number" | "date" | "dropdown" | "multi-select" | "photo" | "signature";
5539
+ required: boolean;
5540
+ options: {
5541
+ [key: string]: unknown;
5542
+ } | null;
5543
+ referenceMedia: {
5544
+ assetId: string;
5545
+ caption?: string | null;
5546
+ order?: number;
5547
+ }[];
5548
+ hints: ("photo_required" | "yes_no" | "required" | "reading")[];
5549
+ /** @enum {string} */
5550
+ roomSource: "pose" | "named" | "vision" | "time" | "none";
5551
+ spokenAt: string;
5552
+ quote: string | null;
5553
+ }[];
5554
+ }[];
5555
+ photos: {
5556
+ assetId: string;
5557
+ capturedAt: string;
5558
+ sectionKey: string | null;
5559
+ /** @enum {string} */
5560
+ roomSource: "pose" | "named" | "vision" | "time" | "none";
5561
+ itemKeys: string[];
5562
+ }[];
5563
+ visionUsed: boolean;
5564
+ model: string | null;
5565
+ promptVersion: string;
5566
+ } | null;
5567
+ sortRun: {
5568
+ /** @enum {string} */
5569
+ status: "running" | "completed" | "failed";
5570
+ total: number;
5571
+ done: number;
5572
+ } | null;
5573
+ message: string | null;
5574
+ };
5575
+ /** @description `arguments` of the Chatty tool `list_job_checklists` (POST /api/chatty-voice/tools/execute). */
5576
+ ChattyListJobChecklistsArguments: {
5577
+ jobId?: number | string;
5578
+ };
5579
+ /** @description `data` of a successful `list_job_checklists` call (`success: true`). */
5580
+ ChattyListJobChecklistsData: {
5581
+ id: number;
5582
+ name: string;
5583
+ status: string | null;
5584
+ completionPercentage: number;
5585
+ templateId: number | null;
5586
+ }[];
5587
+ /** @description `arguments` of the Chatty tool `get_checklist` (POST /api/chatty-voice/tools/execute). */
5588
+ ChattyGetChecklistArguments: {
5589
+ checklistId?: number | string;
5590
+ checklistName?: string;
5591
+ jobId?: number | string;
5592
+ };
5593
+ /** @description `data` of a successful `get_checklist` call (`success: true`). */
5594
+ ChattyGetChecklistData: {
5595
+ id: number;
5596
+ name: string;
5597
+ status: string | null;
5598
+ completionPercentage: number;
5599
+ jobId: number | null;
5600
+ items: {
5601
+ id: number;
5602
+ itemText: string;
5603
+ itemType: string;
5604
+ required: boolean;
5605
+ done: boolean;
5606
+ value: string | null;
5607
+ section: string | null;
5608
+ referencePhotos: number;
5609
+ }[];
5610
+ };
5611
+ /** @description `arguments` of the Chatty tool `create_checklist` (POST /api/chatty-voice/tools/execute). */
5612
+ ChattyCreateChecklistArguments: {
5613
+ jobId?: number | string;
5614
+ name?: string;
5615
+ templateId?: number | string;
5616
+ templateName?: string;
5617
+ notes?: string;
5618
+ items?: string[];
5619
+ };
5620
+ /** @description `data` of a successful `create_checklist` call (`success: true`). */
5621
+ ChattyCreateChecklistData: {
5622
+ id: number;
5623
+ name: string;
5624
+ jobId: number;
5625
+ itemCount: number;
5626
+ templateId?: number;
5627
+ sections?: {
5628
+ title: string;
5629
+ items: {
5630
+ itemText: string;
5631
+ /** @enum {string} */
5632
+ itemType: "checkbox" | "yes/no" | "text" | "number" | "date" | "dropdown" | "multi-select" | "photo" | "signature";
5633
+ required: boolean;
5634
+ }[];
5635
+ }[];
5636
+ };
5637
+ /** @description `arguments` of the Chatty tool `add_checklist_item` (POST /api/chatty-voice/tools/execute). */
5638
+ ChattyAddChecklistItemArguments: {
5639
+ checklistId?: number | string;
5640
+ checklistName?: string;
5641
+ jobId?: number | string;
5642
+ itemText: string;
5643
+ /** @enum {string} */
5644
+ itemType?: "checkbox" | "yes/no" | "text" | "number" | "date" | "dropdown" | "multi-select" | "photo" | "signature";
5645
+ required?: boolean;
5646
+ description?: string;
5647
+ sectionName?: string;
5648
+ };
5649
+ /** @description `data` of a successful `add_checklist_item` call (`success: true`). */
5650
+ ChattyAddChecklistItemData: {
5651
+ id: number;
5652
+ checklistId: number;
5653
+ itemText: string;
5654
+ /** @enum {string} */
5655
+ itemType: "checkbox" | "yes/no" | "text" | "number" | "date" | "dropdown" | "multi-select" | "photo" | "signature";
5656
+ required: boolean;
5657
+ section: string | null;
5658
+ };
5659
+ /** @description `arguments` of the Chatty tool `complete_checklist_item` (POST /api/chatty-voice/tools/execute). */
5660
+ ChattyCompleteChecklistItemArguments: {
5661
+ checklistId?: number | string;
5662
+ checklistName?: string;
5663
+ jobId?: number | string;
5664
+ itemId?: number | string;
5665
+ itemText?: string;
5666
+ completed?: boolean;
5667
+ };
5668
+ /** @description `data` of a successful `complete_checklist_item` call (`success: true`). */
5669
+ ChattyCompleteChecklistItemData: {
5670
+ checklistId: number;
5671
+ itemId: number;
5672
+ completed: boolean;
5673
+ };
5674
+ /** @description `arguments` of the Chatty tool `set_checklist_item_answer` (POST /api/chatty-voice/tools/execute). */
5675
+ ChattySetChecklistItemAnswerArguments: {
5676
+ checklistId?: number | string;
5677
+ checklistName?: string;
5678
+ jobId?: number | string;
5679
+ itemId?: number | string;
5680
+ itemText?: string;
5681
+ value: string;
5682
+ };
5683
+ /** @description `data` of a successful `set_checklist_item_answer` call (`success: true`). */
5684
+ ChattySetChecklistItemAnswerData: {
5685
+ checklistId: number;
5686
+ itemId: number;
5687
+ value: string;
5688
+ };
5689
+ /** @description `arguments` of the Chatty tool `attach_reference_photo_to_item` (POST /api/chatty-voice/tools/execute). */
5690
+ ChattyAttachReferencePhotoToItemArguments: {
5691
+ checklistId?: number | string;
5692
+ checklistName?: string;
5693
+ jobId?: number | string;
5694
+ itemId?: number | string;
5695
+ itemText?: string;
5696
+ photoId: number | string;
5697
+ caption?: string;
5698
+ };
5699
+ /** @description `data` of a successful `attach_reference_photo_to_item` call (`success: true`). */
5700
+ ChattyAttachReferencePhotoToItemData: {
5701
+ checklistId: number;
5702
+ itemId: number;
5703
+ referenceMedia: {
5704
+ assetId: string;
5705
+ caption?: string | null;
5706
+ order?: number;
5707
+ }[];
5708
+ };
5709
+ /** @description `arguments` of the Chatty tool `draft_checklist_from_job_photos` (POST /api/chatty-voice/tools/execute). */
5710
+ ChattyDraftChecklistFromJobPhotosArguments: {
5711
+ jobId?: number | string;
5712
+ name?: string;
5713
+ create?: boolean;
5714
+ };
5715
+ /** @description `data` of a successful `draft_checklist_from_job_photos` call (`success: true`). */
5716
+ ChattyDraftChecklistFromJobPhotosData: {
5717
+ id?: number;
5718
+ jobId?: number;
5719
+ name: string;
5720
+ items: {
5721
+ itemText: string;
5722
+ photos: number;
5723
+ }[];
5724
+ unsortedPhotos: number;
5725
+ created: boolean;
5726
+ };
4762
5727
  };
4763
5728
  responses: never;
4764
5729
  parameters: never;