@epilot/cli 0.1.110 → 0.1.112

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/README.md CHANGED
@@ -29,7 +29,7 @@ npm install -g @epilot/cli
29
29
 
30
30
  <!-- usage-help -->
31
31
  ```
32
- epilot v0.1.110 — CLI for epilot APIs
32
+ epilot v0.1.112 — CLI for epilot APIs
33
33
 
34
34
  USAGE
35
35
  epilot <api> <operationId> [params...] [flags]
@@ -1241,7 +1241,7 @@
1241
1241
  "patch": {
1242
1242
  "operationId": "updateCalendar",
1243
1243
  "summary": "updateCalendar",
1244
- "description": "Update fields on a calendar.",
1244
+ "description": "Update local calendar details. Changes to synced calendars do not modify the provider calendar.",
1245
1245
  "tags": [
1246
1246
  "Calendars"
1247
1247
  ],
@@ -1286,16 +1286,6 @@
1286
1286
  }
1287
1287
  }
1288
1288
  },
1289
- "403": {
1290
- "description": "Calendar is read-only",
1291
- "content": {
1292
- "application/json": {
1293
- "schema": {
1294
- "$ref": "#/components/schemas/Error"
1295
- }
1296
- }
1297
- }
1298
- },
1299
1289
  "404": {
1300
1290
  "description": "Resource not found",
1301
1291
  "content": {
@@ -1311,7 +1301,7 @@
1311
1301
  "delete": {
1312
1302
  "operationId": "deleteCalendar",
1313
1303
  "summary": "deleteCalendar",
1314
- "description": "Delete a native epilot calendar and its events.",
1304
+ "description": "Delete a native epilot calendar or disconnect a synced calendar, including its locally stored events.",
1315
1305
  "tags": [
1316
1306
  "Calendars"
1317
1307
  ],
@@ -1327,17 +1317,7 @@
1327
1317
  ],
1328
1318
  "responses": {
1329
1319
  "204": {
1330
- "description": "Calendar deleted"
1331
- },
1332
- "403": {
1333
- "description": "Calendar is read-only",
1334
- "content": {
1335
- "application/json": {
1336
- "schema": {
1337
- "$ref": "#/components/schemas/Error"
1338
- }
1339
- }
1340
- }
1320
+ "description": "Calendar deleted or disconnected"
1341
1321
  },
1342
1322
  "404": {
1343
1323
  "description": "Resource not found",
@@ -2347,7 +2327,7 @@
2347
2327
  },
2348
2328
  "read_only": {
2349
2329
  "type": "boolean",
2350
- "description": "True if the caller cannot modify events in this calendar"
2330
+ "description": "True if the caller cannot create, update, or delete events in this calendar"
2351
2331
  },
2352
2332
  "owner_email": {
2353
2333
  "type": "string",
@@ -2573,7 +2553,12 @@
2573
2553
  "description": "Convenience flag, true when status is busy/oof/tentative"
2574
2554
  },
2575
2555
  "is_cancelled": {
2576
- "type": "boolean"
2556
+ "type": "boolean",
2557
+ "description": "Whether the event was cancelled but still exists"
2558
+ },
2559
+ "is_draft": {
2560
+ "type": "boolean",
2561
+ "description": "Whether the event is saved as a draft"
2577
2562
  },
2578
2563
  "sensitivity": {
2579
2564
  "$ref": "#/components/schemas/Sensitivity"
@@ -2612,6 +2597,11 @@
2612
2597
  },
2613
2598
  "description": "Null when sensitivity is private or confidential"
2614
2599
  },
2600
+ "metadata": {
2601
+ "type": "object",
2602
+ "nullable": true,
2603
+ "additionalProperties": {}
2604
+ },
2615
2605
  "is_recurring": {
2616
2606
  "type": "boolean"
2617
2607
  },
@@ -2645,6 +2635,7 @@
2645
2635
  "status",
2646
2636
  "busy",
2647
2637
  "is_cancelled",
2638
+ "is_draft",
2648
2639
  "sensitivity",
2649
2640
  "importance",
2650
2641
  "is_online_meeting",
@@ -2813,6 +2804,11 @@
2813
2804
  "sensitivity": {
2814
2805
  "$ref": "#/components/schemas/Sensitivity"
2815
2806
  },
2807
+ "metadata": {
2808
+ "type": "object",
2809
+ "nullable": true,
2810
+ "additionalProperties": {}
2811
+ },
2816
2812
  "_title": {
2817
2813
  "type": "string",
2818
2814
  "minLength": 1
@@ -2863,6 +2859,10 @@
2863
2859
  "status": {
2864
2860
  "$ref": "#/components/schemas/EventStatus"
2865
2861
  },
2862
+ "is_cancelled": {
2863
+ "type": "boolean",
2864
+ "description": "Whether the event was cancelled but still exists"
2865
+ },
2866
2866
  "sensitivity": {
2867
2867
  "$ref": "#/components/schemas/Sensitivity"
2868
2868
  },
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.0.3",
3
3
  "info": {
4
4
  "title": "Integration Toolkit API",
5
- "version": "1.15.0",
5
+ "version": "1.17.0",
6
6
  "description": "API for integrating with external systems in a standardised way."
7
7
  },
8
8
  "tags": [
@@ -1628,6 +1628,239 @@
1628
1628
  }
1629
1629
  }
1630
1630
  },
1631
+ "/v1/integrations/{integrationId}/documentation": {
1632
+ "get": {
1633
+ "operationId": "listDocumentationPages",
1634
+ "summary": "listDocumentationPages",
1635
+ "description": "Retrieve all documentation pages of an integration, without their markdown content.\nAn integration has at most one general page plus at most one page per use case.\nThe page id is 'general' for the integration-wide page, otherwise the use case ID.\n",
1636
+ "tags": [
1637
+ "integrations"
1638
+ ],
1639
+ "parameters": [
1640
+ {
1641
+ "name": "integrationId",
1642
+ "in": "path",
1643
+ "required": true,
1644
+ "description": "The integration ID",
1645
+ "schema": {
1646
+ "type": "string",
1647
+ "format": "uuid"
1648
+ }
1649
+ }
1650
+ ],
1651
+ "responses": {
1652
+ "200": {
1653
+ "description": "Successfully retrieved documentation pages",
1654
+ "content": {
1655
+ "application/json": {
1656
+ "schema": {
1657
+ "type": "object",
1658
+ "required": [
1659
+ "pages"
1660
+ ],
1661
+ "properties": {
1662
+ "pages": {
1663
+ "type": "array",
1664
+ "items": {
1665
+ "$ref": "#/components/schemas/DocumentationPageSummary"
1666
+ }
1667
+ }
1668
+ }
1669
+ }
1670
+ }
1671
+ }
1672
+ },
1673
+ "401": {
1674
+ "$ref": "#/components/responses/Unauthorized"
1675
+ },
1676
+ "404": {
1677
+ "description": "Integration not found"
1678
+ },
1679
+ "500": {
1680
+ "$ref": "#/components/responses/InternalServerError"
1681
+ }
1682
+ }
1683
+ }
1684
+ },
1685
+ "/v1/integrations/{integrationId}/documentation/{docId}": {
1686
+ "get": {
1687
+ "operationId": "getDocumentationPage",
1688
+ "summary": "getDocumentationPage",
1689
+ "description": "Retrieve a single documentation page including its markdown content",
1690
+ "tags": [
1691
+ "integrations"
1692
+ ],
1693
+ "parameters": [
1694
+ {
1695
+ "name": "integrationId",
1696
+ "in": "path",
1697
+ "required": true,
1698
+ "description": "The integration ID",
1699
+ "schema": {
1700
+ "type": "string",
1701
+ "format": "uuid"
1702
+ }
1703
+ },
1704
+ {
1705
+ "name": "docId",
1706
+ "in": "path",
1707
+ "required": true,
1708
+ "description": "'general' for the integration-wide page, otherwise a use case ID",
1709
+ "schema": {
1710
+ "type": "string",
1711
+ "pattern": "^(general|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
1712
+ }
1713
+ }
1714
+ ],
1715
+ "responses": {
1716
+ "200": {
1717
+ "description": "Successfully retrieved documentation page",
1718
+ "content": {
1719
+ "application/json": {
1720
+ "schema": {
1721
+ "$ref": "#/components/schemas/DocumentationPage"
1722
+ }
1723
+ }
1724
+ }
1725
+ },
1726
+ "401": {
1727
+ "$ref": "#/components/responses/Unauthorized"
1728
+ },
1729
+ "404": {
1730
+ "description": "Documentation page not found"
1731
+ },
1732
+ "500": {
1733
+ "$ref": "#/components/responses/InternalServerError"
1734
+ }
1735
+ }
1736
+ },
1737
+ "put": {
1738
+ "operationId": "upsertDocumentationPage",
1739
+ "summary": "upsertDocumentationPage",
1740
+ "description": "Create or update the documentation page identified by docId.\nUpsert semantics enforce the invariant of one general page per\nintegration and one page per use case. For use case pages the\nuse case must exist.\n",
1741
+ "tags": [
1742
+ "integrations"
1743
+ ],
1744
+ "parameters": [
1745
+ {
1746
+ "name": "integrationId",
1747
+ "in": "path",
1748
+ "required": true,
1749
+ "description": "The integration ID",
1750
+ "schema": {
1751
+ "type": "string",
1752
+ "format": "uuid"
1753
+ }
1754
+ },
1755
+ {
1756
+ "name": "docId",
1757
+ "in": "path",
1758
+ "required": true,
1759
+ "description": "'general' for the integration-wide page, otherwise a use case ID",
1760
+ "schema": {
1761
+ "type": "string",
1762
+ "pattern": "^(general|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
1763
+ }
1764
+ }
1765
+ ],
1766
+ "requestBody": {
1767
+ "required": true,
1768
+ "content": {
1769
+ "application/json": {
1770
+ "schema": {
1771
+ "$ref": "#/components/schemas/UpsertDocumentationPageRequest"
1772
+ }
1773
+ }
1774
+ }
1775
+ },
1776
+ "responses": {
1777
+ "200": {
1778
+ "description": "Documentation page created or updated successfully",
1779
+ "content": {
1780
+ "application/json": {
1781
+ "schema": {
1782
+ "$ref": "#/components/schemas/DocumentationPage"
1783
+ }
1784
+ }
1785
+ }
1786
+ },
1787
+ "400": {
1788
+ "$ref": "#/components/responses/BadRequest"
1789
+ },
1790
+ "401": {
1791
+ "$ref": "#/components/responses/Unauthorized"
1792
+ },
1793
+ "403": {
1794
+ "$ref": "#/components/responses/Forbidden"
1795
+ },
1796
+ "404": {
1797
+ "description": "Integration or use case not found"
1798
+ },
1799
+ "500": {
1800
+ "$ref": "#/components/responses/InternalServerError"
1801
+ }
1802
+ }
1803
+ },
1804
+ "delete": {
1805
+ "operationId": "deleteDocumentationPage",
1806
+ "summary": "deleteDocumentationPage",
1807
+ "description": "Delete a documentation page",
1808
+ "tags": [
1809
+ "integrations"
1810
+ ],
1811
+ "parameters": [
1812
+ {
1813
+ "name": "integrationId",
1814
+ "in": "path",
1815
+ "required": true,
1816
+ "description": "The integration ID",
1817
+ "schema": {
1818
+ "type": "string",
1819
+ "format": "uuid"
1820
+ }
1821
+ },
1822
+ {
1823
+ "name": "docId",
1824
+ "in": "path",
1825
+ "required": true,
1826
+ "description": "'general' for the integration-wide page, otherwise a use case ID",
1827
+ "schema": {
1828
+ "type": "string",
1829
+ "pattern": "^(general|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"
1830
+ }
1831
+ }
1832
+ ],
1833
+ "responses": {
1834
+ "200": {
1835
+ "description": "Documentation page deleted successfully",
1836
+ "content": {
1837
+ "application/json": {
1838
+ "schema": {
1839
+ "type": "object",
1840
+ "properties": {
1841
+ "message": {
1842
+ "type": "string"
1843
+ }
1844
+ }
1845
+ }
1846
+ }
1847
+ }
1848
+ },
1849
+ "401": {
1850
+ "$ref": "#/components/responses/Unauthorized"
1851
+ },
1852
+ "403": {
1853
+ "$ref": "#/components/responses/Forbidden"
1854
+ },
1855
+ "404": {
1856
+ "description": "Documentation page not found"
1857
+ },
1858
+ "500": {
1859
+ "$ref": "#/components/responses/InternalServerError"
1860
+ }
1861
+ }
1862
+ }
1863
+ },
1631
1864
  "/v2/integrations": {
1632
1865
  "get": {
1633
1866
  "operationId": "listIntegrationsV2",
@@ -3879,6 +4112,38 @@
3879
4112
  "$ref": "#/components/responses/InternalServerError"
3880
4113
  }
3881
4114
  }
4115
+ },
4116
+ "delete": {
4117
+ "operationId": "deleteErpImport",
4118
+ "summary": "deleteErpImport",
4119
+ "description": "Remove an import and the file it owns. Allowed from any status: an import whose run is still in flight is stopped by the deletion, and rows it already wrote stay written.",
4120
+ "tags": [
4121
+ "erp-imports"
4122
+ ],
4123
+ "parameters": [
4124
+ {
4125
+ "name": "importId",
4126
+ "in": "path",
4127
+ "required": true,
4128
+ "schema": {
4129
+ "type": "string"
4130
+ }
4131
+ }
4132
+ ],
4133
+ "responses": {
4134
+ "204": {
4135
+ "description": "The import and its file were removed"
4136
+ },
4137
+ "403": {
4138
+ "$ref": "#/components/responses/Forbidden"
4139
+ },
4140
+ "404": {
4141
+ "$ref": "#/components/responses/NotFound"
4142
+ },
4143
+ "500": {
4144
+ "$ref": "#/components/responses/InternalServerError"
4145
+ }
4146
+ }
3882
4147
  }
3883
4148
  },
3884
4149
  "/v2/erp/imports/{importId}:validate": {
@@ -4451,6 +4716,15 @@
4451
4716
  "s3_input_ref": {
4452
4717
  "$ref": "#/components/schemas/S3Reference"
4453
4718
  },
4719
+ "size_bytes": {
4720
+ "type": "integer",
4721
+ "format": "int64",
4722
+ "description": "Size of the uploaded file, recorded at registration. Present on every job registered from version 1.17.0 onwards; absent on older rows, which were written before it was captured."
4723
+ },
4724
+ "column_count": {
4725
+ "type": "integer",
4726
+ "description": "How many effective columns the file's header yielded — the length of the `preview.columns` returned at registration, kept so a job loaded later can still describe its file. The preview ROWS are deliberately not stored: they are a sample for the person about to choose a mapping, not job state. Present on every job registered from version 1.17.0 onwards."
4727
+ },
4454
4728
  "validation": {
4455
4729
  "$ref": "#/components/schemas/ErpImportValidation"
4456
4730
  },
@@ -11029,6 +11303,110 @@
11029
11303
  }
11030
11304
  }
11031
11305
  }
11306
+ },
11307
+ "DocumentationPageSummary": {
11308
+ "type": "object",
11309
+ "description": "Documentation page metadata without the markdown content",
11310
+ "required": [
11311
+ "id",
11312
+ "integration_id",
11313
+ "scope",
11314
+ "title",
11315
+ "created_at",
11316
+ "updated_at"
11317
+ ],
11318
+ "properties": {
11319
+ "id": {
11320
+ "type": "string",
11321
+ "description": "'general' for the integration-wide page, otherwise the use case ID",
11322
+ "example": "general"
11323
+ },
11324
+ "integration_id": {
11325
+ "type": "string",
11326
+ "format": "uuid",
11327
+ "readOnly": true
11328
+ },
11329
+ "scope": {
11330
+ "type": "string",
11331
+ "enum": [
11332
+ "integration",
11333
+ "use_case"
11334
+ ],
11335
+ "description": "Whether the page documents the whole integration or a single use case"
11336
+ },
11337
+ "use_case_id": {
11338
+ "type": "string",
11339
+ "format": "uuid",
11340
+ "description": "The linked use case. Only set when scope is use_case."
11341
+ },
11342
+ "title": {
11343
+ "type": "string",
11344
+ "minLength": 1,
11345
+ "maxLength": 150
11346
+ },
11347
+ "created_at": {
11348
+ "type": "string",
11349
+ "format": "date-time",
11350
+ "readOnly": true
11351
+ },
11352
+ "created_by": {
11353
+ "type": "string",
11354
+ "nullable": true,
11355
+ "description": "User ID that created the page",
11356
+ "readOnly": true
11357
+ },
11358
+ "updated_at": {
11359
+ "type": "string",
11360
+ "format": "date-time",
11361
+ "readOnly": true
11362
+ },
11363
+ "updated_by": {
11364
+ "type": "string",
11365
+ "nullable": true,
11366
+ "description": "User ID of the last edit",
11367
+ "readOnly": true
11368
+ }
11369
+ }
11370
+ },
11371
+ "DocumentationPage": {
11372
+ "description": "A markdown documentation page of an integration",
11373
+ "allOf": [
11374
+ {
11375
+ "$ref": "#/components/schemas/DocumentationPageSummary"
11376
+ },
11377
+ {
11378
+ "type": "object",
11379
+ "required": [
11380
+ "content"
11381
+ ],
11382
+ "properties": {
11383
+ "content": {
11384
+ "type": "string",
11385
+ "maxLength": 100000,
11386
+ "description": "Markdown source of the page"
11387
+ }
11388
+ }
11389
+ }
11390
+ ]
11391
+ },
11392
+ "UpsertDocumentationPageRequest": {
11393
+ "type": "object",
11394
+ "required": [
11395
+ "title",
11396
+ "content"
11397
+ ],
11398
+ "properties": {
11399
+ "title": {
11400
+ "type": "string",
11401
+ "minLength": 1,
11402
+ "maxLength": 150
11403
+ },
11404
+ "content": {
11405
+ "type": "string",
11406
+ "maxLength": 100000,
11407
+ "description": "Markdown source of the page"
11408
+ }
11409
+ }
11032
11410
  }
11033
11411
  },
11034
11412
  "responses": {
@@ -581,6 +581,44 @@
581
581
  }
582
582
  }
583
583
  },
584
+ "/v1/message/unread:counts": {
585
+ "post": {
586
+ "operationId": "getUnreadCounts",
587
+ "summary": "getUnreadCounts",
588
+ "description": "Unread counts for several named scopes in one request.\n\nA scope is a name plus the same parameters the thread list already takes (`q`, `inbox_id`),\nso a scope's count and the list beneath it are the same predicate and agree by construction.\nThe server adds only the read-state condition; it does not re-author the caller's view.\n\nThe `organization` scope is the exception and takes no `q`: it reuses the four canonical\ncentral-inbox queries, so its numbers match `getUnread` exactly.\n\nBuckets are not symmetric, across scope types or across actors. Every scope other than\n`organization` returns `unread` alone. The `organization` scope returns all four\n(`unread`, `drafts`, `unassigned`, `spam`) for `actor: organization`, and only `unread` and\n`drafts` for `actor: user` — the agent sidebar has no Spam or Unlinked folder, so those two\nnumbers have nowhere to render and each one costs a cardinality aggregation. This is a\ndeliberate divergence from `getUnread`, which computes all four for both actors.\n\nGated on the `message-unread-counts` flag, evaluated once per request against the calling\norg. With the flag off the response is `{ \"enabled\": false, \"counts\": {} }` and no\nElasticsearch query is issued.\n",
589
+ "tags": [
590
+ "Messages"
591
+ ],
592
+ "requestBody": {
593
+ "required": true,
594
+ "content": {
595
+ "application/json": {
596
+ "schema": {
597
+ "$ref": "#/components/schemas/UnreadCountsPayload"
598
+ }
599
+ }
600
+ }
601
+ },
602
+ "responses": {
603
+ "200": {
604
+ "description": "Success",
605
+ "content": {
606
+ "application/json": {
607
+ "schema": {
608
+ "$ref": "#/components/schemas/UnreadCountsResult"
609
+ }
610
+ }
611
+ }
612
+ },
613
+ "400": {
614
+ "description": "The request names more scopes than the cap allows, repeats a scope name, or omits `q`\non a scope type that requires it. Over-cap requests are refused rather than truncated:\na silently dropped scope renders as a missing badge, which is indistinguishable from\nzero unread.\n"
615
+ },
616
+ "403": {
617
+ "description": "Forbidden"
618
+ }
619
+ }
620
+ }
621
+ },
584
622
  "/v2/message/messages/{id}/unread": {
585
623
  "post": {
586
624
  "operationId": "markUnreadMessageV2",
@@ -2657,6 +2695,136 @@
2657
2695
  }
2658
2696
  }
