From c4d3f90abf316b0f787249c5c8ca5dd3cbad39c0 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Fri, 4 Sep 2026 02:46:33 +0000 Subject: [PATCH 1/2] ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.796.4 --- .speakeasy/gen.lock | 113 +++++++++--------- .speakeasy/gen.yaml | 2 +- .speakeasy/glean-merged-spec.yaml | 4 +- .speakeasy/workflow.lock | 12 +- RELEASES.md | 12 +- chat.go | 12 +- clientchat.go | 11 +- entities.go | 13 +- glean.go | 11 +- internal/config/sdkconfiguration.go | 21 ++-- internal/utils/retries.go | 36 ++++-- internal/utils/utils.go | 34 ++++++ models/components/customfieldvalue.go | 9 +- models/components/documentorerrorunion.go | 9 +- models/components/documentspecunion.go | 9 +- models/components/getshortcutrequestunion.go | 9 +- .../components/platformchatcitationsource.go | 9 +- .../components/platformchatdocumentsource.go | 9 +- .../platformchatstreameventserversentevent.go | 9 +- .../components/platformtriggerwebhookevent.go | 9 +- models/operations/createcollection.go | 9 +- models/operations/options.go | 2 +- models/operations/platformchatcreate.go | 9 +- models/operations/platformchatcreatestream.go | 9 +- skills.go | 22 +++- types/stream/stream.go | 64 +++++++--- 26 files changed, 347 insertions(+), 121 deletions(-) diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 19428939..08723ce8 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: f93d9acdb5383727834338db515aa742 + docChecksum: 37d6cc2da3d557fea3dcc4a18c4e2372 docVersion: 0.9.0 - speakeasyVersion: 1.796.3 - generationVersion: 2.934.1 - releaseVersion: 0.15.3 - configChecksum: 5e07f0304c2c9aee512a3080e5337108 + speakeasyVersion: 1.796.4 + generationVersion: 2.935.1 + releaseVersion: 0.15.4 + configChecksum: a81672e62d51264f9ed765e12914a7a5 repoURL: https://github.com/gleanwork/api-client-go.git installationURL: https://github.com/gleanwork/api-client-go persistentEdits: - generation_id: 15a588e9-5735-47a3-b298-b60cde77ecbe - pristine_commit_hash: 3757966cc845b9a64db6e7a8d4c249308dfa1f4f - pristine_tree_hash: f873446e44c415c9ea981294c4203905b667d6ef + generation_id: 2980bd3b-57e2-4482-8019-0bdc52e5aeec + pristine_commit_hash: eea9f112efed5fa82f83654c2eeb774a8bbb9255 + pristine_tree_hash: 563a2128b612c264b0448aaa48be2757ea275c31 features: go: acceptHeaders: 2.81.2 @@ -20,11 +20,11 @@ features: additionalProperties: 0.1.3 callbacks: 1.0.0 constsAndDefaults: 0.1.14 - core: 3.13.51 + core: 3.13.53 defaultEnabledRetries: 0.2.0 deprecations: 2.81.3 devContainers: 2.90.0 - downloadStreams: 0.1.2 + downloadStreams: 0.1.3 envVarSecurityUsage: 0.3.2 examples: 2.81.7 flattening: 2.81.2 @@ -40,11 +40,11 @@ features: nameOverrides: 2.81.4 nullables: 0.2.1 responseFormat: 0.1.2 - retries: 2.84.3 - sdkHooks: 0.3.0 - serverEvents: 0.1.9 + retries: 2.84.5 + sdkHooks: 0.3.1 + serverEvents: 0.1.10 tests: 0.16.8 - unions: 2.87.9 + unions: 2.87.10 uploadStreams: 0.1.0 trackedFiles: .devcontainer/README.md: @@ -85,8 +85,8 @@ trackedFiles: pristine_git_object: 10266e6f1bb29d4dc23a062cf812cd8b301e7e9c chat.go: id: 81535ccb3ff5 - last_write_checksum: sha1:66b0de0e5edc2809808e3ca04bda34f4dff47d55 - pristine_git_object: 579be4a409876525eefa93ef197a4172a4ac55c8 + last_write_checksum: sha1:fc8759eec8e613bbbbd690f54fa3c0ab6d09a0fe + pristine_git_object: 9e08391f34b358845252936b811ece2720707c2e client.go: id: d633516feaf9 last_write_checksum: sha1:0d0791344f96bf5f4ca299c16ff640582fb0c055 @@ -101,8 +101,8 @@ trackedFiles: pristine_git_object: c23df5040b91050c92d095e1bcd708a0500996fb clientchat.go: id: 5e9b368de611 - last_write_checksum: sha1:951618d218e6e122cee5b0a93519315d2dee8196 - pristine_git_object: c8111a26270c66cde0a27f3d8cee25106990d7ff + last_write_checksum: sha1:d304be6edc67d1a9c342107ff919ccd34262b21f + pristine_git_object: 54ccfc382724a161ddc8cbfe9ad7bebf4b8cb557 clientdatasources.go: id: 7d63c153115e last_write_checksum: sha1:f05ec2fd34bdab1f1eac5f02726e83c0fcb9eeb1 @@ -4533,16 +4533,16 @@ trackedFiles: pristine_git_object: 3d83ed2f48ff36968042694693ec08d892ef94fe entities.go: id: d7e3d6868ee7 - last_write_checksum: sha1:fa5b38d0f0821c7774ec211834c8f89714f93377 - pristine_git_object: ab90dc76f94ccc174c3e486263625998c41ccadd + last_write_checksum: sha1:653f02ffb2b86cc305c3aab22c5af08123d47a89 + pristine_git_object: 61e5e089997c21fe22981721e06030b68cbf3f30 findings.go: id: 39520c4fb6c8 last_write_checksum: sha1:7ac7d02ad81c004aec805c26d229e91663e2fab8 pristine_git_object: a3cb3e5448f3fdcfad77ed2a4ba47ae848d5cd5d glean.go: id: f5ed099b8e85 - last_write_checksum: sha1:7f449fe5833c47357af2209012c553354d81a94d - pristine_git_object: 85aac9fb49357fb9304604ec886c6654c9b0e82c + last_write_checksum: sha1:c62e3a0b41b7723e14d88abf2d9832714fdb1096 + pristine_git_object: 1583e3530cc8d4b8bf860983098868c32a4c5e84 go.mod: id: c47645c391ad last_write_checksum: sha1:cf65a2c96e303858d4cf70e07d4c44d3f1c1db38 @@ -4581,8 +4581,8 @@ trackedFiles: pristine_git_object: 11ceeef1d201e47aaf4fad2b37f2a83471e3bd06 internal/config/sdkconfiguration.go: id: 33b8bfac5265 - last_write_checksum: sha1:896a9b25ee7bcc92ebba2168475934ae217075a8 - pristine_git_object: 8b8818e2adcefd2e2f8b097c03d6c8f26dab92ea + last_write_checksum: sha1:6d99433ea5e86950e053661e8a85bfa571212a9f + pristine_git_object: 78d829c7b36180a1d17969ab0ebc8082e19dc76b internal/hooks/hooks.go: id: 336be70ed5c0 last_write_checksum: sha1:92e30568f03659e59b6d93072a99cf100c508c7b @@ -4621,8 +4621,8 @@ trackedFiles: pristine_git_object: 467d253270ccd7456a63f6f1d962fbce1ef86535 internal/utils/retries.go: id: b5e011d15c2d - last_write_checksum: sha1:d4b66bfee427a7b34aac2db04faf4eea311aecb9 - pristine_git_object: 419a5a6b7f73a57b20d68dca1e89588e5696a40e + last_write_checksum: sha1:aba62433df4554d17cf93e48bd3f47ba78e295d8 + pristine_git_object: aedabf6b102cb29954189f156d9243cf4bcb307b internal/utils/security.go: id: eeb54c55241b last_write_checksum: sha1:1c0b332b3cf0fa405df0c5bf4e03f335139566b6 @@ -4637,8 +4637,8 @@ trackedFiles: pristine_git_object: 138f7e2a066b10dffd0a9957ecfcab9e00dd26fe internal/utils/utils.go: id: 1133b2a27019 - last_write_checksum: sha1:36a3e6fb95d71868d1755dbb3b924a37340c7ea7 - pristine_git_object: b32a14db51857aafab25498ba32fa2905c92b5d8 + last_write_checksum: sha1:383781754b285e8a2f3e89c6ef6c5f82cee3511f + pristine_git_object: 5518b675fbcc625c6f55e69dd466434101004228 messages.go: id: 141893e2db0f last_write_checksum: sha1:ffb243ea0c08f82cc3ac09a5b612b7fe6a2078a0 @@ -5173,8 +5173,8 @@ trackedFiles: pristine_git_object: 4d95016accdd5d18e3aa4d75ab793b80097fd82d models/components/customfieldvalue.go: id: ae8790df271c - last_write_checksum: sha1:afde0d044a19bfb4e19371ca53bfd853f70de1cd - pristine_git_object: 62fa7d193ca6bf4be5bf0b17754b4246ac764a8a + last_write_checksum: sha1:c14bd231edb72a975724d050c870c1526c1ff72d + pristine_git_object: 078c15812cf3ea8faa9c1ff2870cd6b841b4caed models/components/customfieldvaluehyperlink.go: id: 5aebd93f90d0 last_write_checksum: sha1:81e2ff8a67931fb8c8bfd6461e701a1137d9838b @@ -5449,8 +5449,8 @@ trackedFiles: pristine_git_object: d61a33c47affdd444b094c2a9ce72bd78afeb620 models/components/documentorerrorunion.go: id: 55af17940246 - last_write_checksum: sha1:59e33438759707a21b13bc64f9fee2aba56aacd2 - pristine_git_object: 2ffa87c44be6b714f8616fef89bbd26ed510b28a + last_write_checksum: sha1:adbdb3ad6ecad23a971e111d7f8f2101f515f0e5 + pristine_git_object: 436817a8a75b14171df7962ae14ac0c6c2c3b046 models/components/documentpermissionsdefinition.go: id: a0b16a77c7ac last_write_checksum: sha1:aaa571d6b6a332b31500bac61e1dec50c751334c @@ -5461,8 +5461,8 @@ trackedFiles: pristine_git_object: abc65f5d20f6c93caab8edd2b37f3b23c75f803d models/components/documentspecunion.go: id: 6284f47148dc - last_write_checksum: sha1:6d58618577dc0b1a694ba21a346b79e51e24fc77 - pristine_git_object: d99129090721a2615a0d167e1f92753e64b02f76 + last_write_checksum: sha1:093b78409eeff59518ffcef90a4cd2906cae8943 + pristine_git_object: f4773bfd7f40aa7267dc69c313b8711f65bfaf87 models/components/documentstatusresponse.go: id: 70b63e60473f last_write_checksum: sha1:9212cc1e2a8d8e557562a564754308822b1443ba @@ -5741,8 +5741,8 @@ trackedFiles: pristine_git_object: a818d75e3fa166f07fa6fc54c4a7500dd10b66bf models/components/getshortcutrequestunion.go: id: 7fbfdee45165 - last_write_checksum: sha1:6c6753815d411ba423a3653dfa25afc7159c86a2 - pristine_git_object: aeb4731952f686136a3bb65741ed1ad94f5efa7b + last_write_checksum: sha1:d117135588f5c169e8417e077e3aa771191de01e + pristine_git_object: 6ef56e5370b6ff76cfbb580809300540d021d898 models/components/getshortcutresponse.go: id: f033ab08bd01 last_write_checksum: sha1:506b57631218dacc2d2434822e1bec4680833d84 @@ -6137,8 +6137,8 @@ trackedFiles: pristine_git_object: ebdf57f0b2c769d5e7b2f9fbb5e13edd5d92626e models/components/platformchatcitationsource.go: id: 9df09f76c35c - last_write_checksum: sha1:0bd857055921860f1b65b8de4d878eb6c0d0b15a - pristine_git_object: beea6962ca9bd2e4dbcb234e88f3f9bbb9b5451b + last_write_checksum: sha1:42350377ecfb4dcfae7486728ac56ef9201cf696 + pristine_git_object: e37433a5d48ada45e2803370cced14b649d5ce15 models/components/platformchatcompletedresponse.go: id: 9e69fad32e15 last_write_checksum: sha1:9d13f84a1c1f33bd9a95e3ab7c8bbf3c4d9b21a2 @@ -6149,8 +6149,8 @@ trackedFiles: pristine_git_object: a66d9312cae0041e06fdf3a3b4cdcf17ea945da1 models/components/platformchatdocumentsource.go: id: afb0200c7212 - last_write_checksum: sha1:548ece3a19d70d45c54ddf01c2671034e4536837 - pristine_git_object: f87448db509eab101631589acf5f76a63ccad416 + last_write_checksum: sha1:c420d8d297c675647f3baab52f118115bdb5c002 + pristine_git_object: fed033116a8a35f81b18c8ce7541fff5ca31c040 models/components/platformchatfailedresponse.go: id: a93e2edac6c4 last_write_checksum: sha1:92c16e7664c9e2d05042fc77f0c034f21b9d0d61 @@ -6181,8 +6181,8 @@ trackedFiles: pristine_git_object: e82d3603deaeeb76a9dc88a9ff403ec3997bef4a models/components/platformchatstreameventserversentevent.go: id: 66f47d810172 - last_write_checksum: sha1:2e09d3f2d18f56b0e51863f5e8eea90d740495f6 - pristine_git_object: 3624ec7f823ca2d63f7a14ef2db45d54e137bb6f + last_write_checksum: sha1:b4881f7de07e77b3471368214886e16f09582b7a + pristine_git_object: ddd213939bc7f3fd4444d7d6c1fe39cdaf50865f models/components/platformchatstreamoutputtextdelta.go: id: a860c2e70e73 last_write_checksum: sha1:56b45d12afce5d206e634a14564eb13d45f7a480 @@ -6525,8 +6525,8 @@ trackedFiles: pristine_git_object: e2184a3eba4192a6aa8122141cfe37d3f094df84 models/components/platformtriggerwebhookevent.go: id: 9dd04578bc26 - last_write_checksum: sha1:011d1f066afd0b5bcfd3ce1f7bd4c958b3db31ca - pristine_git_object: 730bcb98d98d6c1e698f4b54bb3d9457f968946e + last_write_checksum: sha1:d89c5dd30baeb8ef1bcaf8c000aa42e289abdcf8 + pristine_git_object: 65c12f1f1b3ded08997ab6edd48ca86847e66d35 models/components/platformtriggerwithsecret.go: id: bd114040076a last_write_checksum: sha1:c3da62b16da860b7cfb14c9ed4154631079ba676 @@ -7133,8 +7133,8 @@ trackedFiles: pristine_git_object: 213572594f350569bec0f25a1ae03537179dfd43 models/operations/createcollection.go: id: 571593131beb - last_write_checksum: sha1:5641fd9279b84cba6a6306b918bf71798eaa3e5b - pristine_git_object: 660ca5412766eaa0f5f68f21e7a70ae878670126 + last_write_checksum: sha1:39424807f030193b5b15c0eeff1eb8ad0848feaa + pristine_git_object: 6fc9f80560e60ef84042ca20c29f475ed1db0ab1 models/operations/createfindingsexport.go: id: afe99924d0f4 last_write_checksum: sha1:3a3cf27df53e71de930e30def00126e1ec298546 @@ -7381,8 +7381,8 @@ trackedFiles: pristine_git_object: da14f80e7fdd1cc8a333bdf62e31dcb1fef18fdb models/operations/options.go: id: d20dd4db9865 - last_write_checksum: sha1:ecb01e17e9eb5eaa09c687e05ecc8b201bbf4a30 - pristine_git_object: 74e60681a9c0a89b0b5d430ff3c56a8c677f6973 + last_write_checksum: sha1:a11e250cdc30f95c4d1fe1496cade2d6d71c5a3f + pristine_git_object: 23d80474ee93f443e3babc7becb3e69b4f35c521 models/operations/people.go: id: 70d3eee1138c last_write_checksum: sha1:b5228ca6d273b0b7303f0f89b043c17d38d0f9ec @@ -7409,12 +7409,12 @@ trackedFiles: pristine_git_object: 1e0880ae25ebe7796f31fa22f3f1af83277e3b8d models/operations/platformchatcreate.go: id: 3dbde8b4a586 - last_write_checksum: sha1:0f4ba0d45b8e1838f56b151e9f694fc0f8a44281 - pristine_git_object: cc50f9a79efd72654d7cc4f69872159b86a347fa + last_write_checksum: sha1:9d990ab0265a9b22a4fd2a165d64c242d3aedb31 + pristine_git_object: 11ab8620b986fc17b691095deca28089f3fae0cf models/operations/platformchatcreatestream.go: id: 5fad7b2f2198 - last_write_checksum: sha1:c353b21552e793c81f4c7647a3fee5a3553e03e3 - pristine_git_object: ea603ab97d8d86ae92663e737da812282ad77f3a + last_write_checksum: sha1:ea2873d2fc60303ec51d2e706d1f7f23100ef5d5 + pristine_git_object: 919107615ce66b094f172814d34984796666913c models/operations/platformsearch.go: id: 875844d95a55 last_write_checksum: sha1:af90d019e81b20bba89e2c676cbd115dbba6fa12 @@ -7777,8 +7777,8 @@ trackedFiles: pristine_git_object: a281aa1c42f70997fe9511ac685477d8b8b7e8d1 skills.go: id: 65ecddcd9ce6 - last_write_checksum: sha1:11f4e0a4477ac9e09a671f0180940b6c5390e5eb - pristine_git_object: 70998eacde146a1b7e6fcd7a3002a30b245237c8 + last_write_checksum: sha1:f3813a84ad043208a4131c82b4de9b179720c53c + pristine_git_object: 9fb40cbb6341513ea1b9044ae2177b68c7b9dc9b tests/activities_test.go: id: 93b3ec0f226c last_write_checksum: sha1:d8e9f9a0d877a8e7d4277c174581d44633e1b8ec @@ -11785,8 +11785,8 @@ trackedFiles: pristine_git_object: 35c439d2661e08fcb6a854096fd7b9a8561b3938 types/stream/stream.go: id: acfb7ceec2c9 - last_write_checksum: sha1:6d127e5cb94378b3e97640d6bbd004522f8a4bb7 - pristine_git_object: f590f26543adbbb82e2fe183b8051b1ff1ab49c6 + last_write_checksum: sha1:0ae543052b937abdda3220639387c8ecd350558a + pristine_git_object: de64dbe7e5f32043b047f05e55a2b88a58014396 verification.go: id: 2f1938c1f645 last_write_checksum: sha1:3ff4798ae7f08da664f422d862382548095fcdda @@ -13372,7 +13372,6 @@ generatedTests: platform-trigger-presets-get: "2026-08-21T02:35:39Z" platform-trigger-presets-input-values-list: "2026-08-21T02:35:39Z" platform-trigger-presets-events-search: "2026-08-21T02:35:39Z" -releaseNotes: "## Go SDK Changes:\n* `Glean.Client.Announcements.Create()`: \n * `request.CreateAnnouncementRequest.Body.StructuredList[].Document.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.Body.StructuredList[].Document.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Announcements.Update()`: \n * `request.UpdateAnnouncementRequest.Body.StructuredList[].Document.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.Body.StructuredList[].Document.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Answers.Create()`: \n * `request.CreateAnswerRequest.Data.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Answers.Update()`: \n * `request.EditAnswerRequest.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Answers.Retrieve()`: `response.AnswerResult.Answer.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Answers.List()`: `response.AnswerResults[].Answer.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Chat.Create()`: \n * `request.ChatRequest.Messages[].Citations[].SourceDocument.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.Messages[].Citations[].SourceDocument.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Chat.Retrieve()`: \n * `response.ChatResult.Chat.CreatedBy.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `error.CreatedBy.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Chat.List()`: `response.ChatResults[].Chat.CreatedBy.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Chat.CreateStream()`: \n * `request.ChatRequest.Messages[].Citations[].SourceDocument.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Agents.Create()`: `response.Workflow.Author.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Agents.Import()`: `response.WorkflowResult.Workflow.Author.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Collections.AddItems()`: `response.Collection.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Collections.Create()`: \n * `request.CreateCollectionRequest.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.union(class (0)).Collection.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Collections.DeleteItem()`: `response.Collection.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Collections.Update()`: \n * `request.EditCollectionRequest.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Collections.UpdateItem()`: `response.Collection.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Collections.Retrieve()`: `response.Collection.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Collections.List()`: `response.Collections[].AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Documents.Retrieve()`: `response.Documents.Map.union(Document).Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Documents.RetrieveByFacets()`: `response.Documents[].Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Insights.Retrieve()`: `response.GleanAssist.ActivityInsights[].User.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Messages.Retrieve()`: `response.SearchResponse.Results[].StructuredResults[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Pins.Update()`: `response.Attribution.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Pins.Retrieve()`: `response.Pin.Attribution.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Pins.List()`: `response.Pins[].Attribution.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Pins.Create()`: `response.Attribution.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Search.QueryAsAdmin()`: \n * `request.SearchRequest.SourceDocument.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.Results[].StructuredResults[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Search.Autocomplete()`: `response.Results[].Document.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Search.RetrieveFeed()`: `response.Results[].PrimaryEntry.CreatedBy.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Search.Recommendations()`: \n * `request.RecommendationsRequest.SourceDocument.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.Results[].StructuredResults[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Search.Query()`: \n * `request.SearchRequest.SourceDocument.Metadata.Author.RelatedDocuments[].Results[].StructuredResults[].Answer.Collections[].Items[].Shortcut.FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.Results[].StructuredResults[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Entities.List()`: `response.Results[].RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Entities.ReadPeople()`: `response.Results[].RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Shortcuts.Create()`: \n * `request.CreateShortcutRequest.Data.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.Shortcut.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Shortcuts.Retrieve()`: `response.Shortcut.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Shortcuts.List()`: `response.Shortcuts[].AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Shortcuts.Update()`: \n * `request.UpdateShortcutRequest.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n * `response.Shortcut.AddedRoles[].Person.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Verification.AddReminder()`: `response.Metadata.LastVerifier.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Verification.List()`: `response.Documents[].Metadata.LastVerifier.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n* `Glean.Client.Verification.Verify()`: `response.Metadata.LastVerifier.RelatedDocuments[].QuerySuggestion.Ranges[].Document.Metadata.Pins[].FavoriteInfo.UgcType.Enum(skillsType)` **Added**\n" generatedFiles: - .devcontainer/README.md - .devcontainer/devcontainer.json diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 60465483..8a087f77 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -32,7 +32,7 @@ generation: generateNewTests: true skipResponseBodyAssertions: true go: - version: 0.15.3 + version: 0.15.4 additionalDependencies: {} allowUnknownFieldsInWeakUnions: false baseErrorName: GleanError diff --git a/.speakeasy/glean-merged-spec.yaml b/.speakeasy/glean-merged-spec.yaml index f4d3d3be..046df9bd 100644 --- a/.speakeasy/glean-merged-spec.yaml +++ b/.speakeasy/glean-merged-spec.yaml @@ -2,8 +2,8 @@ openapi: 3.1.0 info: version: "0.9.0" title: Glean API - x-source-commit-sha: 3e6bf297e8208a1324189f812c53bc04766b0213 - x-open-api-commit-sha: 2419017440d6eea54a5cbdadbf6e265ebc3f3cb5 + x-source-commit-sha: ae68c59fa1e1a61dfd7c494be7d2e118303de0f2 + x-open-api-commit-sha: 26c5b4d7b8bb3519275c7b2353b0d3da933032f7 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. diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index caf801fa..19577a67 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,9 +1,9 @@ -speakeasyVersion: 1.796.3 +speakeasyVersion: 1.796.4 sources: Glean API: sourceNamespace: glean-api-specs - sourceRevisionDigest: sha256:0e14ee68a5a49a4890c842cfcded22f82b40f1afa4ae61f5c5accae7bdb50177 - sourceBlobDigest: sha256:b357f61fbd8cbd644c4e2a50c5a7860c6e80b4bf4fa5d7cd1b4937ad66a4a3d0 + sourceRevisionDigest: sha256:69565c16183739561291ea3ae128815c87b004e0f61e184b099efb1fe245b662 + sourceBlobDigest: sha256:fea7a26be8ee1df4f4df9e877a2173a5f51a4bf90490fb3a9b8b28f4e604dbbb tags: - latest petstore-oas: @@ -17,10 +17,10 @@ targets: glean: source: Glean API sourceNamespace: glean-api-specs - sourceRevisionDigest: sha256:0e14ee68a5a49a4890c842cfcded22f82b40f1afa4ae61f5c5accae7bdb50177 - sourceBlobDigest: sha256:b357f61fbd8cbd644c4e2a50c5a7860c6e80b4bf4fa5d7cd1b4937ad66a4a3d0 + sourceRevisionDigest: sha256:69565c16183739561291ea3ae128815c87b004e0f61e184b099efb1fe245b662 + sourceBlobDigest: sha256:fea7a26be8ee1df4f4df9e877a2173a5f51a4bf90490fb3a9b8b28f4e604dbbb codeSamplesNamespace: glean-api-specs-go-code-samples - codeSamplesRevisionDigest: sha256:56829881ff988b545eb375177e647bf8c766df84a97941ac8bc40dd73a99936e + codeSamplesRevisionDigest: sha256:6d999974f05e36f0ddc2e1963fa70d061b74b714851ccfe30aa3f3727410fde9 petstore: source: petstore-oas sourceNamespace: petstore-oas diff --git a/RELEASES.md b/RELEASES.md index 1c6befac..a09e15d5 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -888,4 +888,14 @@ Based on: ### Generated - [go v0.15.3] . ### Releases -- [Go v0.15.3] https://github.com/gleanwork/api-client-go/releases/tag/v0.15.3 - . \ No newline at end of file +- [Go v0.15.3] https://github.com/gleanwork/api-client-go/releases/tag/v0.15.3 - . + +## 2026-09-04 02:36:16 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.796.4 (2.935.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [go v0.15.4] . +### Releases +- [Go v0.15.4] https://github.com/gleanwork/api-client-go/releases/tag/v0.15.4 - . \ No newline at end of file diff --git a/chat.go b/chat.go index 579be4a4..9e08391f 100644 --- a/chat.go +++ b/chat.go @@ -356,10 +356,17 @@ func (s *Chat) CreateStream(ctx context.Context, request operations.PlatformChat timeout = s.sdkConfiguration.Timeout } + var streamCancel context.CancelFunc + if timeout != nil { var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, *timeout) - defer cancel() + streamCancel = cancel + defer func() { + if streamCancel != nil { + streamCancel() + } + }() } req, err := http.NewRequestWithContext(ctx, "POST", opURL, bodyReader) @@ -488,7 +495,8 @@ func (s *Chat) CreateStream(ctx context.Context, request operations.PlatformChat return components.PlatformChatStreamEventServerSentEvent{}, err } return e, nil - }, "") + }, "", stream.WithCancel[components.PlatformChatStreamEventServerSentEvent](streamCancel)) + streamCancel = nil res.PlatformChatStreamEventServerSentEvent = out default: rawBody, err := utils.ConsumeRawBody(httpRes) diff --git a/clientchat.go b/clientchat.go index c8111a26..54ccfc38 100644 --- a/clientchat.go +++ b/clientchat.go @@ -2102,10 +2102,17 @@ func (s *ClientChat) RetrieveFile(ctx context.Context, fileID string, preview *b timeout = s.sdkConfiguration.Timeout } + var streamCancel context.CancelFunc + if timeout != nil { var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, *timeout) - defer cancel() + streamCancel = cancel + defer func() { + if streamCancel != nil { + streamCancel() + } + }() } req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) @@ -2229,6 +2236,8 @@ func (s *ClientChat) RetrieveFile(ctx context.Context, fileID string, preview *b case httpRes.StatusCode == 200: switch { case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/octet-stream`): + httpRes.Body = utils.BodyWithCancel(httpRes.Body, streamCancel) + streamCancel = nil res.ResponseStream = httpRes.Body return res, nil diff --git a/entities.go b/entities.go index ab90dc76..61e5e089 100644 --- a/entities.go +++ b/entities.go @@ -534,10 +534,17 @@ func (s *Entities) RetrievePersonPhoto(ctx context.Context, personID string, ds timeout = s.sdkConfiguration.Timeout } + var streamCancel context.CancelFunc + if timeout != nil { var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, *timeout) - defer cancel() + streamCancel = cancel + defer func() { + if streamCancel != nil { + streamCancel() + } + }() } req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) @@ -668,10 +675,14 @@ func (s *Entities) RetrievePersonPhoto(ctx context.Context, personID string, ds switch { case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `image/png`): + httpRes.Body = utils.BodyWithCancel(httpRes.Body, streamCancel) + streamCancel = nil res.TwoHundredImagePngResponseStream = httpRes.Body return res, nil case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `image/jpeg`): + httpRes.Body = utils.BodyWithCancel(httpRes.Body, streamCancel) + streamCancel = nil res.TwoHundredImageJpegResponseStream = httpRes.Body return res, nil diff --git a/glean.go b/glean.go index 85aac9fb..1583e353 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.934.1 +// Generated from OpenAPI doc version 0.9.0 and generator version 2.935.1 import ( "context" @@ -161,10 +161,13 @@ 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.15.3", + SDKVersion: "0.15.4", sdkConfiguration: config.SDKConfiguration{ - UserAgent: "speakeasy-sdk/go 0.15.3 2.934.1 0.9.0 github.com/gleanwork/api-client-go", - ServerList: ServerList, + UserAgent: "speakeasy-sdk/go 0.15.4 2.935.1 0.9.0 github.com/gleanwork/api-client-go", + SDKVersion: "0.15.4", + GenVersion: "2.935.1", + OpenAPIDocVersion: "0.9.0", + ServerList: ServerList, ServerVariables: []map[string]string{ { "instance": "instance-name", diff --git a/internal/config/sdkconfiguration.go b/internal/config/sdkconfiguration.go index 8b8818e2..78d829c7 100644 --- a/internal/config/sdkconfiguration.go +++ b/internal/config/sdkconfiguration.go @@ -14,15 +14,18 @@ type HTTPClient interface { } type SDKConfiguration struct { - Client HTTPClient - Security func(context.Context) (interface{}, error) - ServerURL string - ServerIndex int - ServerList []string - ServerVariables []map[string]string - UserAgent string - RetryConfig *retry.Config - Timeout *time.Duration + Client HTTPClient + Security func(context.Context) (interface{}, error) + ServerURL string + ServerIndex int + ServerList []string + ServerVariables []map[string]string + UserAgent string + SDKVersion string + GenVersion string + OpenAPIDocVersion string + RetryConfig *retry.Config + Timeout *time.Duration } func (c *SDKConfiguration) GetServerDetails() (string, map[string]string) { diff --git a/internal/utils/retries.go b/internal/utils/retries.go index 419a5a6b..aedabf6b 100644 --- a/internal/utils/retries.go +++ b/internal/utils/retries.go @@ -54,6 +54,7 @@ func Retry(ctx context.Context, r Retries, operation func() (*http.Response, err err := retryWithBackoff(ctx, r.Config.Backoff, func() error { if resp != nil { resp.Body.Close() + resp = nil } select { @@ -143,21 +144,31 @@ func Retry(ctx context.Context, r Retries, operation func() (*http.Response, err return nil }) - var tempErr *retry.TemporaryError - if err != nil && !errors.As(err, &tempErr) { - return nil, err - } - - return resp, nil + return retryResult(resp, err) default: return operation() } } +func retryResult(resp *http.Response, err error) (*http.Response, error) { + var tempErr *retry.TemporaryError + if err != nil && !errors.As(err, &tempErr) { + if resp != nil { + resp.Body.Close() + } + return nil, err + } + + if resp == nil { + return nil, err + } + + return resp, nil +} + func retryWithBackoff(ctx context.Context, s *retry.BackoffStrategy, operation func() error) error { var ( err error - next time.Duration attempt int start = time.Now() maxElapsedTime = time.Duration(s.MaxElapsedTime) * time.Millisecond @@ -169,6 +180,7 @@ func retryWithBackoff(ctx context.Context, s *retry.BackoffStrategy, operation f }() for { + var next time.Duration err = operation() if err == nil { return nil @@ -179,13 +191,23 @@ func retryWithBackoff(ctx context.Context, s *retry.BackoffStrategy, operation f return permanent.Unwrap() } + if ctxErr := ctx.Err(); ctxErr != nil { + return ctxErr + } + if time.Since(start) >= maxElapsedTime { return err } var temporary *retry.TemporaryError + hasRetryAfter := false if errors.As(err, &temporary) { next = temporary.RetryAfter() + hasRetryAfter = next > 0 + } + + if hasRetryAfter && next > maxElapsedTime-time.Since(start) { + return err } if next <= 0 { diff --git a/internal/utils/utils.go b/internal/utils/utils.go index b32a14db..5518b675 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -14,6 +14,7 @@ import ( "regexp" "strconv" "strings" + "sync" "time" ) @@ -384,3 +385,36 @@ func ConsumeRawBody(res *http.Response) ([]byte, error) { return rawBody, nil } + +type bodyWithCancel struct { + io.ReadCloser + cancel context.CancelFunc + once sync.Once +} + +func (b *bodyWithCancel) Read(p []byte) (int, error) { + n, err := b.ReadCloser.Read(p) + if err != nil { + b.release() + } + return n, err +} + +func (b *bodyWithCancel) Close() error { + err := b.ReadCloser.Close() + b.release() + return err +} + +func (b *bodyWithCancel) release() { + b.once.Do(b.cancel) +} + +// BodyWithCancel returns body wrapped so that cancel runs once reading ends or +// the body is closed. A nil cancel returns body unchanged. +func BodyWithCancel(body io.ReadCloser, cancel context.CancelFunc) io.ReadCloser { + if cancel == nil { + return body + } + return &bodyWithCancel{ReadCloser: body, cancel: cancel} +} diff --git a/models/components/customfieldvalue.go b/models/components/customfieldvalue.go index 62fa7d19..078c1581 100644 --- a/models/components/customfieldvalue.go +++ b/models/components/customfieldvalue.go @@ -51,7 +51,14 @@ func CreateCustomFieldValueCustomFieldValuePerson(customFieldValuePerson CustomF } } -func (u *CustomFieldValue) UnmarshalJSON(data []byte) error { +func (u *CustomFieldValue) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = CustomFieldValue{} + defer func() { + if err != nil { + *u = previous + } + }() var candidates []utils.UnionCandidate diff --git a/models/components/documentorerrorunion.go b/models/components/documentorerrorunion.go index 2ffa87c4..436817a8 100644 --- a/models/components/documentorerrorunion.go +++ b/models/components/documentorerrorunion.go @@ -63,7 +63,14 @@ func CreateDocumentOrErrorUnionDocumentOrError(documentOrError DocumentOrError) } } -func (u *DocumentOrErrorUnion) UnmarshalJSON(data []byte) error { +func (u *DocumentOrErrorUnion) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = DocumentOrErrorUnion{} + defer func() { + if err != nil { + *u = previous + } + }() var candidates []utils.UnionCandidate diff --git a/models/components/documentspecunion.go b/models/components/documentspecunion.go index d9912909..f4773bfd 100644 --- a/models/components/documentspecunion.go +++ b/models/components/documentspecunion.go @@ -255,7 +255,14 @@ func CreateDocumentSpecUnionDocumentSpec4(documentSpec4 DocumentSpec4) DocumentS } } -func (u *DocumentSpecUnion) UnmarshalJSON(data []byte) error { +func (u *DocumentSpecUnion) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = DocumentSpecUnion{} + defer func() { + if err != nil { + *u = previous + } + }() var candidates []utils.UnionCandidate diff --git a/models/components/getshortcutrequestunion.go b/models/components/getshortcutrequestunion.go index aeb47319..6ef56e53 100644 --- a/models/components/getshortcutrequestunion.go +++ b/models/components/getshortcutrequestunion.go @@ -63,7 +63,14 @@ func CreateGetShortcutRequestUnionGetShortcutRequest(getShortcutRequest GetShort } } -func (u *GetShortcutRequestUnion) UnmarshalJSON(data []byte) error { +func (u *GetShortcutRequestUnion) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = GetShortcutRequestUnion{} + defer func() { + if err != nil { + *u = previous + } + }() var candidates []utils.UnionCandidate diff --git a/models/components/platformchatcitationsource.go b/models/components/platformchatcitationsource.go index beea6962..e37433a5 100644 --- a/models/components/platformchatcitationsource.go +++ b/models/components/platformchatcitationsource.go @@ -73,7 +73,14 @@ func CreatePlatformChatCitationSourceCustomEntity(customEntity PlatformChatCusto } } -func (u *PlatformChatCitationSource) UnmarshalJSON(data []byte) error { +func (u *PlatformChatCitationSource) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = PlatformChatCitationSource{} + defer func() { + if err != nil { + *u = previous + } + }() type discriminator struct { Type string `json:"type"` diff --git a/models/components/platformchatdocumentsource.go b/models/components/platformchatdocumentsource.go index f87448db..fed03311 100644 --- a/models/components/platformchatdocumentsource.go +++ b/models/components/platformchatdocumentsource.go @@ -201,7 +201,14 @@ func CreatePlatformChatDocumentSourcePlatformChatDocumentSourceDocument2(platfor } } -func (u *PlatformChatDocumentSource) UnmarshalJSON(data []byte) error { +func (u *PlatformChatDocumentSource) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = PlatformChatDocumentSource{} + defer func() { + if err != nil { + *u = previous + } + }() var candidates []utils.UnionCandidate diff --git a/models/components/platformchatstreameventserversentevent.go b/models/components/platformchatstreameventserversentevent.go index 3624ec7f..ddd21393 100644 --- a/models/components/platformchatstreameventserversentevent.go +++ b/models/components/platformchatstreameventserversentevent.go @@ -86,7 +86,14 @@ func CreatePlatformChatStreamEventServerSentEventResponseFailed(responseFailed P } } -func (u *PlatformChatStreamEventServerSentEvent) UnmarshalJSON(data []byte) error { +func (u *PlatformChatStreamEventServerSentEvent) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = PlatformChatStreamEventServerSentEvent{} + defer func() { + if err != nil { + *u = previous + } + }() type discriminator struct { Event string `json:"event"` diff --git a/models/components/platformtriggerwebhookevent.go b/models/components/platformtriggerwebhookevent.go index 730bcb98..65c12f1f 100644 --- a/models/components/platformtriggerwebhookevent.go +++ b/models/components/platformtriggerwebhookevent.go @@ -48,7 +48,14 @@ func CreatePlatformTriggerWebhookEventContentSchedule(contentSchedule PlatformCo } } -func (u *PlatformTriggerWebhookEvent) UnmarshalJSON(data []byte) error { +func (u *PlatformTriggerWebhookEvent) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = PlatformTriggerWebhookEvent{} + defer func() { + if err != nil { + *u = previous + } + }() type discriminator struct { EventType string `json:"event_type"` diff --git a/models/operations/createcollection.go b/models/operations/createcollection.go index 660ca541..6fc9f805 100644 --- a/models/operations/createcollection.go +++ b/models/operations/createcollection.go @@ -129,7 +129,14 @@ func CreateCreatecollectionResponseBodyResponseBody2(responseBody2 ResponseBody2 } } -func (u *CreatecollectionResponseBody) UnmarshalJSON(data []byte) error { +func (u *CreatecollectionResponseBody) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = CreatecollectionResponseBody{} + defer func() { + if err != nil { + *u = previous + } + }() var candidates []utils.UnionCandidate diff --git a/models/operations/options.go b/models/operations/options.go index 74e60681..23d80474 100644 --- a/models/operations/options.go +++ b/models/operations/options.go @@ -82,7 +82,7 @@ func WithRetries(config retry.Config) Option { // WithOperationTimeout allows setting the request timeout applied for an operation. func WithOperationTimeout(timeout time.Duration) Option { return func(opts *Options, supportedOptions ...string) error { - if !utils.Contains(supportedOptions, SupportedOptionRetries) { + if !utils.Contains(supportedOptions, SupportedOptionTimeout) { return ErrUnsupportedOption } diff --git a/models/operations/platformchatcreate.go b/models/operations/platformchatcreate.go index cc50f9a7..11ab8620 100644 --- a/models/operations/platformchatcreate.go +++ b/models/operations/platformchatcreate.go @@ -43,7 +43,14 @@ func CreatePlatformChatCreateInputArrayOfPlatformChatInputMessage(arrayOfPlatfor } } -func (u *PlatformChatCreateInput) UnmarshalJSON(data []byte) error { +func (u *PlatformChatCreateInput) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = PlatformChatCreateInput{} + defer func() { + if err != nil { + *u = previous + } + }() var candidates []utils.UnionCandidate diff --git a/models/operations/platformchatcreatestream.go b/models/operations/platformchatcreatestream.go index ea603ab9..91910761 100644 --- a/models/operations/platformchatcreatestream.go +++ b/models/operations/platformchatcreatestream.go @@ -44,7 +44,14 @@ func CreatePlatformChatCreateStreamInputArrayOfPlatformChatInputMessage(arrayOfP } } -func (u *PlatformChatCreateStreamInput) UnmarshalJSON(data []byte) error { +func (u *PlatformChatCreateStreamInput) UnmarshalJSON(data []byte) (err error) { + previous := *u + *u = PlatformChatCreateStreamInput{} + defer func() { + if err != nil { + *u = previous + } + }() var candidates []utils.UnionCandidate diff --git a/skills.go b/skills.go index 70998eac..9fb40cbb 100644 --- a/skills.go +++ b/skills.go @@ -2282,10 +2282,17 @@ func (s *Skills) RetrieveContent(ctx context.Context, skillID string, opts ...op timeout = s.sdkConfiguration.Timeout } + var streamCancel context.CancelFunc + if timeout != nil { var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, *timeout) - defer cancel() + streamCancel = cancel + defer func() { + if streamCancel != nil { + streamCancel() + } + }() } req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) @@ -2407,6 +2414,8 @@ func (s *Skills) RetrieveContent(ctx context.Context, skillID string, opts ...op switch { case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/octet-stream`): + httpRes.Body = utils.BodyWithCancel(httpRes.Body, streamCancel) + streamCancel = nil res.ResponseStream = httpRes.Body return res, nil @@ -3660,10 +3669,17 @@ func (s *Skills) RetrieveVersionContent(ctx context.Context, skillID string, ver timeout = s.sdkConfiguration.Timeout } + var streamCancel context.CancelFunc + if timeout != nil { var cancel context.CancelFunc ctx, cancel = context.WithTimeout(ctx, *timeout) - defer cancel() + streamCancel = cancel + defer func() { + if streamCancel != nil { + streamCancel() + } + }() } req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) @@ -3785,6 +3801,8 @@ func (s *Skills) RetrieveVersionContent(ctx context.Context, skillID string, ver switch { case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/octet-stream`): + httpRes.Body = utils.BodyWithCancel(httpRes.Body, streamCancel) + streamCancel = nil res.ResponseStream = httpRes.Body return res, nil diff --git a/types/stream/stream.go b/types/stream/stream.go index f590f265..de64dbe7 100644 --- a/types/stream/stream.go +++ b/types/stream/stream.go @@ -11,6 +11,8 @@ import ( "regexp" "strconv" "strings" + "sync" + "sync/atomic" ) type ServerEvent struct { @@ -73,9 +75,11 @@ type EventStream[T any] struct { unmarshaller func(se []byte) (T, error) sentinel string ctx context.Context + cancel context.CancelFunc + releaseOnce sync.Once dataRequired bool - finished bool + finished atomic.Bool first bool err error val *T @@ -125,30 +129,52 @@ func WithDataRequired[T any](dataRequired bool) func(*EventStream[T]) { } } +// WithCancel hands ownership of a context cancel function (typically the +// request timeout's) to the stream. The deadline keeps bounding the whole +// stream; the stream releases the context when it ends or is closed instead +// of the caller cancelling it before iteration. A nil cancel is ignored. +func WithCancel[T any](cancel context.CancelFunc) func(*EventStream[T]) { + return func(es *EventStream[T]) { + if cancel != nil { + es.cancel = cancel + } + } +} + +// release cancels the owned context, once. +func (es *EventStream[T]) release() { + es.releaseOnce.Do(func() { + if es.cancel != nil { + es.cancel() + } + }) +} + // Next waits for the next event from a stream which will be available // through the Value() method. It returns false when the stream is done or // an error occurred. After this method returns false, the Err method is used // to check for any errors that occurred while parsing the stream. func (es *EventStream[T]) Next() bool { - if es.err != nil || es.finished { - return false - } - - // Check if context is canceled - select { - case <-es.ctx.Done(): - es.err = es.ctx.Err() + if es.err != nil || es.finished.Load() { return false - default: } for { - if !es.scanner.Scan() { + // Re-checked every iteration: comment-only and data-less keepalive + // frames loop here without publishing, and the retained operation + // timeout must still be able to stop the stream. + select { + case <-es.ctx.Done(): + es.err = es.ctx.Err() + es.release() return false + default: } - es.err = es.scanner.Err() - if es.err != nil { + if !es.scanner.Scan() { + es.err = es.scanner.Err() + es.finished.Store(true) + es.release() return false } @@ -217,7 +243,8 @@ func (es *EventStream[T]) Next() bool { event.ID = es.eventID if es.sentinel != "" && data == es.sentinel+"\n" { - es.finished = true + es.finished.Store(true) + es.release() return false } @@ -256,6 +283,7 @@ func (es *EventStream[T]) Next() bool { jsonData, err := json.Marshal(data) if err != nil { es.err = err + es.release() return false } event.Data = jsonData @@ -266,12 +294,14 @@ func (es *EventStream[T]) Next() bool { e, err := json.Marshal(event) if err != nil { es.err = err + es.release() return false } parsedEvent, err := es.unmarshaller(e) if err != nil { es.err = err + es.release() return false } @@ -294,6 +324,8 @@ func (es *EventStream[T]) Err() error { // Close will release underlying resources held by an event stream. It must // always be called. func (es *EventStream[T]) Close() error { - es.finished = true - return es.r.Close() + es.finished.Store(true) + err := es.r.Close() + es.release() + return err } From 89797547742a849d7d9d0f817c03f232c3566e23 Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 02:46:43 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow