Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
lint:
timeout-minutes: 10
name: lint
runs-on: ${{ github.repository == 'stainless-sdks/agentmail-cli' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')

steps:
Expand All @@ -48,7 +48,7 @@ jobs:
permissions:
contents: read
id-token: write
runs-on: ${{ github.repository == 'stainless-sdks/agentmail-cli' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Expand Down Expand Up @@ -95,7 +95,7 @@ jobs:
test:
timeout-minutes: 10
name: test
runs-on: ${{ github.repository == 'stainless-sdks/agentmail-cli' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.7.14"
".": "0.7.15"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 95
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/agentmail/agentmail-710dd939e94b2dbb7a2d7ffae0f5dbc6bab5893c201299f452fcf39e7dbd886c.yml
openapi_spec_hash: 4eb49916915aeac5a7897470322459d4
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/agentmail/agentmail-0507cda65e473e78bdde89c5ac0c3476a26e5d5f23d9650ea364ead0b876e2c0.yml
openapi_spec_hash: 714305157eba3e25f840eac5d04236a3
config_hash: 8c7283a75ec714092fa5f03087e28a65
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Changelog

## 0.7.15 (2026-07-28)

Full Changelog: [v0.7.14...v0.7.15](https://github.com/agentmail-to/agentmail-cli/compare/v0.7.14...v0.7.15)

### Features

* **api:** api update ([4caffbe](https://github.com/agentmail-to/agentmail-cli/commit/4caffbe2625d6ca8b66f0f6a6248b99eadbdcd55))
* **api:** api update ([6a66ceb](https://github.com/agentmail-to/agentmail-cli/commit/6a66ceb8d3b60367e956818d0dbccafa002b29e6))
* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([a44ee71](https://github.com/agentmail-to/agentmail-cli/commit/a44ee7111feed59c088b880782f02c50f897ca83))

## 0.7.14 (2026-07-15)

Full Changelog: [v0.7.13...v0.7.14](https://github.com/agentmail-to/agentmail-cli/compare/v0.7.13...v0.7.14)
Expand Down
29 changes: 17 additions & 12 deletions pkg/cmd/apikey.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ var apiKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read API keys.",
InnerField: "api_key_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.api-key-update",
Usage: "Update API keys.",
InnerField: "api_key_update",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.domain-create",
Usage: "Create domains.",
Expand Down Expand Up @@ -129,6 +134,11 @@ var apiKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Access messages labeled trash.",
InnerField: "label_trash_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.label-unauthenticated-read",
Usage: "Access messages labeled unauthenticated.",
InnerField: "label_unauthenticated_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.list-entry-create",
Usage: "Create list entries.",
Expand All @@ -144,9 +154,14 @@ var apiKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read list entries.",
InnerField: "list_entry_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-delete",
Usage: "Delete messages. Also required to delete threads.",
InnerField: "message_delete",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-read",
Usage: "Read messages.",
Usage: "Read messages. Also required to read threads.",
InnerField: "message_read",
},
&requestflag.InnerFlag[*bool]{
Expand All @@ -156,7 +171,7 @@ var apiKeysCreate = requestflag.WithInnerFlags(cli.Command{
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-update",
Usage: "Update message labels.",
Usage: "Update message labels. Also required to update threads.",
InnerField: "message_update",
},
&requestflag.InnerFlag[*bool]{
Expand All @@ -179,16 +194,6 @@ var apiKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read pods.",
InnerField: "pod_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.thread-delete",
Usage: "Delete threads.",
InnerField: "thread_delete",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.thread-read",
Usage: "Read threads.",
InnerField: "thread_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.webhook-create",
Usage: "Create webhooks.",
Expand Down
12 changes: 7 additions & 5 deletions pkg/cmd/apikey_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ func TestAPIKeysCreate(t *testing.T) {
"--api-key", "string",
"api-keys", "create",
"--name", "name",
"--permissions", "{api_key_create: true, api_key_delete: true, api_key_read: true, domain_create: true, domain_delete: true, domain_read: true, domain_update: true, draft_create: true, draft_delete: true, draft_read: true, draft_send: true, draft_update: true, inbox_create: true, inbox_delete: true, inbox_read: true, inbox_update: true, label_blocked_read: true, label_spam_read: true, label_trash_read: true, list_entry_create: true, list_entry_delete: true, list_entry_read: true, message_read: true, message_send: true, message_update: true, metrics_read: true, pod_create: true, pod_delete: true, pod_read: true, thread_delete: true, thread_read: true, webhook_create: true, webhook_delete: true, webhook_read: true, webhook_update: true}",
"--permissions", "{api_key_create: true, api_key_delete: true, api_key_read: true, api_key_update: true, domain_create: true, domain_delete: true, domain_read: true, domain_update: true, draft_create: true, draft_delete: true, draft_read: true, draft_send: true, draft_update: true, inbox_create: true, inbox_delete: true, inbox_read: true, inbox_update: true, label_blocked_read: true, label_spam_read: true, label_trash_read: true, label_unauthenticated_read: true, list_entry_create: true, list_entry_delete: true, list_entry_read: true, message_delete: true, message_read: true, message_send: true, message_update: true, metrics_read: true, pod_create: true, pod_delete: true, pod_read: true, webhook_create: true, webhook_delete: true, webhook_read: true, webhook_update: true}",
)
})

Expand All @@ -34,6 +34,7 @@ func TestAPIKeysCreate(t *testing.T) {
"--permissions.api-key-create=true",
"--permissions.api-key-delete=true",
"--permissions.api-key-read=true",
"--permissions.api-key-update=true",
"--permissions.domain-create=true",
"--permissions.domain-delete=true",
"--permissions.domain-read=true",
Expand All @@ -50,18 +51,18 @@ func TestAPIKeysCreate(t *testing.T) {
"--permissions.label-blocked-read=true",
"--permissions.label-spam-read=true",
"--permissions.label-trash-read=true",
"--permissions.label-unauthenticated-read=true",
"--permissions.list-entry-create=true",
"--permissions.list-entry-delete=true",
"--permissions.list-entry-read=true",
"--permissions.message-delete=true",
"--permissions.message-read=true",
"--permissions.message-send=true",
"--permissions.message-update=true",
"--permissions.metrics-read=true",
"--permissions.pod-create=true",
"--permissions.pod-delete=true",
"--permissions.pod-read=true",
"--permissions.thread-delete=true",
"--permissions.thread-read=true",
"--permissions.webhook-create=true",
"--permissions.webhook-delete=true",
"--permissions.webhook-read=true",
Expand All @@ -77,6 +78,7 @@ func TestAPIKeysCreate(t *testing.T) {
" api_key_create: true\n" +
" api_key_delete: true\n" +
" api_key_read: true\n" +
" api_key_update: true\n" +
" domain_create: true\n" +
" domain_delete: true\n" +
" domain_read: true\n" +
Expand All @@ -93,18 +95,18 @@ func TestAPIKeysCreate(t *testing.T) {
" label_blocked_read: true\n" +
" label_spam_read: true\n" +
" label_trash_read: true\n" +
" label_unauthenticated_read: true\n" +
" list_entry_create: true\n" +
" list_entry_delete: true\n" +
" list_entry_read: true\n" +
" message_delete: true\n" +
" message_read: true\n" +
" message_send: true\n" +
" message_update: true\n" +
" metrics_read: true\n" +
" pod_create: true\n" +
" pod_delete: true\n" +
" pod_read: true\n" +
" thread_delete: true\n" +
" thread_read: true\n" +
" webhook_create: true\n" +
" webhook_delete: true\n" +
" webhook_read: true\n" +
Expand Down
29 changes: 17 additions & 12 deletions pkg/cmd/inboxapikey.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ var inboxesAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read API keys.",
InnerField: "api_key_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.api-key-update",
Usage: "Update API keys.",
InnerField: "api_key_update",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.domain-create",
Usage: "Create domains.",
Expand Down Expand Up @@ -135,6 +140,11 @@ var inboxesAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Access messages labeled trash.",
InnerField: "label_trash_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.label-unauthenticated-read",
Usage: "Access messages labeled unauthenticated.",
InnerField: "label_unauthenticated_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.list-entry-create",
Usage: "Create list entries.",
Expand All @@ -150,9 +160,14 @@ var inboxesAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read list entries.",
InnerField: "list_entry_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-delete",
Usage: "Delete messages. Also required to delete threads.",
InnerField: "message_delete",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-read",
Usage: "Read messages.",
Usage: "Read messages. Also required to read threads.",
InnerField: "message_read",
},
&requestflag.InnerFlag[*bool]{
Expand All @@ -162,7 +177,7 @@ var inboxesAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-update",
Usage: "Update message labels.",
Usage: "Update message labels. Also required to update threads.",
InnerField: "message_update",
},
&requestflag.InnerFlag[*bool]{
Expand All @@ -185,16 +200,6 @@ var inboxesAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read pods.",
InnerField: "pod_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.thread-delete",
Usage: "Delete threads.",
InnerField: "thread_delete",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.thread-read",
Usage: "Read threads.",
InnerField: "thread_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.webhook-create",
Usage: "Create webhooks.",
Expand Down
12 changes: 7 additions & 5 deletions pkg/cmd/inboxapikey_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func TestInboxesAPIKeysCreate(t *testing.T) {
"inboxes:api-keys", "create",
"--inbox-id", "inbox_id",
"--name", "name",
"--permissions", "{api_key_create: true, api_key_delete: true, api_key_read: true, domain_create: true, domain_delete: true, domain_read: true, domain_update: true, draft_create: true, draft_delete: true, draft_read: true, draft_send: true, draft_update: true, inbox_create: true, inbox_delete: true, inbox_read: true, inbox_update: true, label_blocked_read: true, label_spam_read: true, label_trash_read: true, list_entry_create: true, list_entry_delete: true, list_entry_read: true, message_read: true, message_send: true, message_update: true, metrics_read: true, pod_create: true, pod_delete: true, pod_read: true, thread_delete: true, thread_read: true, webhook_create: true, webhook_delete: true, webhook_read: true, webhook_update: true}",
"--permissions", "{api_key_create: true, api_key_delete: true, api_key_read: true, api_key_update: true, domain_create: true, domain_delete: true, domain_read: true, domain_update: true, draft_create: true, draft_delete: true, draft_read: true, draft_send: true, draft_update: true, inbox_create: true, inbox_delete: true, inbox_read: true, inbox_update: true, label_blocked_read: true, label_spam_read: true, label_trash_read: true, label_unauthenticated_read: true, list_entry_create: true, list_entry_delete: true, list_entry_read: true, message_delete: true, message_read: true, message_send: true, message_update: true, metrics_read: true, pod_create: true, pod_delete: true, pod_read: true, webhook_create: true, webhook_delete: true, webhook_read: true, webhook_update: true}",
)
})

Expand All @@ -36,6 +36,7 @@ func TestInboxesAPIKeysCreate(t *testing.T) {
"--permissions.api-key-create=true",
"--permissions.api-key-delete=true",
"--permissions.api-key-read=true",
"--permissions.api-key-update=true",
"--permissions.domain-create=true",
"--permissions.domain-delete=true",
"--permissions.domain-read=true",
Expand All @@ -52,18 +53,18 @@ func TestInboxesAPIKeysCreate(t *testing.T) {
"--permissions.label-blocked-read=true",
"--permissions.label-spam-read=true",
"--permissions.label-trash-read=true",
"--permissions.label-unauthenticated-read=true",
"--permissions.list-entry-create=true",
"--permissions.list-entry-delete=true",
"--permissions.list-entry-read=true",
"--permissions.message-delete=true",
"--permissions.message-read=true",
"--permissions.message-send=true",
"--permissions.message-update=true",
"--permissions.metrics-read=true",
"--permissions.pod-create=true",
"--permissions.pod-delete=true",
"--permissions.pod-read=true",
"--permissions.thread-delete=true",
"--permissions.thread-read=true",
"--permissions.webhook-create=true",
"--permissions.webhook-delete=true",
"--permissions.webhook-read=true",
Expand All @@ -79,6 +80,7 @@ func TestInboxesAPIKeysCreate(t *testing.T) {
" api_key_create: true\n" +
" api_key_delete: true\n" +
" api_key_read: true\n" +
" api_key_update: true\n" +
" domain_create: true\n" +
" domain_delete: true\n" +
" domain_read: true\n" +
Expand All @@ -95,18 +97,18 @@ func TestInboxesAPIKeysCreate(t *testing.T) {
" label_blocked_read: true\n" +
" label_spam_read: true\n" +
" label_trash_read: true\n" +
" label_unauthenticated_read: true\n" +
" list_entry_create: true\n" +
" list_entry_delete: true\n" +
" list_entry_read: true\n" +
" message_delete: true\n" +
" message_read: true\n" +
" message_send: true\n" +
" message_update: true\n" +
" metrics_read: true\n" +
" pod_create: true\n" +
" pod_delete: true\n" +
" pod_read: true\n" +
" thread_delete: true\n" +
" thread_read: true\n" +
" webhook_create: true\n" +
" webhook_delete: true\n" +
" webhook_read: true\n" +
Expand Down
29 changes: 17 additions & 12 deletions pkg/cmd/podapikey.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ var podsAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read API keys.",
InnerField: "api_key_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.api-key-update",
Usage: "Update API keys.",
InnerField: "api_key_update",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.domain-create",
Usage: "Create domains.",
Expand Down Expand Up @@ -135,6 +140,11 @@ var podsAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Access messages labeled trash.",
InnerField: "label_trash_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.label-unauthenticated-read",
Usage: "Access messages labeled unauthenticated.",
InnerField: "label_unauthenticated_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.list-entry-create",
Usage: "Create list entries.",
Expand All @@ -150,9 +160,14 @@ var podsAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read list entries.",
InnerField: "list_entry_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-delete",
Usage: "Delete messages. Also required to delete threads.",
InnerField: "message_delete",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-read",
Usage: "Read messages.",
Usage: "Read messages. Also required to read threads.",
InnerField: "message_read",
},
&requestflag.InnerFlag[*bool]{
Expand All @@ -162,7 +177,7 @@ var podsAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.message-update",
Usage: "Update message labels.",
Usage: "Update message labels. Also required to update threads.",
InnerField: "message_update",
},
&requestflag.InnerFlag[*bool]{
Expand All @@ -185,16 +200,6 @@ var podsAPIKeysCreate = requestflag.WithInnerFlags(cli.Command{
Usage: "Read pods.",
InnerField: "pod_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.thread-delete",
Usage: "Delete threads.",
InnerField: "thread_delete",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.thread-read",
Usage: "Read threads.",
InnerField: "thread_read",
},
&requestflag.InnerFlag[*bool]{
Name: "permissions.webhook-create",
Usage: "Create webhooks.",
Expand Down
Loading
Loading