2659
2697
  },
2698
+ "UnreadCountScope": {
2699
+ "type": "object",
2700
+ "required": [
2701
+ "name",
2702
+ "type"
2703
+ ],
2704
+ "properties": {
2705
+ "name": {
2706
+ "type": "string",
2707
+ "description": "Caller-chosen key for this scope. Echoed back as the key in `counts`, so it is how the\ncaller matches a number to the sidebar row it belongs to. Must be unique within the\nrequest; duplicates are refused rather than silently collapsed.\n",
2708
+ "example": "inbox-support"
2709
+ },
2710
+ "type": {
2711
+ "type": "string",
2712
+ "enum": [
2713
+ "organization",
2714
+ "shared_inbox",
2715
+ "saved_view"
2716
+ ],
2717
+ "description": "Decides which buckets come back, and whether `q` is required. `organization` returns all\nfour buckets from the canonical central-inbox queries and takes no `q`. `shared_inbox`\nand `saved_view` return `unread` alone and require the `q` their list uses.\n\nA `shared_inbox` scope additionally requires `actor: organization` and is refused with a\n400 otherwise. A shared inbox is an organization-level construct — selecting one always\nswitches the mailbox to the organization — so it has no per-user read state and the\ncombination would compute a number no surface renders. `saved_view` accepts either actor,\nbecause a view's own configuration names its mailbox.\n"
2718
+ },
2719
+ "q": {
2720
+ "type": "string",
2721
+ "description": "The scope's own list predicate, in Lucene syntax, exactly as the caller passes it to\n`threads:search`. Required for `shared_inbox` and `saved_view`, rejected for\n`organization`. The server ANDs the read-state condition onto it and nothing else, which\nis what makes the count and the list agree. Until the predicate definition moves\nserver-side, this is the caller's authored copy.\n",
2722
+ "example": "_tags.keyword:inbox AND !_tags.keyword:trash"
2723
+ },
2724
+ "inbox_id": {
2725
+ "description": "Shared inbox ids, resolved to bucket ids the same way `threads:search` resolves them.",
2726
+ "oneOf": [
2727
+ {
2728
+ "type": "string",
2729
+ "example": "3f34ce73-089c-4d45-a5ee-c161234e41c3"
2730
+ },
2731
+ {
2732
+ "type": "array",
2733
+ "items": {
2734
+ "type": "string"
2735
+ }
2736
+ }
2737
+ ]
2738
+ }
2739
+ }
2740
+ },
2741
+ "UnreadCountsPayload": {
2742
+ "type": "object",
2743
+ "required": [
2744
+ "actor",
2745
+ "scopes"
2746
+ ],
2747
+ "properties": {
2748
+ "actor": {
2749
+ "type": "string",
2750
+ "enum": [
2751
+ "organization",
2752
+ "user"
2753
+ ],
2754
+ "description": "Which read state to count against — the org's or the calling user's. Same meaning as\n`getUnread`'s path parameter, and unrelated to a scope's `type`.\n"
2755
+ },
2756
+ "email_filter": {
2757
+ "type": "array",
2758
+ "items": {
2759
+ "type": "string"
2760
+ },
2761
+ "description": "Restrict every scope to messages involving these addresses."
2762
+ },
2763
+ "scopes": {
2764
+ "type": "array",
2765
+ "minItems": 1,
2766
+ "maxItems": 25,
2767
+ "items": {
2768
+ "$ref": "#/components/schemas/UnreadCountScope"
2769
+ }
2770
+ }
2771
+ }
2772
+ },
2773
+ "UnreadCountsResult": {
2774
+ "type": "object",
2775
+ "required": [
2776
+ "enabled",
2777
+ "counts"
2778
+ ],
2779
+ "properties": {
2780
+ "enabled": {
2781
+ "type": "boolean",
2782
+ "description": "False when the `message-unread-counts` flag is off for the calling org, in which case\n`counts` is empty and no Elasticsearch work was done. Callers render no badges rather\nthan rendering zeroes.\n",
2783
+ "example": true
2784
+ },
2785
+ "counts": {
2786
+ "type": "object",
2787
+ "description": "One entry per scope, keyed by the scope's `name`. A scope whose predicate could not be\nbuilt is **absent** rather than zero, because a zero badge is a claim about the mailbox\nand an absent one is a claim about the request.\n",
2788
+ "additionalProperties": {
2789
+ "$ref": "#/components/schemas/UnreadCountBuckets"
2790
+ }
2791
+ },
2792
+ "omitted": {
2793
+ "type": "array",
2794
+ "description": "Names of scopes that were accepted but could not be counted — today, a shared inbox whose\nids matched no bucket in this org. Listed explicitly so a caller can tell an omission apart\nfrom a mis-spelled scope name, both of which are otherwise just a missing key in `counts`.\n",
2795
+ "items": {
2796
+ "type": "string"
2797
+ }
2798
+ }
2799
+ }
2800
+ },
2801
+ "UnreadCountBuckets": {
2802
+ "type": "object",
2803
+ "required": [
2804
+ "unread"
2805
+ ],
2806
+ "properties": {
2807
+ "unread": {
2808
+ "type": "number",
2809
+ "example": 14
2810
+ },
2811
+ "drafts": {
2812
+ "type": "number",
2813
+ "description": "Organization scope only.",
2814
+ "example": 12
2815
+ },
2816
+ "unassigned": {
2817
+ "type": "number",
2818
+ "description": "Organization scope only.",
2819
+ "example": 1
2820
+ },
2821
+ "spam": {
2822
+ "type": "number",
2823
+ "description": "Organization scope only.",
2824
+ "example": 3
2825
+ }
2826
+ }
2827
+ },
2660
2828
  "SearchParamsV2": {
2661
2829
  "type": "object",
2662
2830
  "required": [
@@ -2923,6 +3091,254 @@
2923
3091
  }
2924
3092
  }
