@remit/api-openapi-spec 0.0.76 → 0.0.78
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/openapi.json +247 -392
- package/package.json +1 -1
package/openapi.json
CHANGED
|
@@ -1291,26 +1291,7 @@
|
|
|
1291
1291
|
"content": {
|
|
1292
1292
|
"application/json": {
|
|
1293
1293
|
"schema": {
|
|
1294
|
-
"
|
|
1295
|
-
"required": [
|
|
1296
|
-
"items"
|
|
1297
|
-
],
|
|
1298
|
-
"properties": {
|
|
1299
|
-
"continuationToken": {
|
|
1300
|
-
"allOf": [
|
|
1301
|
-
{
|
|
1302
|
-
"$ref": "#/components/schemas/String800"
|
|
1303
|
-
}
|
|
1304
|
-
],
|
|
1305
|
-
"description": "Opaque, server-minted cursor: absent means the first (or last) page, present means resume from here. Echo it back unchanged to fetch the next page. Every listing endpoint that accepts it rejects a token it cannot decode with 400 ValidationError rather than silently restarting from the first page (#136, #172)."
|
|
1306
|
-
},
|
|
1307
|
-
"items": {
|
|
1308
|
-
"type": "array",
|
|
1309
|
-
"items": {
|
|
1310
|
-
"$ref": "#/components/schemas/RemitImap.MailboxResponse"
|
|
1311
|
-
}
|
|
1312
|
-
}
|
|
1313
|
-
}
|
|
1294
|
+
"$ref": "#/components/schemas/RemitImap.MailboxListResponse"
|
|
1314
1295
|
}
|
|
1315
1296
|
}
|
|
1316
1297
|
}
|
|
@@ -1693,7 +1674,7 @@
|
|
|
1693
1674
|
"/accounts/{accountId}/organize": {
|
|
1694
1675
|
"post": {
|
|
1695
1676
|
"operationId": "OrganizeOperations_createOrganizeJob",
|
|
1696
|
-
"description": "Start a one-time \"all like these\" back-apply: match the corpus against the given predicate and apply the action to every match, in one pass. Returns immediately with an organizeJobId; poll GET /accounts/{accountId}/organize/{organizeJobId} for state and counts. Never creates a Filter
|
|
1677
|
+
"description": "Start a one-time \"all like these\" back-apply: match the corpus against the given predicate and apply the action to every match, in one pass. Returns immediately with an organizeJobId; poll GET /accounts/{accountId}/organize/{organizeJobId} for state and counts. Never creates a Filter row (RFC 034 recap).",
|
|
1697
1678
|
"parameters": [
|
|
1698
1679
|
{
|
|
1699
1680
|
"name": "accountId",
|
|
@@ -3866,26 +3847,7 @@
|
|
|
3866
3847
|
"content": {
|
|
3867
3848
|
"application/json": {
|
|
3868
3849
|
"schema": {
|
|
3869
|
-
"
|
|
3870
|
-
"required": [
|
|
3871
|
-
"items"
|
|
3872
|
-
],
|
|
3873
|
-
"properties": {
|
|
3874
|
-
"continuationToken": {
|
|
3875
|
-
"allOf": [
|
|
3876
|
-
{
|
|
3877
|
-
"$ref": "#/components/schemas/String800"
|
|
3878
|
-
}
|
|
3879
|
-
],
|
|
3880
|
-
"description": "Opaque, server-minted cursor: absent means the first (or last) page, present means resume from here. Echo it back unchanged to fetch the next page. Every listing endpoint that accepts it rejects a token it cannot decode with 400 ValidationError rather than silently restarting from the first page (#136, #172)."
|
|
3881
|
-
},
|
|
3882
|
-
"items": {
|
|
3883
|
-
"type": "array",
|
|
3884
|
-
"items": {
|
|
3885
|
-
"$ref": "#/components/schemas/RemitImap.ThreadMessageResponse"
|
|
3886
|
-
}
|
|
3887
|
-
}
|
|
3888
|
-
}
|
|
3850
|
+
"$ref": "#/components/schemas/RemitImap.ThreadMessageListResponse"
|
|
3889
3851
|
}
|
|
3890
3852
|
}
|
|
3891
3853
|
}
|
|
@@ -4881,7 +4843,17 @@
|
|
|
4881
4843
|
}
|
|
4882
4844
|
},
|
|
4883
4845
|
"404": {
|
|
4884
|
-
"description": "
|
|
4846
|
+
"description": "No message answers to this id, or the caller may not learn that one does.\n`code` is `not_found`, or `message_gone_from_server` when the mail server no\nlonger holds the message at its UID — another client expunged it or moved it\naway before its body was stored. That answer carries `details.messageId`.",
|
|
4847
|
+
"content": {
|
|
4848
|
+
"application/json": {
|
|
4849
|
+
"schema": {
|
|
4850
|
+
"$ref": "#/components/schemas/ApiError"
|
|
4851
|
+
}
|
|
4852
|
+
}
|
|
4853
|
+
}
|
|
4854
|
+
},
|
|
4855
|
+
"409": {
|
|
4856
|
+
"description": "The same flat 409 body, for a message whose folder and uid do not name the same message.\n\n`code: \"message_placement_unsettled\"` — the message is mid-move, so its row names the destination folder while its uid still belongs to the source; acting on that pair would hit whatever the destination holds at that uid. `details` carries `accountId`, `messageId` and `reason`, one of: `in_flight` (the move is still running, and the same request succeeds once it confirms) or `unverified` (the move gave up without confirming, so where the message sits is unknown until the folder is resynced).",
|
|
4885
4857
|
"content": {
|
|
4886
4858
|
"application/json": {
|
|
4887
4859
|
"schema": {
|
|
@@ -5113,7 +5085,17 @@
|
|
|
5113
5085
|
}
|
|
5114
5086
|
},
|
|
5115
5087
|
"404": {
|
|
5116
|
-
"description": "
|
|
5088
|
+
"description": "No message answers to this id, or the caller may not learn that one does.\n`code` is `not_found`, or `message_gone_from_server` when the mail server no\nlonger holds the message at its UID — another client expunged it or moved it\naway before its body was stored. That answer carries `details.messageId`.",
|
|
5089
|
+
"content": {
|
|
5090
|
+
"application/json": {
|
|
5091
|
+
"schema": {
|
|
5092
|
+
"$ref": "#/components/schemas/ApiError"
|
|
5093
|
+
}
|
|
5094
|
+
}
|
|
5095
|
+
}
|
|
5096
|
+
},
|
|
5097
|
+
"409": {
|
|
5098
|
+
"description": "The same flat 409 body, for a message whose folder and uid do not name the same message.\n\n`code: \"message_placement_unsettled\"` — the message is mid-move, so its row names the destination folder while its uid still belongs to the source; acting on that pair would hit whatever the destination holds at that uid. `details` carries `accountId`, `messageId` and `reason`, one of: `in_flight` (the move is still running, and the same request succeeds once it confirms) or `unverified` (the move gave up without confirming, so where the message sits is unknown until the folder is resynced).",
|
|
5117
5099
|
"content": {
|
|
5118
5100
|
"application/json": {
|
|
5119
5101
|
"schema": {
|
|
@@ -5228,26 +5210,7 @@
|
|
|
5228
5210
|
"content": {
|
|
5229
5211
|
"application/json": {
|
|
5230
5212
|
"schema": {
|
|
5231
|
-
"
|
|
5232
|
-
"required": [
|
|
5233
|
-
"items"
|
|
5234
|
-
],
|
|
5235
|
-
"properties": {
|
|
5236
|
-
"continuationToken": {
|
|
5237
|
-
"allOf": [
|
|
5238
|
-
{
|
|
5239
|
-
"$ref": "#/components/schemas/String800"
|
|
5240
|
-
}
|
|
5241
|
-
],
|
|
5242
|
-
"description": "Opaque, server-minted cursor: absent means the first (or last) page, present means resume from here. Echo it back unchanged to fetch the next page. Every listing endpoint that accepts it rejects a token it cannot decode with 400 ValidationError rather than silently restarting from the first page (#136, #172)."
|
|
5243
|
-
},
|
|
5244
|
-
"items": {
|
|
5245
|
-
"type": "array",
|
|
5246
|
-
"items": {
|
|
5247
|
-
"$ref": "#/components/schemas/RemitImap.OutboxMessageResponse"
|
|
5248
|
-
}
|
|
5249
|
-
}
|
|
5250
|
-
}
|
|
5213
|
+
"$ref": "#/components/schemas/RemitImap.OutboxMessageListResponse"
|
|
5251
5214
|
}
|
|
5252
5215
|
}
|
|
5253
5216
|
}
|
|
@@ -5696,139 +5659,6 @@
|
|
|
5696
5659
|
}
|
|
5697
5660
|
}
|
|
5698
5661
|
},
|
|
5699
|
-
"/search/semantic": {
|
|
5700
|
-
"get": {
|
|
5701
|
-
"operationId": "SemanticSearchOperations_semanticSearch",
|
|
5702
|
-
"description": "Run a semantic vector search across the caller's indexed messages.",
|
|
5703
|
-
"parameters": [
|
|
5704
|
-
{
|
|
5705
|
-
"name": "query",
|
|
5706
|
-
"in": "query",
|
|
5707
|
-
"required": true,
|
|
5708
|
-
"description": "Free-form natural-language query",
|
|
5709
|
-
"schema": {
|
|
5710
|
-
"type": "string"
|
|
5711
|
-
}
|
|
5712
|
-
},
|
|
5713
|
-
{
|
|
5714
|
-
"name": "mailboxId",
|
|
5715
|
-
"in": "query",
|
|
5716
|
-
"required": false,
|
|
5717
|
-
"description": "Restrict results to a single mailbox",
|
|
5718
|
-
"schema": {
|
|
5719
|
-
"$ref": "#/components/schemas/UUID"
|
|
5720
|
-
}
|
|
5721
|
-
},
|
|
5722
|
-
{
|
|
5723
|
-
"name": "sentDateFrom",
|
|
5724
|
-
"in": "query",
|
|
5725
|
-
"required": false,
|
|
5726
|
-
"description": "Lower bound on sentDate (epoch seconds, inclusive)",
|
|
5727
|
-
"schema": {
|
|
5728
|
-
"type": "integer",
|
|
5729
|
-
"format": "int64"
|
|
5730
|
-
}
|
|
5731
|
-
},
|
|
5732
|
-
{
|
|
5733
|
-
"name": "sentDateTo",
|
|
5734
|
-
"in": "query",
|
|
5735
|
-
"required": false,
|
|
5736
|
-
"description": "Upper bound on sentDate (epoch seconds, inclusive)",
|
|
5737
|
-
"schema": {
|
|
5738
|
-
"type": "integer",
|
|
5739
|
-
"format": "int64"
|
|
5740
|
-
}
|
|
5741
|
-
},
|
|
5742
|
-
{
|
|
5743
|
-
"name": "hasAttachment",
|
|
5744
|
-
"in": "query",
|
|
5745
|
-
"required": false,
|
|
5746
|
-
"description": "Restrict to messages with or without attachments",
|
|
5747
|
-
"schema": {
|
|
5748
|
-
"type": "boolean"
|
|
5749
|
-
}
|
|
5750
|
-
},
|
|
5751
|
-
{
|
|
5752
|
-
"name": "hasStars",
|
|
5753
|
-
"in": "query",
|
|
5754
|
-
"required": false,
|
|
5755
|
-
"description": "Restrict to starred or unstarred messages",
|
|
5756
|
-
"schema": {
|
|
5757
|
-
"type": "boolean"
|
|
5758
|
-
}
|
|
5759
|
-
},
|
|
5760
|
-
{
|
|
5761
|
-
"name": "isRead",
|
|
5762
|
-
"in": "query",
|
|
5763
|
-
"required": false,
|
|
5764
|
-
"description": "Restrict to read or unread messages",
|
|
5765
|
-
"schema": {
|
|
5766
|
-
"type": "boolean"
|
|
5767
|
-
}
|
|
5768
|
-
},
|
|
5769
|
-
{
|
|
5770
|
-
"name": "category",
|
|
5771
|
-
"in": "query",
|
|
5772
|
-
"required": false,
|
|
5773
|
-
"description": "Restrict results to a single header-derived category",
|
|
5774
|
-
"schema": {
|
|
5775
|
-
"$ref": "#/components/schemas/RemitImap.MessageCategory"
|
|
5776
|
-
}
|
|
5777
|
-
},
|
|
5778
|
-
{
|
|
5779
|
-
"name": "limit",
|
|
5780
|
-
"in": "query",
|
|
5781
|
-
"required": false,
|
|
5782
|
-
"description": "Maximum number of results to return",
|
|
5783
|
-
"schema": {
|
|
5784
|
-
"type": "integer",
|
|
5785
|
-
"format": "int32"
|
|
5786
|
-
}
|
|
5787
|
-
}
|
|
5788
|
-
],
|
|
5789
|
-
"responses": {
|
|
5790
|
-
"200": {
|
|
5791
|
-
"description": "The request has succeeded.",
|
|
5792
|
-
"content": {
|
|
5793
|
-
"application/json": {
|
|
5794
|
-
"schema": {
|
|
5795
|
-
"type": "object",
|
|
5796
|
-
"properties": {
|
|
5797
|
-
"items": {
|
|
5798
|
-
"type": "array",
|
|
5799
|
-
"items": {
|
|
5800
|
-
"$ref": "#/components/schemas/RemitImap.SemanticSearchResult"
|
|
5801
|
-
}
|
|
5802
|
-
}
|
|
5803
|
-
},
|
|
5804
|
-
"required": [
|
|
5805
|
-
"items"
|
|
5806
|
-
]
|
|
5807
|
-
}
|
|
5808
|
-
}
|
|
5809
|
-
}
|
|
5810
|
-
},
|
|
5811
|
-
"401": {
|
|
5812
|
-
"description": "The request carried no usable credential. `code` is `unauthorized`.",
|
|
5813
|
-
"content": {
|
|
5814
|
-
"application/json": {
|
|
5815
|
-
"schema": {
|
|
5816
|
-
"$ref": "#/components/schemas/ApiError"
|
|
5817
|
-
}
|
|
5818
|
-
}
|
|
5819
|
-
}
|
|
5820
|
-
}
|
|
5821
|
-
},
|
|
5822
|
-
"x-amazon-apigateway-integration": {
|
|
5823
|
-
"type": "aws_proxy",
|
|
5824
|
-
"httpMethod": "POST",
|
|
5825
|
-
"passthroughBehavior": "when_no_match",
|
|
5826
|
-
"uri": {
|
|
5827
|
-
"Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
|
|
5828
|
-
}
|
|
5829
|
-
}
|
|
5830
|
-
}
|
|
5831
|
-
},
|
|
5832
5662
|
"/system/update": {
|
|
5833
5663
|
"get": {
|
|
5834
5664
|
"operationId": "SystemOperations_getSystemUpdate",
|
|
@@ -6172,26 +6002,7 @@
|
|
|
6172
6002
|
"content": {
|
|
6173
6003
|
"application/json": {
|
|
6174
6004
|
"schema": {
|
|
6175
|
-
"
|
|
6176
|
-
"required": [
|
|
6177
|
-
"items"
|
|
6178
|
-
],
|
|
6179
|
-
"properties": {
|
|
6180
|
-
"continuationToken": {
|
|
6181
|
-
"allOf": [
|
|
6182
|
-
{
|
|
6183
|
-
"$ref": "#/components/schemas/String800"
|
|
6184
|
-
}
|
|
6185
|
-
],
|
|
6186
|
-
"description": "Opaque, server-minted cursor: absent means the first (or last) page, present means resume from here. Echo it back unchanged to fetch the next page. Every listing endpoint that accepts it rejects a token it cannot decode with 400 ValidationError rather than silently restarting from the first page (#136, #172)."
|
|
6187
|
-
},
|
|
6188
|
-
"items": {
|
|
6189
|
-
"type": "array",
|
|
6190
|
-
"items": {
|
|
6191
|
-
"$ref": "#/components/schemas/RemitImap.ThreadMessageResponse"
|
|
6192
|
-
}
|
|
6193
|
-
}
|
|
6194
|
-
}
|
|
6005
|
+
"$ref": "#/components/schemas/RemitImap.ThreadMessageListResponse"
|
|
6195
6006
|
}
|
|
6196
6007
|
}
|
|
6197
6008
|
}
|
|
@@ -7168,6 +6979,7 @@
|
|
|
7168
6979
|
"type": "object",
|
|
7169
6980
|
"required": [
|
|
7170
6981
|
"bodyPartId",
|
|
6982
|
+
"partPath",
|
|
7171
6983
|
"mediaType",
|
|
7172
6984
|
"mediaSubtype",
|
|
7173
6985
|
"sizeOctets",
|
|
@@ -7184,6 +6996,12 @@
|
|
|
7184
6996
|
"description": "Primary identifier",
|
|
7185
6997
|
"readOnly": true
|
|
7186
6998
|
},
|
|
6999
|
+
"partPath": {
|
|
7000
|
+
"type": "string",
|
|
7001
|
+
"minLength": 1,
|
|
7002
|
+
"description": "Storage path of the part within its message: '0' is the root, otherwise the IMAP section number (e.g., '1', '1.2', '2.1.3'). '<path>.0' is the root of the forwarded message a message/rfc822 part at <path> carries, which is not an IMAP section.",
|
|
7003
|
+
"readOnly": true
|
|
7004
|
+
},
|
|
7187
7005
|
"mediaType": {
|
|
7188
7006
|
"allOf": [
|
|
7189
7007
|
{
|
|
@@ -8242,7 +8060,7 @@
|
|
|
8242
8060
|
"required": [
|
|
8243
8061
|
"accountConfig",
|
|
8244
8062
|
"accounts",
|
|
8245
|
-
"
|
|
8063
|
+
"buildCommit"
|
|
8246
8064
|
],
|
|
8247
8065
|
"properties": {
|
|
8248
8066
|
"accountConfig": {
|
|
@@ -8260,6 +8078,10 @@
|
|
|
8260
8078
|
},
|
|
8261
8079
|
"description": "Associated email accounts"
|
|
8262
8080
|
},
|
|
8081
|
+
"buildCommit": {
|
|
8082
|
+
"type": "string",
|
|
8083
|
+
"description": "The commit the serving build was made from, or `dev` for a build made outside CI and git"
|
|
8084
|
+
},
|
|
8263
8085
|
"pendingImport": {
|
|
8264
8086
|
"allOf": [
|
|
8265
8087
|
{
|
|
@@ -8267,10 +8089,6 @@
|
|
|
8267
8089
|
}
|
|
8268
8090
|
],
|
|
8269
8091
|
"description": "Absent unless a configuration import is still waiting on folders IMAP has not produced yet (#1021). Nothing polls a separate route for it."
|
|
8270
|
-
},
|
|
8271
|
-
"semanticSearchEnabled": {
|
|
8272
|
-
"type": "boolean",
|
|
8273
|
-
"description": "Whether this instance stores a vector for every message — SEARCH_EMBEDDING_PROVIDER is anything but `off`. False is a setting an operator turns on (`remit semantic on`), not a failure: the Organize semantic widen and semantic (anchor) filters read stored vectors and have none, so they render an off state rather than an empty result. It rides the config read because it is a property of the deployment, not of a query (#1068)."
|
|
8274
8092
|
}
|
|
8275
8093
|
},
|
|
8276
8094
|
"description": "Full configuration description including accounts"
|
|
@@ -8731,7 +8549,7 @@
|
|
|
8731
8549
|
"$ref": "#/components/schemas/RemitImap.FilterScope"
|
|
8732
8550
|
}
|
|
8733
8551
|
],
|
|
8734
|
-
"description": "Standing (permanent) or Temporary (expires). Governs whether expiresAt/ttl are present (RFC 034 Decision 1). Mutable on update (reader #266): switching scope re-derives ttl and re-evaluates state from expiresAt, and bumps ruleChangedAt so a lapsed filter's back-application can be offered again.
|
|
8552
|
+
"description": "Standing (permanent) or Temporary (expires). Governs whether expiresAt/ttl are present (RFC 034 Decision 1). Mutable on update (reader #266): switching scope re-derives ttl and re-evaluates state from expiresAt, and bumps ruleChangedAt so a lapsed filter's back-application can be offered again."
|
|
8735
8553
|
},
|
|
8736
8554
|
"expiresAt": {
|
|
8737
8555
|
"type": "string",
|
|
@@ -8743,7 +8561,7 @@
|
|
|
8743
8561
|
"$ref": "#/components/schemas/RemitImap.FilterMatchOperator"
|
|
8744
8562
|
}
|
|
8745
8563
|
],
|
|
8746
|
-
"description": "How literalClauses combine.
|
|
8564
|
+
"description": "How literalClauses combine.",
|
|
8747
8565
|
"default": "And"
|
|
8748
8566
|
},
|
|
8749
8567
|
"literalClauses": {
|
|
@@ -8751,8 +8569,8 @@
|
|
|
8751
8569
|
"items": {
|
|
8752
8570
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
8753
8571
|
},
|
|
8754
|
-
"
|
|
8755
|
-
"
|
|
8572
|
+
"minItems": 1,
|
|
8573
|
+
"description": "Literal from/subject/has-words predicate clauses (RFC 031). A filter carries at least one."
|
|
8756
8574
|
},
|
|
8757
8575
|
"actionLabelId": {
|
|
8758
8576
|
"type": "string",
|
|
@@ -8763,17 +8581,9 @@
|
|
|
8763
8581
|
"type": "string",
|
|
8764
8582
|
"description": "Mailbox matched messages are moved into — exclusive action, since a message lives in exactly one mailbox (RFC 034 Decision 3.1). On conflict between filters, the one with the latest actionChangedAt wins. `\"None\"` means no move action.",
|
|
8765
8583
|
"default": "None"
|
|
8766
|
-
},
|
|
8767
|
-
"anchorMessageId": {
|
|
8768
|
-
"allOf": [
|
|
8769
|
-
{
|
|
8770
|
-
"$ref": "#/components/schemas/UUID"
|
|
8771
|
-
}
|
|
8772
|
-
],
|
|
8773
|
-
"description": "Anchor message for a semantic filter — provenance for the persisted anchor the server builds at save time (RFC 034 Decision 2.1). Absent for a purely-literal filter."
|
|
8774
8584
|
}
|
|
8775
8585
|
},
|
|
8776
|
-
"description": "Input for creating a filter (RFC 034). `ttl` is omitted — it is derived\nserver-side from `expiresAt` when `scope` is `Temporary` (RFC 034 Decision\n1.3), never client-supplied. `state`, `
|
|
8586
|
+
"description": "Input for creating a filter (RFC 034). `ttl` is omitted — it is derived\nserver-side from `expiresAt` when `scope` is `Temporary` (RFC 034 Decision\n1.3), never client-supplied. `state`, `ruleChangedAt`, and `filterId` are\nall server-derived and excluded by their Read-only visibility."
|
|
8777
8587
|
},
|
|
8778
8588
|
"RemitImap.CreateFilterResponse": {
|
|
8779
8589
|
"type": "object",
|
|
@@ -8784,7 +8594,6 @@
|
|
|
8784
8594
|
"scope",
|
|
8785
8595
|
"state",
|
|
8786
8596
|
"disabledReason",
|
|
8787
|
-
"hasAnchor",
|
|
8788
8597
|
"ruleChangedAt",
|
|
8789
8598
|
"actionChangedAt",
|
|
8790
8599
|
"matchOperator",
|
|
@@ -8828,7 +8637,7 @@
|
|
|
8828
8637
|
"$ref": "#/components/schemas/RemitImap.FilterScope"
|
|
8829
8638
|
}
|
|
8830
8639
|
],
|
|
8831
|
-
"description": "Standing (permanent) or Temporary (expires). Governs whether expiresAt/ttl are present (RFC 034 Decision 1). Mutable on update (reader #266): switching scope re-derives ttl and re-evaluates state from expiresAt, and bumps ruleChangedAt so a lapsed filter's back-application can be offered again.
|
|
8640
|
+
"description": "Standing (permanent) or Temporary (expires). Governs whether expiresAt/ttl are present (RFC 034 Decision 1). Mutable on update (reader #266): switching scope re-derives ttl and re-evaluates state from expiresAt, and bumps ruleChangedAt so a lapsed filter's back-application can be offered again."
|
|
8832
8641
|
},
|
|
8833
8642
|
"expiresAt": {
|
|
8834
8643
|
"type": "string",
|
|
@@ -8853,12 +8662,6 @@
|
|
|
8853
8662
|
"default": "None",
|
|
8854
8663
|
"readOnly": true
|
|
8855
8664
|
},
|
|
8856
|
-
"hasAnchor": {
|
|
8857
|
-
"type": "boolean",
|
|
8858
|
-
"description": "Whether a sibling FilterAnchor row exists for this filter (RFC 034 Decision 2.3). Lets the index-time worker skip the FilterAnchor `get` entirely for purely-literal filters instead of probing for a row that may not exist.",
|
|
8859
|
-
"default": false,
|
|
8860
|
-
"readOnly": true
|
|
8861
|
-
},
|
|
8862
8665
|
"ruleChangedAt": {
|
|
8863
8666
|
"type": "integer",
|
|
8864
8667
|
"format": "int64",
|
|
@@ -8868,7 +8671,7 @@
|
|
|
8868
8671
|
"actionChangedAt": {
|
|
8869
8672
|
"type": "integer",
|
|
8870
8673
|
"format": "int64",
|
|
8871
|
-
"description": "Epoch seconds, written only when the predicate (literalClauses
|
|
8674
|
+
"description": "Epoch seconds, written only when the predicate (literalClauses) or the action (actionLabelId, actionMailboxId) changes — never on scope, expiresAt, or a cosmetic rename. Backs most-recently-changed-filter-wins precedence for the exclusive move action (RFC 034 Decision 3.2). Split out from ruleChangedAt (reader #384): extending a filter's expiry or flipping its scope changes its lifecycle, not what it matches or does, so it must not promote the filter to move-winner.",
|
|
8872
8675
|
"readOnly": true
|
|
8873
8676
|
},
|
|
8874
8677
|
"matchOperator": {
|
|
@@ -8877,7 +8680,7 @@
|
|
|
8877
8680
|
"$ref": "#/components/schemas/RemitImap.FilterMatchOperator"
|
|
8878
8681
|
}
|
|
8879
8682
|
],
|
|
8880
|
-
"description": "How literalClauses combine.
|
|
8683
|
+
"description": "How literalClauses combine.",
|
|
8881
8684
|
"default": "And"
|
|
8882
8685
|
},
|
|
8883
8686
|
"literalClauses": {
|
|
@@ -8885,8 +8688,8 @@
|
|
|
8885
8688
|
"items": {
|
|
8886
8689
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
8887
8690
|
},
|
|
8888
|
-
"
|
|
8889
|
-
"
|
|
8691
|
+
"minItems": 1,
|
|
8692
|
+
"description": "Literal from/subject/has-words predicate clauses (RFC 031). A filter carries at least one."
|
|
8890
8693
|
},
|
|
8891
8694
|
"actionLabelId": {
|
|
8892
8695
|
"type": "string",
|
|
@@ -9397,7 +9200,7 @@
|
|
|
9397
9200
|
"ListId",
|
|
9398
9201
|
"FromDomain"
|
|
9399
9202
|
],
|
|
9400
|
-
"description": "Message attribute a FilterClause matches against — RFC 031's Tier 0 literal predicates plus the RFC 038 D2 additions (list membership and sender domain). Every member is matched
|
|
9203
|
+
"description": "Message attribute a FilterClause matches against — RFC 031's Tier 0 literal predicates plus the RFC 038 D2 additions (list membership and sender domain). Every member is matched at index time and in the back-apply corpus projection."
|
|
9401
9204
|
},
|
|
9402
9205
|
"RemitImap.FilterDisabledReason": {
|
|
9403
9206
|
"type": "string",
|
|
@@ -9427,7 +9230,6 @@
|
|
|
9427
9230
|
"scope",
|
|
9428
9231
|
"state",
|
|
9429
9232
|
"disabledReason",
|
|
9430
|
-
"hasAnchor",
|
|
9431
9233
|
"ruleChangedAt",
|
|
9432
9234
|
"actionChangedAt",
|
|
9433
9235
|
"matchOperator",
|
|
@@ -9470,7 +9272,7 @@
|
|
|
9470
9272
|
"$ref": "#/components/schemas/RemitImap.FilterScope"
|
|
9471
9273
|
}
|
|
9472
9274
|
],
|
|
9473
|
-
"description": "Standing (permanent) or Temporary (expires). Governs whether expiresAt/ttl are present (RFC 034 Decision 1). Mutable on update (reader #266): switching scope re-derives ttl and re-evaluates state from expiresAt, and bumps ruleChangedAt so a lapsed filter's back-application can be offered again.
|
|
9275
|
+
"description": "Standing (permanent) or Temporary (expires). Governs whether expiresAt/ttl are present (RFC 034 Decision 1). Mutable on update (reader #266): switching scope re-derives ttl and re-evaluates state from expiresAt, and bumps ruleChangedAt so a lapsed filter's back-application can be offered again."
|
|
9474
9276
|
},
|
|
9475
9277
|
"expiresAt": {
|
|
9476
9278
|
"type": "string",
|
|
@@ -9495,12 +9297,6 @@
|
|
|
9495
9297
|
"default": "None",
|
|
9496
9298
|
"readOnly": true
|
|
9497
9299
|
},
|
|
9498
|
-
"hasAnchor": {
|
|
9499
|
-
"type": "boolean",
|
|
9500
|
-
"description": "Whether a sibling FilterAnchor row exists for this filter (RFC 034 Decision 2.3). Lets the index-time worker skip the FilterAnchor `get` entirely for purely-literal filters instead of probing for a row that may not exist.",
|
|
9501
|
-
"default": false,
|
|
9502
|
-
"readOnly": true
|
|
9503
|
-
},
|
|
9504
9300
|
"ruleChangedAt": {
|
|
9505
9301
|
"type": "integer",
|
|
9506
9302
|
"format": "int64",
|
|
@@ -9510,7 +9306,7 @@
|
|
|
9510
9306
|
"actionChangedAt": {
|
|
9511
9307
|
"type": "integer",
|
|
9512
9308
|
"format": "int64",
|
|
9513
|
-
"description": "Epoch seconds, written only when the predicate (literalClauses
|
|
9309
|
+
"description": "Epoch seconds, written only when the predicate (literalClauses) or the action (actionLabelId, actionMailboxId) changes — never on scope, expiresAt, or a cosmetic rename. Backs most-recently-changed-filter-wins precedence for the exclusive move action (RFC 034 Decision 3.2). Split out from ruleChangedAt (reader #384): extending a filter's expiry or flipping its scope changes its lifecycle, not what it matches or does, so it must not promote the filter to move-winner.",
|
|
9514
9310
|
"readOnly": true
|
|
9515
9311
|
},
|
|
9516
9312
|
"matchOperator": {
|
|
@@ -9519,7 +9315,7 @@
|
|
|
9519
9315
|
"$ref": "#/components/schemas/RemitImap.FilterMatchOperator"
|
|
9520
9316
|
}
|
|
9521
9317
|
],
|
|
9522
|
-
"description": "How literalClauses combine.
|
|
9318
|
+
"description": "How literalClauses combine.",
|
|
9523
9319
|
"default": "And"
|
|
9524
9320
|
},
|
|
9525
9321
|
"literalClauses": {
|
|
@@ -9527,8 +9323,8 @@
|
|
|
9527
9323
|
"items": {
|
|
9528
9324
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
9529
9325
|
},
|
|
9530
|
-
"
|
|
9531
|
-
"
|
|
9326
|
+
"minItems": 1,
|
|
9327
|
+
"description": "Literal from/subject/has-words predicate clauses (RFC 031). A filter carries at least one."
|
|
9532
9328
|
},
|
|
9533
9329
|
"actionLabelId": {
|
|
9534
9330
|
"type": "string",
|
|
@@ -9803,6 +9599,29 @@
|
|
|
9803
9599
|
},
|
|
9804
9600
|
"description": "The id, name, and color of a label applied to a message — embedded on message/thread read responses (issue #26). Never the full LabelResponse: a read-time attachment carries no filterCount."
|
|
9805
9601
|
},
|
|
9602
|
+
"RemitImap.MailboxListResponse": {
|
|
9603
|
+
"type": "object",
|
|
9604
|
+
"required": [
|
|
9605
|
+
"items"
|
|
9606
|
+
],
|
|
9607
|
+
"properties": {
|
|
9608
|
+
"continuationToken": {
|
|
9609
|
+
"allOf": [
|
|
9610
|
+
{
|
|
9611
|
+
"$ref": "#/components/schemas/String800"
|
|
9612
|
+
}
|
|
9613
|
+
],
|
|
9614
|
+
"description": "Opaque, server-minted cursor: absent means the first (or last) page, present means resume from here. Echo it back unchanged to fetch the next page. Every listing endpoint that accepts it rejects a token it cannot decode with 400 ValidationError rather than silently restarting from the first page (#136, #172)."
|
|
9615
|
+
},
|
|
9616
|
+
"items": {
|
|
9617
|
+
"type": "array",
|
|
9618
|
+
"items": {
|
|
9619
|
+
"$ref": "#/components/schemas/RemitImap.MailboxResponse"
|
|
9620
|
+
}
|
|
9621
|
+
}
|
|
9622
|
+
},
|
|
9623
|
+
"description": "A page of an account's mailboxes."
|
|
9624
|
+
},
|
|
9806
9625
|
"RemitImap.MailboxResponse": {
|
|
9807
9626
|
"type": "object",
|
|
9808
9627
|
"required": [
|
|
@@ -10265,11 +10084,6 @@
|
|
|
10265
10084
|
"description": "Server receipt timestamp (INTERNALDATE)",
|
|
10266
10085
|
"readOnly": true
|
|
10267
10086
|
},
|
|
10268
|
-
"messageIdHeader": {
|
|
10269
|
-
"type": "string",
|
|
10270
|
-
"description": "Message-ID header value for quick reference",
|
|
10271
|
-
"readOnly": true
|
|
10272
|
-
},
|
|
10273
10087
|
"status": {
|
|
10274
10088
|
"allOf": [
|
|
10275
10089
|
{
|
|
@@ -10309,6 +10123,11 @@
|
|
|
10309
10123
|
"description": "Structured sender-authenticity signal derived from DKIM headers at classification time. Absent for messages classified before this field was introduced — absence means no signal.",
|
|
10310
10124
|
"readOnly": true
|
|
10311
10125
|
},
|
|
10126
|
+
"messageIdHeader": {
|
|
10127
|
+
"type": "string",
|
|
10128
|
+
"description": "Message-ID header value for quick reference",
|
|
10129
|
+
"readOnly": true
|
|
10130
|
+
},
|
|
10312
10131
|
"autoMoved": {
|
|
10313
10132
|
"allOf": [
|
|
10314
10133
|
{
|
|
@@ -10566,15 +10385,7 @@
|
|
|
10566
10385
|
"$ref": "#/components/schemas/UUID"
|
|
10567
10386
|
}
|
|
10568
10387
|
],
|
|
10569
|
-
"description": "Back-apply this standing filter instead of the predicate in this body. The server reads the filter's persisted predicate
|
|
10570
|
-
},
|
|
10571
|
-
"anchorMessageId": {
|
|
10572
|
-
"allOf": [
|
|
10573
|
-
{
|
|
10574
|
-
"$ref": "#/components/schemas/UUID"
|
|
10575
|
-
}
|
|
10576
|
-
],
|
|
10577
|
-
"description": "Anchor message for the semantic half — \"all like this one\". Absent for a purely-literal back-apply. The anchor vector is pooled transiently from this message's indexed chunk vectors and never written to a FilterAnchor row."
|
|
10388
|
+
"description": "Back-apply this standing filter instead of the predicate in this body. The server reads the filter's persisted predicate and action, runs the pass over the inbox, and skips a move another active filter outranks, as index time does. The predicate and action fields of this body are ignored when it is set."
|
|
10578
10389
|
},
|
|
10579
10390
|
"matchOperator": {
|
|
10580
10391
|
"allOf": [
|
|
@@ -10590,14 +10401,9 @@
|
|
|
10590
10401
|
"items": {
|
|
10591
10402
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
10592
10403
|
},
|
|
10593
|
-
"description": "Literal from/subject/has-words clauses (RFC 031), reusing the Filter predicate shape.
|
|
10404
|
+
"description": "Literal from/subject/has-words clauses (RFC 031), reusing the Filter predicate shape.",
|
|
10594
10405
|
"default": []
|
|
10595
10406
|
},
|
|
10596
|
-
"similarityThreshold": {
|
|
10597
|
-
"type": "number",
|
|
10598
|
-
"format": "double",
|
|
10599
|
-
"description": "Cosine cut-off for the semantic match. Absent uses the server default (the same threshold the index-time filter pipeline applies)."
|
|
10600
|
-
},
|
|
10601
10407
|
"actionLabelId": {
|
|
10602
10408
|
"type": "string",
|
|
10603
10409
|
"description": "Label applied to every matching message — additive action (RFC 034 Decision 3.1). The `\"None\"` sentinel means no label action.",
|
|
@@ -10609,7 +10415,7 @@
|
|
|
10609
10415
|
"default": "None"
|
|
10610
10416
|
}
|
|
10611
10417
|
},
|
|
10612
|
-
"description": "The predicate + action for a one-time \"all like these\" back-apply (RFC 034\nrecap, #1278). A distinct model, deliberately NOT a Filter: it carries no\n`scope`, `expiresAt`, or `name`, so it structurally cannot create a standing\nrule.
|
|
10418
|
+
"description": "The predicate + action for a one-time \"all like these\" back-apply (RFC 034\nrecap, #1278). A distinct model, deliberately NOT a Filter: it carries no\n`scope`, `expiresAt`, or `name`, so it structurally cannot create a standing\nrule."
|
|
10613
10419
|
},
|
|
10614
10420
|
"RemitImap.OrganizeJobResponse": {
|
|
10615
10421
|
"type": "object",
|
|
@@ -10619,10 +10425,8 @@
|
|
|
10619
10425
|
"userId",
|
|
10620
10426
|
"state",
|
|
10621
10427
|
"filterId",
|
|
10622
|
-
"anchorMessageId",
|
|
10623
10428
|
"matchOperator",
|
|
10624
10429
|
"literalClauses",
|
|
10625
|
-
"similarityThreshold",
|
|
10626
10430
|
"actionLabelId",
|
|
10627
10431
|
"actionMailboxId",
|
|
10628
10432
|
"matchedCount",
|
|
@@ -10672,12 +10476,6 @@
|
|
|
10672
10476
|
"default": "None",
|
|
10673
10477
|
"readOnly": true
|
|
10674
10478
|
},
|
|
10675
|
-
"anchorMessageId": {
|
|
10676
|
-
"type": "string",
|
|
10677
|
-
"description": "Snapshot of the anchor message id, or the `\"None\"` sentinel for a purely-literal back-apply. A sentinel, not an optional field, so the persisted entity has no optional attributes (RFC 032).",
|
|
10678
|
-
"default": "None",
|
|
10679
|
-
"readOnly": true
|
|
10680
|
-
},
|
|
10681
10479
|
"matchOperator": {
|
|
10682
10480
|
"allOf": [
|
|
10683
10481
|
{
|
|
@@ -10697,13 +10495,6 @@
|
|
|
10697
10495
|
"default": [],
|
|
10698
10496
|
"readOnly": true
|
|
10699
10497
|
},
|
|
10700
|
-
"similarityThreshold": {
|
|
10701
|
-
"type": "number",
|
|
10702
|
-
"format": "double",
|
|
10703
|
-
"description": "Snapshot of the semantic cut-off applied for this run",
|
|
10704
|
-
"default": 0.75,
|
|
10705
|
-
"readOnly": true
|
|
10706
|
-
},
|
|
10707
10498
|
"actionLabelId": {
|
|
10708
10499
|
"type": "string",
|
|
10709
10500
|
"description": "Snapshot of the additive label action, or `\"None\"`",
|
|
@@ -10786,14 +10577,6 @@
|
|
|
10786
10577
|
"type": "string"
|
|
10787
10578
|
},
|
|
10788
10579
|
"description": "Ids of the matching messages, bounded to the same cap the apply pass uses"
|
|
10789
|
-
},
|
|
10790
|
-
"semanticUnavailable": {
|
|
10791
|
-
"type": "boolean",
|
|
10792
|
-
"description": "True when the semantic widen could not run because this deployment ships no vector pipeline (self-host without sqlite-vec / the embedding model). The matched set is then the literal matches only, or empty for an anchor-only predicate; literal search is unaffected. Absent on deployments where the widen ran."
|
|
10793
|
-
},
|
|
10794
|
-
"semanticIndexEmpty": {
|
|
10795
|
-
"type": "boolean",
|
|
10796
|
-
"description": "True when the widen ran but this account's semantic index held nothing to answer with — no vectors at all, or none yet for the anchor message. A zero count is then a fact about the index, which is still filling, rather than about the rule. Absent when the index answered."
|
|
10797
10580
|
}
|
|
10798
10581
|
},
|
|
10799
10582
|
"description": "Response body for POST /accounts/{accountId}/organize/preview — the messages the same matcher would apply the action to, without applying it. Bounded server-side."
|
|
@@ -10946,6 +10729,29 @@
|
|
|
10946
10729
|
],
|
|
10947
10730
|
"description": "Where an attachment is between being promised and being sendable.\n\nThere is no third state and no absence: a row exists from the moment room is\nclaimed, so the cap can be enforced against rows in one transaction rather\nthan against bytes that may or may not have landed yet."
|
|
10948
10731
|
},
|
|
10732
|
+
"RemitImap.OutboxMessageListResponse": {
|
|
10733
|
+
"type": "object",
|
|
10734
|
+
"required": [
|
|
10735
|
+
"items"
|
|
10736
|
+
],
|
|
10737
|
+
"properties": {
|
|
10738
|
+
"continuationToken": {
|
|
10739
|
+
"allOf": [
|
|
10740
|
+
{
|
|
10741
|
+
"$ref": "#/components/schemas/String800"
|
|
10742
|
+
}
|
|
10743
|
+
],
|
|
10744
|
+
"description": "Opaque, server-minted cursor: absent means the first (or last) page, present means resume from here. Echo it back unchanged to fetch the next page. Every listing endpoint that accepts it rejects a token it cannot decode with 400 ValidationError rather than silently restarting from the first page (#136, #172)."
|
|
10745
|
+
},
|
|
10746
|
+
"items": {
|
|
10747
|
+
"type": "array",
|
|
10748
|
+
"items": {
|
|
10749
|
+
"$ref": "#/components/schemas/RemitImap.OutboxMessageResponse"
|
|
10750
|
+
}
|
|
10751
|
+
}
|
|
10752
|
+
},
|
|
10753
|
+
"description": "A page of the current account's outbox messages."
|
|
10754
|
+
},
|
|
10949
10755
|
"RemitImap.OutboxMessageResponse": {
|
|
10950
10756
|
"type": "object",
|
|
10951
10757
|
"required": [
|
|
@@ -11149,7 +10955,9 @@
|
|
|
11149
10955
|
"RemitImap.QuarantineListResponse": {
|
|
11150
10956
|
"type": "object",
|
|
11151
10957
|
"required": [
|
|
11152
|
-
"entries"
|
|
10958
|
+
"entries",
|
|
10959
|
+
"warnings",
|
|
10960
|
+
"warningsTotal"
|
|
11153
10961
|
],
|
|
11154
10962
|
"properties": {
|
|
11155
10963
|
"entries": {
|
|
@@ -11158,9 +10966,21 @@
|
|
|
11158
10966
|
"$ref": "#/components/schemas/RemitImap.QuarantineResponse"
|
|
11159
10967
|
},
|
|
11160
10968
|
"description": "Quarantined messages, newest first."
|
|
10969
|
+
},
|
|
10970
|
+
"warnings": {
|
|
10971
|
+
"type": "array",
|
|
10972
|
+
"items": {
|
|
10973
|
+
"$ref": "#/components/schemas/RemitImap.SyncWarningResponse"
|
|
10974
|
+
},
|
|
10975
|
+
"description": "The 200 newest sync warnings that have failed at least BODY_SYNC_MAX_ATTEMPTS rounds, newest first. One failing server quirk writes a row per message, so the list is capped."
|
|
10976
|
+
},
|
|
10977
|
+
"warningsTotal": {
|
|
10978
|
+
"type": "integer",
|
|
10979
|
+
"format": "int32",
|
|
10980
|
+
"description": "Every sync warning at or past the attempt threshold, counting those beyond the cap on `warnings`."
|
|
11161
10981
|
}
|
|
11162
10982
|
},
|
|
11163
|
-
"description": "Everything quarantined for the current user, newest first. The list is small by design — a mailbox with a growing quarantine list is a bug being reported, not a page to paginate."
|
|
10983
|
+
"description": "Everything quarantined for the current user, newest first, beside the sync warnings that have failed enough rounds to surface. The quarantine list is small by design — a mailbox with a growing quarantine list is a bug being reported, not a page to paginate."
|
|
11164
10984
|
},
|
|
11165
10985
|
"RemitImap.QuarantineMimeNode": {
|
|
11166
10986
|
"type": "object",
|
|
@@ -11453,88 +11273,6 @@
|
|
|
11453
11273
|
},
|
|
11454
11274
|
"description": "Input for updating a mailbox. Rename (IMAP sync) is triggered only when `fullPath` is provided. The `muted` flag and the `displayNameOverride` override can be updated independently without triggering IMAP machinery; pass `null` to clear either. The canonical role a folder fills is appointed separately — see FolderRoleOperations.appointFolderRole (RFC 032 exclusive-folder-appointment)."
|
|
11455
11275
|
},
|
|
11456
|
-
"RemitImap.SemanticSearchChunkType": {
|
|
11457
|
-
"type": "string",
|
|
11458
|
-
"enum": [
|
|
11459
|
-
"sender",
|
|
11460
|
-
"recipient",
|
|
11461
|
-
"subject",
|
|
11462
|
-
"attachment",
|
|
11463
|
-
"body",
|
|
11464
|
-
"entities"
|
|
11465
|
-
],
|
|
11466
|
-
"description": "Allowed chunk types that may be the best match for a semantic-search hit"
|
|
11467
|
-
},
|
|
11468
|
-
"RemitImap.SemanticSearchResult": {
|
|
11469
|
-
"type": "object",
|
|
11470
|
-
"required": [
|
|
11471
|
-
"messageId",
|
|
11472
|
-
"threadId",
|
|
11473
|
-
"score",
|
|
11474
|
-
"matchedChunkType",
|
|
11475
|
-
"mailboxIds"
|
|
11476
|
-
],
|
|
11477
|
-
"properties": {
|
|
11478
|
-
"messageId": {
|
|
11479
|
-
"allOf": [
|
|
11480
|
-
{
|
|
11481
|
-
"$ref": "#/components/schemas/UUID"
|
|
11482
|
-
}
|
|
11483
|
-
],
|
|
11484
|
-
"description": "Matched message id"
|
|
11485
|
-
},
|
|
11486
|
-
"threadId": {
|
|
11487
|
-
"allOf": [
|
|
11488
|
-
{
|
|
11489
|
-
"$ref": "#/components/schemas/UUID"
|
|
11490
|
-
}
|
|
11491
|
-
],
|
|
11492
|
-
"description": "Thread id the matched message belongs to"
|
|
11493
|
-
},
|
|
11494
|
-
"score": {
|
|
11495
|
-
"type": "number",
|
|
11496
|
-
"format": "double",
|
|
11497
|
-
"description": "Cosine similarity (or backend-equivalent) of the best matching chunk for this message; higher is more relevant"
|
|
11498
|
-
},
|
|
11499
|
-
"matchedChunkType": {
|
|
11500
|
-
"allOf": [
|
|
11501
|
-
{
|
|
11502
|
-
"$ref": "#/components/schemas/RemitImap.SemanticSearchChunkType"
|
|
11503
|
-
}
|
|
11504
|
-
],
|
|
11505
|
-
"description": "Chunk type that produced the best match for this message"
|
|
11506
|
-
},
|
|
11507
|
-
"mailboxIds": {
|
|
11508
|
-
"type": "array",
|
|
11509
|
-
"items": {
|
|
11510
|
-
"$ref": "#/components/schemas/UUID"
|
|
11511
|
-
},
|
|
11512
|
-
"description": "All mailbox ids the matched message currently lives in"
|
|
11513
|
-
},
|
|
11514
|
-
"fromName": {
|
|
11515
|
-
"type": "string",
|
|
11516
|
-
"description": "Display name of the sender (From header). Present for messages indexed after display-field enrichment was deployed."
|
|
11517
|
-
},
|
|
11518
|
-
"subject": {
|
|
11519
|
-
"type": "string",
|
|
11520
|
-
"description": "Message subject. Present for messages indexed after display-field enrichment was deployed."
|
|
11521
|
-
},
|
|
11522
|
-
"sentDate": {
|
|
11523
|
-
"type": "integer",
|
|
11524
|
-
"format": "int64",
|
|
11525
|
-
"description": "Sent date as Unix epoch seconds. Present for messages indexed after display-field enrichment was deployed."
|
|
11526
|
-
},
|
|
11527
|
-
"category": {
|
|
11528
|
-
"allOf": [
|
|
11529
|
-
{
|
|
11530
|
-
"$ref": "#/components/schemas/RemitImap.MessageCategory"
|
|
11531
|
-
}
|
|
11532
|
-
],
|
|
11533
|
-
"description": "Header-derived category of the matched message. Present for messages indexed after category enrichment was deployed; older entries omit it."
|
|
11534
|
-
}
|
|
11535
|
-
},
|
|
11536
|
-
"description": "A single semantic-search hit. Display fields (fromName, subject, sentDate) are denormalized at index time and present for messages indexed after this feature was deployed. Older entries may omit them; clients should render a fallback when absent."
|
|
11537
|
-
},
|
|
11538
11276
|
"RemitImap.SenderTrust": {
|
|
11539
11277
|
"type": "string",
|
|
11540
11278
|
"enum": [
|
|
@@ -11653,6 +11391,100 @@
|
|
|
11653
11391
|
},
|
|
11654
11392
|
"description": "Sync trigger response"
|
|
11655
11393
|
},
|
|
11394
|
+
"RemitImap.SyncWarningResponse": {
|
|
11395
|
+
"type": "object",
|
|
11396
|
+
"required": [
|
|
11397
|
+
"syncWarningId",
|
|
11398
|
+
"accountConfigId",
|
|
11399
|
+
"accountId",
|
|
11400
|
+
"mailboxId",
|
|
11401
|
+
"uidValidity",
|
|
11402
|
+
"uid",
|
|
11403
|
+
"stage",
|
|
11404
|
+
"attempts",
|
|
11405
|
+
"createdAt"
|
|
11406
|
+
],
|
|
11407
|
+
"properties": {
|
|
11408
|
+
"syncWarningId": {
|
|
11409
|
+
"allOf": [
|
|
11410
|
+
{
|
|
11411
|
+
"$ref": "#/components/schemas/UUID"
|
|
11412
|
+
}
|
|
11413
|
+
],
|
|
11414
|
+
"description": "Deterministic v5 identity derived from accountId, mailboxId, uidValidity, uid and stage.",
|
|
11415
|
+
"readOnly": true
|
|
11416
|
+
},
|
|
11417
|
+
"accountConfigId": {
|
|
11418
|
+
"allOf": [
|
|
11419
|
+
{
|
|
11420
|
+
"$ref": "#/components/schemas/UUID"
|
|
11421
|
+
}
|
|
11422
|
+
],
|
|
11423
|
+
"description": "Owning account configuration — the user.",
|
|
11424
|
+
"readOnly": true
|
|
11425
|
+
},
|
|
11426
|
+
"accountId": {
|
|
11427
|
+
"allOf": [
|
|
11428
|
+
{
|
|
11429
|
+
"$ref": "#/components/schemas/UUID"
|
|
11430
|
+
}
|
|
11431
|
+
],
|
|
11432
|
+
"description": "Mail account the message arrived on.",
|
|
11433
|
+
"readOnly": true
|
|
11434
|
+
},
|
|
11435
|
+
"mailboxId": {
|
|
11436
|
+
"allOf": [
|
|
11437
|
+
{
|
|
11438
|
+
"$ref": "#/components/schemas/UUID"
|
|
11439
|
+
}
|
|
11440
|
+
],
|
|
11441
|
+
"description": "Mailbox the message arrived in.",
|
|
11442
|
+
"readOnly": true
|
|
11443
|
+
},
|
|
11444
|
+
"uidValidity": {
|
|
11445
|
+
"type": "integer",
|
|
11446
|
+
"format": "int64",
|
|
11447
|
+
"description": "UIDVALIDITY of the mailbox when the message failed. Only uidValidity + uid names a message forever (RFC 9051 2.3.1.1).",
|
|
11448
|
+
"readOnly": true
|
|
11449
|
+
},
|
|
11450
|
+
"uid": {
|
|
11451
|
+
"type": "integer",
|
|
11452
|
+
"format": "int64",
|
|
11453
|
+
"description": "The IMAP uid that failed.",
|
|
11454
|
+
"readOnly": true
|
|
11455
|
+
},
|
|
11456
|
+
"stage": {
|
|
11457
|
+
"allOf": [
|
|
11458
|
+
{
|
|
11459
|
+
"$ref": "#/components/schemas/RemitImap.SyncWarningStage"
|
|
11460
|
+
}
|
|
11461
|
+
],
|
|
11462
|
+
"description": "The sync step the message failed at.",
|
|
11463
|
+
"readOnly": true
|
|
11464
|
+
},
|
|
11465
|
+
"attempts": {
|
|
11466
|
+
"type": "integer",
|
|
11467
|
+
"format": "int32",
|
|
11468
|
+
"description": "Rounds that failed on this message so far.",
|
|
11469
|
+
"readOnly": true
|
|
11470
|
+
},
|
|
11471
|
+
"createdAt": {
|
|
11472
|
+
"type": "integer",
|
|
11473
|
+
"format": "int64",
|
|
11474
|
+
"description": "Epoch millis of the first failure.",
|
|
11475
|
+
"readOnly": true
|
|
11476
|
+
}
|
|
11477
|
+
},
|
|
11478
|
+
"description": "One sync warning as the settings surface sees it."
|
|
11479
|
+
},
|
|
11480
|
+
"RemitImap.SyncWarningStage": {
|
|
11481
|
+
"type": "string",
|
|
11482
|
+
"enum": [
|
|
11483
|
+
"Header",
|
|
11484
|
+
"Body"
|
|
11485
|
+
],
|
|
11486
|
+
"description": "The sync step a message failed at."
|
|
11487
|
+
},
|
|
11656
11488
|
"RemitImap.SystemUpdateCheck": {
|
|
11657
11489
|
"type": "object",
|
|
11658
11490
|
"required": [
|
|
@@ -11941,6 +11773,29 @@
|
|
|
11941
11773
|
},
|
|
11942
11774
|
"description": "Connection test result"
|
|
11943
11775
|
},
|
|
11776
|
+
"RemitImap.ThreadMessageListResponse": {
|
|
11777
|
+
"type": "object",
|
|
11778
|
+
"required": [
|
|
11779
|
+
"items"
|
|
11780
|
+
],
|
|
11781
|
+
"properties": {
|
|
11782
|
+
"continuationToken": {
|
|
11783
|
+
"allOf": [
|
|
11784
|
+
{
|
|
11785
|
+
"$ref": "#/components/schemas/String800"
|
|
11786
|
+
}
|
|
11787
|
+
],
|
|
11788
|
+
"description": "Opaque, server-minted cursor: absent means the first (or last) page, present means resume from here. Echo it back unchanged to fetch the next page. Every listing endpoint that accepts it rejects a token it cannot decode with 400 ValidationError rather than silently restarting from the first page (#136, #172)."
|
|
11789
|
+
},
|
|
11790
|
+
"items": {
|
|
11791
|
+
"type": "array",
|
|
11792
|
+
"items": {
|
|
11793
|
+
"$ref": "#/components/schemas/RemitImap.ThreadMessageResponse"
|
|
11794
|
+
}
|
|
11795
|
+
}
|
|
11796
|
+
},
|
|
11797
|
+
"description": "A page of thread messages."
|
|
11798
|
+
},
|
|
11944
11799
|
"RemitImap.ThreadMessageResponse": {
|
|
11945
11800
|
"type": "object",
|
|
11946
11801
|
"required": [
|
|
@@ -12570,7 +12425,7 @@
|
|
|
12570
12425
|
"$ref": "#/components/schemas/RemitImap.FilterScope"
|
|
12571
12426
|
}
|
|
12572
12427
|
],
|
|
12573
|
-
"description": "Standing (permanent) or Temporary (expires). Governs whether expiresAt/ttl are present (RFC 034 Decision 1). Mutable on update (reader #266): switching scope re-derives ttl and re-evaluates state from expiresAt, and bumps ruleChangedAt so a lapsed filter's back-application can be offered again.
|
|
12428
|
+
"description": "Standing (permanent) or Temporary (expires). Governs whether expiresAt/ttl are present (RFC 034 Decision 1). Mutable on update (reader #266): switching scope re-derives ttl and re-evaluates state from expiresAt, and bumps ruleChangedAt so a lapsed filter's back-application can be offered again."
|
|
12574
12429
|
},
|
|
12575
12430
|
"expiresAt": {
|
|
12576
12431
|
"type": "string",
|
|
@@ -12591,7 +12446,7 @@
|
|
|
12591
12446
|
"$ref": "#/components/schemas/RemitImap.FilterMatchOperator"
|
|
12592
12447
|
}
|
|
12593
12448
|
],
|
|
12594
|
-
"description": "How literalClauses combine.
|
|
12449
|
+
"description": "How literalClauses combine.",
|
|
12595
12450
|
"default": "And"
|
|
12596
12451
|
},
|
|
12597
12452
|
"literalClauses": {
|
|
@@ -12599,8 +12454,8 @@
|
|
|
12599
12454
|
"items": {
|
|
12600
12455
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
12601
12456
|
},
|
|
12602
|
-
"
|
|
12603
|
-
"
|
|
12457
|
+
"minItems": 1,
|
|
12458
|
+
"description": "Literal from/subject/has-words predicate clauses (RFC 031). A filter carries at least one."
|
|
12604
12459
|
},
|
|
12605
12460
|
"actionLabelId": {
|
|
12606
12461
|
"type": "string",
|
|
@@ -12613,7 +12468,7 @@
|
|
|
12613
12468
|
"default": "None"
|
|
12614
12469
|
}
|
|
12615
12470
|
},
|
|
12616
|
-
"description": "Input for updating a filter (RFC 034, reader #266). The name, predicate,\naction, scope, and expiresAt are all updatable; `ttl` is always\nserver-derived from `scope`/`expiresAt`, never client-supplied, and\n`disabledReason`/`
|
|
12471
|
+
"description": "Input for updating a filter (RFC 034, reader #266). The name, predicate,\naction, scope, and expiresAt are all updatable; `ttl` is always\nserver-derived from `scope`/`expiresAt`, never client-supplied, and\n`disabledReason`/`ruleChangedAt`/`actionChangedAt`/`filterId` are\nserver-derived too. `state` takes `Active` or `Disabled`: the user turns a\nfilter off or back on, and turning it on clears `disabledReason`. `Expired`\nis refused; the expiry is set through `scope`/`expiresAt`. A patch touching the predicate, the action, `scope`, or\n`expiresAt` bumps `ruleChangedAt`; a name-only rename never does (RFC 034\nDecision 3.2, reader #266). Only a patch touching the predicate or the\naction bumps `actionChangedAt`, the narrower signal exclusive-move\nprecedence reads (reader #384) — a scope/expiresAt-only edit leaves it\nuntouched."
|
|
12617
12472
|
},
|
|
12618
12473
|
"RemitImap.UpdateFlagsInput": {
|
|
12619
12474
|
"type": "object",
|