@remit/api-openapi-spec 0.0.77 → 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 +225 -390
- 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
|
}
|
|
@@ -5248,26 +5210,7 @@
|
|
|
5248
5210
|
"content": {
|
|
5249
5211
|
"application/json": {
|
|
5250
5212
|
"schema": {
|
|
5251
|
-
"
|
|
5252
|
-
"required": [
|
|
5253
|
-
"items"
|
|
5254
|
-
],
|
|
5255
|
-
"properties": {
|
|
5256
|
-
"continuationToken": {
|
|
5257
|
-
"allOf": [
|
|
5258
|
-
{
|
|
5259
|
-
"$ref": "#/components/schemas/String800"
|
|
5260
|
-
}
|
|
5261
|
-
],
|
|
5262
|
-
"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)."
|
|
5263
|
-
},
|
|
5264
|
-
"items": {
|
|
5265
|
-
"type": "array",
|
|
5266
|
-
"items": {
|
|
5267
|
-
"$ref": "#/components/schemas/RemitImap.OutboxMessageResponse"
|
|
5268
|
-
}
|
|
5269
|
-
}
|
|
5270
|
-
}
|
|
5213
|
+
"$ref": "#/components/schemas/RemitImap.OutboxMessageListResponse"
|
|
5271
5214
|
}
|
|
5272
5215
|
}
|
|
5273
5216
|
}
|
|
@@ -5716,139 +5659,6 @@
|
|
|
5716
5659
|
}
|
|
5717
5660
|
}
|
|
5718
5661
|
},
|
|
5719
|
-
"/search/semantic": {
|
|
5720
|
-
"get": {
|
|
5721
|
-
"operationId": "SemanticSearchOperations_semanticSearch",
|
|
5722
|
-
"description": "Run a semantic vector search across the caller's indexed messages.",
|
|
5723
|
-
"parameters": [
|
|
5724
|
-
{
|
|
5725
|
-
"name": "query",
|
|
5726
|
-
"in": "query",
|
|
5727
|
-
"required": true,
|
|
5728
|
-
"description": "Free-form natural-language query",
|
|
5729
|
-
"schema": {
|
|
5730
|
-
"type": "string"
|
|
5731
|
-
}
|
|
5732
|
-
},
|
|
5733
|
-
{
|
|
5734
|
-
"name": "mailboxId",
|
|
5735
|
-
"in": "query",
|
|
5736
|
-
"required": false,
|
|
5737
|
-
"description": "Restrict results to a single mailbox",
|
|
5738
|
-
"schema": {
|
|
5739
|
-
"$ref": "#/components/schemas/UUID"
|
|
5740
|
-
}
|
|
5741
|
-
},
|
|
5742
|
-
{
|
|
5743
|
-
"name": "sentDateFrom",
|
|
5744
|
-
"in": "query",
|
|
5745
|
-
"required": false,
|
|
5746
|
-
"description": "Lower bound on sentDate (epoch seconds, inclusive)",
|
|
5747
|
-
"schema": {
|
|
5748
|
-
"type": "integer",
|
|
5749
|
-
"format": "int64"
|
|
5750
|
-
}
|
|
5751
|
-
},
|
|
5752
|
-
{
|
|
5753
|
-
"name": "sentDateTo",
|
|
5754
|
-
"in": "query",
|
|
5755
|
-
"required": false,
|
|
5756
|
-
"description": "Upper bound on sentDate (epoch seconds, inclusive)",
|
|
5757
|
-
"schema": {
|
|
5758
|
-
"type": "integer",
|
|
5759
|
-
"format": "int64"
|
|
5760
|
-
}
|
|
5761
|
-
},
|
|
5762
|
-
{
|
|
5763
|
-
"name": "hasAttachment",
|
|
5764
|
-
"in": "query",
|
|
5765
|
-
"required": false,
|
|
5766
|
-
"description": "Restrict to messages with or without attachments",
|
|
5767
|
-
"schema": {
|
|
5768
|
-
"type": "boolean"
|
|
5769
|
-
}
|
|
5770
|
-
},
|
|
5771
|
-
{
|
|
5772
|
-
"name": "hasStars",
|
|
5773
|
-
"in": "query",
|
|
5774
|
-
"required": false,
|
|
5775
|
-
"description": "Restrict to starred or unstarred messages",
|
|
5776
|
-
"schema": {
|
|
5777
|
-
"type": "boolean"
|
|
5778
|
-
}
|
|
5779
|
-
},
|
|
5780
|
-
{
|
|
5781
|
-
"name": "isRead",
|
|
5782
|
-
"in": "query",
|
|
5783
|
-
"required": false,
|
|
5784
|
-
"description": "Restrict to read or unread messages",
|
|
5785
|
-
"schema": {
|
|
5786
|
-
"type": "boolean"
|
|
5787
|
-
}
|
|
5788
|
-
},
|
|
5789
|
-
{
|
|
5790
|
-
"name": "category",
|
|
5791
|
-
"in": "query",
|
|
5792
|
-
"required": false,
|
|
5793
|
-
"description": "Restrict results to a single header-derived category",
|
|
5794
|
-
"schema": {
|
|
5795
|
-
"$ref": "#/components/schemas/RemitImap.MessageCategory"
|
|
5796
|
-
}
|
|
5797
|
-
},
|
|
5798
|
-
{
|
|
5799
|
-
"name": "limit",
|
|
5800
|
-
"in": "query",
|
|
5801
|
-
"required": false,
|
|
5802
|
-
"description": "Maximum number of results to return",
|
|
5803
|
-
"schema": {
|
|
5804
|
-
"type": "integer",
|
|
5805
|
-
"format": "int32"
|
|
5806
|
-
}
|
|
5807
|
-
}
|
|
5808
|
-
],
|
|
5809
|
-
"responses": {
|
|
5810
|
-
"200": {
|
|
5811
|
-
"description": "The request has succeeded.",
|
|
5812
|
-
"content": {
|
|
5813
|
-
"application/json": {
|
|
5814
|
-
"schema": {
|
|
5815
|
-
"type": "object",
|
|
5816
|
-
"properties": {
|
|
5817
|
-
"items": {
|
|
5818
|
-
"type": "array",
|
|
5819
|
-
"items": {
|
|
5820
|
-
"$ref": "#/components/schemas/RemitImap.SemanticSearchResult"
|
|
5821
|
-
}
|
|
5822
|
-
}
|
|
5823
|
-
},
|
|
5824
|
-
"required": [
|
|
5825
|
-
"items"
|
|
5826
|
-
]
|
|
5827
|
-
}
|
|
5828
|
-
}
|
|
5829
|
-
}
|
|
5830
|
-
},
|
|
5831
|
-
"401": {
|
|
5832
|
-
"description": "The request carried no usable credential. `code` is `unauthorized`.",
|
|
5833
|
-
"content": {
|
|
5834
|
-
"application/json": {
|
|
5835
|
-
"schema": {
|
|
5836
|
-
"$ref": "#/components/schemas/ApiError"
|
|
5837
|
-
}
|
|
5838
|
-
}
|
|
5839
|
-
}
|
|
5840
|
-
}
|
|
5841
|
-
},
|
|
5842
|
-
"x-amazon-apigateway-integration": {
|
|
5843
|
-
"type": "aws_proxy",
|
|
5844
|
-
"httpMethod": "POST",
|
|
5845
|
-
"passthroughBehavior": "when_no_match",
|
|
5846
|
-
"uri": {
|
|
5847
|
-
"Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:{{HandlerFunctionName}}/invocations"
|
|
5848
|
-
}
|
|
5849
|
-
}
|
|
5850
|
-
}
|
|
5851
|
-
},
|
|
5852
5662
|
"/system/update": {
|
|
5853
5663
|
"get": {
|
|
5854
5664
|
"operationId": "SystemOperations_getSystemUpdate",
|
|
@@ -6192,26 +6002,7 @@
|
|
|
6192
6002
|
"content": {
|
|
6193
6003
|
"application/json": {
|
|
6194
6004
|
"schema": {
|
|
6195
|
-
"
|
|
6196
|
-
"required": [
|
|
6197
|
-
"items"
|
|
6198
|
-
],
|
|
6199
|
-
"properties": {
|
|
6200
|
-
"continuationToken": {
|
|
6201
|
-
"allOf": [
|
|
6202
|
-
{
|
|
6203
|
-
"$ref": "#/components/schemas/String800"
|
|
6204
|
-
}
|
|
6205
|
-
],
|
|
6206
|
-
"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)."
|
|
6207
|
-
},
|
|
6208
|
-
"items": {
|
|
6209
|
-
"type": "array",
|
|
6210
|
-
"items": {
|
|
6211
|
-
"$ref": "#/components/schemas/RemitImap.ThreadMessageResponse"
|
|
6212
|
-
}
|
|
6213
|
-
}
|
|
6214
|
-
}
|
|
6005
|
+
"$ref": "#/components/schemas/RemitImap.ThreadMessageListResponse"
|
|
6215
6006
|
}
|
|
6216
6007
|
}
|
|
6217
6008
|
}
|
|
@@ -7188,6 +6979,7 @@
|
|
|
7188
6979
|
"type": "object",
|
|
7189
6980
|
"required": [
|
|
7190
6981
|
"bodyPartId",
|
|
6982
|
+
"partPath",
|
|
7191
6983
|
"mediaType",
|
|
7192
6984
|
"mediaSubtype",
|
|
7193
6985
|
"sizeOctets",
|
|
@@ -7204,6 +6996,12 @@
|
|
|
7204
6996
|
"description": "Primary identifier",
|
|
7205
6997
|
"readOnly": true
|
|
7206
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
|
+
},
|
|
7207
7005
|
"mediaType": {
|
|
7208
7006
|
"allOf": [
|
|
7209
7007
|
{
|
|
@@ -8262,7 +8060,7 @@
|
|
|
8262
8060
|
"required": [
|
|
8263
8061
|
"accountConfig",
|
|
8264
8062
|
"accounts",
|
|
8265
|
-
"
|
|
8063
|
+
"buildCommit"
|
|
8266
8064
|
],
|
|
8267
8065
|
"properties": {
|
|
8268
8066
|
"accountConfig": {
|
|
@@ -8280,6 +8078,10 @@
|
|
|
8280
8078
|
},
|
|
8281
8079
|
"description": "Associated email accounts"
|
|
8282
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
|
+
},
|
|
8283
8085
|
"pendingImport": {
|
|
8284
8086
|
"allOf": [
|
|
8285
8087
|
{
|
|
@@ -8287,10 +8089,6 @@
|
|
|
8287
8089
|
}
|
|
8288
8090
|
],
|
|
8289
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."
|
|
8290
|
-
},
|
|
8291
|
-
"semanticSearchEnabled": {
|
|
8292
|
-
"type": "boolean",
|
|
8293
|
-
"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)."
|
|
8294
8092
|
}
|
|
8295
8093
|
},
|
|
8296
8094
|
"description": "Full configuration description including accounts"
|
|
@@ -8751,7 +8549,7 @@
|
|
|
8751
8549
|
"$ref": "#/components/schemas/RemitImap.FilterScope"
|
|
8752
8550
|
}
|
|
8753
8551
|
],
|
|
8754
|
-
"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."
|
|
8755
8553
|
},
|
|
8756
8554
|
"expiresAt": {
|
|
8757
8555
|
"type": "string",
|
|
@@ -8763,7 +8561,7 @@
|
|
|
8763
8561
|
"$ref": "#/components/schemas/RemitImap.FilterMatchOperator"
|
|
8764
8562
|
}
|
|
8765
8563
|
],
|
|
8766
|
-
"description": "How literalClauses combine.
|
|
8564
|
+
"description": "How literalClauses combine.",
|
|
8767
8565
|
"default": "And"
|
|
8768
8566
|
},
|
|
8769
8567
|
"literalClauses": {
|
|
@@ -8771,8 +8569,8 @@
|
|
|
8771
8569
|
"items": {
|
|
8772
8570
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
8773
8571
|
},
|
|
8774
|
-
"
|
|
8775
|
-
"
|
|
8572
|
+
"minItems": 1,
|
|
8573
|
+
"description": "Literal from/subject/has-words predicate clauses (RFC 031). A filter carries at least one."
|
|
8776
8574
|
},
|
|
8777
8575
|
"actionLabelId": {
|
|
8778
8576
|
"type": "string",
|
|
@@ -8783,17 +8581,9 @@
|
|
|
8783
8581
|
"type": "string",
|
|
8784
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.",
|
|
8785
8583
|
"default": "None"
|
|
8786
|
-
},
|
|
8787
|
-
"anchorMessageId": {
|
|
8788
|
-
"allOf": [
|
|
8789
|
-
{
|
|
8790
|
-
"$ref": "#/components/schemas/UUID"
|
|
8791
|
-
}
|
|
8792
|
-
],
|
|
8793
|
-
"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."
|
|
8794
8584
|
}
|
|
8795
8585
|
},
|
|
8796
|
-
"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."
|
|
8797
8587
|
},
|
|
8798
8588
|
"RemitImap.CreateFilterResponse": {
|
|
8799
8589
|
"type": "object",
|
|
@@ -8804,7 +8594,6 @@
|
|
|
8804
8594
|
"scope",
|
|
8805
8595
|
"state",
|
|
8806
8596
|
"disabledReason",
|
|
8807
|
-
"hasAnchor",
|
|
8808
8597
|
"ruleChangedAt",
|
|
8809
8598
|
"actionChangedAt",
|
|
8810
8599
|
"matchOperator",
|
|
@@ -8848,7 +8637,7 @@
|
|
|
8848
8637
|
"$ref": "#/components/schemas/RemitImap.FilterScope"
|
|
8849
8638
|
}
|
|
8850
8639
|
],
|
|
8851
|
-
"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."
|
|
8852
8641
|
},
|
|
8853
8642
|
"expiresAt": {
|
|
8854
8643
|
"type": "string",
|
|
@@ -8873,12 +8662,6 @@
|
|
|
8873
8662
|
"default": "None",
|
|
8874
8663
|
"readOnly": true
|
|
8875
8664
|
},
|
|
8876
|
-
"hasAnchor": {
|
|
8877
|
-
"type": "boolean",
|
|
8878
|
-
"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.",
|
|
8879
|
-
"default": false,
|
|
8880
|
-
"readOnly": true
|
|
8881
|
-
},
|
|
8882
8665
|
"ruleChangedAt": {
|
|
8883
8666
|
"type": "integer",
|
|
8884
8667
|
"format": "int64",
|
|
@@ -8888,7 +8671,7 @@
|
|
|
8888
8671
|
"actionChangedAt": {
|
|
8889
8672
|
"type": "integer",
|
|
8890
8673
|
"format": "int64",
|
|
8891
|
-
"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.",
|
|
8892
8675
|
"readOnly": true
|
|
8893
8676
|
},
|
|
8894
8677
|
"matchOperator": {
|
|
@@ -8897,7 +8680,7 @@
|
|
|
8897
8680
|
"$ref": "#/components/schemas/RemitImap.FilterMatchOperator"
|
|
8898
8681
|
}
|
|
8899
8682
|
],
|
|
8900
|
-
"description": "How literalClauses combine.
|
|
8683
|
+
"description": "How literalClauses combine.",
|
|
8901
8684
|
"default": "And"
|
|
8902
8685
|
},
|
|
8903
8686
|
"literalClauses": {
|
|
@@ -8905,8 +8688,8 @@
|
|
|
8905
8688
|
"items": {
|
|
8906
8689
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
8907
8690
|
},
|
|
8908
|
-
"
|
|
8909
|
-
"
|
|
8691
|
+
"minItems": 1,
|
|
8692
|
+
"description": "Literal from/subject/has-words predicate clauses (RFC 031). A filter carries at least one."
|
|
8910
8693
|
},
|
|
8911
8694
|
"actionLabelId": {
|
|
8912
8695
|
"type": "string",
|
|
@@ -9417,7 +9200,7 @@
|
|
|
9417
9200
|
"ListId",
|
|
9418
9201
|
"FromDomain"
|
|
9419
9202
|
],
|
|
9420
|
-
"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."
|
|
9421
9204
|
},
|
|
9422
9205
|
"RemitImap.FilterDisabledReason": {
|
|
9423
9206
|
"type": "string",
|
|
@@ -9447,7 +9230,6 @@
|
|
|
9447
9230
|
"scope",
|
|
9448
9231
|
"state",
|
|
9449
9232
|
"disabledReason",
|
|
9450
|
-
"hasAnchor",
|
|
9451
9233
|
"ruleChangedAt",
|
|
9452
9234
|
"actionChangedAt",
|
|
9453
9235
|
"matchOperator",
|
|
@@ -9490,7 +9272,7 @@
|
|
|
9490
9272
|
"$ref": "#/components/schemas/RemitImap.FilterScope"
|
|
9491
9273
|
}
|
|
9492
9274
|
],
|
|
9493
|
-
"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."
|
|
9494
9276
|
},
|
|
9495
9277
|
"expiresAt": {
|
|
9496
9278
|
"type": "string",
|
|
@@ -9515,12 +9297,6 @@
|
|
|
9515
9297
|
"default": "None",
|
|
9516
9298
|
"readOnly": true
|
|
9517
9299
|
},
|
|
9518
|
-
"hasAnchor": {
|
|
9519
|
-
"type": "boolean",
|
|
9520
|
-
"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.",
|
|
9521
|
-
"default": false,
|
|
9522
|
-
"readOnly": true
|
|
9523
|
-
},
|
|
9524
9300
|
"ruleChangedAt": {
|
|
9525
9301
|
"type": "integer",
|
|
9526
9302
|
"format": "int64",
|
|
@@ -9530,7 +9306,7 @@
|
|
|
9530
9306
|
"actionChangedAt": {
|
|
9531
9307
|
"type": "integer",
|
|
9532
9308
|
"format": "int64",
|
|
9533
|
-
"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.",
|
|
9534
9310
|
"readOnly": true
|
|
9535
9311
|
},
|
|
9536
9312
|
"matchOperator": {
|
|
@@ -9539,7 +9315,7 @@
|
|
|
9539
9315
|
"$ref": "#/components/schemas/RemitImap.FilterMatchOperator"
|
|
9540
9316
|
}
|
|
9541
9317
|
],
|
|
9542
|
-
"description": "How literalClauses combine.
|
|
9318
|
+
"description": "How literalClauses combine.",
|
|
9543
9319
|
"default": "And"
|
|
9544
9320
|
},
|
|
9545
9321
|
"literalClauses": {
|
|
@@ -9547,8 +9323,8 @@
|
|
|
9547
9323
|
"items": {
|
|
9548
9324
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
9549
9325
|
},
|
|
9550
|
-
"
|
|
9551
|
-
"
|
|
9326
|
+
"minItems": 1,
|
|
9327
|
+
"description": "Literal from/subject/has-words predicate clauses (RFC 031). A filter carries at least one."
|
|
9552
9328
|
},
|
|
9553
9329
|
"actionLabelId": {
|
|
9554
9330
|
"type": "string",
|
|
@@ -9823,6 +9599,29 @@
|
|
|
9823
9599
|
},
|
|
9824
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."
|
|
9825
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
|
+
},
|
|
9826
9625
|
"RemitImap.MailboxResponse": {
|
|
9827
9626
|
"type": "object",
|
|
9828
9627
|
"required": [
|
|
@@ -10285,11 +10084,6 @@
|
|
|
10285
10084
|
"description": "Server receipt timestamp (INTERNALDATE)",
|
|
10286
10085
|
"readOnly": true
|
|
10287
10086
|
},
|
|
10288
|
-
"messageIdHeader": {
|
|
10289
|
-
"type": "string",
|
|
10290
|
-
"description": "Message-ID header value for quick reference",
|
|
10291
|
-
"readOnly": true
|
|
10292
|
-
},
|
|
10293
10087
|
"status": {
|
|
10294
10088
|
"allOf": [
|
|
10295
10089
|
{
|
|
@@ -10329,6 +10123,11 @@
|
|
|
10329
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.",
|
|
10330
10124
|
"readOnly": true
|
|
10331
10125
|
},
|
|
10126
|
+
"messageIdHeader": {
|
|
10127
|
+
"type": "string",
|
|
10128
|
+
"description": "Message-ID header value for quick reference",
|
|
10129
|
+
"readOnly": true
|
|
10130
|
+
},
|
|
10332
10131
|
"autoMoved": {
|
|
10333
10132
|
"allOf": [
|
|
10334
10133
|
{
|
|
@@ -10586,15 +10385,7 @@
|
|
|
10586
10385
|
"$ref": "#/components/schemas/UUID"
|
|
10587
10386
|
}
|
|
10588
10387
|
],
|
|
10589
|
-
"description": "Back-apply this standing filter instead of the predicate in this body. The server reads the filter's persisted predicate
|
|
10590
|
-
},
|
|
10591
|
-
"anchorMessageId": {
|
|
10592
|
-
"allOf": [
|
|
10593
|
-
{
|
|
10594
|
-
"$ref": "#/components/schemas/UUID"
|
|
10595
|
-
}
|
|
10596
|
-
],
|
|
10597
|
-
"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."
|
|
10598
10389
|
},
|
|
10599
10390
|
"matchOperator": {
|
|
10600
10391
|
"allOf": [
|
|
@@ -10610,14 +10401,9 @@
|
|
|
10610
10401
|
"items": {
|
|
10611
10402
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
10612
10403
|
},
|
|
10613
|
-
"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.",
|
|
10614
10405
|
"default": []
|
|
10615
10406
|
},
|
|
10616
|
-
"similarityThreshold": {
|
|
10617
|
-
"type": "number",
|
|
10618
|
-
"format": "double",
|
|
10619
|
-
"description": "Cosine cut-off for the semantic match. Absent uses the server default (the same threshold the index-time filter pipeline applies)."
|
|
10620
|
-
},
|
|
10621
10407
|
"actionLabelId": {
|
|
10622
10408
|
"type": "string",
|
|
10623
10409
|
"description": "Label applied to every matching message — additive action (RFC 034 Decision 3.1). The `\"None\"` sentinel means no label action.",
|
|
@@ -10629,7 +10415,7 @@
|
|
|
10629
10415
|
"default": "None"
|
|
10630
10416
|
}
|
|
10631
10417
|
},
|
|
10632
|
-
"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."
|
|
10633
10419
|
},
|
|
10634
10420
|
"RemitImap.OrganizeJobResponse": {
|
|
10635
10421
|
"type": "object",
|
|
@@ -10639,10 +10425,8 @@
|
|
|
10639
10425
|
"userId",
|
|
10640
10426
|
"state",
|
|
10641
10427
|
"filterId",
|
|
10642
|
-
"anchorMessageId",
|
|
10643
10428
|
"matchOperator",
|
|
10644
10429
|
"literalClauses",
|
|
10645
|
-
"similarityThreshold",
|
|
10646
10430
|
"actionLabelId",
|
|
10647
10431
|
"actionMailboxId",
|
|
10648
10432
|
"matchedCount",
|
|
@@ -10692,12 +10476,6 @@
|
|
|
10692
10476
|
"default": "None",
|
|
10693
10477
|
"readOnly": true
|
|
10694
10478
|
},
|
|
10695
|
-
"anchorMessageId": {
|
|
10696
|
-
"type": "string",
|
|
10697
|
-
"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).",
|
|
10698
|
-
"default": "None",
|
|
10699
|
-
"readOnly": true
|
|
10700
|
-
},
|
|
10701
10479
|
"matchOperator": {
|
|
10702
10480
|
"allOf": [
|
|
10703
10481
|
{
|
|
@@ -10717,13 +10495,6 @@
|
|
|
10717
10495
|
"default": [],
|
|
10718
10496
|
"readOnly": true
|
|
10719
10497
|
},
|
|
10720
|
-
"similarityThreshold": {
|
|
10721
|
-
"type": "number",
|
|
10722
|
-
"format": "double",
|
|
10723
|
-
"description": "Snapshot of the semantic cut-off applied for this run",
|
|
10724
|
-
"default": 0.75,
|
|
10725
|
-
"readOnly": true
|
|
10726
|
-
},
|
|
10727
10498
|
"actionLabelId": {
|
|
10728
10499
|
"type": "string",
|
|
10729
10500
|
"description": "Snapshot of the additive label action, or `\"None\"`",
|
|
@@ -10806,14 +10577,6 @@
|
|
|
10806
10577
|
"type": "string"
|
|
10807
10578
|
},
|
|
10808
10579
|
"description": "Ids of the matching messages, bounded to the same cap the apply pass uses"
|
|
10809
|
-
},
|
|
10810
|
-
"semanticUnavailable": {
|
|
10811
|
-
"type": "boolean",
|
|
10812
|
-
"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."
|
|
10813
|
-
},
|
|
10814
|
-
"semanticIndexEmpty": {
|
|
10815
|
-
"type": "boolean",
|
|
10816
|
-
"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."
|
|
10817
10580
|
}
|
|
10818
10581
|
},
|
|
10819
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."
|
|
@@ -10966,6 +10729,29 @@
|
|
|
10966
10729
|
],
|
|
10967
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."
|
|
10968
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
|
+
},
|
|
10969
10755
|
"RemitImap.OutboxMessageResponse": {
|
|
10970
10756
|
"type": "object",
|
|
10971
10757
|
"required": [
|
|
@@ -11169,7 +10955,9 @@
|
|
|
11169
10955
|
"RemitImap.QuarantineListResponse": {
|
|
11170
10956
|
"type": "object",
|
|
11171
10957
|
"required": [
|
|
11172
|
-
"entries"
|
|
10958
|
+
"entries",
|
|
10959
|
+
"warnings",
|
|
10960
|
+
"warningsTotal"
|
|
11173
10961
|
],
|
|
11174
10962
|
"properties": {
|
|
11175
10963
|
"entries": {
|
|
@@ -11178,9 +10966,21 @@
|
|
|
11178
10966
|
"$ref": "#/components/schemas/RemitImap.QuarantineResponse"
|
|
11179
10967
|
},
|
|
11180
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`."
|
|
11181
10981
|
}
|
|
11182
10982
|
},
|
|
11183
|
-
"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."
|
|
11184
10984
|
},
|
|
11185
10985
|
"RemitImap.QuarantineMimeNode": {
|
|
11186
10986
|
"type": "object",
|
|
@@ -11473,88 +11273,6 @@
|
|
|
11473
11273
|
},
|
|
11474
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)."
|
|
11475
11275
|
},
|
|
11476
|
-
"RemitImap.SemanticSearchChunkType": {
|
|
11477
|
-
"type": "string",
|
|
11478
|
-
"enum": [
|
|
11479
|
-
"sender",
|
|
11480
|
-
"recipient",
|
|
11481
|
-
"subject",
|
|
11482
|
-
"attachment",
|
|
11483
|
-
"body",
|
|
11484
|
-
"entities"
|
|
11485
|
-
],
|
|
11486
|
-
"description": "Allowed chunk types that may be the best match for a semantic-search hit"
|
|
11487
|
-
},
|
|
11488
|
-
"RemitImap.SemanticSearchResult": {
|
|
11489
|
-
"type": "object",
|
|
11490
|
-
"required": [
|
|
11491
|
-
"messageId",
|
|
11492
|
-
"threadId",
|
|
11493
|
-
"score",
|
|
11494
|
-
"matchedChunkType",
|
|
11495
|
-
"mailboxIds"
|
|
11496
|
-
],
|
|
11497
|
-
"properties": {
|
|
11498
|
-
"messageId": {
|
|
11499
|
-
"allOf": [
|
|
11500
|
-
{
|
|
11501
|
-
"$ref": "#/components/schemas/UUID"
|
|
11502
|
-
}
|
|
11503
|
-
],
|
|
11504
|
-
"description": "Matched message id"
|
|
11505
|
-
},
|
|
11506
|
-
"threadId": {
|
|
11507
|
-
"allOf": [
|
|
11508
|
-
{
|
|
11509
|
-
"$ref": "#/components/schemas/UUID"
|
|
11510
|
-
}
|
|
11511
|
-
],
|
|
11512
|
-
"description": "Thread id the matched message belongs to"
|
|
11513
|
-
},
|
|
11514
|
-
"score": {
|
|
11515
|
-
"type": "number",
|
|
11516
|
-
"format": "double",
|
|
11517
|
-
"description": "Cosine similarity (or backend-equivalent) of the best matching chunk for this message; higher is more relevant"
|
|
11518
|
-
},
|
|
11519
|
-
"matchedChunkType": {
|
|
11520
|
-
"allOf": [
|
|
11521
|
-
{
|
|
11522
|
-
"$ref": "#/components/schemas/RemitImap.SemanticSearchChunkType"
|
|
11523
|
-
}
|
|
11524
|
-
],
|
|
11525
|
-
"description": "Chunk type that produced the best match for this message"
|
|
11526
|
-
},
|
|
11527
|
-
"mailboxIds": {
|
|
11528
|
-
"type": "array",
|
|
11529
|
-
"items": {
|
|
11530
|
-
"$ref": "#/components/schemas/UUID"
|
|
11531
|
-
},
|
|
11532
|
-
"description": "All mailbox ids the matched message currently lives in"
|
|
11533
|
-
},
|
|
11534
|
-
"fromName": {
|
|
11535
|
-
"type": "string",
|
|
11536
|
-
"description": "Display name of the sender (From header). Present for messages indexed after display-field enrichment was deployed."
|
|
11537
|
-
},
|
|
11538
|
-
"subject": {
|
|
11539
|
-
"type": "string",
|
|
11540
|
-
"description": "Message subject. Present for messages indexed after display-field enrichment was deployed."
|
|
11541
|
-
},
|
|
11542
|
-
"sentDate": {
|
|
11543
|
-
"type": "integer",
|
|
11544
|
-
"format": "int64",
|
|
11545
|
-
"description": "Sent date as Unix epoch seconds. Present for messages indexed after display-field enrichment was deployed."
|
|
11546
|
-
},
|
|
11547
|
-
"category": {
|
|
11548
|
-
"allOf": [
|
|
11549
|
-
{
|
|
11550
|
-
"$ref": "#/components/schemas/RemitImap.MessageCategory"
|
|
11551
|
-
}
|
|
11552
|
-
],
|
|
11553
|
-
"description": "Header-derived category of the matched message. Present for messages indexed after category enrichment was deployed; older entries omit it."
|
|
11554
|
-
}
|
|
11555
|
-
},
|
|
11556
|
-
"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."
|
|
11557
|
-
},
|
|
11558
11276
|
"RemitImap.SenderTrust": {
|
|
11559
11277
|
"type": "string",
|
|
11560
11278
|
"enum": [
|
|
@@ -11673,6 +11391,100 @@
|
|
|
11673
11391
|
},
|
|
11674
11392
|
"description": "Sync trigger response"
|
|
11675
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
|
+
},
|
|
11676
11488
|
"RemitImap.SystemUpdateCheck": {
|
|
11677
11489
|
"type": "object",
|
|
11678
11490
|
"required": [
|
|
@@ -11961,6 +11773,29 @@
|
|
|
11961
11773
|
},
|
|
11962
11774
|
"description": "Connection test result"
|
|
11963
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
|
+
},
|
|
11964
11799
|
"RemitImap.ThreadMessageResponse": {
|
|
11965
11800
|
"type": "object",
|
|
11966
11801
|
"required": [
|
|
@@ -12590,7 +12425,7 @@
|
|
|
12590
12425
|
"$ref": "#/components/schemas/RemitImap.FilterScope"
|
|
12591
12426
|
}
|
|
12592
12427
|
],
|
|
12593
|
-
"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."
|
|
12594
12429
|
},
|
|
12595
12430
|
"expiresAt": {
|
|
12596
12431
|
"type": "string",
|
|
@@ -12611,7 +12446,7 @@
|
|
|
12611
12446
|
"$ref": "#/components/schemas/RemitImap.FilterMatchOperator"
|
|
12612
12447
|
}
|
|
12613
12448
|
],
|
|
12614
|
-
"description": "How literalClauses combine.
|
|
12449
|
+
"description": "How literalClauses combine.",
|
|
12615
12450
|
"default": "And"
|
|
12616
12451
|
},
|
|
12617
12452
|
"literalClauses": {
|
|
@@ -12619,8 +12454,8 @@
|
|
|
12619
12454
|
"items": {
|
|
12620
12455
|
"$ref": "#/components/schemas/RemitImap.FilterClause"
|
|
12621
12456
|
},
|
|
12622
|
-
"
|
|
12623
|
-
"
|
|
12457
|
+
"minItems": 1,
|
|
12458
|
+
"description": "Literal from/subject/has-words predicate clauses (RFC 031). A filter carries at least one."
|
|
12624
12459
|
},
|
|
12625
12460
|
"actionLabelId": {
|
|
12626
12461
|
"type": "string",
|
|
@@ -12633,7 +12468,7 @@
|
|
|
12633
12468
|
"default": "None"
|
|
12634
12469
|
}
|
|
12635
12470
|
},
|
|
12636
|
-
"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."
|
|
12637
12472
|
},
|
|
12638
12473
|
"RemitImap.UpdateFlagsInput": {
|
|
12639
12474
|
"type": "object",
|