@primitivedotdev/sdk 1.31.0 → 1.32.0

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.
@@ -5934,7 +5934,163 @@ const openapiDocument = {
5934
5934
  "additionalProperties": false
5935
5935
  } } }
5936
5936
  }
5937
- } }
5937
+ } },
5938
+ "/contact-policy": {
5939
+ "get": {
5940
+ "operationId": "getContactPolicy",
5941
+ "summary": "Read organization contact policy",
5942
+ "tags": ["Contacts"],
5943
+ "security": [{ "BearerAuth": [] }],
5944
+ "description": "Receiver-side email notification admission preferences; never task, tool, code execution or account authority. Rules take effect only in receivers implementing this current contact-policy contract. Older receivers may continue their previous exact-contact notifications until updated. Ordinary email delivery, storage, webhooks and explicit reply waits remain independent of these preferences. Organization owners/admins using session, OAuth or signed dashboard credentials may read/write policies. Connected credentials may only GET their own agent composite; they cannot write either policy. Function and signed capability credentials are not granted access. Rules are unordered. Exact membership notify:false always silences. Next use matching agent rules, otherwise matching organization rules; silence wins ties within that scope. If neither scope matches, existing exact membership notify:true allows using its own activation metadata; otherwise only enabled contact-request intake is allowed. Owner policy silence therefore cannot be bypassed by a connected agent adding a notify:true membership. Patterns are canonical lowercase bare mailboxes, *@example.com, research-*@example.com or *@*.example.com. Only a terminal local-part * and a leading whole domain-label *. are supported; subdomain patterns exclude the apex and require a literal multi-label suffix. No regular expressions, question marks, universal domains or wildcard TLDs. Domain-only UI input must be converted to *@domain. PUT fully replaces up to 100 rules and the request-intake option using exactly one CAS precondition. Duplicate pattern/effect pairs are rejected. if_absent returns an identical existing document, otherwise 409. A missing document reads as empty rules, null version/timestamps, false request intake for the organization and null (inherit) for the agent. Reset overrides with empty rules and null request intake. Allow rules preserve server activation metadata while retained unchanged; removing/recreating or changing a rule to allow resets it. Request intake defaults off; agent null inherits the organization. No-op writes preserve versions. Agent composite effective_version changes with either policy document, connection identity, generation or successful claim; effective_since is the latest policy mutation, connection creation or successful claim. Reclaiming a connection invalidates prior admission snapshots and starts a fresh rule/request cutoff; routine heartbeats do not. Rule/request admissions require received_at >= both the selected activation time and effective_since. Consequently even unrelated policy edits suppress queued older rule/request admissions, without deleting email history or affecting explicit reply waits. Exact membership fallback retains its own notify_since and generation but must still recheck current policy denies and effective_version. Before dispatch, receivers must recheck the current composite version and applicable activation generation and membership; stop new admissions when policy is unavailable or older than 30 seconds. Snapshot fields explain scope and matched rules locally; the API does not execute tasks or dispatch notifications.",
5945
+ "parameters": [],
5946
+ "responses": {
5947
+ "200": {
5948
+ "description": "Current policy",
5949
+ "headers": { "Cache-Control": { "schema": {
5950
+ "type": "string",
5951
+ "const": "no-store"
5952
+ } } },
5953
+ "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
5954
+ "type": "object",
5955
+ "required": ["data"],
5956
+ "properties": { "data": { "$ref": "#/components/schemas/ContactPolicy" } }
5957
+ }] } } }
5958
+ },
5959
+ "400": { "$ref": "#/components/responses/ValidationError" },
5960
+ "401": { "$ref": "#/components/responses/Unauthorized" },
5961
+ "403": { "$ref": "#/components/responses/Forbidden" },
5962
+ "404": { "$ref": "#/components/responses/NotFound" },
5963
+ "409": {
5964
+ "description": "contact_conflict: policy precondition did not match",
5965
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
5966
+ },
5967
+ "429": { "$ref": "#/components/responses/RateLimited" }
5968
+ }
5969
+ },
5970
+ "put": {
5971
+ "operationId": "putContactPolicy",
5972
+ "summary": "Replace organization contact policy",
5973
+ "tags": ["Contacts"],
5974
+ "security": [{ "BearerAuth": [] }],
5975
+ "description": "Receiver-side email notification admission preferences; never task, tool, code execution or account authority. Rules take effect only in receivers implementing this current contact-policy contract. Older receivers may continue their previous exact-contact notifications until updated. Ordinary email delivery, storage, webhooks and explicit reply waits remain independent of these preferences. Organization owners/admins using session, OAuth or signed dashboard credentials may read/write policies. Connected credentials may only GET their own agent composite; they cannot write either policy. Function and signed capability credentials are not granted access. Rules are unordered. Exact membership notify:false always silences. Next use matching agent rules, otherwise matching organization rules; silence wins ties within that scope. If neither scope matches, existing exact membership notify:true allows using its own activation metadata; otherwise only enabled contact-request intake is allowed. Owner policy silence therefore cannot be bypassed by a connected agent adding a notify:true membership. Patterns are canonical lowercase bare mailboxes, *@example.com, research-*@example.com or *@*.example.com. Only a terminal local-part * and a leading whole domain-label *. are supported; subdomain patterns exclude the apex and require a literal multi-label suffix. No regular expressions, question marks, universal domains or wildcard TLDs. Domain-only UI input must be converted to *@domain. PUT fully replaces up to 100 rules and the request-intake option using exactly one CAS precondition. Duplicate pattern/effect pairs are rejected. if_absent returns an identical existing document, otherwise 409. A missing document reads as empty rules, null version/timestamps, false request intake for the organization and null (inherit) for the agent. Reset overrides with empty rules and null request intake. Allow rules preserve server activation metadata while retained unchanged; removing/recreating or changing a rule to allow resets it. Request intake defaults off; agent null inherits the organization. No-op writes preserve versions. Agent composite effective_version changes with either policy document, connection identity, generation or successful claim; effective_since is the latest policy mutation, connection creation or successful claim. Reclaiming a connection invalidates prior admission snapshots and starts a fresh rule/request cutoff; routine heartbeats do not. Rule/request admissions require received_at >= both the selected activation time and effective_since. Consequently even unrelated policy edits suppress queued older rule/request admissions, without deleting email history or affecting explicit reply waits. Exact membership fallback retains its own notify_since and generation but must still recheck current policy denies and effective_version. Before dispatch, receivers must recheck the current composite version and applicable activation generation and membership; stop new admissions when policy is unavailable or older than 30 seconds. Snapshot fields explain scope and matched rules locally; the API does not execute tasks or dispatch notifications.",
5976
+ "parameters": [],
5977
+ "requestBody": {
5978
+ "required": true,
5979
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PutContactPolicyRequest" } } }
5980
+ },
5981
+ "responses": {
5982
+ "200": {
5983
+ "description": "Current policy",
5984
+ "headers": { "Cache-Control": { "schema": {
5985
+ "type": "string",
5986
+ "const": "no-store"
5987
+ } } },
5988
+ "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
5989
+ "type": "object",
5990
+ "required": ["data"],
5991
+ "properties": { "data": { "$ref": "#/components/schemas/ContactPolicy" } }
5992
+ }] } } }
5993
+ },
5994
+ "400": { "$ref": "#/components/responses/ValidationError" },
5995
+ "401": { "$ref": "#/components/responses/Unauthorized" },
5996
+ "403": { "$ref": "#/components/responses/Forbidden" },
5997
+ "404": { "$ref": "#/components/responses/NotFound" },
5998
+ "409": {
5999
+ "description": "contact_conflict: policy precondition did not match",
6000
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
6001
+ },
6002
+ "429": { "$ref": "#/components/responses/RateLimited" }
6003
+ }
6004
+ }
6005
+ },
6006
+ "/agent-contact-policy/{agent_address}": {
6007
+ "get": {
6008
+ "operationId": "getAgentContactPolicy",
6009
+ "summary": "Read agent contact policy",
6010
+ "tags": ["Contacts"],
6011
+ "security": [{ "BearerAuth": [] }],
6012
+ "description": "Receiver-side email notification admission preferences; never task, tool, code execution or account authority. Rules take effect only in receivers implementing this current contact-policy contract. Older receivers may continue their previous exact-contact notifications until updated. Ordinary email delivery, storage, webhooks and explicit reply waits remain independent of these preferences. Organization owners/admins using session, OAuth or signed dashboard credentials may read/write policies. Connected credentials may only GET their own agent composite; they cannot write either policy. Function and signed capability credentials are not granted access. Rules are unordered. Exact membership notify:false always silences. Next use matching agent rules, otherwise matching organization rules; silence wins ties within that scope. If neither scope matches, existing exact membership notify:true allows using its own activation metadata; otherwise only enabled contact-request intake is allowed. Owner policy silence therefore cannot be bypassed by a connected agent adding a notify:true membership. Patterns are canonical lowercase bare mailboxes, *@example.com, research-*@example.com or *@*.example.com. Only a terminal local-part * and a leading whole domain-label *. are supported; subdomain patterns exclude the apex and require a literal multi-label suffix. No regular expressions, question marks, universal domains or wildcard TLDs. Domain-only UI input must be converted to *@domain. PUT fully replaces up to 100 rules and the request-intake option using exactly one CAS precondition. Duplicate pattern/effect pairs are rejected. if_absent returns an identical existing document, otherwise 409. A missing document reads as empty rules, null version/timestamps, false request intake for the organization and null (inherit) for the agent. Reset overrides with empty rules and null request intake. Allow rules preserve server activation metadata while retained unchanged; removing/recreating or changing a rule to allow resets it. Request intake defaults off; agent null inherits the organization. No-op writes preserve versions. Agent composite effective_version changes with either policy document, connection identity, generation or successful claim; effective_since is the latest policy mutation, connection creation or successful claim. Reclaiming a connection invalidates prior admission snapshots and starts a fresh rule/request cutoff; routine heartbeats do not. Rule/request admissions require received_at >= both the selected activation time and effective_since. Consequently even unrelated policy edits suppress queued older rule/request admissions, without deleting email history or affecting explicit reply waits. Exact membership fallback retains its own notify_since and generation but must still recheck current policy denies and effective_version. Before dispatch, receivers must recheck the current composite version and applicable activation generation and membership; stop new admissions when policy is unavailable or older than 30 seconds. Snapshot fields explain scope and matched rules locally; the API does not execute tasks or dispatch notifications.",
6013
+ "parameters": [{
6014
+ "name": "agent_address",
6015
+ "in": "path",
6016
+ "required": true,
6017
+ "schema": {
6018
+ "type": "string",
6019
+ "format": "email",
6020
+ "maxLength": 254
6021
+ },
6022
+ "description": "Canonical address of an agent connection in the current organization."
6023
+ }],
6024
+ "responses": {
6025
+ "200": {
6026
+ "description": "Current policy",
6027
+ "headers": { "Cache-Control": { "schema": {
6028
+ "type": "string",
6029
+ "const": "no-store"
6030
+ } } },
6031
+ "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
6032
+ "type": "object",
6033
+ "required": ["data"],
6034
+ "properties": { "data": { "$ref": "#/components/schemas/AgentContactPolicy" } }
6035
+ }] } } }
6036
+ },
6037
+ "400": { "$ref": "#/components/responses/ValidationError" },
6038
+ "401": { "$ref": "#/components/responses/Unauthorized" },
6039
+ "403": { "$ref": "#/components/responses/Forbidden" },
6040
+ "404": { "$ref": "#/components/responses/NotFound" },
6041
+ "409": {
6042
+ "description": "contact_conflict: policy precondition did not match",
6043
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
6044
+ },
6045
+ "429": { "$ref": "#/components/responses/RateLimited" }
6046
+ }
6047
+ },
6048
+ "put": {
6049
+ "operationId": "putAgentContactPolicy",
6050
+ "summary": "Replace agent contact policy",
6051
+ "tags": ["Contacts"],
6052
+ "security": [{ "BearerAuth": [] }],
6053
+ "description": "Receiver-side email notification admission preferences; never task, tool, code execution or account authority. Rules take effect only in receivers implementing this current contact-policy contract. Older receivers may continue their previous exact-contact notifications until updated. Ordinary email delivery, storage, webhooks and explicit reply waits remain independent of these preferences. Organization owners/admins using session, OAuth or signed dashboard credentials may read/write policies. Connected credentials may only GET their own agent composite; they cannot write either policy. Function and signed capability credentials are not granted access. Rules are unordered. Exact membership notify:false always silences. Next use matching agent rules, otherwise matching organization rules; silence wins ties within that scope. If neither scope matches, existing exact membership notify:true allows using its own activation metadata; otherwise only enabled contact-request intake is allowed. Owner policy silence therefore cannot be bypassed by a connected agent adding a notify:true membership. Patterns are canonical lowercase bare mailboxes, *@example.com, research-*@example.com or *@*.example.com. Only a terminal local-part * and a leading whole domain-label *. are supported; subdomain patterns exclude the apex and require a literal multi-label suffix. No regular expressions, question marks, universal domains or wildcard TLDs. Domain-only UI input must be converted to *@domain. PUT fully replaces up to 100 rules and the request-intake option using exactly one CAS precondition. Duplicate pattern/effect pairs are rejected. if_absent returns an identical existing document, otherwise 409. A missing document reads as empty rules, null version/timestamps, false request intake for the organization and null (inherit) for the agent. Reset overrides with empty rules and null request intake. Allow rules preserve server activation metadata while retained unchanged; removing/recreating or changing a rule to allow resets it. Request intake defaults off; agent null inherits the organization. No-op writes preserve versions. Agent composite effective_version changes with either policy document, connection identity, generation or successful claim; effective_since is the latest policy mutation, connection creation or successful claim. Reclaiming a connection invalidates prior admission snapshots and starts a fresh rule/request cutoff; routine heartbeats do not. Rule/request admissions require received_at >= both the selected activation time and effective_since. Consequently even unrelated policy edits suppress queued older rule/request admissions, without deleting email history or affecting explicit reply waits. Exact membership fallback retains its own notify_since and generation but must still recheck current policy denies and effective_version. Before dispatch, receivers must recheck the current composite version and applicable activation generation and membership; stop new admissions when policy is unavailable or older than 30 seconds. Snapshot fields explain scope and matched rules locally; the API does not execute tasks or dispatch notifications.",
6054
+ "parameters": [{
6055
+ "name": "agent_address",
6056
+ "in": "path",
6057
+ "required": true,
6058
+ "schema": {
6059
+ "type": "string",
6060
+ "format": "email",
6061
+ "maxLength": 254
6062
+ },
6063
+ "description": "Canonical address of an agent connection in the current organization."
6064
+ }],
6065
+ "requestBody": {
6066
+ "required": true,
6067
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PutAgentContactPolicyRequest" } } }
6068
+ },
6069
+ "responses": {
6070
+ "200": {
6071
+ "description": "Current policy",
6072
+ "headers": { "Cache-Control": { "schema": {
6073
+ "type": "string",
6074
+ "const": "no-store"
6075
+ } } },
6076
+ "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
6077
+ "type": "object",
6078
+ "required": ["data"],
6079
+ "properties": { "data": { "$ref": "#/components/schemas/AgentContactPolicy" } }
6080
+ }] } } }
6081
+ },
6082
+ "400": { "$ref": "#/components/responses/ValidationError" },
6083
+ "401": { "$ref": "#/components/responses/Unauthorized" },
6084
+ "403": { "$ref": "#/components/responses/Forbidden" },
6085
+ "404": { "$ref": "#/components/responses/NotFound" },
6086
+ "409": {
6087
+ "description": "contact_conflict: policy precondition did not match",
6088
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
6089
+ },
6090
+ "429": { "$ref": "#/components/responses/RateLimited" }
6091
+ }
6092
+ }
6093
+ }
5938
6094
  },
