@wspc/cli 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +3 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +29 -29
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/spec/openapi.json +499 -677
package/spec/openapi.json
CHANGED
|
@@ -46,20 +46,6 @@
|
|
|
46
46
|
"updated_at"
|
|
47
47
|
]
|
|
48
48
|
},
|
|
49
|
-
"CreateApiKeyBody": {
|
|
50
|
-
"type": "object",
|
|
51
|
-
"properties": {
|
|
52
|
-
"label": {
|
|
53
|
-
"type": "string",
|
|
54
|
-
"minLength": 1,
|
|
55
|
-
"maxLength": 60,
|
|
56
|
-
"description": "Human-readable label for the new key (1–60 chars after trimming). Pick something that identifies where the key will live — agent name, machine, or environment — so you can recognise it later in `wspc keys list`."
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
"required": [
|
|
60
|
-
"label"
|
|
61
|
-
]
|
|
62
|
-
},
|
|
63
49
|
"CreateApiKeyResponse": {
|
|
64
50
|
"type": "object",
|
|
65
51
|
"properties": {
|
|
@@ -92,17 +78,18 @@
|
|
|
92
78
|
"created_at"
|
|
93
79
|
]
|
|
94
80
|
},
|
|
95
|
-
"
|
|
81
|
+
"CreateApiKeyBody": {
|
|
96
82
|
"type": "object",
|
|
97
83
|
"properties": {
|
|
98
|
-
"
|
|
84
|
+
"label": {
|
|
99
85
|
"type": "string",
|
|
100
|
-
"
|
|
101
|
-
"
|
|
86
|
+
"minLength": 1,
|
|
87
|
+
"maxLength": 60,
|
|
88
|
+
"description": "Human-readable label for the new key (1–60 chars after trimming). Pick something that identifies where the key will live — agent name, machine, or environment — so you can recognise it later in `wspc keys list`."
|
|
102
89
|
}
|
|
103
90
|
},
|
|
104
91
|
"required": [
|
|
105
|
-
"
|
|
92
|
+
"label"
|
|
106
93
|
]
|
|
107
94
|
},
|
|
108
95
|
"OrgInviteSummary": {
|
|
@@ -148,24 +135,17 @@
|
|
|
148
135
|
"invite_url"
|
|
149
136
|
]
|
|
150
137
|
},
|
|
151
|
-
"
|
|
138
|
+
"CreateOrgInviteInput": {
|
|
152
139
|
"type": "object",
|
|
153
140
|
"properties": {
|
|
154
|
-
"
|
|
155
|
-
"type": "string",
|
|
156
|
-
"description": "Identifier of the OAuth client initiating the device flow. Must already be registered via `POST /auth/oauth/register`."
|
|
157
|
-
},
|
|
158
|
-
"scope": {
|
|
159
|
-
"type": "string",
|
|
160
|
-
"description": "Optional space-separated scope list. Defaults to `wspc:full` when omitted; WSPC issues only this scope today."
|
|
161
|
-
},
|
|
162
|
-
"resource": {
|
|
141
|
+
"email": {
|
|
163
142
|
"type": "string",
|
|
164
|
-
"
|
|
143
|
+
"format": "email",
|
|
144
|
+
"description": "Email address to invite into the caller's organization."
|
|
165
145
|
}
|
|
166
146
|
},
|
|
167
147
|
"required": [
|
|
168
|
-
"
|
|
148
|
+
"email"
|
|
169
149
|
]
|
|
170
150
|
},
|
|
171
151
|
"OAuthDeviceResponse": {
|
|
@@ -207,6 +187,26 @@
|
|
|
207
187
|
"interval"
|
|
208
188
|
]
|
|
209
189
|
},
|
|
190
|
+
"OAuthDeviceBody": {
|
|
191
|
+
"type": "object",
|
|
192
|
+
"properties": {
|
|
193
|
+
"client_id": {
|
|
194
|
+
"type": "string",
|
|
195
|
+
"description": "Identifier of the OAuth client initiating the device flow. Must already be registered via `POST /auth/oauth/register`."
|
|
196
|
+
},
|
|
197
|
+
"scope": {
|
|
198
|
+
"type": "string",
|
|
199
|
+
"description": "Optional space-separated scope list. Defaults to `wspc:full` when omitted; WSPC issues only this scope today."
|
|
200
|
+
},
|
|
201
|
+
"resource": {
|
|
202
|
+
"type": "string",
|
|
203
|
+
"description": "Optional RFC 8707 resource indicator the resulting access token will be bound to. When omitted, the server uses the default WSPC API audience."
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
"required": [
|
|
207
|
+
"client_id"
|
|
208
|
+
]
|
|
209
|
+
},
|
|
210
210
|
"OrgInviteView": {
|
|
211
211
|
"type": "object",
|
|
212
212
|
"properties": {
|
|
@@ -315,19 +315,6 @@
|
|
|
315
315
|
"invites"
|
|
316
316
|
]
|
|
317
317
|
},
|
|
318
|
-
"ListOrgMembersQuery": {
|
|
319
|
-
"type": "object",
|
|
320
|
-
"properties": {
|
|
321
|
-
"cursor": {
|
|
322
|
-
"type": "string",
|
|
323
|
-
"description": "Opaque pagination cursor. Pass the `next_cursor` returned by the previous page to fetch the next slice. Omit on the first call."
|
|
324
|
-
},
|
|
325
|
-
"limit": {
|
|
326
|
-
"type": "string",
|
|
327
|
-
"description": "Maximum members to return. Clamped to [1, 100]. Defaults to 50."
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
},
|
|
331
318
|
"ListOrgMembersResponse": {
|
|
332
319
|
"type": "object",
|
|
333
320
|
"properties": {
|
|
@@ -500,48 +487,6 @@
|
|
|
500
487
|
"token_endpoint_auth_methods_supported"
|
|
501
488
|
]
|
|
502
489
|
},
|
|
503
|
-
"OAuthRegisterBody": {
|
|
504
|
-
"type": "object",
|
|
505
|
-
"properties": {
|
|
506
|
-
"client_name": {
|
|
507
|
-
"type": "string",
|
|
508
|
-
"description": "Human-readable name for the client application. Shown to users on the consent screen so they know which agent / integration is requesting access."
|
|
509
|
-
},
|
|
510
|
-
"redirect_uris": {
|
|
511
|
-
"type": "array",
|
|
512
|
-
"items": {
|
|
513
|
-
"type": "string",
|
|
514
|
-
"format": "uri"
|
|
515
|
-
},
|
|
516
|
-
"minItems": 1,
|
|
517
|
-
"description": "Non-empty list of redirect URIs the client may use. Must exactly match the `redirect_uri` sent in subsequent authorization requests. Use `http://localhost:<port>/callback` for native / local development clients."
|
|
518
|
-
},
|
|
519
|
-
"token_endpoint_auth_method": {
|
|
520
|
-
"type": "string",
|
|
521
|
-
"enum": [
|
|
522
|
-
"none",
|
|
523
|
-
"client_secret_basic"
|
|
524
|
-
],
|
|
525
|
-
"default": "none",
|
|
526
|
-
"description": "Client authentication method to use at the token endpoint. `none` (the default and the only fully supported value today) is for public PKCE clients; `client_secret_basic` is reserved for future confidential clients."
|
|
527
|
-
},
|
|
528
|
-
"grant_types": {
|
|
529
|
-
"type": "array",
|
|
530
|
-
"items": {
|
|
531
|
-
"type": "string"
|
|
532
|
-
},
|
|
533
|
-
"default": [
|
|
534
|
-
"authorization_code",
|
|
535
|
-
"refresh_token"
|
|
536
|
-
],
|
|
537
|
-
"description": "List of grant types the client intends to use. Defaults to `[\"authorization_code\", \"refresh_token\"]`; add `urn:ietf:params:oauth:grant-type:device_code` for device flow."
|
|
538
|
-
}
|
|
539
|
-
},
|
|
540
|
-
"required": [
|
|
541
|
-
"client_name",
|
|
542
|
-
"redirect_uris"
|
|
543
|
-
]
|
|
544
|
-
},
|
|
545
490
|
"OAuthRegisterResponse": {
|
|
546
491
|
"type": "object",
|
|
547
492
|
"properties": {
|
|
@@ -585,16 +530,46 @@
|
|
|
585
530
|
"client_id_issued_at"
|
|
586
531
|
]
|
|
587
532
|
},
|
|
588
|
-
"
|
|
533
|
+
"OAuthRegisterBody": {
|
|
589
534
|
"type": "object",
|
|
590
535
|
"properties": {
|
|
591
|
-
"
|
|
536
|
+
"client_name": {
|
|
592
537
|
"type": "string",
|
|
593
|
-
"description": "
|
|
538
|
+
"description": "Human-readable name for the client application. Shown to users on the consent screen so they know which agent / integration is requesting access."
|
|
539
|
+
},
|
|
540
|
+
"redirect_uris": {
|
|
541
|
+
"type": "array",
|
|
542
|
+
"items": {
|
|
543
|
+
"type": "string",
|
|
544
|
+
"format": "uri"
|
|
545
|
+
},
|
|
546
|
+
"minItems": 1,
|
|
547
|
+
"description": "Non-empty list of redirect URIs the client may use. Must exactly match the `redirect_uri` sent in subsequent authorization requests. Use `http://localhost:<port>/callback` for native / local development clients."
|
|
548
|
+
},
|
|
549
|
+
"token_endpoint_auth_method": {
|
|
550
|
+
"type": "string",
|
|
551
|
+
"enum": [
|
|
552
|
+
"none",
|
|
553
|
+
"client_secret_basic"
|
|
554
|
+
],
|
|
555
|
+
"default": "none",
|
|
556
|
+
"description": "Client authentication method to use at the token endpoint. `none` (the default and the only fully supported value today) is for public PKCE clients; `client_secret_basic` is reserved for future confidential clients."
|
|
557
|
+
},
|
|
558
|
+
"grant_types": {
|
|
559
|
+
"type": "array",
|
|
560
|
+
"items": {
|
|
561
|
+
"type": "string"
|
|
562
|
+
},
|
|
563
|
+
"default": [
|
|
564
|
+
"authorization_code",
|
|
565
|
+
"refresh_token"
|
|
566
|
+
],
|
|
567
|
+
"description": "List of grant types the client intends to use. Defaults to `[\"authorization_code\", \"refresh_token\"]`; add `urn:ietf:params:oauth:grant-type:device_code` for device flow."
|
|
594
568
|
}
|
|
595
569
|
},
|
|
596
570
|
"required": [
|
|
597
|
-
"
|
|
571
|
+
"client_name",
|
|
572
|
+
"redirect_uris"
|
|
598
573
|
]
|
|
599
574
|
},
|
|
600
575
|
"RequestCodeResponse": {
|
|
@@ -617,6 +592,18 @@
|
|
|
617
592
|
"message"
|
|
618
593
|
]
|
|
619
594
|
},
|
|
595
|
+
"RequestCodeBody": {
|
|
596
|
+
"type": "object",
|
|
597
|
+
"properties": {
|
|
598
|
+
"email": {
|
|
599
|
+
"type": "string",
|
|
600
|
+
"description": "Email address to send the magic code to. Lowercased and trimmed server-side. The same response is returned whether or not the address is registered, to avoid disclosing account existence."
|
|
601
|
+
}
|
|
602
|
+
},
|
|
603
|
+
"required": [
|
|
604
|
+
"email"
|
|
605
|
+
]
|
|
606
|
+
},
|
|
620
607
|
"RevokeApiKeyResponse": {
|
|
621
608
|
"type": "object",
|
|
622
609
|
"properties": {
|
|
@@ -652,6 +639,41 @@
|
|
|
652
639
|
"token"
|
|
653
640
|
]
|
|
654
641
|
},
|
|
642
|
+
"OAuthTokenResponse": {
|
|
643
|
+
"type": "object",
|
|
644
|
+
"properties": {
|
|
645
|
+
"access_token": {
|
|
646
|
+
"type": "string",
|
|
647
|
+
"description": "Opaque bearer access token. Send as `Authorization: Bearer <access_token>` to WSPC services. Treat as a short-lived secret."
|
|
648
|
+
},
|
|
649
|
+
"token_type": {
|
|
650
|
+
"type": "string",
|
|
651
|
+
"enum": [
|
|
652
|
+
"Bearer"
|
|
653
|
+
],
|
|
654
|
+
"description": "Always the literal `Bearer`. WSPC issues OAuth bearer tokens only."
|
|
655
|
+
},
|
|
656
|
+
"expires_in": {
|
|
657
|
+
"type": "integer",
|
|
658
|
+
"description": "Lifetime of the access token in seconds. Clients should refresh before this deadline to avoid 401 responses."
|
|
659
|
+
},
|
|
660
|
+
"refresh_token": {
|
|
661
|
+
"type": "string",
|
|
662
|
+
"description": "Refresh token used to obtain a new access token without re-prompting the user. Rotated on every use; store securely."
|
|
663
|
+
},
|
|
664
|
+
"scope": {
|
|
665
|
+
"type": "string",
|
|
666
|
+
"description": "Space-separated list of OAuth scopes granted on this token. WSPC issues `wspc:full` today."
|
|
667
|
+
}
|
|
668
|
+
},
|
|
669
|
+
"required": [
|
|
670
|
+
"access_token",
|
|
671
|
+
"token_type",
|
|
672
|
+
"expires_in",
|
|
673
|
+
"refresh_token",
|
|
674
|
+
"scope"
|
|
675
|
+
]
|
|
676
|
+
},
|
|
655
677
|
"OAuthTokenBody": {
|
|
656
678
|
"oneOf": [
|
|
657
679
|
{
|
|
@@ -753,55 +775,6 @@
|
|
|
753
775
|
}
|
|
754
776
|
]
|
|
755
777
|
},
|
|
756
|
-
"OAuthTokenResponse": {
|
|
757
|
-
"type": "object",
|
|
758
|
-
"properties": {
|
|
759
|
-
"access_token": {
|
|
760
|
-
"type": "string",
|
|
761
|
-
"description": "Opaque bearer access token. Send as `Authorization: Bearer <access_token>` to WSPC services. Treat as a short-lived secret."
|
|
762
|
-
},
|
|
763
|
-
"token_type": {
|
|
764
|
-
"type": "string",
|
|
765
|
-
"enum": [
|
|
766
|
-
"Bearer"
|
|
767
|
-
],
|
|
768
|
-
"description": "Always the literal `Bearer`. WSPC issues OAuth bearer tokens only."
|
|
769
|
-
},
|
|
770
|
-
"expires_in": {
|
|
771
|
-
"type": "integer",
|
|
772
|
-
"description": "Lifetime of the access token in seconds. Clients should refresh before this deadline to avoid 401 responses."
|
|
773
|
-
},
|
|
774
|
-
"refresh_token": {
|
|
775
|
-
"type": "string",
|
|
776
|
-
"description": "Refresh token used to obtain a new access token without re-prompting the user. Rotated on every use; store securely."
|
|
777
|
-
},
|
|
778
|
-
"scope": {
|
|
779
|
-
"type": "string",
|
|
780
|
-
"description": "Space-separated list of OAuth scopes granted on this token. WSPC issues `wspc:full` today."
|
|
781
|
-
}
|
|
782
|
-
},
|
|
783
|
-
"required": [
|
|
784
|
-
"access_token",
|
|
785
|
-
"token_type",
|
|
786
|
-
"expires_in",
|
|
787
|
-
"refresh_token",
|
|
788
|
-
"scope"
|
|
789
|
-
]
|
|
790
|
-
},
|
|
791
|
-
"UpdateApiKeyBody": {
|
|
792
|
-
"type": "object",
|
|
793
|
-
"properties": {
|
|
794
|
-
"label": {
|
|
795
|
-
"type": "string",
|
|
796
|
-
"minLength": 1,
|
|
797
|
-
"maxLength": 60,
|
|
798
|
-
"description": "Human-readable label for the key (1–60 chars after trimming)."
|
|
799
|
-
}
|
|
800
|
-
},
|
|
801
|
-
"required": [
|
|
802
|
-
"label"
|
|
803
|
-
]
|
|
804
|
-
},
|
|
805
778
|
"UpdateApiKeyResponse": {
|
|
806
779
|
"type": "object",
|
|
807
780
|
"properties": {
|
|
@@ -832,35 +805,32 @@
|
|
|
832
805
|
"created_at"
|
|
833
806
|
]
|
|
834
807
|
},
|
|
835
|
-
"
|
|
808
|
+
"UpdateApiKeyBody": {
|
|
836
809
|
"type": "object",
|
|
837
810
|
"properties": {
|
|
838
|
-
"
|
|
811
|
+
"label": {
|
|
839
812
|
"type": "string",
|
|
840
813
|
"minLength": 1,
|
|
841
|
-
"maxLength":
|
|
842
|
-
"description": "
|
|
814
|
+
"maxLength": 60,
|
|
815
|
+
"description": "Human-readable label for the key (1–60 chars after trimming)."
|
|
843
816
|
}
|
|
844
817
|
},
|
|
845
818
|
"required": [
|
|
846
|
-
"
|
|
819
|
+
"label"
|
|
847
820
|
]
|
|
848
821
|
},
|
|
849
|
-
"
|
|
822
|
+
"UpdateOrgInput": {
|
|
850
823
|
"type": "object",
|
|
851
824
|
"properties": {
|
|
852
|
-
"
|
|
853
|
-
"type": "string",
|
|
854
|
-
"description": "Email address that received the magic code. Must exactly match (after lowercasing) the address used in the prior `POST /auth/request-code` call."
|
|
855
|
-
},
|
|
856
|
-
"code": {
|
|
825
|
+
"name": {
|
|
857
826
|
"type": "string",
|
|
858
|
-
"
|
|
827
|
+
"minLength": 1,
|
|
828
|
+
"maxLength": 100,
|
|
829
|
+
"description": "The new name for the organization. Cannot be empty or purely whitespace."
|
|
859
830
|
}
|
|
860
831
|
},
|
|
861
832
|
"required": [
|
|
862
|
-
"
|
|
863
|
-
"code"
|
|
833
|
+
"name"
|
|
864
834
|
]
|
|
865
835
|
},
|
|
866
836
|
"VerifyCodeResponse": {
|
|
@@ -885,75 +855,22 @@
|
|
|
885
855
|
"created"
|
|
886
856
|
]
|
|
887
857
|
},
|
|
888
|
-
"
|
|
858
|
+
"VerifyCodeBody": {
|
|
889
859
|
"type": "object",
|
|
890
860
|
"properties": {
|
|
891
|
-
"
|
|
892
|
-
"type": "string",
|
|
893
|
-
"minLength": 1,
|
|
894
|
-
"maxLength": 500,
|
|
895
|
-
"description": "Short human-readable summary of the event. Shown in list views and `.ics` SUMMARY."
|
|
896
|
-
},
|
|
897
|
-
"description": {
|
|
898
|
-
"type": "string",
|
|
899
|
-
"maxLength": 10000,
|
|
900
|
-
"description": "Free-form notes about the event (agenda, dial-in instructions, etc.). Markdown formatted (CommonMark + GFM tables, strikethrough, task lists); stored verbatim. Invitation emails include the raw source — most email clients display it as plain text."
|
|
901
|
-
},
|
|
902
|
-
"start": {
|
|
903
|
-
"type": "string",
|
|
904
|
-
"description": "Accepts ISO 8601 datetime with offset (e.g. `2026-06-01T12:30:00+08:00`) for timed events, or ISO date-only (e.g. `2026-06-01`) for all-day. The `wspc` CLI additionally accepts natural-language phrases (`tomorrow 12:30pm`, `next Monday 9am`) and resolves them to ISO before sending; the server itself only accepts ISO. All-day uses RFC 5545 exclusive end: a one-day event on 6/1 is `start=2026-06-01, end=2026-06-02`; both endpoints must be the same type."
|
|
905
|
-
},
|
|
906
|
-
"end": {
|
|
907
|
-
"type": "string",
|
|
908
|
-
"description": "Accepts ISO 8601 datetime with offset (e.g. `2026-06-01T12:30:00+08:00`) for timed events, or ISO date-only (e.g. `2026-06-01`) for all-day. The `wspc` CLI additionally accepts natural-language phrases (`tomorrow 12:30pm`, `next Monday 9am`) and resolves them to ISO before sending; the server itself only accepts ISO. All-day uses RFC 5545 exclusive end: a one-day event on 6/1 is `start=2026-06-01, end=2026-06-02`; both endpoints must be the same type."
|
|
909
|
-
},
|
|
910
|
-
"location": {
|
|
911
|
-
"type": "string",
|
|
912
|
-
"maxLength": 10000,
|
|
913
|
-
"description": "Free-text location — physical address, room, or short note. Separate from `url` (meeting link)."
|
|
914
|
-
},
|
|
915
|
-
"url": {
|
|
861
|
+
"email": {
|
|
916
862
|
"type": "string",
|
|
917
|
-
"
|
|
918
|
-
"description": "Optional meeting link (Zoom / Meet / etc.). Kept separate from `location` so calendar clients can render it as a join action."
|
|
863
|
+
"description": "Email address that received the magic code. Must exactly match (after lowercasing) the address used in the prior `POST /auth/request-code` call."
|
|
919
864
|
},
|
|
920
|
-
"
|
|
865
|
+
"code": {
|
|
921
866
|
"type": "string",
|
|
922
|
-
"
|
|
923
|
-
"confirmed",
|
|
924
|
-
"tentative",
|
|
925
|
-
"cancelled"
|
|
926
|
-
],
|
|
927
|
-
"description": "Lifecycle status. `confirmed`: the event will happen (default). `tentative`: organizer has not finalized; still visible in lists. `cancelled`: the event was called off but the record is kept so attendees can be notified and history audited; distinct from soft-delete (DELETE `/calendar/events/{id}`) which hides the event from default list responses."
|
|
928
|
-
},
|
|
929
|
-
"attendees": {
|
|
930
|
-
"type": "array",
|
|
931
|
-
"items": {
|
|
932
|
-
"type": "object",
|
|
933
|
-
"properties": {
|
|
934
|
-
"email": {
|
|
935
|
-
"type": "string",
|
|
936
|
-
"description": "Attendee email address. Used as the identity key for dedupe and invite/update/cancel fan-out."
|
|
937
|
-
},
|
|
938
|
-
"display_name": {
|
|
939
|
-
"type": "string",
|
|
940
|
-
"description": "Optional human-readable name shown in invitation emails and `.ics` payloads. Omit to fall back to the email address."
|
|
941
|
-
}
|
|
942
|
-
},
|
|
943
|
-
"required": [
|
|
944
|
-
"email"
|
|
945
|
-
],
|
|
946
|
-
"description": "A single attendee on a calendar event. Each event supports up to 50 unique attendees after case-insensitive email dedupe; new attendees receive an invitation email with an `.ics` REQUEST attachment, kept attendees receive an update email when the event is mutated, and removed attendees receive a cancellation."
|
|
947
|
-
},
|
|
948
|
-
"description": "Up to 50 unique attendees (deduped case-insensitively by email). If non-empty, each attendee receives an invitation email with an `.ics` REQUEST attachment as a side effect of creation."
|
|
867
|
+
"description": "Numeric magic code delivered by email. Single-use; expires a few minutes after issuance. Treat as a short-lived secret."
|
|
949
868
|
}
|
|
950
869
|
},
|
|
951
870
|
"required": [
|
|
952
|
-
"
|
|
953
|
-
"
|
|
954
|
-
|
|
955
|
-
],
|
|
956
|
-
"description": "Request body for POST `/calendar/events`. `start` and `end` must be the same kind (both timed ISO datetimes with offset, or both ISO date-only for all-day) and `end` must be strictly after `start`."
|
|
871
|
+
"email",
|
|
872
|
+
"code"
|
|
873
|
+
]
|
|
957
874
|
},
|
|
958
875
|
"Event": {
|
|
959
876
|
"type": "object",
|
|
@@ -1058,17 +975,75 @@
|
|
|
1058
975
|
],
|
|
1059
976
|
"description": "A calendar event row as returned by the API."
|
|
1060
977
|
},
|
|
1061
|
-
"
|
|
978
|
+
"CreateEventBody": {
|
|
1062
979
|
"type": "object",
|
|
1063
980
|
"properties": {
|
|
1064
|
-
"
|
|
1065
|
-
"type": "
|
|
1066
|
-
"
|
|
1067
|
-
"
|
|
981
|
+
"title": {
|
|
982
|
+
"type": "string",
|
|
983
|
+
"minLength": 1,
|
|
984
|
+
"maxLength": 500,
|
|
985
|
+
"description": "Short human-readable summary of the event. Shown in list views and `.ics` SUMMARY."
|
|
986
|
+
},
|
|
987
|
+
"description": {
|
|
988
|
+
"type": "string",
|
|
989
|
+
"maxLength": 10000,
|
|
990
|
+
"description": "Free-form notes about the event (agenda, dial-in instructions, etc.). Markdown formatted (CommonMark + GFM tables, strikethrough, task lists); stored verbatim. Invitation emails include the raw source — most email clients display it as plain text."
|
|
991
|
+
},
|
|
992
|
+
"start": {
|
|
993
|
+
"type": "string",
|
|
994
|
+
"description": "Accepts ISO 8601 datetime with offset (e.g. `2026-06-01T12:30:00+08:00`) for timed events, or ISO date-only (e.g. `2026-06-01`) for all-day. The `wspc` CLI additionally accepts natural-language phrases (`tomorrow 12:30pm`, `next Monday 9am`) and resolves them to ISO before sending; the server itself only accepts ISO. All-day uses RFC 5545 exclusive end: a one-day event on 6/1 is `start=2026-06-01, end=2026-06-02`; both endpoints must be the same type."
|
|
995
|
+
},
|
|
996
|
+
"end": {
|
|
997
|
+
"type": "string",
|
|
998
|
+
"description": "Accepts ISO 8601 datetime with offset (e.g. `2026-06-01T12:30:00+08:00`) for timed events, or ISO date-only (e.g. `2026-06-01`) for all-day. The `wspc` CLI additionally accepts natural-language phrases (`tomorrow 12:30pm`, `next Monday 9am`) and resolves them to ISO before sending; the server itself only accepts ISO. All-day uses RFC 5545 exclusive end: a one-day event on 6/1 is `start=2026-06-01, end=2026-06-02`; both endpoints must be the same type."
|
|
999
|
+
},
|
|
1000
|
+
"location": {
|
|
1001
|
+
"type": "string",
|
|
1002
|
+
"maxLength": 10000,
|
|
1003
|
+
"description": "Free-text location — physical address, room, or short note. Separate from `url` (meeting link)."
|
|
1004
|
+
},
|
|
1005
|
+
"url": {
|
|
1006
|
+
"type": "string",
|
|
1007
|
+
"format": "uri",
|
|
1008
|
+
"description": "Optional meeting link (Zoom / Meet / etc.). Kept separate from `location` so calendar clients can render it as a join action."
|
|
1009
|
+
},
|
|
1010
|
+
"status": {
|
|
1011
|
+
"type": "string",
|
|
1012
|
+
"enum": [
|
|
1013
|
+
"confirmed",
|
|
1014
|
+
"tentative",
|
|
1015
|
+
"cancelled"
|
|
1016
|
+
],
|
|
1017
|
+
"description": "Lifecycle status. `confirmed`: the event will happen (default). `tentative`: organizer has not finalized; still visible in lists. `cancelled`: the event was called off but the record is kept so attendees can be notified and history audited; distinct from soft-delete (DELETE `/calendar/events/{id}`) which hides the event from default list responses."
|
|
1018
|
+
},
|
|
1019
|
+
"attendees": {
|
|
1020
|
+
"type": "array",
|
|
1021
|
+
"items": {
|
|
1022
|
+
"type": "object",
|
|
1023
|
+
"properties": {
|
|
1024
|
+
"email": {
|
|
1025
|
+
"type": "string",
|
|
1026
|
+
"description": "Attendee email address. Used as the identity key for dedupe and invite/update/cancel fan-out."
|
|
1027
|
+
},
|
|
1028
|
+
"display_name": {
|
|
1029
|
+
"type": "string",
|
|
1030
|
+
"description": "Optional human-readable name shown in invitation emails and `.ics` payloads. Omit to fall back to the email address."
|
|
1031
|
+
}
|
|
1032
|
+
},
|
|
1033
|
+
"required": [
|
|
1034
|
+
"email"
|
|
1035
|
+
],
|
|
1036
|
+
"description": "A single attendee on a calendar event. Each event supports up to 50 unique attendees after case-insensitive email dedupe; new attendees receive an invitation email with an `.ics` REQUEST attachment, kept attendees receive an update email when the event is mutated, and removed attendees receive a cancellation."
|
|
1037
|
+
},
|
|
1038
|
+
"description": "Up to 50 unique attendees (deduped case-insensitively by email). If non-empty, each attendee receives an invitation email with an `.ics` REQUEST attachment as a side effect of creation."
|
|
1068
1039
|
}
|
|
1069
1040
|
},
|
|
1070
|
-
"
|
|
1071
|
-
|
|
1041
|
+
"required": [
|
|
1042
|
+
"title",
|
|
1043
|
+
"start",
|
|
1044
|
+
"end"
|
|
1045
|
+
],
|
|
1046
|
+
"description": "Request body for POST `/calendar/events`. `start` and `end` must be the same kind (both timed ISO datetimes with offset, or both ISO date-only for all-day) and `end` must be strictly after `start`."
|
|
1072
1047
|
},
|
|
1073
1048
|
"DeleteEventResponse": {
|
|
1074
1049
|
"type": "object",
|
|
@@ -1094,47 +1069,17 @@
|
|
|
1094
1069
|
],
|
|
1095
1070
|
"description": "Minimal response for DELETE `/calendar/events/{id}`. Use GET with `?include_deleted=true` to fetch the full soft-deleted row."
|
|
1096
1071
|
},
|
|
1097
|
-
"
|
|
1072
|
+
"VersionBody": {
|
|
1098
1073
|
"type": "object",
|
|
1099
1074
|
"properties": {
|
|
1100
|
-
"
|
|
1101
|
-
"type": "
|
|
1102
|
-
"
|
|
1103
|
-
|
|
1104
|
-
"start_from": {
|
|
1105
|
-
"type": "string",
|
|
1106
|
-
"description": "Inclusive lower bound on the event `start` (ISO datetime with offset, or ISO date-only). When ANY of `start_from`/`start_to`/`end_from`/`end_to` is provided, the implicit past filter is disabled."
|
|
1107
|
-
},
|
|
1108
|
-
"start_to": {
|
|
1109
|
-
"type": "string",
|
|
1110
|
-
"description": "Inclusive upper bound on the event `start`."
|
|
1111
|
-
},
|
|
1112
|
-
"end_from": {
|
|
1113
|
-
"type": "string",
|
|
1114
|
-
"description": "Inclusive lower bound on the event `end`."
|
|
1115
|
-
},
|
|
1116
|
-
"end_to": {
|
|
1117
|
-
"type": "string",
|
|
1118
|
-
"description": "Inclusive upper bound on the event `end`."
|
|
1119
|
-
},
|
|
1120
|
-
"cursor": {
|
|
1121
|
-
"type": "string",
|
|
1122
|
-
"description": "Opaque pagination cursor returned in `next_cursor` of a previous response."
|
|
1123
|
-
},
|
|
1124
|
-
"limit": {
|
|
1125
|
-
"type": "string",
|
|
1126
|
-
"description": "Maximum number of events to return. Clamped to `[1, 200]`. Default is server-defined."
|
|
1127
|
-
},
|
|
1128
|
-
"include_deleted": {
|
|
1129
|
-
"type": "string",
|
|
1130
|
-
"description": "When `true`, include soft-deleted events. Default `false`."
|
|
1131
|
-
},
|
|
1132
|
-
"include_past": {
|
|
1133
|
-
"type": "string",
|
|
1134
|
-
"description": "When omitted or `false`, events whose `end` is before now are hidden. Pass `true` to include them. Ignored when any of `start_from`/`start_to`/`end_from`/`end_to` is provided — explicit time bounds always win."
|
|
1075
|
+
"expected_version": {
|
|
1076
|
+
"type": "integer",
|
|
1077
|
+
"minimum": 0,
|
|
1078
|
+
"description": "Optional optimistic lock. Omit to let the server use the current version; pass only to fail with 409 `VERSION_CONFLICT` if someone else has mutated the event since you last read."
|
|
1135
1079
|
}
|
|
1136
1080
|
},
|
|
1137
|
-
"
|
|
1081
|
+
"additionalProperties": false,
|
|
1082
|
+
"description": "Request body for DELETE `/calendar/events/{id}` and POST `/calendar/events/{id}/restore`. Carries only the optional optimistic-lock version."
|
|
1138
1083
|
},
|
|
1139
1084
|
"ListEventsResponse": {
|
|
1140
1085
|
"type": "object",
|
|
@@ -1237,19 +1182,6 @@
|
|
|
1237
1182
|
"additionalProperties": false,
|
|
1238
1183
|
"description": "Request body for PATCH `/calendar/events/{id}`. All fields are optional partial updates. To CANCEL a meeting (preserve the record and notify attendees) set `status: cancelled`; to remove the event from default listings, call DELETE instead."
|
|
1239
1184
|
},
|
|
1240
|
-
"CreateAliasBody": {
|
|
1241
|
-
"type": "object",
|
|
1242
|
-
"properties": {
|
|
1243
|
-
"email": {
|
|
1244
|
-
"type": "string",
|
|
1245
|
-
"format": "email",
|
|
1246
|
-
"description": "Full alias address under the platform email domain or a fully verified organization custom domain, for example alice-shop@wspc.app or alice-shop@example.com."
|
|
1247
|
-
}
|
|
1248
|
-
},
|
|
1249
|
-
"required": [
|
|
1250
|
-
"email"
|
|
1251
|
-
]
|
|
1252
|
-
},
|
|
1253
1185
|
"Alias": {
|
|
1254
1186
|
"type": "object",
|
|
1255
1187
|
"properties": {
|
|
@@ -1282,16 +1214,17 @@
|
|
|
1282
1214
|
"created_at"
|
|
1283
1215
|
]
|
|
1284
1216
|
},
|
|
1285
|
-
"
|
|
1217
|
+
"CreateAliasBody": {
|
|
1286
1218
|
"type": "object",
|
|
1287
1219
|
"properties": {
|
|
1288
|
-
"
|
|
1220
|
+
"email": {
|
|
1289
1221
|
"type": "string",
|
|
1290
|
-
"
|
|
1222
|
+
"format": "email",
|
|
1223
|
+
"description": "Full alias address under the platform email domain or a fully verified organization custom domain, for example alice-shop@wspc.app or alice-shop@example.com."
|
|
1291
1224
|
}
|
|
1292
1225
|
},
|
|
1293
1226
|
"required": [
|
|
1294
|
-
"
|
|
1227
|
+
"email"
|
|
1295
1228
|
]
|
|
1296
1229
|
},
|
|
1297
1230
|
"EmailDomainObjectResponse": {
|
|
@@ -1428,21 +1361,16 @@
|
|
|
1428
1361
|
"domain"
|
|
1429
1362
|
]
|
|
1430
1363
|
},
|
|
1431
|
-
"
|
|
1364
|
+
"CreateDomainBody": {
|
|
1432
1365
|
"type": "object",
|
|
1433
1366
|
"properties": {
|
|
1434
|
-
"
|
|
1435
|
-
"type": "
|
|
1436
|
-
"
|
|
1437
|
-
"type": "string"
|
|
1438
|
-
},
|
|
1439
|
-
"minItems": 1,
|
|
1440
|
-
"maxItems": 100,
|
|
1441
|
-
"description": "Email ids to act on. 1-100 ids per call. All bulk ops (read / unread / delete / restore) are idempotent: ids that are already in the target state are silently no-ops and ids that don't belong to the user (or don't exist) are reported in `not_found` rather than failing the call."
|
|
1367
|
+
"domain": {
|
|
1368
|
+
"type": "string",
|
|
1369
|
+
"description": "Custom domain hostname to register with the provider, for example `mail.example.com`."
|
|
1442
1370
|
}
|
|
1443
1371
|
},
|
|
1444
1372
|
"required": [
|
|
1445
|
-
"
|
|
1373
|
+
"domain"
|
|
1446
1374
|
]
|
|
1447
1375
|
},
|
|
1448
1376
|
"DeleteBatchResponse": {
|
|
@@ -1465,49 +1393,23 @@
|
|
|
1465
1393
|
"not_found"
|
|
1466
1394
|
]
|
|
1467
1395
|
},
|
|
1468
|
-
"
|
|
1396
|
+
"BatchIdsBody": {
|
|
1469
1397
|
"type": "object",
|
|
1470
1398
|
"properties": {
|
|
1471
|
-
"
|
|
1472
|
-
"type": "
|
|
1473
|
-
"
|
|
1399
|
+
"ids": {
|
|
1400
|
+
"type": "array",
|
|
1401
|
+
"items": {
|
|
1402
|
+
"type": "string"
|
|
1403
|
+
},
|
|
1404
|
+
"minItems": 1,
|
|
1405
|
+
"maxItems": 100,
|
|
1406
|
+
"description": "Email ids to act on. 1-100 ids per call. All bulk ops (read / unread / delete / restore) are idempotent: ids that are already in the target state are silently no-ops and ids that don't belong to the user (or don't exist) are reported in `not_found` rather than failing the call."
|
|
1474
1407
|
}
|
|
1475
1408
|
},
|
|
1476
1409
|
"required": [
|
|
1477
|
-
"
|
|
1410
|
+
"ids"
|
|
1478
1411
|
]
|
|
1479
1412
|
},
|
|
1480
|
-
"GetAttachmentQuery": {
|
|
1481
|
-
"type": "object",
|
|
1482
|
-
"properties": {
|
|
1483
|
-
"include_deleted": {
|
|
1484
|
-
"type": "string",
|
|
1485
|
-
"description": "When `true`, allow downloading an attachment whose parent email is soft-deleted. Defaults to `false`."
|
|
1486
|
-
}
|
|
1487
|
-
}
|
|
1488
|
-
},
|
|
1489
|
-
"GetEmailQuery": {
|
|
1490
|
-
"type": "object",
|
|
1491
|
-
"properties": {
|
|
1492
|
-
"include_html": {
|
|
1493
|
-
"type": "string",
|
|
1494
|
-
"description": "When `true`, fetch the HTML body from R2 and include it as `html_body` in the response. Costs an extra R2 read; omit if you only need text."
|
|
1495
|
-
},
|
|
1496
|
-
"include_deleted": {
|
|
1497
|
-
"type": "string",
|
|
1498
|
-
"description": "When `true`, allow fetching a soft-deleted email. Defaults to `false` (returns 404 for soft-deleted rows)."
|
|
1499
|
-
}
|
|
1500
|
-
}
|
|
1501
|
-
},
|
|
1502
|
-
"ListAliasesQuery": {
|
|
1503
|
-
"type": "object",
|
|
1504
|
-
"properties": {
|
|
1505
|
-
"include_deleted": {
|
|
1506
|
-
"type": "string",
|
|
1507
|
-
"description": "When `true`, include soft-deleted aliases (with `deleted_at` set) alongside active ones. Defaults to `false`."
|
|
1508
|
-
}
|
|
1509
|
-
}
|
|
1510
|
-
},
|
|
1511
1413
|
"EmailDomainListResponse": {
|
|
1512
1414
|
"type": "object",
|
|
1513
1415
|
"properties": {
|
|
@@ -1645,42 +1547,12 @@
|
|
|
1645
1547
|
"domains"
|
|
1646
1548
|
]
|
|
1647
1549
|
},
|
|
1648
|
-
"
|
|
1550
|
+
"MarkBatchResponse": {
|
|
1649
1551
|
"type": "object",
|
|
1650
1552
|
"properties": {
|
|
1651
|
-
"
|
|
1652
|
-
"type": "
|
|
1653
|
-
"description": "
|
|
1654
|
-
},
|
|
1655
|
-
"alias_email": {
|
|
1656
|
-
"type": "string",
|
|
1657
|
-
"format": "email",
|
|
1658
|
-
"description": "If set, only return emails received on this full alias email address."
|
|
1659
|
-
},
|
|
1660
|
-
"unread_only": {
|
|
1661
|
-
"type": "string",
|
|
1662
|
-
"description": "When `true`, only return emails with `is_read=false`."
|
|
1663
|
-
},
|
|
1664
|
-
"since": {
|
|
1665
|
-
"type": "string",
|
|
1666
|
-
"description": "Unix epoch milliseconds — only return emails with `received_at >= since`. Useful for incremental sync."
|
|
1667
|
-
},
|
|
1668
|
-
"cursor": {
|
|
1669
|
-
"type": "string",
|
|
1670
|
-
"description": "Opaque pagination cursor returned in `next_cursor` of a previous response."
|
|
1671
|
-
},
|
|
1672
|
-
"include_deleted": {
|
|
1673
|
-
"type": "string",
|
|
1674
|
-
"description": "When `true`, also return soft-deleted emails. Defaults to `false`."
|
|
1675
|
-
}
|
|
1676
|
-
}
|
|
1677
|
-
},
|
|
1678
|
-
"MarkBatchResponse": {
|
|
1679
|
-
"type": "object",
|
|
1680
|
-
"properties": {
|
|
1681
|
-
"marked": {
|
|
1682
|
-
"type": "integer",
|
|
1683
|
-
"description": "Number of emails whose state actually changed. Already-in-target-state ids do not count."
|
|
1553
|
+
"marked": {
|
|
1554
|
+
"type": "integer",
|
|
1555
|
+
"description": "Number of emails whose state actually changed. Already-in-target-state ids do not count."
|
|
1684
1556
|
},
|
|
1685
1557
|
"not_found": {
|
|
1686
1558
|
"type": "array",
|
|
@@ -1715,104 +1587,6 @@
|
|
|
1715
1587
|
"not_found"
|
|
1716
1588
|
]
|
|
1717
1589
|
},
|
|
1718
|
-
"SendEmailBody": {
|
|
1719
|
-
"type": "object",
|
|
1720
|
-
"properties": {
|
|
1721
|
-
"from_alias_email": {
|
|
1722
|
-
"type": "string",
|
|
1723
|
-
"format": "email",
|
|
1724
|
-
"description": "Full active alias email address owned by the caller. Soft-deleted aliases are not allowed for sending."
|
|
1725
|
-
},
|
|
1726
|
-
"to": {
|
|
1727
|
-
"type": "array",
|
|
1728
|
-
"items": {
|
|
1729
|
-
"type": "string"
|
|
1730
|
-
},
|
|
1731
|
-
"minItems": 1,
|
|
1732
|
-
"maxItems": 10,
|
|
1733
|
-
"description": "Recipient addresses. 1-10 entries. Required for a fresh send; may be omitted when `in_reply_to_email_id` is set (the server then reuses the original sender as the sole recipient)."
|
|
1734
|
-
},
|
|
1735
|
-
"subject": {
|
|
1736
|
-
"type": "string",
|
|
1737
|
-
"maxLength": 500,
|
|
1738
|
-
"description": "Outbound subject. Required for a fresh send; may be omitted on reply (the server prefixes the inbound subject with `Re: `)."
|
|
1739
|
-
},
|
|
1740
|
-
"text": {
|
|
1741
|
-
"type": "string",
|
|
1742
|
-
"minLength": 1,
|
|
1743
|
-
"description": "Plain-text body. 1 byte to 100 KiB. HTML bodies are not exposed in the v1 send API — agents compose plain text and clients render as desired."
|
|
1744
|
-
},
|
|
1745
|
-
"in_reply_to_email_id": {
|
|
1746
|
-
"type": "string",
|
|
1747
|
-
"description": "If set, sends as a threaded reply to the referenced inbound email. The outbound `In-Reply-To` / `References` headers and recipient default are derived from that message; the inbound email must belong to the caller."
|
|
1748
|
-
},
|
|
1749
|
-
"idempotency_key": {
|
|
1750
|
-
"type": "string",
|
|
1751
|
-
"minLength": 1,
|
|
1752
|
-
"maxLength": 200,
|
|
1753
|
-
"description": "Caller-chosen key (1-200 chars) that makes retries safe. The server hashes the full request and stores it under this key for the calling user: a second send with the same key and identical content returns the original result with `idempotent_replay: true`; the same key with different content returns 409 `IDEMPOTENCY_KEY_REUSED`."
|
|
1754
|
-
},
|
|
1755
|
-
"attachments": {
|
|
1756
|
-
"type": "array",
|
|
1757
|
-
"items": {
|
|
1758
|
-
"anyOf": [
|
|
1759
|
-
{
|
|
1760
|
-
"type": "object",
|
|
1761
|
-
"properties": {
|
|
1762
|
-
"filename": {
|
|
1763
|
-
"type": "string",
|
|
1764
|
-
"minLength": 1,
|
|
1765
|
-
"maxLength": 255,
|
|
1766
|
-
"description": "Filename as presented to the recipient. Must not contain `/` or NUL."
|
|
1767
|
-
},
|
|
1768
|
-
"content_type": {
|
|
1769
|
-
"type": "string",
|
|
1770
|
-
"minLength": 1,
|
|
1771
|
-
"maxLength": 255,
|
|
1772
|
-
"description": "MIME type as advertised in the outbound message Content-Type header."
|
|
1773
|
-
},
|
|
1774
|
-
"content_base64": {
|
|
1775
|
-
"type": "string",
|
|
1776
|
-
"minLength": 1,
|
|
1777
|
-
"description": "Base64-encoded attachment bytes. Per-attachment ≤ 5 MiB; per-send total ≤ 25 MiB."
|
|
1778
|
-
}
|
|
1779
|
-
},
|
|
1780
|
-
"required": [
|
|
1781
|
-
"filename",
|
|
1782
|
-
"content_type",
|
|
1783
|
-
"content_base64"
|
|
1784
|
-
]
|
|
1785
|
-
},
|
|
1786
|
-
{
|
|
1787
|
-
"type": "object",
|
|
1788
|
-
"properties": {
|
|
1789
|
-
"from_inbound_email_id": {
|
|
1790
|
-
"type": "string",
|
|
1791
|
-
"description": "Id of an inbound email owned by the caller. Server reads its attachment at `idx` from R2 and re-attaches."
|
|
1792
|
-
},
|
|
1793
|
-
"idx": {
|
|
1794
|
-
"type": "integer",
|
|
1795
|
-
"minimum": 0,
|
|
1796
|
-
"description": "0-based index into the inbound email's attachments array."
|
|
1797
|
-
}
|
|
1798
|
-
},
|
|
1799
|
-
"required": [
|
|
1800
|
-
"from_inbound_email_id",
|
|
1801
|
-
"idx"
|
|
1802
|
-
]
|
|
1803
|
-
}
|
|
1804
|
-
]
|
|
1805
|
-
},
|
|
1806
|
-
"maxItems": 10,
|
|
1807
|
-
"description": "Optional outbound attachments. Each element is either an inline `{filename, content_type, content_base64}` blob OR a reference `{from_inbound_email_id, idx}` to an inbound email's existing attachment. Per-attachment ≤ 5 MiB; per-send total ≤ 25 MiB; max 10 attachments. Extensions in `[exe, bat, com, scr, cmd, jar, js]` are rejected."
|
|
1808
|
-
}
|
|
1809
|
-
},
|
|
1810
|
-
"required": [
|
|
1811
|
-
"from_alias_email",
|
|
1812
|
-
"text",
|
|
1813
|
-
"idempotency_key"
|
|
1814
|
-
]
|
|
1815
|
-
},
|
|
1816
1590
|
"SendEmailResponse": {
|
|
1817
1591
|
"type": "object",
|
|
1818
1592
|
"properties": {
|
|
@@ -1925,6 +1699,104 @@
|
|
|
1925
1699
|
"idempotent_replay"
|
|
1926
1700
|
]
|
|
1927
1701
|
},
|
|
1702
|
+
"SendEmailBody": {
|
|
1703
|
+
"type": "object",
|
|
1704
|
+
"properties": {
|
|
1705
|
+
"from_alias_email": {
|
|
1706
|
+
"type": "string",
|
|
1707
|
+
"format": "email",
|
|
1708
|
+
"description": "Full active alias email address owned by the caller. Soft-deleted aliases are not allowed for sending."
|
|
1709
|
+
},
|
|
1710
|
+
"to": {
|
|
1711
|
+
"type": "array",
|
|
1712
|
+
"items": {
|
|
1713
|
+
"type": "string"
|
|
1714
|
+
},
|
|
1715
|
+
"minItems": 1,
|
|
1716
|
+
"maxItems": 10,
|
|
1717
|
+
"description": "Recipient addresses. 1-10 entries. Required for a fresh send; may be omitted when `in_reply_to_email_id` is set (the server then reuses the original sender as the sole recipient)."
|
|
1718
|
+
},
|
|
1719
|
+
"subject": {
|
|
1720
|
+
"type": "string",
|
|
1721
|
+
"maxLength": 500,
|
|
1722
|
+
"description": "Outbound subject. Required for a fresh send; may be omitted on reply (the server prefixes the inbound subject with `Re: `)."
|
|
1723
|
+
},
|
|
1724
|
+
"text": {
|
|
1725
|
+
"type": "string",
|
|
1726
|
+
"minLength": 1,
|
|
1727
|
+
"description": "Plain-text body. 1 byte to 100 KiB. HTML bodies are not exposed in the v1 send API — agents compose plain text and clients render as desired."
|
|
1728
|
+
},
|
|
1729
|
+
"in_reply_to_email_id": {
|
|
1730
|
+
"type": "string",
|
|
1731
|
+
"description": "If set, sends as a threaded reply to the referenced inbound email. The outbound `In-Reply-To` / `References` headers and recipient default are derived from that message; the inbound email must belong to the caller."
|
|
1732
|
+
},
|
|
1733
|
+
"idempotency_key": {
|
|
1734
|
+
"type": "string",
|
|
1735
|
+
"minLength": 1,
|
|
1736
|
+
"maxLength": 200,
|
|
1737
|
+
"description": "Caller-chosen key (1-200 chars) that makes retries safe. The server hashes the full request and stores it under this key for the calling user: a second send with the same key and identical content returns the original result with `idempotent_replay: true`; the same key with different content returns 409 `IDEMPOTENCY_KEY_REUSED`."
|
|
1738
|
+
},
|
|
1739
|
+
"attachments": {
|
|
1740
|
+
"type": "array",
|
|
1741
|
+
"items": {
|
|
1742
|
+
"anyOf": [
|
|
1743
|
+
{
|
|
1744
|
+
"type": "object",
|
|
1745
|
+
"properties": {
|
|
1746
|
+
"filename": {
|
|
1747
|
+
"type": "string",
|
|
1748
|
+
"minLength": 1,
|
|
1749
|
+
"maxLength": 255,
|
|
1750
|
+
"description": "Filename as presented to the recipient. Must not contain `/` or NUL."
|
|
1751
|
+
},
|
|
1752
|
+
"content_type": {
|
|
1753
|
+
"type": "string",
|
|
1754
|
+
"minLength": 1,
|
|
1755
|
+
"maxLength": 255,
|
|
1756
|
+
"description": "MIME type as advertised in the outbound message Content-Type header."
|
|
1757
|
+
},
|
|
1758
|
+
"content_base64": {
|
|
1759
|
+
"type": "string",
|
|
1760
|
+
"minLength": 1,
|
|
1761
|
+
"description": "Base64-encoded attachment bytes. Per-attachment ≤ 5 MiB; per-send total ≤ 25 MiB."
|
|
1762
|
+
}
|
|
1763
|
+
},
|
|
1764
|
+
"required": [
|
|
1765
|
+
"filename",
|
|
1766
|
+
"content_type",
|
|
1767
|
+
"content_base64"
|
|
1768
|
+
]
|
|
1769
|
+
},
|
|
1770
|
+
{
|
|
1771
|
+
"type": "object",
|
|
1772
|
+
"properties": {
|
|
1773
|
+
"from_inbound_email_id": {
|
|
1774
|
+
"type": "string",
|
|
1775
|
+
"description": "Id of an inbound email owned by the caller. Server reads its attachment at `idx` from R2 and re-attaches."
|
|
1776
|
+
},
|
|
1777
|
+
"idx": {
|
|
1778
|
+
"type": "integer",
|
|
1779
|
+
"minimum": 0,
|
|
1780
|
+
"description": "0-based index into the inbound email's attachments array."
|
|
1781
|
+
}
|
|
1782
|
+
},
|
|
1783
|
+
"required": [
|
|
1784
|
+
"from_inbound_email_id",
|
|
1785
|
+
"idx"
|
|
1786
|
+
]
|
|
1787
|
+
}
|
|
1788
|
+
]
|
|
1789
|
+
},
|
|
1790
|
+
"maxItems": 10,
|
|
1791
|
+
"description": "Optional outbound attachments. Each element is either an inline `{filename, content_type, content_base64}` blob OR a reference `{from_inbound_email_id, idx}` to an inbound email's existing attachment. Per-attachment ≤ 5 MiB; per-send total ≤ 25 MiB; max 10 attachments. Extensions in `[exe, bat, com, scr, cmd, jar, js]` are rejected."
|
|
1792
|
+
}
|
|
1793
|
+
},
|
|
1794
|
+
"required": [
|
|
1795
|
+
"from_alias_email",
|
|
1796
|
+
"text",
|
|
1797
|
+
"idempotency_key"
|
|
1798
|
+
]
|
|
1799
|
+
},
|
|
1928
1800
|
"SetPushConfigBody": {
|
|
1929
1801
|
"type": "object",
|
|
1930
1802
|
"properties": {
|
|
@@ -2027,21 +1899,6 @@
|
|
|
2027
1899
|
"configs"
|
|
2028
1900
|
]
|
|
2029
1901
|
},
|
|
2030
|
-
"TestPushBody": {
|
|
2031
|
-
"type": "object",
|
|
2032
|
-
"properties": {
|
|
2033
|
-
"transport": {
|
|
2034
|
-
"type": "string",
|
|
2035
|
-
"enum": [
|
|
2036
|
-
"telegram"
|
|
2037
|
-
],
|
|
2038
|
-
"description": "Which transport to send the test message through. Must match a transport the caller has already registered via `POST /push/config`; today only `telegram` is supported."
|
|
2039
|
-
}
|
|
2040
|
-
},
|
|
2041
|
-
"required": [
|
|
2042
|
-
"transport"
|
|
2043
|
-
]
|
|
2044
|
-
},
|
|
2045
1902
|
"TestPushResponse": {
|
|
2046
1903
|
"oneOf": [
|
|
2047
1904
|
{
|
|
@@ -2096,17 +1953,19 @@
|
|
|
2096
1953
|
}
|
|
2097
1954
|
]
|
|
2098
1955
|
},
|
|
2099
|
-
"
|
|
1956
|
+
"TestPushBody": {
|
|
2100
1957
|
"type": "object",
|
|
2101
1958
|
"properties": {
|
|
2102
|
-
"
|
|
1959
|
+
"transport": {
|
|
2103
1960
|
"type": "string",
|
|
2104
|
-
"
|
|
2105
|
-
|
|
1961
|
+
"enum": [
|
|
1962
|
+
"telegram"
|
|
1963
|
+
],
|
|
1964
|
+
"description": "Which transport to send the test message through. Must match a transport the caller has already registered via `POST /push/config`; today only `telegram` is supported."
|
|
2106
1965
|
}
|
|
2107
1966
|
},
|
|
2108
1967
|
"required": [
|
|
2109
|
-
"
|
|
1968
|
+
"transport"
|
|
2110
1969
|
]
|
|
2111
1970
|
},
|
|
2112
1971
|
"Comment": {
|
|
@@ -2147,20 +2006,17 @@
|
|
|
2147
2006
|
"updated_at"
|
|
2148
2007
|
]
|
|
2149
2008
|
},
|
|
2150
|
-
"
|
|
2009
|
+
"CreateCommentBody": {
|
|
2151
2010
|
"type": "object",
|
|
2152
2011
|
"properties": {
|
|
2153
|
-
"
|
|
2012
|
+
"content": {
|
|
2154
2013
|
"type": "string",
|
|
2155
2014
|
"minLength": 1,
|
|
2156
|
-
"maxLength":
|
|
2157
|
-
},
|
|
2158
|
-
"default_todo_type_id": {
|
|
2159
|
-
"type": "string"
|
|
2015
|
+
"maxLength": 10000
|
|
2160
2016
|
}
|
|
2161
2017
|
},
|
|
2162
2018
|
"required": [
|
|
2163
|
-
"
|
|
2019
|
+
"content"
|
|
2164
2020
|
]
|
|
2165
2021
|
},
|
|
2166
2022
|
"Project": {
|
|
@@ -2204,51 +2060,20 @@
|
|
|
2204
2060
|
"updated_at"
|
|
2205
2061
|
]
|
|
2206
2062
|
},
|
|
2207
|
-
"
|
|
2063
|
+
"CreateProjectBody": {
|
|
2208
2064
|
"type": "object",
|
|
2209
2065
|
"properties": {
|
|
2210
|
-
"
|
|
2211
|
-
"type": "string",
|
|
2212
|
-
"minLength": 1
|
|
2213
|
-
},
|
|
2214
|
-
"dtstart": {
|
|
2215
|
-
"type": "string",
|
|
2216
|
-
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
2217
|
-
},
|
|
2218
|
-
"title": {
|
|
2066
|
+
"name": {
|
|
2219
2067
|
"type": "string",
|
|
2220
2068
|
"minLength": 1,
|
|
2221
2069
|
"maxLength": 500
|
|
2222
2070
|
},
|
|
2223
|
-
"
|
|
2224
|
-
"type": "string"
|
|
2225
|
-
"maxLength": 10000
|
|
2226
|
-
},
|
|
2227
|
-
"parent_id": {
|
|
2228
|
-
"anyOf": [
|
|
2229
|
-
{
|
|
2230
|
-
"type": "string",
|
|
2231
|
-
"minLength": 1
|
|
2232
|
-
},
|
|
2233
|
-
{
|
|
2234
|
-
"type": "null"
|
|
2235
|
-
}
|
|
2236
|
-
]
|
|
2237
|
-
},
|
|
2238
|
-
"project_id": {
|
|
2239
|
-
"type": "string",
|
|
2240
|
-
"description": "Project for the recurrence rule, its template todo, and all materialized instances. Must be an active project in the caller's organization."
|
|
2241
|
-
},
|
|
2242
|
-
"type_id": {
|
|
2243
|
-
"type": "string",
|
|
2244
|
-
"minLength": 1
|
|
2071
|
+
"default_todo_type_id": {
|
|
2072
|
+
"type": "string"
|
|
2245
2073
|
}
|
|
2246
2074
|
},
|
|
2247
2075
|
"required": [
|
|
2248
|
-
"
|
|
2249
|
-
"dtstart",
|
|
2250
|
-
"title",
|
|
2251
|
-
"project_id"
|
|
2076
|
+
"name"
|
|
2252
2077
|
]
|
|
2253
2078
|
},
|
|
2254
2079
|
"CreateRecurrenceRuleResponse": {
|
|
@@ -2318,24 +2143,25 @@
|
|
|
2318
2143
|
"updated_at"
|
|
2319
2144
|
]
|
|
2320
2145
|
},
|
|
2321
|
-
"
|
|
2146
|
+
"CreateRecurrenceRuleBody": {
|
|
2322
2147
|
"type": "object",
|
|
2323
2148
|
"properties": {
|
|
2324
|
-
"
|
|
2149
|
+
"rrule": {
|
|
2325
2150
|
"type": "string",
|
|
2326
|
-
"minLength": 1
|
|
2327
|
-
"maxLength": 500,
|
|
2328
|
-
"description": "Short human-readable summary of the work item. Required, non-empty. Shown as the primary label in CLI list output."
|
|
2151
|
+
"minLength": 1
|
|
2329
2152
|
},
|
|
2330
|
-
"
|
|
2153
|
+
"dtstart": {
|
|
2154
|
+
"type": "string",
|
|
2155
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
2156
|
+
},
|
|
2157
|
+
"title": {
|
|
2331
2158
|
"type": "string",
|
|
2332
2159
|
"minLength": 1,
|
|
2333
|
-
"
|
|
2160
|
+
"maxLength": 500
|
|
2334
2161
|
},
|
|
2335
2162
|
"description": {
|
|
2336
2163
|
"type": "string",
|
|
2337
|
-
"maxLength": 10000
|
|
2338
|
-
"description": "Free-form details about the todo. Fully supports GFM Markdown (tables, strikethrough, task lists). Stored verbatim; client applications are responsible for rendering. Optional. Passing `null` is strictly rejected."
|
|
2164
|
+
"maxLength": 10000
|
|
2339
2165
|
},
|
|
2340
2166
|
"parent_id": {
|
|
2341
2167
|
"anyOf": [
|
|
@@ -2346,47 +2172,20 @@
|
|
|
2346
2172
|
{
|
|
2347
2173
|
"type": "null"
|
|
2348
2174
|
}
|
|
2349
|
-
]
|
|
2350
|
-
"description": "Parent todo ID (`tod_<ULID>`) to attach this todo as a child under another todo. Omit or pass `null` to create a root-level todo. Nesting is limited to one level; attempting to set a child todo as a parent will trigger `PARENT_IS_CHILD`. To make a subtask appear on every occurrence of a recurring rule, set this to that rule's template todo id (the template id returned when the rule is created); the server re-materializes future occurrences so each carries the subtask."
|
|
2351
|
-
},
|
|
2352
|
-
"status": {
|
|
2353
|
-
"type": "string",
|
|
2354
|
-
"enum": [
|
|
2355
|
-
"open",
|
|
2356
|
-
"in_progress",
|
|
2357
|
-
"done",
|
|
2358
|
-
"cancelled"
|
|
2359
|
-
],
|
|
2360
|
-
"description": "Initial status of the todo. Omit to default to `open`. Allowed values: `open`, `in_progress`, `done`, `cancelled`."
|
|
2361
|
-
},
|
|
2362
|
-
"due_at": {
|
|
2363
|
-
"type": "string",
|
|
2364
|
-
"description": "Optional calendar due date in ISO date-only format (`YYYY-MM-DD`). Stored without timezone offsets to represent the same local calendar day globally. Pass `\"\"` or omit the field to skip setting a due date. Passing `null` is strictly rejected."
|
|
2175
|
+
]
|
|
2365
2176
|
},
|
|
2366
|
-
"
|
|
2177
|
+
"project_id": {
|
|
2367
2178
|
"type": "string",
|
|
2368
|
-
"
|
|
2369
|
-
"description": "Type id this todo belongs to. Omit to use the project's default type. When project_id is also supplied, the type must belong to the same project. New server-generated type ids use typ_<ULID>; legacy ids remain accepted."
|
|
2179
|
+
"description": "Project for the recurrence rule, its template todo, and all materialized instances. Must be an active project in the caller's organization."
|
|
2370
2180
|
},
|
|
2371
|
-
"
|
|
2372
|
-
"type": "
|
|
2373
|
-
"
|
|
2374
|
-
"anyOf": [
|
|
2375
|
-
{
|
|
2376
|
-
"type": "string"
|
|
2377
|
-
},
|
|
2378
|
-
{
|
|
2379
|
-
"type": "array",
|
|
2380
|
-
"items": {
|
|
2381
|
-
"type": "string"
|
|
2382
|
-
}
|
|
2383
|
-
}
|
|
2384
|
-
]
|
|
2385
|
-
},
|
|
2386
|
-
"description": "Custom field values keyed by the field's immutable `key` (not the human `label`). Each value must match the declared field type: string fields require string values, and string_array fields require string arrays. Providing a key that is not declared on the resolved todo type is strictly rejected with `UNDECLARED_FIELD`. Missing required fields that lack a default value are rejected with `FIELD_REQUIRED`. Defaults declared on the type are auto-applied at create time."
|
|
2181
|
+
"type_id": {
|
|
2182
|
+
"type": "string",
|
|
2183
|
+
"minLength": 1
|
|
2387
2184
|
}
|
|
2388
2185
|
},
|
|
2389
2186
|
"required": [
|
|
2187
|
+
"rrule",
|
|
2188
|
+
"dtstart",
|
|
2390
2189
|
"title",
|
|
2391
2190
|
"project_id"
|
|
2392
2191
|
]
|
|
@@ -2479,30 +2278,96 @@
|
|
|
2479
2278
|
"type_id"
|
|
2480
2279
|
]
|
|
2481
2280
|
},
|
|
2482
|
-
"
|
|
2281
|
+
"CreateTodoBody": {
|
|
2483
2282
|
"type": "object",
|
|
2484
2283
|
"properties": {
|
|
2485
|
-
"
|
|
2284
|
+
"title": {
|
|
2486
2285
|
"type": "string",
|
|
2487
2286
|
"minLength": 1,
|
|
2488
|
-
"maxLength": 500
|
|
2287
|
+
"maxLength": 500,
|
|
2288
|
+
"description": "Short human-readable summary of the work item. Required, non-empty. Shown as the primary label in CLI list output."
|
|
2489
2289
|
},
|
|
2490
2290
|
"project_id": {
|
|
2491
2291
|
"type": "string",
|
|
2492
2292
|
"minLength": 1,
|
|
2493
|
-
"description": "Project this
|
|
2293
|
+
"description": "Project id to assign this todo to. It must be an active project in the caller's organization."
|
|
2294
|
+
},
|
|
2295
|
+
"description": {
|
|
2296
|
+
"type": "string",
|
|
2297
|
+
"maxLength": 10000,
|
|
2298
|
+
"description": "Free-form details about the todo. Fully supports GFM Markdown (tables, strikethrough, task lists). Stored verbatim; client applications are responsible for rendering. Optional. Passing `null` is strictly rejected."
|
|
2299
|
+
},
|
|
2300
|
+
"parent_id": {
|
|
2301
|
+
"anyOf": [
|
|
2302
|
+
{
|
|
2303
|
+
"type": "string",
|
|
2304
|
+
"minLength": 1
|
|
2305
|
+
},
|
|
2306
|
+
{
|
|
2307
|
+
"type": "null"
|
|
2308
|
+
}
|
|
2309
|
+
],
|
|
2310
|
+
"description": "Parent todo ID (`tod_<ULID>`) to attach this todo as a child under another todo. Omit or pass `null` to create a root-level todo. Nesting is limited to one level; attempting to set a child todo as a parent will trigger `PARENT_IS_CHILD`. To make a subtask appear on every occurrence of a recurring rule, set this to that rule's template todo id (the template id returned when the rule is created); the server re-materializes future occurrences so each carries the subtask."
|
|
2311
|
+
},
|
|
2312
|
+
"status": {
|
|
2313
|
+
"type": "string",
|
|
2314
|
+
"enum": [
|
|
2315
|
+
"open",
|
|
2316
|
+
"in_progress",
|
|
2317
|
+
"done",
|
|
2318
|
+
"cancelled"
|
|
2319
|
+
],
|
|
2320
|
+
"description": "Initial status of the todo. Omit to default to `open`. Allowed values: `open`, `in_progress`, `done`, `cancelled`."
|
|
2321
|
+
},
|
|
2322
|
+
"due_at": {
|
|
2323
|
+
"type": "string",
|
|
2324
|
+
"description": "Optional calendar due date in ISO date-only format (`YYYY-MM-DD`). Stored without timezone offsets to represent the same local calendar day globally. Pass `\"\"` or omit the field to skip setting a due date. Passing `null` is strictly rejected."
|
|
2325
|
+
},
|
|
2326
|
+
"type_id": {
|
|
2327
|
+
"type": "string",
|
|
2328
|
+
"minLength": 1,
|
|
2329
|
+
"description": "Type id this todo belongs to. Omit to use the project's default type. When project_id is also supplied, the type must belong to the same project. New server-generated type ids use typ_<ULID>; legacy ids remain accepted."
|
|
2330
|
+
},
|
|
2331
|
+
"custom_fields": {
|
|
2332
|
+
"type": "object",
|
|
2333
|
+
"additionalProperties": {
|
|
2334
|
+
"anyOf": [
|
|
2335
|
+
{
|
|
2336
|
+
"type": "string"
|
|
2337
|
+
},
|
|
2338
|
+
{
|
|
2339
|
+
"type": "array",
|
|
2340
|
+
"items": {
|
|
2341
|
+
"type": "string"
|
|
2342
|
+
}
|
|
2343
|
+
}
|
|
2344
|
+
]
|
|
2345
|
+
},
|
|
2346
|
+
"description": "Custom field values keyed by the field's immutable `key` (not the human `label`). Each value must match the declared field type: string fields require string values, and string_array fields require string arrays. Providing a key that is not declared on the resolved todo type is strictly rejected with `UNDECLARED_FIELD`. Missing required fields that lack a default value are rejected with `FIELD_REQUIRED`. Defaults declared on the type are auto-applied at create time."
|
|
2347
|
+
}
|
|
2348
|
+
},
|
|
2349
|
+
"required": [
|
|
2350
|
+
"title",
|
|
2351
|
+
"project_id"
|
|
2352
|
+
]
|
|
2353
|
+
},
|
|
2354
|
+
"TodoType": {
|
|
2355
|
+
"type": "object",
|
|
2356
|
+
"properties": {
|
|
2357
|
+
"id": {
|
|
2358
|
+
"type": "string"
|
|
2359
|
+
},
|
|
2360
|
+
"project_id": {
|
|
2361
|
+
"type": "string",
|
|
2362
|
+
"description": "Project scope for this todo type. Todos can use this type only when they belong to the same project."
|
|
2363
|
+
},
|
|
2364
|
+
"label": {
|
|
2365
|
+
"type": "string"
|
|
2494
2366
|
},
|
|
2495
2367
|
"hide_core_fields": {
|
|
2496
2368
|
"type": "array",
|
|
2497
2369
|
"items": {
|
|
2498
|
-
"type": "string"
|
|
2499
|
-
"enum": [
|
|
2500
|
-
"description",
|
|
2501
|
-
"status",
|
|
2502
|
-
"due_at",
|
|
2503
|
-
"parent_id",
|
|
2504
|
-
"recurrence"
|
|
2505
|
-
]
|
|
2370
|
+
"type": "string"
|
|
2506
2371
|
}
|
|
2507
2372
|
},
|
|
2508
2373
|
"custom_fields": {
|
|
@@ -2572,30 +2437,55 @@
|
|
|
2572
2437
|
}
|
|
2573
2438
|
]
|
|
2574
2439
|
}
|
|
2440
|
+
},
|
|
2441
|
+
"version": {
|
|
2442
|
+
"type": "integer"
|
|
2443
|
+
},
|
|
2444
|
+
"created_at": {
|
|
2445
|
+
"type": "integer"
|
|
2446
|
+
},
|
|
2447
|
+
"updated_at": {
|
|
2448
|
+
"type": "integer"
|
|
2449
|
+
},
|
|
2450
|
+
"deleted_at": {
|
|
2451
|
+
"type": "integer"
|
|
2575
2452
|
}
|
|
2576
2453
|
},
|
|
2577
2454
|
"required": [
|
|
2455
|
+
"id",
|
|
2456
|
+
"project_id",
|
|
2578
2457
|
"label",
|
|
2579
|
-
"
|
|
2458
|
+
"hide_core_fields",
|
|
2459
|
+
"custom_fields",
|
|
2460
|
+
"version",
|
|
2461
|
+
"created_at",
|
|
2462
|
+
"updated_at"
|
|
2580
2463
|
]
|
|
2581
2464
|
},
|
|
2582
|
-
"
|
|
2465
|
+
"CreateTodoTypeBody": {
|
|
2583
2466
|
"type": "object",
|
|
2584
2467
|
"properties": {
|
|
2585
|
-
"
|
|
2586
|
-
"type": "string"
|
|
2468
|
+
"label": {
|
|
2469
|
+
"type": "string",
|
|
2470
|
+
"minLength": 1,
|
|
2471
|
+
"maxLength": 500
|
|
2587
2472
|
},
|
|
2588
2473
|
"project_id": {
|
|
2589
2474
|
"type": "string",
|
|
2590
|
-
"
|
|
2591
|
-
|
|
2592
|
-
"label": {
|
|
2593
|
-
"type": "string"
|
|
2475
|
+
"minLength": 1,
|
|
2476
|
+
"description": "Project this type belongs to. Required. It must be an active project in the caller's organization."
|
|
2594
2477
|
},
|
|
2595
2478
|
"hide_core_fields": {
|
|
2596
2479
|
"type": "array",
|
|
2597
2480
|
"items": {
|
|
2598
|
-
"type": "string"
|
|
2481
|
+
"type": "string",
|
|
2482
|
+
"enum": [
|
|
2483
|
+
"description",
|
|
2484
|
+
"status",
|
|
2485
|
+
"due_at",
|
|
2486
|
+
"parent_id",
|
|
2487
|
+
"recurrence"
|
|
2488
|
+
]
|
|
2599
2489
|
}
|
|
2600
2490
|
},
|
|
2601
2491
|
"custom_fields": {
|
|
@@ -2665,40 +2555,13 @@
|
|
|
2665
2555
|
}
|
|
2666
2556
|
]
|
|
2667
2557
|
}
|
|
2668
|
-
},
|
|
2669
|
-
"version": {
|
|
2670
|
-
"type": "integer"
|
|
2671
|
-
},
|
|
2672
|
-
"created_at": {
|
|
2673
|
-
"type": "integer"
|
|
2674
|
-
},
|
|
2675
|
-
"updated_at": {
|
|
2676
|
-
"type": "integer"
|
|
2677
|
-
},
|
|
2678
|
-
"deleted_at": {
|
|
2679
|
-
"type": "integer"
|
|
2680
2558
|
}
|
|
2681
2559
|
},
|
|
2682
2560
|
"required": [
|
|
2683
|
-
"id",
|
|
2684
|
-
"project_id",
|
|
2685
2561
|
"label",
|
|
2686
|
-
"
|
|
2687
|
-
"custom_fields",
|
|
2688
|
-
"version",
|
|
2689
|
-
"created_at",
|
|
2690
|
-
"updated_at"
|
|
2562
|
+
"project_id"
|
|
2691
2563
|
]
|
|
2692
2564
|
},
|
|
2693
|
-
"DeleteRecurrenceRuleBody": {
|
|
2694
|
-
"type": "object",
|
|
2695
|
-
"properties": {
|
|
2696
|
-
"expected_version": {
|
|
2697
|
-
"type": "integer",
|
|
2698
|
-
"minimum": 0
|
|
2699
|
-
}
|
|
2700
|
-
}
|
|
2701
|
-
},
|
|
2702
2565
|
"DeleteRecurrenceRuleResponse": {
|
|
2703
2566
|
"type": "object",
|
|
2704
2567
|
"properties": {
|
|
@@ -2710,16 +2573,12 @@
|
|
|
2710
2573
|
"ok"
|
|
2711
2574
|
]
|
|
2712
2575
|
},
|
|
2713
|
-
"
|
|
2576
|
+
"DeleteRecurrenceRuleBody": {
|
|
2714
2577
|
"type": "object",
|
|
2715
2578
|
"properties": {
|
|
2716
2579
|
"expected_version": {
|
|
2717
2580
|
"type": "integer",
|
|
2718
2581
|
"minimum": 0
|
|
2719
|
-
},
|
|
2720
|
-
"cascade": {
|
|
2721
|
-
"type": "boolean",
|
|
2722
|
-
"default": false
|
|
2723
2582
|
}
|
|
2724
2583
|
}
|
|
2725
2584
|
},
|
|
@@ -2739,6 +2598,19 @@
|
|
|
2739
2598
|
"deleted_at"
|
|
2740
2599
|
]
|
|
2741
2600
|
},
|
|
2601
|
+
"DeleteTodoBody": {
|
|
2602
|
+
"type": "object",
|
|
2603
|
+
"properties": {
|
|
2604
|
+
"expected_version": {
|
|
2605
|
+
"type": "integer",
|
|
2606
|
+
"minimum": 0
|
|
2607
|
+
},
|
|
2608
|
+
"cascade": {
|
|
2609
|
+
"type": "boolean",
|
|
2610
|
+
"default": false
|
|
2611
|
+
}
|
|
2612
|
+
}
|
|
2613
|
+
},
|
|
2742
2614
|
"RecurrenceRuleDetail": {
|
|
2743
2615
|
"type": "object",
|
|
2744
2616
|
"properties": {
|
|
@@ -2844,40 +2716,6 @@
|
|
|
2844
2716
|
"materialized_instance_count"
|
|
2845
2717
|
]
|
|
2846
2718
|
},
|
|
2847
|
-
"GetTodoQuery": {
|
|
2848
|
-
"type": "object",
|
|
2849
|
-
"properties": {
|
|
2850
|
-
"include_deleted": {
|
|
2851
|
-
"anyOf": [
|
|
2852
|
-
{
|
|
2853
|
-
"type": "string"
|
|
2854
|
-
},
|
|
2855
|
-
{
|
|
2856
|
-
"type": "array",
|
|
2857
|
-
"items": {
|
|
2858
|
-
"type": "string"
|
|
2859
|
-
}
|
|
2860
|
-
}
|
|
2861
|
-
]
|
|
2862
|
-
},
|
|
2863
|
-
"include_orphan_fields": {
|
|
2864
|
-
"anyOf": [
|
|
2865
|
-
{
|
|
2866
|
-
"type": "string"
|
|
2867
|
-
},
|
|
2868
|
-
{
|
|
2869
|
-
"type": "array",
|
|
2870
|
-
"items": {
|
|
2871
|
-
"type": "string"
|
|
2872
|
-
}
|
|
2873
|
-
}
|
|
2874
|
-
]
|
|
2875
|
-
},
|
|
2876
|
-
"include": {
|
|
2877
|
-
"type": "string"
|
|
2878
|
-
}
|
|
2879
|
-
}
|
|
2880
|
-
},
|
|
2881
2719
|
"TodoWithRelations": {
|
|
2882
2720
|
"type": "object",
|
|
2883
2721
|
"properties": {
|
|
@@ -2984,22 +2822,6 @@
|
|
|
2984
2822
|
"type_id"
|
|
2985
2823
|
]
|
|
2986
2824
|
},
|
|
2987
|
-
"ListRecurrenceRulesQuery": {
|
|
2988
|
-
"type": "object",
|
|
2989
|
-
"properties": {
|
|
2990
|
-
"project_id": {
|
|
2991
|
-
"type": "string",
|
|
2992
|
-
"minLength": 1,
|
|
2993
|
-
"description": "Project id filter. Required. Unknown, cross-organization, or soft-deleted project ids return NOT_FOUND."
|
|
2994
|
-
},
|
|
2995
|
-
"user_id": {
|
|
2996
|
-
"type": "string"
|
|
2997
|
-
}
|
|
2998
|
-
},
|
|
2999
|
-
"required": [
|
|
3000
|
-
"project_id"
|
|
3001
|
-
]
|
|
3002
|
-
},
|
|
3003
2825
|
"ListRecurrenceRulesResponse": {
|
|
3004
2826
|
"type": "object",
|
|
3005
2827
|
"properties": {
|
|
@@ -3032,19 +2854,6 @@
|
|
|
3032
2854
|
"todos"
|
|
3033
2855
|
]
|
|
3034
2856
|
},
|
|
3035
|
-
"RestoreTodoBody": {
|
|
3036
|
-
"type": "object",
|
|
3037
|
-
"properties": {
|
|
3038
|
-
"expected_version": {
|
|
3039
|
-
"type": "integer",
|
|
3040
|
-
"minimum": 0
|
|
3041
|
-
},
|
|
3042
|
-
"cascade": {
|
|
3043
|
-
"type": "boolean",
|
|
3044
|
-
"default": false
|
|
3045
|
-
}
|
|
3046
|
-
}
|
|
3047
|
-
},
|
|
3048
2857
|
"RestoreTodoResponse": {
|
|
3049
2858
|
"type": "object",
|
|
3050
2859
|
"properties": {
|
|
@@ -3066,6 +2875,19 @@
|
|
|
3066
2875
|
"descendants_in_trash_count"
|
|
3067
2876
|
]
|
|
3068
2877
|
},
|
|
2878
|
+
"RestoreTodoBody": {
|
|
2879
|
+
"type": "object",
|
|
2880
|
+
"properties": {
|
|
2881
|
+
"expected_version": {
|
|
2882
|
+
"type": "integer",
|
|
2883
|
+
"minimum": 0
|
|
2884
|
+
},
|
|
2885
|
+
"cascade": {
|
|
2886
|
+
"type": "boolean",
|
|
2887
|
+
"default": false
|
|
2888
|
+
}
|
|
2889
|
+
}
|
|
2890
|
+
},
|
|
3069
2891
|
"UpdateCommentBody": {
|
|
3070
2892
|
"type": "object",
|
|
3071
2893
|
"properties": {
|