diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 6b356aa72..1b9b82a94 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,19 +1,19 @@ lockVersion: "" id: "" management: - docChecksum: 81041579fb8e0edc84dd570f5254e76e + docChecksum: 1aa23294ec5a9fae95dbce6ba46295d5 docVersion: 1.0.0 speakeasyVersion: 1.802.0 generationVersion: 2.948.4 - releaseVersion: 1.5.16 - configChecksum: d5da0d905a24adcd6155ae5168895784 + releaseVersion: 1.5.17 + configChecksum: f6eca1df82ae1871514035d9419668cd repoURL: https://github.com/OpenRouterTeam/typescript-sdk.git installationURL: https://github.com/OpenRouterTeam/typescript-sdk published: true persistentEdits: - generation_id: 2c98cf15-5136-4704-a958-ffda712a8801 - pristine_commit_hash: 87fddd9da5da1a070770cb457506b162b96997e4 - pristine_tree_hash: 9d5e25c57f7eddb28f0870d14892d5f7a3fbc03d + generation_id: 6dbc5296-2234-4b4e-a9f0-feb796349670 + pristine_commit_hash: c5c9ce33f9a400487b7a5919fbb42425595c5e81 + pristine_tree_hash: c6b236461efd20f1974107464b3d345ad3cec818 features: typescript: acceptHeaders: 2.81.2 @@ -93,6 +93,18 @@ trackedFiles: id: a1d342490679 last_write_checksum: sha1:4731d076694e6bacdfb7106f5fc5b7b9ba4ad63e pristine_git_object: 1e8cf49799702d9057078bb8cbb7956c159b1f3e + docs/models/account.mdx: + id: daf7abc046a5 + last_write_checksum: sha1:61e546c16144d07a13f81c603df283cf17b6844d + pristine_git_object: 77693d9136501ee4c190deb5ee807bdf84b24edf + docs/models/accountscope.mdx: + id: dafc7b2aa935 + last_write_checksum: sha1:8e0221478b5a9842faebad7f328ef4751fb6363e + pristine_git_object: ed168b8d1f6cbbdbfb4b039eaf7912f47241c981 + docs/models/accounttype.mdx: + id: d2803e375f66 + last_write_checksum: sha1:6d5322f8e516b827044732ff50f4b4e42ed04c6c + pristine_git_object: bd556fdf4240b169e65ebb9c7542657db77ab89c docs/models/action.md: id: 3b583d6a609e last_write_checksum: sha1:8dc36489801452f14ed738798e511ba6be809f52 @@ -1309,6 +1321,10 @@ trackedFiles: id: b92138197dbc last_write_checksum: sha1:13effa149c014938b760375b111c9b1e7a394eb5 pristine_git_object: eee0d60927584d1ff4d8e8143445fdd062b3cecc + docs/models/app.mdx: + id: a6f931f688d3 + last_write_checksum: sha1:4f2049a749bb91fcaf4e07fb5e04d321f251d5a2 + pristine_git_object: a26eb5f93532c4fdb17748e4eefde4d978a4e819 docs/models/applypatchcallitem.md: id: 2a6981624708 last_write_checksum: sha1:6bc50333036438f2aa9d413cb012648d85b5e5a1 @@ -1501,6 +1517,10 @@ trackedFiles: id: 7412b1bc5a4c last_write_checksum: sha1:a2b020e9df68f2dcf20e515c67eea98050d8b479 pristine_git_object: a25383b4ca26e2c20e9af062d24400d4f10a5103 + docs/models/appmemberlink.mdx: + id: 6ff748533e70 + last_write_checksum: sha1:adf04e4610d4b80a42dfd4f79c24c94c9d6a94dc + pristine_git_object: 4bb032e3bca79d48c780340c816cf9f0117d7a16 docs/models/apprankingsitem.md: id: c21c50e8192d last_write_checksum: sha1:fc6bb5d74fb413cc1c0b6497dd016fab9c26a13c @@ -1519,6 +1539,10 @@ trackedFiles: id: 2f24a473e4d4 last_write_checksum: sha1:439b888c46706b3e78ccfef5cdc4dcccb7b9b3f7 pristine_git_object: 40e98111912c9c038211a34ebecad9d5ba608d9f + docs/models/appscope.mdx: + id: 997e943aaaca + last_write_checksum: sha1:45d438e190c08df4211bd90d4e0f26645664705e + pristine_git_object: 85893493206d02bf115955e6a81b07d933fb7802 docs/models/architecture.mdx: id: 99023125c487 last_write_checksum: sha1:1de924f0e84b63ea3da5559ba7553ee3f088655b @@ -3948,6 +3972,10 @@ trackedFiles: id: 98114795418d last_write_checksum: sha1:af35fad12303fc9d151e481bb47176875f96b8de pristine_git_object: 3d38484b49df02430305d3a8402faed5f5f0834f + docs/models/coverage.mdx: + id: f7240535492a + last_write_checksum: sha1:8760fb3dbaf9741900a351ce0ff5a457ca64c7a7 + pristine_git_object: f7231088d95122f0661b071eaedcfeceed1b4d3c docs/models/createbyokkeyrequest.md: id: 8c9d2e34f7fb last_write_checksum: sha1:094bf0a4ff52bedc265feb9ebbbfbe98f5a30eb3 @@ -4094,6 +4122,18 @@ trackedFiles: id: 986d055095a3 last_write_checksum: sha1:2e9e67cabdb3ce7e540af0a1efce4234d46d98e5 pristine_git_object: c834de66d721c6e2a7a08f17b07a447e3f9acc4d + docs/models/customorigin.mdx: + id: c04ee48ce028 + last_write_checksum: sha1:cad0dccf7fb7064371b954ece9bfb2b4de066ba4 + pristine_git_object: 85278a87de8efe9d772b98ff00b6cb76c9c36ecb + docs/models/customoriginstate.mdx: + id: fddc1ac67dec + last_write_checksum: sha1:42775eb2bca006f9f60a5720f8662c3c2707b8c7 + pristine_git_object: feefd0ed59cd9037365c3a8a9e976d6e71d635a4 + docs/models/customoriginstatus.mdx: + id: fe3c288917bc + last_write_checksum: sha1:db8b931b51db3c38f026b4d9b72eda9dabfbfa48 + pristine_git_object: 980f1ae97aeb47e84617496a18210239e88cf659 docs/models/customtool.md: id: f64ed08d154e last_write_checksum: sha1:c104cbb8ef454a854cbaa7c9c226e474f9db72c1 @@ -5499,10 +5539,18 @@ trackedFiles: id: 298890b56865 last_write_checksum: sha1:fa06c9534d305d377d3d88bec5798008bfcb25e3 pristine_git_object: 5769b5b2cd0d9920937492b3d8bd616edf072f7e + docs/models/github.mdx: + id: bfa19aae6d11 + last_write_checksum: sha1:a1c1afa20bde9e36479e71e712da4b2cf240fa46 + pristine_git_object: 407287e951863d7cd82fd4dde7710aac2b95b865 docs/models/goneresponseerrordata.mdx: id: 97a33bbc437d last_write_checksum: sha1:40b2ddbf172186d5bad3bda13a3f78dfb2b3c5d9 pristine_git_object: b4cb8d2bfb1234354954538c334caabcb1ee613f + docs/models/google.mdx: + id: ac111b08970a + last_write_checksum: sha1:92bd46a1dd1e4aeb38331f821ccd57447e08d65c + pristine_git_object: 0007f8b5db99d2819df2de5659a3919cad794a86 docs/models/granttype.mdx: id: 7e7883d50a4c last_write_checksum: sha1:75bb39e588cfc555ea54d4250a095d8b223ee326 @@ -5538,6 +5586,10 @@ trackedFiles: id: 8ccb472d90cc last_write_checksum: sha1:65ef17d629df564683c331a7b529f8543320e535 pristine_git_object: e43447fd6accb6567a0a4410560704e9bbb80dc6 + docs/models/hostrule.mdx: + id: 49b4f6a3ea88 + last_write_checksum: sha1:6be0f798a675d21802661173e4f09c2d8c61028a + pristine_git_object: 897429329166b542a9a656ef14ff4ad450af9682 docs/models/ignore.md: id: d1a0635b9cf0 last_write_checksum: sha1:7a8cc427b44e4a856a9bbcc9792c143602b7d975 @@ -6373,6 +6425,10 @@ trackedFiles: id: 7954cf795d0a last_write_checksum: sha1:e0ec0716055b8229da9b775370c50b8451d092ed pristine_git_object: ac5b9694428d71c209a11698619b87bfd37ddcc1 + docs/models/installation.mdx: + id: a9083e4a971d + last_write_checksum: sha1:32998004e47e4be9521a44bca2907eeb558e2f02 + pristine_git_object: 6be9996406229d0c645881db839a51eeac913ead docs/models/instructtype.mdx: id: ec19fa5cbdd6 last_write_checksum: sha1:fbeb8cf798673d1eeccd8cdff4b594807e78ed19 @@ -6806,6 +6862,18 @@ trackedFiles: id: d8fb630f1021 last_write_checksum: sha1:a78127e898587b41f1ae36e0828c216d8874abf9 pristine_git_object: 7dfd5729b1e507ada5fc1eb84ba3e5640851a10a + docs/models/mcporigin.mdx: + id: 63ba83f255c6 + last_write_checksum: sha1:5e71d4f13b78828512c82dd895073e12b86bf9b5 + pristine_git_object: 30719f1136c5d61fae8127f2c7a6795b0b4b162d + docs/models/mcporiginstate.mdx: + id: 168f8b76590b + last_write_checksum: sha1:5b683fba086d81a6c16b10cff471b2d2c0e92cc1 + pristine_git_object: 8c1eabf756ca7db4e71df84a79d7bb24729dbf59 + docs/models/mcporiginstatus.mdx: + id: b3b4b61198a1 + last_write_checksum: sha1:19798e800f6f727c70b2f109e932d6600a587147 + pristine_git_object: df385fe430c0504a849954e2f8a456685860f049 docs/models/mcpprotocolerror.mdx: id: 19e1fdd907ae last_write_checksum: sha1:d8bcbefe498096910f4022c924fd7c9247f753a9 @@ -9883,8 +9951,8 @@ trackedFiles: pristine_git_object: 5e67d7cd21f64f2a603d4328cb2f9cd03849dd4d docs/models/operations/listinternconnectionsresponse.mdx: id: cd949cfcc50e - last_write_checksum: sha1:53fe31cb429e99495d139c5b21467315cee42173 - pristine_git_object: 07604d525ebfca2b89b9220fca724f4b792b0325 + last_write_checksum: sha1:4bc892438926a653a64bc4a50d6b570a61720dc2 + pristine_git_object: 9c3305d48cf9b6eeab8b39b1c19d60f02147b15f docs/models/operations/listinterneffectivevaultsecretsglobals.mdx: id: 755d10265dbb last_write_checksum: sha1:9fb7d4333f8553f39b40d9e032b3c481231bb782 @@ -12949,6 +13017,10 @@ trackedFiles: id: 57a1e1258c52 last_write_checksum: sha1:e450a6b8ed4f97c659c067cee5720881936399a2 pristine_git_object: 12eae3b1d19e55f45f8d8215e7d7a599be78316a + docs/models/route.mdx: + id: 805008f47450 + last_write_checksum: sha1:54fb03e9fe0da1f71b5aed5b7dc1122ace5b2f5f + pristine_git_object: 37b35483c9dfd58d3dfec5c1c85e01b33f37c0c2 docs/models/routedservicetier.mdx: id: fd7b0f1d910c last_write_checksum: sha1:eae44306b9b42175b7c85680003ca29fbbb59428 @@ -13048,10 +13120,22 @@ trackedFiles: id: 1cbad24379ec last_write_checksum: sha1:12f5d0dfb93bfec6208395d74083d8a6342648f8 pristine_git_object: 40ce500cd0d6c0e7cba566059dc76f94075f2785 + docs/models/secret.mdx: + id: 48308adb325e + last_write_checksum: sha1:dee2b4af77528ba080f2e9523551ca7f7cda5563 + pristine_git_object: 5d6d0492a584427d6f7be19ca1a36f3fc3160ebe + docs/models/secretscope.mdx: + id: 82fcffcfd7e7 + last_write_checksum: sha1:76c47056b43f81971e7d33eaf2edbc9c2dbde419 + pristine_git_object: 84d58938e8c9f23cc873eed3d582fb141910b6e4 docs/models/security.mdx: id: f9005cfa3971 last_write_checksum: sha1:0865a677ca0e9cf42146365d35ff84d6a62f7428 pristine_git_object: 181327323a2486bd04abcde32abd26c4cfc34d81 + docs/models/selection.mdx: + id: ac69a88c9ddc + last_write_checksum: sha1:a08ad1a8a27c0c4252881dff6a6a677ffaf09a25 + pristine_git_object: f0aee746cbb9d21e987b97ecf2c32804e3077f2f docs/models/servertool.mdx: id: c995f518eea9 last_write_checksum: sha1:391bac2fd09ffa4a4c1eabcac3c9619ce57633db @@ -13150,6 +13234,10 @@ trackedFiles: id: f5f5ba2df21a last_write_checksum: sha1:8e6a42a6c4f48cee14afa1dc85409aea10c3fcf5 pristine_git_object: cdea38dcb8c7560a540bc8b929362b0d5c8bd8bf + docs/models/shadowedby.mdx: + id: c45218bca65d + last_write_checksum: sha1:ceeb20a4a5f46d7cfbc5a66bdfa9ccb5f75fc9bb + pristine_git_object: e247a0b8da54b8ea25ac4aaadf41ed4fd9a6a524 docs/models/shellcallitem.md: id: c1e5babd4a6a last_write_checksum: sha1:767d0b10500ad8c0b4cc9ae967652ae3b9007996 @@ -13289,6 +13377,14 @@ trackedFiles: last_write_checksum: sha1:18590e6cfd13d671a075480e68beecab874b614c pristine_git_object: b226d39ff9119db35c815d05c34b41923d840954 deleted: true + docs/models/slack.mdx: + id: f83496d0a736 + last_write_checksum: sha1:c5e4472f2c158dbb0331c4c2930e212da09120b5 + pristine_git_object: 9627b974083d66bc96657bff4fb7f01568b1d687 + docs/models/slackmemberlink.mdx: + id: a12a6d94cf67 + last_write_checksum: sha1:6facd8eabcc56cec2d016bc03cdaa2af12757ca1 + pristine_git_object: f69cf154b0fbfedb1861a39cc1f7abd3a7580869 docs/models/softdeny.mdx: id: 698b91fab0e2 last_write_checksum: sha1:425cf57215b16c09d0f2a2e7742997e2f8c53e2e @@ -13939,6 +14035,10 @@ trackedFiles: last_write_checksum: sha1:43ecebedd106bbffffaaa1d7d7656a4ec6a58b95 pristine_git_object: 6787bd7ce86211ce0c89055de47421d9c949e2bd deleted: true + docs/models/token.mdx: + id: 4ba211a5ee2b + last_write_checksum: sha1:1b5d73c9f905a04e2032cbc10551323469cdc4c1 + pristine_git_object: 06946f6e1a5779412447cd1518007a132aadcba1 docs/models/tokenexchangerequest.mdx: id: 20223978500d last_write_checksum: sha1:3487af89fb2cc63f855f6294656b807865e56c29 @@ -13951,6 +14051,10 @@ trackedFiles: id: 29ffda782ee3 last_write_checksum: sha1:b8bf458bbba7d18d7b29b1b2eab1ed9014d22845 pristine_git_object: fb3f080b142027a625a85c1b369b97321927b5e6 + docs/models/tokenscope.mdx: + id: 85101a1d6d9a + last_write_checksum: sha1:4ce24af594bb70c36292d731524d15098f94c71d + pristine_git_object: d2380df2e2accc30f36c51a95c0dc9fbe1e3df1a docs/models/tokentype.mdx: id: 06d719cd4d1b last_write_checksum: sha1:6c43074383208b36598467a1ebaa8a53c0e49745 @@ -14739,6 +14843,10 @@ trackedFiles: id: 4244d990fa78 last_write_checksum: sha1:6f66ece5b96de2aae764cf286932b4b528cd5578 pristine_git_object: 257dd2675b039455e90334f3122ee0c46e1aa276 + docs/models/vaultroutingtable.mdx: + id: fb5ac54fe928 + last_write_checksum: sha1:0b640be3566665143eaf813226e42e212dceca93 + pristine_git_object: 5ebd6b19fe580b1898d133150c68c6b1d9ac6e59 docs/models/vaultsecret.mdx: id: 2043e343062a last_write_checksum: sha1:9ed0c6be489206be7acfe67953e59fee0e01418b @@ -14777,6 +14885,10 @@ trackedFiles: last_write_checksum: sha1:e7dda7d532e1dc2c78f769eff4f3e94a032eb2ea pristine_git_object: f672aeb0888873958197cccd3b5fd053191a83a5 deleted: true + docs/models/via.mdx: + id: 307515b4d49d + last_write_checksum: sha1:3f3acc8cf27b35ceb1b3abe4d7c8c03d393985cc + pristine_git_object: 654e547046980436ac3c61864d930329b9ec98bf docs/models/videogeneration.mdx: id: a3692b353557 last_write_checksum: sha1:a90ddfb52c5ecc75141dea6fa34c570a44c47a34 @@ -15377,8 +15489,8 @@ trackedFiles: pristine_git_object: 2dc4aa74467696e14e56c685e6ce32a3ef0a259f docs/sdks/vault/README.mdx: id: 3738c6722acd - last_write_checksum: sha1:98b9f783a5f965d337ebbf5bb8de6c3e389afafa - pristine_git_object: 79cfc07564ad9e28528339ccbfc546bfb66c18aa + last_write_checksum: sha1:aa06b5891f0a196045fa236871cb57f80dce2622 + pristine_git_object: 9c02946deaef6e99009a17868977cee7a3f687eb docs/sdks/videogeneration/README.md: id: b6dbf7b0729c last_write_checksum: sha1:71205a37afffed445af770082c3f50f6bcbfadfa @@ -15423,12 +15535,12 @@ trackedFiles: pristine_git_object: 410efafd6a7f50d91ccb87131fedbe0c3d47e15a jsr.json: id: 7f6ab7767282 - last_write_checksum: sha1:27fb368602a130b1d86f590fde8aae0a22efc24f - pristine_git_object: 8198ec16b63fc988e195d383429c148074250932 + last_write_checksum: sha1:01091245b37c8c3138ae02c3d5c199d393a8b489 + pristine_git_object: 9c37f4fa93277c70f67500bc220d4cc40d3a12a5 package.json: id: 7030d0b2f71b - last_write_checksum: sha1:e48d7554fd356e445cfeaad1059980fb51a8c939 - pristine_git_object: 1a0f46edc4a08d5a3ee129f864e650e0835241df + last_write_checksum: sha1:23b2cf391c91ea6c7847161c8c142b7af71ea633 + pristine_git_object: 5a3240bb6aba7fb57157a66983964d17750fde52 src/core.ts: id: f431fdbcd144 last_write_checksum: sha1:5aa66b0b6a5964f3eea7f3098c2eb3c0ee9c0131 @@ -15903,8 +16015,8 @@ trackedFiles: pristine_git_object: 7bac4e166cd2d66cb8dc89bd7c4eed604a6bb595 src/funcs/vaultListInternConnections.ts: id: f53ef5db4004 - last_write_checksum: sha1:ae472d3f131651ae9b99ea4829d1919e96944a9c - pristine_git_object: 27c0a87291bc07c8f2c09e4e86bb879a7db76601 + last_write_checksum: sha1:d7286f667b01a4cc2d1884e9f7424b121ccbdf30 + pristine_git_object: 09feb427e5a6830424c589667312e28a46937c49 src/funcs/vaultListInternEffectiveVaultSecrets.ts: id: f8d9b6f715e3 last_write_checksum: sha1:0cb71702dae5dcb48db8a5f53e368c09306f5814 @@ -16011,8 +16123,8 @@ trackedFiles: pristine_git_object: a187e58707bdb726ca2aff74941efe7493422d4e src/lib/config.ts: id: 320761608fb3 - last_write_checksum: sha1:1dd663ebd1f1fd3b2faaf9744210c722ca7a433d - pristine_git_object: 639c23e511edc82d2bb54591dd2d43c0d9b0ad46 + last_write_checksum: sha1:c6fc5013f56ae92aa8dd786a98fed1a4360f44fb + pristine_git_object: 4986f0128ceef46df83260ab3b9c3617402ee0ac src/lib/dlv.ts: id: b1988214835a last_write_checksum: sha1:eaac763b22717206a6199104e0403ed17a4e2711 @@ -17841,8 +17953,8 @@ trackedFiles: pristine_git_object: 7abdfe096d3adff317db6837dc689c69db92e127 src/models/index.ts: id: f93644b0f37e - last_write_checksum: sha1:2a323486af134917ee7fefa02482ab534945eab3 - pristine_git_object: 9797e3ad80a57061e0bb10ba7e69aade1a0687a8 + last_write_checksum: sha1:ea91a8044230e0fa3556e4e5074e1da1c114eef1 + pristine_git_object: a3410ecc0e96eabbb8d7d78ef7f3a0fd0509400e src/models/inputaudio.ts: id: 9bdc14c7565f last_write_checksum: sha1:cc3b750b39a3c3563b76930fd2989f9bfdb24c1f @@ -18721,8 +18833,8 @@ trackedFiles: pristine_git_object: 53af57ce4fbd45ca669919b1e55d41052b43bb74 src/models/operations/listinternconnections.ts: id: b86a8732f4cd - last_write_checksum: sha1:cc8f4a57bddb7b12e14923fc08649eb133d96667 - pristine_git_object: 9682b96d725f6a980d1b51518e1e4f76b1710674 + last_write_checksum: sha1:6bb019ffffde247b02a71fbf673c768b767b4ae0 + pristine_git_object: 027e9d17602bb4fef4bca092b5cfe4eef9a34019 src/models/operations/listinterneffectivevaultsecrets.ts: id: 8162d29b4032 last_write_checksum: sha1:9ee1bc688169aa52e40fac2cb5049318d5dc49b3 @@ -19943,6 +20055,10 @@ trackedFiles: id: 053f6551d3f4 last_write_checksum: sha1:7bce76517f06d1568b577c88e138521430a6395d pristine_git_object: bbd427e458ce5311b003816cf31d232815040e4a + src/models/vaultroutingtable.ts: + id: 920bcc895e92 + last_write_checksum: sha1:d6ea9394d07a3c47707e60d5b1dac3b0a26919d2 + pristine_git_object: a0304c840732207c38a43b1285c3c76c2b8779e4 src/models/vaultsecret.ts: id: daa0ae6ffc96 last_write_checksum: sha1:2ef7624a977d16ce5546dba23aed15dbba49eb1c @@ -20241,8 +20357,8 @@ trackedFiles: pristine_git_object: 4d885b023e6aac47f225d63bfe3161b919681f88 src/sdk/vault.ts: id: adbb922fff4a - last_write_checksum: sha1:63c34d8a911f93c677a7cef349a46395554bdf04 - pristine_git_object: 4dd82a5e5085cdd7546cca924af8cea7095a5d30 + last_write_checksum: sha1:1dfebb7d180f20b41c64e78f81bdf57f3607461f + pristine_git_object: 26f0095a9ba2134cf605b63d0c960abeee62292d src/sdk/videogeneration.ts: id: db34eab5bd5b last_write_checksum: sha1:0e8a13f8ca379037c57417f0ebe9a9fe35dc3bea @@ -24466,7 +24582,7 @@ examples: internId: "7c9e6679-7425-40de-944b-e07fc1f90ae7" responses: "200": - application/json: {"data": [{"key": ""}]} + application/json: {"data": [{"key": ""}], "routing": {"agent_id": "", "custom_origins": [{"host": "burly-majority.org", "path_prefix": "", "status": {"failure": "", "state": "usable"}}], "github": {"apps": [], "tokens": [{"holds_token": true, "login": "Reba35", "owner": "", "repository_count": 264665, "scope": "intern"}]}, "google": {"accounts": []}, "host_rules": [], "mcp_origins": [{"account_key": "", "host": "fluffy-swanling.net", "is_personal": true, "routes": [{"host": "flowery-singing.com", "path_prefix": ""}], "status": {"failure": "", "state": "usable"}}], "read_at": "2025-10-15T11:13:06.781Z", "secrets": [], "slack": {"member_links": []}}, "routing_text": ""} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "401": @@ -24713,4 +24829,6 @@ examples: "502": application/json: {"error": {"code": 502, "message": "Provider returned error"}} examplesVersion: 1.0.2 -releaseNotes: "## Typescript SDK Changes:\n* `openrouter.batch.createBatches()`: `response.results[].response.body.union(OpenResponsesResult).error.metadata.alignment.rejected.union(Array)[].union(web_search_call).status.enum(incomplete)` **Added**\n* `openrouter.batch.getBatches()`: `response.results[].response.body.union(OpenResponsesResult).error.metadata.alignment.rejected.union(Array)[].union(web_search_call).status.enum(incomplete)` **Added**\n* `openrouter.presets.createPresetsResponses()`: \n * `request.responsesRequest.input.union(Array<>)[].union(OutputWebSearchCallItem).status.enum(incomplete)` **Added**\n" +releaseNotes: | + ## Typescript SDK Changes: + * `openrouter.vault.listInternConnections()`: `response` **Changed** diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index cad3f9781..91006b53d 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -37,7 +37,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true typescript: - version: 1.5.16 + version: 1.5.17 acceptHeaderEnum: false additionalDependencies: dependencies: diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 6392825bb..16dd2bec2 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -32777,6 +32777,365 @@ components: - 'data' - 'has_more' type: 'object' + VaultRoutingTable: + description: 'The intern''s routing table, for the intern''s own key only; null for any other caller or when the vault could not build it in time. The keys still list.' + properties: + agent_id: + type: 'string' + custom_origins: + items: + properties: + host: + type: 'string' + path_prefix: + type: + - 'string' + - 'null' + status: + description: 'The vault injection decision for this destination, at `read_at`.' + properties: + failure: + description: 'The credential failure code when `state` is `failing`; null otherwise.' + type: + - 'string' + - 'null' + state: + enum: + - 'usable' + - 'no_credential' + - 'failing' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'state' + - 'failure' + type: 'object' + required: + - 'host' + - 'path_prefix' + - 'status' + type: 'object' + type: 'array' + github: + properties: + apps: + items: + properties: + app_id: + type: + - 'string' + - 'null' + app_slug: + type: + - 'string' + - 'null' + installations: + items: + properties: + account: + description: 'The account the App is installed on, as GitHub spells it.' + type: 'string' + account_type: + enum: + - 'organization' + - 'user' + - null + type: + - 'string' + - 'null' + x-speakeasy-unknown-values: allow + coverage: + description: 'What GitHub says the installation covers; null until read.' + properties: + checked_at: + description: 'When GitHub answered, through the installation token the vault holds.' + format: 'date-time' + type: 'string' + repository_count: + description: 'Repositories the installation covers; null when GitHub did not count them.' + type: + - 'integer' + - 'null' + selection: + enum: + - 'all' + - 'selected' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'selection' + - 'repository_count' + - 'checked_at' + type: + - 'object' + - 'null' + credential_id: + type: 'string' + holds_token: + description: 'Whether the vault holds a current installation token to inject.' + type: 'boolean' + is_enabled: + type: 'boolean' + is_off_for_intern: + description: 'The workspace turned this shared installation off or hid it for this intern.' + type: 'boolean' + shadowed_by: + description: 'What egress uses instead of this installation for a request to its account: an earlier installation on the same account, or a token pinned to the account. Null when this installation answers.' + enum: + - 'installation' + - 'token' + - null + type: + - 'string' + - 'null' + x-speakeasy-unknown-values: allow + required: + - 'credential_id' + - 'account' + - 'account_type' + - 'is_enabled' + - 'is_off_for_intern' + - 'holds_token' + - 'coverage' + - 'shadowed_by' + type: 'object' + type: 'array' + member_links: + description: 'Members whose own account the vault would act as on this App''s accounts; GitHub still limits a member''s token to what that member can reach.' + items: + properties: + holds_token: + type: 'boolean' + login: + type: 'string' + via: + description: 'How the vault picks this link for the App, by the same selection egress uses.' + enum: + - 'app_link' + - 'token' + - 'any_link' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'login' + - 'via' + - 'holds_token' + type: 'object' + type: 'array' + scope: + description: '`workspace` applies to every intern of the workspace; `intern` to this intern alone.' + enum: + - 'workspace' + - 'intern' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'app_id' + - 'app_slug' + - 'scope' + - 'installations' + - 'member_links' + type: 'object' + type: 'array' + tokens: + items: + properties: + holds_token: + type: 'boolean' + login: + type: 'string' + owner: + type: + - 'string' + - 'null' + repository_count: + type: + - 'integer' + - 'null' + scope: + description: '`workspace` applies to every intern of the workspace; `intern` to this intern alone.' + enum: + - 'workspace' + - 'intern' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'login' + - 'owner' + - 'repository_count' + - 'scope' + - 'holds_token' + type: 'object' + type: 'array' + required: + - 'apps' + - 'tokens' + type: 'object' + google: + properties: + accounts: + items: + properties: + delegated_capabilities: + items: + type: 'string' + type: 'array' + email: + type: 'string' + holds_grant: + type: 'boolean' + is_delegated_to_intern: + type: 'boolean' + scope: + description: '`workspace` applies to every intern of the workspace; `intern` to this intern alone.' + enum: + - 'workspace' + - 'intern' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'email' + - 'scope' + - 'is_delegated_to_intern' + - 'delegated_capabilities' + - 'holds_grant' + type: 'object' + type: 'array' + required: + - 'accounts' + type: 'object' + host_rules: + description: 'Built-in hosts the vault injects a named secret for, and whether that secret is stored.' + items: + properties: + holds_secret: + type: 'boolean' + host: + type: 'string' + secret_name: + type: 'string' + required: + - 'host' + - 'secret_name' + - 'holds_secret' + type: 'object' + type: 'array' + mcp_origins: + items: + properties: + account_key: + type: + - 'string' + - 'null' + host: + type: 'string' + is_personal: + description: 'Members'' own accounts, matched to the acting member per turn.' + type: 'boolean' + routes: + items: + properties: + host: + type: 'string' + path_prefix: + type: + - 'string' + - 'null' + required: + - 'host' + - 'path_prefix' + type: 'object' + type: 'array' + status: + description: 'The vault''s decision for a request to this server; null for members'' own accounts, decided per acting member.' + properties: + failure: + description: 'The credential failure code when `state` is `failing`; null otherwise.' + type: + - 'string' + - 'null' + state: + enum: + - 'usable' + - 'no_credential' + - 'failing' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'state' + - 'failure' + type: + - 'object' + - 'null' + required: + - 'host' + - 'account_key' + - 'is_personal' + - 'routes' + - 'status' + type: 'object' + type: 'array' + read_at: + format: 'date-time' + type: 'string' + secrets: + items: + properties: + created_at: + type: 'string' + hosts: + items: + type: 'string' + type: + - 'array' + - 'null' + name: + type: 'string' + scope: + enum: + - 'intern' + - 'attached' + - 'workspace' + type: 'string' + x-speakeasy-unknown-values: allow + required: + - 'name' + - 'hosts' + - 'scope' + - 'created_at' + type: 'object' + type: 'array' + slack: + properties: + member_links: + description: 'Members whose own Slack account the vault can act as; whether the intern''s own Slack app runs is a runtime fact the `connections` tool reports.' + items: + properties: + holds_token: + type: 'boolean' + slack_user_id: + type: 'string' + required: + - 'slack_user_id' + - 'holds_token' + type: 'object' + type: 'array' + required: + - 'member_links' + type: 'object' + required: + - 'agent_id' + - 'read_at' + - 'github' + - 'google' + - 'slack' + - 'mcp_origins' + - 'host_rules' + - 'custom_origins' + - 'secrets' + type: + - 'object' + - 'null' VaultSecret: additionalProperties: false description: 'Metadata for one stored secret. The secret value is never returned. `fingerprint` is an HMAC-SHA-256 of the value keyed with that vault''s own data key, so it is comparable only within one vault: equal fingerprints in one vault mean equal values, and rewriting the same value keeps its fingerprint. The same value stored in two vaults (for example a workspace secret and its intern copy) carries different fingerprints, so comparing fingerprints across vaults cannot show that a copy matches or that a rotation propagated. `hosts` and `fingerprint` are `null` only for legacy rows written before host binding was required; storing the secret again assigns hosts.' @@ -50203,7 +50562,7 @@ paths: - $ref: "#/components/parameters/AppCategories" /vault/interns/{internId}/connections: get: - description: 'Lists the connections in scope for the intern, by the key of their card on the dashboard''s Connections tab: `github`, `slack`, `google`, a catalog MCP server such as `linear` or `notion`, or `mcp:` for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. `ori features add` checks a feature''s `ori.requires.connections` against this list. Keys only, never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key''s active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern''s own API key is confined to that intern: it can always read the intern''s secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as `eu.openrouter.ai` are refused. [API key](/docs/api-reference/authentication) required.' + description: 'Lists the connections in scope for the intern, by the key of their card on the dashboard''s Connections tab: `github`, `slack`, `google`, a catalog MCP server such as `linear` or `notion`, or `mcp:` for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. `ori features add` checks a feature''s `ori.requires.connections` against this list. `routing` is the vault''s routing table for the intern: the credentials it holds and what it would inject each for, from the same lookups the egress proxy picks a credential with, GitHub repository coverage read through the installation token and cached. `routing_text` is that table as the lines the intern reads in its instructions. Never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key''s active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern''s own API key is confined to that intern: it can always read the intern''s secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as `eu.openrouter.ai` are refused. [API key](/docs/api-reference/authentication) required.' operationId: 'listInternConnections' parameters: - description: 'UUID of an intern in the workspace selected by the API key.' @@ -50223,6 +50582,55 @@ paths: data: - key: 'github' - key: 'linear' + routing: + agent_id: 'intern_123' + custom_origins: [] + github: + apps: + - app_id: '71000003' + app_slug: 'openrouter-interns' + installations: + - account: 'OpenRouterTeam' + account_type: 'organization' + coverage: + checked_at: '2026-10-27T19:30:00.000Z' + repository_count: 42 + selection: 'all' + credential_id: 'cred_1' + holds_token: true + is_enabled: true + is_off_for_intern: false + member_links: + - holds_token: true + login: 'gfadlallah' + member_user_id: 'user_1' + scope: 'workspace' + tokens: [] + google: + accounts: [] + host_rules: + - holds_secret: false + host: 'api.openai.com' + secret_name: 'openai_api_key' + mcp_origins: + - account_key: null + holds_secret: true + host: 'mcp.linear.app' + injects: 'bearer' + is_personal: false + routes: + - host: 'mcp.linear.app' + path_prefix: null + read_at: '2026-10-27T20:00:00.000Z' + secrets: + - created_at: '2026-09-15T10:00:00.000Z' + hosts: + - 'api.linear.app' + name: 'linear_api_key' + scope: 'workspace' + slack: + member_links: [] + routing_text: "## Connections\n\n..." schema: properties: data: @@ -50234,8 +50642,17 @@ paths: - 'key' type: 'object' type: 'array' + routing: + $ref: '#/components/schemas/VaultRoutingTable' + routing_text: + description: 'The routing table as the plain lines the intern reads in its instructions'' Connections section, or a notice that it could not be read; null for a caller other than the intern.' + type: + - 'string' + - 'null' required: - 'data' + - 'routing' + - 'routing_text' type: 'object' description: 'The connections the intern can use.' '400': diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 6c18e9989..ada19e10e 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,8 +2,8 @@ speakeasyVersion: 1.802.0 sources: OpenRouter API: sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:9dd586b58a0d35fb193d78c0d6dc359caa8c1d3284dd422722bedd85d671c8ef - sourceBlobDigest: sha256:70440d791084c5bf485f5df52c470ded9be727e9b25215f72838057f81a50489 + sourceRevisionDigest: sha256:c9f8cfee59c2812dfb1410e788d54826c183e612a194fc74db585a862938382a + sourceBlobDigest: sha256:e2aca9292bb619dfc26d52e4108bb375c1131457038b20f319ad8e4890286bc7 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: openrouter: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:9dd586b58a0d35fb193d78c0d6dc359caa8c1d3284dd422722bedd85d671c8ef - sourceBlobDigest: sha256:70440d791084c5bf485f5df52c470ded9be727e9b25215f72838057f81a50489 + sourceRevisionDigest: sha256:c9f8cfee59c2812dfb1410e788d54826c183e612a194fc74db585a862938382a + sourceBlobDigest: sha256:e2aca9292bb619dfc26d52e4108bb375c1131457038b20f319ad8e4890286bc7 codeSamplesNamespace: open-router-chat-completions-api-typescript-code-samples - codeSamplesRevisionDigest: sha256:8ea9c990cccbb79fa416ecbd59e24d9d32c953e916e3711da0b86945d33036dd + codeSamplesRevisionDigest: sha256:8f2f319094eed0bacdb3c8e7f4c7e16e43935343b9a6fd039e285e36ea06653f workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.802.0 diff --git a/RELEASES.md b/RELEASES.md index 69ef2be09..57c88a6a5 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -4546,4 +4546,14 @@ Based on: ### Generated - [typescript v1.5.16] . ### Releases -- [NPM v1.5.16] https://www.npmjs.com/package/@openrouter/sdk/v/1.5.16 - . \ No newline at end of file +- [NPM v1.5.16] https://www.npmjs.com/package/@openrouter/sdk/v/1.5.16 - . + +## 2026-10-28 13:43:50 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.802.0 (2.948.4) https://github.com/speakeasy-api/speakeasy +### Generated +- [typescript v1.5.17] . +### Releases +- [NPM v1.5.17] https://www.npmjs.com/package/@openrouter/sdk/v/1.5.17 - . \ No newline at end of file diff --git a/docs/models/account.mdx b/docs/models/account.mdx new file mode 100644 index 000000000..77693d913 --- /dev/null +++ b/docs/models/account.mdx @@ -0,0 +1,30 @@ +--- +title: "Account" +--- + +## Example Usage + +```typescript +import { Account } from "@openrouter/sdk/models"; + +let value: Account = { + delegatedCapabilities: [ + "", + "", + ], + email: "Carolanne38@gmail.com", + holdsGrant: true, + isDelegatedToIntern: false, + scope: "intern", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `delegatedCapabilities` | *string*[] | ✔️ | N/A | +| `email` | *string* | ✔️ | N/A | +| `holdsGrant` | *boolean* | ✔️ | N/A | +| `isDelegatedToIntern` | *boolean* | ✔️ | N/A | +| `scope` | [models.AccountScope](../models/accountscope.mdx) | ✔️ | `workspace` applies to every intern of the workspace; `intern` to this intern alone. | \ No newline at end of file diff --git a/docs/models/accountscope.mdx b/docs/models/accountscope.mdx new file mode 100644 index 000000000..ed168b8d1 --- /dev/null +++ b/docs/models/accountscope.mdx @@ -0,0 +1,21 @@ +--- +title: "AccountScope" +--- + +`workspace` applies to every intern of the workspace; `intern` to this intern alone. + +## Example Usage + +```typescript +import { AccountScope } from "@openrouter/sdk/models"; + +let value: AccountScope = "intern"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"workspace" | "intern" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/accounttype.mdx b/docs/models/accounttype.mdx new file mode 100644 index 000000000..bd556fdf4 --- /dev/null +++ b/docs/models/accounttype.mdx @@ -0,0 +1,19 @@ +--- +title: "AccountType" +--- + +## Example Usage + +```typescript +import { AccountType } from "@openrouter/sdk/models"; + +let value: AccountType = "user"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"organization" | "user" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/app.mdx b/docs/models/app.mdx new file mode 100644 index 000000000..a26eb5f93 --- /dev/null +++ b/docs/models/app.mdx @@ -0,0 +1,42 @@ +--- +title: "App" +--- + +## Example Usage + +```typescript +import { App } from "@openrouter/sdk/models"; + +let value: App = { + appId: "", + appSlug: "", + installations: [ + { + account: "90395233", + accountType: "user", + coverage: { + checkedAt: new Date("2024-07-28T01:53:50.306Z"), + repositoryCount: 283955, + selection: "all", + }, + credentialId: "", + holdsToken: false, + isEnabled: false, + isOffForIntern: true, + shadowedBy: "token", + }, + ], + memberLinks: [], + scope: "workspace", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| `appId` | *string* | ✔️ | N/A | +| `appSlug` | *string* | ✔️ | N/A | +| `installations` | [models.Installation](../models/installation.mdx)[] | ✔️ | N/A | +| `memberLinks` | [models.AppMemberLink](../models/appmemberlink.mdx)[] | ✔️ | Members whose own account the vault would act as on this App's accounts; GitHub still limits a member's token to what that member can reach. | +| `scope` | [models.AppScope](../models/appscope.mdx) | ✔️ | `workspace` applies to every intern of the workspace; `intern` to this intern alone. | \ No newline at end of file diff --git a/docs/models/appmemberlink.mdx b/docs/models/appmemberlink.mdx new file mode 100644 index 000000000..4bb032e3b --- /dev/null +++ b/docs/models/appmemberlink.mdx @@ -0,0 +1,23 @@ +--- +title: "AppMemberLink" +--- + +## Example Usage + +```typescript +import { AppMemberLink } from "@openrouter/sdk/models"; + +let value: AppMemberLink = { + holdsToken: true, + login: "Trevion57", + via: "token", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | +| `holdsToken` | *boolean* | ✔️ | N/A | +| `login` | *string* | ✔️ | N/A | +| `via` | [models.Via](../models/via.mdx) | ✔️ | How the vault picks this link for the App, by the same selection egress uses. | \ No newline at end of file diff --git a/docs/models/appscope.mdx b/docs/models/appscope.mdx new file mode 100644 index 000000000..858934932 --- /dev/null +++ b/docs/models/appscope.mdx @@ -0,0 +1,21 @@ +--- +title: "AppScope" +--- + +`workspace` applies to every intern of the workspace; `intern` to this intern alone. + +## Example Usage + +```typescript +import { AppScope } from "@openrouter/sdk/models"; + +let value: AppScope = "intern"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"workspace" | "intern" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/coverage.mdx b/docs/models/coverage.mdx new file mode 100644 index 000000000..f7231088d --- /dev/null +++ b/docs/models/coverage.mdx @@ -0,0 +1,25 @@ +--- +title: "Coverage" +--- + +What GitHub says the installation covers; null until read. + +## Example Usage + +```typescript +import { Coverage } from "@openrouter/sdk/models"; + +let value: Coverage = { + checkedAt: new Date("2025-09-29T08:31:35.555Z"), + repositoryCount: 719072, + selection: "all", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| `checkedAt` | [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) | ✔️ | When GitHub answered, through the installation token the vault holds. | +| `repositoryCount` | *number* | ✔️ | Repositories the installation covers; null when GitHub did not count them. | +| `selection` | [models.Selection](../models/selection.mdx) | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/customorigin.mdx b/docs/models/customorigin.mdx new file mode 100644 index 000000000..85278a87d --- /dev/null +++ b/docs/models/customorigin.mdx @@ -0,0 +1,26 @@ +--- +title: "CustomOrigin" +--- + +## Example Usage + +```typescript +import { CustomOrigin } from "@openrouter/sdk/models"; + +let value: CustomOrigin = { + host: "unhappy-doing.org", + pathPrefix: "", + status: { + failure: "", + state: "no_credential", + }, +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | +| `host` | *string* | ✔️ | N/A | +| `pathPrefix` | *string* | ✔️ | N/A | +| `status` | [models.CustomOriginStatus](../models/customoriginstatus.mdx) | ✔️ | The vault injection decision for this destination, at `read_at`. | \ No newline at end of file diff --git a/docs/models/customoriginstate.mdx b/docs/models/customoriginstate.mdx new file mode 100644 index 000000000..feefd0ed5 --- /dev/null +++ b/docs/models/customoriginstate.mdx @@ -0,0 +1,19 @@ +--- +title: "CustomOriginState" +--- + +## Example Usage + +```typescript +import { CustomOriginState } from "@openrouter/sdk/models"; + +let value: CustomOriginState = "no_credential"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"usable" | "no_credential" | "failing" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/customoriginstatus.mdx b/docs/models/customoriginstatus.mdx new file mode 100644 index 000000000..980f1ae97 --- /dev/null +++ b/docs/models/customoriginstatus.mdx @@ -0,0 +1,23 @@ +--- +title: "CustomOriginStatus" +--- + +The vault injection decision for this destination, at `read_at`. + +## Example Usage + +```typescript +import { CustomOriginStatus } from "@openrouter/sdk/models"; + +let value: CustomOriginStatus = { + failure: "", + state: "no_credential", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `failure` | *string* | ✔️ | The credential failure code when `state` is `failing`; null otherwise. | +| `state` | [models.CustomOriginState](../models/customoriginstate.mdx) | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/github.mdx b/docs/models/github.mdx new file mode 100644 index 000000000..407287e95 --- /dev/null +++ b/docs/models/github.mdx @@ -0,0 +1,37 @@ +--- +title: "Github" +--- + +## Example Usage + +```typescript +import { Github } from "@openrouter/sdk/models"; + +let value: Github = { + apps: [ + { + appId: "", + appSlug: "", + installations: [], + memberLinks: [], + scope: "workspace", + }, + ], + tokens: [ + { + holdsToken: false, + login: "Concepcion.Brekke95", + owner: "", + repositoryCount: 274676, + scope: "intern", + }, + ], +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------ | ------------------------------------ | ------------------------------------ | ------------------------------------ | +| `apps` | [models.App](../models/app.mdx)[] | ✔️ | N/A | +| `tokens` | [models.Token](../models/token.mdx)[] | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/google.mdx b/docs/models/google.mdx new file mode 100644 index 000000000..0007f8b5d --- /dev/null +++ b/docs/models/google.mdx @@ -0,0 +1,30 @@ +--- +title: "Google" +--- + +## Example Usage + +```typescript +import { Google } from "@openrouter/sdk/models"; + +let value: Google = { + accounts: [ + { + delegatedCapabilities: [ + "", + "", + ], + email: "Travis_Dickens92@gmail.com", + holdsGrant: false, + isDelegatedToIntern: false, + scope: "workspace", + }, + ], +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | +| `accounts` | [models.Account](../models/account.mdx)[] | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/hostrule.mdx b/docs/models/hostrule.mdx new file mode 100644 index 000000000..897429329 --- /dev/null +++ b/docs/models/hostrule.mdx @@ -0,0 +1,23 @@ +--- +title: "HostRule" +--- + +## Example Usage + +```typescript +import { HostRule } from "@openrouter/sdk/models"; + +let value: HostRule = { + holdsSecret: true, + host: "metallic-swanling.org", + secretName: "", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `holdsSecret` | *boolean* | ✔️ | N/A | +| `host` | *string* | ✔️ | N/A | +| `secretName` | *string* | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/installation.mdx b/docs/models/installation.mdx new file mode 100644 index 000000000..6be999640 --- /dev/null +++ b/docs/models/installation.mdx @@ -0,0 +1,37 @@ +--- +title: "Installation" +--- + +## Example Usage + +```typescript +import { Installation } from "@openrouter/sdk/models"; + +let value: Installation = { + account: "79325006", + accountType: "organization", + coverage: { + checkedAt: new Date("2024-07-28T01:53:50.306Z"), + repositoryCount: 283955, + selection: "all", + }, + credentialId: "", + holdsToken: false, + isEnabled: true, + isOffForIntern: false, + shadowedBy: "installation", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `account` | *string* | ✔️ | The account the App is installed on, as GitHub spells it. | +| `accountType` | [models.AccountType](../models/accounttype.mdx) | ✔️ | N/A | +| `coverage` | [models.Coverage](../models/coverage.mdx) | ✔️ | What GitHub says the installation covers; null until read. | +| `credentialId` | *string* | ✔️ | N/A | +| `holdsToken` | *boolean* | ✔️ | Whether the vault holds a current installation token to inject. | +| `isEnabled` | *boolean* | ✔️ | N/A | +| `isOffForIntern` | *boolean* | ✔️ | The workspace turned this shared installation off or hid it for this intern. | +| `shadowedBy` | [models.ShadowedBy](../models/shadowedby.mdx) | ✔️ | What egress uses instead of this installation for a request to its account: an earlier installation on the same account, or a token pinned to the account. Null when this installation answers. | \ No newline at end of file diff --git a/docs/models/mcporigin.mdx b/docs/models/mcporigin.mdx new file mode 100644 index 000000000..30719f113 --- /dev/null +++ b/docs/models/mcporigin.mdx @@ -0,0 +1,30 @@ +--- +title: "McpOrigin" +--- + +## Example Usage + +```typescript +import { McpOrigin } from "@openrouter/sdk/models"; + +let value: McpOrigin = { + accountKey: "", + host: "mature-turret.name", + isPersonal: false, + routes: [], + status: { + failure: "", + state: "failing", + }, +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| `accountKey` | *string* | ✔️ | N/A | +| `host` | *string* | ✔️ | N/A | +| `isPersonal` | *boolean* | ✔️ | Members' own accounts, matched to the acting member per turn. | +| `routes` | [models.Route](../models/route.mdx)[] | ✔️ | N/A | +| `status` | [models.McpOriginStatus](../models/mcporiginstatus.mdx) | ✔️ | The vault's decision for a request to this server; null for members' own accounts, decided per acting member. | \ No newline at end of file diff --git a/docs/models/mcporiginstate.mdx b/docs/models/mcporiginstate.mdx new file mode 100644 index 000000000..8c1eabf75 --- /dev/null +++ b/docs/models/mcporiginstate.mdx @@ -0,0 +1,19 @@ +--- +title: "McpOriginState" +--- + +## Example Usage + +```typescript +import { McpOriginState } from "@openrouter/sdk/models"; + +let value: McpOriginState = "no_credential"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"usable" | "no_credential" | "failing" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/mcporiginstatus.mdx b/docs/models/mcporiginstatus.mdx new file mode 100644 index 000000000..df385fe43 --- /dev/null +++ b/docs/models/mcporiginstatus.mdx @@ -0,0 +1,23 @@ +--- +title: "McpOriginStatus" +--- + +The vault's decision for a request to this server; null for members' own accounts, decided per acting member. + +## Example Usage + +```typescript +import { McpOriginStatus } from "@openrouter/sdk/models"; + +let value: McpOriginStatus = { + failure: "", + state: "no_credential", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `failure` | *string* | ✔️ | The credential failure code when `state` is `failing`; null otherwise. | +| `state` | [models.McpOriginState](../models/mcporiginstate.mdx) | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/operations/listinternconnectionsresponse.mdx b/docs/models/operations/listinternconnectionsresponse.mdx index 07604d525..9c3305d48 100644 --- a/docs/models/operations/listinternconnectionsresponse.mdx +++ b/docs/models/operations/listinternconnectionsresponse.mdx @@ -11,11 +11,53 @@ import { ListInternConnectionsResponse } from "@openrouter/sdk/models/operations let value: ListInternConnectionsResponse = { data: [], + routing: { + agentId: "", + customOrigins: [], + github: { + apps: [ + { + appId: "", + appSlug: "", + installations: [], + memberLinks: [], + scope: "workspace", + }, + ], + tokens: [ + { + holdsToken: false, + login: "Concepcion.Brekke95", + owner: "", + repositoryCount: 274676, + scope: "intern", + }, + ], + }, + google: { + accounts: [], + }, + hostRules: [], + mcpOrigins: [], + readAt: new Date("2026-12-07T16:43:23.795Z"), + secrets: [], + slack: { + memberLinks: [ + { + holdsToken: false, + slackUserId: "", + }, + ], + }, + }, + routingText: "", }; ``` ## Fields -| Field | Type | Required | Description | -| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | -| `data` | [operations.ListInternConnectionsData](../../models/operations/listinternconnectionsdata.mdx)[] | ✔️ | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `data` | [operations.ListInternConnectionsData](../../models/operations/listinternconnectionsdata.mdx)[] | ✔️ | N/A | +| `routing` | [models.VaultRoutingTable](../../models/vaultroutingtable.mdx) | ✔️ | The intern's routing table, for the intern's own key only; null for any other caller or when the vault could not build it in time. The keys still list. | +| `routingText` | *string* | ✔️ | The routing table as the plain lines the intern reads in its instructions' Connections section, or a notice that it could not be read; null for a caller other than the intern. | \ No newline at end of file diff --git a/docs/models/route.mdx b/docs/models/route.mdx new file mode 100644 index 000000000..37b35483c --- /dev/null +++ b/docs/models/route.mdx @@ -0,0 +1,21 @@ +--- +title: "Route" +--- + +## Example Usage + +```typescript +import { Route } from "@openrouter/sdk/models"; + +let value: Route = { + host: "far-flung-pupil.name", + pathPrefix: "", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `host` | *string* | ✔️ | N/A | +| `pathPrefix` | *string* | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/secret.mdx b/docs/models/secret.mdx new file mode 100644 index 000000000..5d6d0492a --- /dev/null +++ b/docs/models/secret.mdx @@ -0,0 +1,27 @@ +--- +title: "Secret" +--- + +## Example Usage + +```typescript +import { Secret } from "@openrouter/sdk/models"; + +let value: Secret = { + createdAt: "1712621333590", + hosts: [ + "", + ], + name: "", + scope: "intern", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------- | ---------------------------------------------- | ---------------------------------------------- | ---------------------------------------------- | +| `createdAt` | *string* | ✔️ | N/A | +| `hosts` | *string*[] | ✔️ | N/A | +| `name` | *string* | ✔️ | N/A | +| `scope` | [models.SecretScope](../models/secretscope.mdx) | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/secretscope.mdx b/docs/models/secretscope.mdx new file mode 100644 index 000000000..84d58938e --- /dev/null +++ b/docs/models/secretscope.mdx @@ -0,0 +1,19 @@ +--- +title: "SecretScope" +--- + +## Example Usage + +```typescript +import { SecretScope } from "@openrouter/sdk/models"; + +let value: SecretScope = "workspace"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"intern" | "attached" | "workspace" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/selection.mdx b/docs/models/selection.mdx new file mode 100644 index 000000000..f0aee746c --- /dev/null +++ b/docs/models/selection.mdx @@ -0,0 +1,19 @@ +--- +title: "Selection" +--- + +## Example Usage + +```typescript +import { Selection } from "@openrouter/sdk/models"; + +let value: Selection = "selected"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"all" | "selected" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/shadowedby.mdx b/docs/models/shadowedby.mdx new file mode 100644 index 000000000..e247a0b8d --- /dev/null +++ b/docs/models/shadowedby.mdx @@ -0,0 +1,21 @@ +--- +title: "ShadowedBy" +--- + +What egress uses instead of this installation for a request to its account: an earlier installation on the same account, or a token pinned to the account. Null when this installation answers. + +## Example Usage + +```typescript +import { ShadowedBy } from "@openrouter/sdk/models"; + +let value: ShadowedBy = "installation"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"installation" | "token" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/slack.mdx b/docs/models/slack.mdx new file mode 100644 index 000000000..9627b9740 --- /dev/null +++ b/docs/models/slack.mdx @@ -0,0 +1,19 @@ +--- +title: "Slack" +--- + +## Example Usage + +```typescript +import { Slack } from "@openrouter/sdk/models"; + +let value: Slack = { + memberLinks: [], +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `memberLinks` | [models.SlackMemberLink](../models/slackmemberlink.mdx)[] | ✔️ | Members whose own Slack account the vault can act as; whether the intern's own Slack app runs is a runtime fact the `connections` tool reports. | \ No newline at end of file diff --git a/docs/models/slackmemberlink.mdx b/docs/models/slackmemberlink.mdx new file mode 100644 index 000000000..f69cf154b --- /dev/null +++ b/docs/models/slackmemberlink.mdx @@ -0,0 +1,21 @@ +--- +title: "SlackMemberLink" +--- + +## Example Usage + +```typescript +import { SlackMemberLink } from "@openrouter/sdk/models"; + +let value: SlackMemberLink = { + holdsToken: false, + slackUserId: "", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `holdsToken` | *boolean* | ✔️ | N/A | +| `slackUserId` | *string* | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/token.mdx b/docs/models/token.mdx new file mode 100644 index 000000000..06946f6e1 --- /dev/null +++ b/docs/models/token.mdx @@ -0,0 +1,27 @@ +--- +title: "Token" +--- + +## Example Usage + +```typescript +import { Token } from "@openrouter/sdk/models"; + +let value: Token = { + holdsToken: true, + login: "Shaniya_Macejkovic27", + owner: "", + repositoryCount: 926864, + scope: "intern", +}; +``` + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `holdsToken` | *boolean* | ✔️ | N/A | +| `login` | *string* | ✔️ | N/A | +| `owner` | *string* | ✔️ | N/A | +| `repositoryCount` | *number* | ✔️ | N/A | +| `scope` | [models.TokenScope](../models/tokenscope.mdx) | ✔️ | `workspace` applies to every intern of the workspace; `intern` to this intern alone. | \ No newline at end of file diff --git a/docs/models/tokenscope.mdx b/docs/models/tokenscope.mdx new file mode 100644 index 000000000..d2380df2e --- /dev/null +++ b/docs/models/tokenscope.mdx @@ -0,0 +1,21 @@ +--- +title: "TokenScope" +--- + +`workspace` applies to every intern of the workspace; `intern` to this intern alone. + +## Example Usage + +```typescript +import { TokenScope } from "@openrouter/sdk/models"; + +let value: TokenScope = "intern"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"workspace" | "intern" | Unrecognized +``` \ No newline at end of file diff --git a/docs/models/vaultroutingtable.mdx b/docs/models/vaultroutingtable.mdx new file mode 100644 index 000000000..5ebd6b19f --- /dev/null +++ b/docs/models/vaultroutingtable.mdx @@ -0,0 +1,82 @@ +--- +title: "VaultRoutingTable" +--- + +The intern's routing table, for the intern's own key only; null for any other caller or when the vault could not build it in time. The keys still list. + +## Example Usage + +```typescript +import { VaultRoutingTable } from "@openrouter/sdk/models"; + +let value: VaultRoutingTable = { + agentId: "", + customOrigins: [], + github: { + apps: [ + { + appId: "", + appSlug: "", + installations: [], + memberLinks: [], + scope: "workspace", + }, + ], + tokens: [ + { + holdsToken: false, + login: "Concepcion.Brekke95", + owner: "", + repositoryCount: 274676, + scope: "intern", + }, + ], + }, + google: { + accounts: [], + }, + hostRules: [ + { + holdsSecret: false, + host: "splendid-forager.org", + secretName: "", + }, + ], + mcpOrigins: [ + { + accountKey: "", + host: "dark-viability.info", + isPersonal: true, + routes: [], + status: { + failure: "", + state: "failing", + }, + }, + ], + readAt: new Date("2024-12-01T18:11:20.418Z"), + secrets: [], + slack: { + memberLinks: [ + { + holdsToken: false, + slackUserId: "", + }, + ], + }, +}; +``` + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| `agentId` | *string* | ✔️ | N/A | +| `customOrigins` | [models.CustomOrigin](../models/customorigin.mdx)[] | ✔️ | N/A | +| `github` | [models.Github](../models/github.mdx) | ✔️ | N/A | +| `google` | [models.Google](../models/google.mdx) | ✔️ | N/A | +| `hostRules` | [models.HostRule](../models/hostrule.mdx)[] | ✔️ | Built-in hosts the vault injects a named secret for, and whether that secret is stored. | +| `mcpOrigins` | [models.McpOrigin](../models/mcporigin.mdx)[] | ✔️ | N/A | +| `readAt` | [Date](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date) | ✔️ | N/A | +| `secrets` | [models.Secret](../models/secret.mdx)[] | ✔️ | N/A | +| `slack` | [models.Slack](../models/slack.mdx) | ✔️ | N/A | \ No newline at end of file diff --git a/docs/models/via.mdx b/docs/models/via.mdx new file mode 100644 index 000000000..654e54704 --- /dev/null +++ b/docs/models/via.mdx @@ -0,0 +1,21 @@ +--- +title: "Via" +--- + +How the vault picks this link for the App, by the same selection egress uses. + +## Example Usage + +```typescript +import { Via } from "@openrouter/sdk/models"; + +let value: Via = "token"; + +// Open enum: unrecognized values are captured as Unrecognized +``` + +## Values + +```typescript +"app_link" | "token" | "any_link" | Unrecognized +``` \ No newline at end of file diff --git a/docs/sdks/vault/README.mdx b/docs/sdks/vault/README.mdx index 79cfc0756..9c02946de 100644 --- a/docs/sdks/vault/README.mdx +++ b/docs/sdks/vault/README.mdx @@ -21,7 +21,7 @@ Store host-bound secrets for a workspace or for one intern. Scope is selected by ## listInternConnections -Lists the connections in scope for the intern, by the key of their card on the dashboard's Connections tab: `github`, `slack`, `google`, a catalog MCP server such as `linear` or `notion`, or `mcp:` for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. `ori features add` checks a feature's `ori.requires.connections` against this list. Keys only, never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key's active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern's own API key is confined to that intern: it can always read the intern's secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as `eu.openrouter.ai` are refused. [API key](/docs/api-reference/authentication) required. +Lists the connections in scope for the intern, by the key of their card on the dashboard's Connections tab: `github`, `slack`, `google`, a catalog MCP server such as `linear` or `notion`, or `mcp:` for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. `ori features add` checks a feature's `ori.requires.connections` against this list. `routing` is the vault's routing table for the intern: the credentials it holds and what it would inject each for, from the same lookups the egress proxy picks a credential with, GitHub repository coverage read through the installation token and cached. `routing_text` is that table as the lines the intern reads in its instructions. Never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key's active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern's own API key is confined to that intern: it can always read the intern's secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as `eu.openrouter.ai` are refused. [API key](/docs/api-reference/authentication) required. ### Example Usage diff --git a/jsr.json b/jsr.json index 8198ec16b..9c37f4fa9 100644 --- a/jsr.json +++ b/jsr.json @@ -2,7 +2,7 @@ { "name": "@openrouter/sdk", - "version": "1.5.16", + "version": "1.5.17", "exports": { ".": "./src/index.ts", "./models/errors": "./src/models/errors/index.ts", diff --git a/package.json b/package.json index 1a0f46edc..5a3240bb6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@openrouter/sdk", - "version": "1.5.16", + "version": "1.5.17", "author": "OpenRouter", "description": "The OpenRouter TypeScript SDK is a type-safe toolkit for building AI applications with access to 400+ language models through a unified API.", "keywords": [ @@ -73,15 +73,15 @@ "lint": "eslint --cache --max-warnings=0 src", "build": "tsc && node scripts/unbarrel-imports.js", "prepublishOnly": "npm run build", - "test:transit": "exit 0", - "test:watch": "vitest --watch --project unit", - "typecheck": "tsc --noEmit", - "typecheck:transit": "exit 0", + "compile": "tsc && node scripts/unbarrel-imports.js", "postinstall": "node scripts/check-types.js || true", "test": "vitest --run --project unit", "test:e2e": "vitest --run --project e2e", - "compile": "tsc && node scripts/unbarrel-imports.js", - "prepare": "npm run build" + "test:watch": "vitest --watch --project unit", + "typecheck": "tsc --noEmit", + "prepare": "npm run build", + "test:transit": "exit 0", + "typecheck:transit": "exit 0" }, "peerDependencies": { diff --git a/src/funcs/vaultListInternConnections.ts b/src/funcs/vaultListInternConnections.ts index 27c0a8729..09feb427e 100644 --- a/src/funcs/vaultListInternConnections.ts +++ b/src/funcs/vaultListInternConnections.ts @@ -31,7 +31,7 @@ import { Result } from "../types/fp.js"; * List the connections an intern can use * * @remarks - * Lists the connections in scope for the intern, by the key of their card on the dashboard's Connections tab: `github`, `slack`, `google`, a catalog MCP server such as `linear` or `notion`, or `mcp:` for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. `ori features add` checks a feature's `ori.requires.connections` against this list. Keys only, never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key's active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern's own API key is confined to that intern: it can always read the intern's secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as `eu.openrouter.ai` are refused. [API key](/docs/api-reference/authentication) required. + * Lists the connections in scope for the intern, by the key of their card on the dashboard's Connections tab: `github`, `slack`, `google`, a catalog MCP server such as `linear` or `notion`, or `mcp:` for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. `ori features add` checks a feature's `ori.requires.connections` against this list. `routing` is the vault's routing table for the intern: the credentials it holds and what it would inject each for, from the same lookups the egress proxy picks a credential with, GitHub repository coverage read through the installation token and cached. `routing_text` is that table as the lines the intern reads in its instructions. Never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key's active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern's own API key is confined to that intern: it can always read the intern's secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as `eu.openrouter.ai` are refused. [API key](/docs/api-reference/authentication) required. * * If set, this operation will use {@link Security.apiKey} from the global security. */ diff --git a/src/lib/config.ts b/src/lib/config.ts index 217e397ce..2059191df 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -79,7 +79,7 @@ export function serverURLFromOptions(options: SDKOptions): URL | null { export const SDK_METADATA = { language: "typescript", openapiDocVersion: "1.0.0", - sdkVersion: "1.5.16", + sdkVersion: "1.5.17", genVersion: "2.948.4", - userAgent: "speakeasy-sdk/typescript 1.5.16 2.948.4 1.0.0 @openrouter/sdk", + userAgent: "speakeasy-sdk/typescript 1.5.17 2.948.4 1.0.0 @openrouter/sdk", } as const; diff --git a/src/models/index.ts b/src/models/index.ts index 9797e3ad8..a3410ecc0 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -800,6 +800,7 @@ export * from "./urlcitation.js"; export * from "./validateprivateendpointrequest.js"; export * from "./vaulteffectivesecret.js"; export * from "./vaulteffectivesecretlistresponse.js"; +export * from "./vaultroutingtable.js"; export * from "./vaultsecret.js"; export * from "./vaultsecretcopyrequest.js"; export * from "./vaultsecretcopyresponse.js"; diff --git a/src/models/operations/listinternconnections.ts b/src/models/operations/listinternconnections.ts index 9682b96d7..027e9d176 100644 --- a/src/models/operations/listinternconnections.ts +++ b/src/models/operations/listinternconnections.ts @@ -8,6 +8,7 @@ import { remap as remap$ } from "../../lib/primitives.js"; import { safeParse } from "../../lib/schemas.js"; import { Result as SafeParseResult } from "../../types/fp.js"; import { SDKValidationError } from "../errors/sdkvalidationerror.js"; +import * as models from "../index.js"; export type ListInternConnectionsGlobals = { /** @@ -66,6 +67,14 @@ export type ListInternConnectionsData = { */ export type ListInternConnectionsResponse = { data: Array; + /** + * The intern's routing table, for the intern's own key only; null for any other caller or when the vault could not build it in time. The keys still list. + */ + routing: models.VaultRoutingTable | null; + /** + * The routing table as the plain lines the intern reads in its instructions' Connections section, or a notice that it could not be read; null for a caller other than the intern. + */ + routingText: string | null; }; /** @internal */ @@ -125,6 +134,12 @@ export const ListInternConnectionsResponse$inboundSchema: z.ZodType< unknown > = z.object({ data: z.array(z.lazy(() => ListInternConnectionsData$inboundSchema)), + routing: z.nullable(models.VaultRoutingTable$inboundSchema), + routing_text: z.nullable(z.string()), +}).transform((v) => { + return remap$(v, { + "routing_text": "routingText", + }); }); export function listInternConnectionsResponseFromJSON( diff --git a/src/models/vaultroutingtable.ts b/src/models/vaultroutingtable.ts new file mode 100644 index 000000000..a0304c840 --- /dev/null +++ b/src/models/vaultroutingtable.ts @@ -0,0 +1,742 @@ +/* + * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + * @generated-id: 920bcc895e92 + */ + +import * as z from "zod/v4"; +import { remap as remap$ } from "../lib/primitives.js"; +import { safeParse } from "../lib/schemas.js"; +import * as openEnums from "../types/enums.js"; +import { OpenEnum } from "../types/enums.js"; +import { Result as SafeParseResult } from "../types/fp.js"; +import { SDKValidationError } from "./errors/sdkvalidationerror.js"; + +export const CustomOriginState = { + Usable: "usable", + NoCredential: "no_credential", + Failing: "failing", +} as const; +export type CustomOriginState = OpenEnum; + +/** + * The vault injection decision for this destination, at `read_at`. + */ +export type CustomOriginStatus = { + /** + * The credential failure code when `state` is `failing`; null otherwise. + */ + failure: string | null; + state: CustomOriginState; +}; + +export type CustomOrigin = { + host: string; + pathPrefix: string | null; + /** + * The vault injection decision for this destination, at `read_at`. + */ + status: CustomOriginStatus; +}; + +export const AccountType = { + Organization: "organization", + User: "user", +} as const; +export type AccountType = OpenEnum; + +export const Selection = { + All: "all", + Selected: "selected", +} as const; +export type Selection = OpenEnum; + +/** + * What GitHub says the installation covers; null until read. + */ +export type Coverage = { + /** + * When GitHub answered, through the installation token the vault holds. + */ + checkedAt: Date; + /** + * Repositories the installation covers; null when GitHub did not count them. + */ + repositoryCount: number | null; + selection: Selection; +}; + +/** + * What egress uses instead of this installation for a request to its account: an earlier installation on the same account, or a token pinned to the account. Null when this installation answers. + */ +export const ShadowedBy = { + Installation: "installation", + Token: "token", +} as const; +/** + * What egress uses instead of this installation for a request to its account: an earlier installation on the same account, or a token pinned to the account. Null when this installation answers. + */ +export type ShadowedBy = OpenEnum; + +export type Installation = { + /** + * The account the App is installed on, as GitHub spells it. + */ + account: string; + accountType: AccountType | null; + /** + * What GitHub says the installation covers; null until read. + */ + coverage: Coverage | null; + credentialId: string; + /** + * Whether the vault holds a current installation token to inject. + */ + holdsToken: boolean; + isEnabled: boolean; + /** + * The workspace turned this shared installation off or hid it for this intern. + */ + isOffForIntern: boolean; + /** + * What egress uses instead of this installation for a request to its account: an earlier installation on the same account, or a token pinned to the account. Null when this installation answers. + */ + shadowedBy: ShadowedBy | null; +}; + +/** + * How the vault picks this link for the App, by the same selection egress uses. + */ +export const Via = { + AppLink: "app_link", + Token: "token", + AnyLink: "any_link", +} as const; +/** + * How the vault picks this link for the App, by the same selection egress uses. + */ +export type Via = OpenEnum; + +export type AppMemberLink = { + holdsToken: boolean; + login: string; + /** + * How the vault picks this link for the App, by the same selection egress uses. + */ + via: Via; +}; + +/** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ +export const AppScope = { + Workspace: "workspace", + Intern: "intern", +} as const; +/** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ +export type AppScope = OpenEnum; + +export type App = { + appId: string | null; + appSlug: string | null; + installations: Array; + /** + * Members whose own account the vault would act as on this App's accounts; GitHub still limits a member's token to what that member can reach. + */ + memberLinks: Array; + /** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ + scope: AppScope; +}; + +/** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ +export const TokenScope = { + Workspace: "workspace", + Intern: "intern", +} as const; +/** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ +export type TokenScope = OpenEnum; + +export type Token = { + holdsToken: boolean; + login: string; + owner: string | null; + repositoryCount: number | null; + /** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ + scope: TokenScope; +}; + +export type Github = { + apps: Array; + tokens: Array; +}; + +/** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ +export const AccountScope = { + Workspace: "workspace", + Intern: "intern", +} as const; +/** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ +export type AccountScope = OpenEnum; + +export type Account = { + delegatedCapabilities: Array; + email: string; + holdsGrant: boolean; + isDelegatedToIntern: boolean; + /** + * `workspace` applies to every intern of the workspace; `intern` to this intern alone. + */ + scope: AccountScope; +}; + +export type Google = { + accounts: Array; +}; + +export type HostRule = { + holdsSecret: boolean; + host: string; + secretName: string; +}; + +export type Route = { + host: string; + pathPrefix: string | null; +}; + +export const McpOriginState = { + Usable: "usable", + NoCredential: "no_credential", + Failing: "failing", +} as const; +export type McpOriginState = OpenEnum; + +/** + * The vault's decision for a request to this server; null for members' own accounts, decided per acting member. + */ +export type McpOriginStatus = { + /** + * The credential failure code when `state` is `failing`; null otherwise. + */ + failure: string | null; + state: McpOriginState; +}; + +export type McpOrigin = { + accountKey: string | null; + host: string; + /** + * Members' own accounts, matched to the acting member per turn. + */ + isPersonal: boolean; + routes: Array; + /** + * The vault's decision for a request to this server; null for members' own accounts, decided per acting member. + */ + status: McpOriginStatus | null; +}; + +export const SecretScope = { + Intern: "intern", + Attached: "attached", + Workspace: "workspace", +} as const; +export type SecretScope = OpenEnum; + +export type Secret = { + createdAt: string; + hosts: Array | null; + name: string; + scope: SecretScope; +}; + +export type SlackMemberLink = { + holdsToken: boolean; + slackUserId: string; +}; + +export type Slack = { + /** + * Members whose own Slack account the vault can act as; whether the intern's own Slack app runs is a runtime fact the `connections` tool reports. + */ + memberLinks: Array; +}; + +/** + * The intern's routing table, for the intern's own key only; null for any other caller or when the vault could not build it in time. The keys still list. + */ +export type VaultRoutingTable = { + agentId: string; + customOrigins: Array; + github: Github; + google: Google; + /** + * Built-in hosts the vault injects a named secret for, and whether that secret is stored. + */ + hostRules: Array; + mcpOrigins: Array; + readAt: Date; + secrets: Array; + slack: Slack; +}; + +/** @internal */ +export const CustomOriginState$inboundSchema: z.ZodType< + CustomOriginState, + unknown +> = openEnums.inboundSchema(CustomOriginState); + +/** @internal */ +export const CustomOriginStatus$inboundSchema: z.ZodType< + CustomOriginStatus, + unknown +> = z.object({ + failure: z.nullable(z.string()), + state: CustomOriginState$inboundSchema, +}); + +export function customOriginStatusFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => CustomOriginStatus$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'CustomOriginStatus' from JSON`, + ); +} + +/** @internal */ +export const CustomOrigin$inboundSchema: z.ZodType = z + .object({ + host: z.string(), + path_prefix: z.nullable(z.string()), + status: z.lazy(() => CustomOriginStatus$inboundSchema), + }).transform((v) => { + return remap$(v, { + "path_prefix": "pathPrefix", + }); + }); + +export function customOriginFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => CustomOrigin$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'CustomOrigin' from JSON`, + ); +} + +/** @internal */ +export const AccountType$inboundSchema: z.ZodType = + openEnums.inboundSchema(AccountType); + +/** @internal */ +export const Selection$inboundSchema: z.ZodType = openEnums + .inboundSchema(Selection); + +/** @internal */ +export const Coverage$inboundSchema: z.ZodType = z.object({ + checked_at: z.iso.datetime({ offset: true }).transform(v => new Date(v)), + repository_count: z.nullable(z.int()), + selection: Selection$inboundSchema, +}).transform((v) => { + return remap$(v, { + "checked_at": "checkedAt", + "repository_count": "repositoryCount", + }); +}); + +export function coverageFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Coverage$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Coverage' from JSON`, + ); +} + +/** @internal */ +export const ShadowedBy$inboundSchema: z.ZodType = + openEnums.inboundSchema(ShadowedBy); + +/** @internal */ +export const Installation$inboundSchema: z.ZodType = z + .object({ + account: z.string(), + account_type: z.nullable(AccountType$inboundSchema), + coverage: z.nullable(z.lazy(() => Coverage$inboundSchema)), + credential_id: z.string(), + holds_token: z.boolean(), + is_enabled: z.boolean(), + is_off_for_intern: z.boolean(), + shadowed_by: z.nullable(ShadowedBy$inboundSchema), + }).transform((v) => { + return remap$(v, { + "account_type": "accountType", + "credential_id": "credentialId", + "holds_token": "holdsToken", + "is_enabled": "isEnabled", + "is_off_for_intern": "isOffForIntern", + "shadowed_by": "shadowedBy", + }); + }); + +export function installationFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Installation$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Installation' from JSON`, + ); +} + +/** @internal */ +export const Via$inboundSchema: z.ZodType = openEnums + .inboundSchema(Via); + +/** @internal */ +export const AppMemberLink$inboundSchema: z.ZodType = z + .object({ + holds_token: z.boolean(), + login: z.string(), + via: Via$inboundSchema, + }).transform((v) => { + return remap$(v, { + "holds_token": "holdsToken", + }); + }); + +export function appMemberLinkFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => AppMemberLink$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'AppMemberLink' from JSON`, + ); +} + +/** @internal */ +export const AppScope$inboundSchema: z.ZodType = openEnums + .inboundSchema(AppScope); + +/** @internal */ +export const App$inboundSchema: z.ZodType = z.object({ + app_id: z.nullable(z.string()), + app_slug: z.nullable(z.string()), + installations: z.array(z.lazy(() => Installation$inboundSchema)), + member_links: z.array(z.lazy(() => AppMemberLink$inboundSchema)), + scope: AppScope$inboundSchema, +}).transform((v) => { + return remap$(v, { + "app_id": "appId", + "app_slug": "appSlug", + "member_links": "memberLinks", + }); +}); + +export function appFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => App$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'App' from JSON`, + ); +} + +/** @internal */ +export const TokenScope$inboundSchema: z.ZodType = + openEnums.inboundSchema(TokenScope); + +/** @internal */ +export const Token$inboundSchema: z.ZodType = z.object({ + holds_token: z.boolean(), + login: z.string(), + owner: z.nullable(z.string()), + repository_count: z.nullable(z.int()), + scope: TokenScope$inboundSchema, +}).transform((v) => { + return remap$(v, { + "holds_token": "holdsToken", + "repository_count": "repositoryCount", + }); +}); + +export function tokenFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Token$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Token' from JSON`, + ); +} + +/** @internal */ +export const Github$inboundSchema: z.ZodType = z.object({ + apps: z.array(z.lazy(() => App$inboundSchema)), + tokens: z.array(z.lazy(() => Token$inboundSchema)), +}); + +export function githubFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Github$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Github' from JSON`, + ); +} + +/** @internal */ +export const AccountScope$inboundSchema: z.ZodType = + openEnums.inboundSchema(AccountScope); + +/** @internal */ +export const Account$inboundSchema: z.ZodType = z.object({ + delegated_capabilities: z.array(z.string()), + email: z.string(), + holds_grant: z.boolean(), + is_delegated_to_intern: z.boolean(), + scope: AccountScope$inboundSchema, +}).transform((v) => { + return remap$(v, { + "delegated_capabilities": "delegatedCapabilities", + "holds_grant": "holdsGrant", + "is_delegated_to_intern": "isDelegatedToIntern", + }); +}); + +export function accountFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Account$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Account' from JSON`, + ); +} + +/** @internal */ +export const Google$inboundSchema: z.ZodType = z.object({ + accounts: z.array(z.lazy(() => Account$inboundSchema)), +}); + +export function googleFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Google$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Google' from JSON`, + ); +} + +/** @internal */ +export const HostRule$inboundSchema: z.ZodType = z.object({ + holds_secret: z.boolean(), + host: z.string(), + secret_name: z.string(), +}).transform((v) => { + return remap$(v, { + "holds_secret": "holdsSecret", + "secret_name": "secretName", + }); +}); + +export function hostRuleFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => HostRule$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'HostRule' from JSON`, + ); +} + +/** @internal */ +export const Route$inboundSchema: z.ZodType = z.object({ + host: z.string(), + path_prefix: z.nullable(z.string()), +}).transform((v) => { + return remap$(v, { + "path_prefix": "pathPrefix", + }); +}); + +export function routeFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Route$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Route' from JSON`, + ); +} + +/** @internal */ +export const McpOriginState$inboundSchema: z.ZodType = + openEnums.inboundSchema(McpOriginState); + +/** @internal */ +export const McpOriginStatus$inboundSchema: z.ZodType< + McpOriginStatus, + unknown +> = z.object({ + failure: z.nullable(z.string()), + state: McpOriginState$inboundSchema, +}); + +export function mcpOriginStatusFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => McpOriginStatus$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'McpOriginStatus' from JSON`, + ); +} + +/** @internal */ +export const McpOrigin$inboundSchema: z.ZodType = z.object({ + account_key: z.nullable(z.string()), + host: z.string(), + is_personal: z.boolean(), + routes: z.array(z.lazy(() => Route$inboundSchema)), + status: z.nullable(z.lazy(() => McpOriginStatus$inboundSchema)), +}).transform((v) => { + return remap$(v, { + "account_key": "accountKey", + "is_personal": "isPersonal", + }); +}); + +export function mcpOriginFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => McpOrigin$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'McpOrigin' from JSON`, + ); +} + +/** @internal */ +export const SecretScope$inboundSchema: z.ZodType = + openEnums.inboundSchema(SecretScope); + +/** @internal */ +export const Secret$inboundSchema: z.ZodType = z.object({ + created_at: z.string(), + hosts: z.nullable(z.array(z.string())), + name: z.string(), + scope: SecretScope$inboundSchema, +}).transform((v) => { + return remap$(v, { + "created_at": "createdAt", + }); +}); + +export function secretFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Secret$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Secret' from JSON`, + ); +} + +/** @internal */ +export const SlackMemberLink$inboundSchema: z.ZodType< + SlackMemberLink, + unknown +> = z.object({ + holds_token: z.boolean(), + slack_user_id: z.string(), +}).transform((v) => { + return remap$(v, { + "holds_token": "holdsToken", + "slack_user_id": "slackUserId", + }); +}); + +export function slackMemberLinkFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => SlackMemberLink$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'SlackMemberLink' from JSON`, + ); +} + +/** @internal */ +export const Slack$inboundSchema: z.ZodType = z.object({ + member_links: z.array(z.lazy(() => SlackMemberLink$inboundSchema)), +}).transform((v) => { + return remap$(v, { + "member_links": "memberLinks", + }); +}); + +export function slackFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => Slack$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'Slack' from JSON`, + ); +} + +/** @internal */ +export const VaultRoutingTable$inboundSchema: z.ZodType< + VaultRoutingTable, + unknown +> = z.object({ + agent_id: z.string(), + custom_origins: z.array(z.lazy(() => CustomOrigin$inboundSchema)), + github: z.lazy(() => Github$inboundSchema), + google: z.lazy(() => Google$inboundSchema), + host_rules: z.array(z.lazy(() => HostRule$inboundSchema)), + mcp_origins: z.array(z.lazy(() => McpOrigin$inboundSchema)), + read_at: z.iso.datetime({ offset: true }).transform(v => new Date(v)), + secrets: z.array(z.lazy(() => Secret$inboundSchema)), + slack: z.lazy(() => Slack$inboundSchema), +}).transform((v) => { + return remap$(v, { + "agent_id": "agentId", + "custom_origins": "customOrigins", + "host_rules": "hostRules", + "mcp_origins": "mcpOrigins", + "read_at": "readAt", + }); +}); + +export function vaultRoutingTableFromJSON( + jsonString: string, +): SafeParseResult { + return safeParse( + jsonString, + (x) => VaultRoutingTable$inboundSchema.parse(JSON.parse(x)), + `Failed to parse 'VaultRoutingTable' from JSON`, + ); +} diff --git a/src/sdk/vault.ts b/src/sdk/vault.ts index 4dd82a5e5..26f0095a9 100644 --- a/src/sdk/vault.ts +++ b/src/sdk/vault.ts @@ -22,7 +22,7 @@ export class Vault extends ClientSDK { * List the connections an intern can use * * @remarks - * Lists the connections in scope for the intern, by the key of their card on the dashboard's Connections tab: `github`, `slack`, `google`, a catalog MCP server such as `linear` or `notion`, or `mcp:` for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. `ori features add` checks a feature's `ori.requires.connections` against this list. Keys only, never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key's active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern's own API key is confined to that intern: it can always read the intern's secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as `eu.openrouter.ai` are refused. [API key](/docs/api-reference/authentication) required. + * Lists the connections in scope for the intern, by the key of their card on the dashboard's Connections tab: `github`, `slack`, `google`, a catalog MCP server such as `linear` or `notion`, or `mcp:` for a custom MCP server. A connection is listed when it is stored, enabled, and not turned off or hidden for this intern, as the Connections tab lists it; whether its last test passed is not part of the rule. `ori features add` checks a feature's `ori.requires.connections` against this list. `routing` is the vault's routing table for the intern: the credentials it holds and what it would inject each for, from the same lookups the egress proxy picks a credential with, GitHub repository coverage read through the installation token and cached. `routing_text` is that table as the lines the intern reads in its instructions. Never credentials. Returns 404 for an intern the key cannot see. The scope is selected by the API key: workspace routes act on the key's active workspace and intern routes act on one intern inside that workspace. There is no default workspace and no fallback to another scope. Every vault route, including reads, requires access to the Intern API programme and returns 404 outside it. An intern's own API key is confined to that intern: it can always read the intern's secrets and effective secrets, writes to them follow the rules above, and every other intern and every workspace route answers 404. Requests on regional hostnames such as `eu.openrouter.ai` are refused. [API key](/docs/api-reference/authentication) required. */ async listInternConnections( request: operations.ListInternConnectionsRequest,