5939
6095
  "components": {
5940
6096
  "securitySchemes": {
@@ -6248,124 +6404,369 @@ const openapiDocument = {
6248
6404
  }
6249
6405
  },
6250
6406
  "schemas": {
6251
- "PublishPolicy": {
6252
- "type": "string",
6253
- "enum": [
6254
- "owner_only",
6255
- "request",
6256
- "open"
6257
- ],
6258
- "description": "Who may publish into a registry. owner_only: only the registry owner.\nrequest: anyone may request and the owner approves. open: anyone may\npublish and it lists immediately (no approval step).\n"
6259
- },
6260
- "Registry": {
6407
+ "ContactPolicyRuleInput": {
6261
6408
  "type": "object",
6409
+ "additionalProperties": false,
6262
6410
  "properties": {
6263
- "id": {
6411
+ "pattern": {
6264
6412
  "type": "string",
6265
- "format": "uuid"
6413
+ "maxLength": 254,
6414
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
6415
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
6266
6416
  },
6267
- "slug": { "type": "string" },
6268
- "name": { "type": "string" },
6269
- "description": { "type": ["string", "null"] },
6270
- "is_public": { "type": "boolean" },
6271
- "publish_policy": { "$ref": "#/components/schemas/PublishPolicy" }
6417
+ "effect": {
6418
+ "type": "string",
6419
+ "enum": ["allow", "silence"]
6420
+ }
6272
6421
  },
6273
- "required": [
6274
- "id",
6275
- "slug",
6276
- "name",
6277
- "description",
6278
- "is_public",
6279
- "publish_policy"
6280
- ]
6422
+ "required": ["pattern", "effect"]
6281
6423
  },
6282
- "RegistryAgent": {
6424
+ "ContactPolicyRule": {
6283
6425
  "type": "object",
6284
- "description": "An agent's public directory profile.",
6426
+ "additionalProperties": false,
6285
6427
  "properties": {
6286
- "address": { "type": "string" },
6287
- "display_name": { "type": "string" },
6288
- "title": { "type": ["string", "null"] },
6289
- "description": { "type": ["string", "null"] },
6290
- "tags": {
6291
- "type": "array",
6292
- "items": { "type": "string" }
6428
+ "pattern": {
6429
+ "type": "string",
6430
+ "maxLength": 254,
6431
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
6432
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
6293
6433
  },
6294
- "handle": {
6434
+ "effect": {
6435
+ "type": "string",
6436
+ "enum": ["allow", "silence"]
6437
+ },
6438
+ "notify_since": {
6295
6439
  "type": ["string", "null"],
6296
- "description": "The registry-scoped name. Null on the global by-address read."
6440
+ "format": "date-time"
6297
6441
  },
6298
- "last_reachable_at": {
6442
+ "notification_generation": {
6299
6443
  "type": ["string", "null"],
6300
- "format": "date-time",
6301
- "description": "When the agent's address was last confirmed to still route to its endpoint. A freshness signal for ranking listings; null until the first check."
6444
+ "format": "uuid"
6302
6445
  }
6303
6446
  },
6304
6447
  "required": [
6305
- "address",
6306
- "display_name",
6307
- "title",
6308
- "description",
6309
- "tags",
6310
- "handle",
6311
- "last_reachable_at"
6448
+ "pattern",
6449
+ "effect",
6450
+ "notify_since",
6451
+ "notification_generation"
6312
6452
  ]
6313
6453
  },
6314
- "RegistryRequest": {
6454
+ "ContactPolicy": {
6315
6455
  "type": "object",
6316
- "description": "A pending publication request, as the registry owner sees it.",
6456
+ "additionalProperties": false,
6317
6457
  "properties": {
6318
- "id": {
6319
- "type": "string",
6458
+ "rules": {
6459
+ "type": "array",
6460
+ "maxItems": 100,
6461
+ "items": { "$ref": "#/components/schemas/ContactPolicyRule" }
6462
+ },
6463
+ "contact_request_since": {
6464
+ "type": ["string", "null"],
6465
+ "format": "date-time"
6466
+ },
6467
+ "contact_request_generation": {
6468
+ "type": ["string", "null"],
6320
6469
  "format": "uuid"
6321
6470
  },
6322
- "address": { "type": "string" },
6323
- "display_name": { "type": "string" },
6324
- "handle": { "type": ["string", "null"] },
6325
- "requested_at": {
6326
- "type": "string",
6471
+ "version": {
6472
+ "type": ["string", "null"],
6473
+ "format": "uuid"
6474
+ },
6475
+ "updated_at": {
6476
+ "type": ["string", "null"],
6327
6477
  "format": "date-time"
6328
- }
6478
+ },
6479
+ "allow_contact_requests": { "type": "boolean" }
6329
6480
  },
6330
6481
  "required": [
6331
- "id",
6332
- "address",
6333
- "display_name",
6334
- "handle",
6335
- "requested_at"
6482
+ "rules",
6483
+ "contact_request_since",
6484
+ "contact_request_generation",
6485
+ "version",
6486
+ "updated_at",
6487
+ "allow_contact_requests"
6336
6488
  ]
6337
6489
  },
6338
- "CreateRegistryInput": {
6490
+ "AgentContactPolicyOverride": {
6339
6491
  "type": "object",
6492
+ "additionalProperties": false,
6340
6493
  "properties": {
6341
- "slug": {
6342
- "type": "string",
6343
- "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$",
6344
- "description": "Lowercase slug, unique across registries."
6494
+ "rules": {
6495
+ "type": "array",
6496
+ "maxItems": 100,
6497
+ "items": { "$ref": "#/components/schemas/ContactPolicyRule" }
6345
6498
  },
6346
- "name": {
6347
- "type": "string",
6348
- "minLength": 1,
6349
- "maxLength": 120
6499
+ "contact_request_since": {
6500
+ "type": ["string", "null"],
6501
+ "format": "date-time"
6350
6502
  },
6351
- "description": {
6503
+ "contact_request_generation": {
6352
6504
  "type": ["string", "null"],
6353
- "maxLength": 2e3
6505
+ "format": "uuid"
6354
6506
  },
6355
- "is_public": { "type": "boolean" },
6356
- "publish_policy": { "$ref": "#/components/schemas/PublishPolicy" }
6507
+ "version": {
6508
+ "type": ["string", "null"],
6509
+ "format": "uuid"
6510
+ },
6511
+ "updated_at": {
6512
+ "type": ["string", "null"],
6513
+ "format": "date-time"
6514
+ },
6515
+ "allow_contact_requests": { "type": ["boolean", "null"] }
6357
6516
  },
6358
- "required": ["slug", "name"]
6517
+ "required": [
6518
+ "rules",
6519
+ "contact_request_since",
6520
+ "contact_request_generation",
6521
+ "version",
6522
+ "updated_at",
6523
+ "allow_contact_requests"
6524
+ ]
6359
6525
  },
6360
- "UpdateRegistryInput": {
6526
+ "AgentContactPolicy": {
6361
6527
  "type": "object",
6362
- "minProperties": 1,
6528
+ "additionalProperties": false,
6363
6529
  "properties": {
6364
- "name": {
6530
+ "agent_address": {
6365
6531
  "type": "string",
6366
- "minLength": 1,
6367
- "maxLength": 120
6368
- },
6532
+ "format": "email",
6533
+ "maxLength": 254
6534
+ },
6535
+ "org_policy": { "$ref": "#/components/schemas/ContactPolicy" },
6536
+ "agent_policy": { "$ref": "#/components/schemas/AgentContactPolicyOverride" },
6537
+ "effective_version": {
6538
+ "type": "string",
6539
+ "pattern": "^[a-f0-9]{64}$"
6540
+ },
6541
+ "effective_since": {
6542
+ "type": "string",
6543
+ "format": "date-time"
6544
+ },
6545
+ "allow_contact_requests": { "type": "boolean" },
6546
+ "contact_request_since": {
6547
+ "type": ["string", "null"],
6548
+ "format": "date-time"
6549
+ },
6550
+ "contact_request_generation": {
6551
+ "type": ["string", "null"],
6552
+ "pattern": "^[a-f0-9]{64}$"
6553
+ }
6554
+ },
6555
+ "required": [
6556
+ "agent_address",
6557
+ "org_policy",
6558
+ "agent_policy",
6559
+ "effective_version",
6560
+ "effective_since",
6561
+ "allow_contact_requests",
6562
+ "contact_request_since",
6563
+ "contact_request_generation"
6564
+ ]
6565
+ },
6566
+ "PutContactPolicyRequest": { "oneOf": [{ "$ref": "#/components/schemas/PutContactPolicyCreate" }, { "$ref": "#/components/schemas/PutContactPolicyReplace" }] },
6567
+ "PutAgentContactPolicyRequest": { "oneOf": [{ "$ref": "#/components/schemas/PutAgentContactPolicyCreate" }, { "$ref": "#/components/schemas/PutAgentContactPolicyReplace" }] },
6568
+ "PutContactPolicyCreate": {
6569
+ "type": "object",
6570
+ "additionalProperties": false,
6571
+ "properties": {
6572
+ "rules": {
6573
+ "type": "array",
6574
+ "maxItems": 100,
6575
+ "items": { "$ref": "#/components/schemas/ContactPolicyRuleInput" }
6576
+ },
6577
+ "allow_contact_requests": { "type": "boolean" },
6578
+ "if_absent": {
6579
+ "type": "boolean",
6580
+ "const": true
6581
+ }
6582
+ },
6583
+ "required": [
6584
+ "rules",
6585
+ "allow_contact_requests",
6586
+ "if_absent"
6587
+ ]
6588
+ },
6589
+ "PutContactPolicyReplace": {
6590
+ "type": "object",
6591
+ "additionalProperties": false,
6592
+ "properties": {
6593
+ "rules": {
6594
+ "type": "array",
6595
+ "maxItems": 100,
6596
+ "items": { "$ref": "#/components/schemas/ContactPolicyRuleInput" }
6597
+ },
6598
+ "allow_contact_requests": { "type": "boolean" },
6599
+ "if_version": {
6600
+ "type": "string",
6601
+ "format": "uuid"
6602
+ }
6603
+ },
6604
+ "required": [
6605
+ "rules",
6606
+ "allow_contact_requests",
6607
+ "if_version"
6608
+ ]
6609
+ },
6610
+ "PutAgentContactPolicyCreate": {
6611
+ "type": "object",
6612
+ "additionalProperties": false,
6613
+ "properties": {
6614
+ "rules": {
6615
+ "type": "array",
6616
+ "maxItems": 100,
6617
+ "items": { "$ref": "#/components/schemas/ContactPolicyRuleInput" }
6618
+ },
6619
+ "allow_contact_requests": { "type": ["boolean", "null"] },
6620
+ "if_absent": {
6621
+ "type": "boolean",
6622
+ "const": true
6623
+ }
6624
+ },
6625
+ "required": [
6626
+ "rules",
6627
+ "allow_contact_requests",
6628
+ "if_absent"
6629
+ ]
6630
+ },
6631
+ "PutAgentContactPolicyReplace": {
6632
+ "type": "object",
6633
+ "additionalProperties": false,
6634
+ "properties": {
6635
+ "rules": {
6636
+ "type": "array",
6637
+ "maxItems": 100,
6638
+ "items": { "$ref": "#/components/schemas/ContactPolicyRuleInput" }
6639
+ },
6640
+ "allow_contact_requests": { "type": ["boolean", "null"] },
6641
+ "if_version": {
6642
+ "type": "string",
6643
+ "format": "uuid"
6644
+ }
6645
+ },
6646
+ "required": [
6647
+ "rules",
6648
+ "allow_contact_requests",
6649
+ "if_version"
6650
+ ]
6651
+ },
6652
+ "PublishPolicy": {
6653
+ "type": "string",
6654
+ "enum": [
6655
+ "owner_only",
6656
+ "request",
6657
+ "open"
6658
+ ],
6659
+ "description": "Who may publish into a registry. owner_only: only the registry owner.\nrequest: anyone may request and the owner approves. open: anyone may\npublish and it lists immediately (no approval step).\n"
6660
+ },
6661
+ "Registry": {
6662
+ "type": "object",
6663
+ "properties": {
6664
+ "id": {
6665
+ "type": "string",
6666
+ "format": "uuid"
6667
+ },
6668
+ "slug": { "type": "string" },
6669
+ "name": { "type": "string" },
6670
+ "description": { "type": ["string", "null"] },
6671
+ "is_public": { "type": "boolean" },
6672
+ "publish_policy": { "$ref": "#/components/schemas/PublishPolicy" }
6673
+ },
6674
+ "required": [
6675
+ "id",
6676
+ "slug",
6677
+ "name",
6678
+ "description",
6679
+ "is_public",
6680
+ "publish_policy"
6681
+ ]
6682
+ },
6683
+ "RegistryAgent": {
6684
+ "type": "object",
6685
+ "description": "An agent's public directory profile.",
6686
+ "properties": {
6687
+ "address": { "type": "string" },
6688
+ "display_name": { "type": "string" },
6689
+ "title": { "type": ["string", "null"] },
6690
+ "description": { "type": ["string", "null"] },
6691
+ "tags": {
6692
+ "type": "array",
6693
+ "items": { "type": "string" }
6694
+ },
6695
+ "handle": {
6696
+ "type": ["string", "null"],
6697
+ "description": "The registry-scoped name. Null on the global by-address read."
6698
+ },
6699
+ "last_reachable_at": {
6700
+ "type": ["string", "null"],
6701
+ "format": "date-time",
6702
+ "description": "When the agent's address was last confirmed to still route to its endpoint. A freshness signal for ranking listings; null until the first check."
6703
+ }
6704
+ },
6705
+ "required": [
6706
+ "address",
6707
+ "display_name",
6708
+ "title",
6709
+ "description",
6710
+ "tags",
6711
+ "handle",
6712
+ "last_reachable_at"
6713
+ ]
6714
+ },
6715
+ "RegistryRequest": {
6716
+ "type": "object",
6717
+ "description": "A pending publication request, as the registry owner sees it.",
6718
+ "properties": {
6719
+ "id": {
6720
+ "type": "string",
6721
+ "format": "uuid"
6722
+ },
6723
+ "address": { "type": "string" },
6724
+ "display_name": { "type": "string" },
6725
+ "handle": { "type": ["string", "null"] },
6726
+ "requested_at": {
6727
+ "type": "string",
6728
+ "format": "date-time"
6729
+ }
6730
+ },
6731
+ "required": [
6732
+ "id",
6733
+ "address",
6734
+ "display_name",
6735
+ "handle",
6736
+ "requested_at"
6737
+ ]
6738
+ },
6739
+ "CreateRegistryInput": {
6740
+ "type": "object",
6741
+ "properties": {
6742
+ "slug": {
6743
+ "type": "string",
6744
+ "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$",
6745
+ "description": "Lowercase slug, unique across registries."
6746
+ },
6747
+ "name": {
6748
+ "type": "string",
6749
+ "minLength": 1,
6750
+ "maxLength": 120
6751
+ },
6752
+ "description": {
6753
+ "type": ["string", "null"],
6754
+ "maxLength": 2e3
6755
+ },
6756
+ "is_public": { "type": "boolean" },
6757
+ "publish_policy": { "$ref": "#/components/schemas/PublishPolicy" }
6758
+ },
6759
+ "required": ["slug", "name"]
6760
+ },
6761
+ "UpdateRegistryInput": {
6762
+ "type": "object",
6763
+ "minProperties": 1,
6764
+ "properties": {
6765
+ "name": {
6766
+ "type": "string",
6767
+ "minLength": 1,
6768
+ "maxLength": 120
6769
+ },
6369
6770
  "description": {
6370
6771
  "type": ["string", "null"],
6371
6772
  "maxLength": 2e3
@@ -14916,16 +15317,16 @@ const operationManifest = [
14916
15317
  {
14917
15318
  "binaryResponse": false,
14918
15319
  "bodyRequired": false,
14919
- "command": "get-contact",
14920
- "description": "Organization directory and agent preferences; no profiles, message history or runtime presence. Existing organization credentials use tenant permissions. Connected keys may read the directory, create address-only missing contacts using if_absent:true, and access only their own agent memberships; they cannot edit shared labels or delete directory entries. Function credentials are not granted access. Memberships require an existing local agent connection (including revoked connections) and an existing contact. PUT requires exactly one precondition. if_absent returns an existing row unchanged when supplied fields agree; otherwise 409. notify defaults false. Off-to-on generates a new server timestamp and generation; on-to-on and purpose-only edits preserve them. Disable clears activation metadata. Deletion atomically removes membership eligibility. Receivers must recheck generation/preferences before dispatch and pause admission when their policy cache is older than 30 seconds; explicit reply waits are independent. DELETE requires if_version, returns deleted:false for an absent row, and rejects stale versions of recreated rows. Pages use ascending canonical address, with meta.cursor null on the last page. Lists are live pages, not snapshots.",
15320
+ "command": "get-agent-contact-policy",
15321
+ "description": "Receiver-side email notification admission preferences; never task, tool, code execution or account authority. Rules take effect only in receivers implementing this current contact-policy contract. Older receivers may continue their previous exact-contact notifications until updated. Ordinary email delivery, storage, webhooks and explicit reply waits remain independent of these preferences. Organization owners/admins using session, OAuth or signed dashboard credentials may read/write policies. Connected credentials may only GET their own agent composite; they cannot write either policy. Function and signed capability credentials are not granted access. Rules are unordered. Exact membership notify:false always silences. Next use matching agent rules, otherwise matching organization rules; silence wins ties within that scope. If neither scope matches, existing exact membership notify:true allows using its own activation metadata; otherwise only enabled contact-request intake is allowed. Owner policy silence therefore cannot be bypassed by a connected agent adding a notify:true membership. Patterns are canonical lowercase bare mailboxes, *@example.com, research-*@example.com or *@*.example.com. Only a terminal local-part * and a leading whole domain-label *. are supported; subdomain patterns exclude the apex and require a literal multi-label suffix. No regular expressions, question marks, universal domains or wildcard TLDs. Domain-only UI input must be converted to *@domain. PUT fully replaces up to 100 rules and the request-intake option using exactly one CAS precondition. Duplicate pattern/effect pairs are rejected. if_absent returns an identical existing document, otherwise 409. A missing document reads as empty rules, null version/timestamps, false request intake for the organization and null (inherit) for the agent. Reset overrides with empty rules and null request intake. Allow rules preserve server activation metadata while retained unchanged; removing/recreating or changing a rule to allow resets it. Request intake defaults off; agent null inherits the organization. No-op writes preserve versions. Agent composite effective_version changes with either policy document, connection identity, generation or successful claim; effective_since is the latest policy mutation, connection creation or successful claim. Reclaiming a connection invalidates prior admission snapshots and starts a fresh rule/request cutoff; routine heartbeats do not. Rule/request admissions require received_at >= both the selected activation time and effective_since. Consequently even unrelated policy edits suppress queued older rule/request admissions, without deleting email history or affecting explicit reply waits. Exact membership fallback retains its own notify_since and generation but must still recheck current policy denies and effective_version. Before dispatch, receivers must recheck the current composite version and applicable activation generation and membership; stop new admissions when policy is unavailable or older than 30 seconds. Snapshot fields explain scope and matched rules locally; the API does not execute tasks or dispatch notifications.",
14921
15322
  "hasJsonBody": false,
14922
15323
  "method": "GET",
14923
- "operationId": "getContact",
14924
- "path": "/contacts/{address}",
15324
+ "operationId": "getAgentContactPolicy",
15325
+ "path": "/agent-contact-policy/{agent_address}",
14925
15326
  "pathParams": [{
14926
- "description": "address for contacts.",
15327
+ "description": "Canonical address of an agent connection in the current organization.",
14927
15328
  "enum": null,
14928
- "name": "address",
15329
+ "name": "agent_address",
14929
15330
  "required": true,
14930
15331
  "type": "string"
14931
15332
  }],
@@ -14935,58 +15336,331 @@ const operationManifest = [
14935
15336
  "type": "object",
14936
15337
  "additionalProperties": false,
14937
15338
  "properties": {
14938
- "address": {
15339
+ "agent_address": {
14939
15340
  "type": "string",
14940
15341
  "format": "email",
14941
- "maxLength": 254,
14942
- "description": "Bare email address; trim and lowercase, preserving dots and plus tags."
14943
- },
14944
- "display_name": {
14945
- "type": ["string", "null"],
14946
- "maxLength": 200
14947
- },
14948
- "version": {
14949
- "type": "string",
14950
- "format": "uuid",
14951
- "description": "Opaque CAS token. Changes on mutations and cannot be reused after deletion/recreation."
14952
- },
14953
- "created_at": {
14954
- "type": "string",
14955
- "format": "date-time"
15342
+ "maxLength": 254
14956
15343
  },
14957
- "updated_at": {
14958
- "type": "string",
14959
- "format": "date-time"
14960
- }
14961
- },
14962
- "required": [
14963
- "address",
14964
- "display_name",
14965
- "version",
14966
- "created_at",
14967
- "updated_at"
14968
- ]
14969
- },
14970
- "sdkName": "getContact",
14971
- "summary": "get Contact",
14972
- "tag": "Contacts",
14973
- "tagCommand": "contacts"
14974
- },
14975
- {
14976
- "binaryResponse": false,
14977
- "bodyRequired": false,
14978
- "command": "list-agent-contacts",
14979
- "description": "Organization directory and agent preferences; no profiles, message history or runtime presence. Existing organization credentials use tenant permissions. Connected keys may read the directory, create address-only missing contacts using if_absent:true, and access only their own agent memberships; they cannot edit shared labels or delete directory entries. Function credentials are not granted access. Memberships require an existing local agent connection (including revoked connections) and an existing contact. PUT requires exactly one precondition. if_absent returns an existing row unchanged when supplied fields agree; otherwise 409. notify defaults false. Off-to-on generates a new server timestamp and generation; on-to-on and purpose-only edits preserve them. Disable clears activation metadata. Deletion atomically removes membership eligibility. Receivers must recheck generation/preferences before dispatch and pause admission when their policy cache is older than 30 seconds; explicit reply waits are independent. DELETE requires if_version, returns deleted:false for an absent row, and rejects stale versions of recreated rows. Pages use ascending canonical address, with meta.cursor null on the last page. Lists are live pages, not snapshots.",
14980
- "hasJsonBody": false,
14981
- "method": "GET",
14982
- "operationId": "listAgentContacts",
14983
- "path": "/agent-contacts/{agent_address}",
14984
- "pathParams": [{
14985
- "description": "agent_address for contacts.",
14986
- "enum": null,
14987
- "name": "agent_address",
14988
- "required": true,
14989
- "type": "string"
15344
+ "org_policy": {
15345
+ "type": "object",
15346
+ "additionalProperties": false,
15347
+ "properties": {
15348
+ "rules": {
15349
+ "type": "array",
15350
+ "maxItems": 100,
15351
+ "items": {
15352
+ "type": "object",
15353
+ "additionalProperties": false,
15354
+ "properties": {
15355
+ "pattern": {
15356
+ "type": "string",
15357
+ "maxLength": 254,
15358
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
15359
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
15360
+ },
15361
+ "effect": {
15362
+ "type": "string",
15363
+ "enum": ["allow", "silence"]
15364
+ },
15365
+ "notify_since": {
15366
+ "type": ["string", "null"],
15367
+ "format": "date-time"
15368
+ },
15369
+ "notification_generation": {
15370
+ "type": ["string", "null"],
15371
+ "format": "uuid"
15372
+ }
15373
+ },
15374
+ "required": [
15375
+ "pattern",
15376
+ "effect",
15377
+ "notify_since",
15378
+ "notification_generation"
15379
+ ]
15380
+ }
15381
+ },
15382
+ "contact_request_since": {
15383
+ "type": ["string", "null"],
15384
+ "format": "date-time"
15385
+ },
15386
+ "contact_request_generation": {
15387
+ "type": ["string", "null"],
15388
+ "format": "uuid"
15389
+ },
15390
+ "version": {
15391
+ "type": ["string", "null"],
15392
+ "format": "uuid"
15393
+ },
15394
+ "updated_at": {
15395
+ "type": ["string", "null"],
15396
+ "format": "date-time"
15397
+ },
15398
+ "allow_contact_requests": { "type": "boolean" }
15399
+ },
15400
+ "required": [
15401
+ "rules",
15402
+ "contact_request_since",
15403
+ "contact_request_generation",
15404
+ "version",
15405
+ "updated_at",
15406
+ "allow_contact_requests"
15407
+ ]
15408
+ },
15409
+ "agent_policy": {
15410
+ "type": "object",
15411
+ "additionalProperties": false,
15412
+ "properties": {
15413
+ "rules": {
15414
+ "type": "array",
15415
+ "maxItems": 100,
15416
+ "items": {
15417
+ "type": "object",
15418
+ "additionalProperties": false,
15419
+ "properties": {
15420
+ "pattern": {
15421
+ "type": "string",
15422
+ "maxLength": 254,
15423
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
15424
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
15425
+ },
15426
+ "effect": {
15427
+ "type": "string",
15428
+ "enum": ["allow", "silence"]
15429
+ },
15430
+ "notify_since": {
15431
+ "type": ["string", "null"],
15432
+ "format": "date-time"
15433
+ },
15434
+ "notification_generation": {
15435
+ "type": ["string", "null"],
15436
+ "format": "uuid"
15437
+ }
15438
+ },
15439
+ "required": [
15440
+ "pattern",
15441
+ "effect",
15442
+ "notify_since",
15443
+ "notification_generation"
15444
+ ]
15445
+ }
15446
+ },
15447
+ "contact_request_since": {
15448
+ "type": ["string", "null"],
15449
+ "format": "date-time"
15450
+ },
15451
+ "contact_request_generation": {
15452
+ "type": ["string", "null"],
15453
+ "format": "uuid"
15454
+ },
15455
+ "version": {
15456
+ "type": ["string", "null"],
15457
+ "format": "uuid"
15458
+ },
15459
+ "updated_at": {
15460
+ "type": ["string", "null"],
15461
+ "format": "date-time"
15462
+ },
15463
+ "allow_contact_requests": { "type": ["boolean", "null"] }
15464
+ },
15465
+ "required": [
15466
+ "rules",
15467
+ "contact_request_since",
15468
+ "contact_request_generation",
15469
+ "version",
15470
+ "updated_at",
15471
+ "allow_contact_requests"
15472
+ ]
15473
+ },
15474
+ "effective_version": {
15475
+ "type": "string",
15476
+ "pattern": "^[a-f0-9]{64}$"
15477
+ },
15478
+ "effective_since": {
15479
+ "type": "string",
15480
+ "format": "date-time"
15481
+ },
15482
+ "allow_contact_requests": { "type": "boolean" },
15483
+ "contact_request_since": {
15484
+ "type": ["string", "null"],
15485
+ "format": "date-time"
15486
+ },
15487
+ "contact_request_generation": {
15488
+ "type": ["string", "null"],
15489
+ "pattern": "^[a-f0-9]{64}$"
15490
+ }
15491
+ },
15492
+ "required": [
15493
+ "agent_address",
15494
+ "org_policy",
15495
+ "agent_policy",
15496
+ "effective_version",
15497
+ "effective_since",
15498
+ "allow_contact_requests",
15499
+ "contact_request_since",
15500
+ "contact_request_generation"
15501
+ ]
15502
+ },
15503
+ "sdkName": "getAgentContactPolicy",
15504
+ "summary": "Read agent contact policy",
15505
+ "tag": "Contacts",
15506
+ "tagCommand": "contacts"
15507
+ },
15508
+ {
15509
+ "binaryResponse": false,
15510
+ "bodyRequired": false,
15511
+ "command": "get-contact",
15512
+ "description": "Organization directory and agent preferences; no profiles, message history or runtime presence. Existing organization credentials use tenant permissions. Connected keys may read the directory, create address-only missing contacts using if_absent:true, and access only their own agent memberships; they cannot edit shared labels or delete directory entries. Function credentials are not granted access. Memberships require an existing local agent connection (including revoked connections) and an existing contact. PUT requires exactly one precondition. if_absent returns an existing row unchanged when supplied fields agree; otherwise 409. notify defaults false. Off-to-on generates a new server timestamp and generation; on-to-on and purpose-only edits preserve them. Disable clears activation metadata. Deletion atomically removes membership eligibility. Receivers must recheck generation/preferences before dispatch and pause admission when their policy cache is older than 30 seconds; explicit reply waits are independent. DELETE requires if_version, returns deleted:false for an absent row, and rejects stale versions of recreated rows. Pages use ascending canonical address, with meta.cursor null on the last page. Lists are live pages, not snapshots.",
15513
+ "hasJsonBody": false,
15514
+ "method": "GET",
15515
+ "operationId": "getContact",
15516
+ "path": "/contacts/{address}",
15517
+ "pathParams": [{
15518
+ "description": "address for contacts.",
15519
+ "enum": null,
15520
+ "name": "address",
15521
+ "required": true,
15522
+ "type": "string"
15523
+ }],
15524
+ "queryParams": [],
15525
+ "requestSchema": null,
15526
+ "responseSchema": {
15527
+ "type": "object",
15528
+ "additionalProperties": false,
15529
+ "properties": {
15530
+ "address": {
15531
+ "type": "string",
15532
+ "format": "email",
15533
+ "maxLength": 254,
15534
+ "description": "Bare email address; trim and lowercase, preserving dots and plus tags."
15535
+ },
15536
+ "display_name": {
15537
+ "type": ["string", "null"],
15538
+ "maxLength": 200
15539
+ },
15540
+ "version": {
15541
+ "type": "string",
15542
+ "format": "uuid",
15543
+ "description": "Opaque CAS token. Changes on mutations and cannot be reused after deletion/recreation."
15544
+ },
15545
+ "created_at": {
15546
+ "type": "string",
15547
+ "format": "date-time"
15548
+ },
15549
+ "updated_at": {
15550
+ "type": "string",
15551
+ "format": "date-time"
15552
+ }
15553
+ },
15554
+ "required": [
15555
+ "address",
15556
+ "display_name",
15557
+ "version",
15558
+ "created_at",
15559
+ "updated_at"
15560
+ ]
15561
+ },
15562
+ "sdkName": "getContact",
15563
+ "summary": "get Contact",
15564
+ "tag": "Contacts",
15565
+ "tagCommand": "contacts"
15566
+ },
15567
+ {
15568
+ "binaryResponse": false,
15569
+ "bodyRequired": false,
15570
+ "command": "get-contact-policy",
15571
+ "description": "Receiver-side email notification admission preferences; never task, tool, code execution or account authority. Rules take effect only in receivers implementing this current contact-policy contract. Older receivers may continue their previous exact-contact notifications until updated. Ordinary email delivery, storage, webhooks and explicit reply waits remain independent of these preferences. Organization owners/admins using session, OAuth or signed dashboard credentials may read/write policies. Connected credentials may only GET their own agent composite; they cannot write either policy. Function and signed capability credentials are not granted access. Rules are unordered. Exact membership notify:false always silences. Next use matching agent rules, otherwise matching organization rules; silence wins ties within that scope. If neither scope matches, existing exact membership notify:true allows using its own activation metadata; otherwise only enabled contact-request intake is allowed. Owner policy silence therefore cannot be bypassed by a connected agent adding a notify:true membership. Patterns are canonical lowercase bare mailboxes, *@example.com, research-*@example.com or *@*.example.com. Only a terminal local-part * and a leading whole domain-label *. are supported; subdomain patterns exclude the apex and require a literal multi-label suffix. No regular expressions, question marks, universal domains or wildcard TLDs. Domain-only UI input must be converted to *@domain. PUT fully replaces up to 100 rules and the request-intake option using exactly one CAS precondition. Duplicate pattern/effect pairs are rejected. if_absent returns an identical existing document, otherwise 409. A missing document reads as empty rules, null version/timestamps, false request intake for the organization and null (inherit) for the agent. Reset overrides with empty rules and null request intake. Allow rules preserve server activation metadata while retained unchanged; removing/recreating or changing a rule to allow resets it. Request intake defaults off; agent null inherits the organization. No-op writes preserve versions. Agent composite effective_version changes with either policy document, connection identity, generation or successful claim; effective_since is the latest policy mutation, connection creation or successful claim. Reclaiming a connection invalidates prior admission snapshots and starts a fresh rule/request cutoff; routine heartbeats do not. Rule/request admissions require received_at >= both the selected activation time and effective_since. Consequently even unrelated policy edits suppress queued older rule/request admissions, without deleting email history or affecting explicit reply waits. Exact membership fallback retains its own notify_since and generation but must still recheck current policy denies and effective_version. Before dispatch, receivers must recheck the current composite version and applicable activation generation and membership; stop new admissions when policy is unavailable or older than 30 seconds. Snapshot fields explain scope and matched rules locally; the API does not execute tasks or dispatch notifications.",
15572
+ "hasJsonBody": false,
15573
+ "method": "GET",
15574
+ "operationId": "getContactPolicy",
15575
+ "path": "/contact-policy",
15576
+ "pathParams": [],
15577
+ "queryParams": [],
15578
+ "requestSchema": null,
15579
+ "responseSchema": {
15580
+ "type": "object",
15581
+ "additionalProperties": false,
15582
+ "properties": {
15583
+ "rules": {
15584
+ "type": "array",
15585
+ "maxItems": 100,
15586
+ "items": {
15587
+ "type": "object",
15588
+ "additionalProperties": false,
15589
+ "properties": {
15590
+ "pattern": {
15591
+ "type": "string",
15592
+ "maxLength": 254,
15593
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
15594
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
15595
+ },
15596
+ "effect": {
15597
+ "type": "string",
15598
+ "enum": ["allow", "silence"]
15599
+ },
15600
+ "notify_since": {
15601
+ "type": ["string", "null"],
15602
+ "format": "date-time"
15603
+ },
15604
+ "notification_generation": {
15605
+ "type": ["string", "null"],
15606
+ "format": "uuid"
15607
+ }
15608
+ },
15609
+ "required": [
15610
+ "pattern",
15611
+ "effect",
15612
+ "notify_since",
15613
+ "notification_generation"
15614
+ ]
15615
+ }
15616
+ },
15617
+ "contact_request_since": {
15618
+ "type": ["string", "null"],
15619
+ "format": "date-time"
15620
+ },
15621
+ "contact_request_generation": {
15622
+ "type": ["string", "null"],
15623
+ "format": "uuid"
15624
+ },
15625
+ "version": {
15626
+ "type": ["string", "null"],
15627
+ "format": "uuid"
15628
+ },
15629
+ "updated_at": {
15630
+ "type": ["string", "null"],
15631
+ "format": "date-time"
15632
+ },
15633
+ "allow_contact_requests": { "type": "boolean" }
15634
+ },
15635
+ "required": [
15636
+ "rules",
15637
+ "contact_request_since",
15638
+ "contact_request_generation",
15639
+ "version",
15640
+ "updated_at",
15641
+ "allow_contact_requests"
15642
+ ]
15643
+ },
15644
+ "sdkName": "getContactPolicy",
15645
+ "summary": "Read organization contact policy",
15646
+ "tag": "Contacts",
15647
+ "tagCommand": "contacts"
15648
+ },
15649
+ {
15650
+ "binaryResponse": false,
15651
+ "bodyRequired": false,
15652
+ "command": "list-agent-contacts",
15653
+ "description": "Organization directory and agent preferences; no profiles, message history or runtime presence. Existing organization credentials use tenant permissions. Connected keys may read the directory, create address-only missing contacts using if_absent:true, and access only their own agent memberships; they cannot edit shared labels or delete directory entries. Function credentials are not granted access. Memberships require an existing local agent connection (including revoked connections) and an existing contact. PUT requires exactly one precondition. if_absent returns an existing row unchanged when supplied fields agree; otherwise 409. notify defaults false. Off-to-on generates a new server timestamp and generation; on-to-on and purpose-only edits preserve them. Disable clears activation metadata. Deletion atomically removes membership eligibility. Receivers must recheck generation/preferences before dispatch and pause admission when their policy cache is older than 30 seconds; explicit reply waits are independent. DELETE requires if_version, returns deleted:false for an absent row, and rejects stale versions of recreated rows. Pages use ascending canonical address, with meta.cursor null on the last page. Lists are live pages, not snapshots.",
15654
+ "hasJsonBody": false,
15655
+ "method": "GET",
15656
+ "operationId": "listAgentContacts",
15657
+ "path": "/agent-contacts/{agent_address}",
15658
+ "pathParams": [{
15659
+ "description": "agent_address for contacts.",
15660
+ "enum": null,
15661
+ "name": "agent_address",
15662
+ "required": true,
15663
+ "type": "string"
14990
15664
  }],
14991
15665
  "queryParams": [{
14992
15666
  "description": "cursor for contacts.",
@@ -15257,16 +15931,16 @@ const operationManifest = [
15257
15931
  {
15258
15932
  "binaryResponse": false,
15259
15933
  "bodyRequired": true,
15260
- "command": "put-contact",
15261
- "description": "Organization directory and agent preferences; no profiles, message history or runtime presence. Existing organization credentials use tenant permissions. Connected keys may read the directory, create address-only missing contacts using if_absent:true, and access only their own agent memberships; they cannot edit shared labels or delete directory entries. Function credentials are not granted access. Memberships require an existing local agent connection (including revoked connections) and an existing contact. PUT requires exactly one precondition. if_absent returns an existing row unchanged when supplied fields agree; otherwise 409. notify defaults false. Off-to-on generates a new server timestamp and generation; on-to-on and purpose-only edits preserve them. Disable clears activation metadata. Deletion atomically removes membership eligibility. Receivers must recheck generation/preferences before dispatch and pause admission when their policy cache is older than 30 seconds; explicit reply waits are independent. DELETE requires if_version, returns deleted:false for an absent row, and rejects stale versions of recreated rows. Pages use ascending canonical address, with meta.cursor null on the last page. Lists are live pages, not snapshots.",
15934
+ "command": "put-agent-contact-policy",
15935
+ "description": "Receiver-side email notification admission preferences; never task, tool, code execution or account authority. Rules take effect only in receivers implementing this current contact-policy contract. Older receivers may continue their previous exact-contact notifications until updated. Ordinary email delivery, storage, webhooks and explicit reply waits remain independent of these preferences. Organization owners/admins using session, OAuth or signed dashboard credentials may read/write policies. Connected credentials may only GET their own agent composite; they cannot write either policy. Function and signed capability credentials are not granted access. Rules are unordered. Exact membership notify:false always silences. Next use matching agent rules, otherwise matching organization rules; silence wins ties within that scope. If neither scope matches, existing exact membership notify:true allows using its own activation metadata; otherwise only enabled contact-request intake is allowed. Owner policy silence therefore cannot be bypassed by a connected agent adding a notify:true membership. Patterns are canonical lowercase bare mailboxes, *@example.com, research-*@example.com or *@*.example.com. Only a terminal local-part * and a leading whole domain-label *. are supported; subdomain patterns exclude the apex and require a literal multi-label suffix. No regular expressions, question marks, universal domains or wildcard TLDs. Domain-only UI input must be converted to *@domain. PUT fully replaces up to 100 rules and the request-intake option using exactly one CAS precondition. Duplicate pattern/effect pairs are rejected. if_absent returns an identical existing document, otherwise 409. A missing document reads as empty rules, null version/timestamps, false request intake for the organization and null (inherit) for the agent. Reset overrides with empty rules and null request intake. Allow rules preserve server activation metadata while retained unchanged; removing/recreating or changing a rule to allow resets it. Request intake defaults off; agent null inherits the organization. No-op writes preserve versions. Agent composite effective_version changes with either policy document, connection identity, generation or successful claim; effective_since is the latest policy mutation, connection creation or successful claim. Reclaiming a connection invalidates prior admission snapshots and starts a fresh rule/request cutoff; routine heartbeats do not. Rule/request admissions require received_at >= both the selected activation time and effective_since. Consequently even unrelated policy edits suppress queued older rule/request admissions, without deleting email history or affecting explicit reply waits. Exact membership fallback retains its own notify_since and generation but must still recheck current policy denies and effective_version. Before dispatch, receivers must recheck the current composite version and applicable activation generation and membership; stop new admissions when policy is unavailable or older than 30 seconds. Snapshot fields explain scope and matched rules locally; the API does not execute tasks or dispatch notifications.",
15262
15936
  "hasJsonBody": true,
15263
15937
  "method": "PUT",
15264
- "operationId": "putContact",
15265
- "path": "/contacts/{address}",
15938
+ "operationId": "putAgentContactPolicy",
15939
+ "path": "/agent-contact-policy/{agent_address}",
15266
15940
  "pathParams": [{
15267
- "description": "address for contacts.",
15941
+ "description": "Canonical address of an agent connection in the current organization.",
15268
15942
  "enum": null,
15269
- "name": "address",
15943
+ "name": "agent_address",
15270
15944
  "required": true,
15271
15945
  "type": "string"
15272
15946
  }],
@@ -15275,12 +15949,275 @@ const operationManifest = [
15275
15949
  "type": "object",
15276
15950
  "additionalProperties": false,
15277
15951
  "properties": {
15278
- "display_name": {
15279
- "type": ["string", "null"],
15280
- "maxLength": 200
15281
- },
15282
- "if_absent": {
15283
- "type": "boolean",
15952
+ "rules": {
15953
+ "type": "array",
15954
+ "maxItems": 100,
15955
+ "items": {
15956
+ "type": "object",
15957
+ "additionalProperties": false,
15958
+ "properties": {
15959
+ "pattern": {
15960
+ "type": "string",
15961
+ "maxLength": 254,
15962
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
15963
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
15964
+ },
15965
+ "effect": {
15966
+ "type": "string",
15967
+ "enum": ["allow", "silence"]
15968
+ }
15969
+ },
15970
+ "required": ["pattern", "effect"]
15971
+ }
15972
+ },
15973
+ "allow_contact_requests": { "type": ["boolean", "null"] },
15974
+ "if_absent": {
15975
+ "type": "boolean",
15976
+ "const": true
15977
+ }
15978
+ },
15979
+ "required": [
15980
+ "rules",
15981
+ "allow_contact_requests",
15982
+ "if_absent"
15983
+ ]
15984
+ }, {
15985
+ "type": "object",
15986
+ "additionalProperties": false,
15987
+ "properties": {
15988
+ "rules": {
15989
+ "type": "array",
15990
+ "maxItems": 100,
15991
+ "items": {
15992
+ "type": "object",
15993
+ "additionalProperties": false,
15994
+ "properties": {
15995
+ "pattern": {
15996
+ "type": "string",
15997
+ "maxLength": 254,
15998
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
15999
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
16000
+ },
16001
+ "effect": {
16002
+ "type": "string",
16003
+ "enum": ["allow", "silence"]
16004
+ }
16005
+ },
16006
+ "required": ["pattern", "effect"]
16007
+ }
16008
+ },
16009
+ "allow_contact_requests": { "type": ["boolean", "null"] },
16010
+ "if_version": {
16011
+ "type": "string",
16012
+ "format": "uuid"
16013
+ }
16014
+ },
16015
+ "required": [
16016
+ "rules",
16017
+ "allow_contact_requests",
16018
+ "if_version"
16019
+ ]
16020
+ }] },
16021
+ "responseSchema": {
16022
+ "type": "object",
16023
+ "additionalProperties": false,
16024
+ "properties": {
16025
+ "agent_address": {
16026
+ "type": "string",
16027
+ "format": "email",
16028
+ "maxLength": 254
16029
+ },
16030
+ "org_policy": {
16031
+ "type": "object",
16032
+ "additionalProperties": false,
16033
+ "properties": {
16034
+ "rules": {
16035
+ "type": "array",
16036
+ "maxItems": 100,
16037
+ "items": {
16038
+ "type": "object",
16039
+ "additionalProperties": false,
16040
+ "properties": {
16041
+ "pattern": {
16042
+ "type": "string",
16043
+ "maxLength": 254,
16044
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
16045
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
16046
+ },
16047
+ "effect": {
16048
+ "type": "string",
16049
+ "enum": ["allow", "silence"]
16050
+ },
16051
+ "notify_since": {
16052
+ "type": ["string", "null"],
16053
+ "format": "date-time"
16054
+ },
16055
+ "notification_generation": {
16056
+ "type": ["string", "null"],
16057
+ "format": "uuid"
16058
+ }
16059
+ },
16060
+ "required": [
16061
+ "pattern",
16062
+ "effect",
16063
+ "notify_since",
16064
+ "notification_generation"
16065
+ ]
16066
+ }
16067
+ },
16068
+ "contact_request_since": {
16069
+ "type": ["string", "null"],
16070
+ "format": "date-time"
16071
+ },
16072
+ "contact_request_generation": {
16073
+ "type": ["string", "null"],
16074
+ "format": "uuid"
16075
+ },
16076
+ "version": {
16077
+ "type": ["string", "null"],
16078
+ "format": "uuid"
16079
+ },
16080
+ "updated_at": {
16081
+ "type": ["string", "null"],
16082
+ "format": "date-time"
16083
+ },
16084
+ "allow_contact_requests": { "type": "boolean" }
16085
+ },
16086
+ "required": [
16087
+ "rules",
16088
+ "contact_request_since",
16089
+ "contact_request_generation",
16090
+ "version",
16091
+ "updated_at",
16092
+ "allow_contact_requests"
16093
+ ]
16094
+ },
16095
+ "agent_policy": {
16096
+ "type": "object",
16097
+ "additionalProperties": false,
16098
+ "properties": {
16099
+ "rules": {
16100
+ "type": "array",
16101
+ "maxItems": 100,
16102
+ "items": {
16103
+ "type": "object",
16104
+ "additionalProperties": false,
16105
+ "properties": {
16106
+ "pattern": {
16107
+ "type": "string",
16108
+ "maxLength": 254,
16109
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
16110
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
16111
+ },
16112
+ "effect": {
16113
+ "type": "string",
16114
+ "enum": ["allow", "silence"]
16115
+ },
16116
+ "notify_since": {
16117
+ "type": ["string", "null"],
16118
+ "format": "date-time"
16119
+ },
16120
+ "notification_generation": {
16121
+ "type": ["string", "null"],
16122
+ "format": "uuid"
16123
+ }
16124
+ },
16125
+ "required": [
16126
+ "pattern",
16127
+ "effect",
16128
+ "notify_since",
16129
+ "notification_generation"
16130
+ ]
16131
+ }
16132
+ },
16133
+ "contact_request_since": {
16134
+ "type": ["string", "null"],
16135
+ "format": "date-time"
16136
+ },
16137
+ "contact_request_generation": {
16138
+ "type": ["string", "null"],
16139
+ "format": "uuid"
16140
+ },
16141
+ "version": {
16142
+ "type": ["string", "null"],
16143
+ "format": "uuid"
16144
+ },
16145
+ "updated_at": {
16146
+ "type": ["string", "null"],
16147
+ "format": "date-time"
16148
+ },
16149
+ "allow_contact_requests": { "type": ["boolean", "null"] }
16150
+ },
16151
+ "required": [
16152
+ "rules",
16153
+ "contact_request_since",
16154
+ "contact_request_generation",
16155
+ "version",
16156
+ "updated_at",
16157
+ "allow_contact_requests"
16158
+ ]
16159
+ },
16160
+ "effective_version": {
16161
+ "type": "string",
16162
+ "pattern": "^[a-f0-9]{64}$"
16163
+ },
16164
+ "effective_since": {
16165
+ "type": "string",
16166
+ "format": "date-time"
16167
+ },
16168
+ "allow_contact_requests": { "type": "boolean" },
16169
+ "contact_request_since": {
16170
+ "type": ["string", "null"],
16171
+ "format": "date-time"
16172
+ },
16173
+ "contact_request_generation": {
16174
+ "type": ["string", "null"],
16175
+ "pattern": "^[a-f0-9]{64}$"
16176
+ }
16177
+ },
16178
+ "required": [
16179
+ "agent_address",
16180
+ "org_policy",
16181
+ "agent_policy",
16182
+ "effective_version",
16183
+ "effective_since",
16184
+ "allow_contact_requests",
16185
+ "contact_request_since",
16186
+ "contact_request_generation"
16187
+ ]
16188
+ },
16189
+ "sdkName": "putAgentContactPolicy",
16190
+ "summary": "Replace agent contact policy",
16191
+ "tag": "Contacts",
16192
+ "tagCommand": "contacts"
16193
+ },
16194
+ {
16195
+ "binaryResponse": false,
16196
+ "bodyRequired": true,
16197
+ "command": "put-contact",
16198
+ "description": "Organization directory and agent preferences; no profiles, message history or runtime presence. Existing organization credentials use tenant permissions. Connected keys may read the directory, create address-only missing contacts using if_absent:true, and access only their own agent memberships; they cannot edit shared labels or delete directory entries. Function credentials are not granted access. Memberships require an existing local agent connection (including revoked connections) and an existing contact. PUT requires exactly one precondition. if_absent returns an existing row unchanged when supplied fields agree; otherwise 409. notify defaults false. Off-to-on generates a new server timestamp and generation; on-to-on and purpose-only edits preserve them. Disable clears activation metadata. Deletion atomically removes membership eligibility. Receivers must recheck generation/preferences before dispatch and pause admission when their policy cache is older than 30 seconds; explicit reply waits are independent. DELETE requires if_version, returns deleted:false for an absent row, and rejects stale versions of recreated rows. Pages use ascending canonical address, with meta.cursor null on the last page. Lists are live pages, not snapshots.",
16199
+ "hasJsonBody": true,
16200
+ "method": "PUT",
16201
+ "operationId": "putContact",
16202
+ "path": "/contacts/{address}",
16203
+ "pathParams": [{
16204
+ "description": "address for contacts.",
16205
+ "enum": null,
16206
+ "name": "address",
16207
+ "required": true,
16208
+ "type": "string"
16209
+ }],
16210
+ "queryParams": [],
16211
+ "requestSchema": { "oneOf": [{
16212
+ "type": "object",
16213
+ "additionalProperties": false,
16214
+ "properties": {
16215
+ "display_name": {
16216
+ "type": ["string", "null"],
16217
+ "maxLength": 200
16218
+ },
16219
+ "if_absent": {
16220
+ "type": "boolean",
15284
16221
  "const": true
15285
16222
  }
15286
16223
  },
@@ -15342,6 +16279,160 @@ const operationManifest = [
15342
16279
  "tag": "Contacts",
15343
16280
  "tagCommand": "contacts"
15344
16281
  },
16282
+ {
16283
+ "binaryResponse": false,
16284
+ "bodyRequired": true,
16285
+ "command": "put-contact-policy",
16286
+ "description": "Receiver-side email notification admission preferences; never task, tool, code execution or account authority. Rules take effect only in receivers implementing this current contact-policy contract. Older receivers may continue their previous exact-contact notifications until updated. Ordinary email delivery, storage, webhooks and explicit reply waits remain independent of these preferences. Organization owners/admins using session, OAuth or signed dashboard credentials may read/write policies. Connected credentials may only GET their own agent composite; they cannot write either policy. Function and signed capability credentials are not granted access. Rules are unordered. Exact membership notify:false always silences. Next use matching agent rules, otherwise matching organization rules; silence wins ties within that scope. If neither scope matches, existing exact membership notify:true allows using its own activation metadata; otherwise only enabled contact-request intake is allowed. Owner policy silence therefore cannot be bypassed by a connected agent adding a notify:true membership. Patterns are canonical lowercase bare mailboxes, *@example.com, research-*@example.com or *@*.example.com. Only a terminal local-part * and a leading whole domain-label *. are supported; subdomain patterns exclude the apex and require a literal multi-label suffix. No regular expressions, question marks, universal domains or wildcard TLDs. Domain-only UI input must be converted to *@domain. PUT fully replaces up to 100 rules and the request-intake option using exactly one CAS precondition. Duplicate pattern/effect pairs are rejected. if_absent returns an identical existing document, otherwise 409. A missing document reads as empty rules, null version/timestamps, false request intake for the organization and null (inherit) for the agent. Reset overrides with empty rules and null request intake. Allow rules preserve server activation metadata while retained unchanged; removing/recreating or changing a rule to allow resets it. Request intake defaults off; agent null inherits the organization. No-op writes preserve versions. Agent composite effective_version changes with either policy document, connection identity, generation or successful claim; effective_since is the latest policy mutation, connection creation or successful claim. Reclaiming a connection invalidates prior admission snapshots and starts a fresh rule/request cutoff; routine heartbeats do not. Rule/request admissions require received_at >= both the selected activation time and effective_since. Consequently even unrelated policy edits suppress queued older rule/request admissions, without deleting email history or affecting explicit reply waits. Exact membership fallback retains its own notify_since and generation but must still recheck current policy denies and effective_version. Before dispatch, receivers must recheck the current composite version and applicable activation generation and membership; stop new admissions when policy is unavailable or older than 30 seconds. Snapshot fields explain scope and matched rules locally; the API does not execute tasks or dispatch notifications.",
16287
+ "hasJsonBody": true,
16288
+ "method": "PUT",
16289
+ "operationId": "putContactPolicy",
16290
+ "path": "/contact-policy",
16291
+ "pathParams": [],
16292
+ "queryParams": [],
16293
+ "requestSchema": { "oneOf": [{
16294
+ "type": "object",
16295
+ "additionalProperties": false,
16296
+ "properties": {
16297
+ "rules": {
16298
+ "type": "array",
16299
+ "maxItems": 100,
16300
+ "items": {
16301
+ "type": "object",
16302
+ "additionalProperties": false,
16303
+ "properties": {
16304
+ "pattern": {
16305
+ "type": "string",
16306
+ "maxLength": 254,
16307
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
16308
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
16309
+ },
16310
+ "effect": {
16311
+ "type": "string",
16312
+ "enum": ["allow", "silence"]
16313
+ }
16314
+ },
16315
+ "required": ["pattern", "effect"]
16316
+ }
16317
+ },
16318
+ "allow_contact_requests": { "type": "boolean" },
16319
+ "if_absent": {
16320
+ "type": "boolean",
16321
+ "const": true
16322
+ }
16323
+ },
16324
+ "required": [
16325
+ "rules",
16326
+ "allow_contact_requests",
16327
+ "if_absent"
16328
+ ]
16329
+ }, {
16330
+ "type": "object",
16331
+ "additionalProperties": false,
16332
+ "properties": {
16333
+ "rules": {
16334
+ "type": "array",
16335
+ "maxItems": 100,
16336
+ "items": {
16337
+ "type": "object",
16338
+ "additionalProperties": false,
16339
+ "properties": {
16340
+ "pattern": {
16341
+ "type": "string",
16342
+ "maxLength": 254,
16343
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
16344
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
16345
+ },
16346
+ "effect": {
16347
+ "type": "string",
16348
+ "enum": ["allow", "silence"]
16349
+ }
16350
+ },
16351
+ "required": ["pattern", "effect"]
16352
+ }
16353
+ },
16354
+ "allow_contact_requests": { "type": "boolean" },
16355
+ "if_version": {
16356
+ "type": "string",
16357
+ "format": "uuid"
16358
+ }
16359
+ },
16360
+ "required": [
16361
+ "rules",
16362
+ "allow_contact_requests",
16363
+ "if_version"
16364
+ ]
16365
+ }] },
16366
+ "responseSchema": {
16367
+ "type": "object",
16368
+ "additionalProperties": false,
16369
+ "properties": {
16370
+ "rules": {
16371
+ "type": "array",
16372
+ "maxItems": 100,
16373
+ "items": {
16374
+ "type": "object",
16375
+ "additionalProperties": false,
16376
+ "properties": {
16377
+ "pattern": {
16378
+ "type": "string",
16379
+ "maxLength": 254,
16380
+ "pattern": "^[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*[\\x00-\\x7f]*[\\x09-\\x0d\\x20\xA0  - \u2028\u2029   ]*$",
16381
+ "description": "Trim outer whitespace, then require ASCII before lowercase normalization. Exact mailbox or restricted mailbox glob. See operation description."
16382
+ },
16383
+ "effect": {
16384
+ "type": "string",
16385
+ "enum": ["allow", "silence"]
16386
+ },
16387
+ "notify_since": {
16388
+ "type": ["string", "null"],
16389
+ "format": "date-time"
16390
+ },
16391
+ "notification_generation": {
16392
+ "type": ["string", "null"],
16393
+ "format": "uuid"
16394
+ }
16395
+ },
16396
+ "required": [
16397
+ "pattern",
16398
+ "effect",
16399
+ "notify_since",
16400
+ "notification_generation"
16401
+ ]
16402
+ }
16403
+ },
16404
+ "contact_request_since": {
16405
+ "type": ["string", "null"],
16406
+ "format": "date-time"
16407
+ },
16408
+ "contact_request_generation": {
16409
+ "type": ["string", "null"],
16410
+ "format": "uuid"
16411
+ },
16412
+ "version": {
16413
+ "type": ["string", "null"],
16414
+ "format": "uuid"
16415
+ },
16416
+ "updated_at": {
16417
+ "type": ["string", "null"],
16418
+ "format": "date-time"
16419
+ },
16420
+ "allow_contact_requests": { "type": "boolean" }
16421
+ },
16422
+ "required": [
16423
+ "rules",
16424
+ "contact_request_since",
16425
+ "contact_request_generation",
16426
+ "version",
16427
+ "updated_at",
16428
+ "allow_contact_requests"
16429
+ ]
16430
+ },
16431
+ "sdkName": "putContactPolicy",
16432
+ "summary": "Replace organization contact policy",
16433
+ "tag": "Contacts",
16434
+ "tagCommand": "contacts"
16435
+ },
15345
16436
  {
15346
16437
  "binaryResponse": false,
15347
16438
  "bodyRequired": false,