2925
3093
  },
3094
+ "WorkflowStartedEvent": {
3095
+ "type": "object",
3096
+ "required": [
3097
+ "type"
3098
+ ],
3099
+ "properties": {
3100
+ "type": {
3101
+ "type": "string",
3102
+ "enum": [
3103
+ "WORKFLOW_STARTED"
3104
+ ]
3105
+ },
3106
+ "workflow_id": {
3107
+ "type": "string",
3108
+ "description": "ID of the workflow/flow execution that was started"
3109
+ },
3110
+ "workflow_name": {
3111
+ "type": "string",
3112
+ "description": "Name of the workflow that was started"
3113
+ }
3114
+ }
3115
+ },
3116
+ "ThreadUserAssignedEvent": {
3117
+ "type": "object",
3118
+ "required": [
3119
+ "type"
3120
+ ],
3121
+ "properties": {
3122
+ "type": {
3123
+ "type": "string",
3124
+ "enum": [
3125
+ "THREAD_USER_ASSIGNED"
3126
+ ]
3127
+ },
3128
+ "added": {
3129
+ "type": "array",
3130
+ "description": "User IDs assigned to the thread",
3131
+ "items": {
3132
+ "type": "string"
3133
+ }
3134
+ },
3135
+ "removed": {
3136
+ "type": "array",
3137
+ "description": "User IDs unassigned from the thread",
3138
+ "items": {
3139
+ "type": "string"
3140
+ }
3141
+ }
3142
+ }
3143
+ },
3144
+ "MessageLabelAddedEvent": {
3145
+ "type": "object",
3146
+ "required": [
3147
+ "type",
3148
+ "label"
3149
+ ],
3150
+ "properties": {
3151
+ "type": {
3152
+ "type": "string",
3153
+ "enum": [
3154
+ "MESSAGE_LABEL_ADDED"
3155
+ ]
3156
+ },
3157
+ "label": {
3158
+ "type": "string",
3159
+ "description": "The label that was added (raw tag slug, e.g. `sentiments:angry`)"
3160
+ },
3161
+ "label_name": {
3162
+ "type": "string",
3163
+ "description": "Resolved taxonomy classification display name (e.g. `Verärgert`), when the label is a classification. Absent for free-form tags."
3164
+ }
3165
+ }
3166
+ },
3167
+ "MessageLabelRemovedEvent": {
3168
+ "type": "object",
3169
+ "required": [
3170
+ "type",
3171
+ "label"
3172
+ ],
3173
+ "properties": {
3174
+ "type": {
3175
+ "type": "string",
3176
+ "enum": [
3177
+ "MESSAGE_LABEL_REMOVED"
3178
+ ]
3179
+ },
3180
+ "label": {
3181
+ "type": "string",
3182
+ "description": "The label that was removed (raw tag slug, e.g. `sentiments:angry`)"
3183
+ },
3184
+ "label_name": {
3185
+ "type": "string",
3186
+ "description": "Resolved taxonomy classification display name (e.g. `Verärgert`), when the label is a classification. Absent for free-form tags."
3187
+ }
3188
+ }
3189
+ },
3190
+ "MessageEntityLinkedEvent": {
3191
+ "type": "object",
3192
+ "required": [
3193
+ "type"
3194
+ ],
3195
+ "properties": {
3196
+ "type": {
3197
+ "type": "string",
3198
+ "enum": [
3199
+ "MESSAGE_ENTITY_LINKED"
3200
+ ]
3201
+ },
3202
+ "entities": {
3203
+ "type": "array",
3204
+ "items": {
3205
+ "$ref": "#/components/schemas/TimelineLinkedEntity"
3206
+ }
3207
+ },
3208
+ "link_kind": {
3209
+ "type": "string",
3210
+ "enum": [
3211
+ "manual",
3212
+ "auto"
3213
+ ]
3214
+ }
3215
+ }
3216
+ },
3217
+ "MessageEntityUnlinkedEvent": {
3218
+ "type": "object",
3219
+ "required": [
3220
+ "type"
3221
+ ],
3222
+ "properties": {
3223
+ "type": {
3224
+ "type": "string",
3225
+ "enum": [
3226
+ "MESSAGE_ENTITY_UNLINKED"
3227
+ ]
3228
+ },
3229
+ "entities": {
3230
+ "type": "array",
3231
+ "items": {
3232
+ "$ref": "#/components/schemas/TimelineLinkedEntity"
3233
+ }
3234
+ },
3235
+ "link_kind": {
3236
+ "type": "string",
3237
+ "enum": [
3238
+ "manual",
3239
+ "auto"
3240
+ ]
3241
+ }
3242
+ }
3243
+ },
3244
+ "MessageAutoReplySentEvent": {
3245
+ "type": "object",
3246
+ "required": [
3247
+ "type"
3248
+ ],
3249
+ "properties": {
3250
+ "type": {
3251
+ "type": "string",
3252
+ "enum": [
3253
+ "MESSAGE_AUTO_REPLY_SENT"
3254
+ ]
3255
+ },
3256
+ "reply_message_id": {
3257
+ "type": "string",
3258
+ "description": "ID of the message that was sent as the automatic reply"
3259
+ },
3260
+ "parent_message_id": {
3261
+ "type": "string",
3262
+ "description": "ID of the message the automatic reply responded to"
3263
+ }
3264
+ }
3265
+ },
3266
+ "ThreadMovedToInboxEvent": {
3267
+ "type": "object",
3268
+ "required": [
3269
+ "type"
3270
+ ],
3271
+ "properties": {
3272
+ "type": {
3273
+ "type": "string",
3274
+ "enum": [
3275
+ "THREAD_MOVED_TO_INBOX"
3276
+ ]
3277
+ },
3278
+ "target_inbox_id": {
3279
+ "type": "string",
3280
+ "description": "ID of the shared inbox the thread was moved to"
3281
+ },
3282
+ "target_inbox_name": {
3283
+ "type": "string",
3284
+ "description": "Name of the shared inbox the thread was moved to"
3285
+ }
3286
+ }
3287
+ },
3288
+ "ThreadTrashedEvent": {
3289
+ "type": "object",
3290
+ "required": [
3291
+ "type"
3292
+ ],
3293
+ "properties": {
3294
+ "type": {
3295
+ "type": "string",
3296
+ "enum": [
3297
+ "THREAD_TRASHED"
3298
+ ]
3299
+ }
3300
+ }
3301
+ },
3302
+ "ThreadRestoredEvent": {
3303
+ "type": "object",
3304
+ "required": [
3305
+ "type"
3306
+ ],
3307
+ "properties": {
3308
+ "type": {
3309
+ "type": "string",
3310
+ "enum": [
3311
+ "THREAD_RESTORED"
3312
+ ]
3313
+ }
3314
+ }
3315
+ },
3316
+ "TimelineLinkedEntity": {
3317
+ "type": "object",
3318
+ "required": [
3319
+ "entity_id"
3320
+ ],
3321
+ "properties": {
3322
+ "entity_id": {
3323
+ "type": "string"
3324
+ },
3325
+ "schema": {
3326
+ "type": "string",
3327
+ "description": "Entity schema slug, e.g. \"opportunity\""
3328
+ }
3329
+ }
3330
+ },
3331
+ "TimelineActor": {
3332
+ "type": "object",
3333
+ "properties": {
3334
+ "user_id": {
3335
+ "type": "string"
3336
+ },
3337
+ "email": {
3338
+ "type": "string"
3339
+ }
3340
+ }
3341
+ },
2926
3342
  "TimelineEventData": {
2927
3343
  "type": "object",
2928
3344
  "discriminator": {
@@ -2934,6 +3350,36 @@
2934
3350
  },
2935
3351
  {
2936
3352
  "$ref": "#/components/schemas/ThreadOpenEvent"
3353
+ },
3354
+ {
3355
+ "$ref": "#/components/schemas/WorkflowStartedEvent"
3356
+ },
3357
+ {
3358
+ "$ref": "#/components/schemas/ThreadUserAssignedEvent"
3359
+ },
3360
+ {
3361
+ "$ref": "#/components/schemas/MessageLabelAddedEvent"
3362
+ },
3363
+ {
3364
+ "$ref": "#/components/schemas/MessageLabelRemovedEvent"
3365
+ },
3366
+ {
3367
+ "$ref": "#/components/schemas/MessageEntityLinkedEvent"
3368
+ },
3369
+ {
3370
+ "$ref": "#/components/schemas/MessageEntityUnlinkedEvent"
3371
+ },
3372
+ {
3373
+ "$ref": "#/components/schemas/MessageAutoReplySentEvent"
3374
+ },
3375
+ {
3376
+ "$ref": "#/components/schemas/ThreadMovedToInboxEvent"
3377
+ },
3378
+ {
3379
+ "$ref": "#/components/schemas/ThreadTrashedEvent"
3380
+ },
3381
+ {
3382
+ "$ref": "#/components/schemas/ThreadRestoredEvent"
2937
3383
  }
2938
3384
  ]
2939
3385
  },
@@ -2944,13 +3390,47 @@
2944
3390
  "data"
2945
3391
  ],
2946
3392
  "properties": {
3393
+ "id": {
3394
+ "type": "string",
3395
+ "description": "Activity id (ActivityItem._id), for deep-linking to the item in the activity feed"
3396
+ },
2947
3397
  "data": {
2948
3398
  "$ref": "#/components/schemas/TimelineEventData"
2949
3399
  },
2950
3400
  "timestamp": {
2951
3401
  "type": "string",
2952
3402
  "description": "Timestamp of the event",
2953
- "example": "2024-01-01T00:00:00.000Z"
3403
+ "example": "2024-01-01T00:00:00Z"
3404
+ },
3405
+ "message_id": {
3406
+ "type": "string",
3407
+ "description": "For message-level events, the message the activity is anchored to"
3408
+ },
3409
+ "source": {
3410
+ "type": "string",
3411
+ "enum": [
3412
+ "user",
3413
+ "automation",
3414
+ "system"
3415
+ ]
3416
+ },
3417
+ "automated": {
3418
+ "type": "boolean",
3419
+ "description": "Whether the activity was performed automatically (automation/system)"
3420
+ },
3421
+ "actor": {
3422
+ "$ref": "#/components/schemas/TimelineActor"
3423
+ },
3424
+ "automation": {
3425
+ "type": "object",
3426
+ "properties": {
3427
+ "id": {
3428
+ "type": "string"
3429
+ },
3430
+ "name": {
3431
+ "type": "string"
3432
+ }
3433
+ }
2954
3434
  }
2955
3435
  }
