From 679884ab521c72e8e900b228f558cb6e4c48bb05 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Wed, 8 Jul 2026 02:21:09 +0000 Subject: [PATCH 1/2] ## Go SDK Changes: * `Glean.Client.Tools.RetrieveToolServerAuthStatus()`: **Added** * `Glean.Client.Tools.AuthorizeToolServer()`: **Added** * `Glean.Client.Search.RetrieveFeed()`: * `request.FeedRequest.Categories[].Enum(adminHealthCenter)` **Added** * `response.Results[]` **Changed** --- .speakeasy/gen.lock | 198 ++++++-- .speakeasy/gen.yaml | 2 +- .speakeasy/glean-merged-spec.yaml | 200 +++++++- .speakeasy/tests.arazzo.yaml | 38 ++ .speakeasy/workflow.lock | 12 +- README.md | 2 + RELEASES.md | 12 +- .../apierrors/platformproblemdetailerror.md | 4 +- .../components/authorizetoolserverrequest.md | 8 + .../components/authorizetoolserverresponse.md | 8 + docs/models/components/feedrequestcategory.md | 3 +- docs/models/components/feedresultcategory.md | 3 +- docs/models/components/justificationtype.md | 3 +- .../models/components/toolserverauthstatus.md | 24 + .../toolserverauthstatusresponse.md | 12 + .../operations/authorizetoolserverrequest.md | 9 + .../operations/authorizetoolserverresponse.md | 9 + .../gettoolserverauthstatusrequest.md | 8 + .../gettoolserverauthstatusresponse.md | 9 + docs/sdks/tools/README.md | 119 +++++ glean.go | 6 +- .../components/authorizetoolserverrequest.go | 17 + .../components/authorizetoolserverresponse.go | 17 + models/components/feedentry.go | 3 +- models/components/feedrequest.go | 3 + models/components/feedresult.go | 3 +- models/components/toolserverauthstatus.go | 26 + .../toolserverauthstatusresponse.go | 55 +++ models/operations/authorizetoolserver.go | 47 ++ models/operations/gettoolserverauthstatus.go | 39 ++ .../internal/handler/generated_handlers.go | 2 + ...pathgetrestapiv1toolserversserveridauth.go | 65 +++ .../pathpostrestapiv1createcollection.go | 20 +- .../handler/pathpostrestapiv1getchat.go | 4 +- ...athpostrestapiv1toolserversserveridauth.go | 69 +++ .../components/authorizetoolserverrequest.go | 17 + .../components/authorizetoolserverresponse.go | 17 + .../sdk/models/components/feedentry.go | 3 + .../sdk/models/components/feedrequest.go | 3 + .../sdk/models/components/feedresult.go | 3 + .../models/components/toolserverauthstatus.go | 35 ++ .../toolserverauthstatusresponse.go | 55 +++ .../models/operations/authorizetoolserver.go | 47 ++ .../operations/gettoolserverauthstatus.go | 39 ++ tests/summarize_test.go | 14 +- tests/tools_test.go | 36 ++ tools.go | 453 ++++++++++++++++++ 47 files changed, 1695 insertions(+), 86 deletions(-) create mode 100644 docs/models/components/authorizetoolserverrequest.md create mode 100644 docs/models/components/authorizetoolserverresponse.md create mode 100644 docs/models/components/toolserverauthstatus.md create mode 100644 docs/models/components/toolserverauthstatusresponse.md create mode 100644 docs/models/operations/authorizetoolserverrequest.md create mode 100644 docs/models/operations/authorizetoolserverresponse.md create mode 100644 docs/models/operations/gettoolserverauthstatusrequest.md create mode 100644 docs/models/operations/gettoolserverauthstatusresponse.md create mode 100644 models/components/authorizetoolserverrequest.go create mode 100644 models/components/authorizetoolserverresponse.go create mode 100644 models/components/toolserverauthstatus.go create mode 100644 models/components/toolserverauthstatusresponse.go create mode 100644 models/operations/authorizetoolserver.go create mode 100644 models/operations/gettoolserverauthstatus.go create mode 100644 tests/mockserver/internal/handler/pathgetrestapiv1toolserversserveridauth.go create mode 100644 tests/mockserver/internal/handler/pathpostrestapiv1toolserversserveridauth.go create mode 100644 tests/mockserver/internal/sdk/models/components/authorizetoolserverrequest.go create mode 100644 tests/mockserver/internal/sdk/models/components/authorizetoolserverresponse.go create mode 100644 tests/mockserver/internal/sdk/models/components/toolserverauthstatus.go create mode 100644 tests/mockserver/internal/sdk/models/components/toolserverauthstatusresponse.go create mode 100644 tests/mockserver/internal/sdk/models/operations/authorizetoolserver.go create mode 100644 tests/mockserver/internal/sdk/models/operations/gettoolserverauthstatus.go diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 0a1067d6..fbbde1d1 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,18 +1,18 @@ lockVersion: 2.0.0 id: 9d90eb9e-33f8-4170-8944-988f4000aad0 management: - docChecksum: 6718837b4405c131be50d0c12e238d38 + docChecksum: 379d9fd3275f5f9782fa0b945862dee2 docVersion: 0.9.0 - speakeasyVersion: 1.788.1 - generationVersion: 2.915.1 - releaseVersion: 0.13.1 - configChecksum: 92db9c4e18ce82c655fe3f0ec7d32522 + speakeasyVersion: 1.789.0 + generationVersion: 2.916.2 + releaseVersion: 0.13.2 + configChecksum: 17587fb8ea315ba0196713710aea0ea1 repoURL: https://github.com/gleanwork/api-client-go.git installationURL: https://github.com/gleanwork/api-client-go persistentEdits: - generation_id: 9ad2f7d4-0c03-4bbb-935e-a27490112dad - pristine_commit_hash: 58b8a8d1b425db3e8fc0c54ca7415823c30a6c7b - pristine_tree_hash: 108f573b9323bbcdbcbd3e1e8e65d931a307c19d + generation_id: ff4dfd65-609d-4ef2-ab20-502a8dcd0d6c + pristine_commit_hash: 923b8ed419625189638979c951775673a1026df1 + pristine_tree_hash: 6f9472a4c5bf9279ee12c81129c155bf36df719e features: go: acceptHeaders: 2.81.2 @@ -146,8 +146,8 @@ trackedFiles: pristine_git_object: 75868af81c9e04681ab74330ad74ea8f9e9c3b4f docs/models/apierrors/platformproblemdetailerror.md: id: ad3e04044cbb - last_write_checksum: sha1:5f770f4a9e17108872a567928cc54fe1039cc187 - pristine_git_object: 6316a3fe64fbe40a930c399fb2fe4259f91f9e02 + last_write_checksum: sha1:812c26ba93a850fb5758ae41acac54ad0f92ee21 + pristine_git_object: 15f349e535ee10e94a6d6999e2ebdeeb65239e7b docs/models/components/actionauthtype.md: id: 07cbf48e969a last_write_checksum: sha1:6d609d81eaeefe3bb665df590caeb3d1345d05c9 @@ -356,6 +356,14 @@ trackedFiles: id: cf75beca77d8 last_write_checksum: sha1:869afaa8f56667691db95b7382408628e47d835f pristine_git_object: 7f0f7a5d0b4686c79af5d43c421eb1a8ad5e2151 + docs/models/components/authorizetoolserverrequest.md: + id: c7bba5fd32c2 + last_write_checksum: sha1:4d484f24b856f8d5dd7ebe1df1c020a902f340e2 + pristine_git_object: 780ba6740ac6cfca2b7bee2fa90fe73c2f804c9a + docs/models/components/authorizetoolserverresponse.md: + id: 8820100e66fb + last_write_checksum: sha1:b876d80cfa2c76ae51ffe6eade3aeb74ad9bfc4b + pristine_git_object: cc4d5c7cea2353fbf6e9a25ffdbc8295ad845795 docs/models/components/authstatus.md: id: 88b44e84336b last_write_checksum: sha1:ff83ed570c4804703dd36d477ca682d2d9d74f36 @@ -1278,8 +1286,8 @@ trackedFiles: pristine_git_object: c8e4adbb9259788d825acac24b08c9cd9afca960 docs/models/components/feedrequestcategory.md: id: 801f1c3c64d4 - last_write_checksum: sha1:c1a35869a954849bcae29080ed0017f4785a20a9 - pristine_git_object: 2c2429d727be63bd156e710952d68681b4cdcb6c + last_write_checksum: sha1:98f92f5c5b764abea61013cb06a159701e6cf5ed + pristine_git_object: cb8ed2426bd91738d49fce0585af59b414874dfe docs/models/components/feedrequestoptions.md: id: 76c5e4412304 last_write_checksum: sha1:674915ceaa3b9eec9d9543dc9f0e6a85b394174e @@ -1294,8 +1302,8 @@ trackedFiles: pristine_git_object: a3d714f78ae220cd1f1ebda6e5c4ae2d51846208 docs/models/components/feedresultcategory.md: id: 94c0249352b4 - last_write_checksum: sha1:8b701d39d31d9b146d061cb9e3e9c583b8a28497 - pristine_git_object: 8d7e25e24647317679cba3cf057267553ec89193 + last_write_checksum: sha1:b758401cb0809735039587b807c933a9b7bb31a4 + pristine_git_object: c55089d045c1c5977fa5e59712495c27250ffd08 docs/models/components/fieldscope.md: id: 23caffb85bb7 last_write_checksum: sha1:65cdffa9b7bf28a760c906f49dc7417f37b9e56f @@ -1614,8 +1622,8 @@ trackedFiles: pristine_git_object: 1bea03f64d1d2cc4ba8bf2f9dc1323ce275348aa docs/models/components/justificationtype.md: id: 5a15880767a5 - last_write_checksum: sha1:aef6c6cfd7d65ff89de6b4de711cf3381e03beda - pristine_git_object: 60752d0b28bbb3c3dd38c6b024ce0bd757545930 + last_write_checksum: sha1:b61dceba0a2c6ef3475bf81891fa658d084299f3 + pristine_git_object: 243e7d2cb9b4aee4d2ee026b4ac25e4254d9f224 docs/models/components/knowledgetype.md: id: cf27a7cefa69 last_write_checksum: sha1:f7294d6350e558a0a626ac41241ccbf0facacf10 @@ -2432,6 +2440,14 @@ trackedFiles: id: 699b312c376a last_write_checksum: sha1:8d82f9835e09b4e058b3c174943efb61c60a87de pristine_git_object: 6296555d8a73d5b64d1f399890565d64d9d57a48 + docs/models/components/toolserverauthstatus.md: + id: 7c054e893415 + last_write_checksum: sha1:c80d143c2c3559857bee0c5a610072a6d6482367 + pristine_git_object: 638e5a44994d576b0594c83931073b945a4d5e6b + docs/models/components/toolserverauthstatusresponse.md: + id: 635d680d7d13 + last_write_checksum: sha1:d1e9a942cd27648e0065a1b86021420badf9f5ee + pristine_git_object: 7740b71450d68eee5541fad0d2dd1d7dc7a63c78 docs/models/components/toolsets.md: id: bb508a7ac0ec last_write_checksum: sha1:a87936801d5f0749fc676c773b60d67ab0a3ad0b @@ -2676,6 +2692,14 @@ trackedFiles: id: 27e8e7c29119 last_write_checksum: sha1:158688ce2520a0d44fb085142914a13ba0428079 pristine_git_object: 8909797b8f822c95d1b525fd7d105066c8709e76 + docs/models/operations/authorizetoolserverrequest.md: + id: d3631d90688a + last_write_checksum: sha1:5366398a3be78217d34151cd03ad562405568966 + pristine_git_object: a94aff20be3611ca5b260cc8c4e9927341817b4a + docs/models/operations/authorizetoolserverresponse.md: + id: cd8199b9b5c0 + last_write_checksum: sha1:e2a1d0368c0df513794e173332ca66d3cb2ed8e5 + pristine_git_object: ed6915e8db275cadbbf23f87601952ba058f063f docs/models/operations/autocompleterequest.md: id: 752ede2ff9a7 last_write_checksum: sha1:7c1876252a95fc254c924a4bcafbc442915f000a @@ -3116,6 +3140,14 @@ trackedFiles: id: 1bad23e8866c last_write_checksum: sha1:c6db079a01aea548bfd7aa77d676a9f7055bc01e pristine_git_object: 75e6c5e0ab1f0d4be8928b003a95674f1288f64d + docs/models/operations/gettoolserverauthstatusrequest.md: + id: 33d43b4b0b0c + last_write_checksum: sha1:3c2c1106275da561855c17990ba9b9a7c09a2eff + pristine_git_object: 1f58cc2493a8dcd9a62764cc37e83eca0a99dff3 + docs/models/operations/gettoolserverauthstatusresponse.md: + id: 960c8e16f7e1 + last_write_checksum: sha1:c52cb0e260e24f58042491a148f2e66097e50390 + pristine_git_object: a320041d4756823f1898edaa74273aa9f0fb2de1 docs/models/operations/insightsrequest.md: id: 95f929c56d86 last_write_checksum: sha1:fd18b5c4785b7790352f1e8a1090b60277daea2c @@ -3666,8 +3698,8 @@ trackedFiles: pristine_git_object: 5c2e0e0cb27415789b2a4084576cd18cf658b7d0 docs/sdks/tools/README.md: id: 044286549bac - last_write_checksum: sha1:bf79fa8a7724841bdbe594426f607ecc76b10eee - pristine_git_object: be22c1093e027eefa2f48a25ec628863c538437c + last_write_checksum: sha1:496baa99aee4567d5338f6bf39dbca987ea67684 + pristine_git_object: b635f2e07916b169ad3081f36d7a76c419ed33ed docs/sdks/verification/README.md: id: 8148670b64d3 last_write_checksum: sha1:644e22c050d13ef496bc2551f2f3944e6f4864de @@ -3690,8 +3722,8 @@ trackedFiles: pristine_git_object: a3cb3e5448f3fdcfad77ed2a4ba47ae848d5cd5d glean.go: id: f5ed099b8e85 - last_write_checksum: sha1:2c7d50e20d953d3af7cf4a187c4271b08d475749 - pristine_git_object: 19185809484d9a6a95a3f91eed860d77769a071e + last_write_checksum: sha1:7e824fe912706baa5943a6276670a6be8a6c5108 + pristine_git_object: bf6b4cb5c767be1a1ae6196b217605bb5f5f1c11 go.mod: id: c47645c391ad last_write_checksum: sha1:cf65a2c96e303858d4cf70e07d4c44d3f1c1db38 @@ -3964,6 +3996,14 @@ trackedFiles: id: 45636e056a26 last_write_checksum: sha1:9511a9ec5d1ed14d28c9425aaaf3c38b591cf87a pristine_git_object: 79e6b067c28c061f658547e3ddf0e196a1feec58 + models/components/authorizetoolserverrequest.go: + id: 39e162096c61 + last_write_checksum: sha1:4ac1708892f8018ad08c13519a519401543367ca + pristine_git_object: 6eeeca077f565056247b616f9933830d43c5ca0c + models/components/authorizetoolserverresponse.go: + id: d2c3f283bf30 + last_write_checksum: sha1:32c04158839174a1a89993b529e78e9484bcaed3 + pristine_git_object: c9b32295943a85e010798c799cf1c558ebb098f2 models/components/authstatus.go: id: f5c00a42daa4 last_write_checksum: sha1:5321c3fa41d30c42302c327ee6beeb0c12492a9f @@ -4706,12 +4746,12 @@ trackedFiles: pristine_git_object: 220dbff76d0d3d12e6bdcb05787a6df030124ca5 models/components/feedentry.go: id: 2826af1aa01a - last_write_checksum: sha1:d7273c204b3f1e88a2d6afff563b337ff297f112 - pristine_git_object: fd3ae67446b84dbd9b0184d5e1017afa330c0287 + last_write_checksum: sha1:818f9e61c9511e238bf8ff1f27dd8d2c569a2e2c + pristine_git_object: 4e59579944a412a695f97204ad50a943cea77ab6 models/components/feedrequest.go: id: 9f0a682fc981 - last_write_checksum: sha1:a811bff8059b15f0998a2d7400f69d14a28e4827 - pristine_git_object: 5e1d169b6083cf6eb577b7c50227087735271a72 + last_write_checksum: sha1:11fcef6129dd5a0b4761e80f264f10ec3ab82dc3 + pristine_git_object: 912d2657b1c557c6977daef1a4ae6854f2e032e4 models/components/feedrequestoptions.go: id: a56c104c989d last_write_checksum: sha1:7f238a9abb079c78202b1a9f65c87b82420f63ec @@ -4722,8 +4762,8 @@ trackedFiles: pristine_git_object: 60cb4b19cbb9bd29e37128e3110b2bf0a8f80d30 models/components/feedresult.go: id: f017ac6e3ac3 - last_write_checksum: sha1:6035a897155b3499e42f322287b2c180a7ae4ee7 - pristine_git_object: 46031d53a125f723520fed79fe4690692811149c + last_write_checksum: sha1:282ccf47b8867f5a0ea92799b2d2bcc8d9436fcc + pristine_git_object: 17635383efc7f4b74a40ea7ab160817cf6a4c02b models/components/followupaction.go: id: aba266d23418 last_write_checksum: sha1:0a17407e6beba30680e5c38151e426a5ce7aab76 @@ -5608,6 +5648,14 @@ trackedFiles: id: 95db9d9692eb last_write_checksum: sha1:46d001ba62ebbc29c30a51fe955ba2eb7e822743 pristine_git_object: 78edb656f324a0ca29dac15247abdc8595a2b0a6 + models/components/toolserverauthstatus.go: + id: 3c84ec2a2c62 + last_write_checksum: sha1:9ffe70fd09c4282232683bf6cbc39ffe5270d37a + pristine_git_object: 7444a14f737d2103326ddf9f4908a32c86abacf1 + models/components/toolserverauthstatusresponse.go: + id: 51c0e2f9c1bb + last_write_checksum: sha1:351759addb12abb15e57f134b2f1bd8119d64b1c + pristine_git_object: 34700caada7547013f53ccc5117d06c5a00edc64 models/components/toolsets.go: id: 130126961f1b last_write_checksum: sha1:9b967905d9cf7fa530d58b6aa881e507d13a6b9c @@ -5788,6 +5836,10 @@ trackedFiles: id: b891e14cca81 last_write_checksum: sha1:1b6e92a21b3fbca3bf7fd9ad7194ce169369bdbd pristine_git_object: 677e741aacc24487ef29fd1ca878ee8cf805ecb8 + models/operations/authorizetoolserver.go: + id: 3daf73da074f + last_write_checksum: sha1:076ad4b4362753314fe532154f0efda92166a075 + pristine_git_object: 3536429f18cdb66a6e2f047119c08863e02b55d9 models/operations/autocomplete.go: id: 830b65e22675 last_write_checksum: sha1:48cdb12cfbbb19a58e9a62b0b2b00a5e6b5ffab4 @@ -6020,6 +6072,10 @@ trackedFiles: id: c495ef7ca332 last_write_checksum: sha1:04f04e317077530048bb0ff37f1733e12dd330ee pristine_git_object: 5b5613eaaa3b2f0b47684b24d605757367118e9a + models/operations/gettoolserverauthstatus.go: + id: 1be3bf899a0f + last_write_checksum: sha1:ba5d4e43f144d8d74b51a5ed3d57a99a0f6f585c + pristine_git_object: 730f97eec4c46baf8212fa9bfc70eec1c5462ca8 models/operations/insights.go: id: 0e5176f0f5b6 last_write_checksum: sha1:83bbb66f195e99f7d5cd8f1e3518b3c1ec0ce4a9 @@ -6510,8 +6566,8 @@ trackedFiles: pristine_git_object: 929558ef2e1165f7e09da6d0a64f016c90971655 tests/mockserver/internal/handler/generated_handlers.go: id: 61ac4f7cce9e - last_write_checksum: sha1:6496589b844c61d821b877b856e26635ffaad66d - pristine_git_object: 67af751e8eacdf3eda5028f67e51509df4315c20 + last_write_checksum: sha1:504888816904477536564a19b80f4284b6823e27 + pristine_git_object: d5fe2f854992c1454456ccbe2b496a6446cb6904 tests/mockserver/internal/handler/pathdeleterestapiindexcustommetadataschemagroupname.go: id: 979e4583765b last_write_checksum: sha1:b1d4edb259d907c7a88b634bf16f0cf152321693 @@ -6572,6 +6628,10 @@ trackedFiles: id: ab4b35f72782 last_write_checksum: sha1:086d9b020ab7cd0e78ed6d28933e95c09b82e498 pristine_git_object: 253b4d87e6614dac4673d9387be09f0bd3258062 + tests/mockserver/internal/handler/pathgetrestapiv1toolserversserveridauth.go: + id: 6c9f22f1b9d6 + last_write_checksum: sha1:abe99a9d9076d3c0d944630fa94f3a83fdc10ceb + pristine_git_object: 53c86d01a47aa5d7802b7b20da09d44ab1ce0907 tests/mockserver/internal/handler/pathgetrestapiv1toolslist.go: id: 1598fa297cf6 last_write_checksum: sha1:8b0d26cd221009e78396ed0c573e78c0ac719e36 @@ -6742,8 +6802,8 @@ trackedFiles: pristine_git_object: ab9263d43404e8e6f07af222a3e785aca2fbf35f tests/mockserver/internal/handler/pathpostrestapiv1createcollection.go: id: 3fb93a419933 - last_write_checksum: sha1:14b4a1d98dd55ce2b487ae1aaab4a7dece08df25 - pristine_git_object: 371b90231fcd7bd77fd6d9566156605af1712d9a + last_write_checksum: sha1:f9f4c718408bddadbdf826194f07970bb111e57e + pristine_git_object: 5c99a0ada5302c8f64c0e5da5683fa8bd9e9975d tests/mockserver/internal/handler/pathpostrestapiv1createshortcut.go: id: 8d9d3abb0c34 last_write_checksum: sha1:2f9468a50936c4cb0fb2101d97c1425cb36ba2d4 @@ -6814,8 +6874,8 @@ trackedFiles: pristine_git_object: abb763ddc8504b28c0cb6fdf8d25237d46e21bab tests/mockserver/internal/handler/pathpostrestapiv1getchat.go: id: a0ec7bafa599 - last_write_checksum: sha1:b48e2313407814ee4f8ed181b8e5299a84960c44 - pristine_git_object: 96d4127e0455272a9842e2d1954e5fcefa3278cc + last_write_checksum: sha1:2267292ba8173cf8df70ddbc6ac02ff3439cb879 + pristine_git_object: 8740195860b6c08e036caae19aab8e7374350960 tests/mockserver/internal/handler/pathpostrestapiv1getchatapplication.go: id: 7d101c69d4bc last_write_checksum: sha1:7b81898137fdb3a89b4dcfa318b9b5b92e8860c0 @@ -6908,6 +6968,10 @@ trackedFiles: id: ad6776df2ba3 last_write_checksum: sha1:97d094dbdeba08fc395322c0048c259ecf0035fc pristine_git_object: 1676df61ea2406ad36a967ea58ff4022922d133c + tests/mockserver/internal/handler/pathpostrestapiv1toolserversserveridauth.go: + id: ec9262467bda + last_write_checksum: sha1:d9ae76d001db8e14db7bbc7e88edff85f2355350 + pristine_git_object: 93aadc88bb832e4d0d91ce711f39e18cf3ebf3f4 tests/mockserver/internal/handler/pathpostrestapiv1unpin.go: id: 08da240877b4 last_write_checksum: sha1:4ad6d409b1f7c8e66b8e3ec423016f5bc7e94605 @@ -7116,6 +7180,14 @@ trackedFiles: id: 84cdf6495063 last_write_checksum: sha1:2a458d0fb35074c83cd5dc41543c300942f5b7e5 pristine_git_object: de205e6fb6d56ead5c64014571a336b54f0136d5 + tests/mockserver/internal/sdk/models/components/authorizetoolserverrequest.go: + id: c0e58fdb688e + last_write_checksum: sha1:762a4926f6c3004e70d5d6e0205b58874f9e37bc + pristine_git_object: 2af86c39938b0cd67e47222d67a9be860d657467 + tests/mockserver/internal/sdk/models/components/authorizetoolserverresponse.go: + id: 9adc5ed4f113 + last_write_checksum: sha1:acadba9fc6b8e09ccd520bd634c2a7f05181502f + pristine_git_object: c5202d3ba84a4eb474e02ffa74e32a6f8f468bab tests/mockserver/internal/sdk/models/components/authstatus.go: id: c12f2870beb7 last_write_checksum: sha1:ca2727d0dcddf2ee072f3b26529d2952d7e72a21 @@ -7858,12 +7930,12 @@ trackedFiles: pristine_git_object: 04cc3a93272ac70933b0485bee31b335e05ab623 tests/mockserver/internal/sdk/models/components/feedentry.go: id: d25fd66fcf7a - last_write_checksum: sha1:b08b41d397fda41cd7dddbed15a4c236a171894a - pristine_git_object: 665efb1ed25d51cbae6b1e931f879ca43caec5db + last_write_checksum: sha1:024e9f5995f171ffcf2a54189669a79dadf9da7b + pristine_git_object: 3786e358703d09f737b4c2f43f1db79b3ca13e68 tests/mockserver/internal/sdk/models/components/feedrequest.go: id: b06bc4cef0cf - last_write_checksum: sha1:b33d5393c7c69d7ebd04b48e39cef3362d759440 - pristine_git_object: 24e197cad0c5e854787ba16b4f45d3a8d9dc6e35 + last_write_checksum: sha1:7e7ef66203861889ad3ae7f7a668809b2abedc14 + pristine_git_object: 2eff19ff52109057e7dc57092172bb81beb74ecb tests/mockserver/internal/sdk/models/components/feedrequestoptions.go: id: fd9245fe1bf2 last_write_checksum: sha1:fa30b7fd6ee3e45896d7bbe36e33e7c0cb9000ba @@ -7874,8 +7946,8 @@ trackedFiles: pristine_git_object: 54f9d1a8997983156c84e69f888c59a80d06c2b1 tests/mockserver/internal/sdk/models/components/feedresult.go: id: 47411573e67a - last_write_checksum: sha1:cc33234add58c980eaa8c35b118b8f7ad8174c2b - pristine_git_object: 510f01451494a5f947af81a555fceae89ee0fdff + last_write_checksum: sha1:0aecb808064634d971c60a6aa4a0e6c256dc93ff + pristine_git_object: 8e2124ebb433fadd413196d7f35dd227c85f3423 tests/mockserver/internal/sdk/models/components/followupaction.go: id: 38179fec19b1 last_write_checksum: sha1:32a31f7af77a58ce6f3284e8550d01fcf0d3bddd @@ -8760,6 +8832,14 @@ trackedFiles: id: ce1add8ce3b1 last_write_checksum: sha1:526fa5ff943d8fe623fbfbfb4e33bbfe9cf5e3ce pristine_git_object: 03e9af73e5d69f93976218dea9bef90eaef0f02d + tests/mockserver/internal/sdk/models/components/toolserverauthstatus.go: + id: 7688e01624a9 + last_write_checksum: sha1:82d5d759e6d7dd4422526fcd410b8cc4a717dfe6 + pristine_git_object: d6715ec49771c2715fba9d007d9a7094751407fb + tests/mockserver/internal/sdk/models/components/toolserverauthstatusresponse.go: + id: 740fdab1d2ad + last_write_checksum: sha1:199fcd464b82a25094252f4ab32609636d00630d + pristine_git_object: 4328a09e55db5a7edbf5421457c6b59cfe50f4fb tests/mockserver/internal/sdk/models/components/toolsets.go: id: 75b43b793fdd last_write_checksum: sha1:d92cd83151d1a51109858e7ebbfae0b95c8f1e37 @@ -8940,6 +9020,10 @@ trackedFiles: id: a0a71987d741 last_write_checksum: sha1:c78c40c14e10717246e43461e2168240ccbb6a52 pristine_git_object: 9c7fd68f3990aff22648a954f8883593d19f446e + tests/mockserver/internal/sdk/models/operations/authorizetoolserver.go: + id: 6bacf66a9801 + last_write_checksum: sha1:0657ac18a74bc4d75e8cbfe09ee26748e9a5cbad + pristine_git_object: df8f15054a3f283399947b45cc04495a174d6823 tests/mockserver/internal/sdk/models/operations/autocomplete.go: id: 15fbad3e639d last_write_checksum: sha1:242f4ac0044ef328043fc3a5d0effdeccb7f291f @@ -9172,6 +9256,10 @@ trackedFiles: id: a3ff8d97b66f last_write_checksum: sha1:9d3a3758b295b8ee5b1bcc3f433ab0fe9a663644 pristine_git_object: feebc4377fd3e995e6e40a153536a25e5995332d + tests/mockserver/internal/sdk/models/operations/gettoolserverauthstatus.go: + id: 47caf49ab6ed + last_write_checksum: sha1:ca3e16bedf97f0f8606d6d9c82b6a7a886c071a3 + pristine_git_object: 26d8a0ccfca2b2e6585958cacc77a7a359f88749 tests/mockserver/internal/sdk/models/operations/insights.go: id: 9bf374c79662 last_write_checksum: sha1:3091cfd7f0f9ad34caa7ba644bd79bfcbf009f6b @@ -9586,16 +9674,16 @@ trackedFiles: pristine_git_object: b6153fd279d3c84d23821741f08c9a8ff8775779 tests/summarize_test.go: id: 1b63b0a16e69 - last_write_checksum: sha1:bc69738af59c73ce2c879c5e10a457eb451f8f72 - pristine_git_object: d470e2e3dc7390a884e96fba9f1ed59011856725 + last_write_checksum: sha1:54ed5721c789cf4b6d8553b71879ccef27eacd5d + pristine_git_object: 107b1ac2dbab92914d7254a8ee111b0fa92df127 tests/testclient.go: id: 78d36c6e169c last_write_checksum: sha1:507c44e437934fbff8d295201c1327e18bd00df8 pristine_git_object: 30661e72215ff83eaf5637c0ee72a75e6ab3f6b1 tests/tools_test.go: id: 8166dd99f634 - last_write_checksum: sha1:c876e1878d48bb69af52b6341a27ecd8ff7982b8 - pristine_git_object: 274a906b046cccffa5ceb408c0def9dd1823ae89 + last_write_checksum: sha1:8f2a21e73d2f61e49c41563cf3b64fc141dc348b + pristine_git_object: 7028c627a61b4163bee0329ccb99bbc96b66d821 tests/troubleshooting_test.go: id: 93cb404911ce last_write_checksum: sha1:49e7c6f45b1baed707c82e0dd72de6c6bc12a057 @@ -9606,8 +9694,8 @@ trackedFiles: pristine_git_object: c28b73ad8c1100262680cd4ce7841f2b277df05b tools.go: id: 3387d70491f4 - last_write_checksum: sha1:7c06c77b16559b034656dc475b566184c22edb52 - pristine_git_object: 965039d9995159237b4ebbb9678a5d613eb19f97 + last_write_checksum: sha1:8674e8ec6a7b57f5d89e48eb8bd5262c6843fb6e + pristine_git_object: c62fe818df8b12bee309a454486e85efe0ddff55 types/bigint.go: id: 6f911e1a03c3 last_write_checksum: sha1:49b004005d0461fb04b846eca062b070b0360b31 @@ -10618,6 +10706,24 @@ examples: application/problem+json: {"type": "https://developer.glean.com/errors/invalid-cursor", "title": "Invalid Pagination Cursor", "status": 400, "detail": "The provided cursor has expired. Start a new search to get a fresh cursor.\n", "code": "invalid_cursor", "documentation_url": "https://developer.glean.com/errors/invalid-cursor", "request_id": "req_7f8a9b0c1d2e", "errors": [{"pointer": "/messages/0/role", "detail": "Must be one of: USER, GLEAN_AI.", "code": "invalid_cursor"}]} "500": application/problem+json: {"type": "https://developer.glean.com/errors/invalid-cursor", "title": "Invalid Pagination Cursor", "status": 400, "detail": "The provided cursor has expired. Start a new search to get a fresh cursor.\n", "code": "invalid_cursor", "documentation_url": "https://developer.glean.com/errors/invalid-cursor", "request_id": "req_7f8a9b0c1d2e", "errors": [{"pointer": "/messages/0/role", "detail": "Must be one of: USER, GLEAN_AI.", "code": "invalid_cursor"}]} + getToolServerAuthStatus: + speakeasy-default-get-tool-server-auth-status: + parameters: + path: + serverId: "" + responses: + "200": + application/json: {"authStatus": "AUTHORIZED", "authType": "AUTH_NONE"} + authorizeToolServer: + speakeasy-default-authorize-tool-server: + parameters: + path: + serverId: "" + requestBody: + application/json: {"returnUrl": "https://lucky-disadvantage.com"} + responses: + "200": + application/json: {"authorizationUrl": "https://shocked-casket.name/"} examplesVersion: 1.0.2 generatedTests: activity: "2025-04-29T16:18:24+01:00" @@ -10783,7 +10889,9 @@ generatedTests: platform-agents-get-schemas: "2026-07-02T17:50:54Z" platform-agents-create-run: "2026-07-02T17:50:54Z" platform-search: "2026-07-02T17:50:54Z" -releaseNotes: "## Go SDK Changes:\n* `Glean.Agents.Search()`: `error` **Changed**\n* `Glean.Agents.Get()`: `error.Code.Enum(requestTooLarge)` **Added**\n* `Glean.Agents.GetSchemas()`: `error.Code.Enum(requestTooLarge)` **Added**\n* `Glean.Agents.CreateRun()`: `error` **Changed**\n* `Glean.Search.Query()`: `error` **Changed**\n* `Glean.Client.Announcements.Create()`: \n * `request.CreateAnnouncementRequest.Body.StructuredList[].Document.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n * `response` **Changed**\n* `Glean.Client.Announcements.Update()`: \n * `request.UpdateAnnouncementRequest.Body.StructuredList[].Document.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n * `response` **Changed**\n* `Glean.Client.Answers.Create()`: \n * `request.CreateAnswerRequest.Data.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n * `response.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Answers.Update()`: \n * `request.EditAnswerRequest.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n * `response.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Answers.Retrieve()`: `response.AnswerResult` **Changed**\n* `Glean.Client.Answers.List()`: `response.AnswerResults[]` **Changed**\n* `Glean.Client.Chat.Create()`: \n * `request.ChatRequest.Messages[].Citations[].SourceDocument.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n * `response.Messages[].Citations[].SourceDocument.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n* `Glean.Client.Chat.Retrieve()`: `response.ChatResult.Chat.CreatedBy.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Chat.List()`: `response.ChatResults[].Chat.CreatedBy.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Chat.CreateStream()`: \n * `request.ChatRequest.Messages[].Citations[].SourceDocument.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n* `Glean.Client.Agents.Create()`: `response.Workflow.Author.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Collections.AddItems()`: `response.Collection` **Changed**\n* `Glean.Client.Collections.Create()`: \n * `request.CreateCollectionRequest.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n * `response.union(class (0)).Collection` **Changed**\n* `Glean.Client.Collections.DeleteItem()`: `response.Collection` **Changed**\n* `Glean.Client.Collections.Update()`: \n * `request.EditCollectionRequest.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n * `response` **Changed**\n* `Glean.Client.Collections.UpdateItem()`: `response.Collection` **Changed**\n* `Glean.Client.Collections.Retrieve()`: `response.Collection` **Changed**\n* `Glean.Client.Collections.List()`: `response.Collections[]` **Changed**\n* `Glean.Client.Documents.Retrieve()`: `response.Documents.Map.union(Document).Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n* `Glean.Client.Documents.RetrieveByFacets()`: `response.Documents[].Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n* `Glean.Client.Insights.Retrieve()`: `response.GleanAssist.ActivityInsights[].User.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Messages.Retrieve()`: `response.SearchResponse.Results[].StructuredResults[].Document.Metadata` **Changed**\n* `Glean.Client.Pins.Update()`: `response` **Changed**\n* `Glean.Client.Pins.Retrieve()`: `response.Pin` **Changed**\n* `Glean.Client.Pins.List()`: `response.Pins[]` **Changed**\n* `Glean.Client.Pins.Create()`: `response` **Changed**\n* `Glean.Client.Search.QueryAsAdmin()`: \n * `request.SearchRequest.SourceDocument.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n * `response.Results[].StructuredResults[].Document.Metadata` **Changed**\n* `Glean.Client.Search.Autocomplete()`: `response.Results[].Document.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n* `Glean.Client.Search.RetrieveFeed()`: \n * `request.FeedRequest.Categories[].Enum(podcast)` **Added**\n * `response.Results[]` **Changed**\n* `Glean.Client.Search.Recommendations()`: \n * `request.RecommendationsRequest.SourceDocument.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n * `response.Results[].StructuredResults[].Document.Metadata` **Changed**\n* `Glean.Client.Search.Query()`: \n * `request.SearchRequest.SourceDocument.Metadata.Author.RelatedDocuments[].Results[]` **Changed**\n * `response.Results[].StructuredResults[].Document.Metadata` **Changed**\n* `Glean.Client.Entities.List()`: `response.Results[].RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Entities.ReadPeople()`: `response.Results[].RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Shortcuts.Create()`: \n * `request.CreateShortcutRequest.Data.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n * `response.Shortcut` **Changed**\n* `Glean.Client.Shortcuts.Retrieve()`: `response.Shortcut` **Changed**\n* `Glean.Client.Shortcuts.List()`: `response.Shortcuts[]` **Changed**\n* `Glean.Client.Shortcuts.Update()`: \n * `request.UpdateShortcutRequest.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n * `response.Shortcut` **Changed**\n* `Glean.Client.Verification.AddReminder()`: `response.Metadata.LastVerifier.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Verification.List()`: `response.Documents[].Metadata.LastVerifier.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n* `Glean.Client.Verification.Verify()`: `response.Metadata.LastVerifier.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata` **Changed**\n" + getToolServerAuthStatus: "2026-07-08T02:15:48Z" + authorizeToolServer: "2026-07-08T02:15:48Z" +releaseNotes: "## Go SDK Changes:\n* `Glean.Client.Tools.RetrieveToolServerAuthStatus()`: **Added**\n* `Glean.Client.Tools.AuthorizeToolServer()`: **Added**\n* `Glean.Client.Search.RetrieveFeed()`: \n * `request.FeedRequest.Categories[].Enum(adminHealthCenter)` **Added**\n * `response.Results[]` **Changed**\n" generatedFiles: - .devcontainer/README.md - .devcontainer/devcontainer.json diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 00d16af7..6f9c3f70 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -32,7 +32,7 @@ generation: generateNewTests: true skipResponseBodyAssertions: true go: - version: 0.13.1 + version: 0.13.2 additionalDependencies: {} allowUnknownFieldsInWeakUnions: false baseErrorName: GleanError diff --git a/.speakeasy/glean-merged-spec.yaml b/.speakeasy/glean-merged-spec.yaml index a7a10ca3..8a9c80a4 100644 --- a/.speakeasy/glean-merged-spec.yaml +++ b/.speakeasy/glean-merged-spec.yaml @@ -2,8 +2,8 @@ openapi: 3.0.0 info: version: "0.9.0" title: Glean API - x-source-commit-sha: 33bf057cf0f948a83126e81582717aebdb622bfa - x-open-api-commit-sha: 4f3a4abf8f003a4edc5522021b22184c76d051ad + x-source-commit-sha: 07b3632b09de332d35eeedd6280e30a1edf95243 + x-open-api-commit-sha: 4bc8dc442566ab2952b8e3c7a86fafff9c042aa9 description: | # Introduction In addition to the data sources that Glean has built-in support for, Glean also provides a REST API that enables customers to put arbitrary content in the search index. This is useful, for example, for doing permissions-aware search over content in internal tools that reside on-prem as well as for searching over applications that Glean does not currently support first class. In addition these APIs allow the customer to push organization data (people info, organization structure etc) into Glean. @@ -2973,6 +2973,89 @@ paths: required: true schema: type: string + /rest/api/v1/tool-servers/{serverId}/auth: + get: + operationId: getToolServerAuthStatus + summary: Get end-user authentication status for a tool server. + description: | + Returns display information and the calling user's current authentication status + for the specified tool server. + tags: + - Tools + security: + - APIToken: [] + responses: + "200": + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/ToolServerAuthStatusResponse' + "400": + description: Bad Request + "401": + description: Unauthorized + "404": + description: Tool server not found + "429": + description: Too Many Requests + x-visibility: Preview + x-glean-experimental: + id: 52fde6ec-c18b-4de6-b761-f82008542ae7 + introduced: "2026-07-02" + x-speakeasy-name-override: retrieveToolServerAuthStatus + x-speakeasy-group: client.tools + post: + operationId: authorizeToolServer + summary: Start the OAuth authorization flow for a tool server. + description: | + Initiates the third-party OAuth flow for the specified tool server and returns the + authorization URL that the client should navigate the end user to. After the OAuth + callback completes, the user's browser is redirected back to `returnUrl` with query + parameters indicating the result. + + `returnUrl` must match the tenant's configured return URL allowlist; otherwise the + request is rejected with 400. + tags: + - Tools + security: + - APIToken: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizeToolServerRequest' + required: true + responses: + "200": + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/AuthorizeToolServerResponse' + "400": + description: Invalid request (e.g. returnUrl not in allowlist, unsupported auth type) + "401": + description: Unauthorized + "403": + description: User not entitled to the tool server + "404": + description: Tool server not found + "429": + description: Too Many Requests + x-visibility: Preview + x-glean-experimental: + id: 1935476e-ecaf-4c1f-a9fd-1e768cf68f30 + introduced: "2026-07-02" + x-speakeasy-name-override: authorizeToolServer + x-speakeasy-group: client.tools + parameters: + - name: serverId + in: path + description: Unique identifier of the tool server. + required: true + schema: + type: string /api/index/v1/indexdocument: post: summary: Index document @@ -5091,6 +5174,67 @@ components: - rate_limit_exceeded - internal_error - service_unavailable + x-glean-problem-detail-codes: + invalid_request: + status: 400 + title: Invalid Request + missing_required_field: + status: 400 + title: Missing Required Field + invalid_parameter: + status: 400 + title: Invalid Parameter + invalid_cursor: + status: 400 + title: Invalid Pagination Cursor + expired_cursor: + status: 400 + title: Expired Pagination Cursor + invalid_filter: + status: 400 + title: Invalid Filter + invalid_datasource: + status: 400 + title: Invalid Datasource + authentication_required: + status: 401 + title: Authentication Required + token_expired: + status: 401 + title: Token Expired + insufficient_permissions: + status: 403 + title: Insufficient Permissions + resource_not_found: + status: 404 + title: Resource Not Found + method_not_allowed: + status: 405 + title: Method Not Allowed + request_timeout: + status: 408 + title: Request Timeout + request_too_large: + status: 413 + title: Request Too Large + conflict: + status: 409 + title: Conflict + gone: + status: 410 + title: Gone + unprocessable_query: + status: 422 + title: Unprocessable Query + rate_limit_exceeded: + status: 429 + title: Rate Limit Exceeded + internal_error: + status: 500 + title: Internal Error + service_unavailable: + status: 503 + title: Service Unavailable example: invalid_cursor PlatformProblemDetailError: type: object @@ -5125,7 +5269,7 @@ components: type: string format: uri description: URI identifying the error type. - example: https://developer.glean.com/errors/invalid-cursor + example: https://developers.glean.com/errors/invalid-cursor title: type: string description: Short, human-readable summary of the error. @@ -5145,7 +5289,7 @@ components: type: string format: uri description: Direct URL to documentation for this error code. - example: https://developer.glean.com/errors/invalid-cursor + example: https://developers.glean.com/errors/invalid-cursor request_id: type: string description: Platform-generated request ID for support correlation. @@ -11970,6 +12114,7 @@ components: - DEMO_CARD - OOO_PLANNER - OOO_CATCH_UP + - ADMIN_HEALTH_CENTER description: Categories of content requested. An allowlist gives flexibility to request content separately or together. requestOptions: $ref: '#/components/schemas/FeedRequestOptions' @@ -12413,6 +12558,7 @@ components: - DEMO_CARD - OOO_PLANNER - OOO_CATCH_UP + - ADMIN_HEALTH_CENTER description: Type of the justification. justification: type: string @@ -12502,6 +12648,7 @@ components: - DEMO_CARD - OOO_PLANNER - OOO_CATCH_UP + - ADMIN_HEALTH_CENTER description: Category of the result, one of the requested categories in incoming request. primaryEntry: $ref: '#/components/schemas/FeedEntry' @@ -13135,6 +13282,51 @@ components: After the user consents, control returns to `returnUrl` from the request. required: - redirectUrl + ToolServerAuthStatus: + type: string + enum: + - AWAITING_AUTH + - AUTHORIZED + description: Authentication status for the calling user. + ToolServerAuthStatusResponse: + type: object + properties: + displayName: + type: string + description: Human-readable name of the tool server. + logoUrl: + type: string + description: Logo URL for the tool server. + description: + type: string + description: Brief description of the tool server. + authStatus: + $ref: '#/components/schemas/ToolServerAuthStatus' + authType: + $ref: '#/components/schemas/ActionAuthType' + required: + - authStatus + - authType + AuthorizeToolServerRequest: + type: object + properties: + returnUrl: + type: string + description: | + URL to redirect the end user's browser back to after the OAuth flow completes. + Must be present in the tenant's configured return URL allowlist. + required: + - returnUrl + AuthorizeToolServerResponse: + type: object + properties: + authorizationUrl: + type: string + description: | + URL that the client should navigate the end user to in order to begin the OAuth flow. + After the user consents, control returns to `returnUrl` from the request. + required: + - authorizationUrl IndexDocumentRequest: type: object properties: diff --git a/.speakeasy/tests.arazzo.yaml b/.speakeasy/tests.arazzo.yaml index bd96fce7..2530e646 100644 --- a/.speakeasy/tests.arazzo.yaml +++ b/.speakeasy/tests.arazzo.yaml @@ -164679,3 +164679,41 @@ workflows: type: simple x-speakeasy-test-group: search x-speakeasy-test-rebuild: true + - workflowId: getToolServerAuthStatus + steps: + - stepId: test + operationId: getToolServerAuthStatus + parameters: + - name: serverId + in: path + value: + successCriteria: + - condition: $statusCode == 200 + - condition: $response.header.Content-Type == application/json + - context: $response.body + condition: | + {"authStatus":"AUTHORIZED","authType":"AUTH_NONE"} + type: simple + x-speakeasy-test-group: tools + x-speakeasy-test-rebuild: true + - workflowId: authorizeToolServer + steps: + - stepId: test + operationId: authorizeToolServer + parameters: + - name: serverId + in: path + value: + requestBody: + contentType: application/json + payload: + returnUrl: https://lucky-disadvantage.com + successCriteria: + - condition: $statusCode == 200 + - condition: $response.header.Content-Type == application/json + - context: $response.body + condition: | + {"authorizationUrl":"https://shocked-casket.name/"} + type: simple + x-speakeasy-test-group: tools + x-speakeasy-test-rebuild: true diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 89da8dce..6531eef3 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,9 +1,9 @@ -speakeasyVersion: 1.788.1 +speakeasyVersion: 1.789.0 sources: Glean API: sourceNamespace: glean-api-specs - sourceRevisionDigest: sha256:8b1b5374e6d5c2f98bc7cddfa619249cd150deba48f6c8b9f2637f723ff73fd2 - sourceBlobDigest: sha256:3373213fc1a05b08aad1cf828d00ce46e1da651645fc1ccde24fcdf3efca5861 + sourceRevisionDigest: sha256:eaebe7be5b8f0f68b1331b223088ad140bf7caa28b87534a807a902b82f0e715 + sourceBlobDigest: sha256:fdd2d2ee23d11786186f25ae9270c19355398694eb3aedbfe02e7687c9e8c2e3 tags: - latest petstore-oas: @@ -17,10 +17,10 @@ targets: glean: source: Glean API sourceNamespace: glean-api-specs - sourceRevisionDigest: sha256:8b1b5374e6d5c2f98bc7cddfa619249cd150deba48f6c8b9f2637f723ff73fd2 - sourceBlobDigest: sha256:3373213fc1a05b08aad1cf828d00ce46e1da651645fc1ccde24fcdf3efca5861 + sourceRevisionDigest: sha256:eaebe7be5b8f0f68b1331b223088ad140bf7caa28b87534a807a902b82f0e715 + sourceBlobDigest: sha256:fdd2d2ee23d11786186f25ae9270c19355398694eb3aedbfe02e7687c9e8c2e3 codeSamplesNamespace: glean-api-specs-go-code-samples - codeSamplesRevisionDigest: sha256:bc14c3664086c8ddf3fd2be8c9679ca89fb2ef92afeb93a45578f572690eb900 + codeSamplesRevisionDigest: sha256:e33e590a1c2fd20f43edf50e39adc6217f26e1627bcc7a06f4907c77a120c261 petstore: source: petstore-oas sourceNamespace: petstore-oas diff --git a/README.md b/README.md index 6ab01fcb..40bd7650 100644 --- a/README.md +++ b/README.md @@ -377,6 +377,8 @@ For more information on obtaining the appropriate token type, please contact you * [Run](docs/sdks/tools/README.md#run) - Execute the specified tool * [RetrieveActionPackAuthStatus](docs/sdks/tools/README.md#retrieveactionpackauthstatus) - Get end-user authentication status for an action pack. * [AuthorizeActionPack](docs/sdks/tools/README.md#authorizeactionpack) - Start the OAuth authorization flow for an action pack. +* [RetrieveToolServerAuthStatus](docs/sdks/tools/README.md#retrievetoolserverauthstatus) - Get end-user authentication status for a tool server. +* [AuthorizeToolServer](docs/sdks/tools/README.md#authorizetoolserver) - Start the OAuth authorization flow for a tool server. ### [Client.Verification](docs/sdks/verification/README.md) diff --git a/RELEASES.md b/RELEASES.md index f451b5ce..fc3daaeb 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -778,4 +778,14 @@ Based on: ### Generated - [go v0.13.1] . ### Releases -- [Go v0.13.1] https://github.com/gleanwork/api-client-go/releases/tag/v0.13.1 - . \ No newline at end of file +- [Go v0.13.1] https://github.com/gleanwork/api-client-go/releases/tag/v0.13.1 - . + +## 2026-07-08 02:12:36 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.789.0 (2.916.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [go v0.13.2] . +### Releases +- [Go v0.13.2] https://github.com/gleanwork/api-client-go/releases/tag/v0.13.2 - . \ No newline at end of file diff --git a/docs/models/apierrors/platformproblemdetailerror.md b/docs/models/apierrors/platformproblemdetailerror.md index 6316a3fe..15f349e5 100644 --- a/docs/models/apierrors/platformproblemdetailerror.md +++ b/docs/models/apierrors/platformproblemdetailerror.md @@ -8,12 +8,12 @@ Error response following RFC 9457, extended with `code` and `documentation_url` | Field | Type | Required | Description | Example | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | -| `Type` | `string` | :heavy_check_mark: | URI identifying the error type. | https://developer.glean.com/errors/invalid-cursor | +| `Type` | `string` | :heavy_check_mark: | URI identifying the error type. | https://developers.glean.com/errors/invalid-cursor | | `Title` | `string` | :heavy_check_mark: | Short, human-readable summary of the error. | Invalid Pagination Cursor | | `Status` | `int64` | :heavy_check_mark: | HTTP status code mirrored from the response. | 400 | | `Detail` | `string` | :heavy_check_mark: | Human-readable explanation specific to this occurrence. | The provided cursor has expired. Start a new search to get a fresh cursor.
| | `Code` | [components.PlatformProblemDetailCode](../../models/components/platformproblemdetailcode.md) | :heavy_check_mark: | Stable machine-readable error code. | invalid_cursor | -| `DocumentationURL` | `*string` | :heavy_minus_sign: | Direct URL to documentation for this error code. | https://developer.glean.com/errors/invalid-cursor | +| `DocumentationURL` | `*string` | :heavy_minus_sign: | Direct URL to documentation for this error code. | https://developers.glean.com/errors/invalid-cursor | | `RequestID` | `string` | :heavy_check_mark: | Platform-generated request ID for support correlation. | req_7f8a9b0c1d2e | | `Errors` | [][components.PlatformProblemDetailError](../../models/components/platformproblemdetailerror.md) | :heavy_minus_sign: | Field-level validation problems, one entry per offending field. | | | `HTTPMeta` | [components.HTTPMetadata](../../models/components/httpmetadata.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/docs/models/components/authorizetoolserverrequest.md b/docs/models/components/authorizetoolserverrequest.md new file mode 100644 index 00000000..780ba674 --- /dev/null +++ b/docs/models/components/authorizetoolserverrequest.md @@ -0,0 +1,8 @@ +# AuthorizeToolServerRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| `ReturnURL` | `string` | :heavy_check_mark: | URL to redirect the end user's browser back to after the OAuth flow completes.
Must be present in the tenant's configured return URL allowlist.
| \ No newline at end of file diff --git a/docs/models/components/authorizetoolserverresponse.md b/docs/models/components/authorizetoolserverresponse.md new file mode 100644 index 00000000..cc4d5c7c --- /dev/null +++ b/docs/models/components/authorizetoolserverresponse.md @@ -0,0 +1,8 @@ +# AuthorizeToolServerResponse + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `AuthorizationURL` | `string` | :heavy_check_mark: | URL that the client should navigate the end user to in order to begin the OAuth flow.
After the user consents, control returns to `returnUrl` from the request.
| \ No newline at end of file diff --git a/docs/models/components/feedrequestcategory.md b/docs/models/components/feedrequestcategory.md index 2c2429d7..cb8ed242 100644 --- a/docs/models/components/feedrequestcategory.md +++ b/docs/models/components/feedrequestcategory.md @@ -57,4 +57,5 @@ value := components.FeedRequestCategoryDocumentSuggestion | `FeedRequestCategoryProjectNextStep` | PROJECT_NEXT_STEP | | `FeedRequestCategoryDemoCard` | DEMO_CARD | | `FeedRequestCategoryOooPlanner` | OOO_PLANNER | -| `FeedRequestCategoryOooCatchUp` | OOO_CATCH_UP | \ No newline at end of file +| `FeedRequestCategoryOooCatchUp` | OOO_CATCH_UP | +| `FeedRequestCategoryAdminHealthCenter` | ADMIN_HEALTH_CENTER | \ No newline at end of file diff --git a/docs/models/components/feedresultcategory.md b/docs/models/components/feedresultcategory.md index 8d7e25e2..c55089d0 100644 --- a/docs/models/components/feedresultcategory.md +++ b/docs/models/components/feedresultcategory.md @@ -62,4 +62,5 @@ custom := components.FeedResultCategory("custom_value") | `FeedResultCategoryProjectNextStep` | PROJECT_NEXT_STEP | | `FeedResultCategoryDemoCard` | DEMO_CARD | | `FeedResultCategoryOooPlanner` | OOO_PLANNER | -| `FeedResultCategoryOooCatchUp` | OOO_CATCH_UP | \ No newline at end of file +| `FeedResultCategoryOooCatchUp` | OOO_CATCH_UP | +| `FeedResultCategoryAdminHealthCenter` | ADMIN_HEALTH_CENTER | \ No newline at end of file diff --git a/docs/models/components/justificationtype.md b/docs/models/components/justificationtype.md index 60752d0b..243e7d2c 100644 --- a/docs/models/components/justificationtype.md +++ b/docs/models/components/justificationtype.md @@ -75,4 +75,5 @@ custom := components.JustificationType("custom_value") | `JustificationTypeProjectNextStep` | PROJECT_NEXT_STEP | | `JustificationTypeDemoCard` | DEMO_CARD | | `JustificationTypeOooPlanner` | OOO_PLANNER | -| `JustificationTypeOooCatchUp` | OOO_CATCH_UP | \ No newline at end of file +| `JustificationTypeOooCatchUp` | OOO_CATCH_UP | +| `JustificationTypeAdminHealthCenter` | ADMIN_HEALTH_CENTER | \ No newline at end of file diff --git a/docs/models/components/toolserverauthstatus.md b/docs/models/components/toolserverauthstatus.md new file mode 100644 index 00000000..638e5a44 --- /dev/null +++ b/docs/models/components/toolserverauthstatus.md @@ -0,0 +1,24 @@ +# ToolServerAuthStatus + +Authentication status for the calling user. + +## Example Usage + +```go +import ( + "github.com/gleanwork/api-client-go/models/components" +) + +value := components.ToolServerAuthStatusAwaitingAuth + +// Open enum: custom values can be created with a direct type cast +custom := components.ToolServerAuthStatus("custom_value") +``` + + +## Values + +| Name | Value | +| ---------------------------------- | ---------------------------------- | +| `ToolServerAuthStatusAwaitingAuth` | AWAITING_AUTH | +| `ToolServerAuthStatusAuthorized` | AUTHORIZED | \ No newline at end of file diff --git a/docs/models/components/toolserverauthstatusresponse.md b/docs/models/components/toolserverauthstatusresponse.md new file mode 100644 index 00000000..7740b714 --- /dev/null +++ b/docs/models/components/toolserverauthstatusresponse.md @@ -0,0 +1,12 @@ +# ToolServerAuthStatusResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `DisplayName` | `*string` | :heavy_minus_sign: | Human-readable name of the tool server. | +| `LogoURL` | `*string` | :heavy_minus_sign: | Logo URL for the tool server. | +| `Description` | `*string` | :heavy_minus_sign: | Brief description of the tool server. | +| `AuthStatus` | [components.ToolServerAuthStatus](../../models/components/toolserverauthstatus.md) | :heavy_check_mark: | Authentication status for the calling user. | +| `AuthType` | [components.ActionAuthType](../../models/components/actionauthtype.md) | :heavy_check_mark: | Authentication mechanism used by an action pack.
- `AUTH_USER_OAUTH`: Requires per-user OAuth consent to the third-party tool.
- `AUTH_ADMIN`: Uses a service-account / admin-owned credential. End users do not authorize individually.
- `AUTH_NONE`: Action pack requires no authentication.
| \ No newline at end of file diff --git a/docs/models/operations/authorizetoolserverrequest.md b/docs/models/operations/authorizetoolserverrequest.md new file mode 100644 index 00000000..a94aff20 --- /dev/null +++ b/docs/models/operations/authorizetoolserverrequest.md @@ -0,0 +1,9 @@ +# AuthorizeToolServerRequest + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `ServerID` | `string` | :heavy_check_mark: | Unique identifier of the tool server. | +| `AuthorizeToolServerRequest` | [components.AuthorizeToolServerRequest](../../models/components/authorizetoolserverrequest.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/operations/authorizetoolserverresponse.md b/docs/models/operations/authorizetoolserverresponse.md new file mode 100644 index 00000000..ed6915e8 --- /dev/null +++ b/docs/models/operations/authorizetoolserverresponse.md @@ -0,0 +1,9 @@ +# AuthorizeToolServerResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | +| `HTTPMeta` | [components.HTTPMetadata](../../models/components/httpmetadata.md) | :heavy_check_mark: | N/A | +| `AuthorizeToolServerResponse` | [*components.AuthorizeToolServerResponse](../../models/components/authorizetoolserverresponse.md) | :heavy_minus_sign: | Successful operation | \ No newline at end of file diff --git a/docs/models/operations/gettoolserverauthstatusrequest.md b/docs/models/operations/gettoolserverauthstatusrequest.md new file mode 100644 index 00000000..1f58cc24 --- /dev/null +++ b/docs/models/operations/gettoolserverauthstatusrequest.md @@ -0,0 +1,8 @@ +# GetToolServerAuthStatusRequest + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | +| `ServerID` | `string` | :heavy_check_mark: | Unique identifier of the tool server. | \ No newline at end of file diff --git a/docs/models/operations/gettoolserverauthstatusresponse.md b/docs/models/operations/gettoolserverauthstatusresponse.md new file mode 100644 index 00000000..a320041d --- /dev/null +++ b/docs/models/operations/gettoolserverauthstatusresponse.md @@ -0,0 +1,9 @@ +# GetToolServerAuthStatusResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `HTTPMeta` | [components.HTTPMetadata](../../models/components/httpmetadata.md) | :heavy_check_mark: | N/A | +| `ToolServerAuthStatusResponse` | [*components.ToolServerAuthStatusResponse](../../models/components/toolserverauthstatusresponse.md) | :heavy_minus_sign: | Successful operation | \ No newline at end of file diff --git a/docs/sdks/tools/README.md b/docs/sdks/tools/README.md index be22c109..b635f2e0 100644 --- a/docs/sdks/tools/README.md +++ b/docs/sdks/tools/README.md @@ -8,6 +8,8 @@ * [Run](#run) - Execute the specified tool * [RetrieveActionPackAuthStatus](#retrieveactionpackauthstatus) - Get end-user authentication status for an action pack. * [AuthorizeActionPack](#authorizeactionpack) - Start the OAuth authorization flow for an action pack. +* [RetrieveToolServerAuthStatus](#retrievetoolserverauthstatus) - Get end-user authentication status for a tool server. +* [AuthorizeToolServer](#authorizetoolserver) - Start the OAuth authorization flow for a tool server. ## List @@ -236,6 +238,123 @@ func main() { ### Errors +| Error Type | Status Code | Content Type | +| ------------------ | ------------------ | ------------------ | +| apierrors.APIError | 4XX, 5XX | \*/\* | + +## RetrieveToolServerAuthStatus + +Returns display information and the calling user's current authentication status +for the specified tool server. + + +### Example Usage + + +```go +package main + +import( + "context" + "os" + apiclientgo "github.com/gleanwork/api-client-go" + "log" +) + +func main() { + ctx := context.Background() + + s := apiclientgo.New( + apiclientgo.WithSecurity(os.Getenv("GLEAN_API_TOKEN")), + ) + + res, err := s.Client.Tools.RetrieveToolServerAuthStatus(ctx, "") + if err != nil { + log.Fatal(err) + } + if res.ToolServerAuthStatusResponse != nil { + // handle response + } +} +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | +| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | +| `serverID` | `string` | :heavy_check_mark: | Unique identifier of the tool server. | +| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | + +### Response + +**[*operations.GetToolServerAuthStatusResponse](../../models/operations/gettoolserverauthstatusresponse.md), error** + +### Errors + +| Error Type | Status Code | Content Type | +| ------------------ | ------------------ | ------------------ | +| apierrors.APIError | 4XX, 5XX | \*/\* | + +## AuthorizeToolServer + +Initiates the third-party OAuth flow for the specified tool server and returns the +authorization URL that the client should navigate the end user to. After the OAuth +callback completes, the user's browser is redirected back to `returnUrl` with query +parameters indicating the result. + +`returnUrl` must match the tenant's configured return URL allowlist; otherwise the +request is rejected with 400. + + +### Example Usage + + +```go +package main + +import( + "context" + "os" + apiclientgo "github.com/gleanwork/api-client-go" + "github.com/gleanwork/api-client-go/models/components" + "log" +) + +func main() { + ctx := context.Background() + + s := apiclientgo.New( + apiclientgo.WithSecurity(os.Getenv("GLEAN_API_TOKEN")), + ) + + res, err := s.Client.Tools.AuthorizeToolServer(ctx, "", components.AuthorizeToolServerRequest{ + ReturnURL: "https://lucky-disadvantage.com", + }) + if err != nil { + log.Fatal(err) + } + if res.AuthorizeToolServerResponse != nil { + // handle response + } +} +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | +| `serverID` | `string` | :heavy_check_mark: | Unique identifier of the tool server. | +| `authorizeToolServerRequest` | [components.AuthorizeToolServerRequest](../../models/components/authorizetoolserverrequest.md) | :heavy_check_mark: | N/A | +| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | + +### Response + +**[*operations.AuthorizeToolServerResponse](../../models/operations/authorizetoolserverresponse.md), error** + +### Errors + | Error Type | Status Code | Content Type | | ------------------ | ------------------ | ------------------ | | apierrors.APIError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/glean.go b/glean.go index 19185809..bf6b4cb5 100644 --- a/glean.go +++ b/glean.go @@ -2,7 +2,7 @@ package apiclientgo -// Generated from OpenAPI doc version 0.9.0 and generator version 2.915.1 +// Generated from OpenAPI doc version 0.9.0 and generator version 2.916.2 import ( "context" @@ -161,9 +161,9 @@ func WithTimeout(timeout time.Duration) SDKOption { // New creates a new instance of the SDK with the provided options func New(opts ...SDKOption) *Glean { sdk := &Glean{ - SDKVersion: "0.13.1", + SDKVersion: "0.13.2", sdkConfiguration: config.SDKConfiguration{ - UserAgent: "speakeasy-sdk/go 0.13.1 2.915.1 0.9.0 github.com/gleanwork/api-client-go", + UserAgent: "speakeasy-sdk/go 0.13.2 2.916.2 0.9.0 github.com/gleanwork/api-client-go", ServerList: ServerList, ServerVariables: []map[string]string{ { diff --git a/models/components/authorizetoolserverrequest.go b/models/components/authorizetoolserverrequest.go new file mode 100644 index 00000000..6eeeca07 --- /dev/null +++ b/models/components/authorizetoolserverrequest.go @@ -0,0 +1,17 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +type AuthorizeToolServerRequest struct { + // URL to redirect the end user's browser back to after the OAuth flow completes. + // Must be present in the tenant's configured return URL allowlist. + // + ReturnURL string `json:"returnUrl"` +} + +func (a *AuthorizeToolServerRequest) GetReturnURL() string { + if a == nil { + return "" + } + return a.ReturnURL +} diff --git a/models/components/authorizetoolserverresponse.go b/models/components/authorizetoolserverresponse.go new file mode 100644 index 00000000..c9b32295 --- /dev/null +++ b/models/components/authorizetoolserverresponse.go @@ -0,0 +1,17 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +type AuthorizeToolServerResponse struct { + // URL that the client should navigate the end user to in order to begin the OAuth flow. + // After the user consents, control returns to `returnUrl` from the request. + // + AuthorizationURL string `json:"authorizationUrl"` +} + +func (a *AuthorizeToolServerResponse) GetAuthorizationURL() string { + if a == nil { + return "" + } + return a.AuthorizationURL +} diff --git a/models/components/feedentry.go b/models/components/feedentry.go index fd3ae674..4e595799 100644 --- a/models/components/feedentry.go +++ b/models/components/feedentry.go @@ -112,6 +112,7 @@ const ( JustificationTypeDemoCard JustificationType = "DEMO_CARD" JustificationTypeOooPlanner JustificationType = "OOO_PLANNER" JustificationTypeOooCatchUp JustificationType = "OOO_CATCH_UP" + JustificationTypeAdminHealthCenter JustificationType = "ADMIN_HEALTH_CENTER" ) func (e JustificationType) ToPointer() *JustificationType { @@ -122,7 +123,7 @@ func (e JustificationType) ToPointer() *JustificationType { func (e *JustificationType) IsExact() bool { if e != nil { switch *e { - case "FREQUENTLY_ACCESSED", "RECENTLY_ACCESSED", "TRENDING_DOCUMENT", "VERIFICATION_REMINDER", "SUGGESTED_DOCUMENT", "EMPTY_STATE_SUGGESTION", "FRECENCY_SCORED", "SERVER_GENERATED", "USE_CASE", "UPDATE_SINCE_LAST_VIEW", "RECENTLY_STARTED", "EVENT", "USER_MENTION", "ANNOUNCEMENT", "EXTERNAL_ANNOUNCEMENT", "POPULARITY_BASED_TRENDING", "COMPANY_RESOURCE", "EVENT_DOCUMENT_FROM_CONTENT", "EVENT_DOCUMENT_FROM_SEARCH", "VISIT_AFFINITY_SCORED", "SUGGESTED_APP", "SUGGESTED_PERSON", "ACTIVITY_HIGHLIGHT", "SAVED_SEARCH", "SUGGESTED_CHANNEL", "PEOPLE_CELEBRATIONS", "SOCIAL_LINK", "ZERO_STATE_CHAT_SUGGESTION", "ZERO_STATE_CHAT_TOOL_SUGGESTION", "ZERO_STATE_PROMPT_TEMPLATE_SUGGESTION", "ZERO_STATE_STATIC_WORKFLOW_SUGGESTION", "ZERO_STATE_AGENT_SUGGESTION", "PERSONALIZED_CHAT_SUGGESTION", "DAILY_DIGEST", "PODCAST", "TASK", "PLAN_MY_DAY", "END_MY_DAY", "STARTER_KIT_EXTENSION", "STARTER_KIT_ORG_CHART", "STARTER_KIT_ADD_DOC", "MEETING_RECAP", "ACTIVE_DISCUSSION", "MID_DAY_CATCH_UP", "QUERY_SUGGESTION", "COWORK_CUJ_PROMO", "CARD_STACK_PROMO", "WEEKLY_MEETINGS", "FOLLOW_UP", "MILESTONE_TIMELINE_CHECK", "PROJECT_DISCUSSION_DIGEST", "PROJECT_FOCUS_BLOCK", "PROJECT_NEXT_STEP", "DEMO_CARD", "OOO_PLANNER", "OOO_CATCH_UP": + case "FREQUENTLY_ACCESSED", "RECENTLY_ACCESSED", "TRENDING_DOCUMENT", "VERIFICATION_REMINDER", "SUGGESTED_DOCUMENT", "EMPTY_STATE_SUGGESTION", "FRECENCY_SCORED", "SERVER_GENERATED", "USE_CASE", "UPDATE_SINCE_LAST_VIEW", "RECENTLY_STARTED", "EVENT", "USER_MENTION", "ANNOUNCEMENT", "EXTERNAL_ANNOUNCEMENT", "POPULARITY_BASED_TRENDING", "COMPANY_RESOURCE", "EVENT_DOCUMENT_FROM_CONTENT", "EVENT_DOCUMENT_FROM_SEARCH", "VISIT_AFFINITY_SCORED", "SUGGESTED_APP", "SUGGESTED_PERSON", "ACTIVITY_HIGHLIGHT", "SAVED_SEARCH", "SUGGESTED_CHANNEL", "PEOPLE_CELEBRATIONS", "SOCIAL_LINK", "ZERO_STATE_CHAT_SUGGESTION", "ZERO_STATE_CHAT_TOOL_SUGGESTION", "ZERO_STATE_PROMPT_TEMPLATE_SUGGESTION", "ZERO_STATE_STATIC_WORKFLOW_SUGGESTION", "ZERO_STATE_AGENT_SUGGESTION", "PERSONALIZED_CHAT_SUGGESTION", "DAILY_DIGEST", "PODCAST", "TASK", "PLAN_MY_DAY", "END_MY_DAY", "STARTER_KIT_EXTENSION", "STARTER_KIT_ORG_CHART", "STARTER_KIT_ADD_DOC", "MEETING_RECAP", "ACTIVE_DISCUSSION", "MID_DAY_CATCH_UP", "QUERY_SUGGESTION", "COWORK_CUJ_PROMO", "CARD_STACK_PROMO", "WEEKLY_MEETINGS", "FOLLOW_UP", "MILESTONE_TIMELINE_CHECK", "PROJECT_DISCUSSION_DIGEST", "PROJECT_FOCUS_BLOCK", "PROJECT_NEXT_STEP", "DEMO_CARD", "OOO_PLANNER", "OOO_CATCH_UP", "ADMIN_HEALTH_CENTER": return true } } diff --git a/models/components/feedrequest.go b/models/components/feedrequest.go index 5e1d169b..912d2657 100644 --- a/models/components/feedrequest.go +++ b/models/components/feedrequest.go @@ -53,6 +53,7 @@ const ( FeedRequestCategoryDemoCard FeedRequestCategory = "DEMO_CARD" FeedRequestCategoryOooPlanner FeedRequestCategory = "OOO_PLANNER" FeedRequestCategoryOooCatchUp FeedRequestCategory = "OOO_CATCH_UP" + FeedRequestCategoryAdminHealthCenter FeedRequestCategory = "ADMIN_HEALTH_CENTER" ) func (e FeedRequestCategory) ToPointer() *FeedRequestCategory { @@ -149,6 +150,8 @@ func (e *FeedRequestCategory) UnmarshalJSON(data []byte) error { case "OOO_PLANNER": fallthrough case "OOO_CATCH_UP": + fallthrough + case "ADMIN_HEALTH_CENTER": *e = FeedRequestCategory(v) return nil default: diff --git a/models/components/feedresult.go b/models/components/feedresult.go index 46031d53..17635383 100644 --- a/models/components/feedresult.go +++ b/models/components/feedresult.go @@ -49,6 +49,7 @@ const ( FeedResultCategoryDemoCard FeedResultCategory = "DEMO_CARD" FeedResultCategoryOooPlanner FeedResultCategory = "OOO_PLANNER" FeedResultCategoryOooCatchUp FeedResultCategory = "OOO_CATCH_UP" + FeedResultCategoryAdminHealthCenter FeedResultCategory = "ADMIN_HEALTH_CENTER" ) func (e FeedResultCategory) ToPointer() *FeedResultCategory { @@ -59,7 +60,7 @@ func (e FeedResultCategory) ToPointer() *FeedResultCategory { func (e *FeedResultCategory) IsExact() bool { if e != nil { switch *e { - case "DOCUMENT_SUGGESTION", "DOCUMENT_SUGGESTION_SCENARIO", "TRENDING_DOCUMENT", "USE_CASE", "VERIFICATION_REMINDER", "EVENT", "ANNOUNCEMENT", "MENTION", "DATASOURCE_AFFINITY", "RECENT", "COMPANY_RESOURCE", "EXPERIMENTAL", "PEOPLE_CELEBRATIONS", "SOCIAL_LINK", "EXTERNAL_TASKS", "DISPLAYABLE_LIST", "ZERO_STATE_CHAT_SUGGESTION", "ZERO_STATE_CHAT_TOOL_SUGGESTION", "ZERO_STATE_WORKFLOW_CREATED_BY_ME", "ZERO_STATE_WORKFLOW_FAVORITES", "ZERO_STATE_WORKFLOW_POPULAR", "ZERO_STATE_WORKFLOW_RECENT", "ZERO_STATE_WORKFLOW_SUGGESTION", "PERSONALIZED_CHAT_SUGGESTION", "DAILY_DIGEST", "PODCAST", "TASK", "PLAN_MY_DAY", "END_MY_DAY", "STARTER_KIT", "MID_DAY_CATCH_UP", "QUERY_SUGGESTION", "COWORK_CUJ_PROMO", "CARD_STACK_PROMO", "WEEKLY_MEETINGS", "FOLLOW_UP", "MILESTONE_TIMELINE_CHECK", "PROJECT_DISCUSSION_DIGEST", "PROJECT_FOCUS_BLOCK", "PROJECT_NEXT_STEP", "DEMO_CARD", "OOO_PLANNER", "OOO_CATCH_UP": + case "DOCUMENT_SUGGESTION", "DOCUMENT_SUGGESTION_SCENARIO", "TRENDING_DOCUMENT", "USE_CASE", "VERIFICATION_REMINDER", "EVENT", "ANNOUNCEMENT", "MENTION", "DATASOURCE_AFFINITY", "RECENT", "COMPANY_RESOURCE", "EXPERIMENTAL", "PEOPLE_CELEBRATIONS", "SOCIAL_LINK", "EXTERNAL_TASKS", "DISPLAYABLE_LIST", "ZERO_STATE_CHAT_SUGGESTION", "ZERO_STATE_CHAT_TOOL_SUGGESTION", "ZERO_STATE_WORKFLOW_CREATED_BY_ME", "ZERO_STATE_WORKFLOW_FAVORITES", "ZERO_STATE_WORKFLOW_POPULAR", "ZERO_STATE_WORKFLOW_RECENT", "ZERO_STATE_WORKFLOW_SUGGESTION", "PERSONALIZED_CHAT_SUGGESTION", "DAILY_DIGEST", "PODCAST", "TASK", "PLAN_MY_DAY", "END_MY_DAY", "STARTER_KIT", "MID_DAY_CATCH_UP", "QUERY_SUGGESTION", "COWORK_CUJ_PROMO", "CARD_STACK_PROMO", "WEEKLY_MEETINGS", "FOLLOW_UP", "MILESTONE_TIMELINE_CHECK", "PROJECT_DISCUSSION_DIGEST", "PROJECT_FOCUS_BLOCK", "PROJECT_NEXT_STEP", "DEMO_CARD", "OOO_PLANNER", "OOO_CATCH_UP", "ADMIN_HEALTH_CENTER": return true } } diff --git a/models/components/toolserverauthstatus.go b/models/components/toolserverauthstatus.go new file mode 100644 index 00000000..7444a14f --- /dev/null +++ b/models/components/toolserverauthstatus.go @@ -0,0 +1,26 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +// ToolServerAuthStatus - Authentication status for the calling user. +type ToolServerAuthStatus string + +const ( + ToolServerAuthStatusAwaitingAuth ToolServerAuthStatus = "AWAITING_AUTH" + ToolServerAuthStatusAuthorized ToolServerAuthStatus = "AUTHORIZED" +) + +func (e ToolServerAuthStatus) ToPointer() *ToolServerAuthStatus { + return &e +} + +// IsExact returns true if the value matches a known enum value, false otherwise. +func (e *ToolServerAuthStatus) IsExact() bool { + if e != nil { + switch *e { + case "AWAITING_AUTH", "AUTHORIZED": + return true + } + } + return false +} diff --git a/models/components/toolserverauthstatusresponse.go b/models/components/toolserverauthstatusresponse.go new file mode 100644 index 00000000..34700caa --- /dev/null +++ b/models/components/toolserverauthstatusresponse.go @@ -0,0 +1,55 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +type ToolServerAuthStatusResponse struct { + // Human-readable name of the tool server. + DisplayName *string `json:"displayName,omitempty"` + // Logo URL for the tool server. + LogoURL *string `json:"logoUrl,omitempty"` + // Brief description of the tool server. + Description *string `json:"description,omitempty"` + // Authentication status for the calling user. + AuthStatus ToolServerAuthStatus `json:"authStatus"` + // Authentication mechanism used by an action pack. + // - `AUTH_USER_OAUTH`: Requires per-user OAuth consent to the third-party tool. + // - `AUTH_ADMIN`: Uses a service-account / admin-owned credential. End users do not authorize individually. + // - `AUTH_NONE`: Action pack requires no authentication. + // + AuthType ActionAuthType `json:"authType"` +} + +func (t *ToolServerAuthStatusResponse) GetDisplayName() *string { + if t == nil { + return nil + } + return t.DisplayName +} + +func (t *ToolServerAuthStatusResponse) GetLogoURL() *string { + if t == nil { + return nil + } + return t.LogoURL +} + +func (t *ToolServerAuthStatusResponse) GetDescription() *string { + if t == nil { + return nil + } + return t.Description +} + +func (t *ToolServerAuthStatusResponse) GetAuthStatus() ToolServerAuthStatus { + if t == nil { + return ToolServerAuthStatus("") + } + return t.AuthStatus +} + +func (t *ToolServerAuthStatusResponse) GetAuthType() ActionAuthType { + if t == nil { + return ActionAuthType("") + } + return t.AuthType +} diff --git a/models/operations/authorizetoolserver.go b/models/operations/authorizetoolserver.go new file mode 100644 index 00000000..3536429f --- /dev/null +++ b/models/operations/authorizetoolserver.go @@ -0,0 +1,47 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package operations + +import ( + "github.com/gleanwork/api-client-go/models/components" +) + +type AuthorizeToolServerRequest struct { + // Unique identifier of the tool server. + ServerID string `pathParam:"style=simple,explode=false,name=serverId"` + AuthorizeToolServerRequest components.AuthorizeToolServerRequest `request:"mediaType=application/json"` +} + +func (a *AuthorizeToolServerRequest) GetServerID() string { + if a == nil { + return "" + } + return a.ServerID +} + +func (a *AuthorizeToolServerRequest) GetAuthorizeToolServerRequest() components.AuthorizeToolServerRequest { + if a == nil { + return components.AuthorizeToolServerRequest{} + } + return a.AuthorizeToolServerRequest +} + +type AuthorizeToolServerResponse struct { + HTTPMeta components.HTTPMetadata `json:"-"` + // Successful operation + AuthorizeToolServerResponse *components.AuthorizeToolServerResponse +} + +func (a *AuthorizeToolServerResponse) GetHTTPMeta() components.HTTPMetadata { + if a == nil { + return components.HTTPMetadata{} + } + return a.HTTPMeta +} + +func (a *AuthorizeToolServerResponse) GetAuthorizeToolServerResponse() *components.AuthorizeToolServerResponse { + if a == nil { + return nil + } + return a.AuthorizeToolServerResponse +} diff --git a/models/operations/gettoolserverauthstatus.go b/models/operations/gettoolserverauthstatus.go new file mode 100644 index 00000000..730f97ee --- /dev/null +++ b/models/operations/gettoolserverauthstatus.go @@ -0,0 +1,39 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package operations + +import ( + "github.com/gleanwork/api-client-go/models/components" +) + +type GetToolServerAuthStatusRequest struct { + // Unique identifier of the tool server. + ServerID string `pathParam:"style=simple,explode=false,name=serverId"` +} + +func (g *GetToolServerAuthStatusRequest) GetServerID() string { + if g == nil { + return "" + } + return g.ServerID +} + +type GetToolServerAuthStatusResponse struct { + HTTPMeta components.HTTPMetadata `json:"-"` + // Successful operation + ToolServerAuthStatusResponse *components.ToolServerAuthStatusResponse +} + +func (g *GetToolServerAuthStatusResponse) GetHTTPMeta() components.HTTPMetadata { + if g == nil { + return components.HTTPMetadata{} + } + return g.HTTPMeta +} + +func (g *GetToolServerAuthStatusResponse) GetToolServerAuthStatusResponse() *components.ToolServerAuthStatusResponse { + if g == nil { + return nil + } + return g.ToolServerAuthStatusResponse +} diff --git a/tests/mockserver/internal/handler/generated_handlers.go b/tests/mockserver/internal/handler/generated_handlers.go index 67af751e..d5fe2f85 100644 --- a/tests/mockserver/internal/handler/generated_handlers.go +++ b/tests/mockserver/internal/handler/generated_handlers.go @@ -27,6 +27,7 @@ func GeneratedHandlers(ctx context.Context, dir *logging.HTTPFileDirectory, rt * NewGeneratedHandler(ctx, http.MethodGet, "/rest/api/v1/governance/data/policies", pathGetRestAPIV1GovernanceDataPolicies(dir, rt)), NewGeneratedHandler(ctx, http.MethodGet, "/rest/api/v1/governance/data/policies/{id}", pathGetRestAPIV1GovernanceDataPoliciesID(dir, rt)), NewGeneratedHandler(ctx, http.MethodGet, "/rest/api/v1/people/{person_id}/photo", pathGetRestAPIV1PeoplePersonIDPhoto(dir, rt)), + NewGeneratedHandler(ctx, http.MethodGet, "/rest/api/v1/tool-servers/{serverId}/auth", pathGetRestAPIV1ToolServersServerIDAuth(dir, rt)), NewGeneratedHandler(ctx, http.MethodGet, "/rest/api/v1/tools/list", pathGetRestAPIV1ToolsList(dir, rt)), NewGeneratedHandler(ctx, http.MethodPatch, "/rest/api/v1/configure/datasources/{datasourceId}/instances/{instanceId}", pathPatchRestAPIV1ConfigureDatasourcesDatasourceIDInstancesInstanceID(dir, rt)), NewGeneratedHandler(ctx, http.MethodPost, "/api/agents/search", pathPostAPIAgentsSearch(dir, rt)), @@ -110,6 +111,7 @@ func GeneratedHandlers(ctx context.Context, dir *logging.HTTPFileDirectory, rt * NewGeneratedHandler(ctx, http.MethodPost, "/rest/api/v1/recommendations", pathPostRestAPIV1Recommendations(dir, rt)), NewGeneratedHandler(ctx, http.MethodPost, "/rest/api/v1/search", pathPostRestAPIV1Search(dir, rt)), NewGeneratedHandler(ctx, http.MethodPost, "/rest/api/v1/summarize", pathPostRestAPIV1Summarize(dir, rt)), + NewGeneratedHandler(ctx, http.MethodPost, "/rest/api/v1/tool-servers/{serverId}/auth", pathPostRestAPIV1ToolServersServerIDAuth(dir, rt)), NewGeneratedHandler(ctx, http.MethodPost, "/rest/api/v1/tools/call", pathPostRestAPIV1ToolsCall(dir, rt)), NewGeneratedHandler(ctx, http.MethodPost, "/rest/api/v1/unpin", pathPostRestAPIV1Unpin(dir, rt)), NewGeneratedHandler(ctx, http.MethodPost, "/rest/api/v1/updateannouncement", pathPostRestAPIV1Updateannouncement(dir, rt)), diff --git a/tests/mockserver/internal/handler/pathgetrestapiv1toolserversserveridauth.go b/tests/mockserver/internal/handler/pathgetrestapiv1toolserversserveridauth.go new file mode 100644 index 00000000..53c86d01 --- /dev/null +++ b/tests/mockserver/internal/handler/pathgetrestapiv1toolserversserveridauth.go @@ -0,0 +1,65 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package handler + +import ( + "fmt" + "log" + "mockserver/internal/handler/assert" + "mockserver/internal/logging" + "mockserver/internal/sdk/models/components" + "mockserver/internal/sdk/utils" + "mockserver/internal/tracking" + "net/http" +) + +func pathGetRestAPIV1ToolServersServerIDAuth(dir *logging.HTTPFileDirectory, rt *tracking.RequestTracker) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + test := req.Header.Get("x-speakeasy-test-name") + instanceID := req.Header.Get("x-speakeasy-test-instance-id") + + count := rt.GetRequestCount(test, instanceID) + + switch fmt.Sprintf("%s[%d]", test, count) { + case "getToolServerAuthStatus[0]": + dir.HandlerFunc("getToolServerAuthStatus", testGetToolServerAuthStatusGetToolServerAuthStatus0)(w, req) + default: + http.Error(w, fmt.Sprintf("Unknown test: %s[%d]", test, count), http.StatusBadRequest) + } + } +} + +func testGetToolServerAuthStatusGetToolServerAuthStatus0(w http.ResponseWriter, req *http.Request) { + if err := assert.SecurityAuthorizationHeader(req, false, "Bearer"); err != nil { + log.Printf("assertion error: %s\n", err) + http.Error(w, err.Error(), http.StatusUnauthorized) + return + } + if err := assert.AcceptHeader(req, []string{"application/json"}); err != nil { + log.Printf("assertion error: %s\n", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if err := assert.HeaderExists(req, "User-Agent"); err != nil { + log.Printf("assertion error: %s\n", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + var respBody *components.ToolServerAuthStatusResponse = &components.ToolServerAuthStatusResponse{ + AuthStatus: components.ToolServerAuthStatusAuthorized, + AuthType: components.ActionAuthTypeAuthNone, + } + respBodyBytes, err := utils.MarshalJSON(respBody, "", true) + + if err != nil { + http.Error( + w, + "Unable to encode response body as JSON: "+err.Error(), + http.StatusInternalServerError, + ) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(respBodyBytes) +} diff --git a/tests/mockserver/internal/handler/pathpostrestapiv1createcollection.go b/tests/mockserver/internal/handler/pathpostrestapiv1createcollection.go index 371b9023..5c99a0ad 100644 --- a/tests/mockserver/internal/handler/pathpostrestapiv1createcollection.go +++ b/tests/mockserver/internal/handler/pathpostrestapiv1createcollection.go @@ -56,14 +56,14 @@ func testCreatecollectionCreatecollection0(w http.ResponseWriter, req *http.Requ operations.ResponseBody2{ Collection: &components.Collection{ Name: "", - Description: "whole busily jive hawk gee basic minus hence", + Description: "motionless whenever paintwork import over cuckoo", AddedRoles: []components.UserRoleSpecification{ components.UserRoleSpecification{ Person: &components.Person{ Name: "George Clooney", ObfuscatedID: "abc123", }, - Role: components.UserRoleAnswerModerator, + Role: components.UserRoleOwner, }, }, RemovedRoles: []components.UserRoleSpecification{ @@ -90,7 +90,7 @@ func testCreatecollectionCreatecollection0(w http.ResponseWriter, req *http.Requ }, }, }, - ID: 158969, + ID: 363711, Creator: &components.Person{ Name: "George Clooney", ObfuscatedID: "abc123", @@ -101,7 +101,7 @@ func testCreatecollectionCreatecollection0(w http.ResponseWriter, req *http.Requ }, Items: []components.CollectionItem{ components.CollectionItem{ - CollectionID: 110375, + CollectionID: 570197, CreatedBy: &components.Person{ Name: "George Clooney", ObfuscatedID: "abc123", @@ -266,13 +266,13 @@ func testCreatecollectionCreatecollection0(w http.ResponseWriter, req *http.Requ Name: "George Clooney", ObfuscatedID: "abc123", }, - Role: components.UserRoleEditor, + Role: components.UserRoleAnswerModerator, }, }, }, Collection: &components.Collection{ Name: "", - Description: "wedge colorfully orientate rally", + Description: "athwart skateboard newsstand farm bourgeoisie ah how elliptical aha well-to-do", AudienceFilters: []components.FacetFilter{ components.FacetFilter{ FieldName: types.String("type"), @@ -288,7 +288,7 @@ func testCreatecollectionCreatecollection0(w http.ResponseWriter, req *http.Requ }, }, }, - ID: 131797, + ID: 643990, Creator: &components.Person{ Name: "George Clooney", ObfuscatedID: "abc123", @@ -300,7 +300,7 @@ func testCreatecollectionCreatecollection0(w http.ResponseWriter, req *http.Requ Children: []components.Collection{ components.Collection{ Name: "", - Description: "outside yippee sidetrack mature regularly mouser inject worth", + Description: "woot purse salty even as advanced", AudienceFilters: []components.FacetFilter{ components.FacetFilter{ FieldName: types.String("type"), @@ -316,7 +316,7 @@ func testCreatecollectionCreatecollection0(w http.ResponseWriter, req *http.Requ }, }, }, - ID: 149448, + ID: 359978, Creator: &components.Person{ Name: "George Clooney", ObfuscatedID: "abc123", @@ -328,7 +328,7 @@ func testCreatecollectionCreatecollection0(w http.ResponseWriter, req *http.Requ }, }, }, - ItemType: components.CollectionItemItemTypeCollection, + ItemType: components.CollectionItemItemTypeURL, }, }, }, diff --git a/tests/mockserver/internal/handler/pathpostrestapiv1getchat.go b/tests/mockserver/internal/handler/pathpostrestapiv1getchat.go index 96d4127e..87401958 100644 --- a/tests/mockserver/internal/handler/pathpostrestapiv1getchat.go +++ b/tests/mockserver/internal/handler/pathpostrestapiv1getchat.go @@ -628,8 +628,8 @@ func testGetchatGetchat0(w http.ResponseWriter, req *http.Request) { Roles: []components.UserRoleSpecification{}, SourceDocumentSpec: types.Pointer(components.CreateDocumentSpecUnionDocumentSpec3( components.DocumentSpec3{ - UgcType: components.DocumentSpecUgcType1Announcements, - ContentID: 848009, + UgcType: components.DocumentSpecUgcType1Shortcuts, + ContentID: 602763, }, )), SourceType: components.AnswerSourceTypeAssistant.ToPointer(), diff --git a/tests/mockserver/internal/handler/pathpostrestapiv1toolserversserveridauth.go b/tests/mockserver/internal/handler/pathpostrestapiv1toolserversserveridauth.go new file mode 100644 index 00000000..93aadc88 --- /dev/null +++ b/tests/mockserver/internal/handler/pathpostrestapiv1toolserversserveridauth.go @@ -0,0 +1,69 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package handler + +import ( + "fmt" + "log" + "mockserver/internal/handler/assert" + "mockserver/internal/logging" + "mockserver/internal/sdk/models/components" + "mockserver/internal/sdk/utils" + "mockserver/internal/tracking" + "net/http" +) + +func pathPostRestAPIV1ToolServersServerIDAuth(dir *logging.HTTPFileDirectory, rt *tracking.RequestTracker) http.HandlerFunc { + return func(w http.ResponseWriter, req *http.Request) { + test := req.Header.Get("x-speakeasy-test-name") + instanceID := req.Header.Get("x-speakeasy-test-instance-id") + + count := rt.GetRequestCount(test, instanceID) + + switch fmt.Sprintf("%s[%d]", test, count) { + case "authorizeToolServer[0]": + dir.HandlerFunc("authorizeToolServer", testAuthorizeToolServerAuthorizeToolServer0)(w, req) + default: + http.Error(w, fmt.Sprintf("Unknown test: %s[%d]", test, count), http.StatusBadRequest) + } + } +} + +func testAuthorizeToolServerAuthorizeToolServer0(w http.ResponseWriter, req *http.Request) { + if err := assert.SecurityAuthorizationHeader(req, false, "Bearer"); err != nil { + log.Printf("assertion error: %s\n", err) + http.Error(w, err.Error(), http.StatusUnauthorized) + return + } + if err := assert.ContentType(req, "application/json", true); err != nil { + log.Printf("assertion error: %s\n", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if err := assert.AcceptHeader(req, []string{"application/json"}); err != nil { + log.Printf("assertion error: %s\n", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if err := assert.HeaderExists(req, "User-Agent"); err != nil { + log.Printf("assertion error: %s\n", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + var respBody *components.AuthorizeToolServerResponse = &components.AuthorizeToolServerResponse{ + AuthorizationURL: "https://shocked-casket.name/", + } + respBodyBytes, err := utils.MarshalJSON(respBody, "", true) + + if err != nil { + http.Error( + w, + "Unable to encode response body as JSON: "+err.Error(), + http.StatusInternalServerError, + ) + return + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(respBodyBytes) +} diff --git a/tests/mockserver/internal/sdk/models/components/authorizetoolserverrequest.go b/tests/mockserver/internal/sdk/models/components/authorizetoolserverrequest.go new file mode 100644 index 00000000..2af86c39 --- /dev/null +++ b/tests/mockserver/internal/sdk/models/components/authorizetoolserverrequest.go @@ -0,0 +1,17 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +type AuthorizeToolServerRequest struct { + // URL to redirect the end user's browser back to after the OAuth flow completes. + // Must be present in the tenant's configured return URL allowlist. + // + ReturnURL string `json:"returnUrl"` +} + +func (o *AuthorizeToolServerRequest) GetReturnURL() string { + if o == nil { + return "" + } + return o.ReturnURL +} diff --git a/tests/mockserver/internal/sdk/models/components/authorizetoolserverresponse.go b/tests/mockserver/internal/sdk/models/components/authorizetoolserverresponse.go new file mode 100644 index 00000000..c5202d3b --- /dev/null +++ b/tests/mockserver/internal/sdk/models/components/authorizetoolserverresponse.go @@ -0,0 +1,17 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +type AuthorizeToolServerResponse struct { + // URL that the client should navigate the end user to in order to begin the OAuth flow. + // After the user consents, control returns to `returnUrl` from the request. + // + AuthorizationURL string `json:"authorizationUrl"` +} + +func (o *AuthorizeToolServerResponse) GetAuthorizationURL() string { + if o == nil { + return "" + } + return o.AuthorizationURL +} diff --git a/tests/mockserver/internal/sdk/models/components/feedentry.go b/tests/mockserver/internal/sdk/models/components/feedentry.go index 665efb1e..3786e358 100644 --- a/tests/mockserver/internal/sdk/models/components/feedentry.go +++ b/tests/mockserver/internal/sdk/models/components/feedentry.go @@ -112,6 +112,7 @@ const ( JustificationTypeDemoCard JustificationType = "DEMO_CARD" JustificationTypeOooPlanner JustificationType = "OOO_PLANNER" JustificationTypeOooCatchUp JustificationType = "OOO_CATCH_UP" + JustificationTypeAdminHealthCenter JustificationType = "ADMIN_HEALTH_CENTER" ) func (e JustificationType) ToPointer() *JustificationType { @@ -234,6 +235,8 @@ func (e *JustificationType) UnmarshalJSON(data []byte) error { case "OOO_PLANNER": fallthrough case "OOO_CATCH_UP": + fallthrough + case "ADMIN_HEALTH_CENTER": *e = JustificationType(v) return nil default: diff --git a/tests/mockserver/internal/sdk/models/components/feedrequest.go b/tests/mockserver/internal/sdk/models/components/feedrequest.go index 24e197ca..2eff19ff 100644 --- a/tests/mockserver/internal/sdk/models/components/feedrequest.go +++ b/tests/mockserver/internal/sdk/models/components/feedrequest.go @@ -53,6 +53,7 @@ const ( FeedRequestCategoryDemoCard FeedRequestCategory = "DEMO_CARD" FeedRequestCategoryOooPlanner FeedRequestCategory = "OOO_PLANNER" FeedRequestCategoryOooCatchUp FeedRequestCategory = "OOO_CATCH_UP" + FeedRequestCategoryAdminHealthCenter FeedRequestCategory = "ADMIN_HEALTH_CENTER" ) func (e FeedRequestCategory) ToPointer() *FeedRequestCategory { @@ -149,6 +150,8 @@ func (e *FeedRequestCategory) UnmarshalJSON(data []byte) error { case "OOO_PLANNER": fallthrough case "OOO_CATCH_UP": + fallthrough + case "ADMIN_HEALTH_CENTER": *e = FeedRequestCategory(v) return nil default: diff --git a/tests/mockserver/internal/sdk/models/components/feedresult.go b/tests/mockserver/internal/sdk/models/components/feedresult.go index 510f0145..8e2124eb 100644 --- a/tests/mockserver/internal/sdk/models/components/feedresult.go +++ b/tests/mockserver/internal/sdk/models/components/feedresult.go @@ -54,6 +54,7 @@ const ( FeedResultCategoryDemoCard FeedResultCategory = "DEMO_CARD" FeedResultCategoryOooPlanner FeedResultCategory = "OOO_PLANNER" FeedResultCategoryOooCatchUp FeedResultCategory = "OOO_CATCH_UP" + FeedResultCategoryAdminHealthCenter FeedResultCategory = "ADMIN_HEALTH_CENTER" ) func (e FeedResultCategory) ToPointer() *FeedResultCategory { @@ -150,6 +151,8 @@ func (e *FeedResultCategory) UnmarshalJSON(data []byte) error { case "OOO_PLANNER": fallthrough case "OOO_CATCH_UP": + fallthrough + case "ADMIN_HEALTH_CENTER": *e = FeedResultCategory(v) return nil default: diff --git a/tests/mockserver/internal/sdk/models/components/toolserverauthstatus.go b/tests/mockserver/internal/sdk/models/components/toolserverauthstatus.go new file mode 100644 index 00000000..d6715ec4 --- /dev/null +++ b/tests/mockserver/internal/sdk/models/components/toolserverauthstatus.go @@ -0,0 +1,35 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +import ( + "encoding/json" + "fmt" +) + +// ToolServerAuthStatus - Authentication status for the calling user. +type ToolServerAuthStatus string + +const ( + ToolServerAuthStatusAwaitingAuth ToolServerAuthStatus = "AWAITING_AUTH" + ToolServerAuthStatusAuthorized ToolServerAuthStatus = "AUTHORIZED" +) + +func (e ToolServerAuthStatus) ToPointer() *ToolServerAuthStatus { + return &e +} +func (e *ToolServerAuthStatus) UnmarshalJSON(data []byte) error { + var v string + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case "AWAITING_AUTH": + fallthrough + case "AUTHORIZED": + *e = ToolServerAuthStatus(v) + return nil + default: + return fmt.Errorf("invalid value for ToolServerAuthStatus: %v", v) + } +} diff --git a/tests/mockserver/internal/sdk/models/components/toolserverauthstatusresponse.go b/tests/mockserver/internal/sdk/models/components/toolserverauthstatusresponse.go new file mode 100644 index 00000000..4328a09e --- /dev/null +++ b/tests/mockserver/internal/sdk/models/components/toolserverauthstatusresponse.go @@ -0,0 +1,55 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +type ToolServerAuthStatusResponse struct { + // Human-readable name of the tool server. + DisplayName *string `json:"displayName,omitempty"` + // Logo URL for the tool server. + LogoURL *string `json:"logoUrl,omitempty"` + // Brief description of the tool server. + Description *string `json:"description,omitempty"` + // Authentication status for the calling user. + AuthStatus ToolServerAuthStatus `json:"authStatus"` + // Authentication mechanism used by an action pack. + // - `AUTH_USER_OAUTH`: Requires per-user OAuth consent to the third-party tool. + // - `AUTH_ADMIN`: Uses a service-account / admin-owned credential. End users do not authorize individually. + // - `AUTH_NONE`: Action pack requires no authentication. + // + AuthType ActionAuthType `json:"authType"` +} + +func (o *ToolServerAuthStatusResponse) GetDisplayName() *string { + if o == nil { + return nil + } + return o.DisplayName +} + +func (o *ToolServerAuthStatusResponse) GetLogoURL() *string { + if o == nil { + return nil + } + return o.LogoURL +} + +func (o *ToolServerAuthStatusResponse) GetDescription() *string { + if o == nil { + return nil + } + return o.Description +} + +func (o *ToolServerAuthStatusResponse) GetAuthStatus() ToolServerAuthStatus { + if o == nil { + return ToolServerAuthStatus("") + } + return o.AuthStatus +} + +func (o *ToolServerAuthStatusResponse) GetAuthType() ActionAuthType { + if o == nil { + return ActionAuthType("") + } + return o.AuthType +} diff --git a/tests/mockserver/internal/sdk/models/operations/authorizetoolserver.go b/tests/mockserver/internal/sdk/models/operations/authorizetoolserver.go new file mode 100644 index 00000000..df8f1505 --- /dev/null +++ b/tests/mockserver/internal/sdk/models/operations/authorizetoolserver.go @@ -0,0 +1,47 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package operations + +import ( + "mockserver/internal/sdk/models/components" +) + +type AuthorizeToolServerRequest struct { + // Unique identifier of the tool server. + ServerID string `pathParam:"style=simple,explode=false,name=serverId"` + Body components.AuthorizeToolServerRequest `request:"mediaType=application/json"` +} + +func (o *AuthorizeToolServerRequest) GetServerID() string { + if o == nil { + return "" + } + return o.ServerID +} + +func (o *AuthorizeToolServerRequest) GetBody() components.AuthorizeToolServerRequest { + if o == nil { + return components.AuthorizeToolServerRequest{} + } + return o.Body +} + +type AuthorizeToolServerResponse struct { + HTTPMeta components.HTTPMetadata `json:"-"` + // Successful operation + AuthorizeToolServerResponse *components.AuthorizeToolServerResponse +} + +func (o *AuthorizeToolServerResponse) GetHTTPMeta() components.HTTPMetadata { + if o == nil { + return components.HTTPMetadata{} + } + return o.HTTPMeta +} + +func (o *AuthorizeToolServerResponse) GetAuthorizeToolServerResponse() *components.AuthorizeToolServerResponse { + if o == nil { + return nil + } + return o.AuthorizeToolServerResponse +} diff --git a/tests/mockserver/internal/sdk/models/operations/gettoolserverauthstatus.go b/tests/mockserver/internal/sdk/models/operations/gettoolserverauthstatus.go new file mode 100644 index 00000000..26d8a0cc --- /dev/null +++ b/tests/mockserver/internal/sdk/models/operations/gettoolserverauthstatus.go @@ -0,0 +1,39 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package operations + +import ( + "mockserver/internal/sdk/models/components" +) + +type GetToolServerAuthStatusRequest struct { + // Unique identifier of the tool server. + ServerID string `pathParam:"style=simple,explode=false,name=serverId"` +} + +func (o *GetToolServerAuthStatusRequest) GetServerID() string { + if o == nil { + return "" + } + return o.ServerID +} + +type GetToolServerAuthStatusResponse struct { + HTTPMeta components.HTTPMetadata `json:"-"` + // Successful operation + ToolServerAuthStatusResponse *components.ToolServerAuthStatusResponse +} + +func (o *GetToolServerAuthStatusResponse) GetHTTPMeta() components.HTTPMetadata { + if o == nil { + return components.HTTPMetadata{} + } + return o.HTTPMeta +} + +func (o *GetToolServerAuthStatusResponse) GetToolServerAuthStatusResponse() *components.ToolServerAuthStatusResponse { + if o == nil { + return nil + } + return o.ToolServerAuthStatusResponse +} diff --git a/tests/summarize_test.go b/tests/summarize_test.go index d470e2e3..107b1ac2 100644 --- a/tests/summarize_test.go +++ b/tests/summarize_test.go @@ -25,15 +25,15 @@ func TestSummarize_Summarize(t *testing.T) { res, err := s.Client.Documents.Summarize(ctx, components.SummarizeRequest{ DocumentSpecs: []components.DocumentSpecUnion{ - components.CreateDocumentSpecUnionDocumentSpec4( - components.DocumentSpec4{ - UgcType: components.DocumentSpecUgcType2Answers, - UgcID: "", + components.CreateDocumentSpecUnionDocumentSpec2( + components.DocumentSpec2{ + ID: "", }, ), - components.CreateDocumentSpecUnionDocumentSpec1( - components.DocumentSpec1{ - URL: "https://potable-pine.org", + components.CreateDocumentSpecUnionDocumentSpec3( + components.DocumentSpec3{ + UgcType: components.DocumentSpecUgcType1Chats, + ContentID: 667054, }, ), }, diff --git a/tests/tools_test.go b/tests/tools_test.go index 274a906b..7028c627 100644 --- a/tests/tools_test.go +++ b/tests/tools_test.go @@ -89,3 +89,39 @@ func TestTools_AuthorizeActionPack(t *testing.T) { assert.Equal(t, 200, res.HTTPMeta.Response.StatusCode) } + +func TestTools_GetToolServerAuthStatus(t *testing.T) { + ctx := context.Background() + + testHTTPClient := createTestHTTPClient("getToolServerAuthStatus") + + s := apiclientgo.New( + apiclientgo.WithServerURL(utils.GetEnv("TEST_SERVER_URL", "http://localhost:18080")), + apiclientgo.WithClient(testHTTPClient), + apiclientgo.WithSecurity(utils.GetEnv("GLEAN_API_TOKEN", "value")), + ) + + res, err := s.Client.Tools.RetrieveToolServerAuthStatus(ctx, "") + require.NoError(t, err) + assert.Equal(t, 200, res.HTTPMeta.Response.StatusCode) + +} + +func TestTools_AuthorizeToolServer(t *testing.T) { + ctx := context.Background() + + testHTTPClient := createTestHTTPClient("authorizeToolServer") + + s := apiclientgo.New( + apiclientgo.WithServerURL(utils.GetEnv("TEST_SERVER_URL", "http://localhost:18080")), + apiclientgo.WithClient(testHTTPClient), + apiclientgo.WithSecurity(utils.GetEnv("GLEAN_API_TOKEN", "value")), + ) + + res, err := s.Client.Tools.AuthorizeToolServer(ctx, "", components.AuthorizeToolServerRequest{ + ReturnURL: "https://lucky-disadvantage.com", + }) + require.NoError(t, err) + assert.Equal(t, 200, res.HTTPMeta.Response.StatusCode) + +} diff --git a/tools.go b/tools.go index 965039d9..c62fe818 100644 --- a/tools.go +++ b/tools.go @@ -927,3 +927,456 @@ func (s *Tools) AuthorizeActionPack(ctx context.Context, actionPackID string, au return res, nil } + +// RetrieveToolServerAuthStatus - Get end-user authentication status for a tool server. +// Returns display information and the calling user's current authentication status +// for the specified tool server. +func (s *Tools) RetrieveToolServerAuthStatus(ctx context.Context, serverID string, opts ...operations.Option) (*operations.GetToolServerAuthStatusResponse, error) { + request := operations.GetToolServerAuthStatusRequest{ + ServerID: serverID, + } + + o := operations.Options{} + supportedOptions := []string{ + operations.SupportedOptionRetries, + operations.SupportedOptionTimeout, + } + + for _, opt := range opts { + if err := opt(&o, supportedOptions...); err != nil { + return nil, fmt.Errorf("error applying option: %w", err) + } + } + + var baseURL string + if o.ServerURL == nil { + baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) + } else { + baseURL = *o.ServerURL + } + opURL, err := utils.GenerateURL(ctx, baseURL, "/rest/api/v1/tool-servers/{serverId}/auth", request, nil) + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } + + hookCtx := hooks.HookContext{ + SDK: s.rootSDK, + SDKConfiguration: s.sdkConfiguration, + BaseURL: baseURL, + Context: ctx, + OperationID: "getToolServerAuthStatus", + OAuth2Scopes: nil, + SecuritySource: s.sdkConfiguration.Security, + } + + timeout := o.Timeout + if timeout == nil { + timeout = s.sdkConfiguration.Timeout + } + + if timeout != nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *timeout) + defer cancel() + } + + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) + if err != nil { + return nil, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) + + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } + + for k, v := range o.SetHeaders { + req.Header.Set(k, v) + } + + globalRetryConfig := s.sdkConfiguration.RetryConfig + retryConfig := o.Retries + if retryConfig == nil { + if globalRetryConfig != nil { + retryConfig = globalRetryConfig + } + } + + var httpRes *http.Response + if retryConfig != nil { + httpRes, err = utils.Retry(ctx, utils.Retries{ + Config: retryConfig, + StatusCodes: []string{ + "429", + "500", + "502", + "503", + "504", + }, + }, func() (*http.Response, error) { + if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil { + copyBody, err := req.GetBody() + + if err != nil { + return nil, err + } + + req.Body = copyBody + } + + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + if retry.IsPermanentError(err) || retry.IsTemporaryError(err) { + return nil, err + } + + return nil, retry.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err + }) + + if err != nil { + return nil, err + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } else { + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, err + } + + httpRes, err = s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + return nil, err + } else if utils.MatchStatusCodes([]string{"4XX", "5XX"}, httpRes.StatusCode) { + _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) + if err != nil { + return nil, err + } else if _httpRes != nil { + httpRes = _httpRes + } + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } + + res := &operations.GetToolServerAuthStatusResponse{ + HTTPMeta: components.HTTPMetadata{ + Request: req, + Response: httpRes, + }, + } + + switch { + case httpRes.StatusCode == 200: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out components.ToolServerAuthStatusResponse + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.ToolServerAuthStatusResponse = &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 400: + fallthrough + case httpRes.StatusCode == 401: + fallthrough + case httpRes.StatusCode == 404: + fallthrough + case httpRes.StatusCode == 429: + fallthrough + case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, apierrors.NewAPIError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, apierrors.NewAPIError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, apierrors.NewAPIError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) + } + + return res, nil + +} + +// AuthorizeToolServer - Start the OAuth authorization flow for a tool server. +// Initiates the third-party OAuth flow for the specified tool server and returns the +// authorization URL that the client should navigate the end user to. After the OAuth +// callback completes, the user's browser is redirected back to `returnUrl` with query +// parameters indicating the result. +// +// `returnUrl` must match the tenant's configured return URL allowlist; otherwise the +// request is rejected with 400. +func (s *Tools) AuthorizeToolServer(ctx context.Context, serverID string, authorizeToolServerRequest components.AuthorizeToolServerRequest, opts ...operations.Option) (*operations.AuthorizeToolServerResponse, error) { + request := operations.AuthorizeToolServerRequest{ + ServerID: serverID, + AuthorizeToolServerRequest: authorizeToolServerRequest, + } + + o := operations.Options{} + supportedOptions := []string{ + operations.SupportedOptionRetries, + operations.SupportedOptionTimeout, + } + + for _, opt := range opts { + if err := opt(&o, supportedOptions...); err != nil { + return nil, fmt.Errorf("error applying option: %w", err) + } + } + + var baseURL string + if o.ServerURL == nil { + baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) + } else { + baseURL = *o.ServerURL + } + opURL, err := utils.GenerateURL(ctx, baseURL, "/rest/api/v1/tool-servers/{serverId}/auth", request, nil) + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } + + hookCtx := hooks.HookContext{ + SDK: s.rootSDK, + SDKConfiguration: s.sdkConfiguration, + BaseURL: baseURL, + Context: ctx, + OperationID: "authorizeToolServer", + OAuth2Scopes: nil, + SecuritySource: s.sdkConfiguration.Security, + } + bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, false, "AuthorizeToolServerRequest", "json", `request:"mediaType=application/json"`) + if err != nil { + return nil, err + } + + timeout := o.Timeout + if timeout == nil { + timeout = s.sdkConfiguration.Timeout + } + + if timeout != nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *timeout) + defer cancel() + } + + req, err := http.NewRequestWithContext(ctx, "POST", opURL, bodyReader) + if err != nil { + return nil, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) + if reqContentType != "" { + req.Header.Set("Content-Type", reqContentType) + } + + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } + + for k, v := range o.SetHeaders { + req.Header.Set(k, v) + } + + globalRetryConfig := s.sdkConfiguration.RetryConfig + retryConfig := o.Retries + if retryConfig == nil { + if globalRetryConfig != nil { + retryConfig = globalRetryConfig + } + } + + var httpRes *http.Response + if retryConfig != nil { + httpRes, err = utils.Retry(ctx, utils.Retries{ + Config: retryConfig, + StatusCodes: []string{ + "429", + "500", + "502", + "503", + "504", + }, + }, func() (*http.Response, error) { + if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil { + copyBody, err := req.GetBody() + + if err != nil { + return nil, err + } + + req.Body = copyBody + } + + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + if retry.IsPermanentError(err) || retry.IsTemporaryError(err) { + return nil, err + } + + return nil, retry.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err + }) + + if err != nil { + return nil, err + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } else { + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, err + } + + httpRes, err = s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + return nil, err + } else if utils.MatchStatusCodes([]string{"4XX", "5XX"}, httpRes.StatusCode) { + _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) + if err != nil { + return nil, err + } else if _httpRes != nil { + httpRes = _httpRes + } + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } + + res := &operations.AuthorizeToolServerResponse{ + HTTPMeta: components.HTTPMetadata{ + Request: req, + Response: httpRes, + }, + } + + switch { + case httpRes.StatusCode == 200: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out components.AuthorizeToolServerResponse + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.AuthorizeToolServerResponse = &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 400: + fallthrough + case httpRes.StatusCode == 401: + fallthrough + case httpRes.StatusCode == 403: + fallthrough + case httpRes.StatusCode == 404: + fallthrough + case httpRes.StatusCode == 429: + fallthrough + case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, apierrors.NewAPIError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, apierrors.NewAPIError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, apierrors.NewAPIError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) + } + + return res, nil + +} From f9d16e7eab4416a13bdbfe21552d7c2f8367c97b Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 02:21:16 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow