@pidgeon-ai/sdk 1.26.0 → 1.28.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,25 @@ the two would publish a release for every unrelated product deploy.
7
7
  Semver applies to **this package's own surface** — the exported names, the
8
8
  call shapes, the result shape — not to the API behind it.
9
9
 
10
+ ## 1.28.0 — DNS hosts for subdomains, and why a record is waiting
11
+
12
+ Every DNS record (`domainsGet`, `domainsCreate`, `domainsVerify`) gains
13
+ `zone`, `fqdn` and `host_relative`: for `agents.example.com` the DMARC record
14
+ is `_dmarc.agents` in `example.com`, which is what Squarespace, GoDaddy and
15
+ Namecheap ask for. `name` is unchanged. `state` says why `status` is what it
16
+ is — `published` (correct in DNS, waiting on Amazon), `missing`,
17
+ `wrong_value` or `wrong_name` — and `found_at` is where a misplaced record was
18
+ found. For DKIM, `found` is now the CNAME read from DNS rather than Amazon's
19
+ status word. Additive.
20
+
21
+ ## 1.27.0 — a key that drafts and never sends
22
+
23
+ `keysCreate` takes `access: 'draft'`, between `read` and `send`: the key
24
+ reads, searches, labels, archives, trashes, updates and hands off threads,
25
+ and creates, updates and deletes drafts. Every send, reply, forward, draft
26
+ send, schedule, calendar write and app password answers `403`. `access` on a
27
+ key, `me` and mailbox access can now be `'draft'`. Additive.
28
+
10
29
  ## 1.26.0 — provisioning and teardown by pod
11
30
 
12
31
  `podsCreate` takes `address` (the same fields as `identitiesCreate`) and `key`
package/dist/index.d.cts CHANGED
@@ -1282,11 +1282,34 @@ type DomainDetail = {
1282
1282
  dns_records: Array<{
1283
1283
  type: string;
1284
1284
  record_type: string;
1285
+ /**
1286
+ * Relative to the domain: `@` is the domain itself. Kept as it was; see `host_relative`.
1287
+ */
1285
1288
  name: string;
1289
+ /**
1290
+ * The registrable domain the record is published in, from the Public Suffix List: `example.com` for `agents.example.com`.
1291
+ */
1292
+ zone: string;
1293
+ /**
1294
+ * The full name, no trailing dot: `_dmarc.agents.example.com`.
1295
+ */
1296
+ fqdn: string;
1297
+ /**
1298
+ * The name relative to `zone`, which is what most DNS panels ask for: `_dmarc.agents`, or `@` for the zone itself.
1299
+ */
1300
+ host_relative: string;
1286
1301
  value: string;
1287
1302
  priority: number | null;
1288
1303
  status: 'connected' | 'waiting' | 'incorrect' | 'not_required';
1304
+ /**
1305
+ * Why `status` is what it is. `published`: correct in public DNS, waiting on the mail provider to confirm (DKIM; usually under an hour). `wrong_name`: our value is at `found_at` instead, often the zone typed twice. Null before the first check.
1306
+ */
1307
+ state: 'connected' | 'published' | 'missing' | 'wrong_value' | 'wrong_name' | 'not_required' | null;
1289
1308
  found: string | null;
1309
+ /**
1310
+ * Where `found` was read, when that was not `fqdn`.
1311
+ */
1312
+ found_at: string | null;
1290
1313
  description: string;
1291
1314
  checked_at: string | null;
1292
1315
  }>;
@@ -1295,11 +1318,34 @@ type DomainDetail = {
1295
1318
  type DnsRecord = {
1296
1319
  type: string;
1297
1320
  record_type: string;
1321
+ /**
1322
+ * Relative to the domain: `@` is the domain itself. Kept as it was; see `host_relative`.
1323
+ */
1298
1324
  name: string;
1325
+ /**
1326
+ * The registrable domain the record is published in, from the Public Suffix List: `example.com` for `agents.example.com`.
1327
+ */
1328
+ zone: string;
1329
+ /**
1330
+ * The full name, no trailing dot: `_dmarc.agents.example.com`.
1331
+ */
1332
+ fqdn: string;
1333
+ /**
1334
+ * The name relative to `zone`, which is what most DNS panels ask for: `_dmarc.agents`, or `@` for the zone itself.
1335
+ */
1336
+ host_relative: string;
1299
1337
  value: string;
1300
1338
  priority: number | null;
1301
1339
  status: 'connected' | 'waiting' | 'incorrect' | 'not_required';
1340
+ /**
1341
+ * Why `status` is what it is. `published`: correct in public DNS, waiting on the mail provider to confirm (DKIM; usually under an hour). `wrong_name`: our value is at `found_at` instead, often the zone typed twice. Null before the first check.
1342
+ */
1343
+ state: 'connected' | 'published' | 'missing' | 'wrong_value' | 'wrong_name' | 'not_required' | null;
1302
1344
  found: string | null;
1345
+ /**
1346
+ * Where `found` was read, when that was not `fqdn`.
1347
+ */
1348
+ found_at: string | null;
1303
1349
  description: string;
1304
1350
  checked_at: string | null;
1305
1351
  };
@@ -1310,11 +1356,34 @@ type Verification = {
1310
1356
  dns_records: Array<{
1311
1357
  type: string;
1312
1358
  record_type: string;
1359
+ /**
1360
+ * Relative to the domain: `@` is the domain itself. Kept as it was; see `host_relative`.
1361
+ */
1313
1362
  name: string;
1363
+ /**
1364
+ * The registrable domain the record is published in, from the Public Suffix List: `example.com` for `agents.example.com`.
1365
+ */
1366
+ zone: string;
1367
+ /**
1368
+ * The full name, no trailing dot: `_dmarc.agents.example.com`.
1369
+ */
1370
+ fqdn: string;
1371
+ /**
1372
+ * The name relative to `zone`, which is what most DNS panels ask for: `_dmarc.agents`, or `@` for the zone itself.
1373
+ */
1374
+ host_relative: string;
1314
1375
  value: string;
1315
1376
  priority: number | null;
1316
1377
  status: 'connected' | 'waiting' | 'incorrect' | 'not_required';
1378
+ /**
1379
+ * Why `status` is what it is. `published`: correct in public DNS, waiting on the mail provider to confirm (DKIM; usually under an hour). `wrong_name`: our value is at `found_at` instead, often the zone typed twice. Null before the first check.
1380
+ */
1381
+ state: 'connected' | 'published' | 'missing' | 'wrong_value' | 'wrong_name' | 'not_required' | null;
1317
1382
  found: string | null;
1383
+ /**
1384
+ * Where `found` was read, when that was not `fqdn`.
1385
+ */
1386
+ found_at: string | null;
1318
1387
  description: string;
1319
1388
  checked_at: string | null;
1320
1389
  }>;
@@ -1369,7 +1438,7 @@ type ApiKey = {
1369
1438
  /**
1370
1439
  * The highest rung on any address. Composed with the grant; lower wins.
1371
1440
  */
1372
- access: 'read' | 'send' | 'admin';
1441
+ access: 'read' | 'draft' | 'send' | 'admin';
1373
1442
  created_by_key_id: string | null;
1374
1443
  last_used_at: string | null;
1375
1444
  revoked_at: string | null;
@@ -1402,7 +1471,7 @@ type ApiKeyCreated = {
1402
1471
  /**
1403
1472
  * The highest rung on any address. Composed with the grant; lower wins.
1404
1473
  */
1405
- access: 'read' | 'send' | 'admin';
1474
+ access: 'read' | 'draft' | 'send' | 'admin';
1406
1475
  created_by_key_id: string | null;
1407
1476
  last_used_at: string | null;
1408
1477
  revoked_at: string | null;
@@ -1465,7 +1534,7 @@ type Me = {
1465
1534
  /**
1466
1535
  * The highest rung this key reaches on any address. Composed with the grant on the address itself — the lower of the two wins — so this is a ceiling, not a promise.
1467
1536
  */
1468
- access: 'read' | 'send' | 'admin';
1537
+ access: 'read' | 'draft' | 'send' | 'admin';
1469
1538
  /**
1470
1539
  * True when it reaches every address the workspace owns, including ones created after it. False when it reaches a fixed list.
1471
1540
  */
@@ -1610,7 +1679,10 @@ type MailboxAccess = {
1610
1679
  * For showing a person. A renamed key changes it; never match on it.
1611
1680
  */
1612
1681
  label: string;
1613
- access: 'read' | 'send' | 'admin';
1682
+ /**
1683
+ * What this principal can do here. A key shows the lower of its ceiling and the grant.
1684
+ */
1685
+ access: 'read' | 'draft' | 'send' | 'admin';
1614
1686
  }>;
1615
1687
  /**
1616
1688
  * Whether this credential may change any of the above.
@@ -1825,7 +1897,7 @@ type PodCreated = {
1825
1897
  /**
1826
1898
  * The highest rung on any address. Composed with the grant; lower wins.
1827
1899
  */
1828
- access: 'read' | 'send' | 'admin';
1900
+ access: 'read' | 'draft' | 'send' | 'admin';
1829
1901
  created_by_key_id: string | null;
1830
1902
  last_used_at: string | null;
1831
1903
  revoked_at: string | null;
@@ -3105,7 +3177,7 @@ type PodsCreateData = {
3105
3177
  */
3106
3178
  key?: {
3107
3179
  name?: string;
3108
- access?: 'read' | 'send' | 'admin';
3180
+ access?: 'read' | 'draft' | 'send' | 'admin';
3109
3181
  expires_at?: string | null;
3110
3182
  /**
3111
3183
  * Mint a test-mode key (`pgn_test_`) for the pod instead of a live one.
@@ -5840,7 +5912,7 @@ type KeysCreateData = {
5840
5912
  /**
5841
5913
  * What a key may do. Give an agent the narrowest one that works.
5842
5914
  */
5843
- access?: 'read' | 'send' | 'admin';
5915
+ access?: 'read' | 'draft' | 'send' | 'admin';
5844
5916
  /**
5845
5917
  * When it stops accepting mail. Expiry suspends; it never deletes, so the correspondence survives.
5846
5918
  */
package/dist/index.d.ts CHANGED
@@ -1282,11 +1282,34 @@ type DomainDetail = {
1282
1282
  dns_records: Array<{
1283
1283
  type: string;
1284
1284
  record_type: string;
1285
+ /**
1286
+ * Relative to the domain: `@` is the domain itself. Kept as it was; see `host_relative`.
1287
+ */
1285
1288
  name: string;
1289
+ /**
1290
+ * The registrable domain the record is published in, from the Public Suffix List: `example.com` for `agents.example.com`.
1291
+ */
1292
+ zone: string;
1293
+ /**
1294
+ * The full name, no trailing dot: `_dmarc.agents.example.com`.
1295
+ */
1296
+ fqdn: string;
1297
+ /**
1298
+ * The name relative to `zone`, which is what most DNS panels ask for: `_dmarc.agents`, or `@` for the zone itself.
1299
+ */
1300
+ host_relative: string;
1286
1301
  value: string;
1287
1302
  priority: number | null;
1288
1303
  status: 'connected' | 'waiting' | 'incorrect' | 'not_required';
1304
+ /**
1305
+ * Why `status` is what it is. `published`: correct in public DNS, waiting on the mail provider to confirm (DKIM; usually under an hour). `wrong_name`: our value is at `found_at` instead, often the zone typed twice. Null before the first check.
1306
+ */
1307
+ state: 'connected' | 'published' | 'missing' | 'wrong_value' | 'wrong_name' | 'not_required' | null;
1289
1308
  found: string | null;
1309
+ /**
1310
+ * Where `found` was read, when that was not `fqdn`.
1311
+ */
1312
+ found_at: string | null;
1290
1313
  description: string;
1291
1314
  checked_at: string | null;
1292
1315
  }>;
@@ -1295,11 +1318,34 @@ type DomainDetail = {
1295
1318
  type DnsRecord = {
1296
1319
  type: string;
1297
1320
  record_type: string;
1321
+ /**
1322
+ * Relative to the domain: `@` is the domain itself. Kept as it was; see `host_relative`.
1323
+ */
1298
1324
  name: string;
1325
+ /**
1326
+ * The registrable domain the record is published in, from the Public Suffix List: `example.com` for `agents.example.com`.
1327
+ */
1328
+ zone: string;
1329
+ /**
1330
+ * The full name, no trailing dot: `_dmarc.agents.example.com`.
1331
+ */
1332
+ fqdn: string;
1333
+ /**
1334
+ * The name relative to `zone`, which is what most DNS panels ask for: `_dmarc.agents`, or `@` for the zone itself.
1335
+ */
1336
+ host_relative: string;
1299
1337
  value: string;
1300
1338
  priority: number | null;
1301
1339
  status: 'connected' | 'waiting' | 'incorrect' | 'not_required';
1340
+ /**
1341
+ * Why `status` is what it is. `published`: correct in public DNS, waiting on the mail provider to confirm (DKIM; usually under an hour). `wrong_name`: our value is at `found_at` instead, often the zone typed twice. Null before the first check.
1342
+ */
1343
+ state: 'connected' | 'published' | 'missing' | 'wrong_value' | 'wrong_name' | 'not_required' | null;
1302
1344
  found: string | null;
1345
+ /**
1346
+ * Where `found` was read, when that was not `fqdn`.
1347
+ */
1348
+ found_at: string | null;
1303
1349
  description: string;
1304
1350
  checked_at: string | null;
1305
1351
  };
@@ -1310,11 +1356,34 @@ type Verification = {
1310
1356
  dns_records: Array<{
1311
1357
  type: string;
1312
1358
  record_type: string;
1359
+ /**
1360
+ * Relative to the domain: `@` is the domain itself. Kept as it was; see `host_relative`.
1361
+ */
1313
1362
  name: string;
1363
+ /**
1364
+ * The registrable domain the record is published in, from the Public Suffix List: `example.com` for `agents.example.com`.
1365
+ */
1366
+ zone: string;
1367
+ /**
1368
+ * The full name, no trailing dot: `_dmarc.agents.example.com`.
1369
+ */
1370
+ fqdn: string;
1371
+ /**
1372
+ * The name relative to `zone`, which is what most DNS panels ask for: `_dmarc.agents`, or `@` for the zone itself.
1373
+ */
1374
+ host_relative: string;
1314
1375
  value: string;
1315
1376
  priority: number | null;
1316
1377
  status: 'connected' | 'waiting' | 'incorrect' | 'not_required';
1378
+ /**
1379
+ * Why `status` is what it is. `published`: correct in public DNS, waiting on the mail provider to confirm (DKIM; usually under an hour). `wrong_name`: our value is at `found_at` instead, often the zone typed twice. Null before the first check.
1380
+ */
1381
+ state: 'connected' | 'published' | 'missing' | 'wrong_value' | 'wrong_name' | 'not_required' | null;
1317
1382
  found: string | null;
1383
+ /**
1384
+ * Where `found` was read, when that was not `fqdn`.
1385
+ */
1386
+ found_at: string | null;
1318
1387
  description: string;
1319
1388
  checked_at: string | null;
1320
1389
  }>;
@@ -1369,7 +1438,7 @@ type ApiKey = {
1369
1438
  /**
1370
1439
  * The highest rung on any address. Composed with the grant; lower wins.
1371
1440
  */
1372
- access: 'read' | 'send' | 'admin';
1441
+ access: 'read' | 'draft' | 'send' | 'admin';
1373
1442
  created_by_key_id: string | null;
1374
1443
  last_used_at: string | null;
1375
1444
  revoked_at: string | null;
@@ -1402,7 +1471,7 @@ type ApiKeyCreated = {
1402
1471
  /**
1403
1472
  * The highest rung on any address. Composed with the grant; lower wins.
1404
1473
  */
1405
- access: 'read' | 'send' | 'admin';
1474
+ access: 'read' | 'draft' | 'send' | 'admin';
1406
1475
  created_by_key_id: string | null;
1407
1476
  last_used_at: string | null;
1408
1477
  revoked_at: string | null;
@@ -1465,7 +1534,7 @@ type Me = {
1465
1534
  /**
1466
1535
  * The highest rung this key reaches on any address. Composed with the grant on the address itself — the lower of the two wins — so this is a ceiling, not a promise.
1467
1536
  */
1468
- access: 'read' | 'send' | 'admin';
1537
+ access: 'read' | 'draft' | 'send' | 'admin';
1469
1538
  /**
1470
1539
  * True when it reaches every address the workspace owns, including ones created after it. False when it reaches a fixed list.
1471
1540
  */
@@ -1610,7 +1679,10 @@ type MailboxAccess = {
1610
1679
  * For showing a person. A renamed key changes it; never match on it.
1611
1680
  */
1612
1681
  label: string;
1613
- access: 'read' | 'send' | 'admin';
1682
+ /**
1683
+ * What this principal can do here. A key shows the lower of its ceiling and the grant.
1684
+ */
1685
+ access: 'read' | 'draft' | 'send' | 'admin';
1614
1686
  }>;
1615
1687
  /**
1616
1688
  * Whether this credential may change any of the above.
@@ -1825,7 +1897,7 @@ type PodCreated = {
1825
1897
  /**
1826
1898
  * The highest rung on any address. Composed with the grant; lower wins.
1827
1899
  */
1828
- access: 'read' | 'send' | 'admin';
1900
+ access: 'read' | 'draft' | 'send' | 'admin';
1829
1901
  created_by_key_id: string | null;
1830
1902
  last_used_at: string | null;
1831
1903
  revoked_at: string | null;
@@ -3105,7 +3177,7 @@ type PodsCreateData = {
3105
3177
  */
3106
3178
  key?: {
3107
3179
  name?: string;
3108
- access?: 'read' | 'send' | 'admin';
3180
+ access?: 'read' | 'draft' | 'send' | 'admin';
3109
3181
  expires_at?: string | null;
3110
3182
  /**
3111
3183
  * Mint a test-mode key (`pgn_test_`) for the pod instead of a live one.
@@ -5840,7 +5912,7 @@ type KeysCreateData = {
5840
5912
  /**
5841
5913
  * What a key may do. Give an agent the narrowest one that works.
5842
5914
  */
5843
- access?: 'read' | 'send' | 'admin';
5915
+ access?: 'read' | 'draft' | 'send' | 'admin';
5844
5916
  /**
5845
5917
  * When it stops accepting mail. Expiry suspends; it never deletes, so the correspondence survives.
5846
5918
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pidgeon-ai/sdk",
3
- "version": "1.26.0",
3
+ "version": "1.28.0",
4
4
  "description": "Email inboxes for AI agents — TypeScript SDK for Pidgeon: create addresses, send, receive and reply.",
5
5
  "keywords": [
6
6
  "email",