@serviceai/api-spec 1.2.434 → 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 +1915 -51
  2. package/openapi.yaml +1279 -11
  3. package/package.json +1 -1
  4. package/types.d.ts +696 -1
package/openapi.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: ServiceAi API
4
- version: 1.2.434
4
+ version: 1.6.1
5
5
  description: >-
6
6
  Source-of-truth API contract for ServiceAi. Generated from `shared/schema.ts` Zod schemas by
7
7
  `scripts/build-api-spec.ts`. Versioning policy: see `docs/api-versioning.md`. The hand-written docs/ios-contract.md
@@ -32,6 +32,8 @@ tags:
32
32
  description: Job (project) lifecycle surface.
33
33
  - name: chatty
34
34
  description: Realtime voice-enabled AI assistant.
35
+ - name: checklists
36
+ description: 'Job checklists: the voice walk-through draft.'
35
37
  - name: time-tracking
36
38
  description: >-
37
39
  The clock. A work day is the master clock and the payroll number; time entries sit inside it and say where the
@@ -44,6 +46,18 @@ tags:
44
46
  - name: account
45
47
  description: 'The signed-in person''s own account: asking for it to be deleted.'
46
48
  components:
49
+ securitySchemes:
50
+ UserBearer:
51
+ type: http
52
+ scheme: bearer
53
+ BrowserSession:
54
+ type: apiKey
55
+ in: cookie
56
+ name: connect.sid
57
+ BrowserAuthCookie:
58
+ type: apiKey
59
+ in: cookie
60
+ name: auth_token
47
61
  schemas:
48
62
  ErrorEnvelope:
49
63
  type: object
@@ -89,7 +103,7 @@ components:
89
103
  properties:
90
104
  apiVersion:
91
105
  type: string
92
- example: 1.2.434
106
+ example: 1.6.1
93
107
  minClientVersion:
94
108
  type: string
95
109
  example: 1.0.0
@@ -1842,6 +1856,29 @@ components:
1842
1856
  - manualMeasurements
1843
1857
  - scanRoomSnapshots
1844
1858
  - roomConnections
1859
+ EventStreamTicketResponse:
1860
+ type: object
1861
+ properties:
1862
+ ticket:
1863
+ type: string
1864
+ minLength: 1
1865
+ maxLength: 8192
1866
+ required:
1867
+ - ticket
1868
+ additionalProperties: false
1869
+ StreamAuthenticationError:
1870
+ type: object
1871
+ properties:
1872
+ message:
1873
+ type: string
1874
+ code:
1875
+ type: string
1876
+ enum:
1877
+ - IMPERSONATION_UNAVAILABLE
1878
+ - SUPPORT_IMPERSONATION_UNAVAILABLE
1879
+ - auth_unavailable
1880
+ required:
1881
+ - message
1845
1882
  JobSummary:
1846
1883
  type: object
1847
1884
  properties:
@@ -3519,20 +3556,964 @@ components:
3519
3556
  DoorwayEditResult:
3520
3557
  type: object
3521
3558
  properties:
3522
- ok:
3559
+ ok:
3560
+ type: boolean
3561
+ enum:
3562
+ - true
3563
+ token:
3564
+ type: string
3565
+ roomIds:
3566
+ type: array
3567
+ items:
3568
+ type: integer
3569
+ required:
3570
+ - ok
3571
+ - token
3572
+ - roomIds
3573
+ WalkthroughDraftRequest:
3574
+ type: object
3575
+ properties:
3576
+ transcript:
3577
+ type: array
3578
+ items:
3579
+ type: object
3580
+ properties:
3581
+ text:
3582
+ type: string
3583
+ minLength: 1
3584
+ maxLength: 1000
3585
+ startedAt:
3586
+ type: string
3587
+ format: date-time
3588
+ endedAt:
3589
+ type: string
3590
+ format: date-time
3591
+ required:
3592
+ - text
3593
+ - startedAt
3594
+ - endedAt
3595
+ minItems: 1
3596
+ maxItems: 400
3597
+ photos:
3598
+ type: array
3599
+ items:
3600
+ type: object
3601
+ properties:
3602
+ assetId:
3603
+ type: string
3604
+ minLength: 1
3605
+ maxLength: 64
3606
+ capturedAt:
3607
+ type: string
3608
+ format: date-time
3609
+ roomHint:
3610
+ type:
3611
+ - string
3612
+ - 'null'
3613
+ maxLength: 200
3614
+ sketchRoomId:
3615
+ type:
3616
+ - integer
3617
+ - 'null'
3618
+ exclusiveMinimum: 0
3619
+ capturePose:
3620
+ type:
3621
+ - object
3622
+ - 'null'
3623
+ properties:
3624
+ x:
3625
+ type: number
3626
+ 'y':
3627
+ type: number
3628
+ z:
3629
+ type: number
3630
+ floorId:
3631
+ type:
3632
+ - integer
3633
+ - 'null'
3634
+ exclusiveMinimum: 0
3635
+ sketchId:
3636
+ type:
3637
+ - integer
3638
+ - 'null'
3639
+ exclusiveMinimum: 0
3640
+ scanSessionId:
3641
+ type: string
3642
+ maxLength: 64
3643
+ scanRoomLocalId:
3644
+ type: string
3645
+ maxLength: 128
3646
+ scanRoomName:
3647
+ type: string
3648
+ maxLength: 200
3649
+ required:
3650
+ - assetId
3651
+ - capturedAt
3652
+ maxItems: 200
3653
+ sections:
3654
+ type: array
3655
+ items:
3656
+ type: object
3657
+ properties:
3658
+ name:
3659
+ type: string
3660
+ minLength: 1
3661
+ maxLength: 200
3662
+ startedAt:
3663
+ type: string
3664
+ format: date-time
3665
+ sketchRoomId:
3666
+ type:
3667
+ - integer
3668
+ - 'null'
3669
+ exclusiveMinimum: 0
3670
+ required:
3671
+ - name
3672
+ - startedAt
3673
+ maxItems: 100
3674
+ roomsFrom:
3675
+ type: string
3676
+ enum:
3677
+ - speech
3678
+ - scan
3679
+ required:
3680
+ - transcript
3681
+ ChecklistDraft:
3682
+ type: object
3683
+ properties:
3684
+ name:
3685
+ type: string
3686
+ sections:
3687
+ type: array
3688
+ items:
3689
+ type: object
3690
+ properties:
3691
+ key:
3692
+ type: string
3693
+ title:
3694
+ type: string
3695
+ sketchRoomId:
3696
+ type:
3697
+ - integer
3698
+ - 'null'
3699
+ kind:
3700
+ type: string
3701
+ enum:
3702
+ - room
3703
+ - custom
3704
+ - not_sure
3705
+ items:
3706
+ type: array
3707
+ items:
3708
+ type: object
3709
+ properties:
3710
+ key:
3711
+ type: string
3712
+ itemText:
3713
+ type: string
3714
+ description:
3715
+ type:
3716
+ - string
3717
+ - 'null'
3718
+ itemType:
3719
+ type: string
3720
+ enum:
3721
+ - checkbox
3722
+ - yes/no
3723
+ - text
3724
+ - number
3725
+ - date
3726
+ - dropdown
3727
+ - multi-select
3728
+ - photo
3729
+ - signature
3730
+ required:
3731
+ type: boolean
3732
+ options:
3733
+ type:
3734
+ - object
3735
+ - 'null'
3736
+ additionalProperties: {}
3737
+ referenceMedia:
3738
+ type: array
3739
+ items:
3740
+ type: object
3741
+ properties:
3742
+ assetId:
3743
+ type: string
3744
+ minLength: 1
3745
+ maxLength: 64
3746
+ caption:
3747
+ type:
3748
+ - string
3749
+ - 'null'
3750
+ maxLength: 300
3751
+ order:
3752
+ type: integer
3753
+ minimum: 0
3754
+ required:
3755
+ - assetId
3756
+ maxItems: 10
3757
+ hints:
3758
+ type: array
3759
+ items:
3760
+ type: string
3761
+ enum:
3762
+ - photo_required
3763
+ - yes_no
3764
+ - required
3765
+ - reading
3766
+ roomSource:
3767
+ type: string
3768
+ enum:
3769
+ - pose
3770
+ - named
3771
+ - vision
3772
+ - time
3773
+ - none
3774
+ spokenAt:
3775
+ type: string
3776
+ quote:
3777
+ type:
3778
+ - string
3779
+ - 'null'
3780
+ required:
3781
+ - key
3782
+ - itemText
3783
+ - description
3784
+ - itemType
3785
+ - required
3786
+ - options
3787
+ - referenceMedia
3788
+ - hints
3789
+ - roomSource
3790
+ - spokenAt
3791
+ - quote
3792
+ required:
3793
+ - key
3794
+ - title
3795
+ - sketchRoomId
3796
+ - kind
3797
+ - items
3798
+ photos:
3799
+ type: array
3800
+ items:
3801
+ type: object
3802
+ properties:
3803
+ assetId:
3804
+ type: string
3805
+ capturedAt:
3806
+ type: string
3807
+ sectionKey:
3808
+ type:
3809
+ - string
3810
+ - 'null'
3811
+ roomSource:
3812
+ type: string
3813
+ enum:
3814
+ - pose
3815
+ - named
3816
+ - vision
3817
+ - time
3818
+ - none
3819
+ itemKeys:
3820
+ type: array
3821
+ items:
3822
+ type: string
3823
+ required:
3824
+ - assetId
3825
+ - capturedAt
3826
+ - sectionKey
3827
+ - roomSource
3828
+ - itemKeys
3829
+ visionUsed:
3830
+ type: boolean
3831
+ model:
3832
+ type:
3833
+ - string
3834
+ - 'null'
3835
+ promptVersion:
3836
+ type: string
3837
+ required:
3838
+ - name
3839
+ - sections
3840
+ - photos
3841
+ - visionUsed
3842
+ - model
3843
+ - promptVersion
3844
+ WalkthroughDraftResponse:
3845
+ type: object
3846
+ properties:
3847
+ status:
3848
+ type: string
3849
+ enum:
3850
+ - completed
3851
+ - running
3852
+ - failed
3853
+ runId:
3854
+ type:
3855
+ - integer
3856
+ - 'null'
3857
+ draft:
3858
+ type:
3859
+ - object
3860
+ - 'null'
3861
+ properties:
3862
+ name:
3863
+ type: string
3864
+ sections:
3865
+ type: array
3866
+ items:
3867
+ type: object
3868
+ properties:
3869
+ key:
3870
+ type: string
3871
+ title:
3872
+ type: string
3873
+ sketchRoomId:
3874
+ type:
3875
+ - integer
3876
+ - 'null'
3877
+ kind:
3878
+ type: string
3879
+ enum:
3880
+ - room
3881
+ - custom
3882
+ - not_sure
3883
+ items:
3884
+ type: array
3885
+ items:
3886
+ type: object
3887
+ properties:
3888
+ key:
3889
+ type: string
3890
+ itemText:
3891
+ type: string
3892
+ description:
3893
+ type:
3894
+ - string
3895
+ - 'null'
3896
+ itemType:
3897
+ type: string
3898
+ enum:
3899
+ - checkbox
3900
+ - yes/no
3901
+ - text
3902
+ - number
3903
+ - date
3904
+ - dropdown
3905
+ - multi-select
3906
+ - photo
3907
+ - signature
3908
+ required:
3909
+ type: boolean
3910
+ options:
3911
+ type:
3912
+ - object
3913
+ - 'null'
3914
+ additionalProperties: {}
3915
+ referenceMedia:
3916
+ type: array
3917
+ items:
3918
+ type: object
3919
+ properties:
3920
+ assetId:
3921
+ type: string
3922
+ minLength: 1
3923
+ maxLength: 64
3924
+ caption:
3925
+ type:
3926
+ - string
3927
+ - 'null'
3928
+ maxLength: 300
3929
+ order:
3930
+ type: integer
3931
+ minimum: 0
3932
+ required:
3933
+ - assetId
3934
+ maxItems: 10
3935
+ hints:
3936
+ type: array
3937
+ items:
3938
+ type: string
3939
+ enum:
3940
+ - photo_required
3941
+ - yes_no
3942
+ - required
3943
+ - reading
3944
+ roomSource:
3945
+ type: string
3946
+ enum:
3947
+ - pose
3948
+ - named
3949
+ - vision
3950
+ - time
3951
+ - none
3952
+ spokenAt:
3953
+ type: string
3954
+ quote:
3955
+ type:
3956
+ - string
3957
+ - 'null'
3958
+ required:
3959
+ - key
3960
+ - itemText
3961
+ - description
3962
+ - itemType
3963
+ - required
3964
+ - options
3965
+ - referenceMedia
3966
+ - hints
3967
+ - roomSource
3968
+ - spokenAt
3969
+ - quote
3970
+ required:
3971
+ - key
3972
+ - title
3973
+ - sketchRoomId
3974
+ - kind
3975
+ - items
3976
+ photos:
3977
+ type: array
3978
+ items:
3979
+ type: object
3980
+ properties:
3981
+ assetId:
3982
+ type: string
3983
+ capturedAt:
3984
+ type: string
3985
+ sectionKey:
3986
+ type:
3987
+ - string
3988
+ - 'null'
3989
+ roomSource:
3990
+ type: string
3991
+ enum:
3992
+ - pose
3993
+ - named
3994
+ - vision
3995
+ - time
3996
+ - none
3997
+ itemKeys:
3998
+ type: array
3999
+ items:
4000
+ type: string
4001
+ required:
4002
+ - assetId
4003
+ - capturedAt
4004
+ - sectionKey
4005
+ - roomSource
4006
+ - itemKeys
4007
+ visionUsed:
4008
+ type: boolean
4009
+ model:
4010
+ type:
4011
+ - string
4012
+ - 'null'
4013
+ promptVersion:
4014
+ type: string
4015
+ required:
4016
+ - name
4017
+ - sections
4018
+ - photos
4019
+ - visionUsed
4020
+ - model
4021
+ - promptVersion
4022
+ sortRun:
4023
+ type:
4024
+ - object
4025
+ - 'null'
4026
+ properties:
4027
+ status:
4028
+ type: string
4029
+ enum:
4030
+ - running
4031
+ - completed
4032
+ - failed
4033
+ total:
4034
+ type: integer
4035
+ done:
4036
+ type: integer
4037
+ required:
4038
+ - status
4039
+ - total
4040
+ - done
4041
+ message:
4042
+ type:
4043
+ - string
4044
+ - 'null'
4045
+ required:
4046
+ - status
4047
+ - runId
4048
+ - draft
4049
+ - sortRun
4050
+ - message
4051
+ ChattyListJobChecklistsArguments:
4052
+ type: object
4053
+ properties:
4054
+ jobId:
4055
+ anyOf:
4056
+ - type: integer
4057
+ exclusiveMinimum: 0
4058
+ - type: string
4059
+ pattern: ^\d+$
4060
+ description: '`arguments` of the Chatty tool `list_job_checklists` (POST /api/chatty-voice/tools/execute).'
4061
+ ChattyListJobChecklistsData:
4062
+ type: array
4063
+ items:
4064
+ type: object
4065
+ properties:
4066
+ id:
4067
+ type: integer
4068
+ name:
4069
+ type: string
4070
+ status:
4071
+ type:
4072
+ - string
4073
+ - 'null'
4074
+ completionPercentage:
4075
+ type: number
4076
+ templateId:
4077
+ type:
4078
+ - integer
4079
+ - 'null'
4080
+ required:
4081
+ - id
4082
+ - name
4083
+ - status
4084
+ - completionPercentage
4085
+ - templateId
4086
+ description: '`data` of a successful `list_job_checklists` call (`success: true`).'
4087
+ ChattyGetChecklistArguments:
4088
+ type: object
4089
+ properties:
4090
+ checklistId:
4091
+ anyOf:
4092
+ - type: integer
4093
+ exclusiveMinimum: 0
4094
+ - type: string
4095
+ pattern: ^\d+$
4096
+ checklistName:
4097
+ type: string
4098
+ jobId:
4099
+ anyOf:
4100
+ - type: integer
4101
+ exclusiveMinimum: 0
4102
+ - type: string
4103
+ pattern: ^\d+$
4104
+ description: '`arguments` of the Chatty tool `get_checklist` (POST /api/chatty-voice/tools/execute).'
4105
+ ChattyGetChecklistData:
4106
+ type: object
4107
+ properties:
4108
+ id:
4109
+ type: integer
4110
+ name:
4111
+ type: string
4112
+ status:
4113
+ type:
4114
+ - string
4115
+ - 'null'
4116
+ completionPercentage:
4117
+ type: number
4118
+ jobId:
4119
+ type:
4120
+ - integer
4121
+ - 'null'
4122
+ items:
4123
+ type: array
4124
+ items:
4125
+ type: object
4126
+ properties:
4127
+ id:
4128
+ type: integer
4129
+ itemText:
4130
+ type: string
4131
+ itemType:
4132
+ type: string
4133
+ required:
4134
+ type: boolean
4135
+ done:
4136
+ type: boolean
4137
+ value:
4138
+ type:
4139
+ - string
4140
+ - 'null'
4141
+ section:
4142
+ type:
4143
+ - string
4144
+ - 'null'
4145
+ referencePhotos:
4146
+ type: integer
4147
+ required:
4148
+ - id
4149
+ - itemText
4150
+ - itemType
4151
+ - required
4152
+ - done
4153
+ - value
4154
+ - section
4155
+ - referencePhotos
4156
+ required:
4157
+ - id
4158
+ - name
4159
+ - status
4160
+ - completionPercentage
4161
+ - jobId
4162
+ - items
4163
+ description: '`data` of a successful `get_checklist` call (`success: true`).'
4164
+ ChattyCreateChecklistArguments:
4165
+ type: object
4166
+ properties:
4167
+ jobId:
4168
+ anyOf:
4169
+ - type: integer
4170
+ exclusiveMinimum: 0
4171
+ - type: string
4172
+ pattern: ^\d+$
4173
+ name:
4174
+ type: string
4175
+ templateId:
4176
+ anyOf:
4177
+ - type: integer
4178
+ exclusiveMinimum: 0
4179
+ - type: string
4180
+ pattern: ^\d+$
4181
+ templateName:
4182
+ type: string
4183
+ notes:
4184
+ type: string
4185
+ items:
4186
+ type: array
4187
+ items:
4188
+ type: string
4189
+ description: '`arguments` of the Chatty tool `create_checklist` (POST /api/chatty-voice/tools/execute).'
4190
+ ChattyCreateChecklistData:
4191
+ type: object
4192
+ properties:
4193
+ id:
4194
+ type: integer
4195
+ name:
4196
+ type: string
4197
+ jobId:
4198
+ type: integer
4199
+ itemCount:
4200
+ type: integer
4201
+ templateId:
4202
+ type: integer
4203
+ sections:
4204
+ type: array
4205
+ items:
4206
+ type: object
4207
+ properties:
4208
+ title:
4209
+ type: string
4210
+ items:
4211
+ type: array
4212
+ items:
4213
+ type: object
4214
+ properties:
4215
+ itemText:
4216
+ type: string
4217
+ itemType:
4218
+ type: string
4219
+ enum:
4220
+ - checkbox
4221
+ - yes/no
4222
+ - text
4223
+ - number
4224
+ - date
4225
+ - dropdown
4226
+ - multi-select
4227
+ - photo
4228
+ - signature
4229
+ required:
4230
+ type: boolean
4231
+ required:
4232
+ - itemText
4233
+ - itemType
4234
+ - required
4235
+ required:
4236
+ - title
4237
+ - items
4238
+ required:
4239
+ - id
4240
+ - name
4241
+ - jobId
4242
+ - itemCount
4243
+ description: '`data` of a successful `create_checklist` call (`success: true`).'
4244
+ ChattyAddChecklistItemArguments:
4245
+ type: object
4246
+ properties:
4247
+ checklistId:
4248
+ anyOf:
4249
+ - type: integer
4250
+ exclusiveMinimum: 0
4251
+ - type: string
4252
+ pattern: ^\d+$
4253
+ checklistName:
4254
+ type: string
4255
+ jobId:
4256
+ anyOf:
4257
+ - type: integer
4258
+ exclusiveMinimum: 0
4259
+ - type: string
4260
+ pattern: ^\d+$
4261
+ itemText:
4262
+ type: string
4263
+ itemType:
4264
+ type: string
4265
+ enum:
4266
+ - checkbox
4267
+ - yes/no
4268
+ - text
4269
+ - number
4270
+ - date
4271
+ - dropdown
4272
+ - multi-select
4273
+ - photo
4274
+ - signature
4275
+ required:
4276
+ type: boolean
4277
+ description:
4278
+ type: string
4279
+ sectionName:
4280
+ type: string
4281
+ required:
4282
+ - itemText
4283
+ description: '`arguments` of the Chatty tool `add_checklist_item` (POST /api/chatty-voice/tools/execute).'
4284
+ ChattyAddChecklistItemData:
4285
+ type: object
4286
+ properties:
4287
+ id:
4288
+ type: integer
4289
+ checklistId:
4290
+ type: integer
4291
+ itemText:
4292
+ type: string
4293
+ itemType:
4294
+ type: string
4295
+ enum:
4296
+ - checkbox
4297
+ - yes/no
4298
+ - text
4299
+ - number
4300
+ - date
4301
+ - dropdown
4302
+ - multi-select
4303
+ - photo
4304
+ - signature
4305
+ required:
4306
+ type: boolean
4307
+ section:
4308
+ type:
4309
+ - string
4310
+ - 'null'
4311
+ required:
4312
+ - id
4313
+ - checklistId
4314
+ - itemText
4315
+ - itemType
4316
+ - required
4317
+ - section
4318
+ description: '`data` of a successful `add_checklist_item` call (`success: true`).'
4319
+ ChattyCompleteChecklistItemArguments:
4320
+ type: object
4321
+ properties:
4322
+ checklistId:
4323
+ anyOf:
4324
+ - type: integer
4325
+ exclusiveMinimum: 0
4326
+ - type: string
4327
+ pattern: ^\d+$
4328
+ checklistName:
4329
+ type: string
4330
+ jobId:
4331
+ anyOf:
4332
+ - type: integer
4333
+ exclusiveMinimum: 0
4334
+ - type: string
4335
+ pattern: ^\d+$
4336
+ itemId:
4337
+ anyOf:
4338
+ - type: integer
4339
+ exclusiveMinimum: 0
4340
+ - type: string
4341
+ pattern: ^\d+$
4342
+ itemText:
4343
+ type: string
4344
+ completed:
4345
+ type: boolean
4346
+ description: '`arguments` of the Chatty tool `complete_checklist_item` (POST /api/chatty-voice/tools/execute).'
4347
+ ChattyCompleteChecklistItemData:
4348
+ type: object
4349
+ properties:
4350
+ checklistId:
4351
+ type: integer
4352
+ itemId:
4353
+ type: integer
4354
+ completed:
4355
+ type: boolean
4356
+ required:
4357
+ - checklistId
4358
+ - itemId
4359
+ - completed
4360
+ description: '`data` of a successful `complete_checklist_item` call (`success: true`).'
4361
+ ChattySetChecklistItemAnswerArguments:
4362
+ type: object
4363
+ properties:
4364
+ checklistId:
4365
+ anyOf:
4366
+ - type: integer
4367
+ exclusiveMinimum: 0
4368
+ - type: string
4369
+ pattern: ^\d+$
4370
+ checklistName:
4371
+ type: string
4372
+ jobId:
4373
+ anyOf:
4374
+ - type: integer
4375
+ exclusiveMinimum: 0
4376
+ - type: string
4377
+ pattern: ^\d+$
4378
+ itemId:
4379
+ anyOf:
4380
+ - type: integer
4381
+ exclusiveMinimum: 0
4382
+ - type: string
4383
+ pattern: ^\d+$
4384
+ itemText:
4385
+ type: string
4386
+ value:
4387
+ type: string
4388
+ required:
4389
+ - value
4390
+ description: '`arguments` of the Chatty tool `set_checklist_item_answer` (POST /api/chatty-voice/tools/execute).'
4391
+ ChattySetChecklistItemAnswerData:
4392
+ type: object
4393
+ properties:
4394
+ checklistId:
4395
+ type: integer
4396
+ itemId:
4397
+ type: integer
4398
+ value:
4399
+ type: string
4400
+ required:
4401
+ - checklistId
4402
+ - itemId
4403
+ - value
4404
+ description: '`data` of a successful `set_checklist_item_answer` call (`success: true`).'
4405
+ ChattyAttachReferencePhotoToItemArguments:
4406
+ type: object
4407
+ properties:
4408
+ checklistId:
4409
+ anyOf:
4410
+ - type: integer
4411
+ exclusiveMinimum: 0
4412
+ - type: string
4413
+ pattern: ^\d+$
4414
+ checklistName:
4415
+ type: string
4416
+ jobId:
4417
+ anyOf:
4418
+ - type: integer
4419
+ exclusiveMinimum: 0
4420
+ - type: string
4421
+ pattern: ^\d+$
4422
+ itemId:
4423
+ anyOf:
4424
+ - type: integer
4425
+ exclusiveMinimum: 0
4426
+ - type: string
4427
+ pattern: ^\d+$
4428
+ itemText:
4429
+ type: string
4430
+ photoId:
4431
+ anyOf:
4432
+ - type: integer
4433
+ exclusiveMinimum: 0
4434
+ - type: string
4435
+ pattern: ^\d+$
4436
+ caption:
4437
+ type: string
4438
+ required:
4439
+ - photoId
4440
+ description: '`arguments` of the Chatty tool `attach_reference_photo_to_item` (POST /api/chatty-voice/tools/execute).'
4441
+ ChattyAttachReferencePhotoToItemData:
4442
+ type: object
4443
+ properties:
4444
+ checklistId:
4445
+ type: integer
4446
+ itemId:
4447
+ type: integer
4448
+ referenceMedia:
4449
+ type: array
4450
+ items:
4451
+ type: object
4452
+ properties:
4453
+ assetId:
4454
+ type: string
4455
+ minLength: 1
4456
+ maxLength: 64
4457
+ caption:
4458
+ type:
4459
+ - string
4460
+ - 'null'
4461
+ maxLength: 300
4462
+ order:
4463
+ type: integer
4464
+ minimum: 0
4465
+ required:
4466
+ - assetId
4467
+ required:
4468
+ - checklistId
4469
+ - itemId
4470
+ - referenceMedia
4471
+ description: '`data` of a successful `attach_reference_photo_to_item` call (`success: true`).'
4472
+ ChattyDraftChecklistFromJobPhotosArguments:
4473
+ type: object
4474
+ properties:
4475
+ jobId:
4476
+ anyOf:
4477
+ - type: integer
4478
+ exclusiveMinimum: 0
4479
+ - type: string
4480
+ pattern: ^\d+$
4481
+ name:
4482
+ type: string
4483
+ create:
3523
4484
  type: boolean
3524
- enum:
3525
- - true
3526
- token:
4485
+ description: '`arguments` of the Chatty tool `draft_checklist_from_job_photos` (POST /api/chatty-voice/tools/execute).'
4486
+ ChattyDraftChecklistFromJobPhotosData:
4487
+ type: object
4488
+ properties:
4489
+ id:
4490
+ type: integer
4491
+ jobId:
4492
+ type: integer
4493
+ name:
3527
4494
  type: string
3528
- roomIds:
4495
+ items:
3529
4496
  type: array
3530
4497
  items:
3531
- type: integer
4498
+ type: object
4499
+ properties:
4500
+ itemText:
4501
+ type: string
4502
+ photos:
4503
+ type: integer
4504
+ required:
4505
+ - itemText
4506
+ - photos
4507
+ unsortedPhotos:
4508
+ type: integer
4509
+ created:
4510
+ type: boolean
3532
4511
  required:
3533
- - ok
3534
- - token
3535
- - roomIds
4512
+ - name
4513
+ - items
4514
+ - unsortedPhotos
4515
+ - created
4516
+ description: '`data` of a successful `draft_checklist_from_job_photos` call (`success: true`).'
3536
4517
  parameters: {}
3537
4518
  paths:
3538
4519
  /api/version:
@@ -3602,6 +4583,181 @@ paths:
3602
4583
  application/json:
3603
4584
  schema:
3604
4585
  $ref: '#/components/schemas/UpgradeRequiredEnvelope'
4586
+ /api/impersonate/native-read-ticket:
4587
+ post:
4588
+ tags:
4589
+ - auth
4590
+ summary: Authorize an exact browser-native download URL for the current support session.
4591
+ description: >-
4592
+ Requires the current typed support session and X-Support-Impersonation: 1. A narrow fixed GET allowlist only;
4593
+ record permissions still run on every GET. Admission lasts at most 15 minutes and never outlives the original
4594
+ one-hour support grant. The same browser session is required; URL alone is insufficient. GET/Range retries
4595
+ recheck current authority. Response is no-store with no-referrer. No user bearer is issued.
4596
+ security:
4597
+ - BrowserSession: []
4598
+ parameters:
4599
+ - schema:
4600
+ type: string
4601
+ enum:
4602
+ - '1'
4603
+ required: true
4604
+ name: X-Support-Impersonation
4605
+ in: header
4606
+ requestBody:
4607
+ required: true
4608
+ content:
4609
+ application/json:
4610
+ schema:
4611
+ type: object
4612
+ properties:
4613
+ url:
4614
+ type: string
4615
+ minLength: 1
4616
+ maxLength: 1024
4617
+ required:
4618
+ - url
4619
+ additionalProperties: false
4620
+ responses:
4621
+ '200':
4622
+ description: Exact relative URL and terminal admission deadline.
4623
+ content:
4624
+ application/json:
4625
+ schema:
4626
+ type: object
4627
+ properties:
4628
+ url:
4629
+ type: string
4630
+ minLength: 1
4631
+ maxLength: 8192
4632
+ expiresAt:
4633
+ type: integer
4634
+ exclusiveMinimum: 0
4635
+ required:
4636
+ - url
4637
+ - expiresAt
4638
+ additionalProperties: false
4639
+ '400':
4640
+ description: Unsupported destination or malformed request.
4641
+ '401':
4642
+ description: No authenticated session.
4643
+ '403':
4644
+ description: Support authority unavailable; explicit exit required.
4645
+ content:
4646
+ application/json:
4647
+ schema:
4648
+ $ref: '#/components/schemas/StreamAuthenticationError'
4649
+ '503':
4650
+ description: Authentication lookup temporarily unavailable.
4651
+ content:
4652
+ application/json:
4653
+ schema:
4654
+ $ref: '#/components/schemas/StreamAuthenticationError'
4655
+ /api/events/ticket:
4656
+ post:
4657
+ tags:
4658
+ - auth
4659
+ summary: Create a short-lived stream-only admission ticket from the current authenticated actor.
4660
+ description: >-
4661
+ Connect within at most 60 seconds using GET /api/events?ticket=.... The ticket preserves the real principal,
4662
+ effective target and original login/impersonation deadlines; it cannot authenticate ordinary API requests. It is
4663
+ never a target-user bearer token. Response Cache-Control is no-store. An invalid temporary context returns 403
4664
+ and must be explicitly exited, without dropping the real login.
4665
+ security:
4666
+ - UserBearer: []
4667
+ - BrowserSession: []
4668
+ - BrowserAuthCookie: []
4669
+ requestBody:
4670
+ required: false
4671
+ content:
4672
+ application/json:
4673
+ schema:
4674
+ type: object
4675
+ properties: {}
4676
+ additionalProperties: false
4677
+ responses:
4678
+ '200':
4679
+ description: Opaque ticket, usable only for short-lived stream admission.
4680
+ content:
4681
+ application/json:
4682
+ schema:
4683
+ $ref: '#/components/schemas/EventStreamTicketResponse'
4684
+ '400':
4685
+ description: Unexpected request fields.
4686
+ content:
4687
+ application/json:
4688
+ schema:
4689
+ type: object
4690
+ properties:
4691
+ message:
4692
+ type: string
4693
+ errors:
4694
+ type: array
4695
+ items: {}
4696
+ required:
4697
+ - message
4698
+ - errors
4699
+ '401':
4700
+ description: Real principal is missing, deleted, revoked or expired.
4701
+ content:
4702
+ application/json:
4703
+ schema:
4704
+ $ref: '#/components/schemas/StreamAuthenticationError'
4705
+ '403':
4706
+ description: Impersonation is unavailable; explicitly exit before continuing as the real principal.
4707
+ content:
4708
+ application/json:
4709
+ schema:
4710
+ $ref: '#/components/schemas/StreamAuthenticationError'
4711
+ '503':
4712
+ description: Authentication lookup unavailable; retry without discarding credentials.
4713
+ content:
4714
+ application/json:
4715
+ schema:
4716
+ $ref: '#/components/schemas/StreamAuthenticationError'
4717
+ /api/events:
4718
+ get:
4719
+ tags:
4720
+ - auth
4721
+ summary: Open the authenticated server-sent event stream.
4722
+ description: >-
4723
+ New clients use a stream-only ticket in the ticket query parameter. Legacy authenticated connections remain
4724
+ supported. A supplied invalid ticket never falls back to another credential. Current user, session and
4725
+ revocation state is rechecked before admission and each delivery batch/heartbeat. Original authority deadlines
4726
+ also close idle or blocked sockets. A stream:resync hint means refresh authorized snapshots; this stream is not
4727
+ a replay log.
4728
+ parameters:
4729
+ - schema:
4730
+ type: string
4731
+ minLength: 1
4732
+ maxLength: 8192
4733
+ required: false
4734
+ name: ticket
4735
+ in: query
4736
+ responses:
4737
+ '200':
4738
+ description: Bounded SSE hints and heartbeat comments until disconnect or authority expiry.
4739
+ content:
4740
+ text/event-stream:
4741
+ schema:
4742
+ type: string
4743
+ '401':
4744
+ description: Ticket/source authentication expired, revoked or invalid.
4745
+ content:
4746
+ application/json:
4747
+ schema:
4748
+ $ref: '#/components/schemas/StreamAuthenticationError'
4749
+ '403':
4750
+ description: Legacy temporary context is unavailable.
4751
+ content:
4752
+ application/json:
4753
+ schema:
4754
+ $ref: '#/components/schemas/StreamAuthenticationError'
4755
+ '503':
4756
+ description: Authorization temporarily unavailable; retry with backoff.
4757
+ content:
4758
+ application/json:
4759
+ schema:
4760
+ $ref: '#/components/schemas/StreamAuthenticationError'
3605
4761
  /api/jobs/{jobId}/scans/mobile-upload:
3606
4762
  post:
3607
4763
  summary: iOS LiDAR scan upload. v2 fields are additive — v1 payloads remain byte-identical.
@@ -7432,4 +8588,116 @@ paths:
7432
8588
  application/json:
7433
8589
  schema:
7434
8590
  $ref: '#/components/schemas/ErrorEnvelope'
8591
+ /api/projects/{projectId}/documents/draft-from-walkthrough:
8592
+ post:
8593
+ tags:
8594
+ - checklists
8595
+ summary: Turn a voice walk-through (timed transcript + photos) into a checklist draft.
8596
+ description: >-
8597
+ Returns a DRAFT only; nothing is saved to the job. The phone's review screen creates the checklist with POST
8598
+ /api/projects/{projectId}/documents (custom `items`, carrying `referenceMedia`). Sections come from, in order:
8599
+ the camera pose of a scan, the room the tech named (the item's words, the photo's room chip, a section opened),
8600
+ the AI Image Sort's room for the item's photo (add-on), then the last room mentioned; items with no signal go to
8601
+ Not sure. GPS is never used. Item types come from spoken hints only (checkbox unless "photo required", "yes or
8602
+ no" or a reading; "required" sets the flag). Reference photos are the shots taken from 10 s before a sentence to
8603
+ 20 s after it. 200 when the draft is ready at once; 202 with `runId` while the photos go through an AI vision
8604
+ sort (poll the runs route). Requires the job (404 otherwise) and the Create Checklists permission (403). Photos
8605
+ that are not the organization's assets are left out.
8606
+ parameters:
8607
+ - &ref_3
8608
+ name: projectId
8609
+ in: path
8610
+ required: true
8611
+ schema:
8612
+ type: integer
8613
+ minimum: 1
8614
+ requestBody:
8615
+ required: true
8616
+ content:
8617
+ application/json:
8618
+ schema:
8619
+ $ref: '#/components/schemas/WalkthroughDraftRequest'
8620
+ responses:
8621
+ '200':
8622
+ description: The draft (status completed).
8623
+ content:
8624
+ application/json:
8625
+ schema:
8626
+ $ref: '#/components/schemas/WalkthroughDraftResponse'
8627
+ '202':
8628
+ description: A vision sort runs first (status running); poll GET …/draft-from-walkthrough/runs/{runId}.
8629
+ content:
8630
+ application/json:
8631
+ schema:
8632
+ $ref: '#/components/schemas/WalkthroughDraftResponse'
8633
+ '400':
8634
+ description: No transcript, or a wrong shape.
8635
+ content:
8636
+ application/json:
8637
+ schema:
8638
+ $ref: '#/components/schemas/ErrorEnvelope'
8639
+ '401':
8640
+ description: Authentication required.
8641
+ '403':
8642
+ description: The role cannot create checklists.
8643
+ content:
8644
+ application/json:
8645
+ schema:
8646
+ $ref: '#/components/schemas/ErrorEnvelope'
8647
+ '404':
8648
+ description: Job not found.
8649
+ content:
8650
+ application/json:
8651
+ schema:
8652
+ $ref: '#/components/schemas/ErrorEnvelope'
8653
+ '502':
8654
+ description: The AI's answer could not be used.
8655
+ content:
8656
+ application/json:
8657
+ schema:
8658
+ $ref: '#/components/schemas/ErrorEnvelope'
8659
+ '503':
8660
+ description: AI is not configured.
8661
+ content:
8662
+ application/json:
8663
+ schema:
8664
+ $ref: '#/components/schemas/ErrorEnvelope'
8665
+ /api/projects/{projectId}/documents/draft-from-walkthrough/runs/{runId}:
8666
+ get:
8667
+ tags:
8668
+ - checklists
8669
+ summary: Poll a walk-through draft that waits for an AI vision sort.
8670
+ description: >-
8671
+ Status `running` (with the sort's progress in `sortRun`) until the draft is ready, then `completed` with
8672
+ `draft`, or `failed` with `message`. A run that stops making progress is marked failed on the next poll and
8673
+ never re-run.
8674
+ parameters:
8675
+ - *ref_3
8676
+ - name: runId
8677
+ in: path
8678
+ required: true
8679
+ schema:
8680
+ type: integer
8681
+ minimum: 1
8682
+ responses:
8683
+ '200':
8684
+ description: The run's envelope.
8685
+ content:
8686
+ application/json:
8687
+ schema:
8688
+ $ref: '#/components/schemas/WalkthroughDraftResponse'
8689
+ '401':
8690
+ description: Authentication required.
8691
+ '403':
8692
+ description: The role cannot create checklists.
8693
+ content:
8694
+ application/json:
8695
+ schema:
8696
+ $ref: '#/components/schemas/ErrorEnvelope'
8697
+ '404':
8698
+ description: Job or run not found.
8699
+ content:
8700
+ application/json:
8701
+ schema:
8702
+ $ref: '#/components/schemas/ErrorEnvelope'
7435
8703
  webhooks: {}