2956
3436
  },
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  API_LIST
4
- } from "../chunk-QGAMGDQ5.js";
4
+ } from "../chunk-Q5BRCFO5.js";
5
5
 
6
6
  // bin/epilot.ts
7
7
  import { runMain } from "citty";
@@ -11,7 +11,7 @@ import { defineCommand } from "citty";
11
11
  var main = defineCommand({
12
12
  meta: {
13
13
  name: "epilot",
14
- version: "0.1.110",
14
+ version: "0.1.112",
15
15
  description: "CLI for epilot APIs"
16
16
  },
17
17
  args: {
@@ -30,8 +30,8 @@ var main = defineCommand({
30
30
  auth: () => import("../auth-WMXFMPWE.js").then((m) => m.default),
31
31
  profile: () => import("../profile-OZJL5ZPT.js").then((m) => m.default),
32
32
  config: () => import("../config-DGZIMLZK.js").then((m) => m.default),
33
- completion: () => import("../completion-OMS4BH5U.js").then((m) => m.default),
34
- upgrade: () => import("../upgrade-KY6R7SUW.js").then((m) => m.default),
33
+ completion: () => import("../completion-TFNBZ2RL.js").then((m) => m.default),
34
+ upgrade: () => import("../upgrade-JXF72TTA.js").then((m) => m.default),
35
35
  "access-token": () => import("../access-token-WWE6BDJH.js").then((m) => m.default),
36
36
  address: () => import("../address-EH3C4CVB.js").then((m) => m.default),
37
37
  "address-suggestions": () => import("../address-suggestions-RRSLOBFW.js").then((m) => m.default),
@@ -134,13 +134,13 @@ process.stderr.on("error", (err) => {
134
134
  if (err.code === "EPIPE") process.exit(0);
135
135
  throw err;
136
136
  });
137
- var VERSION = true ? "0.1.110" : (await null).default.version;
137
+ var VERSION = true ? "0.1.112" : (await null).default.version;
138
138
  var reorderedArgv = hoistFlagsAfterSubcommand(process.argv.slice(2));
139
139
  process.argv = [process.argv[0], process.argv[1], ...reorderedArgv];
140
140
  var args = process.argv.slice(2);
141
141
  var completionsIdx = args.indexOf("--_completions");
142
142
  if (completionsIdx >= 0) {
143
- const { handleCompletions } = await import("../completion-OMS4BH5U.js");
143
+ const { handleCompletions } = await import("../completion-TFNBZ2RL.js");
144
144
  handleCompletions(args[completionsIdx + 1], args[completionsIdx + 2]);
145
145
  process.exit(0);
146
146
  }
@@ -864,7 +864,7 @@ var API_LIST = [
864
864
  kebabName: "integration-toolkit",
865
865
  title: "Integration Toolkit API",
866
866
  serverUrl: "https://integration-toolkit.sls.epilot.io",
867
- operationCount: 63,
867
+ operationCount: 68,
868
868
  operationIds: [
869
869
  "acknowledgeTracking",
870
870
  "triggerErp",
@@ -886,6 +886,10 @@ var API_LIST = [
886
886
  "updateUseCase",
887
887
  "deleteUseCase",
888
888
  "listUseCaseHistory",
889
+ "listDocumentationPages",
890
+ "getDocumentationPage",
891
+ "upsertDocumentationPage",
892
+ "deleteDocumentationPage",
889
893
  "listIntegrationsV2",
890
894
  "createIntegrationV2",
891
895
  "getIntegrationV2",
@@ -925,6 +929,7 @@ var API_LIST = [
925
929
  "listErpImports",
926
930
  "createErpImport",
927
931
  "getErpImport",
932
+ "deleteErpImport",
928
933
  "validateErpImport",
929
934
  "suggestErpImportUseCases",
930
935
  "executeErpImport",
@@ -980,7 +985,7 @@ var API_LIST = [
980
985
  kebabName: "message",
981
986
  title: "Message API",
982
987
  serverUrl: "https://message.sls.epilot.io",
983
- operationCount: 53,
988
+ operationCount: 54,
984
989
  operationIds: [
985
990
  "sendMessage",
986
991
  "updateMessage",
@@ -994,6 +999,7 @@ var API_LIST = [
994
999
  "markReadMessageV2",
995
1000
  "markUnreadMessage",
996
1001
  "getUnread",
1002
+ "getUnreadCounts",
997
1003
  "markUnreadMessageV2",
998
1004
  "searchThreads",
999
1005
  "searchThreadsV2",
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  API_LIST
4
- } from "./chunk-QGAMGDQ5.js";
4
+ } from "./chunk-Q5BRCFO5.js";
5
5
  import {
6
6
  DIM,
7
7
  GREEN,
@@ -72,7 +72,7 @@ ${GREEN}${BOLD}Upgraded to @epilot/cli@${latest}${RESET}
72
72
  }
73
73
  });
74
74
  var getCurrentVersion = () => {
75
- if (true) return "0.1.110";
75
+ if (true) return "0.1.112";
76
76
  try {
77
77
  const output = execSync("npm ls -g @epilot/cli --depth=0 --json 2>/dev/null", {
78
78
  encoding: "utf-8",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epilot/cli",
3
- "version": "0.1.110",
3
+ "version": "0.1.112",
4
4
  "description": "CLI for epilot APIs",
5
5
  "type": "module",
6
6
  "bin": {