From 4b96fcee6192baa084774e65907a041230494a0e Mon Sep 17 00:00:00 2001 From: Jeremy Daer Date: Sun, 25 Oct 2026 15:31:42 -0700 Subject: [PATCH] Bump hey-sdk to v0.34.0 Moves github.com/basecamp/hey-sdk/go from v0.33.1 to v0.34.0 with no CLI call-site changes: every client the CLI builds carries its own auth strategy, so the SDK's new refusal of a client with no credentials does not reach it, and the CLI does not use the SDK's oauth package. The MCP model snapshot is synced from go/v0.34.0. It now carries HEY's OAuth token endpoint (CreateToken, RevokeToken) under the OAuth tag, which stays unmapped on purpose: exchanging a code or revoking a token is the CLI's own sign-in, never a tool to hand an agent. The pinned unmapped-tag list says so. nix/package.nix's vendorHash is recomputed and its build verified. --- go.mod | 2 +- go.sum | 4 +- internal/mcpserver/catalog_test.go | 7 +- internal/mcpserver/model/PROVENANCE.json | 4 +- internal/mcpserver/model/behavior-model.json | 307 ++++++++++++++++ internal/mcpserver/model/openapi.json | 347 +++++++++++++++++++ nix/package.nix | 2 +- 7 files changed, 665 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index efee724bd..52f669fdc 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( charm.land/glamour/v2 v2.0.1 charm.land/lipgloss/v2 v2.0.6 github.com/basecamp/actioncable-client/go/v2 v2.0.2 - github.com/basecamp/hey-sdk/go v0.33.1 + github.com/basecamp/hey-sdk/go v0.34.0 github.com/basecamp/mcp v0.0.0-20260828100356-2d6f44b51e9d github.com/charmbracelet/x/ansi v0.11.9 github.com/fsnotify/fsnotify v1.10.1 diff --git a/go.sum b/go.sum index 1f1422430..a7aa903f3 100644 --- a/go.sum +++ b/go.sum @@ -89,8 +89,8 @@ github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuP github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/basecamp/actioncable-client/go/v2 v2.0.2 h1:h2Sl15gj2lI/EX5E0EUxjyYgf0LF9Gn1zqEUInSrUpc= github.com/basecamp/actioncable-client/go/v2 v2.0.2/go.mod h1:3Y0N9V5LXclT5nQWcPhq/+6rj4eKXgKAX8dx15X8yB8= -github.com/basecamp/hey-sdk/go v0.33.1 h1:iMao0I8u6Q5ozkpm0dp7L9ge2BJY7vRMVJuFZxTo7RY= -github.com/basecamp/hey-sdk/go v0.33.1/go.mod h1:/idi1NgEn1l5AtKM7PwpfnvZgKwx/Hw3xz2k5Pc6woA= +github.com/basecamp/hey-sdk/go v0.34.0 h1:2ZsAnCazoblw1bnv2LL20b2c0nqo6uQOd2sEprXrea8= +github.com/basecamp/hey-sdk/go v0.34.0/go.mod h1:/idi1NgEn1l5AtKM7PwpfnvZgKwx/Hw3xz2k5Pc6woA= github.com/basecamp/mcp v0.0.0-20260828100356-2d6f44b51e9d h1:zEQVGq1x1nhKMZ2TudFAcSJ32CHT8richI1vQakIKz4= github.com/basecamp/mcp v0.0.0-20260828100356-2d6f44b51e9d/go.mod h1:Ee2c/q1/pg+5T5741PIuA3s6VJMQC7I0XBNXIHIujzA= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= diff --git a/internal/mcpserver/catalog_test.go b/internal/mcpserver/catalog_test.go index 95c1540aa..dc15f5c5b 100644 --- a/internal/mcpserver/catalog_test.go +++ b/internal/mcpserver/catalog_test.go @@ -55,8 +55,11 @@ func TestCatalogUnmappedTagsArePinned(t *testing.T) { want := []string{ "Attachments", "Bulk Reply", "Calendar Events", "Calendar Habits", "Calendar Journal", "Calendar Periods", "Calendar Time Tracks", "Clips", - "Collections", "Extenzions", "Folders", "Postings", - "Publications", "Snippets", "Stickies", "Workflows", + "Collections", "Extenzions", "Folders", + // The token endpoint stays unmapped on purpose: exchanging a code or revoking a + // token is the CLI's own sign-in, never a tool to hand an agent. + "OAuth", + "Postings", "Publications", "Snippets", "Stickies", "Workflows", } got, _ := json.Marshal(unmapped) expected, _ := json.Marshal(want) diff --git a/internal/mcpserver/model/PROVENANCE.json b/internal/mcpserver/model/PROVENANCE.json index c7e26e8e3..89341d07b 100644 --- a/internal/mcpserver/model/PROVENANCE.json +++ b/internal/mcpserver/model/PROVENANCE.json @@ -1,7 +1,7 @@ { "source": "github.com/basecamp/hey-sdk", - "commit": "ed0becfa7c7d07d8814ba5998771dffed201de85", - "ref": "go/v0.33.1", + "commit": "582760f3912cf9d9506e6c8b2d0e7ee05d66011c", + "ref": "go/v0.34.0", "files": ["behavior-model.json", "openapi.json"], "synced_by": "scripts/sync-mcp-model.sh" } diff --git a/internal/mcpserver/model/behavior-model.json b/internal/mcpserver/model/behavior-model.json index d5226cdb7..0614f1c54 100644 --- a/internal/mcpserver/model/behavior-model.json +++ b/internal/mcpserver/model/behavior-model.json @@ -5,6 +5,7 @@ "AddPostingsToBoxGroup": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -16,11 +17,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "AdvancedSearch": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link" @@ -35,11 +38,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "BubbleUpPostingsNow": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -51,11 +56,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "BulkUpdateClearances": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -67,11 +74,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "BundleContact": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -83,11 +92,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CancelPostingsBubbleUp": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -99,11 +110,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CompleteCalendarTodo": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -115,11 +128,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CompleteHabit": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -131,11 +146,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateBoxDesignation": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -147,11 +164,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateBoxGroup": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -163,21 +182,25 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateBulkReply": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": true, "readonly": false, "retry": { "max": 0 }, + "unsigned": false, "untrusted_content": false }, "CreateCalendarTodo": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -189,11 +212,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateContact": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -205,21 +230,25 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "CreateDirectUpload": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { "max": 0 }, + "unsigned": false, "untrusted_content": false }, "CreateFolderForPostings": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -231,11 +260,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateHabit": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -247,6 +278,7 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateMessage": { @@ -262,6 +294,7 @@ } ], "idempotent": false, + "no_redirect": false, "open_world": true, "readonly": false, "retry": { @@ -273,6 +306,7 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateReply": { @@ -288,6 +322,7 @@ } ], "idempotent": false, + "no_redirect": false, "open_world": true, "readonly": false, "retry": { @@ -299,11 +334,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateSticky": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -315,11 +352,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "CreateTimeTrack": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -331,11 +370,28 @@ 503 ] }, + "unsigned": false, + "untrusted_content": false + }, + "CreateToken": { + "destructive": false, + "idempotent": false, + "no_redirect": true, + "open_world": false, + "readonly": false, + "retry": { + "backoff": "exponential", + "base_delay_ms": 1000, + "max": 1, + "retry_on": [] + }, + "unsigned": true, "untrusted_content": false }, "CreateTopicComment": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -347,21 +403,25 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "CreateWorkflowStaging": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { "max": 0 }, + "unsigned": false, "untrusted_content": false }, "DeleteBoxDesignation": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -373,11 +433,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteBoxGroup": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -389,11 +451,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteCalendarEvent": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": true, "readonly": false, "retry": { @@ -405,11 +469,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteCalendarEventOccurrence": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": true, "readonly": false, "retry": { @@ -421,11 +487,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteCalendarTodo": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -437,11 +505,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteContactAvatar": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -453,11 +523,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteContactNote": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -469,11 +541,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteDraft": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -485,11 +559,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteExtenzion": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -501,11 +577,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteHabit": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -517,11 +595,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteSticky": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -533,11 +613,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "DeleteTimeTrack": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -549,11 +631,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "EmptySpam": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -565,11 +649,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "EmptyTrash": { "destructive": true, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -581,11 +667,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "FilePostings": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -597,11 +685,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetAdvancedSearchFilters": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -613,11 +703,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetAsidebox": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -629,11 +721,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetBox": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -649,11 +743,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetBoxGroup": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -669,11 +765,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetBoxPostingChanges": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "pageParameter": "page", @@ -690,11 +788,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetBubblebox": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -706,11 +806,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetBundleUnseenPostings": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -726,11 +828,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetCalendarDay": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -742,11 +846,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetCalendarRecordings": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "window" @@ -761,11 +867,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetCalendarWeek": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -777,11 +885,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetCalendarYear": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -793,11 +903,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetClearances": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -813,11 +925,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetCollection": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -833,11 +947,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetContact": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -853,11 +969,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetContactNote": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -869,11 +987,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetEverythingTopics": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -889,11 +1009,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetFeedbox": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -905,11 +1027,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetFolder": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -925,11 +1049,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetIdentity": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -941,11 +1067,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetImbox": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -957,11 +1085,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetImboxSeen": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -973,11 +1103,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetJournalEntry": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -989,11 +1121,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetLaterbox": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1005,11 +1139,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetMessage": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1021,11 +1157,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetMessageEdit": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1037,11 +1175,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetMyClearances": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1057,11 +1197,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetNavigation": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1073,6 +1215,7 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetOngoingTimeTrack": { @@ -1081,6 +1224,7 @@ 404 ], "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1092,11 +1236,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetSentTopics": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1112,11 +1258,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetSpamTopics": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1132,11 +1280,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetTopic": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1148,11 +1298,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetTopicCommentAudience": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1164,11 +1316,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetTopicEntries": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1184,11 +1338,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetTopicPublication": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1200,11 +1356,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetTrailbox": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1216,11 +1374,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetTrashTopics": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1236,11 +1396,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "GetWorkflow": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1252,11 +1414,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "GetWorkflowStage": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1268,11 +1432,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "HideContact": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1284,11 +1450,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ListAddressableContacts": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1300,11 +1468,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "ListBoxGroups": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1316,11 +1486,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ListBoxes": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1336,11 +1508,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ListCalendarDays": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1352,11 +1526,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "ListCalendarWeeks": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1368,11 +1544,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "ListCalendars": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1384,11 +1562,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "ListClips": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1404,11 +1584,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "ListCollections": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1420,11 +1602,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ListContacts": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1440,11 +1624,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "ListDrafts": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link", @@ -1460,11 +1646,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "ListJournalEntries": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link" @@ -1479,11 +1667,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ListSnippets": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1495,11 +1685,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ListStickies": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1511,11 +1703,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ListTimeTrackCategories": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1527,11 +1721,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ListTimeTracks": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "pagination": { "style": "link" @@ -1546,11 +1742,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MarkBoxSeen": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1562,11 +1760,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MarkEntrySpam": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1578,11 +1778,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MarkPostingsSeen": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1594,11 +1796,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MarkPostingsSpam": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1610,11 +1814,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MarkPostingsUnseen": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1626,11 +1832,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MarkTopicHam": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1642,11 +1850,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MovePostings": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1658,11 +1868,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MoveSticky": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1674,11 +1886,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MoveTopic": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1690,21 +1904,25 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "MoveWorkflowStaging": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { "max": 0 }, + "unsigned": false, "untrusted_content": false }, "MutePostings": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1716,11 +1934,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "NewBulkReply": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1732,11 +1952,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "NewEntryForward": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1748,11 +1970,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "NewEntryReply": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": true, "retry": { @@ -1764,11 +1988,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "PuntClearances": { "destructive": true, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1780,11 +2006,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "RemovePostingsFromBoxGroup": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1796,11 +2024,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "RenameTopic": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1812,11 +2042,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "RestoreTopic": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1828,11 +2060,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ResumeHabit": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1844,11 +2078,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "RevealContact": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1860,11 +2096,31 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, + "RevokeToken": { + "destructive": true, + "idempotent": false, + "no_redirect": true, + "open_world": false, + "readonly": false, + "retry": { + "backoff": "exponential", + "base_delay_ms": 1000, + "max": 3, + "retry_on": [ + 429, + 503 + ] + }, + "unsigned": true, + "untrusted_content": false + }, "SchedulePostingsBubbleUp": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1876,11 +2132,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "StartTimeTrack": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1892,11 +2150,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "StopHabit": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1908,11 +2168,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "ToggleCalendar": { "destructive": false, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1924,11 +2186,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "TrashPostings": { "destructive": true, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1940,11 +2204,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "TrashTopic": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1956,11 +2222,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UnbundleContact": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1972,11 +2240,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UncompleteCalendarTodo": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -1988,11 +2258,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UncompleteHabit": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2004,11 +2276,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UnfilePostings": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2020,11 +2294,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UnmutePostings": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2036,11 +2312,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateCalendarTodo": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2052,11 +2330,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateClearance": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2068,11 +2348,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "UpdateCollection": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2084,11 +2366,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateContact": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2100,11 +2384,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "UpdateContactAvatar": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2116,11 +2402,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "UpdateContactClearance": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2132,11 +2420,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateContactNote": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2148,11 +2438,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateFirstWeekDay": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2164,11 +2456,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateHabit": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2180,11 +2474,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateJournalEntry": { "destructive": true, "idempotent": false, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2196,6 +2492,7 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateMessage": { @@ -2211,6 +2508,7 @@ } ], "idempotent": false, + "no_redirect": false, "open_world": true, "readonly": false, "retry": { @@ -2222,11 +2520,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateMyClearance": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2238,11 +2538,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": true }, "UpdateSticky": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2254,11 +2556,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateTimeFormat": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2270,11 +2574,13 @@ 503 ] }, + "unsigned": false, "untrusted_content": false }, "UpdateTimeTrack": { "destructive": false, "idempotent": true, + "no_redirect": false, "open_world": false, "readonly": false, "retry": { @@ -2286,6 +2592,7 @@ 503 ] }, + "unsigned": false, "untrusted_content": false } }, diff --git a/internal/mcpserver/model/openapi.json b/internal/mcpserver/model/openapi.json index 7d957671b..41db38230 100644 --- a/internal/mcpserver/model/openapi.json +++ b/internal/mcpserver/model/openapi.json @@ -7794,6 +7794,194 @@ "x-hey-untrusted-content": false } }, + "/oauth/tokens.json": { + "delete": { + "description": "Revoke an access or a refresh token the client was handed, ending the session behind it:\nwhat a sign-out asks. HEY answers 200 {} for a token that names nothing, the point of\nrevoking it reached, and refuses one another client was handed (invalid_client, 401).\nThe token goes in the body, never the query, where logs would keep it, so this DELETE has\na payload: HEY reads its params from either, and every SDK's client sends one.", + "operationId": "RevokeToken", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RevokeTokenRequestContent" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "RevokeToken 200 response" + }, + "400": { + "description": "OAuthBadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthBadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "OAuthUnauthorizedError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthUnauthorizedErrorResponseContent" + } + } + } + }, + "429": { + "description": "OAuthTooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthTooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "InternalServerError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerErrorResponseContent" + } + } + } + }, + "503": { + "description": "ServiceUnavailableError 503 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent" + } + } + } + } + }, + "tags": [ + "OAuth" + ], + "x-hey-destructive": true, + "x-hey-no-redirect": {}, + "x-hey-open-world": false, + "x-hey-retry": { + "maxAttempts": 3, + "baseDelayMs": 1000, + "backoff": "exponential", + "retryOn": [ + 429, + 503 + ] + }, + "x-hey-unsigned": {}, + "x-hey-untrusted-content": false + }, + "post": { + "description": "Trade an authorization code, or a refresh token, for tokens. `grant_type` names which:\n\"authorization_code\" sends `code`, `redirect_uri` and `code_verifier` (PKCE), and\n\"refresh_token\" sends `refresh_token`. Every grant names the client and the install it is\nfor. A refresh answers the refresh token it was sent, unchanged, beside the new access\ntoken. Not sent again after a failure: a code is redeemed once.", + "operationId": "CreateToken", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTokenRequestContent" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "CreateToken 200 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthToken" + } + } + } + }, + "400": { + "description": "OAuthBadRequestError 400 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthBadRequestErrorResponseContent" + } + } + } + }, + "401": { + "description": "OAuthUnauthorizedError 401 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthUnauthorizedErrorResponseContent" + } + } + } + }, + "403": { + "description": "OAuthForbiddenError 403 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthForbiddenErrorResponseContent" + } + } + } + }, + "429": { + "description": "OAuthTooManyRequestsError 429 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OAuthTooManyRequestsErrorResponseContent" + } + } + } + }, + "500": { + "description": "InternalServerError 500 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerErrorResponseContent" + } + } + } + }, + "503": { + "description": "ServiceUnavailableError 503 response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent" + } + } + } + } + }, + "tags": [ + "OAuth" + ], + "x-hey-destructive": false, + "x-hey-no-redirect": {}, + "x-hey-open-world": false, + "x-hey-retry": { + "maxAttempts": 1, + "baseDelayMs": 1000, + "backoff": "exponential", + "retryOn": [] + }, + "x-hey-unsigned": {}, + "x-hey-untrusted-content": false + } + }, "/paper_trail.json": { "get": { "description": "Get the Paper Trail", @@ -12888,6 +13076,53 @@ "CreateTimeTrackResponseContent": { "$ref": "#/components/schemas/Recording" }, + "CreateTokenRequestContent": { + "type": "object", + "properties": { + "grant_type": { + "type": "string", + "description": "\"authorization_code\" or \"refresh_token\"." + }, + "client_id": { + "type": "string", + "description": "The OAuth client's id." + }, + "install_id": { + "type": "string", + "description": "Identifies this installation to HEY as a device: the value the authorization URL\ncarried, for a code." + }, + "code": { + "type": "string", + "description": "The authorization code the redirect carried (authorization_code).", + "x-hey-sensitive": { + "category": "credential" + } + }, + "redirect_uri": { + "type": "string", + "description": "The redirect URI the authorization request named (authorization_code)." + }, + "code_verifier": { + "type": "string", + "description": "The PKCE verifier whose challenge the authorization request sent (authorization_code).", + "x-hey-sensitive": { + "category": "credential" + } + }, + "refresh_token": { + "type": "string", + "description": "The refresh token to trade (refresh_token).", + "x-hey-sensitive": { + "category": "credential" + } + } + }, + "required": [ + "client_id", + "grant_type", + "install_id" + ] + }, "CreateTopicCommentRequestContent": { "type": "object", "description": "Wire format: {comment: {content: \"
…
\"}}", @@ -14152,6 +14387,98 @@ "message" ] }, + "OAuthBadRequestErrorResponseContent": { + "type": "object", + "description": "A refusal from the token endpoint (RFC 6749 §5.2): invalid_request, invalid_grant,\nunsupported_grant_type and the like. `error` is the code a client acts on;\n`error_description` is HEY's sentence for a person (\"install_id doesn't identify this install.\nUpgrade your client.\").", + "properties": { + "error": { + "type": "string" + }, + "error_description": { + "type": "string" + } + }, + "required": [ + "error" + ] + }, + "OAuthForbiddenErrorResponseContent": { + "type": "object", + "description": "unauthorized_client, or two_factor_authentication_required.", + "properties": { + "error": { + "type": "string" + }, + "error_description": { + "type": "string" + } + }, + "required": [ + "error" + ] + }, + "OAuthToken": { + "type": "object", + "description": "The tokens a grant answers.", + "properties": { + "access_token": { + "type": "string", + "x-hey-sensitive": { + "category": "credential" + } + }, + "token_type": { + "type": "string", + "description": "\"bearer\"." + }, + "expires_in": { + "type": "integer", + "description": "Seconds the access token lasts from the moment HEY answered.", + "format": "int64" + }, + "refresh_token": { + "type": "string", + "description": "The token to refresh with: a new one for a code, the one sent for a refresh.", + "x-hey-sensitive": { + "category": "credential" + } + } + }, + "required": [ + "access_token", + "token_type" + ] + }, + "OAuthTooManyRequestsErrorResponseContent": { + "type": "object", + "description": "rate_limit_exceeded: too many failed grants within the hour.", + "properties": { + "error": { + "type": "string" + }, + "error_description": { + "type": "string" + } + }, + "required": [ + "error" + ] + }, + "OAuthUnauthorizedErrorResponseContent": { + "type": "object", + "description": "invalid_client, or invalid_grant for a dead refresh token: HEY answers that one 401 rather\nthan RFC 6749's 400, since shipped apps sign out on a refresh 401. The code tells the two\napart.", + "properties": { + "error": { + "type": "string" + }, + "error_description": { + "type": "string" + } + }, + "required": [ + "error" + ] + }, "Organizer": { "type": "object", "description": "Organizer — calendar event organizer", @@ -14754,6 +15081,26 @@ "RevealContactResponseContent": { "$ref": "#/components/schemas/Contact" }, + "RevokeTokenRequestContent": { + "type": "object", + "properties": { + "client_id": { + "type": "string", + "description": "The OAuth client's id: the client the token was handed to." + }, + "token": { + "type": "string", + "description": "The access or refresh token to revoke.", + "x-hey-sensitive": { + "category": "credential" + } + } + }, + "required": [ + "client_id", + "token" + ] + }, "SchedulePostingsBubbleUpRequestContent": { "type": "object", "properties": { diff --git a/nix/package.nix b/nix/package.nix index 5848e93bb..99d5eced4 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -18,7 +18,7 @@ buildGoModule.override { inherit go; } (finalAttrs: { # To update: run `make update-nix-hash` (Docker). It rewrites this quoted # value in place, so keep it a string literal rather than lib.fakeHash. - vendorHash = "sha256-eU2YUbyuOLwZ/owju0HcziWNFM1xG1DqnjpfCqkT85k="; + vendorHash = "sha256-UNlf35JRcZFPxRoTTXiY+cdLV+7mjKY6pP14uULfD5U="; subPackages = [ "cmd/hey" ];