diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..af60327 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = crlf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/.env.example b/.env.example index 744e2d3..53b9206 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,11 @@ -# Slack Credentials -# Get these from your Slack app configuration at https://api.slack.com/apps -DISCOURSE_BOT_TOKEN=xoxb-your-bot-token # Bot User OAuth Token from OAuth & Permissions +# Discourse Credentials +# Get these from your Discourse Forum + +# Bot User OAuth Token from OAuth & Permissions +DISCOURSE_BOT_TOKEN=your-bot-token DISCOURSE_URL=https://community.yourdomain.com/ -DISCOURSE_SIGNING_SECRET=your-signing-secret # Signing Secret from Basic Information +# Signing Secret from Basic Information +DISCOURSE_SIGNING_SECRET=your-signing-secret # OpenAI Credentials # Get this from your OpenAI account at https://platform.openai.com/api-keys diff --git a/.gitignore b/.gitignore index 160e029..8552ab6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,40 @@ +# dependencies (bun install) node_modules -.env -ai-context + +# output +out dist -.vercel -.env*.local -.pnpm-store \ No newline at end of file +*.tgz + +# code coverage +coverage +*.lcov + +# logs +logs +_.log +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# caches +.eslintcache +.cache +*.tsbuildinfo + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store + +# misc +.data +.nitro +.cache +.output diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..cf04042 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +shamefully-hoist=true +strict-peer-dependencies=false diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..564d4ba --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + Zenix, A human-like bot that is almost indistinguishable from a real person. + Copyright (C) 2025 Anirudh Sriram + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/README.md b/README.md index 738c39b..2419a0a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AI SDK Slackbot +# AI SDK Discourse Chatbot [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fnicoalbanese%2Fai-sdk-slackbot&env=DISCOURSE_BOT_TOKEN,DISCOURSE_SIGNING_SECRET,OPENAI_API_KEY,EXA_API_KEY&envDescription=API%20keys%20needed%20for%20application&envLink=https%3A%2F%2Fgithub.com%2Fnicoalbanese%2Fai-sdk-slackbot%3Ftab%3Dreadme-ov-file%234-set-environment-variables&project-name=ai-sdk-slackbot) diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..71cf9d4 --- /dev/null +++ b/TODO.md @@ -0,0 +1,20 @@ +discourse-2 chat openapi is broken it doesn't have proper spec it thinks that in the const initialMessage = await client.postMessage({ + channel_id: event.channel?.id, + // thread_ts: event.thread_ts ?? event.ts, + message: initialStatus, + }); + +has a .message.id instead of a message_id + +https://github.com/nitrojs/nitro/discussions/1356 +put something like bro instead of thinking and in final response add the bro at the beggign have words like that +have a matching list or smth like lol is rofl like that ok +or just use the typing indicator in discourse figure out +- make the starting message different randomzie like bro, lmao like that through keyword recognition, now it is fixed to bro, make it a setting +- add mem0 support for adding memories +- add ability for it to reply in posts +- add staggered reply tokenize msgs +- use the prompts.ts and add request hints +- do the relevance check +- set custom status like discord bto does like online offline and custom status msgg +- mark deleted messages as deleted so the ai know why it responded, same with edited messages diff --git a/api/events.ts b/api/events.ts deleted file mode 100644 index c72f6c2..0000000 --- a/api/events.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { AppMentionEvent, SlackEvent } from "@slack/web-api"; -import { - assistantThreadMessage, - handleNewAssistantMessage, -} from "../lib/handle-messages"; -import { waitUntil } from "@vercel/functions"; -import { handleNewAppMention } from "../lib/handle-app-mention"; -import { verifyRequest, getBotId } from "../lib/slack-utils"; -import type { WebhookChatMessage, WebhookNotification } from "@/types"; - -export async function POST(request: Request) { - const rawBody = await request.text(); - const payload = JSON.parse(rawBody); - - await verifyRequest({ request, rawBody }); - - try { - const botUserId = await getBotId(); - - const event = { - type: request.headers.get('X-Discourse-Event-Type'), - id: request.headers.get('X-Discourse-Event-Id') - }; - - console.log('got request', event.type) - - if (event.type === "notification" && payload.notification_type === 29) { - waitUntil(handleNewAppMention(payload?.notification as WebhookNotification, botUserId)); - } - - // if (event.type === "assistant_thread_started") { - // waitUntil(assistantThreadMessage(event)); - // } - - if ( - event.type === "chat_message" && - payload?.chat_message.message.user.id !== botUserId - ) { - waitUntil(handleNewAssistantMessage(payload?.chat_message as WebhookChatMessage, botUserId)); - } - - return new Response("Success!", { status: 200 }); - } catch (error) { - console.error("Error generating response", error); - return new Response("Error generating response", { status: 500 }); - } -} diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000..8b9a5ec --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,37 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "organizeImports": { + "enabled": true + }, + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignore": ["node_modules"] + }, + "formatter": { + "enabled": true, + "formatWithErrors": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "javascript": { + "formatter": { + "enabled": true, + "quoteStyle": "single", + "jsxQuoteStyle": "single", + "semicolons": "always" + } + }, + "linter": { + "enabled": true, + "rules": { + "correctness": { + "noUnusedImports": "error" + }, + "recommended": true + } + } +} diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..ae6dba8 --- /dev/null +++ b/bun.lock @@ -0,0 +1,2002 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "ai-sdk-discourse-chatbot", + "dependencies": { + "@ai-sdk/openai": "^1.3.22", + "@ai-sdk/openai-compatible": "^0.2.14", + "@date-fns/tz": "^1.2.0", + "@hey-api/client-fetch": "^0.10.1", + "@mem0/vercel-ai-provider": "^1.0.5", + "@openrouter/ai-sdk-provider": "^0.4.6", + "@t3-oss/env-core": "^0.13.4", + "@upstash/ratelimit": "^2.0.5", + "@upstash/redis": "^1.34.9", + "@vercel/functions": "^2.0.0", + "ai": "^4.3.16", + "compromise": "^14.14.4", + "date-fns": "^4.1.0", + "discourse2-chat": "^1.1.5", + "exa-js": "^1.4.10", + "nitropack": "latest", + "pino": "^9.7.0", + "pino-pretty": "^13.0.0", + "tsx": "^4.19.4", + "zod": "^3.24.2", + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@hey-api/openapi-ts": "^0.67.5", + "@types/bun": "latest", + "@types/node": "^20.11.17", + "typescript": "^5.3.3", + }, + }, + }, + "packages": { + "@ai-sdk/anthropic": ["@ai-sdk/anthropic@1.1.12", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-EygyzN8Ng5r4kj5hI2ONn1HQv0Z0NJKAQqBu4U3ZE9pKotjYuU9xkvvyteJwhQiRm4qfpqCdWHeUuC99Q30grA=="], + + "@ai-sdk/cohere": ["@ai-sdk/cohere@1.1.12", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-A5aN9hev4bGAK6v4NaXFBcFNjbtGJPrXx8bR+Fmzm7OMMKqRsAISIwfoh4RmzwThs2TpOb1ecRWYOOGIYKjfiQ=="], + + "@ai-sdk/groq": ["@ai-sdk/groq@1.1.11", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-Y5WUyWuxkQarl4AVGeIMbNSp4/XiwW/mxp9SKeagfDhflVnQHd2ggISVD6HiOBQhznusITjWYYC66DJeBn0v6A=="], + + "@ai-sdk/openai": ["@ai-sdk/openai@1.3.22", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-QwA+2EkG0QyjVR+7h6FE7iOu2ivNqAVMm9UJZkVxxTk5OIq5fFJDTEI/zICEMuHImTTXR2JjsL6EirJ28Jc4cw=="], + + "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@0.2.14", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-icjObfMCHKSIbywijaoLdZ1nSnuRnWgMEMLgwoxPJgxsUHMx0aVORnsLUid4SPtdhHI3X2masrt6iaEQLvOSFw=="], + + "@ai-sdk/provider": ["@ai-sdk/provider@1.1.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg=="], + + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.2.8", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA=="], + + "@ai-sdk/react": ["@ai-sdk/react@1.2.12", "", { "dependencies": { "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/ui-utils": "1.2.11", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["zod"] }, "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g=="], + + "@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.2.11", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.23.8" } }, "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w=="], + + "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.40.1", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-DJMWm8lTEM9Lk/MSFL+V+ugF7jKOn0M2Ujvb5fN8r2nY14aHbGPZ1k6sgjL+tpJ3VuOGJNG+4R83jEpOuYPv8w=="], + + "@ark/schema": ["@ark/schema@0.46.0", "", { "dependencies": { "@ark/util": "0.46.0" } }, "sha512-c2UQdKgP2eqqDArfBqQIJppxJHvNNXuQPeuSPlDML4rjw+f1cu0qAlzOG4b8ujgm9ctIDWwhpyw6gjG5ledIVQ=="], + + "@ark/util": ["@ark/util@0.46.0", "", {}, "sha512-JPy/NGWn/lvf1WmGCPw2VGpBg5utZraE84I7wli18EDF3p3zc/e9WolT35tINeZO3l7C77SjqRJeAUoT0CvMRg=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/parser": ["@babel/parser@7.27.2", "", { "dependencies": { "@babel/types": "^7.27.1" }, "bin": "./bin/babel-parser.js" }, "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw=="], + + "@babel/types": ["@babel/types@7.27.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q=="], + + "@biomejs/biome": ["@biomejs/biome@1.9.4", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "1.9.4", "@biomejs/cli-darwin-x64": "1.9.4", "@biomejs/cli-linux-arm64": "1.9.4", "@biomejs/cli-linux-arm64-musl": "1.9.4", "@biomejs/cli-linux-x64": "1.9.4", "@biomejs/cli-linux-x64-musl": "1.9.4", "@biomejs/cli-win32-arm64": "1.9.4", "@biomejs/cli-win32-x64": "1.9.4" }, "bin": { "biome": "bin/biome" } }, "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@1.9.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@1.9.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@1.9.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@1.9.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@1.9.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@1.9.4", "", { "os": "win32", "cpu": "x64" }, "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA=="], + + "@cfworker/json-schema": ["@cfworker/json-schema@4.1.1", "", {}, "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og=="], + + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.0", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA=="], + + "@colors/colors": ["@colors/colors@1.6.0", "", {}, "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA=="], + + "@dabh/diagnostics": ["@dabh/diagnostics@2.0.3", "", { "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", "kuler": "^2.0.0" } }, "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA=="], + + "@date-fns/tz": ["@date-fns/tz@1.2.0", "", {}, "sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg=="], + + "@dependents/detective-less": ["@dependents/detective-less@5.0.1", "", { "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" } }, "sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], + + "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], + + "@gar/promisify": ["@gar/promisify@1.1.3", "", {}, "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="], + + "@google/genai": ["@google/genai@0.7.0", "", { "dependencies": { "google-auth-library": "^9.14.2", "ws": "^8.18.0" } }, "sha512-r+Fwj/emnXZN5R+4JCxDXboY4AGTmTn7+Wnori5dgyJiStP0P82f9YYL0CVsCnDIumNY2i0UIcZ1zGZdtHJ34w=="], + + "@hey-api/client-fetch": ["@hey-api/client-fetch@0.10.1", "", { "peerDependencies": { "@hey-api/openapi-ts": "< 2" } }, "sha512-C1XZEnzvOIdXppvMcnO8/V/RpcORxA4rh+5qjuMcItkV++hv7aBz7tSLd0z+bSLFUwttec077WT/nPS+oO4BiA=="], + + "@hey-api/json-schema-ref-parser": ["@hey-api/json-schema-ref-parser@1.0.6", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0", "lodash": "^4.17.21" } }, "sha512-yktiFZoWPtEW8QKS65eqKwA5MTKp88CyiL8q72WynrBs/73SAaxlSWlA2zW/DZlywZ5hX1OYzrCC0wFdvO9c2w=="], + + "@hey-api/openapi-ts": ["@hey-api/openapi-ts@0.67.6", "", { "dependencies": { "@hey-api/json-schema-ref-parser": "1.0.6", "c12": "2.0.1", "commander": "13.0.0", "handlebars": "4.7.8" }, "peerDependencies": { "typescript": "^5.5.3" }, "bin": { "openapi-ts": "bin/index.cjs" } }, "sha512-ywZggKKYieVjM6O6T60/Bl+QBRvhcKAov8dAIQor7reyKpFbEn3Ws+9WKoXR8QUuXN8AR8nMFjOuYPer5db/dg=="], + + "@ioredis/commands": ["@ioredis/commands@1.2.0", "", {}, "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jest/expect-utils": ["@jest/expect-utils@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3" } }, "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.6", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="], + + "@langchain/core": ["@langchain/core@0.3.57", "", { "dependencies": { "@cfworker/json-schema": "^4.0.2", "ansi-styles": "^5.0.0", "camelcase": "6", "decamelize": "1.2.0", "js-tiktoken": "^1.0.12", "langsmith": "^0.3.29", "mustache": "^4.2.0", "p-queue": "^6.6.2", "p-retry": "4", "uuid": "^10.0.0", "zod": "^3.22.4", "zod-to-json-schema": "^3.22.3" } }, "sha512-jz28qCTKJmi47b6jqhQ6vYRTG5jRpqhtPQjriRTB5wR8mgvzo6xKs0fG/kExS3ZvM79ytD1npBvgf8i19xOo9Q=="], + + "@mapbox/node-pre-gyp": ["@mapbox/node-pre-gyp@2.0.0", "", { "dependencies": { "consola": "^3.2.3", "detect-libc": "^2.0.0", "https-proxy-agent": "^7.0.5", "node-fetch": "^2.6.7", "nopt": "^8.0.0", "semver": "^7.5.3", "tar": "^7.4.0" }, "bin": { "node-pre-gyp": "bin/node-pre-gyp" } }, "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg=="], + + "@mem0/vercel-ai-provider": ["@mem0/vercel-ai-provider@1.0.5", "", { "dependencies": { "@ai-sdk/anthropic": "1.1.12", "@ai-sdk/cohere": "1.1.12", "@ai-sdk/groq": "1.1.11", "@ai-sdk/openai": "1.1.15", "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10", "ai": "4.1.46", "dotenv": "^16.4.5", "mem0ai": "^2.1.12", "partial-json": "0.1.7", "zod": "^3.0.0" } }, "sha512-+TN6ePMTgj6syVQN0j3DxcjDf2dOKM9qESpm29VEaEi5voQYT0DYOMjsJnPIAO90rhU32DF+k1PrtH9WJVRcmA=="], + + "@mistralai/mistralai": ["@mistralai/mistralai@1.6.1", "", { "dependencies": { "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": ">= 3" } }, "sha512-NFAMamNFSAaLT4YhDrqEjhJALJXSheZdA5jXT6gG5ICCJRk9+WQx7vRQO1sIZNIRP+xpPyROpa7X6ZcufiucIA=="], + + "@netlify/binary-info": ["@netlify/binary-info@1.0.0", "", {}, "sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw=="], + + "@netlify/blobs": ["@netlify/blobs@9.1.2", "", { "dependencies": { "@netlify/dev-utils": "2.2.0", "@netlify/runtime-utils": "1.3.1" } }, "sha512-7dMjExSH4zj4ShvLem49mE3mf0K171Tx2pV4WDWhJbRUWW3SJIR2qntz0LvUGS97N5HO1SmnzrgWUhEXCsApiw=="], + + "@netlify/dev-utils": ["@netlify/dev-utils@2.2.0", "", { "dependencies": { "@whatwg-node/server": "^0.9.60", "chokidar": "^4.0.1", "decache": "^4.6.2", "dot-prop": "9.0.0", "env-paths": "^3.0.0", "find-up": "7.0.0", "lodash.debounce": "^4.0.8", "netlify": "^13.3.5", "parse-gitignore": "^2.0.0", "uuid": "^11.1.0", "write-file-atomic": "^6.0.0" } }, "sha512-5XUvZuffe3KetyhbWwd4n2ktd7wraocCYw10tlM+/u/95iAz29GjNiuNxbCD1T6Bn1MyGc4QLVNKOWhzJkVFAw=="], + + "@netlify/functions": ["@netlify/functions@3.1.9", "", { "dependencies": { "@netlify/blobs": "^9.1.2", "@netlify/dev-utils": "2.2.0", "@netlify/serverless-functions-api": "1.41.2", "@netlify/zip-it-and-ship-it": "^12.1.0", "cron-parser": "^4.9.0", "decache": "^4.6.2", "extract-zip": "^2.0.1", "is-stream": "^4.0.1", "jwt-decode": "^4.0.0", "lambda-local": "^2.2.0", "read-package-up": "^11.0.0", "source-map-support": "^0.5.21" } }, "sha512-mbmQIylPzOTDicMFbJF839W3bywJVR0Fm77uvjS6AkDl000VlLwQb+4eO3p0BV7j8+l5IgN/3ltQ/Byi/esTEQ=="], + + "@netlify/open-api": ["@netlify/open-api@2.37.0", "", {}, "sha512-zXnRFkxgNsalSgU8/vwTWnav3R+8KG8SsqHxqaoJdjjJtnZR7wo3f+qqu4z+WtZ/4V7fly91HFUwZ6Uz2OdW7w=="], + + "@netlify/runtime-utils": ["@netlify/runtime-utils@1.3.1", "", {}, "sha512-7/vIJlMYrPJPlEW84V2yeRuG3QBu66dmlv9neTmZ5nXzwylhBEOhy11ai+34A8mHCSZI4mKns25w3HM9kaDdJg=="], + + "@netlify/serverless-functions-api": ["@netlify/serverless-functions-api@1.41.2", "", {}, "sha512-pfCkH50JV06SGMNsNPjn8t17hOcId4fA881HeYQgMBOrewjsw4csaYgHEnCxCEu24Y5x75E2ULbFpqm9CvRCqw=="], + + "@netlify/zip-it-and-ship-it": ["@netlify/zip-it-and-ship-it@12.1.0", "", { "dependencies": { "@babel/parser": "^7.22.5", "@babel/types": "7.27.1", "@netlify/binary-info": "^1.0.0", "@netlify/serverless-functions-api": "^1.41.2", "@vercel/nft": "0.29.3", "archiver": "^7.0.0", "common-path-prefix": "^3.0.0", "copy-file": "^11.0.0", "es-module-lexer": "^1.0.0", "esbuild": "0.25.4", "execa": "^8.0.0", "fast-glob": "^3.3.2", "filter-obj": "^6.0.0", "find-up": "^7.0.0", "glob": "^8.0.3", "is-builtin-module": "^3.1.0", "is-path-inside": "^4.0.0", "junk": "^4.0.0", "locate-path": "^7.0.0", "merge-options": "^3.0.4", "minimatch": "^9.0.0", "normalize-path": "^3.0.0", "p-map": "^7.0.0", "path-exists": "^5.0.0", "precinct": "^12.0.0", "require-package-name": "^2.0.1", "resolve": "^2.0.0-next.1", "semver": "^7.3.8", "tmp-promise": "^3.0.2", "toml": "^3.0.0", "unixify": "^1.0.0", "urlpattern-polyfill": "8.0.2", "yargs": "^17.0.0", "zod": "^3.23.8" }, "bin": { "zip-it-and-ship-it": "./bin.js" } }, "sha512-+ND2fNnfeOZwnho79aMQ5rreFpI9tu/l4N9/F5H8t9rKYwVHHlv5Zi9o6g/gxZHDLfSbGC9th7Z46CihV8JaZw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@npmcli/fs": ["@npmcli/fs@1.1.1", "", { "dependencies": { "@gar/promisify": "^1.0.1", "semver": "^7.3.5" } }, "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ=="], + + "@npmcli/move-file": ["@npmcli/move-file@1.1.2", "", { "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg=="], + + "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@0.4.6", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-oUa8xtssyUhiKEU/aW662lsZ0HUvIUTRk8vVIF3Ha3KI/DnqX54zmVIuzYnaDpermqhy18CHqblAY4dDt1JW3g=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + + "@parcel/watcher-wasm": ["@parcel/watcher-wasm@2.5.1", "", { "dependencies": { "is-glob": "^4.0.3", "micromatch": "^4.0.5", "napi-wasm": "^1.1.0" } }, "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@poppinss/colors": ["@poppinss/colors@4.1.4", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-FA+nTU8p6OcSH4tLDY5JilGYr1bVWHpNmcLr7xmMEdbWmKHa+3QZ+DqefrXKmdjO/brHTnQZo20lLSjaO7ydog=="], + + "@poppinss/dumper": ["@poppinss/dumper@0.6.3", "", { "dependencies": { "@poppinss/colors": "^4.1.4", "@sindresorhus/is": "^7.0.1", "supports-color": "^10.0.0" } }, "sha512-iombbn8ckOixMtuV1p3f8jN6vqhXefNjJttoPaJDMeIk/yIGhkkL3OrHkEjE9SRsgoAx1vBUU2GtgggjvA5hCA=="], + + "@poppinss/exception": ["@poppinss/exception@1.2.1", "", {}, "sha512-aQypoot0HPSJa6gDPEPTntc1GT6QINrSbgRlRhadGW2WaYqUK3tK4Bw9SBMZXhmxd3GeAlZjVcODHgiu+THY7A=="], + + "@qdrant/js-client-rest": ["@qdrant/js-client-rest@1.13.0", "", { "dependencies": { "@qdrant/openapi-typescript-fetch": "1.2.6", "@sevinf/maybe": "0.5.0", "undici": "~5.28.4" }, "peerDependencies": { "typescript": ">=4.7" } }, "sha512-bewMtnXlGvhhnfXsp0sLoLXOGvnrCM15z9lNlG0Snp021OedNAnRtKkerjk5vkOcbQWUmJHXYCuxDfcT93aSkA=="], + + "@qdrant/openapi-typescript-fetch": ["@qdrant/openapi-typescript-fetch@1.2.6", "", {}, "sha512-oQG/FejNpItrxRHoyctYvT3rwGZOnK4jr3JdppO/c78ktDvkWiPXPHNsrDf33K9sZdRb6PR7gi4noIapu5q4HA=="], + + "@redis/bloom": ["@redis/bloom@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg=="], + + "@redis/client": ["@redis/client@1.6.1", "", { "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", "yallist": "4.0.0" } }, "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw=="], + + "@redis/graph": ["@redis/graph@1.1.1", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw=="], + + "@redis/json": ["@redis/json@1.0.7", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ=="], + + "@redis/search": ["@redis/search@1.2.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw=="], + + "@redis/time-series": ["@redis/time-series@1.1.0", "", { "peerDependencies": { "@redis/client": "^1.0.0" } }, "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g=="], + + "@rollup/plugin-alias": ["@rollup/plugin-alias@5.1.1", "", { "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ=="], + + "@rollup/plugin-commonjs": ["@rollup/plugin-commonjs@28.0.3", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ=="], + + "@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="], + + "@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="], + + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA=="], + + "@rollup/plugin-replace": ["@rollup/plugin-replace@6.0.2", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ=="], + + "@rollup/plugin-terser": ["@rollup/plugin-terser@0.4.4", "", { "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.41.1", "", { "os": "android", "cpu": "arm" }, "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.41.1", "", { "os": "android", "cpu": "arm64" }, "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.41.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.41.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.41.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.41.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.41.1", "", { "os": "linux", "cpu": "arm" }, "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.41.1", "", { "os": "linux", "cpu": "arm" }, "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.41.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.41.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.41.1", "", { "os": "linux", "cpu": "none" }, "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.41.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.41.1", "", { "os": "linux", "cpu": "none" }, "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.41.1", "", { "os": "linux", "cpu": "none" }, "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.41.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.41.1", "", { "os": "linux", "cpu": "x64" }, "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.41.1", "", { "os": "linux", "cpu": "x64" }, "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.41.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.41.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.41.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw=="], + + "@sevinf/maybe": ["@sevinf/maybe@0.5.0", "", {}, "sha512-ARhyoYDnY1LES3vYI0fiG6e9esWfTNcXcO6+MPJJXcnyMV3bim4lnFt45VXouV7y82F4x3YH8nOQ6VztuvUiWg=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "@sindresorhus/is": ["@sindresorhus/is@7.0.1", "", {}, "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@2.3.0", "", {}, "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="], + + "@speed-highlight/core": ["@speed-highlight/core@1.2.7", "", {}, "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g=="], + + "@supabase/auth-js": ["@supabase/auth-js@2.69.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-FILtt5WjCNzmReeRLq5wRs3iShwmnWgBvxHfqapC/VoljJl+W8hDAyFmf1NVw3zH+ZjZ05AKxiKxVeb0HNWRMQ=="], + + "@supabase/functions-js": ["@supabase/functions-js@2.4.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-WL2p6r4AXNGwop7iwvul2BvOtuJ1YQy8EbOd0dhG1oN1q8el/BIRSFCFnWAMM/vJJlHWLi4ad22sKbKr9mvjoA=="], + + "@supabase/node-fetch": ["@supabase/node-fetch@2.6.15", "", { "dependencies": { "whatwg-url": "^5.0.0" } }, "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ=="], + + "@supabase/postgrest-js": ["@supabase/postgrest-js@1.19.4", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-O4soKqKtZIW3olqmbXXbKugUtByD2jPa8kL2m2c1oozAO11uCcGrRhkZL0kVxjBLrXHE0mdSkFsMj7jDSfyNpw=="], + + "@supabase/realtime-js": ["@supabase/realtime-js@2.11.2", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14", "@types/phoenix": "^1.5.4", "@types/ws": "^8.5.10", "ws": "^8.18.0" } }, "sha512-u/XeuL2Y0QEhXSoIPZZwR6wMXgB+RQbJzG9VErA3VghVt7uRfSVsjeqd7m5GhX3JR6dM/WRmLbVR8URpDWG4+w=="], + + "@supabase/storage-js": ["@supabase/storage-js@2.7.1", "", { "dependencies": { "@supabase/node-fetch": "^2.6.14" } }, "sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA=="], + + "@supabase/supabase-js": ["@supabase/supabase-js@2.49.8", "", { "dependencies": { "@supabase/auth-js": "2.69.1", "@supabase/functions-js": "2.4.4", "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "1.19.4", "@supabase/realtime-js": "2.11.2", "@supabase/storage-js": "2.7.1" } }, "sha512-zzBQLgS/jZs7btWcIAc7V5yfB+juG7h0AXxKowMJuySsO5vK+F7Vp+HCa07Z+tu9lZtr3sT9fofkc86bdylmtw=="], + + "@t3-oss/env-core": ["@t3-oss/env-core@0.13.4", "", { "peerDependencies": { "arktype": "^2.1.0", "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0 || ^4.0.0-beta.0" }, "optionalPeers": ["typescript", "valibot", "zod"] }, "sha512-zVOiYO0+CF7EnBScz8s0O5JnJLPTU0lrUi8qhKXfIxIJXvI/jcppSiXXsEJwfB4A6XZawY/Wg/EQGKANi/aPmQ=="], + + "@tootallnate/once": ["@tootallnate/once@1.1.2", "", {}, "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="], + + "@types/bun": ["@types/bun@1.2.14", "", { "dependencies": { "bun-types": "1.2.14" } }, "sha512-VsFZKs8oKHzI7zwvECiAJ5oSorWndIWEVhfbYqZd4HI/45kzW7PN2Rr5biAzvGvRuNmYLSANY+H59ubHq8xw7Q=="], + + "@types/diff-match-patch": ["@types/diff-match-patch@1.0.36", "", {}, "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg=="], + + "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/jest": ["@types/jest@29.5.14", "", { "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/node": ["@types/node@20.17.50", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-Mxiq0ULv/zo1OzOhwPqOA13I81CV/W3nvd3ChtQZRT5Cwz3cr0FKo/wMSsbTqL3EXpaBAEQhva2B8ByRkOIh9A=="], + + "@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="], + + "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], + + "@types/pg": ["@types/pg@8.11.0", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^4.0.1" } }, "sha512-sDAlRiBNthGjNFfvt0k6mtotoVYVQ63pA8R4EMWka7crawSR60waVYR0HAgmPRs/e2YaeJTD/43OoZ3PFw80pw=="], + + "@types/phoenix": ["@types/phoenix@1.6.6", "", {}, "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A=="], + + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], + + "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="], + + "@types/sqlite3": ["@types/sqlite3@3.1.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-KYF+QgxAnnAh7DWPdNDroxkDI3/MspH1NMx6m/N/6fT1G6+jvsw4/ZePt8R8cr7ta58aboeTfYFBDxTJ5yv15w=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + + "@types/triple-beam": ["@types/triple-beam@1.3.5", "", {}, "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="], + + "@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="], + + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], + + "@upstash/core-analytics": ["@upstash/core-analytics@0.0.10", "", { "dependencies": { "@upstash/redis": "^1.28.3" } }, "sha512-7qJHGxpQgQr9/vmeS1PktEwvNAF7TI4iJDi8Pu2CFZ9YUGHZH4fOP5TfYlZ4aVxfopnELiE4BS4FBjyK7V1/xQ=="], + + "@upstash/ratelimit": ["@upstash/ratelimit@2.0.5", "", { "dependencies": { "@upstash/core-analytics": "^0.0.10" }, "peerDependencies": { "@upstash/redis": "^1.34.3" } }, "sha512-1FRv0cs3ZlBjCNOCpCmKYmt9BYGIJf0J0R3pucOPE88R21rL7jNjXG+I+rN/BVOvYJhI9niRAS/JaSNjiSICxA=="], + + "@upstash/redis": ["@upstash/redis@1.34.9", "", { "dependencies": { "crypto-js": "^4.2.0" } }, "sha512-7qzzF2FQP5VxR2YUNjemWs+hl/8VzJJ6fOkT7O7kt9Ct8olEVzb1g6/ik6B8Pb8W7ZmYv81SdlVV9F6O8bh/gw=="], + + "@vercel/functions": ["@vercel/functions@2.1.0", "", { "peerDependencies": { "@aws-sdk/credential-provider-web-identity": "*" }, "optionalPeers": ["@aws-sdk/credential-provider-web-identity"] }, "sha512-1gSbK9zfrbJxk1JTBVERDhLi01mK3fz+gw4GjOjZwHnqs0zsBhQA70HGVtXQX/Z3BTRMfbpAEMVDfhecRw0lDA=="], + + "@vercel/nft": ["@vercel/nft@0.29.3", "", { "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", "@rollup/pluginutils": "^5.1.3", "acorn": "^8.6.0", "acorn-import-attributes": "^1.9.5", "async-sema": "^3.1.1", "bindings": "^1.4.0", "estree-walker": "2.0.2", "glob": "^10.4.5", "graceful-fs": "^4.2.9", "node-gyp-build": "^4.2.2", "picomatch": "^4.0.2", "resolve-from": "^5.0.0" }, "bin": { "nft": "out/cli.js" } }, "sha512-aVV0E6vJpuvImiMwU1/5QKkw2N96BRFE7mBYGS7FhXUoS6V7SarQ+8tuj33o7ofECz8JtHpmQ9JW+oVzOoB7MA=="], + + "@vue/compiler-core": ["@vue/compiler-core@3.5.14", "", { "dependencies": { "@babel/parser": "^7.27.2", "@vue/shared": "3.5.14", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA=="], + + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.14", "", { "dependencies": { "@vue/compiler-core": "3.5.14", "@vue/shared": "3.5.14" } }, "sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug=="], + + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.14", "", { "dependencies": { "@babel/parser": "^7.27.2", "@vue/compiler-core": "3.5.14", "@vue/compiler-dom": "3.5.14", "@vue/compiler-ssr": "3.5.14", "@vue/shared": "3.5.14", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.3", "source-map-js": "^1.2.1" } }, "sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA=="], + + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.14", "", { "dependencies": { "@vue/compiler-dom": "3.5.14", "@vue/shared": "3.5.14" } }, "sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q=="], + + "@vue/shared": ["@vue/shared@3.5.14", "", {}, "sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ=="], + + "@whatwg-node/disposablestack": ["@whatwg-node/disposablestack@0.0.6", "", { "dependencies": { "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.6.3" } }, "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw=="], + + "@whatwg-node/fetch": ["@whatwg-node/fetch@0.10.8", "", { "dependencies": { "@whatwg-node/node-fetch": "^0.7.21", "urlpattern-polyfill": "^10.0.0" } }, "sha512-Rw9z3ctmeEj8QIB9MavkNJqekiu9usBCSMZa+uuAvM0lF3v70oQVCXNppMIqaV6OTZbdaHF1M2HLow58DEw+wg=="], + + "@whatwg-node/node-fetch": ["@whatwg-node/node-fetch@0.7.21", "", { "dependencies": { "@fastify/busboy": "^3.1.1", "@whatwg-node/disposablestack": "^0.0.6", "@whatwg-node/promise-helpers": "^1.3.2", "tslib": "^2.6.3" } }, "sha512-QC16IdsEyIW7kZd77aodrMO7zAoDyyqRCTLg+qG4wqtP4JV9AA+p7/lgqMdD29XyiYdVvIdFrfI9yh7B1QvRvw=="], + + "@whatwg-node/promise-helpers": ["@whatwg-node/promise-helpers@1.3.2", "", { "dependencies": { "tslib": "^2.6.3" } }, "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA=="], + + "@whatwg-node/server": ["@whatwg-node/server@0.9.71", "", { "dependencies": { "@whatwg-node/disposablestack": "^0.0.6", "@whatwg-node/fetch": "^0.10.5", "@whatwg-node/promise-helpers": "^1.2.2", "tslib": "^2.6.3" } }, "sha512-ueFCcIPaMgtuYDS9u0qlUoEvj6GiSsKrwnOLPp9SshqjtcRaR1IEHRjoReq3sXNydsF5i0ZnmuYgXq9dV53t0g=="], + + "abbrev": ["abbrev@3.0.1", "", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + + "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + + "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], + + "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], + + "ai": ["ai@4.3.16", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/react": "1.2.12", "@ai-sdk/ui-utils": "1.2.11", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-KUDwlThJ5tr2Vw0A1ZkbDKNME3wzWhuVfAOwIvFUzl1TPVDFAXDFTXio3p+jaKneB+dKNCvFFlolYmmgHttG1g=="], + + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ajv-errors": ["ajv-errors@3.0.0", "", { "peerDependencies": { "ajv": "^8.0.1" } }, "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ=="], + + "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "aproba": ["aproba@2.0.0", "", {}, "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="], + + "archiver": ["archiver@7.0.1", "", { "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", "readable-stream": "^4.0.0", "readdir-glob": "^1.1.2", "tar-stream": "^3.0.0", "zip-stream": "^6.0.1" } }, "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ=="], + + "archiver-utils": ["archiver-utils@5.0.2", "", { "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", "is-stream": "^2.0.1", "lazystream": "^1.0.0", "lodash": "^4.17.15", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA=="], + + "are-we-there-yet": ["are-we-there-yet@3.0.1", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" } }, "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "arktype": ["arktype@2.1.20", "", { "dependencies": { "@ark/schema": "0.46.0", "@ark/util": "0.46.0" } }, "sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q=="], + + "ast-module-types": ["ast-module-types@6.0.1", "", {}, "sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-sema": ["async-sema@3.1.1", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + + "axios": ["axios@1.7.7", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q=="], + + "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="], + + "base-64": ["base-64@0.1.0", "", {}, "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bignumber.js": ["bignumber.js@9.3.0", "", {}, "sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "buffer-writer": ["buffer-writer@2.0.0", "", {}, "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="], + + "builtin-modules": ["builtin-modules@3.3.0", "", {}, "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw=="], + + "bun-types": ["bun-types@1.2.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-Kuh4Ub28ucMRWeiUUWMHsT9Wcbr4H3kLIO72RZZElSDxSu7vpetRvxIUDUaW6QtaIeixIpm7OXtNnZPf82EzwA=="], + + "c12": ["c12@2.0.1", "", { "dependencies": { "chokidar": "^4.0.1", "confbox": "^0.1.7", "defu": "^6.1.4", "dotenv": "^16.4.5", "giget": "^1.2.3", "jiti": "^2.3.0", "mlly": "^1.7.1", "ohash": "^1.1.4", "pathe": "^1.1.2", "perfect-debounce": "^1.0.0", "pkg-types": "^1.2.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A=="], + + "cacache": ["cacache@15.3.0", "", { "dependencies": { "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", "infer-owner": "^1.0.4", "lru-cache": "^6.0.0", "minipass": "^3.1.1", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" } }, "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsite": ["callsite@1.0.0", "", {}, "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "charenc": ["charenc@0.0.2", "", {}, "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + + "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], + + "clipboardy": ["clipboardy@4.0.0", "", { "dependencies": { "execa": "^8.0.1", "is-wsl": "^3.1.0", "is64bit": "^2.0.0" } }, "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], + + "color": ["color@3.2.1", "", { "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" } }, "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], + + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "colorspace": ["colorspace@1.1.4", "", { "dependencies": { "color": "^3.1.3", "text-hex": "1.0.x" } }, "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@13.0.0", "", {}, "sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ=="], + + "common-path-prefix": ["common-path-prefix@3.0.0", "", {}, "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "compatx": ["compatx@0.2.0", "", {}, "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA=="], + + "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], + + "compromise": ["compromise@14.14.4", "", { "dependencies": { "efrt": "2.7.0", "grad-school": "0.0.5", "suffix-thumb": "5.0.2" } }, "sha512-QdbJwronwxeqb7a5KFK/+Y5YieZ4PE1f7ai0vU58Pp4jih+soDCBMuKVbhDEPQ+6+vI3vSiG4UAAjTAXLJw1Qw=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], + + "console-table-printer": ["console-table-printer@2.13.0", "", { "dependencies": { "simple-wcswidth": "^1.0.1" } }, "sha512-Wl1rFO1NLonYBBjrdF2SMCnfNrKr8PPooPSnQBRX3LTJsnyGjBzLcwffo8wSKuJ0kr/rgC2Ltxb3Bpb072VA9w=="], + + "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + + "cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="], + + "copy-file": ["copy-file@11.0.0", "", { "dependencies": { "graceful-fs": "^4.2.11", "p-event": "^6.0.0" } }, "sha512-mFsNh/DIANLqFt5VHZoGirdg7bK5+oTWlhnGu6tgRhzBlnEKWaPX2xrFaLltii/6rmhqFMJqffUgknuRdpYlHw=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "crc-32": ["crc-32@1.2.2", "", { "bin": { "crc32": "bin/crc32.njs" } }, "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="], + + "crc32-stream": ["crc32-stream@6.0.0", "", { "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" } }, "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g=="], + + "cron-parser": ["cron-parser@4.9.0", "", { "dependencies": { "luxon": "^3.2.1" } }, "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q=="], + + "croner": ["croner@9.0.0", "", {}, "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA=="], + + "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], + + "crypt": ["crypt@0.0.2", "", {}, "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="], + + "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + + "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], + + "dateformat": ["dateformat@4.6.3", "", {}, "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="], + + "db0": ["db0@0.3.2", "", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "decache": ["decache@4.6.2", "", { "dependencies": { "callsite": "^1.0.0" } }, "sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw=="], + + "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], + + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], + + "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + + "denque": ["denque@2.1.0", "", {}, "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="], + + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + + "detective-amd": ["detective-amd@6.0.1", "", { "dependencies": { "ast-module-types": "^6.0.1", "escodegen": "^2.1.0", "get-amd-module-type": "^6.0.1", "node-source-walk": "^7.0.1" }, "bin": { "detective-amd": "bin/cli.js" } }, "sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g=="], + + "detective-cjs": ["detective-cjs@6.0.1", "", { "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" } }, "sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw=="], + + "detective-es6": ["detective-es6@5.0.1", "", { "dependencies": { "node-source-walk": "^7.0.1" } }, "sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew=="], + + "detective-postcss": ["detective-postcss@7.0.1", "", { "dependencies": { "is-url": "^1.2.4", "postcss-values-parser": "^6.0.2" }, "peerDependencies": { "postcss": "^8.4.47" } }, "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ=="], + + "detective-sass": ["detective-sass@6.0.1", "", { "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" } }, "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw=="], + + "detective-scss": ["detective-scss@5.0.1", "", { "dependencies": { "gonzales-pe": "^4.3.0", "node-source-walk": "^7.0.1" } }, "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg=="], + + "detective-stylus": ["detective-stylus@5.0.1", "", {}, "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA=="], + + "detective-typescript": ["detective-typescript@14.0.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "^8.23.0", "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" }, "peerDependencies": { "typescript": "^5.4.4" } }, "sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw=="], + + "detective-vue2": ["detective-vue2@2.2.0", "", { "dependencies": { "@dependents/detective-less": "^5.0.1", "@vue/compiler-sfc": "^3.5.13", "detective-es6": "^5.0.1", "detective-sass": "^6.0.1", "detective-scss": "^5.0.1", "detective-stylus": "^5.0.1", "detective-typescript": "^14.0.0" }, "peerDependencies": { "typescript": "^5.4.4" } }, "sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA=="], + + "diff-match-patch": ["diff-match-patch@1.0.5", "", {}, "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw=="], + + "diff-sequences": ["diff-sequences@29.6.3", "", {}, "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="], + + "digest-fetch": ["digest-fetch@1.3.0", "", { "dependencies": { "base-64": "^0.1.0", "md5": "^2.3.0" } }, "sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA=="], + + "discourse2-chat": ["discourse2-chat@1.1.5", "", { "dependencies": { "ajv": "^8.17.1", "ajv-errors": "^3.0.0", "ajv-formats": "^3.0.1", "openapi-types": "^12.1.3" } }, "sha512-VbyHRV6C6uyYc5PMbgNjTm0FTm1tb2jJh75wKB+51xC6zhbFoJ8QmxlYHRfuw0Ct9M1xTkwqW8g/176rbx3eSg=="], + + "dot-prop": ["dot-prop@9.0.0", "", { "dependencies": { "type-fest": "^4.18.2" } }, "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ=="], + + "dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "efrt": ["efrt@2.7.0", "", {}, "sha512-/RInbCy1d4P6Zdfa+TMVsf/ufZVotat5hCw3QXmWtjU+3pFEOvOQ7ibo3aIxyCJw2leIeAMjmPj+1SLJiCpdrQ=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "enabled": ["enabled@2.0.0", "", {}, "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="], + + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], + + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "eventsource-parser": ["eventsource-parser@3.0.2", "", {}, "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA=="], + + "exa-js": ["exa-js@1.7.2", "", { "dependencies": { "cross-fetch": "~4.1.0", "dotenv": "~16.4.7" } }, "sha512-bNo1AfjZa9749CAKiFWex19/LjmthboT4+wNeRUJS+BNCeJcFR4tnMzoTg+MWOzHSaL/bSFQqDWy0PelZCK9QA=="], + + "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], + + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + + "expect": ["expect@29.7.0", "", { "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw=="], + + "exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "fast-copy": ["fast-copy@3.0.2", "", {}, "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], + + "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], + + "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="], + + "fecha": ["fecha@4.2.3", "", {}, "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="], + + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "filter-obj": ["filter-obj@6.1.0", "", {}, "sha512-xdMtCAODmPloU9qtmPcdBV9Kd27NtMse+4ayThxqIHUES5Z2S6bGpap5PpdmNM56ub7y3i1eyr+vJJIIgWGKmA=="], + + "find-up": ["find-up@7.0.0", "", { "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", "unicorn-magic": "^0.1.0" } }, "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g=="], + + "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], + + "fn.name": ["fn.name@1.1.0", "", {}, "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="], + + "form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="], + + "formdata-node": ["formdata-node@4.4.1", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" } }, "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ=="], + + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + + "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gauge": ["gauge@4.0.4", "", { "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" } }, "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg=="], + + "gaxios": ["gaxios@6.7.1", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", "uuid": "^9.0.1" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="], + + "gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], + + "generic-pool": ["generic-pool@3.9.0", "", {}, "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="], + + "get-amd-module-type": ["get-amd-module-type@6.0.1", "", { "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" } }, "sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-port-please": ["get-port-please@3.1.2", "", {}, "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], + + "giget": ["giget@1.2.5", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.5.4", "pathe": "^2.0.3", "tar": "^6.2.1" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + + "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "globby": ["globby@14.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", "ignore": "^7.0.3", "path-type": "^6.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.3.0" } }, "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA=="], + + "gonzales-pe": ["gonzales-pe@4.3.0", "", { "dependencies": { "minimist": "^1.2.5" }, "bin": { "gonzales": "bin/gonzales.js" } }, "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ=="], + + "google-auth-library": ["google-auth-library@9.15.1", "", { "dependencies": { "base64-js": "^1.3.0", "ecdsa-sig-formatter": "^1.0.11", "gaxios": "^6.1.1", "gcp-metadata": "^6.1.0", "gtoken": "^7.0.0", "jws": "^4.0.0" } }, "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng=="], + + "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "grad-school": ["grad-school@0.0.5", "", {}, "sha512-rXunEHF9M9EkMydTBux7+IryYXEZinRk6g8OBOGDBzo/qWJjhTxy86i5q7lQYpCLHN8Sqv1XX3OIOc7ka2gtvQ=="], + + "groq-sdk": ["groq-sdk@0.3.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "digest-fetch": "^1.3.0", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7", "web-streams-polyfill": "^3.2.1" } }, "sha512-Cdgjh4YoSBE2X4S9sxPGXaAy1dlN4bRtAaDZ3cnq+XsxhhN9WSBeHF64l7LWwuD5ntmw7YC5Vf4Ff1oHCg1LOg=="], + + "gtoken": ["gtoken@7.1.0", "", { "dependencies": { "gaxios": "^6.0.0", "jws": "^4.0.0" } }, "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw=="], + + "gzip-size": ["gzip-size@7.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA=="], + + "h3": ["h3@1.15.3", "", { "dependencies": { "cookie-es": "^1.2.2", "crossws": "^0.3.4", "defu": "^6.1.4", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.0", "radix3": "^1.1.2", "ufo": "^1.6.1", "uncrypto": "^0.1.3" } }, "sha512-z6GknHqyX0h9aQaTx22VZDf6QyZn+0Nh+Ym8O/u0SGSkyF5cuTJYKlc8MkzW3Nzf9LE1ivcpmYC3FUGpywhuUQ=="], + + "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "help-me": ["help-me@5.0.0", "", {}, "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="], + + "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "http-proxy-agent": ["http-proxy-agent@4.0.1", "", { "dependencies": { "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } }, "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg=="], + + "http-shutdown": ["http-shutdown@1.2.2", "", {}, "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "httpxy": ["httpxy@0.1.7", "", {}, "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ=="], + + "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], + + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "index-to-position": ["index-to-position@1.1.0", "", {}, "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg=="], + + "infer-owner": ["infer-owner@1.0.4", "", {}, "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "ioredis": ["ioredis@5.6.1", "", { "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA=="], + + "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + + "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + + "is-builtin-module": ["is-builtin-module@3.2.1", "", { "dependencies": { "builtin-modules": "^3.3.0" } }, "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="], + + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], + + "is-plain-obj": ["is-plain-obj@2.1.0", "", {}, "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="], + + "is-reference": ["is-reference@1.2.1", "", { "dependencies": { "@types/estree": "*" } }, "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ=="], + + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + + "is-url": ["is-url@1.2.4", "", {}, "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="], + + "is-url-superb": ["is-url-superb@4.0.0", "", {}, "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA=="], + + "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], + + "is64bit": ["is64bit@2.0.0", "", { "dependencies": { "system-architecture": "^0.1.0" } }, "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jest-diff": ["jest-diff@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw=="], + + "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], + + "jest-matcher-utils": ["jest-matcher-utils@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g=="], + + "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="], + + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], + + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], + + "js-tiktoken": ["js-tiktoken@1.0.20", "", { "dependencies": { "base64-js": "^1.5.1" } }, "sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A=="], + + "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsbn": ["jsbn@1.1.0", "", {}, "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="], + + "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], + + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "jsondiffpatch": ["jsondiffpatch@0.6.0", "", { "dependencies": { "@types/diff-match-patch": "^1.0.36", "chalk": "^5.3.0", "diff-match-patch": "^1.0.5" }, "bin": { "jsondiffpatch": "bin/jsondiffpatch.js" } }, "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ=="], + + "junk": ["junk@4.0.1", "", {}, "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ=="], + + "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], + + "jws": ["jws@4.0.0", "", { "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg=="], + + "jwt-decode": ["jwt-decode@4.0.0", "", {}, "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA=="], + + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + + "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], + + "knitwork": ["knitwork@1.2.0", "", {}, "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg=="], + + "kuler": ["kuler@2.0.0", "", {}, "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="], + + "lambda-local": ["lambda-local@2.2.0", "", { "dependencies": { "commander": "^10.0.1", "dotenv": "^16.3.1", "winston": "^3.10.0" }, "bin": { "lambda-local": "build/cli.js" } }, "sha512-bPcgpIXbHnVGfI/omZIlgucDqlf4LrsunwoKue5JdZeGybt8L6KyJz2Zu19ffuZwIwLj2NAI2ZyaqNT6/cetcg=="], + + "langsmith": ["langsmith@0.3.29", "", { "dependencies": { "@types/uuid": "^10.0.0", "chalk": "^4.1.2", "console-table-printer": "^2.12.1", "p-queue": "^6.6.2", "p-retry": "4", "semver": "^7.6.3", "uuid": "^10.0.0" }, "peerDependencies": { "openai": "*" }, "optionalPeers": ["openai"] }, "sha512-JPF2B339qpYy9FyuY4Yz1aWYtgPlFc/a+VTj3L/JcFLHCiMP7+Ig8I9jO+o1QwVa+JU3iugL1RS0wwc+Glw0zA=="], + + "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], + + "listhen": ["listhen@1.9.0", "", { "dependencies": { "@parcel/watcher": "^2.4.1", "@parcel/watcher-wasm": "^2.4.1", "citty": "^0.1.6", "clipboardy": "^4.0.0", "consola": "^3.2.3", "crossws": ">=0.2.0 <0.4.0", "defu": "^6.1.4", "get-port-please": "^3.1.2", "h3": "^1.12.0", "http-shutdown": "^1.2.2", "jiti": "^2.1.2", "mlly": "^1.7.1", "node-forge": "^1.3.1", "pathe": "^1.1.2", "std-env": "^3.7.0", "ufo": "^1.5.4", "untun": "^0.1.3", "uqr": "^0.1.2" }, "bin": { "listen": "bin/listhen.mjs", "listhen": "bin/listhen.mjs" } }, "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg=="], + + "local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="], + + "locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash-es": ["lodash-es@4.17.21", "", {}, "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], + + "lodash.isarguments": ["lodash.isarguments@3.1.0", "", {}, "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="], + + "logform": ["logform@2.7.0", "", { "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" } }, "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ=="], + + "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "luxon": ["luxon@3.6.1", "", {}, "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], + + "make-fetch-happen": ["make-fetch-happen@9.1.0", "", { "dependencies": { "agentkeepalive": "^4.1.3", "cacache": "^15.2.0", "http-cache-semantics": "^4.1.0", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^6.0.0", "minipass": "^3.1.3", "minipass-collect": "^1.0.2", "minipass-fetch": "^1.3.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.2", "promise-retry": "^2.0.1", "socks-proxy-agent": "^6.0.0", "ssri": "^8.0.0" } }, "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "md5": ["md5@2.3.0", "", { "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g=="], + + "mem0ai": ["mem0ai@2.1.26", "", { "dependencies": { "axios": "1.7.7", "openai": "^4.93.0", "uuid": "9.0.1", "zod": "^3.24.1" }, "peerDependencies": { "@anthropic-ai/sdk": "^0.40.1", "@google/genai": "^0.7.0", "@langchain/core": "^0.3.44", "@mistralai/mistralai": "^1.5.2", "@qdrant/js-client-rest": "1.13.0", "@supabase/supabase-js": "^2.49.1", "@types/jest": "29.5.14", "@types/pg": "8.11.0", "@types/sqlite3": "3.1.11", "groq-sdk": "0.3.0", "neo4j-driver": "^5.28.1", "ollama": "^0.5.14", "pg": "8.11.3", "redis": "^4.6.13", "sqlite3": "5.1.7" } }, "sha512-c2O3WYNcFTGKCVlPu0gbPrauGX509szuO9wpj138fH2Pol6QhsJomSyh2n5G894OZnAZkRftM4q+GGOIGa7TOg=="], + + "merge-options": ["merge-options@3.0.4", "", { "dependencies": { "is-plain-obj": "^2.1.0" } }, "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micro-api-client": ["micro-api-client@3.3.0", "", {}, "sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@4.0.7", "", { "bin": { "mime": "bin/cli.js" } }, "sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ=="], + + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + + "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minipass-collect": ["minipass-collect@1.0.2", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA=="], + + "minipass-fetch": ["minipass-fetch@1.4.1", "", { "dependencies": { "minipass": "^3.1.0", "minipass-sized": "^1.0.3", "minizlib": "^2.0.0" }, "optionalDependencies": { "encoding": "^0.1.12" } }, "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw=="], + + "minipass-flush": ["minipass-flush@1.0.5", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="], + + "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="], + + "minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], + + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + + "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], + + "module-definition": ["module-definition@6.0.1", "", { "dependencies": { "ast-module-types": "^6.0.1", "node-source-walk": "^7.0.1" }, "bin": { "module-definition": "bin/cli.js" } }, "sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mustache": ["mustache@4.2.0", "", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "neo4j-driver": ["neo4j-driver@5.28.1", "", { "dependencies": { "neo4j-driver-bolt-connection": "5.28.1", "neo4j-driver-core": "5.28.1", "rxjs": "^7.8.1" } }, "sha512-jbyBwyM0a3RLGcP43q3hIxPUPxA+1bE04RovOKdNAS42EtBMVCKcPSeOvWiHxgXp1ZFd0a8XqK+7LtguInOLUg=="], + + "neo4j-driver-bolt-connection": ["neo4j-driver-bolt-connection@5.28.1", "", { "dependencies": { "buffer": "^6.0.3", "neo4j-driver-core": "5.28.1", "string_decoder": "^1.3.0" } }, "sha512-nY8GBhjOW7J0rDtpiyJn6kFdk2OiNVZZhZrO8//mwNXnf5VQJ6HqZQTDthH/9pEaX0Jvbastz1xU7ZL8xzqY0w=="], + + "neo4j-driver-core": ["neo4j-driver-core@5.28.1", "", {}, "sha512-14vN8TlxC0JvJYfjWic5PwjsZ38loQLOKFTXwk4fWLTbCk6VhrhubB2Jsy9Rz+gM6PtTor4+6ClBEFDp1q/c8g=="], + + "netlify": ["netlify@13.3.5", "", { "dependencies": { "@netlify/open-api": "^2.37.0", "lodash-es": "^4.17.21", "micro-api-client": "^3.3.0", "node-fetch": "^3.0.0", "p-wait-for": "^5.0.0", "qs": "^6.9.6" } }, "sha512-Nc3loyVASW59W+8fLDZT1lncpG7llffyZ2o0UQLx/Fr20i7P8oP+lE7+TEcFvXj9IUWU6LjB9P3BH+iFGyp+mg=="], + + "nitropack": ["nitropack@2.11.12", "", { "dependencies": { "@cloudflare/kv-asset-handler": "^0.4.0", "@netlify/functions": "^3.1.8", "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.3", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-replace": "^6.0.2", "@rollup/plugin-terser": "^0.4.4", "@vercel/nft": "^0.29.2", "archiver": "^7.0.1", "c12": "^3.0.3", "chokidar": "^4.0.3", "citty": "^0.1.6", "compatx": "^0.2.0", "confbox": "^0.2.2", "consola": "^3.4.2", "cookie-es": "^2.0.0", "croner": "^9.0.0", "crossws": "^0.3.5", "db0": "^0.3.2", "defu": "^6.1.4", "destr": "^2.0.5", "dot-prop": "^9.0.0", "esbuild": "^0.25.4", "escape-string-regexp": "^5.0.0", "etag": "^1.8.1", "exsolve": "^1.0.5", "globby": "^14.1.0", "gzip-size": "^7.0.0", "h3": "^1.15.3", "hookable": "^5.5.3", "httpxy": "^0.1.7", "ioredis": "^5.6.1", "jiti": "^2.4.2", "klona": "^2.0.6", "knitwork": "^1.2.0", "listhen": "^1.9.0", "magic-string": "^0.30.17", "magicast": "^0.3.5", "mime": "^4.0.7", "mlly": "^1.7.4", "node-fetch-native": "^1.6.6", "node-mock-http": "^1.0.0", "ofetch": "^1.4.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "pretty-bytes": "^6.1.1", "radix3": "^1.1.2", "rollup": "^4.40.2", "rollup-plugin-visualizer": "^5.14.0", "scule": "^1.3.0", "semver": "^7.7.2", "serve-placeholder": "^2.0.2", "serve-static": "^2.2.0", "source-map": "^0.7.4", "std-env": "^3.9.0", "ufo": "^1.6.1", "ultrahtml": "^1.6.0", "uncrypto": "^0.1.3", "unctx": "^2.4.1", "unenv": "^2.0.0-rc.17", "unimport": "^5.0.1", "unplugin-utils": "^0.2.4", "unstorage": "^1.16.0", "untyped": "^2.0.0", "unwasm": "^0.3.9", "youch": "^4.1.0-beta.7", "youch-core": "^0.3.2" }, "peerDependencies": { "xml2js": "^0.6.2" }, "optionalPeers": ["xml2js"], "bin": { "nitro": "dist/cli/index.mjs", "nitropack": "dist/cli/index.mjs" } }, "sha512-e2AdQrEY1IVoNTdyjfEQV93xkqz4SQxAMR0xWF8mZUUHxMLm6S4nPzpscjksmT4OdUxl0N8/DCaGjKQ9ghdodA=="], + + "node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], + + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + + "node-forge": ["node-forge@1.3.1", "", {}, "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA=="], + + "node-gyp": ["node-gyp@8.4.1", "", { "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^9.1.0", "nopt": "^5.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.2", "which": "^2.0.2" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "node-mock-http": ["node-mock-http@1.0.0", "", {}, "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ=="], + + "node-source-walk": ["node-source-walk@7.0.1", "", { "dependencies": { "@babel/parser": "^7.26.7" } }, "sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg=="], + + "nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], + + "normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="], + + "npmlog": ["npmlog@6.0.2", "", { "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg=="], + + "nypm": ["nypm@0.5.4", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "tinyexec": "^0.3.2", "ufo": "^1.5.4" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "obuf": ["obuf@1.1.2", "", {}, "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="], + + "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], + + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "ollama": ["ollama@0.5.15", "", { "dependencies": { "whatwg-fetch": "^3.6.20" } }, "sha512-TSaZSJyP7MQJFjSmmNsoJiriwa3U+/UJRw6+M8aucs5dTsaWNZsBIGpDb5rXnW6nXxJBB/z79gZY8IaiIQgelQ=="], + + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "one-time": ["one-time@1.0.0", "", { "dependencies": { "fn.name": "1.x.x" } }, "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g=="], + + "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="], + + "open": ["open@8.4.2", "", { "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ=="], + + "openai": ["openai@4.103.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" }, "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-eWcz9kdurkGOFDtd5ySS5y251H2uBgq9+1a2lTBnjMMzlexJ40Am5t6Mu76SSE87VvitPa0dkIAp75F+dZVC0g=="], + + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + + "p-event": ["p-event@6.0.1", "", { "dependencies": { "p-timeout": "^6.1.2" } }, "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w=="], + + "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], + + "p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], + + "p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], + + "p-map": ["p-map@7.0.3", "", {}, "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA=="], + + "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], + + "p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="], + + "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], + + "p-wait-for": ["p-wait-for@5.0.2", "", { "dependencies": { "p-timeout": "^6.0.0" } }, "sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "packet-reader": ["packet-reader@1.0.0", "", {}, "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="], + + "parse-gitignore": ["parse-gitignore@2.0.0", "", {}, "sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog=="], + + "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "partial-json": ["partial-json@0.1.7", "", {}, "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA=="], + + "path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-type": ["path-type@6.0.0", "", {}, "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + + "pg": ["pg@8.11.3", "", { "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-connection-string": "^2.6.2", "pg-pool": "^3.6.1", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, "optionalDependencies": { "pg-cloudflare": "^1.1.1" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g=="], + + "pg-cloudflare": ["pg-cloudflare@1.2.5", "", {}, "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg=="], + + "pg-connection-string": ["pg-connection-string@2.9.0", "", {}, "sha512-P2DEBKuvh5RClafLngkAuGe9OUlFV7ebu8w1kmaaOgPcpJd1RIFh7otETfI6hAR8YupOLFTY7nuvvIn7PLciUQ=="], + + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-numeric": ["pg-numeric@1.0.2", "", {}, "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw=="], + + "pg-pool": ["pg-pool@3.10.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-DzZ26On4sQ0KmqnO34muPcmKbhrjmyiO4lCCR0VwEd7MjmiKf5NTg/6+apUEu0NF7ESa37CGzFxH513CoUmWnA=="], + + "pg-protocol": ["pg-protocol@1.10.0", "", {}, "sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q=="], + + "pg-types": ["pg-types@4.0.2", "", { "dependencies": { "pg-int8": "1.0.1", "pg-numeric": "1.0.2", "postgres-array": "~3.0.1", "postgres-bytea": "~3.0.0", "postgres-date": "~2.1.0", "postgres-interval": "^3.0.0", "postgres-range": "^1.1.1" } }, "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng=="], + + "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "pino": ["pino@9.7.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg=="], + + "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], + + "pino-pretty": ["pino-pretty@13.0.0", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^3.0.2", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pump": "^3.0.0", "secure-json-parse": "^2.4.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^3.1.1" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA=="], + + "pino-std-serializers": ["pino-std-serializers@7.0.0", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="], + + "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + + "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + + "postcss-values-parser": ["postcss-values-parser@6.0.2", "", { "dependencies": { "color-name": "^1.1.4", "is-url-superb": "^4.0.0", "quote-unquote": "^1.0.0" }, "peerDependencies": { "postcss": "^8.2.9" } }, "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw=="], + + "postgres-array": ["postgres-array@3.0.4", "", {}, "sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ=="], + + "postgres-bytea": ["postgres-bytea@3.0.0", "", { "dependencies": { "obuf": "~1.1.2" } }, "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw=="], + + "postgres-date": ["postgres-date@2.1.0", "", {}, "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA=="], + + "postgres-interval": ["postgres-interval@3.0.0", "", {}, "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw=="], + + "postgres-range": ["postgres-range@1.1.4", "", {}, "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w=="], + + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + + "precinct": ["precinct@12.2.0", "", { "dependencies": { "@dependents/detective-less": "^5.0.1", "commander": "^12.1.0", "detective-amd": "^6.0.1", "detective-cjs": "^6.0.1", "detective-es6": "^5.0.1", "detective-postcss": "^7.0.1", "detective-sass": "^6.0.1", "detective-scss": "^5.0.1", "detective-stylus": "^5.0.1", "detective-typescript": "^14.0.0", "detective-vue2": "^2.2.0", "module-definition": "^6.0.1", "node-source-walk": "^7.0.1", "postcss": "^8.5.1", "typescript": "^5.7.3" }, "bin": { "precinct": "bin/cli.js" } }, "sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w=="], + + "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], + + "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], + + "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], + + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], + + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + + "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + + "quote-unquote": ["quote-unquote@1.0.0", "", {}, "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg=="], + + "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="], + + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], + + "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "read-package-up": ["read-package-up@11.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", "type-fest": "^4.6.0" } }, "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ=="], + + "read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="], + + "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + + "readdir-glob": ["readdir-glob@1.1.3", "", { "dependencies": { "minimatch": "^5.1.0" } }, "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + + "redis": ["redis@4.7.1", "", { "dependencies": { "@redis/bloom": "1.2.0", "@redis/client": "1.6.1", "@redis/graph": "1.1.1", "@redis/json": "1.0.7", "@redis/search": "1.2.0", "@redis/time-series": "1.1.0" } }, "sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ=="], + + "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], + + "redis-parser": ["redis-parser@3.0.0", "", { "dependencies": { "redis-errors": "^1.0.0" } }, "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A=="], + + "remove-trailing-separator": ["remove-trailing-separator@1.1.0", "", {}, "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "require-package-name": ["require-package-name@2.0.1", "", {}, "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "rollup": ["rollup@4.41.1", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.41.1", "@rollup/rollup-android-arm64": "4.41.1", "@rollup/rollup-darwin-arm64": "4.41.1", "@rollup/rollup-darwin-x64": "4.41.1", "@rollup/rollup-freebsd-arm64": "4.41.1", "@rollup/rollup-freebsd-x64": "4.41.1", "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", "@rollup/rollup-linux-arm-musleabihf": "4.41.1", "@rollup/rollup-linux-arm64-gnu": "4.41.1", "@rollup/rollup-linux-arm64-musl": "4.41.1", "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", "@rollup/rollup-linux-riscv64-gnu": "4.41.1", "@rollup/rollup-linux-riscv64-musl": "4.41.1", "@rollup/rollup-linux-s390x-gnu": "4.41.1", "@rollup/rollup-linux-x64-gnu": "4.41.1", "@rollup/rollup-linux-x64-musl": "4.41.1", "@rollup/rollup-win32-arm64-msvc": "4.41.1", "@rollup/rollup-win32-ia32-msvc": "4.41.1", "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw=="], + + "rollup-plugin-visualizer": ["rollup-plugin-visualizer@5.14.0", "", { "dependencies": { "open": "^8.4.0", "picomatch": "^4.0.2", "source-map": "^0.7.4", "yargs": "^17.5.1" }, "peerDependencies": { "rolldown": "1.x", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown", "rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], + + "secure-json-parse": ["secure-json-parse@2.7.0", "", {}, "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "send": ["send@1.2.0", "", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], + + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + + "serve-placeholder": ["serve-placeholder@2.0.2", "", { "dependencies": { "defu": "^6.1.4" } }, "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ=="], + + "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "simple-wcswidth": ["simple-wcswidth@1.0.1", "", {}, "sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg=="], + + "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], + + "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], + + "smob": ["smob@1.5.0", "", {}, "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig=="], + + "socks": ["socks@2.8.4", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ=="], + + "socks-proxy-agent": ["socks-proxy-agent@6.2.1", "", { "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", "socks": "^2.6.2" } }, "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ=="], + + "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="], + + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + + "sqlite3": ["sqlite3@5.1.7", "", { "dependencies": { "bindings": "^1.5.0", "node-addon-api": "^7.0.0", "prebuild-install": "^7.1.1", "tar": "^6.1.11" }, "optionalDependencies": { "node-gyp": "8.x" } }, "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog=="], + + "ssri": ["ssri@8.0.1", "", { "dependencies": { "minipass": "^3.1.1" } }, "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ=="], + + "stack-trace": ["stack-trace@0.0.10", "", {}, "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "standard-as-callback": ["standard-as-callback@2.1.0", "", {}, "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="], + + "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + + "streamx": ["streamx@2.22.0", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], + + "suffix-thumb": ["suffix-thumb@5.0.2", "", {}, "sha512-I5PWXAFKx3FYnI9a+dQMWNqTxoRt6vdBdb0O+BJ1sxXCWtSoQCusc13E58f+9p4MYx/qCnEMkD5jac6K2j3dgA=="], + + "supports-color": ["supports-color@10.0.0", "", {}, "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "swr": ["swr@2.3.3", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A=="], + + "system-architecture": ["system-architecture@0.1.0", "", {}, "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA=="], + + "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], + + "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], + + "terser": ["terser@5.39.2", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg=="], + + "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], + + "text-hex": ["text-hex@1.0.0", "", {}, "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="], + + "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], + + "throttleit": ["throttleit@2.1.0", "", {}, "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw=="], + + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + + "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + + "tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], + + "tmp-promise": ["tmp-promise@3.0.3", "", { "dependencies": { "tmp": "^0.2.0" } }, "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "triple-beam": ["triple-beam@1.4.1", "", {}, "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tsx": ["tsx@4.19.4", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + + "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "unctx": ["unctx@2.4.1", "", { "dependencies": { "acorn": "^8.14.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.17", "unplugin": "^2.1.0" } }, "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg=="], + + "undici": ["undici@5.28.5", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA=="], + + "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], + + "unenv": ["unenv@2.0.0-rc.17", "", { "dependencies": { "defu": "^6.1.4", "exsolve": "^1.0.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "ufo": "^1.6.1" } }, "sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg=="], + + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "unimport": ["unimport@5.0.1", "", { "dependencies": { "acorn": "^8.14.1", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.3", "picomatch": "^4.0.2", "pkg-types": "^2.1.0", "scule": "^1.3.0", "strip-literal": "^3.0.0", "tinyglobby": "^0.2.13", "unplugin": "^2.3.2", "unplugin-utils": "^0.2.4" } }, "sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ=="], + + "unique-filename": ["unique-filename@1.1.1", "", { "dependencies": { "unique-slug": "^2.0.0" } }, "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="], + + "unique-slug": ["unique-slug@2.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w=="], + + "unixify": ["unixify@1.0.0", "", { "dependencies": { "normalize-path": "^2.1.1" } }, "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg=="], + + "unplugin": ["unplugin@2.3.4", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg=="], + + "unplugin-utils": ["unplugin-utils@0.2.4", "", { "dependencies": { "pathe": "^2.0.2", "picomatch": "^4.0.2" } }, "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA=="], + + "unstorage": ["unstorage@1.16.0", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^4.0.3", "destr": "^2.0.5", "h3": "^1.15.2", "lru-cache": "^10.4.3", "node-fetch-native": "^1.6.6", "ofetch": "^1.4.1", "ufo": "^1.6.1" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6.0.3 || ^7.0.0", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/kv": "^1.0.1", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-WQ37/H5A7LcRPWfYOrDa1Ys02xAbpPJq6q5GkO88FBXVSQzHd7+BjEwfRqyaSWCv9MbsJy058GWjjPjcJ16GGA=="], + + "untun": ["untun@0.1.3", "", { "dependencies": { "citty": "^0.1.5", "consola": "^3.2.3", "pathe": "^1.1.1" }, "bin": { "untun": "bin/untun.mjs" } }, "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ=="], + + "untyped": ["untyped@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "defu": "^6.1.4", "jiti": "^2.4.2", "knitwork": "^1.2.0", "scule": "^1.3.0" }, "bin": { "untyped": "dist/cli.mjs" } }, "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g=="], + + "unwasm": ["unwasm@0.3.9", "", { "dependencies": { "knitwork": "^1.0.0", "magic-string": "^0.30.8", "mlly": "^1.6.1", "pathe": "^1.1.2", "pkg-types": "^1.0.3", "unplugin": "^1.10.0" } }, "sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg=="], + + "uqr": ["uqr@0.1.2", "", {}, "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA=="], + + "urlpattern-polyfill": ["urlpattern-polyfill@8.0.2", "", {}, "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], + + "winston": ["winston@3.17.0", "", { "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.9.0" } }, "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw=="], + + "winston-transport": ["winston-transport@4.9.0", "", { "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A=="], + + "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@6.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ=="], + + "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="], + + "youch": ["youch@4.1.0-beta.7", "", { "dependencies": { "@poppinss/dumper": "^0.6.3", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.1" } }, "sha512-HUn0M24AUTMvjdkoMtH8fJz2FEd+k1xvtR9EoTrDUoVUi6o7xl5X+pST/vjk4T3GEQo2mJ9FlAvhWBm8dIdD4g=="], + + "youch-core": ["youch-core@0.3.2", "", { "dependencies": { "@poppinss/exception": "^1.2.0", "error-stack-parser-es": "^1.0.5" } }, "sha512-fusrlIMLeRvTFYLUjJ9KzlGC3N+6MOPJ68HNj/yJv2nz7zq8t4HEviLms2gkdRPUS7F5rZ5n+pYx9r88m6IE1g=="], + + "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], + + "zod": ["zod@3.25.28", "", {}, "sha512-/nt/67WYKnr5by3YS7LroZJbtcCBurDKKPBPWWzaxvVCGuG/NOsiKkrjoOhI8mJ+SQUXEbUzeB3S+6XDUEEj7Q=="], + + "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], + + "@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@1.0.9", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA=="], + + "@ai-sdk/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.10", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q=="], + + "@ai-sdk/cohere/@ai-sdk/provider": ["@ai-sdk/provider@1.0.9", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA=="], + + "@ai-sdk/cohere/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.10", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q=="], + + "@ai-sdk/groq/@ai-sdk/provider": ["@ai-sdk/provider@1.0.9", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA=="], + + "@ai-sdk/groq/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.10", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q=="], + + "@anthropic-ai/sdk/@types/node": ["@types/node@18.19.103", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-hHTHp+sEz6SxFsp+SA+Tqrua3AbmlAw+Y//aEwdHrdZkYVRWdvWD3y5uPZ0flYOkgskaFWqZ/YGFm3FaFQ0pRw=="], + + "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "@cloudflare/kv-asset-handler/mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@langchain/core/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + + "@mapbox/node-pre-gyp/tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "@mem0/vercel-ai-provider/@ai-sdk/openai": ["@ai-sdk/openai@1.1.15", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-irGQx5lMrYI9gub7Sy2ZHu49D3Icf7OtfOu3X8fVKMONOyi54RTKRNjVZTewkfRNE44psTbZDO8j8qmPirOTNQ=="], + + "@mem0/vercel-ai-provider/@ai-sdk/provider": ["@ai-sdk/provider@1.0.9", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA=="], + + "@mem0/vercel-ai-provider/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.10", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q=="], + + "@mem0/vercel-ai-provider/ai": ["ai@4.1.46", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10", "@ai-sdk/react": "1.1.18", "@ai-sdk/ui-utils": "1.1.16", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.0.0" }, "optionalPeers": ["react", "zod"] }, "sha512-VTvAktT69IN1qcNAv7OlcOuR0q4HqUlhkVacrWmMlEoprYykF9EL5RY8IECD5d036Wqg0walwbSKZlA2noHm1A=="], + + "@netlify/dev-utils/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "@netlify/zip-it-and-ship-it/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="], + + "@netlify/zip-it-and-ship-it/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + + "@openrouter/ai-sdk-provider/@ai-sdk/provider": ["@ai-sdk/provider@1.0.9", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-jie6ZJT2ZR0uVOVCDc9R2xCX5I/Dum/wEK28lx21PJx6ZnFAN9EzD2WsPhcDWfCgGx3OAZZ0GyM3CEobXpa9LA=="], + + "@openrouter/ai-sdk-provider/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@2.1.10", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "eventsource-parser": "^3.0.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-4GZ8GHjOFxePFzkl3q42AU0DQOtTQ5w09vmaWUf/pKFXJPizlnzKSUkF0f+VkapIUfDugyMqPMT1ge8XQzVI7Q=="], + + "@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="], + + "@whatwg-node/fetch/urlpattern-polyfill": ["urlpattern-polyfill@10.1.0", "", {}, "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw=="], + + "@whatwg-node/node-fetch/@fastify/busboy": ["@fastify/busboy@3.1.1", "", {}, "sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "are-we-there-yet/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "c12/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "c12/ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + + "c12/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "c12/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "cacache/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "cacache/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "cacache/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + + "color/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "compress-commons/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "exa-js/dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="], + + "execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], + + "execa/is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], + + "find-up/unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], + + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "formdata-node/web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], + + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "gauge/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "gaxios/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "groq-sdk/@types/node": ["@types/node@18.19.103", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-hHTHp+sEz6SxFsp+SA+Tqrua3AbmlAw+Y//aEwdHrdZkYVRWdvWD3y5uPZ0flYOkgskaFWqZ/YGFm3FaFQ0pRw=="], + + "h3/cookie-es": ["cookie-es@1.2.2", "", {}, "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="], + + "handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "jest-diff/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-matcher-utils/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-message-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-message-util/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "lambda-local/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], + + "langsmith/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "langsmith/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + + "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "listhen/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "make-fetch-happen/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], + + "make-fetch-happen/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "make-fetch-happen/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "minipass-collect/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-fetch/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-sized/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "netlify/node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + + "nitropack/c12": ["c12@3.0.4", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^16.5.0", "exsolve": "^1.0.5", "giget": "^2.0.0", "jiti": "^2.4.2", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg=="], + + "node-gyp/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "node-gyp/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "node-gyp/nopt": ["nopt@5.0.0", "", { "dependencies": { "abbrev": "1" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "nypm/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + + "openai/@types/node": ["@types/node@18.19.103", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-hHTHp+sEz6SxFsp+SA+Tqrua3AbmlAw+Y//aEwdHrdZkYVRWdvWD3y5uPZ0flYOkgskaFWqZ/YGFm3FaFQ0pRw=="], + + "p-event/p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + + "p-wait-for/p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + + "pg/pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + + "precinct/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "promise-retry/retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "read-pkg/unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], + + "readdir-glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "socks-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "ssri/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "unctx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "unimport/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + + "unixify/normalize-path": ["normalize-path@2.1.1", "", { "dependencies": { "remove-trailing-separator": "^1.0.1" } }, "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w=="], + + "untun/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "unwasm/pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "unwasm/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "unwasm/unplugin": ["unplugin@1.16.1", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w=="], + + "winston/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "winston/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "winston-transport/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "yauzl/buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "@anthropic-ai/sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "@jest/types/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@mapbox/node-pre-gyp/tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "@mapbox/node-pre-gyp/tar/minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + + "@mapbox/node-pre-gyp/tar/mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "@mapbox/node-pre-gyp/tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "@mem0/vercel-ai-provider/ai/@ai-sdk/react": ["@ai-sdk/react@1.1.18", "", { "dependencies": { "@ai-sdk/provider-utils": "2.1.10", "@ai-sdk/ui-utils": "1.1.16", "swr": "^2.2.5", "throttleit": "2.1.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.0.0" }, "optionalPeers": ["react", "zod"] }, "sha512-2wlWug6NVAc8zh3pgqtvwPkSNTdA6Q4x9CmrNXCeHcXfJkJ+MuHFQz/I7Wb7mLRajf0DAxsFLIhHyBCEuTkDNw=="], + + "@mem0/vercel-ai-provider/ai/@ai-sdk/ui-utils": ["@ai-sdk/ui-utils@1.1.16", "", { "dependencies": { "@ai-sdk/provider": "1.0.9", "@ai-sdk/provider-utils": "2.1.10", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.0.0" }, "optionalPeers": ["zod"] }, "sha512-jfblR2yZVISmNK2zyNzJZFtkgX57WDAUQXcmn3XUBJyo8LFsADu+/vYMn5AOyBi9qJT0RBk11PEtIxIqvByw3Q=="], + + "@netlify/zip-it-and-ship-it/glob/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "c12/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "cacache/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "color/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "groq-sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "jest-diff/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-diff/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-matcher-utils/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-matcher-utils/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-message-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-message-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "langsmith/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "langsmith/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "make-fetch-happen/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "nitropack/c12/giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], + + "node-gyp/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "node-gyp/nopt/abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="], + + "nypm/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "openai/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "pg/pg-types/postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "pg/pg-types/postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], + + "pg/pg-types/postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "pg/pg-types/postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + + "rimraf/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "unwasm/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "unwasm/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "cacache/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "nitropack/c12/giget/nypm": ["nypm@0.6.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^2.0.0", "tinyexec": "^0.3.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg=="], + + "node-gyp/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + } +} diff --git a/client/client.gen.ts b/client/client.gen.ts new file mode 100644 index 0000000..0b50a63 --- /dev/null +++ b/client/client.gen.ts @@ -0,0 +1,24 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { + type Config, + type ClientOptions as DefaultClientOptions, + createClient, + createConfig, +} from '@hey-api/client-fetch'; +import type { ClientOptions } from './types.gen'; + +/** + * The `createClientConfig()` function will be called on client initialization + * and the returned object will become the client's initial configuration. + * + * You may want to initialize your client this way instead of calling + * `setConfig()`. This is useful for example if you're using Next.js + * to ensure your client always has the correct values. + */ +export type CreateClientConfig = + ( + override?: Config, + ) => Config & T>; + +export const client = createClient(createConfig()); diff --git a/client/index.ts b/client/index.ts new file mode 100644 index 0000000..0b26d14 --- /dev/null +++ b/client/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts +export * from './types.gen'; +export * from './sdk.gen'; diff --git a/client/sdk.gen.ts b/client/sdk.gen.ts new file mode 100644 index 0000000..d08a6eb --- /dev/null +++ b/client/sdk.gen.ts @@ -0,0 +1,2050 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { + type Client, + type Options as ClientOptions, + type TDataShape, + formDataBodySerializer, + urlSearchParamsBodySerializer, +} from '@hey-api/client-fetch'; +import { client as _heyApiClient } from './client.gen'; +import { + getMessagesResponseTransformer, + getThreadMessagesResponseTransformer, +} from './transformers.gen'; +import type { + AbortMultipartData, + AbortMultipartResponse, + ActivateUserData, + ActivateUserResponse, + AddGroupMembersData, + AddGroupMembersResponse, + AdminGetUserData, + AdminGetUserResponse, + AdminListBadgesData, + AdminListBadgesResponse, + AdminListUsersData, + AdminListUsersResponse, + AnonymizeUserData, + AnonymizeUserResponse, + BatchPresignMultipartPartsData, + BatchPresignMultipartPartsResponse, + BookmarkTopicData, + ChangePasswordData, + CompleteExternalUploadData, + CompleteExternalUploadResponse, + CompleteMultipartData, + CompleteMultipartResponse, + CreateBackupData, + CreateBackupResponse, + CreateBadgeData, + CreateBadgeResponse, + CreateCategoryData, + CreateCategoryResponse, + CreateGroupData, + CreateGroupResponse, + CreateInviteData, + CreateInviteResponse, + CreateMultipartUploadData, + CreateMultipartUploadResponse, + CreateMultipleInvitesData, + CreateMultipleInvitesResponse, + CreateTagGroupData, + CreateTagGroupResponse, + CreateTopicPostPmData, + CreateTopicPostPmResponse, + CreateTopicTimerData, + CreateTopicTimerResponse, + CreateUploadData, + CreateUploadResponse, + CreateUserData, + CreateUserResponse, + DeactivateUserData, + DeactivateUserResponse, + DeleteBadgeData, + DeleteGroupData, + DeleteGroupResponse, + DeletePostData, + DeleteUserData, + DeleteUserResponse, + DownloadBackupData, + EditMessageData, + EditMessageResponse, + GeneratePresignedPutData, + GeneratePresignedPutResponse, + GetBackupsData, + GetBackupsResponse, + GetCategoryData, + GetCategoryResponse, + GetGroupData, + GetGroupResponse, + GetMessagesData, + GetMessagesResponse, + GetNotificationsData, + GetNotificationsResponse, + GetPostData, + GetPostResponse, + GetSessionData, + GetSessionResponse, + GetSiteBasicInfoData, + GetSiteBasicInfoResponse, + GetSiteData, + GetSiteResponse, + GetSpecificPostsFromTopicData, + GetSpecificPostsFromTopicResponse, + GetTagData, + GetTagGroupData, + GetTagGroupResponse, + GetTagResponse, + GetThreadData, + GetThreadMessagesData, + GetThreadMessagesResponse, + GetThreadResponse, + GetTopicByExternalIdData, + GetTopicData, + GetTopicResponse, + GetUserCardData, + GetUserCardResponse, + GetUserData, + GetUserEmailsData, + GetUserEmailsResponse, + GetUserExternalIdData, + GetUserExternalIdResponse, + GetUserIdentiyProviderExternalIdData, + GetUserIdentiyProviderExternalIdResponse, + GetUserResponse, + GetUserSentPrivateMessagesData, + GetUserSentPrivateMessagesResponse, + InviteGroupToTopicData, + InviteGroupToTopicResponse, + InviteToTopicData, + InviteToTopicResponse, + ListCategoriesData, + ListCategoriesResponse, + ListCategoryTopicsData, + ListCategoryTopicsResponse, + ListGroupMembersData, + ListGroupMembersResponse, + ListGroupsData, + ListGroupsResponse, + ListLatestTopicsData, + ListLatestTopicsResponse, + ListPostsData, + ListPostsResponse, + ListTagGroupsData, + ListTagGroupsResponse, + ListTagsData, + ListTagsResponse, + ListTopTopicsData, + ListTopTopicsResponse, + ListUserActionsData, + ListUserActionsResponse, + ListUserBadgesData, + ListUserBadgesResponse, + ListUserPrivateMessagesData, + ListUserPrivateMessagesResponse, + ListUsersPublicData, + ListUsersPublicResponse, + LockPostData, + LockPostResponse, + LogOutUserData, + LogOutUserResponse, + MarkNotificationsAsReadData, + MarkNotificationsAsReadResponse, + PerformPostActionData, + PerformPostActionResponse, + PostRepliesData, + PostRepliesResponse, + ReactToMessageData, + ReactToMessageResponse, + RefreshGravatarData, + RefreshGravatarResponse, + RemoveGroupMembersData, + RemoveGroupMembersResponse, + RemoveTopicData, + SearchData, + SearchResponse, + SendDownloadBackupEmailData, + SendMessageData, + SendMessageResponse, + SendPasswordResetEmailData, + SendPasswordResetEmailResponse, + SetNotificationLevelData, + SetNotificationLevelResponse, + SilenceUserData, + SilenceUserResponse, + SuspendUserData, + SuspendUserResponse, + UpdateAvatarData, + UpdateAvatarResponse, + UpdateBadgeData, + UpdateBadgeResponse, + UpdateCategoryData, + UpdateCategoryResponse, + UpdateEmailData, + UpdateGroupData, + UpdateGroupResponse, + UpdatePostData, + UpdatePostResponse, + UpdateTagGroupData, + UpdateTagGroupResponse, + UpdateTopicData, + UpdateTopicResponse, + UpdateTopicStatusData, + UpdateTopicStatusResponse, + UpdateTopicTimestampData, + UpdateTopicTimestampResponse, + UpdateUserData, + UpdateUserResponse, + UpdateUsernameData, +} from './types.gen'; + +export type Options< + TData extends TDataShape = TDataShape, + ThrowOnError extends boolean = boolean, +> = ClientOptions & { + /** + * You can provide a client instance returned by `createClient()` instead of + * individual options. This might be also useful if you want to implement a + * custom client. + */ + client?: Client; + /** + * You can pass arbitrary values through the `meta` object. This can be + * used to access values that aren't defined as part of the SDK function. + */ + meta?: Record; +}; + +/** + * List backups + */ +export const getBackups = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + GetBackupsResponse, + unknown, + ThrowOnError + >({ + url: '/admin/backups.json', + ...options, + }); +}; + +/** + * Create backup + */ +export const createBackup = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CreateBackupResponse, + unknown, + ThrowOnError + >({ + url: '/admin/backups.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Download backup + */ +export const downloadBackup = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get({ + url: '/admin/backups/{filename}', + ...options, + }); +}; + +/** + * Send download backup email + */ +export const sendDownloadBackupEmail = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put({ + url: '/admin/backups/{filename}', + ...options, + }); +}; + +/** + * List badges + */ +export const adminListBadges = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + AdminListBadgesResponse, + unknown, + ThrowOnError + >({ + url: '/admin/badges.json', + ...options, + }); +}; + +/** + * Create badge + */ +export const createBadge = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CreateBadgeResponse, + unknown, + ThrowOnError + >({ + url: '/admin/badges.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Delete badge + */ +export const deleteBadge = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).delete< + unknown, + unknown, + ThrowOnError + >({ + url: '/admin/badges/{id}.json', + ...options, + }); +}; + +/** + * Update badge + */ +export const updateBadge = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateBadgeResponse, + unknown, + ThrowOnError + >({ + url: '/admin/badges/{id}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Retrieves a list of categories + */ +export const listCategories = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + ListCategoriesResponse, + unknown, + ThrowOnError + >({ + url: '/categories.json', + ...options, + }); +}; + +/** + * Creates a category + */ +export const createCategory = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CreateCategoryResponse, + unknown, + ThrowOnError + >({ + url: '/categories.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Updates a category + */ +export const updateCategory = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateCategoryResponse, + unknown, + ThrowOnError + >({ + url: '/categories/{id}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * List topics + */ +export const listCategoryTopics = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListCategoryTopicsResponse, + unknown, + ThrowOnError + >({ + url: '/c/{slug}/{id}.json', + ...options, + }); +}; + +/** + * Show category + */ +export const getCategory = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetCategoryResponse, + unknown, + ThrowOnError + >({ + url: '/c/{id}/show.json', + ...options, + }); +}; + +/** + * Create a group + */ +export const createGroup = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CreateGroupResponse, + unknown, + ThrowOnError + >({ + url: '/admin/groups.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Delete a group + */ +export const deleteGroup = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).delete< + DeleteGroupResponse, + unknown, + ThrowOnError + >({ + url: '/admin/groups/{id}.json', + ...options, + }); +}; + +/** + * Get a group + */ +export const getGroup = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetGroupResponse, + unknown, + ThrowOnError + >({ + url: '/groups/{id}.json', + ...options, + }); +}; + +/** + * Update a group + */ +export const updateGroup = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateGroupResponse, + unknown, + ThrowOnError + >({ + url: '/groups/{id}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Remove group members + */ +export const removeGroupMembers = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).delete< + RemoveGroupMembersResponse, + unknown, + ThrowOnError + >({ + url: '/groups/{id}/members.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * List group members + */ +export const listGroupMembers = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListGroupMembersResponse, + unknown, + ThrowOnError + >({ + url: '/groups/{id}/members.json', + ...options, + }); +}; + +/** + * Add group members + */ +export const addGroupMembers = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + AddGroupMembersResponse, + unknown, + ThrowOnError + >({ + url: '/groups/{id}/members.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * List groups + */ +export const listGroups = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + ListGroupsResponse, + unknown, + ThrowOnError + >({ + url: '/groups.json', + ...options, + }); +}; + +/** + * Create an invite + */ +export const createInvite = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + CreateInviteResponse, + unknown, + ThrowOnError + >({ + url: '/invites.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Create multiple invites + */ +export const createMultipleInvites = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + CreateMultipleInvitesResponse, + unknown, + ThrowOnError + >({ + url: '/invites/create-multiple.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get the notifications that belong to the current user + */ +export const getNotifications = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + GetNotificationsResponse, + unknown, + ThrowOnError + >({ + url: '/notifications.json', + ...options, + }); +}; + +/** + * Mark notifications as read + */ +export const markNotificationsAsRead = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).put< + MarkNotificationsAsReadResponse, + unknown, + ThrowOnError + >({ + url: '/notifications/mark-read.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * List latest posts across topics + */ +export const listPosts = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListPostsResponse, + unknown, + ThrowOnError + >({ + url: '/posts.json', + ...options, + }); +}; + +/** + * Creates a new topic, a new post, or a private message + */ +export const createTopicPostPm = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CreateTopicPostPmResponse, + unknown, + ThrowOnError + >({ + url: '/posts.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * delete a single post + */ +export const deletePost = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).delete< + unknown, + unknown, + ThrowOnError + >({ + url: '/posts/{id}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Retrieve a single post + * This endpoint can be used to get the number of likes on a post using the + * `actions_summary` property in the response. `actions_summary` responses + * with the id of `2` signify a `like`. If there are no `actions_summary` + * items with the id of `2`, that means there are 0 likes. Other ids likely + * refer to various different flag types. + * + */ +export const getPost = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetPostResponse, + unknown, + ThrowOnError + >({ + url: '/posts/{id}.json', + ...options, + }); +}; + +/** + * Update a single post + */ +export const updatePost = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdatePostResponse, + unknown, + ThrowOnError + >({ + url: '/posts/{id}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * List replies to a post + */ +export const postReplies = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + PostRepliesResponse, + unknown, + ThrowOnError + >({ + url: '/posts/{id}/replies.json', + ...options, + }); +}; + +/** + * Lock a post from being edited + */ +export const lockPost = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + LockPostResponse, + unknown, + ThrowOnError + >({ + url: '/posts/{id}/locked.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Like a post and other actions + */ +export const performPostAction = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + PerformPostActionResponse, + unknown, + ThrowOnError + >({ + url: '/post_actions.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get a list of private messages for a user + */ +export const listUserPrivateMessages = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListUserPrivateMessagesResponse, + unknown, + ThrowOnError + >({ + url: '/topics/private-messages/{username}.json', + ...options, + }); +}; + +/** + * Get a list of private messages sent for a user + */ +export const getUserSentPrivateMessages = < + ThrowOnError extends boolean = false, +>( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetUserSentPrivateMessagesResponse, + unknown, + ThrowOnError + >({ + url: '/topics/private-messages-sent/{username}.json', + ...options, + }); +}; + +/** + * Search for a term + */ +export const search = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + SearchResponse, + unknown, + ThrowOnError + >({ + url: '/search.json', + ...options, + }); +}; + +/** + * Get site info + * Can be used to fetch all categories and subcategories + */ +export const getSite = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + GetSiteResponse, + unknown, + ThrowOnError + >({ + url: '/site.json', + ...options, + }); +}; + +/** + * Get site basic info + * Can be used to fetch basic info about a site + */ +export const getSiteBasicInfo = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + GetSiteBasicInfoResponse, + unknown, + ThrowOnError + >({ + url: '/site/basic-info.json', + ...options, + }); +}; + +/** + * Get a list of tag groups + */ +export const listTagGroups = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + ListTagGroupsResponse, + unknown, + ThrowOnError + >({ + url: '/tag_groups.json', + ...options, + }); +}; + +/** + * Creates a tag group + */ +export const createTagGroup = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CreateTagGroupResponse, + unknown, + ThrowOnError + >({ + url: '/tag_groups.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get a single tag group + */ +export const getTagGroup = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetTagGroupResponse, + unknown, + ThrowOnError + >({ + url: '/tag_groups/{id}.json', + ...options, + }); +}; + +/** + * Update tag group + */ +export const updateTagGroup = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateTagGroupResponse, + unknown, + ThrowOnError + >({ + url: '/tag_groups/{id}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get a list of tags + */ +export const listTags = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + ListTagsResponse, + unknown, + ThrowOnError + >({ + url: '/tags.json', + ...options, + }); +}; + +/** + * Get a specific tag + */ +export const getTag = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetTagResponse, + unknown, + ThrowOnError + >({ + url: '/tag/{name}.json', + ...options, + }); +}; + +/** + * Get specific posts from a topic + */ +export const getSpecificPostsFromTopic = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetSpecificPostsFromTopicResponse, + unknown, + ThrowOnError + >({ + url: '/t/{id}/posts.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Remove a topic + */ +export const removeTopic = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).delete< + unknown, + unknown, + ThrowOnError + >({ + url: '/t/{id}.json', + ...options, + }); +}; + +/** + * Get a single topic + */ +export const getTopic = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetTopicResponse, + unknown, + ThrowOnError + >({ + url: '/t/{id}.json', + ...options, + }); +}; + +/** + * Update a topic + */ +export const updateTopic = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateTopicResponse, + unknown, + ThrowOnError + >({ + url: '/t/-/{id}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Invite to topic + */ +export const inviteToTopic = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + InviteToTopicResponse, + unknown, + ThrowOnError + >({ + url: '/t/{id}/invite.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Invite group to topic + */ +export const inviteGroupToTopic = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + InviteGroupToTopicResponse, + unknown, + ThrowOnError + >({ + url: '/t/{id}/invite-group.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Bookmark topic + */ +export const bookmarkTopic = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put({ + url: '/t/{id}/bookmark.json', + ...options, + }); +}; + +/** + * Update the status of a topic + */ +export const updateTopicStatus = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateTopicStatusResponse, + unknown, + ThrowOnError + >({ + url: '/t/{id}/status.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get the latest topics + */ +export const listLatestTopics = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListLatestTopicsResponse, + unknown, + ThrowOnError + >({ + url: '/latest.json', + ...options, + }); +}; + +/** + * Get the top topics filtered by period + */ +export const listTopTopics = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListTopTopicsResponse, + unknown, + ThrowOnError + >({ + url: '/top.json', + ...options, + }); +}; + +/** + * Set notification level + */ +export const setNotificationLevel = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + SetNotificationLevelResponse, + unknown, + ThrowOnError + >({ + url: '/t/{id}/notifications.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Update topic timestamp + */ +export const updateTopicTimestamp = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateTopicTimestampResponse, + unknown, + ThrowOnError + >({ + url: '/t/{id}/change-timestamp.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Create topic timer + */ +export const createTopicTimer = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + CreateTopicTimerResponse, + unknown, + ThrowOnError + >({ + url: '/t/{id}/timer.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get topic by external_id + */ +export const getTopicByExternalId = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get({ + url: '/t/external_id/{external_id}.json', + ...options, + }); +}; + +/** + * Creates an upload + */ +export const createUpload = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CreateUploadResponse, + unknown, + ThrowOnError + >({ + ...formDataBodySerializer, + url: '/uploads.json', + ...options, + headers: { + 'Content-Type': null, + ...options?.headers, + }, + }); +}; + +/** + * Initiates a direct external upload + * Direct external uploads bypass the usual method of creating uploads + * via the POST /uploads route, and upload directly to an external provider, + * which by default is S3. This route begins the process, and will return + * a unique identifier for the external upload as well as a presigned URL + * which is where the file binary blob should be uploaded to. + * + * Once the upload is complete to the external service, you must call the + * POST /complete-external-upload route using the unique identifier returned + * by this route, which will create any required Upload record in the Discourse + * database and also move file from its temporary location to the final + * destination in the external storage service. + * + * You must have the correct permissions and CORS settings configured in your + * external provider. We support AWS S3 as the default. See: + * + * https://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4. + * + * An external file store must be set up and `enable_direct_s3_uploads` must + * be set to true for this endpoint to function. + * + * + */ +export const generatePresignedPut = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + GeneratePresignedPutResponse, + unknown, + ThrowOnError + >({ + url: '/uploads/generate-presigned-put.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Completes a direct external upload + * Completes an external upload initialized with /get-presigned-put. The + * file will be moved from its temporary location in external storage to + * a final destination in the S3 bucket. An Upload record will also be + * created in the database in most cases. + * + * If a sha1-checksum was provided in the initial request it will also + * be compared with the uploaded file in storage to make sure the same + * file was uploaded. The file size will be compared for the same reason. + * + * You must have the correct permissions and CORS settings configured in your + * external provider. We support AWS S3 as the default. See: + * + * https://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4. + * + * An external file store must be set up and `enable_direct_s3_uploads` must + * be set to true for this endpoint to function. + * + * + */ +export const completeExternalUpload = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CompleteExternalUploadResponse, + unknown, + ThrowOnError + >({ + url: '/uploads/complete-external-upload.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Creates a multipart external upload + * Creates a multipart upload in the external storage provider, storing + * a temporary reference to the external upload similar to /get-presigned-put. + * + * You must have the correct permissions and CORS settings configured in your + * external provider. We support AWS S3 as the default. See: + * + * https://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4. + * + * An external file store must be set up and `enable_direct_s3_uploads` must + * be set to true for this endpoint to function. + * + * + */ +export const createMultipartUpload = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CreateMultipartUploadResponse, + unknown, + ThrowOnError + >({ + url: '/uploads/create-multipart.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Generates batches of presigned URLs for multipart parts + * Multipart uploads are uploaded in chunks or parts to individual presigned + * URLs, similar to the one generated by /generate-presigned-put. The part + * numbers provided must be between 1 and 10000. The total number of parts + * will depend on the chunk size in bytes that you intend to use to upload + * each chunk. For example a 12MB file may have 2 5MB chunks and a final + * 2MB chunk, for part numbers 1, 2, and 3. + * + * This endpoint will return a presigned URL for each part number provided, + * which you can then use to send PUT requests for the binary chunk corresponding + * to that part. When the part is uploaded, the provider should return an + * ETag for the part, and this should be stored along with the part number, + * because this is needed to complete the multipart upload. + * + * You must have the correct permissions and CORS settings configured in your + * external provider. We support AWS S3 as the default. See: + * + * https://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4. + * + * An external file store must be set up and `enable_direct_s3_uploads` must + * be set to true for this endpoint to function. + * + * + */ +export const batchPresignMultipartParts = < + ThrowOnError extends boolean = false, +>( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + BatchPresignMultipartPartsResponse, + unknown, + ThrowOnError + >({ + url: '/uploads/batch-presign-multipart-parts.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Abort multipart upload + * This endpoint aborts the multipart upload initiated with /create-multipart. + * This should be used when cancelling the upload. It does not matter if parts + * were already uploaded into the external storage provider. + * + * You must have the correct permissions and CORS settings configured in your + * external provider. We support AWS S3 as the default. See: + * + * https://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4. + * + * An external file store must be set up and `enable_direct_s3_uploads` must + * be set to true for this endpoint to function. + * + * + */ +export const abortMultipart = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + AbortMultipartResponse, + unknown, + ThrowOnError + >({ + url: '/uploads/abort-multipart.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Complete multipart upload + * Completes the multipart upload in the external store, and copies the + * file from its temporary location to its final location in the store. + * All of the parts must have been uploaded to the external storage provider. + * An Upload record will be completed in most cases once the file is copied + * to its final location. + * + * You must have the correct permissions and CORS settings configured in your + * external provider. We support AWS S3 as the default. See: + * + * https://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4. + * + * An external file store must be set up and `enable_direct_s3_uploads` must + * be set to true for this endpoint to function. + * + * + */ +export const completeMultipart = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + CompleteMultipartResponse, + unknown, + ThrowOnError + >({ + url: '/uploads/complete-multipart.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * List badges for a user + */ +export const listUserBadges = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListUserBadgesResponse, + unknown, + ThrowOnError + >({ + url: '/user-badges/{username}.json', + ...options, + }); +}; + +/** + * Creates a user + */ +export const createUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + CreateUserResponse, + unknown, + ThrowOnError + >({ + url: '/users.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get a single user by username + */ +export const getUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetUserResponse, + unknown, + ThrowOnError + >({ + url: '/u/{username}.json', + ...options, + }); +}; + +/** + * Update a user + */ +export const updateUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateUserResponse, + unknown, + ThrowOnError + >({ + url: '/u/{username}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get a user by external_id + */ +export const getUserExternalId = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetUserExternalIdResponse, + unknown, + ThrowOnError + >({ + url: '/u/by-external/{external_id}.json', + ...options, + }); +}; + +/** + * Get a user by identity provider external ID + */ +export const getUserIdentiyProviderExternalId = < + ThrowOnError extends boolean = false, +>( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetUserIdentiyProviderExternalIdResponse, + unknown, + ThrowOnError + >({ + url: '/u/by-external/{provider}/{external_id}.json', + ...options, + }); +}; + +/** + * Update avatar + */ +export const updateAvatar = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + UpdateAvatarResponse, + unknown, + ThrowOnError + >({ + url: '/u/{username}/preferences/avatar/pick.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Update email + */ +export const updateEmail = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put({ + url: '/u/{username}/preferences/email.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Update username + */ +export const updateUsername = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put({ + url: '/u/{username}/preferences/username.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get a public list of users + */ +export const listUsersPublic = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListUsersPublicResponse, + unknown, + ThrowOnError + >({ + url: '/directory_items.json', + ...options, + }); +}; + +/** + * Delete a user + */ +export const deleteUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).delete< + DeleteUserResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/{id}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get a user by id + */ +export const adminGetUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + AdminGetUserResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/{id}.json', + ...options, + }); +}; + +/** + * Activate a user + */ +export const activateUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + ActivateUserResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/{id}/activate.json', + ...options, + }); +}; + +/** + * Deactivate a user + */ +export const deactivateUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + DeactivateUserResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/{id}/deactivate.json', + ...options, + }); +}; + +/** + * Suspend a user + */ +export const suspendUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + SuspendUserResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/{id}/suspend.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Silence a user + */ +export const silenceUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + SilenceUserResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/{id}/silence.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Anonymize a user + */ +export const anonymizeUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + AnonymizeUserResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/{id}/anonymize.json', + ...options, + }); +}; + +/** + * Log a user out + */ +export const logOutUser = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + LogOutUserResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/{id}/log_out.json', + ...options, + }); +}; + +/** + * Refresh gravatar + */ +export const refreshGravatar = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + RefreshGravatarResponse, + unknown, + ThrowOnError + >({ + url: '/user_avatar/{username}/refresh_gravatar.json', + ...options, + }); +}; + +/** + * Get a list of users + */ +export const adminListUsers = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + AdminListUsersResponse, + unknown, + ThrowOnError + >({ + url: '/admin/users/list/{flag}.json', + ...options, + }); +}; + +/** + * Get a list of user actions + */ +export const listUserActions = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + ListUserActionsResponse, + unknown, + ThrowOnError + >({ + url: '/user_actions.json', + ...options, + }); +}; + +/** + * Send password reset email + */ +export const sendPasswordResetEmail = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).post< + SendPasswordResetEmailResponse, + unknown, + ThrowOnError + >({ + url: '/session/forgot_password.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Change password + */ +export const changePassword = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put({ + url: '/users/password-reset/{token}.json', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options?.headers, + }, + }); +}; + +/** + * Get email addresses belonging to a user + */ +export const getUserEmails = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetUserEmailsResponse, + unknown, + ThrowOnError + >({ + url: '/u/{username}/emails.json', + ...options, + }); +}; + +/** + * Send a message to a chat channel + */ +export const sendMessage = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).post< + SendMessageResponse, + unknown, + ThrowOnError + >({ + ...urlSearchParamsBodySerializer, + url: '/chat/{channel_id}', + ...options, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + ...options?.headers, + }, + }); +}; + +/** + * Get thread details + */ +export const getThread = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetThreadResponse, + unknown, + ThrowOnError + >({ + url: '/chat/api/channels/{channel_id}/threads/{thread_id}', + ...options, + }); +}; + +/** + * Edit an existing message + */ +export const editMessage = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + EditMessageResponse, + unknown, + ThrowOnError + >({ + ...urlSearchParamsBodySerializer, + url: '/chat/api/channels/{channel_id}/messages/{message_id}', + ...options, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + ...options?.headers, + }, + }); +}; + +/** + * Fetch chat messages + */ +export const getMessages = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetMessagesResponse, + unknown, + ThrowOnError + >({ + responseTransformer: getMessagesResponseTransformer, + url: '/chat/api/channels/{channel_id}/messages', + ...options, + }); +}; + +/** + * Fetch thread messages + */ +export const getThreadMessages = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetThreadMessagesResponse, + unknown, + ThrowOnError + >({ + responseTransformer: getThreadMessagesResponseTransformer, + url: '/chat/api/channels/{channel_id}/threads/{thread_id}/messages', + ...options, + }); +}; + +/** + * React to a message + */ +export const reactToMessage = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).put< + ReactToMessageResponse, + unknown, + ThrowOnError + >({ + ...urlSearchParamsBodySerializer, + url: '/chat/{channel_id}/react/{message_id}', + ...options, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + ...options?.headers, + }, + }); +}; + +/** + * Fetch a user card + */ +export const getUserCard = ( + options: Options, +) => { + return (options.client ?? _heyApiClient).get< + GetUserCardResponse, + unknown, + ThrowOnError + >({ + url: '/u/{username}/card.json', + ...options, + }); +}; + +/** + * Get current session info + */ +export const getSession = ( + options?: Options, +) => { + return (options?.client ?? _heyApiClient).get< + GetSessionResponse, + unknown, + ThrowOnError + >({ + url: '/session/current.json', + ...options, + }); +}; diff --git a/client/transformers.gen.ts b/client/transformers.gen.ts new file mode 100644 index 0000000..0f186e6 --- /dev/null +++ b/client/transformers.gen.ts @@ -0,0 +1,34 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { + GetMessagesResponse, + GetThreadMessagesResponse, +} from './types.gen'; + +export const getMessagesResponseTransformer = async ( + data: any, +): Promise => { + if (data.messages) { + data.messages = data.messages.map((item: any) => { + if (item.created_at) { + item.created_at = new Date(item.created_at); + } + return item; + }); + } + return data; +}; + +export const getThreadMessagesResponseTransformer = async ( + data: any, +): Promise => { + if (data.messages) { + data.messages = data.messages.map((item: any) => { + if (item.created_at) { + item.created_at = new Date(item.created_at); + } + return item; + }); + } + return data; +}; diff --git a/client/types.gen.ts b/client/types.gen.ts new file mode 100644 index 0000000..a7aa37e --- /dev/null +++ b/client/types.gen.ts @@ -0,0 +1,5832 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type GetBackupsData = { + body?: never; + path?: never; + query?: never; + url: '/admin/backups.json'; +}; + +export type GetBackupsResponses = { + /** + * success response + */ + 200: Array<{ + filename: string; + size: number; + last_modified: string; + }>; +}; + +export type GetBackupsResponse = GetBackupsResponses[keyof GetBackupsResponses]; + +export type CreateBackupData = { + body?: { + with_uploads: boolean; + }; + path?: never; + query?: never; + url: '/admin/backups.json'; +}; + +export type CreateBackupResponses = { + /** + * success response + */ + 200: { + success: string; + }; +}; + +export type CreateBackupResponse = + CreateBackupResponses[keyof CreateBackupResponses]; + +export type DownloadBackupData = { + body?: never; + path: { + filename: string; + }; + query: { + token: string; + }; + url: '/admin/backups/{filename}'; +}; + +export type DownloadBackupResponses = { + /** + * success response + */ + 200: unknown; +}; + +export type SendDownloadBackupEmailData = { + body?: never; + path: { + filename: string; + }; + query?: never; + url: '/admin/backups/{filename}'; +}; + +export type SendDownloadBackupEmailResponses = { + /** + * success response + */ + 200: unknown; +}; + +export type AdminListBadgesData = { + body?: never; + path?: never; + query?: never; + url: '/admin/badges.json'; +}; + +export type AdminListBadgesResponses = { + /** + * success response + */ + 200: { + badges: Array<{ + id: number; + name: string; + description: string; + grant_count: number; + allow_title: boolean; + multiple_grant: boolean; + icon: string; + image_url: string | null; + listable: boolean; + enabled: boolean; + badge_grouping_id: number; + system: boolean; + long_description: string; + slug: string; + manually_grantable: boolean; + query: string | null; + trigger: number | null; + target_posts: boolean; + auto_revoke: boolean; + show_posts: boolean; + i18n_name?: string | null; + image_upload_id: number | null; + badge_type_id: number; + show_in_post_header: boolean; + }>; + badge_types: Array<{ + id: number; + name: string; + sort_order: number; + }>; + badge_groupings: Array<{ + id: number; + name: string; + description: string | null; + position: number; + system: boolean; + }>; + admin_badges: { + protected_system_fields: Array; + triggers: { + user_change: number; + none: number; + post_revision: number; + trust_level_change: number; + post_action: number; + }; + badge_ids: Array; + badge_grouping_ids: Array; + badge_type_ids: Array; + }; + }; +}; + +export type AdminListBadgesResponse = + AdminListBadgesResponses[keyof AdminListBadgesResponses]; + +export type CreateBadgeData = { + body?: { + /** + * The name for the new badge. + */ + name: string; + /** + * The ID for the badge type. 1 for Gold, 2 for Silver, + * 3 for Bronze. + */ + badge_type_id: number; + }; + path?: never; + query?: never; + url: '/admin/badges.json'; +}; + +export type CreateBadgeResponses = { + /** + * success response + */ + 200: { + badge_types: Array<{ + id: number; + name: string; + sort_order: number; + }>; + badge: { + id: number; + name: string; + description: string; + grant_count: number; + allow_title: boolean; + multiple_grant: boolean; + icon: string; + image_url: string | null; + image_upload_id: number | null; + listable: boolean; + enabled: boolean; + badge_grouping_id: number; + system: boolean; + long_description: string; + slug: string; + manually_grantable: boolean; + query: string | null; + trigger: string | null; + target_posts: boolean; + auto_revoke: boolean; + show_posts: boolean; + badge_type_id: number; + show_in_post_header: boolean; + }; + }; +}; + +export type CreateBadgeResponse = + CreateBadgeResponses[keyof CreateBadgeResponses]; + +export type DeleteBadgeData = { + body?: never; + path: { + id: number; + }; + query?: never; + url: '/admin/badges/{id}.json'; +}; + +export type DeleteBadgeResponses = { + /** + * success response + */ + 200: unknown; +}; + +export type UpdateBadgeData = { + body?: { + /** + * The name for the new badge. + */ + name: string; + /** + * The ID for the badge type. 1 for Gold, 2 for Silver, + * 3 for Bronze. + */ + badge_type_id: number; + }; + path: { + id: number; + }; + query?: never; + url: '/admin/badges/{id}.json'; +}; + +export type UpdateBadgeResponses = { + /** + * success response + */ + 200: { + badge_types: Array<{ + id: number; + name: string; + sort_order: number; + }>; + badge: { + id: number; + name: string; + description: string; + grant_count: number; + allow_title: boolean; + multiple_grant: boolean; + icon: string; + image_url: string | null; + image_upload_id: number | null; + listable: boolean; + enabled: boolean; + badge_grouping_id: number; + system: boolean; + long_description: string; + slug: string; + manually_grantable: boolean; + query: string | null; + trigger: string | null; + target_posts: boolean; + auto_revoke: boolean; + show_posts: boolean; + badge_type_id: number; + show_in_post_header: boolean; + }; + }; +}; + +export type UpdateBadgeResponse = + UpdateBadgeResponses[keyof UpdateBadgeResponses]; + +export type ListCategoriesData = { + body?: never; + path?: never; + query?: { + include_subcategories?: true; + }; + url: '/categories.json'; +}; + +export type ListCategoriesResponses = { + /** + * success response + */ + 200: { + category_list: { + can_create_category: boolean; + can_create_topic: boolean; + categories: Array<{ + id: number; + name: string; + color: string; + text_color: string; + slug: string; + topic_count: number; + post_count: number; + position: number; + description: string | null; + description_text: string | null; + description_excerpt: string | null; + topic_url: string | null; + read_restricted: boolean; + permission: number; + notification_level: number; + can_edit: boolean; + topic_template: string | null; + has_children: boolean; + subcategory_count: number | null; + sort_order: string | null; + sort_ascending: string | null; + show_subcategory_list: boolean; + num_featured_topics: number; + default_view: string | null; + subcategory_list_style: string; + default_top_period: string; + default_list_filter: string; + minimum_required_tags: number; + navigate_to_first_post_after_read: boolean; + topics_day: number; + topics_week: number; + topics_month: number; + topics_year: number; + topics_all_time: number; + is_uncategorized?: boolean; + subcategory_ids: Array; + subcategory_list?: Array | null; + uploaded_logo: string | null; + uploaded_logo_dark: string | null; + uploaded_background: string | null; + uploaded_background_dark: string | null; + }>; + }; + }; +}; + +export type ListCategoriesResponse = + ListCategoriesResponses[keyof ListCategoriesResponses]; + +export type CreateCategoryData = { + body?: { + name: string; + color?: string; + text_color?: string; + parent_category_id?: number; + allow_badges?: boolean; + slug?: string; + topic_featured_links_allowed?: boolean; + permissions?: { + everyone?: number; + staff?: number; + [key: string]: unknown | number | undefined; + }; + search_priority?: number; + form_template_ids?: Array; + }; + path?: never; + query?: never; + url: '/categories.json'; +}; + +export type CreateCategoryResponses = { + /** + * success response + */ + 200: { + category: { + id: number; + name: string; + color: string; + text_color: string; + slug: string; + topic_count: number; + post_count: number; + position: number; + description: string | null; + description_text: string | null; + description_excerpt: string | null; + topic_url: string | null; + read_restricted: boolean; + permission: number | null; + notification_level: number; + can_edit: boolean; + topic_template: string | null; + form_template_ids?: Array; + has_children: boolean | null; + subcategory_count: number | null; + sort_order: string | null; + sort_ascending: string | null; + show_subcategory_list: boolean; + num_featured_topics: number; + default_view: string | null; + subcategory_list_style: string; + default_top_period: string; + default_list_filter: string; + minimum_required_tags: number; + navigate_to_first_post_after_read: boolean; + custom_fields: { + [key: string]: never; + }; + allowed_tags?: Array; + allowed_tag_groups?: Array; + allow_global_tags?: boolean; + required_tag_groups: Array<{ + name: string; + min_count: number; + }>; + category_setting?: unknown; + read_only_banner: string | null; + available_groups: Array; + auto_close_hours: string | null; + auto_close_based_on_last_post: boolean; + allow_unlimited_owner_edits_on_first_post: boolean; + default_slow_mode_seconds: string | null; + group_permissions: Array<{ + permission_type: number; + group_name: string; + }>; + email_in: string | null; + email_in_allow_strangers: boolean; + mailinglist_mirror: boolean; + all_topics_wiki: boolean; + can_delete: boolean; + allow_badges: boolean; + topic_featured_link_allowed: boolean; + search_priority: number; + uploaded_logo: string | null; + uploaded_logo_dark: string | null; + uploaded_background: string | null; + uploaded_background_dark: string | null; + }; + }; +}; + +export type CreateCategoryResponse = + CreateCategoryResponses[keyof CreateCategoryResponses]; + +export type UpdateCategoryData = { + body?: { + name: string; + color?: string; + text_color?: string; + parent_category_id?: number; + allow_badges?: boolean; + slug?: string; + topic_featured_links_allowed?: boolean; + permissions?: { + everyone?: number; + staff?: number; + [key: string]: unknown | number | undefined; + }; + search_priority?: number; + form_template_ids?: Array; + }; + path: { + id: number; + }; + query?: never; + url: '/categories/{id}.json'; +}; + +export type UpdateCategoryResponses = { + /** + * success response + */ + 200: { + success: string; + category: { + id: number; + name: string; + color: string; + text_color: string; + slug: string; + topic_count: number; + post_count: number; + position: number; + description: string | null; + description_text: string | null; + description_excerpt: string | null; + topic_url: string | null; + read_restricted: boolean; + permission: number | null; + notification_level: number; + can_edit: boolean; + topic_template: string | null; + form_template_ids: Array; + has_children: boolean | null; + subcategory_count: number | null; + sort_order: string | null; + sort_ascending: string | null; + show_subcategory_list: boolean; + num_featured_topics: number; + default_view: string | null; + subcategory_list_style: string; + default_top_period: string; + default_list_filter: string; + minimum_required_tags: number; + navigate_to_first_post_after_read: boolean; + custom_fields: { + [key: string]: never; + }; + allowed_tags?: Array; + allowed_tag_groups?: Array; + allow_global_tags?: boolean; + required_tag_groups: Array<{ + name: string; + min_count: number; + }>; + category_setting?: unknown; + read_only_banner: string | null; + available_groups: Array; + auto_close_hours: string | null; + auto_close_based_on_last_post: boolean; + allow_unlimited_owner_edits_on_first_post: boolean; + default_slow_mode_seconds: string | null; + group_permissions: Array<{ + permission_type: number; + group_name: string; + }>; + email_in: string | null; + email_in_allow_strangers: boolean; + mailinglist_mirror: boolean; + all_topics_wiki: boolean; + can_delete: boolean; + allow_badges: boolean; + topic_featured_link_allowed: boolean; + search_priority: number; + uploaded_logo: string | null; + uploaded_logo_dark: string | null; + uploaded_background: string | null; + uploaded_background_dark: string | null; + }; + }; +}; + +export type UpdateCategoryResponse = + UpdateCategoryResponses[keyof UpdateCategoryResponses]; + +export type ListCategoryTopicsData = { + body?: never; + path: { + slug: string; + id: number; + }; + query?: never; + url: '/c/{slug}/{id}.json'; +}; + +export type ListCategoryTopicsResponses = { + /** + * success response + */ + 200: { + users?: Array<{ + id: number; + username: string; + name: string; + avatar_template: string; + }>; + primary_groups?: Array; + topic_list: { + can_create_topic: boolean; + per_page: number; + top_tags?: Array; + topics: Array<{ + id: number; + title: string; + fancy_title: string; + slug: string; + posts_count: number; + reply_count: number; + highest_post_number: number; + image_url: string | null; + created_at: string; + last_posted_at: string; + bumped: boolean; + bumped_at: string; + archetype: string; + unseen: boolean; + pinned: boolean; + unpinned: string | null; + excerpt: string; + visible: boolean; + closed: boolean; + archived: boolean; + bookmarked: string | null; + liked: string | null; + views: number; + like_count: number; + has_summary: boolean; + last_poster_username: string; + category_id: number; + pinned_globally: boolean; + featured_link: string | null; + posters: Array<{ + extras: string; + description: string; + user_id: number; + primary_group_id: number | null; + }>; + }>; + }; + }; +}; + +export type ListCategoryTopicsResponse = + ListCategoryTopicsResponses[keyof ListCategoryTopicsResponses]; + +export type GetCategoryData = { + body?: never; + path: { + id: number; + }; + query?: never; + url: '/c/{id}/show.json'; +}; + +export type GetCategoryResponses = { + /** + * response + */ + 200: { + category: { + id: number; + name: string; + color: string; + text_color: string; + slug: string; + topic_count: number; + post_count: number; + position: number; + description: string | null; + description_text: string | null; + description_excerpt: string | null; + topic_url: string | null; + read_restricted: boolean; + permission: number | null; + notification_level: number; + can_edit: boolean; + topic_template: string | null; + form_template_ids?: Array; + has_children: boolean | null; + subcategory_count: number | null; + sort_order: string | null; + sort_ascending: string | null; + show_subcategory_list: boolean; + num_featured_topics: number; + default_view: string | null; + subcategory_list_style: string; + default_top_period: string; + default_list_filter: string; + minimum_required_tags: number; + navigate_to_first_post_after_read: boolean; + custom_fields: { + [key: string]: never; + }; + allowed_tags?: Array; + allowed_tag_groups?: Array; + allow_global_tags?: boolean; + required_tag_groups: Array<{ + name: string; + min_count: number; + }>; + category_setting?: unknown; + read_only_banner: string | null; + available_groups: Array; + auto_close_hours: string | null; + auto_close_based_on_last_post: boolean; + allow_unlimited_owner_edits_on_first_post: boolean; + default_slow_mode_seconds: string | null; + group_permissions: Array<{ + permission_type: number; + group_name: string; + }>; + email_in: string | null; + email_in_allow_strangers: boolean; + mailinglist_mirror: boolean; + all_topics_wiki: boolean; + can_delete: boolean; + allow_badges: boolean; + topic_featured_link_allowed: boolean; + search_priority: number; + uploaded_logo: string | null; + uploaded_logo_dark: string | null; + uploaded_background: string | null; + uploaded_background_dark: string | null; + }; + }; +}; + +export type GetCategoryResponse = + GetCategoryResponses[keyof GetCategoryResponses]; + +export type CreateGroupData = { + body?: { + group: { + name: string; + full_name?: string; + /** + * About Group + */ + bio_raw?: string; + /** + * comma,separated + */ + usernames?: string; + /** + * comma,separated + */ + owner_usernames?: string; + /** + * pipe|separated + */ + automatic_membership_email_domains?: string; + visibility_level?: number; + primary_group?: boolean; + flair_icon?: string; + flair_upload_id?: number; + flair_bg_color?: string; + public_admission?: boolean; + public_exit?: boolean; + default_notification_level?: number; + muted_category_ids?: Array; + regular_category_ids?: Array; + watching_category_ids?: Array; + tracking_category_ids?: Array; + watching_first_post_category_ids?: Array; + }; + }; + path?: never; + query?: never; + url: '/admin/groups.json'; +}; + +export type CreateGroupResponses = { + /** + * group created + */ + 200: { + basic_group: { + id: number; + automatic: boolean; + name: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: string | null; + grant_trust_level: string | null; + incoming_email: string | null; + has_messages: boolean; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + bio_raw: string | null; + bio_cooked: string | null; + bio_excerpt: string | null; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name: string | null; + default_notification_level: number; + membership_request_template: string | null; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + can_edit_group?: boolean; + publish_read_state: boolean; + }; + }; +}; + +export type CreateGroupResponse = + CreateGroupResponses[keyof CreateGroupResponses]; + +export type DeleteGroupData = { + body?: never; + path: { + id: number; + }; + query?: never; + url: '/admin/groups/{id}.json'; +}; + +export type DeleteGroupResponses = { + /** + * response + */ + 200: { + success: string; + }; +}; + +export type DeleteGroupResponse = + DeleteGroupResponses[keyof DeleteGroupResponses]; + +export type GetGroupData = { + body?: never; + path: { + /** + * Use group name instead of id + */ + id: string; + }; + query?: never; + url: '/groups/{id}.json'; +}; + +export type GetGroupResponses = { + /** + * success response + */ + 200: { + group: { + id: number; + automatic: boolean; + name: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: string | null; + grant_trust_level: string | null; + incoming_email: string | null; + has_messages: boolean; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + bio_raw: string | null; + bio_cooked: string | null; + bio_excerpt: string | null; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name: string | null; + default_notification_level: number; + membership_request_template: string | null; + is_group_user: boolean; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + can_edit_group?: boolean; + publish_read_state: boolean; + is_group_owner_display: boolean; + mentionable: boolean; + messageable: boolean; + automatic_membership_email_domains: string | null; + smtp_updated_at?: string | null; + smtp_updated_by?: { + [key: string]: unknown; + } | null; + smtp_enabled?: boolean; + smtp_server: string | null; + smtp_port: string | null; + smtp_ssl_mode: number | null; + imap_enabled?: boolean; + imap_updated_at?: string | null; + imap_updated_by?: { + [key: string]: unknown; + } | null; + imap_server: string | null; + imap_port: string | null; + imap_ssl: string | null; + imap_mailbox_name: string; + imap_mailboxes: Array; + email_username: string | null; + email_from_alias?: string | null; + email_password: string | null; + imap_last_error: string | null; + imap_old_emails: string | null; + imap_new_emails: string | null; + message_count: number; + allow_unknown_sender_topic_replies: boolean; + associated_group_ids?: Array; + watching_category_ids: Array; + tracking_category_ids: Array; + watching_first_post_category_ids: Array; + regular_category_ids: Array; + muted_category_ids: Array; + watching_tags?: Array; + watching_first_post_tags?: Array; + tracking_tags?: Array; + regular_tags?: Array; + muted_tags?: Array; + }; + extras: { + visible_group_names: Array; + }; + }; +}; + +export type GetGroupResponse = GetGroupResponses[keyof GetGroupResponses]; + +export type UpdateGroupData = { + body?: { + group: { + name: string; + full_name?: string; + /** + * About Group + */ + bio_raw?: string; + /** + * comma,separated + */ + usernames?: string; + /** + * comma,separated + */ + owner_usernames?: string; + /** + * pipe|separated + */ + automatic_membership_email_domains?: string; + visibility_level?: number; + primary_group?: boolean; + flair_icon?: string; + flair_upload_id?: number; + flair_bg_color?: string; + public_admission?: boolean; + public_exit?: boolean; + default_notification_level?: number; + muted_category_ids?: Array; + regular_category_ids?: Array; + watching_category_ids?: Array; + tracking_category_ids?: Array; + watching_first_post_category_ids?: Array; + }; + }; + path: { + id: number; + }; + query?: never; + url: '/groups/{id}.json'; +}; + +export type UpdateGroupResponses = { + /** + * success response + */ + 200: { + success?: string; + }; +}; + +export type UpdateGroupResponse = + UpdateGroupResponses[keyof UpdateGroupResponses]; + +export type RemoveGroupMembersData = { + body?: { + /** + * comma separated list + */ + usernames?: string; + }; + path: { + id: number; + }; + query?: never; + url: '/groups/{id}/members.json'; +}; + +export type RemoveGroupMembersResponses = { + /** + * success response + */ + 200: { + success: string; + usernames: Array; + skipped_usernames: Array; + }; +}; + +export type RemoveGroupMembersResponse = + RemoveGroupMembersResponses[keyof RemoveGroupMembersResponses]; + +export type ListGroupMembersData = { + body?: never; + path: { + /** + * Use group name instead of id + */ + id: string; + }; + query?: never; + url: '/groups/{id}/members.json'; +}; + +export type ListGroupMembersResponses = { + /** + * success response + */ + 200: { + members: Array<{ + id: number; + username: string; + name: string | null; + avatar_template: string; + title: string | null; + last_posted_at: string; + last_seen_at: string; + added_at: string; + timezone: string; + }>; + owners: Array<{ + id: number; + username: string; + name: string | null; + avatar_template: string; + title: string | null; + last_posted_at: string; + last_seen_at: string; + added_at: string; + timezone: string; + }>; + meta: { + total: number; + limit: number; + offset: number; + }; + }; +}; + +export type ListGroupMembersResponse = + ListGroupMembersResponses[keyof ListGroupMembersResponses]; + +export type AddGroupMembersData = { + body?: { + /** + * comma separated list + */ + usernames?: string; + }; + path: { + id: number; + }; + query?: never; + url: '/groups/{id}/members.json'; +}; + +export type AddGroupMembersResponses = { + /** + * success response + */ + 200: { + success: string; + usernames: Array; + emails: Array; + }; +}; + +export type AddGroupMembersResponse = + AddGroupMembersResponses[keyof AddGroupMembersResponses]; + +export type ListGroupsData = { + body?: never; + path?: never; + query?: never; + url: '/groups.json'; +}; + +export type ListGroupsResponses = { + /** + * response + */ + 200: { + groups: Array<{ + id: number; + automatic: boolean; + name: string; + display_name: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: string | null; + grant_trust_level: string | null; + incoming_email: string | null; + has_messages: boolean; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + bio_raw: string | null; + bio_cooked: string | null; + bio_excerpt: string | null; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name: string | null; + default_notification_level: number; + membership_request_template: string | null; + is_group_user?: boolean; + is_group_owner?: boolean; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + can_edit_group?: boolean; + publish_read_state: boolean; + }>; + extras: { + type_filters: Array; + }; + total_rows_groups: number; + load_more_groups: string; + }; +}; + +export type ListGroupsResponse = ListGroupsResponses[keyof ListGroupsResponses]; + +export type CreateInviteData = { + body?: { + /** + * required for email invites only + */ + email?: string; + skip_email?: boolean; + /** + * optional, for email invites + */ + custom_message?: string; + /** + * optional, for link invites + */ + max_redemptions_allowed?: number; + topic_id?: number; + /** + * Optional, either this or `group_names`. Comma separated + * list for multiple ids. + */ + group_ids?: string; + /** + * Optional, either this or `group_ids`. Comma separated + * list for multiple names. + */ + group_names?: string; + /** + * optional, if not supplied, the invite_expiry_days site + * setting is used + */ + expires_at?: string; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path?: never; + query?: never; + url: '/invites.json'; +}; + +export type CreateInviteResponses = { + /** + * success response + */ + 200: { + id?: number; + link?: string; + email?: string; + emailed?: boolean; + custom_message?: string | null; + topics?: Array; + groups?: Array; + created_at?: string; + updated_at?: string; + expires_at?: string; + expired?: boolean; + }; +}; + +export type CreateInviteResponse = + CreateInviteResponses[keyof CreateInviteResponses]; + +export type CreateMultipleInvitesData = { + body?: { + /** + * pass 1 email per invite to be generated. other properties + * will be shared by each invite. + */ + email?: string; + skip_email?: boolean; + /** + * optional, for email invites + */ + custom_message?: string; + /** + * optional, for link invites + */ + max_redemptions_allowed?: number; + topic_id?: number; + /** + * Optional, either this or `group_names`. Comma separated + * list for multiple ids. + */ + group_ids?: string; + /** + * Optional, either this or `group_ids`. Comma separated + * list for multiple names. + */ + group_names?: string; + /** + * optional, if not supplied, the invite_expiry_days site + * setting is used + */ + expires_at?: string; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path?: never; + query?: never; + url: '/invites/create-multiple.json'; +}; + +export type CreateMultipleInvitesResponses = { + /** + * success response + */ + 200: { + num_successfully_created_invitations?: number; + num_failed_invitations?: number; + failed_invitations?: Array; + successful_invitations?: Array; + }; +}; + +export type CreateMultipleInvitesResponse = + CreateMultipleInvitesResponses[keyof CreateMultipleInvitesResponses]; + +export type GetNotificationsData = { + body?: never; + path?: never; + query?: never; + url: '/notifications.json'; +}; + +export type GetNotificationsResponses = { + /** + * notifications + */ + 200: { + notifications?: Array<{ + id?: number; + user_id?: number; + notification_type?: number; + read?: boolean; + created_at?: string; + post_number?: number | null; + topic_id?: number | null; + slug?: string | null; + data?: { + badge_id?: number; + badge_name?: string; + badge_slug?: string; + badge_title?: boolean; + username?: string; + }; + }>; + total_rows_notifications?: number; + seen_notification_id?: number; + load_more_notifications?: string; + }; +}; + +export type GetNotificationsResponse = + GetNotificationsResponses[keyof GetNotificationsResponses]; + +export type MarkNotificationsAsReadData = { + body?: { + /** + * (optional) Leave off to mark all notifications as + * read + */ + id?: number; + }; + path?: never; + query?: never; + url: '/notifications/mark-read.json'; +}; + +export type MarkNotificationsAsReadResponses = { + /** + * notifications marked read + */ + 200: { + success?: string; + }; +}; + +export type MarkNotificationsAsReadResponse = + MarkNotificationsAsReadResponses[keyof MarkNotificationsAsReadResponses]; + +export type ListPostsData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path?: never; + query?: { + /** + * Load posts with an id lower than this value. Useful for pagination. + */ + before?: string; + }; + url: '/posts.json'; +}; + +export type ListPostsResponses = { + /** + * latest posts + */ + 200: { + latest_posts?: Array<{ + id?: number; + name?: string; + username?: string; + avatar_template?: string; + created_at?: string; + cooked?: string; + post_number?: number; + post_type?: number; + updated_at?: string; + reply_count?: number; + reply_to_post_number?: string | null; + quote_count?: number; + incoming_link_count?: number; + reads?: number; + readers_count?: number; + score?: number; + yours?: boolean; + topic_id?: number; + topic_slug?: string; + topic_title?: string; + topic_html_title?: string; + category_id?: number; + display_username?: string; + primary_group_name?: string | null; + flair_name?: string | null; + flair_url?: string | null; + flair_bg_color?: string | null; + flair_color?: string | null; + flair_group_id?: number | null; + version?: number; + can_edit?: boolean; + can_delete?: boolean; + can_recover?: boolean; + can_see_hidden_post?: boolean; + can_wiki?: boolean; + user_title?: string | null; + raw?: string; + actions_summary?: Array<{ + id?: number; + can_act?: boolean; + }>; + moderator?: boolean; + admin?: boolean; + staff?: boolean; + user_id?: number; + hidden?: boolean; + trust_level?: number; + deleted_at?: string | null; + user_deleted?: boolean; + edit_reason?: string | null; + can_view_edit_history?: boolean; + wiki?: boolean; + reviewable_id?: number | null; + reviewable_score_count?: number; + reviewable_score_pending_count?: number; + }>; + }; +}; + +export type ListPostsResponse = ListPostsResponses[keyof ListPostsResponses]; + +export type CreateTopicPostPmData = { + body?: { + /** + * Required if creating a new topic or new private message. + */ + title?: string; + raw: string; + /** + * Required if creating a new post. + */ + topic_id?: number; + /** + * Optional if creating a new topic, and ignored if creating + * a new post. + */ + category?: number; + /** + * Required for private message, comma separated. + */ + target_recipients?: string; + /** + * Deprecated. Use target_recipients instead. + * @deprecated + */ + target_usernames?: string; + /** + * Required for new private message. + */ + archetype?: string; + created_at?: string; + /** + * Optional, the post number to reply to inside a topic. + */ + reply_to_post_number?: number; + /** + * Provide a URL from a remote system to associate a forum + * topic with that URL, typically for using Discourse as a comments + * system for an external blog. + */ + embed_url?: string; + /** + * Provide an external_id from a remote system to associate + * a forum topic with that id. + */ + external_id?: string; + }; + path?: never; + query?: never; + url: '/posts.json'; +}; + +export type CreateTopicPostPmResponses = { + /** + * post created + */ + 200: { + id: number; + name: string | null; + username: string; + avatar_template: string; + created_at: string; + raw?: string; + cooked: string; + post_number: number; + post_type: number; + posts_count: number; + updated_at: string; + reply_count: number; + reply_to_post_number: string | null; + quote_count: number; + incoming_link_count: number; + reads: number; + readers_count: number; + score: number; + yours: boolean; + topic_id: number; + topic_slug: string; + display_username: string | null; + primary_group_name: string | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + flair_group_id?: number | null; + badges_granted?: Array; + version: number; + can_edit: boolean; + can_delete: boolean; + can_recover: boolean; + can_see_hidden_post?: boolean; + can_wiki: boolean; + user_title: string | null; + bookmarked: boolean; + actions_summary: Array<{ + id: number; + can_act: boolean; + }>; + moderator: boolean; + admin: boolean; + staff: boolean; + user_id: number; + draft_sequence: number; + hidden: boolean; + trust_level: number; + deleted_at: string | null; + user_deleted: boolean; + edit_reason: string | null; + can_view_edit_history: boolean; + wiki: boolean; + reviewable_id: number | null; + reviewable_score_count: number; + reviewable_score_pending_count: number; + post_url: string; + mentioned_users?: Array; + }; +}; + +export type CreateTopicPostPmResponse = + CreateTopicPostPmResponses[keyof CreateTopicPostPmResponses]; + +export type DeletePostData = { + body?: { + /** + * The `SiteSetting.can_permanently_delete` needs to be + * enabled first before this param can be used. Also this endpoint + * needs to be called first without `force_destroy` and then followed + * up with a second call 5 minutes later with `force_destroy` to + * permanently delete. + */ + force_destroy?: boolean; + }; + path: { + id: number; + }; + query?: never; + url: '/posts/{id}.json'; +}; + +export type DeletePostResponses = { + /** + * success response + */ + 200: unknown; +}; + +export type GetPostData = { + body?: never; + path: { + id: string; + }; + query?: never; + url: '/posts/{id}.json'; +}; + +export type GetPostResponses = { + /** + * single reviewable post + */ + 200: { + id: number; + username: string; + avatar_template: string; + created_at: string; + cooked: string; + post_number: number; + post_type: number; + posts_count: number; + updated_at: string; + reply_count: number; + reply_to_post_number: string | null; + quote_count: number; + incoming_link_count: number; + reads: number; + readers_count: number; + score: number; + yours: boolean; + topic_id: number; + topic_slug: string; + primary_group_name: string | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + flair_group_id?: number | null; + version: number; + can_edit: boolean; + can_delete: boolean; + can_recover: boolean; + can_see_hidden_post?: boolean; + can_wiki: boolean; + user_title: string | null; + bookmarked: boolean; + raw: string; + actions_summary: Array<{ + /** + * `2`: like, `3`, `4`, `6`, `7`, `8`: flag + */ + id: number; + count?: number; + acted?: boolean; + can_undo?: boolean; + can_act?: boolean; + }>; + moderator: boolean; + admin: boolean; + staff: boolean; + user_id: number; + hidden: boolean; + trust_level: number; + deleted_at: string | null; + user_deleted: boolean; + edit_reason: string | null; + can_view_edit_history: boolean; + wiki: boolean; + reviewable_id: number | null; + reviewable_score_count: number; + reviewable_score_pending_count: number; + post_url: string; + mentioned_users?: Array; + name?: string | null; + display_username?: string | null; + [key: string]: + | unknown + | number + | string + | (string | null) + | number + | boolean + | (string | null) + | (string | null) + | (string | null) + | (string | null) + | (string | null) + | (number | null) + | (string | null) + | Array<{ + /** + * `2`: like, `3`, `4`, `6`, `7`, `8`: flag + */ + id: number; + count?: number; + acted?: boolean; + can_undo?: boolean; + can_act?: boolean; + }> + | (string | null) + | (string | null) + | (number | null) + | Array + | (string | null) + | (string | null) + | undefined; + }; +}; + +export type GetPostResponse = GetPostResponses[keyof GetPostResponses]; + +export type UpdatePostData = { + body?: { + post?: { + raw: string; + edit_reason?: string; + }; + }; + path: { + id: string; + }; + query?: never; + url: '/posts/{id}.json'; +}; + +export type UpdatePostResponses = { + /** + * post updated + */ + 200: { + post: { + id: number; + username: string; + avatar_template: string; + created_at: string; + cooked: string; + post_number: number; + post_type: number; + posts_count: number; + updated_at: string; + reply_count: number; + reply_to_post_number: string | null; + quote_count: number; + incoming_link_count: number; + reads: number; + readers_count: number; + score: number; + yours: boolean; + topic_id: number; + topic_slug: string; + primary_group_name: string | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + flair_group_id?: number | null; + badges_granted?: Array; + version: number; + can_edit: boolean; + can_delete: boolean; + can_recover: boolean; + can_see_hidden_post?: boolean; + can_wiki: boolean; + user_title: string | null; + bookmarked: boolean; + raw: string; + actions_summary: Array<{ + id: number; + can_act: boolean; + }>; + moderator: boolean; + admin: boolean; + staff: boolean; + user_id: number; + draft_sequence: number; + hidden: boolean; + trust_level: number; + deleted_at: string | null; + user_deleted: boolean; + edit_reason: string | null; + can_view_edit_history: boolean; + wiki: boolean; + reviewable_id: number | null; + reviewable_score_count: number; + reviewable_score_pending_count: number; + post_url: string; + mentioned_users?: Array; + name?: string | null; + display_username?: string | null; + }; + }; +}; + +export type UpdatePostResponse = UpdatePostResponses[keyof UpdatePostResponses]; + +export type PostRepliesData = { + body?: never; + path: { + id: string; + }; + query?: never; + url: '/posts/{id}/replies.json'; +}; + +export type PostRepliesResponses = { + /** + * post replies + */ + 200: Array<{ + id: number; + name: string | null; + username: string; + avatar_template: string; + created_at: string; + cooked: string; + post_number: number; + post_type: number; + posts_count: number; + updated_at: string; + reply_count: number; + reply_to_post_number: number; + quote_count: number; + incoming_link_count: number; + reads: number; + readers_count: number; + score: number; + yours: boolean; + topic_id: number; + topic_slug: string; + display_username: string | null; + primary_group_name: string | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + flair_group_id?: number | null; + version: number; + can_edit: boolean; + can_delete: boolean; + can_recover: boolean; + can_see_hidden_post: boolean; + can_wiki: boolean; + user_title: string | null; + reply_to_user: { + username: string; + name?: string; + avatar_template: string; + }; + bookmarked: boolean; + actions_summary: Array<{ + id: number; + can_act: boolean; + }>; + moderator: boolean; + admin: boolean; + staff: boolean; + user_id: number; + hidden: boolean; + trust_level: number; + deleted_at: string | null; + user_deleted: boolean; + edit_reason: string | null; + can_view_edit_history: boolean; + wiki: boolean; + reviewable_id: number | null; + reviewable_score_count: number; + reviewable_score_pending_count: number; + post_url: string; + }>; +}; + +export type PostRepliesResponse = + PostRepliesResponses[keyof PostRepliesResponses]; + +export type LockPostData = { + body?: { + locked: string; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/posts/{id}/locked.json'; +}; + +export type LockPostResponses = { + /** + * post updated + */ + 200: { + locked?: boolean; + }; +}; + +export type LockPostResponse = LockPostResponses[keyof LockPostResponses]; + +export type PerformPostActionData = { + body?: { + id: number; + post_action_type_id: number; + flag_topic?: boolean; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path?: never; + query?: never; + url: '/post_actions.json'; +}; + +export type PerformPostActionResponses = { + /** + * post updated + */ + 200: { + id?: number; + name?: string; + username?: string; + avatar_template?: string; + created_at?: string; + cooked?: string; + post_number?: number; + post_type?: number; + updated_at?: string; + reply_count?: number; + reply_to_post_number?: string | null; + quote_count?: number; + incoming_link_count?: number; + reads?: number; + readers_count?: number; + score?: number; + yours?: boolean; + topic_id?: number; + topic_slug?: string; + display_username?: string; + primary_group_name?: string | null; + flair_name?: string | null; + flair_url?: string | null; + flair_bg_color?: string | null; + flair_color?: string | null; + version?: number; + can_edit?: boolean; + can_delete?: boolean; + can_recover?: boolean; + can_wiki?: boolean; + user_title?: string | null; + actions_summary?: Array<{ + id?: number; + count?: number; + acted?: boolean; + can_undo?: boolean; + }>; + moderator?: boolean; + admin?: boolean; + staff?: boolean; + user_id?: number; + hidden?: boolean; + trust_level?: number; + deleted_at?: string | null; + user_deleted?: boolean; + edit_reason?: string | null; + can_view_edit_history?: boolean; + wiki?: boolean; + notice?: { + [key: string]: unknown; + }; + notice_created_by_user?: { + [key: string]: unknown; + } | null; + reviewable_id?: number | null; + reviewable_score_count?: number; + reviewable_score_pending_count?: number; + }; +}; + +export type PerformPostActionResponse = + PerformPostActionResponses[keyof PerformPostActionResponses]; + +export type ListUserPrivateMessagesData = { + body?: never; + path: { + username: string; + }; + query?: never; + url: '/topics/private-messages/{username}.json'; +}; + +export type ListUserPrivateMessagesResponses = { + /** + * private messages + */ + 200: { + users?: Array<{ + id?: number; + username?: string; + name?: string; + avatar_template?: string; + }>; + primary_groups?: Array; + topic_list?: { + can_create_topic?: boolean; + draft?: string | null; + draft_key?: string; + draft_sequence?: number; + per_page?: number; + topics?: Array<{ + id?: number; + title?: string; + fancy_title?: string; + slug?: string; + posts_count?: number; + reply_count?: number; + highest_post_number?: number; + image_url?: string | null; + created_at?: string; + last_posted_at?: string; + bumped?: boolean; + bumped_at?: string; + archetype?: string; + unseen?: boolean; + last_read_post_number?: number; + unread_posts?: number; + pinned?: boolean; + unpinned?: string | null; + visible?: boolean; + closed?: boolean; + archived?: boolean; + notification_level?: number; + bookmarked?: boolean; + liked?: boolean; + views?: number; + like_count?: number; + has_summary?: boolean; + last_poster_username?: string; + category_id?: string | null; + pinned_globally?: boolean; + featured_link?: string | null; + allowed_user_count?: number; + posters?: Array<{ + extras?: string; + description?: string; + user_id?: number; + primary_group_id?: number | null; + }>; + participants?: Array<{ + extras?: string; + description?: string | null; + user_id?: number; + primary_group_id?: number | null; + }>; + }>; + }; + }; +}; + +export type ListUserPrivateMessagesResponse = + ListUserPrivateMessagesResponses[keyof ListUserPrivateMessagesResponses]; + +export type GetUserSentPrivateMessagesData = { + body?: never; + path: { + username: string; + }; + query?: never; + url: '/topics/private-messages-sent/{username}.json'; +}; + +export type GetUserSentPrivateMessagesResponses = { + /** + * private messages + */ + 200: { + users?: Array<{ + id?: number; + username?: string; + name?: string | null; + avatar_template?: string; + }>; + primary_groups?: Array; + topic_list?: { + can_create_topic?: boolean; + draft?: string | null; + draft_key?: string; + draft_sequence?: number; + per_page?: number; + topics?: Array<{ + id?: number; + title?: string; + fancy_title?: string; + slug?: string; + posts_count?: number; + reply_count?: number; + highest_post_number?: number; + image_url?: string | null; + created_at?: string; + last_posted_at?: string; + bumped?: boolean; + bumped_at?: string; + archetype?: string; + unseen?: boolean; + last_read_post_number?: number; + unread_posts?: number; + pinned?: boolean; + unpinned?: string | null; + visible?: boolean; + closed?: boolean; + archived?: boolean; + notification_level?: number; + bookmarked?: boolean; + liked?: boolean; + views?: number; + like_count?: number; + has_summary?: boolean; + last_poster_username?: string; + category_id?: string | null; + pinned_globally?: boolean; + featured_link?: string | null; + allowed_user_count?: number; + posters?: Array<{ + extras?: string; + description?: string; + user_id?: number; + primary_group_id?: number | null; + }>; + participants?: Array; + }>; + }; + }; +}; + +export type GetUserSentPrivateMessagesResponse = + GetUserSentPrivateMessagesResponses[keyof GetUserSentPrivateMessagesResponses]; + +export type SearchData = { + body?: never; + path?: never; + query?: { + /** + * The query string needs to be url encoded and is made up of the following options: + * - Search term. This is just a string. Usually it would be the first item in the query. + * - `@`: Use the `@` followed by the username to specify posts by this user. + * - `#`: Use the `#` followed by the category slug to search within this category. + * - `tags:`: `api,solved` or for posts that have all the specified tags `api+solved`. + * - `before:`: `yyyy-mm-dd` + * - `after:`: `yyyy-mm-dd` + * - `order:`: `latest`, `likes`, `views`, `latest_topic` + * - `assigned:`: username (without `@`) + * - `in:`: `title`, `likes`, `personal`, `messages`, `seen`, `unseen`, `posted`, `created`, `watching`, `tracking`, `bookmarks`, `assigned`, `unassigned`, `first`, `pinned`, `wiki` + * - `with:`: `images` + * - `status:`: `open`, `closed`, `public`, `archived`, `noreplies`, `single_user`, `solved`, `unsolved` + * - `group:`: group_name or group_id + * - `group_messages:`: group_name or group_id + * - `min_posts:`: 1 + * - `max_posts:`: 10 + * - `min_views:`: 1 + * - `max_views:`: 10 + * + * If you are using cURL you can use the `-G` and the `--data-urlencode` flags to encode the query: + * + * ``` + * curl -i -sS -X GET -G "http://localhost:4200/search.json" \ + * --data-urlencode 'q=wordpress @scossar #fun after:2020-01-01' + * ``` + * + */ + q?: string; + page?: number; + }; + url: '/search.json'; +}; + +export type SearchResponses = { + /** + * success response + */ + 200: { + posts: Array; + users: Array; + categories: Array; + tags: Array; + groups: Array; + grouped_search_result: { + more_posts: string | null; + more_users: string | null; + more_categories: string | null; + term: string; + search_log_id: number; + more_full_page_results: string | null; + can_create_topic: boolean; + error: string | null; + extra?: { + categories?: Array | null; + }; + post_ids: Array; + user_ids: Array; + category_ids: Array; + tag_ids: Array; + group_ids: Array; + }; + }; +}; + +export type SearchResponse = SearchResponses[keyof SearchResponses]; + +export type GetSiteData = { + body?: never; + path?: never; + query?: never; + url: '/site.json'; +}; + +export type GetSiteResponses = { + /** + * success response + */ + 200: { + default_archetype: string; + notification_types: { + mentioned: number; + replied: number; + quoted: number; + edited: number; + liked: number; + private_message: number; + invited_to_private_message: number; + invitee_accepted: number; + posted: number; + watching_category_or_tag: number; + new_features?: number; + admin_problems?: number; + moved_post: number; + linked: number; + granted_badge: number; + invited_to_topic: number; + custom: number; + group_mentioned: number; + group_message_summary: number; + watching_first_post: number; + topic_reminder: number; + liked_consolidated: number; + linked_consolidated: number; + post_approved: number; + code_review_commit_approved: number; + membership_request_accepted: number; + membership_request_consolidated: number; + bookmark_reminder: number; + reaction: number; + votes_released: number; + event_reminder: number; + event_invitation: number; + chat_mention: number; + chat_message: number; + chat_invitation: number; + chat_group_mention: number; + chat_quoted?: number; + chat_watched_thread?: number; + assigned?: number; + question_answer_user_commented?: number; + following?: number; + following_created_topic?: number; + following_replied?: number; + circles_activity?: number; + }; + post_types: { + regular: number; + moderator_action: number; + small_action: number; + whisper: number; + }; + trust_levels: { + newuser: number; + basic: number; + member: number; + regular: number; + leader: number; + }; + user_tips?: { + first_notification: number; + topic_timeline: number; + post_menu: number; + topic_notification_levels: number; + suggested_topics: number; + }; + groups: Array<{ + id: number; + name: string; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + }>; + filters: Array; + periods: Array; + top_menu_items: Array; + anonymous_top_menu_items: Array; + uncategorized_category_id: number; + user_field_max_length: number; + post_action_types: Array<{ + id: number | null; + name_key: string | null; + name: string; + description: string; + short_description: string; + is_flag: boolean; + require_message: boolean; + enabled: boolean; + applies_to: Array; + is_used: boolean; + position?: number; + auto_action_type: boolean; + }>; + topic_flag_types: Array<{ + id: number | null; + name_key: string | null; + name: string; + description: string; + short_description: string; + is_flag: boolean; + require_message: boolean; + enabled: boolean; + applies_to: Array; + is_used: boolean; + position?: number; + auto_action_type: boolean; + }>; + can_create_tag: boolean; + can_tag_topics: boolean; + can_tag_pms: boolean; + tags_filter_regexp: string; + top_tags: Array; + wizard_required?: boolean; + can_associate_groups?: boolean; + topic_featured_link_allowed_category_ids: Array; + user_themes: Array<{ + theme_id: number; + name: string; + default: boolean; + color_scheme_id: number | null; + }>; + user_color_schemes: Array<{ + id: number; + name: string; + is_dark: boolean; + }>; + default_dark_color_scheme: { + [key: string]: unknown; + } | null; + censored_regexp: Array<{ + [key: string]: unknown; + }>; + custom_emoji_translation: { + [key: string]: never; + }; + watched_words_replace: string | null; + watched_words_link: string | null; + markdown_additional_options?: { + [key: string]: unknown; + }; + hashtag_configurations?: { + [key: string]: unknown; + }; + hashtag_icons?: { + [key: string]: unknown; + }; + displayed_about_plugin_stat_groups?: Array; + categories: Array<{ + id: number; + name: string; + color: string; + text_color: string; + slug: string; + topic_count: number; + post_count: number; + position: number; + description?: string | null; + description_text?: string | null; + description_excerpt?: string | null; + topic_url: string; + read_restricted: boolean; + permission: number; + notification_level: number; + topic_template: string | null; + has_children: boolean; + subcategory_count: number | null; + sort_order: string | null; + sort_ascending: string | null; + show_subcategory_list: boolean; + num_featured_topics: number; + default_view: string | null; + subcategory_list_style: string; + default_top_period: string; + default_list_filter: string; + minimum_required_tags: number; + navigate_to_first_post_after_read: boolean; + allowed_tags: Array; + allowed_tag_groups: Array; + allow_global_tags: boolean; + required_tag_groups: Array<{ + name: string; + min_count: number; + }>; + read_only_banner: string | null; + uploaded_logo: string | null; + uploaded_logo_dark: string | null; + uploaded_background: string | null; + uploaded_background_dark: string | null; + can_edit: boolean; + custom_fields?: { + [key: string]: unknown; + } | null; + parent_category_id?: number; + form_template_ids?: Array; + }>; + archetypes: Array<{ + id: string; + name: string; + options: Array; + }>; + user_fields: Array; + auth_providers: Array; + whispers_allowed_groups_names?: Array; + denied_emojis?: Array; + valid_flag_applies_to_types?: Array; + navigation_menu_site_top_tags?: Array; + full_name_required_for_signup: boolean; + full_name_visible_in_signup: boolean; + }; +}; + +export type GetSiteResponse = GetSiteResponses[keyof GetSiteResponses]; + +export type GetSiteBasicInfoData = { + body?: never; + path?: never; + query?: never; + url: '/site/basic-info.json'; +}; + +export type GetSiteBasicInfoResponses = { + /** + * success response + */ + 200: { + logo_url: string; + logo_small_url: string; + apple_touch_icon_url: string; + favicon_url: string; + title: string; + description: string; + header_primary_color: string; + header_background_color: string; + login_required: boolean; + locale: string; + include_in_discourse_discover: boolean; + mobile_logo_url: string; + }; +}; + +export type GetSiteBasicInfoResponse = + GetSiteBasicInfoResponses[keyof GetSiteBasicInfoResponses]; + +export type ListTagGroupsData = { + body?: never; + path?: never; + query?: never; + url: '/tag_groups.json'; +}; + +export type ListTagGroupsResponses = { + /** + * tags + */ + 200: { + tag_groups?: Array<{ + id?: number; + name?: string; + tag_names?: Array; + parent_tag_name?: Array; + one_per_topic?: boolean; + permissions?: { + staff?: number; + }; + }>; + }; +}; + +export type ListTagGroupsResponse = + ListTagGroupsResponses[keyof ListTagGroupsResponses]; + +export type CreateTagGroupData = { + body?: { + name: string; + }; + path?: never; + query?: never; + url: '/tag_groups.json'; +}; + +export type CreateTagGroupResponses = { + /** + * tag group created + */ + 200: { + tag_group: { + id: number; + name: string; + tag_names: Array; + parent_tag_name: Array; + one_per_topic: boolean; + permissions: { + [key: string]: unknown; + }; + }; + }; +}; + +export type CreateTagGroupResponse = + CreateTagGroupResponses[keyof CreateTagGroupResponses]; + +export type GetTagGroupData = { + body?: never; + path: { + id: string; + }; + query?: never; + url: '/tag_groups/{id}.json'; +}; + +export type GetTagGroupResponses = { + /** + * notifications + */ + 200: { + tag_group?: { + id?: number; + name?: string; + tag_names?: Array; + parent_tag_name?: Array; + one_per_topic?: boolean; + permissions?: { + everyone?: number; + }; + }; + }; +}; + +export type GetTagGroupResponse = + GetTagGroupResponses[keyof GetTagGroupResponses]; + +export type UpdateTagGroupData = { + body?: { + name?: string; + }; + path: { + id: string; + }; + query?: never; + url: '/tag_groups/{id}.json'; +}; + +export type UpdateTagGroupResponses = { + /** + * Tag group updated + */ + 200: { + success?: string; + tag_group?: { + id?: number; + name?: string; + tag_names?: Array; + parent_tag_name?: Array; + one_per_topic?: boolean; + permissions?: { + everyone?: number; + }; + }; + }; +}; + +export type UpdateTagGroupResponse = + UpdateTagGroupResponses[keyof UpdateTagGroupResponses]; + +export type ListTagsData = { + body?: never; + path?: never; + query?: never; + url: '/tags.json'; +}; + +export type ListTagsResponses = { + /** + * notifications + */ + 200: { + tags?: Array<{ + id?: string; + text?: string; + count?: number; + pm_count?: number; + target_tag?: string | null; + }>; + extras?: { + categories?: Array; + }; + }; +}; + +export type ListTagsResponse = ListTagsResponses[keyof ListTagsResponses]; + +export type GetTagData = { + body?: never; + path: { + name: string; + }; + query?: never; + url: '/tag/{name}.json'; +}; + +export type GetTagResponses = { + /** + * notifications + */ + 200: { + users?: Array<{ + id?: number; + username?: string; + name?: string | null; + avatar_template?: string; + }>; + primary_groups?: Array; + topic_list?: { + can_create_topic?: boolean; + draft?: string | null; + draft_key?: string; + draft_sequence?: number; + per_page?: number; + tags?: Array<{ + id?: number; + name?: string; + topic_count?: number; + staff?: boolean; + }>; + topics?: Array<{ + id?: number; + title?: string; + fancy_title?: string; + slug?: string; + posts_count?: number; + reply_count?: number; + highest_post_number?: number; + image_url?: string | null; + created_at?: string; + last_posted_at?: string; + bumped?: boolean; + bumped_at?: string; + archetype?: string; + unseen?: boolean; + last_read_post_number?: number; + unread_posts?: number; + pinned?: boolean; + unpinned?: string | null; + visible?: boolean; + closed?: boolean; + archived?: boolean; + notification_level?: number; + bookmarked?: boolean; + liked?: boolean; + tags?: Array; + views?: number; + like_count?: number; + has_summary?: boolean; + last_poster_username?: string; + category_id?: number; + pinned_globally?: boolean; + featured_link?: string | null; + posters?: Array<{ + extras?: string; + description?: string; + user_id?: number; + primary_group_id?: number | null; + }>; + }>; + }; + }; +}; + +export type GetTagResponse = GetTagResponses[keyof GetTagResponses]; + +export type GetSpecificPostsFromTopicData = { + body?: { + 'post_ids[]': number; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}/posts.json'; +}; + +export type GetSpecificPostsFromTopicResponses = { + /** + * specific posts + */ + 200: { + post_stream?: { + posts?: Array<{ + id?: number; + name?: string | null; + username?: string; + avatar_template?: string; + created_at?: string; + cooked?: string; + post_number?: number; + post_type?: number; + updated_at?: string; + reply_count?: number; + reply_to_post_number?: string | null; + quote_count?: number; + incoming_link_count?: number; + reads?: number; + readers_count?: number; + score?: number; + yours?: boolean; + topic_id?: number; + topic_slug?: string; + display_username?: string | null; + primary_group_name?: string | null; + flair_name?: string | null; + flair_url?: string | null; + flair_bg_color?: string | null; + flair_color?: string | null; + version?: number; + can_edit?: boolean; + can_delete?: boolean; + can_recover?: boolean; + can_wiki?: boolean; + read?: boolean; + user_title?: string | null; + actions_summary?: Array<{ + id?: number; + can_act?: boolean; + }>; + moderator?: boolean; + admin?: boolean; + staff?: boolean; + user_id?: number; + hidden?: boolean; + trust_level?: number; + deleted_at?: string | null; + user_deleted?: boolean; + edit_reason?: string | null; + can_view_edit_history?: boolean; + wiki?: boolean; + reviewable_id?: number; + reviewable_score_count?: number; + reviewable_score_pending_count?: number; + }>; + }; + id?: number; + }; +}; + +export type GetSpecificPostsFromTopicResponse = + GetSpecificPostsFromTopicResponses[keyof GetSpecificPostsFromTopicResponses]; + +export type RemoveTopicData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}.json'; +}; + +export type RemoveTopicResponses = { + /** + * specific posts + */ + 200: unknown; +}; + +export type GetTopicData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}.json'; +}; + +export type GetTopicResponses = { + /** + * specific posts + */ + 200: { + post_stream: { + posts: Array<{ + id: number; + name: string; + username: string; + avatar_template: string; + created_at: string; + cooked: string; + post_number: number; + post_type: number; + updated_at: string; + reply_count: number; + reply_to_post_number: string | null; + quote_count: number; + incoming_link_count: number; + reads: number; + readers_count: number; + score: number; + yours: boolean; + topic_id: number; + topic_slug: string; + display_username: string; + primary_group_name: string | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + version: number; + can_edit: boolean; + can_delete: boolean; + can_recover: boolean; + can_see_hidden_post?: boolean; + can_wiki: boolean; + link_counts: Array<{ + url: string; + internal: boolean; + reflection: boolean; + title: string; + clicks: number; + }>; + read: boolean; + user_title: string | null; + bookmarked: boolean; + actions_summary: Array<{ + id: number; + can_act: boolean; + }>; + moderator: boolean; + admin: boolean; + staff: boolean; + user_id: number; + hidden: boolean; + trust_level: number; + deleted_at: string | null; + user_deleted: boolean; + edit_reason: string | null; + can_view_edit_history: boolean; + wiki: boolean; + reviewable_id: number; + reviewable_score_count: number; + reviewable_score_pending_count: number; + }>; + stream: Array; + }; + timeline_lookup: Array; + suggested_topics: Array<{ + id: number; + title: string; + fancy_title: string; + slug: string; + posts_count: number; + reply_count: number; + highest_post_number: number; + image_url: string | null; + created_at: string; + last_posted_at: string | null; + bumped: boolean; + bumped_at: string; + archetype: string; + unseen: boolean; + pinned: boolean; + unpinned: string | null; + excerpt: string; + visible: boolean; + closed: boolean; + archived: boolean; + bookmarked: string | null; + liked: string | null; + tags: Array; + tags_descriptions: { + [key: string]: never; + }; + like_count: number; + views: number; + category_id: number; + featured_link: string | null; + posters: Array<{ + extras: string; + description: string; + user: { + id: number; + username: string; + name: string; + avatar_template: string; + }; + }>; + }>; + tags: Array; + tags_descriptions: { + [key: string]: never; + }; + id: number; + title: string; + fancy_title: string; + posts_count: number; + created_at: string; + views: number; + reply_count: number; + like_count: number; + last_posted_at: string | null; + visible: boolean; + closed: boolean; + archived: boolean; + has_summary: boolean; + archetype: string; + slug: string; + category_id: number; + word_count: number | null; + deleted_at: string | null; + user_id: number; + featured_link: string | null; + pinned_globally: boolean; + pinned_at: string | null; + pinned_until: string | null; + image_url: string | null; + slow_mode_seconds: number; + draft: string | null; + draft_key: string; + draft_sequence: number; + unpinned: string | null; + pinned: boolean; + current_post_number?: number; + highest_post_number: number | null; + deleted_by: string | null; + has_deleted: boolean; + actions_summary: Array<{ + id: number; + count: number; + hidden: boolean; + can_act: boolean; + }>; + chunk_size: number; + bookmarked: boolean; + bookmarks: Array; + topic_timer: string | null; + message_bus_last_id: number; + participant_count: number; + show_read_indicator: boolean; + thumbnails: string | null; + slow_mode_enabled_until: string | null; + details: { + can_edit: boolean; + notification_level: number; + can_move_posts: boolean; + can_delete: boolean; + can_remove_allowed_users: boolean; + can_create_post: boolean; + can_reply_as_new_topic: boolean; + can_invite_to?: boolean; + can_invite_via_email?: boolean; + can_flag_topic?: boolean; + can_convert_topic: boolean; + can_review_topic: boolean; + can_close_topic: boolean; + can_archive_topic: boolean; + can_split_merge_topic: boolean; + can_edit_staff_notes: boolean; + can_toggle_topic_visibility: boolean; + can_pin_unpin_topic: boolean; + can_moderate_category: boolean; + can_remove_self_id: number; + participants?: Array<{ + id: number; + username: string; + name: string; + avatar_template: string; + post_count: number; + primary_group_name: string | null; + flair_name: string | null; + flair_url: string | null; + flair_color: string | null; + flair_bg_color: string | null; + flair_group_id?: number | null; + admin: boolean; + moderator: boolean; + trust_level: number; + }>; + created_by: { + id: number; + username: string; + name: string; + avatar_template: string; + }; + last_poster: { + id: number; + username: string; + name: string; + avatar_template: string; + }; + }; + }; +}; + +export type GetTopicResponse = GetTopicResponses[keyof GetTopicResponses]; + +export type UpdateTopicData = { + body?: { + topic?: { + title?: string; + category_id?: number; + }; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/-/{id}.json'; +}; + +export type UpdateTopicResponses = { + /** + * topic updated + */ + 200: { + basic_topic?: { + id?: number; + title?: string; + fancy_title?: string; + slug?: string; + posts_count?: number; + }; + }; +}; + +export type UpdateTopicResponse = + UpdateTopicResponses[keyof UpdateTopicResponses]; + +export type InviteToTopicData = { + body?: { + user?: string; + email?: string; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}/invite.json'; +}; + +export type InviteToTopicResponses = { + /** + * topic updated + */ + 200: { + user?: { + id?: number; + username?: string; + name?: string; + avatar_template?: string; + }; + }; +}; + +export type InviteToTopicResponse = + InviteToTopicResponses[keyof InviteToTopicResponses]; + +export type InviteGroupToTopicData = { + body?: { + /** + * The name of the group to invite + */ + group?: string; + /** + * Whether to notify the group, it defaults to true + */ + should_notify?: boolean; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}/invite-group.json'; +}; + +export type InviteGroupToTopicResponses = { + /** + * invites to a PM + */ + 200: { + group?: { + id?: number; + name?: string; + }; + }; +}; + +export type InviteGroupToTopicResponse = + InviteGroupToTopicResponses[keyof InviteGroupToTopicResponses]; + +export type BookmarkTopicData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}/bookmark.json'; +}; + +export type BookmarkTopicResponses = { + /** + * topic updated + */ + 200: unknown; +}; + +export type UpdateTopicStatusData = { + body?: { + status: 'closed' | 'pinned' | 'pinned_globally' | 'archived' | 'visible'; + enabled: 'true' | 'false'; + /** + * Only required for `pinned` and `pinned_globally` + */ + until?: string; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}/status.json'; +}; + +export type UpdateTopicStatusResponses = { + /** + * topic updated + */ + 200: { + success?: string; + topic_status_update?: string | null; + }; +}; + +export type UpdateTopicStatusResponse = + UpdateTopicStatusResponses[keyof UpdateTopicStatusResponses]; + +export type ListLatestTopicsData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path?: never; + query?: { + /** + * Enum: `default`, `created`, `activity`, `views`, `posts`, `category`, + * `likes`, `op_likes`, `posters` + */ + order?: string; + /** + * Defaults to `desc`, add `ascending=true` to sort asc + */ + ascending?: string; + /** + * Maximum number of topics returned, between 1-100 + */ + per_page?: number; + }; + url: '/latest.json'; +}; + +export type ListLatestTopicsResponses = { + /** + * topic updated + */ + 200: { + users?: Array<{ + id?: number; + username?: string; + name?: string | null; + avatar_template?: string; + }>; + primary_groups?: Array; + topic_list?: { + can_create_topic?: boolean; + draft?: string | null; + draft_key?: string; + draft_sequence?: number; + per_page?: number; + topics?: Array<{ + id?: number; + title?: string; + fancy_title?: string; + slug?: string; + posts_count?: number; + reply_count?: number; + highest_post_number?: number; + image_url?: string; + created_at?: string; + last_posted_at?: string; + bumped?: boolean; + bumped_at?: string; + archetype?: string; + unseen?: boolean; + last_read_post_number?: number; + unread_posts?: number; + pinned?: boolean; + unpinned?: string | null; + visible?: boolean; + closed?: boolean; + archived?: boolean; + notification_level?: number; + bookmarked?: boolean; + liked?: boolean; + views?: number; + like_count?: number; + has_summary?: boolean; + last_poster_username?: string; + category_id?: number; + op_like_count?: number; + pinned_globally?: boolean; + featured_link?: string | null; + posters?: Array<{ + extras?: string; + description?: string; + user_id?: number; + primary_group_id?: number | null; + }>; + }>; + }; + }; +}; + +export type ListLatestTopicsResponse = + ListLatestTopicsResponses[keyof ListLatestTopicsResponses]; + +export type ListTopTopicsData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path?: never; + query?: { + /** + * Enum: `all`, `yearly`, `quarterly`, `monthly`, `weekly`, `daily` + */ + period?: string; + /** + * Maximum number of topics returned, between 1-100 + */ + per_page?: number; + }; + url: '/top.json'; +}; + +export type ListTopTopicsResponses = { + /** + * response + */ + 200: { + users?: Array<{ + id?: number; + username?: string; + name?: string; + avatar_template?: string; + }>; + primary_groups?: Array; + topic_list?: { + can_create_topic?: boolean; + draft?: string | null; + draft_key?: string; + draft_sequence?: number; + for_period?: string; + per_page?: number; + topics?: Array<{ + id?: number; + title?: string; + fancy_title?: string; + slug?: string; + posts_count?: number; + reply_count?: number; + highest_post_number?: number; + image_url?: string | null; + created_at?: string; + last_posted_at?: string; + bumped?: boolean; + bumped_at?: string; + archetype?: string; + unseen?: boolean; + last_read_post_number?: number; + unread_posts?: number; + pinned?: boolean; + unpinned?: boolean; + visible?: boolean; + closed?: boolean; + archived?: boolean; + notification_level?: number; + bookmarked?: boolean; + liked?: boolean; + views?: number; + like_count?: number; + has_summary?: boolean; + last_poster_username?: string; + category_id?: number; + op_like_count?: number; + pinned_globally?: boolean; + featured_link?: string | null; + posters?: Array<{ + extras?: string | null; + description?: string; + user_id?: number; + primary_group_id?: number | null; + }>; + }>; + }; + }; +}; + +export type ListTopTopicsResponse = + ListTopTopicsResponses[keyof ListTopTopicsResponses]; + +export type SetNotificationLevelData = { + body?: { + notification_level: '0' | '1' | '2' | '3'; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}/notifications.json'; +}; + +export type SetNotificationLevelResponses = { + /** + * topic updated + */ + 200: { + success?: string; + }; +}; + +export type SetNotificationLevelResponse = + SetNotificationLevelResponses[keyof SetNotificationLevelResponses]; + +export type UpdateTopicTimestampData = { + body?: { + timestamp: string; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}/change-timestamp.json'; +}; + +export type UpdateTopicTimestampResponses = { + /** + * topic updated + */ + 200: { + success?: string; + }; +}; + +export type UpdateTopicTimestampResponse = + UpdateTopicTimestampResponses[keyof UpdateTopicTimestampResponses]; + +export type CreateTopicTimerData = { + body?: { + time?: string; + status_type?: string; + based_on_last_post?: boolean; + category_id?: number; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + id: string; + }; + query?: never; + url: '/t/{id}/timer.json'; +}; + +export type CreateTopicTimerResponses = { + /** + * topic updated + */ + 200: { + success?: string; + execute_at?: string; + duration?: string | null; + based_on_last_post?: boolean; + closed?: boolean; + category_id?: number | null; + }; +}; + +export type CreateTopicTimerResponse = + CreateTopicTimerResponses[keyof CreateTopicTimerResponses]; + +export type GetTopicByExternalIdData = { + body?: never; + path: { + external_id: string; + }; + query?: never; + url: '/t/external_id/{external_id}.json'; +}; + +export type CreateUploadData = { + body?: { + type: + | 'avatar' + | 'profile_background' + | 'card_background' + | 'custom_emoji' + | 'composer'; + /** + * required if uploading an avatar + */ + user_id?: number; + /** + * Use this flag to return an id and url + */ + synchronous?: boolean; + file?: Blob | File; + }; + path?: never; + query?: never; + url: '/uploads.json'; +}; + +export type CreateUploadResponses = { + /** + * file uploaded + */ + 200: { + id: number; + url: string; + original_filename: string; + filesize: number; + width: number; + height: number; + thumbnail_width: number; + thumbnail_height: number; + extension: string; + short_url: string; + short_path: string; + retain_hours: string | null; + human_filesize: string; + dominant_color?: string | null; + thumbnail?: { + id?: number; + upload_id?: number; + url?: string; + extension?: string; + width?: number; + height?: number; + filesize?: number; + } | null; + }; +}; + +export type CreateUploadResponse = + CreateUploadResponses[keyof CreateUploadResponses]; + +export type GeneratePresignedPutData = { + body?: { + type: + | 'avatar' + | 'profile_background' + | 'card_background' + | 'custom_emoji' + | 'composer'; + file_name: string; + /** + * File size should be represented in bytes. + */ + file_size: number; + metadata?: { + /** + * The SHA1 checksum of the upload binary blob. Optionally + * be provided and serves as an additional security check when + * later processing the file in complete-external-upload endpoint. + */ + 'sha1-checksum'?: string; + }; + }; + path?: never; + query?: never; + url: '/uploads/generate-presigned-put.json'; +}; + +export type GeneratePresignedPutResponses = { + /** + * external upload initialized + */ + 200: { + /** + * The path of the temporary file on the external storage + * service. + */ + key?: string; + /** + * A presigned PUT URL which must be used to upload + * the file binary blob to. + */ + url?: string; + /** + * A map of headers that must be sent with the PUT request. + */ + signed_headers?: { + [key: string]: unknown; + }; + /** + * A unique string that identifies the external upload. + * This must be stored and then sent in the /complete-external-upload + * endpoint to complete the direct upload. + */ + unique_identifier?: string; + }; +}; + +export type GeneratePresignedPutResponse = + GeneratePresignedPutResponses[keyof GeneratePresignedPutResponses]; + +export type CompleteExternalUploadData = { + body?: { + /** + * The unique identifier returned in the original /generate-presigned-put + * request. + */ + unique_identifier: string; + /** + * Optionally set this to true if the upload is for a + * private message. + */ + for_private_message?: string; + /** + * Optionally set this to true if the upload is for a + * site setting. + */ + for_site_setting?: string; + /** + * Optionally set this to true if the upload was pasted + * into the upload area. This will convert PNG files to JPEG. + */ + pasted?: string; + }; + path?: never; + query?: never; + url: '/uploads/complete-external-upload.json'; +}; + +export type CompleteExternalUploadResponses = { + /** + * external upload initialized + */ + 200: { + id: number; + url: string; + original_filename: string; + filesize: number; + width: number; + height: number; + thumbnail_width: number; + thumbnail_height: number; + extension: string; + short_url: string; + short_path: string; + retain_hours: string | null; + human_filesize: string; + dominant_color?: string | null; + thumbnail?: { + id?: number; + upload_id?: number; + url?: string; + extension?: string; + width?: number; + height?: number; + filesize?: number; + } | null; + }; +}; + +export type CompleteExternalUploadResponse = + CompleteExternalUploadResponses[keyof CompleteExternalUploadResponses]; + +export type CreateMultipartUploadData = { + body?: { + upload_type: + | 'avatar' + | 'profile_background' + | 'card_background' + | 'custom_emoji' + | 'composer'; + file_name: string; + /** + * File size should be represented in bytes. + */ + file_size: number; + metadata?: { + /** + * The SHA1 checksum of the upload binary blob. Optionally + * be provided and serves as an additional security check when + * later processing the file in complete-external-upload endpoint. + */ + 'sha1-checksum'?: string; + }; + }; + path?: never; + query?: never; + url: '/uploads/create-multipart.json'; +}; + +export type CreateMultipartUploadResponses = { + /** + * external upload initialized + */ + 200: { + /** + * The path of the temporary file on the external storage + * service. + */ + key: string; + /** + * The identifier of the multipart upload in the external + * storage provider. This is the multipart upload_id in AWS S3. + */ + external_upload_identifier: string; + /** + * A unique string that identifies the external upload. + * This must be stored and then sent in the /complete-multipart + * and /batch-presign-multipart-parts endpoints. + */ + unique_identifier: string; + }; +}; + +export type CreateMultipartUploadResponse = + CreateMultipartUploadResponses[keyof CreateMultipartUploadResponses]; + +export type BatchPresignMultipartPartsData = { + body?: { + /** + * The part numbers to generate the presigned URLs for, + * must be between 1 and 10000. + */ + part_numbers: Array; + /** + * The unique identifier returned in the original /create-multipart + * request. + */ + unique_identifier: string; + }; + path?: never; + query?: never; + url: '/uploads/batch-presign-multipart-parts.json'; +}; + +export type BatchPresignMultipartPartsResponses = { + /** + * external upload initialized + */ + 200: { + /** + * The presigned URLs for each part number, which has + * the part numbers as keys. + */ + presigned_urls: { + [key: string]: unknown; + }; + }; +}; + +export type BatchPresignMultipartPartsResponse = + BatchPresignMultipartPartsResponses[keyof BatchPresignMultipartPartsResponses]; + +export type AbortMultipartData = { + body?: { + /** + * The identifier of the multipart upload in the external + * storage provider. This is the multipart upload_id in AWS S3. + */ + external_upload_identifier: string; + }; + path?: never; + query?: never; + url: '/uploads/abort-multipart.json'; +}; + +export type AbortMultipartResponses = { + /** + * external upload initialized + */ + 200: { + success: string; + }; +}; + +export type AbortMultipartResponse = + AbortMultipartResponses[keyof AbortMultipartResponses]; + +export type CompleteMultipartData = { + body?: { + /** + * The unique identifier returned in the original /create-multipart + * request. + */ + unique_identifier: string; + /** + * All of the part numbers and their corresponding ETags + * that have been uploaded must be provided. + */ + parts: Array; + }; + path?: never; + query?: never; + url: '/uploads/complete-multipart.json'; +}; + +export type CompleteMultipartResponses = { + /** + * external upload initialized + */ + 200: { + id: number; + url: string; + original_filename: string; + filesize: number; + width: number; + height: number; + thumbnail_width: number; + thumbnail_height: number; + extension: string; + short_url: string; + short_path: string; + retain_hours: string | null; + human_filesize: string; + dominant_color?: string | null; + thumbnail?: { + id?: number; + upload_id?: number; + url?: string; + extension?: string; + width?: number; + height?: number; + filesize?: number; + } | null; + }; +}; + +export type CompleteMultipartResponse = + CompleteMultipartResponses[keyof CompleteMultipartResponses]; + +export type ListUserBadgesData = { + body?: never; + path: { + username: string; + }; + query?: never; + url: '/user-badges/{username}.json'; +}; + +export type ListUserBadgesResponses = { + /** + * success response + */ + 200: { + badges?: Array<{ + id: number; + name: string; + description: string; + grant_count: number; + allow_title: boolean; + multiple_grant: boolean; + icon: string; + image_url: string | null; + listable: boolean; + enabled: boolean; + badge_grouping_id: number; + system: boolean; + slug: string; + manually_grantable: boolean; + badge_type_id: number; + }>; + badge_types?: Array<{ + id: number; + name: string; + sort_order: number; + }>; + granted_bies?: Array<{ + id: number; + username: string; + name: string; + avatar_template: string; + flair_name: string | null; + admin: boolean; + moderator: boolean; + trust_level: number; + }>; + user_badges: Array<{ + id: number; + granted_at: string; + grouping_position: number; + is_favorite: string | null; + can_favorite: boolean; + badge_id: number; + granted_by_id: number; + }>; + }; +}; + +export type ListUserBadgesResponse = + ListUserBadgesResponses[keyof ListUserBadgesResponses]; + +export type CreateUserData = { + body?: { + name: string; + email: string; + password: string; + username: string; + /** + * This param requires an api key in the request header + * or it will be ignored + */ + active?: boolean; + approved?: boolean; + user_fields?: { + 1?: boolean; + [key: string]: unknown | boolean | undefined; + }; + external_ids?: { + [key: string]: unknown; + }; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path?: never; + query?: never; + url: '/users.json'; +}; + +export type CreateUserResponses = { + /** + * user created + */ + 200: { + success: boolean; + active: boolean; + message: string; + user_id?: number; + }; +}; + +export type CreateUserResponse = CreateUserResponses[keyof CreateUserResponses]; + +export type GetUserData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + username: string; + }; + query?: never; + url: '/u/{username}.json'; +}; + +export type GetUserResponses = { + /** + * user with primary group response + */ + 200: { + user_badges: Array; + user: { + id: number; + username: string; + name: string; + avatar_template: string; + last_posted_at: string | null; + last_seen_at: string | null; + created_at: string; + ignored: boolean; + muted: boolean; + can_ignore_user: boolean; + can_ignore_users?: boolean; + can_mute_user: boolean; + can_mute_users?: boolean; + can_send_private_messages: boolean; + can_send_private_message_to_user: boolean; + trust_level: number; + moderator: boolean; + admin: boolean; + title: string | null; + badge_count: number; + second_factor_backup_enabled?: boolean; + user_fields?: { + 1: string | null; + 2: string | null; + }; + custom_fields: { + first_name?: string | null; + }; + time_read: number; + recent_time_read: number; + primary_group_id: number | null; + primary_group_name: string | null; + flair_group_id: number | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + featured_topic: string | null; + staged: boolean; + can_edit: boolean; + can_edit_username: boolean; + can_edit_email: boolean; + can_edit_name: boolean; + uploaded_avatar_id: number | null; + has_title_badges: boolean; + pending_count: number; + pending_posts_count?: number; + profile_view_count: number; + second_factor_enabled: boolean; + can_upload_profile_header: boolean; + can_upload_user_card_background: boolean; + post_count: number; + can_be_deleted: boolean; + can_delete_all_posts: boolean; + locale: string | null; + muted_category_ids: Array; + regular_category_ids: Array; + watched_tags: Array; + watching_first_post_tags: Array; + tracked_tags: Array; + muted_tags: Array; + tracked_category_ids: Array; + watched_category_ids: Array; + watched_first_post_category_ids: Array; + system_avatar_upload_id: string | null; + system_avatar_template: string; + muted_usernames: Array; + ignored_usernames: Array; + allowed_pm_usernames: Array; + mailing_list_posts_per_day: number; + can_change_bio: boolean; + can_change_location: boolean; + can_change_website: boolean; + can_change_tracking_preferences: boolean; + user_api_keys: string | null; + user_passkeys?: Array; + sidebar_tags?: Array; + sidebar_category_ids?: Array; + display_sidebar_tags?: boolean; + can_pick_theme_with_custom_homepage?: boolean; + user_auth_tokens: Array<{ + id: number; + client_ip: string; + location: string; + browser: string; + device: string; + os: string; + icon: string; + created_at: string; + seen_at: string; + is_active: boolean; + }>; + user_notification_schedule: { + enabled: boolean; + day_0_start_time: number; + day_0_end_time: number; + day_1_start_time: number; + day_1_end_time: number; + day_2_start_time: number; + day_2_end_time: number; + day_3_start_time: number; + day_3_end_time: number; + day_4_start_time: number; + day_4_end_time: number; + day_5_start_time: number; + day_5_end_time: number; + day_6_start_time: number; + day_6_end_time: number; + }; + use_logo_small_as_avatar: boolean; + featured_user_badge_ids: Array; + invited_by: string | null; + groups: Array<{ + id: number; + automatic: boolean; + name: string; + display_name: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: string | null; + grant_trust_level: string | null; + incoming_email: string | null; + has_messages: boolean; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + bio_raw: string | null; + bio_cooked: string | null; + bio_excerpt: string | null; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name: string | null; + default_notification_level: number; + membership_request_template: string | null; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + publish_read_state: boolean; + }>; + group_users: Array<{ + group_id: number; + user_id: number; + notification_level: number; + owner?: boolean; + }>; + user_option: { + user_id: number; + mailing_list_mode: boolean; + mailing_list_mode_frequency: number; + email_digests: boolean; + email_level: number; + email_messages_level: number; + external_links_in_new_tab: boolean; + bookmark_auto_delete_preference?: number; + color_scheme_id: string | null; + dark_scheme_id: string | null; + dynamic_favicon: boolean; + enable_quoting: boolean; + enable_smart_lists: boolean; + enable_defer: boolean; + digest_after_minutes: number; + automatically_unpin_topics: boolean; + auto_track_topics_after_msecs: number; + notification_level_when_replying: number; + new_topic_duration_minutes: number; + email_previous_replies: number; + email_in_reply_to: boolean; + like_notification_frequency: number; + include_tl0_in_digests: boolean; + theme_ids: Array; + theme_key_seq: number; + allow_private_messages: boolean; + enable_allowed_pm_users: boolean; + homepage_id: string | null; + hide_profile_and_presence: boolean; + hide_profile: boolean; + hide_presence: boolean; + text_size: string; + text_size_seq: number; + title_count_mode: string; + timezone: string | null; + skip_new_user_tips: boolean; + default_calendar?: string; + oldest_search_log_date?: string | null; + sidebar_link_to_filtered_list?: boolean; + sidebar_show_count_of_new_items?: boolean; + watched_precedence_over_muted?: boolean | null; + seen_popups?: Array | null; + topics_unread_when_closed: boolean; + }; + }; + }; +}; + +export type GetUserResponse = GetUserResponses[keyof GetUserResponses]; + +export type UpdateUserData = { + body?: { + name?: string; + external_ids?: { + [key: string]: unknown; + }; + }; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + username: string; + }; + query?: never; + url: '/u/{username}.json'; +}; + +export type UpdateUserResponses = { + /** + * user updated + */ + 200: { + success: string; + user: { + [key: string]: unknown; + }; + }; +}; + +export type UpdateUserResponse = UpdateUserResponses[keyof UpdateUserResponses]; + +export type GetUserExternalIdData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + external_id: string; + }; + query?: never; + url: '/u/by-external/{external_id}.json'; +}; + +export type GetUserExternalIdResponses = { + /** + * user response + */ + 200: { + user_badges: Array; + user: { + id: number; + username: string; + name: string; + avatar_template: string; + last_posted_at: string | null; + last_seen_at: string | null; + created_at: string; + ignored: boolean; + muted: boolean; + can_ignore_user: boolean; + can_ignore_users?: boolean; + can_mute_user: boolean; + can_mute_users?: boolean; + can_send_private_messages: boolean; + can_send_private_message_to_user: boolean; + trust_level: number; + moderator: boolean; + admin: boolean; + title: string | null; + badge_count: number; + second_factor_backup_enabled?: boolean; + user_fields?: { + 1: string | null; + 2: string | null; + }; + custom_fields: { + first_name?: string | null; + }; + time_read: number; + recent_time_read: number; + primary_group_id: number | null; + primary_group_name: string | null; + flair_group_id: number | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + featured_topic: string | null; + staged: boolean; + can_edit: boolean; + can_edit_username: boolean; + can_edit_email: boolean; + can_edit_name: boolean; + uploaded_avatar_id: number | null; + has_title_badges: boolean; + pending_count: number; + pending_posts_count?: number; + profile_view_count: number; + second_factor_enabled: boolean; + can_upload_profile_header: boolean; + can_upload_user_card_background: boolean; + post_count: number; + can_be_deleted: boolean; + can_delete_all_posts: boolean; + locale: string | null; + muted_category_ids: Array; + regular_category_ids: Array; + watched_tags: Array; + watching_first_post_tags: Array; + tracked_tags: Array; + muted_tags: Array; + tracked_category_ids: Array; + watched_category_ids: Array; + watched_first_post_category_ids: Array; + system_avatar_upload_id: string | null; + system_avatar_template: string; + muted_usernames: Array; + ignored_usernames: Array; + allowed_pm_usernames: Array; + mailing_list_posts_per_day: number; + can_change_bio: boolean; + can_change_location: boolean; + can_change_website: boolean; + can_change_tracking_preferences: boolean; + user_api_keys: string | null; + user_passkeys?: Array; + sidebar_tags?: Array; + sidebar_category_ids?: Array; + display_sidebar_tags?: boolean; + can_pick_theme_with_custom_homepage?: boolean; + user_auth_tokens: Array<{ + id: number; + client_ip: string; + location: string; + browser: string; + device: string; + os: string; + icon: string; + created_at: string; + seen_at: string; + is_active: boolean; + }>; + user_notification_schedule: { + enabled: boolean; + day_0_start_time: number; + day_0_end_time: number; + day_1_start_time: number; + day_1_end_time: number; + day_2_start_time: number; + day_2_end_time: number; + day_3_start_time: number; + day_3_end_time: number; + day_4_start_time: number; + day_4_end_time: number; + day_5_start_time: number; + day_5_end_time: number; + day_6_start_time: number; + day_6_end_time: number; + }; + use_logo_small_as_avatar: boolean; + featured_user_badge_ids: Array; + invited_by: string | null; + groups: Array<{ + id: number; + automatic: boolean; + name: string; + display_name: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: string | null; + grant_trust_level: string | null; + incoming_email: string | null; + has_messages: boolean; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + bio_raw: string | null; + bio_cooked: string | null; + bio_excerpt: string | null; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name: string | null; + default_notification_level: number; + membership_request_template: string | null; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + publish_read_state: boolean; + }>; + group_users: Array<{ + group_id: number; + user_id: number; + notification_level: number; + owner?: boolean; + }>; + user_option: { + user_id: number; + mailing_list_mode: boolean; + mailing_list_mode_frequency: number; + email_digests: boolean; + email_level: number; + email_messages_level: number; + external_links_in_new_tab: boolean; + bookmark_auto_delete_preference?: number; + color_scheme_id: string | null; + dark_scheme_id: string | null; + dynamic_favicon: boolean; + enable_quoting: boolean; + enable_smart_lists: boolean; + enable_defer: boolean; + digest_after_minutes: number; + automatically_unpin_topics: boolean; + auto_track_topics_after_msecs: number; + notification_level_when_replying: number; + new_topic_duration_minutes: number; + email_previous_replies: number; + email_in_reply_to: boolean; + like_notification_frequency: number; + include_tl0_in_digests: boolean; + theme_ids: Array; + theme_key_seq: number; + allow_private_messages: boolean; + enable_allowed_pm_users: boolean; + homepage_id: string | null; + hide_profile_and_presence: boolean; + hide_profile: boolean; + hide_presence: boolean; + text_size: string; + text_size_seq: number; + title_count_mode: string; + timezone: string | null; + skip_new_user_tips: boolean; + default_calendar?: string; + oldest_search_log_date?: string | null; + sidebar_link_to_filtered_list?: boolean; + sidebar_show_count_of_new_items?: boolean; + watched_precedence_over_muted?: boolean | null; + seen_popups?: Array | null; + topics_unread_when_closed: boolean; + }; + }; + }; +}; + +export type GetUserExternalIdResponse = + GetUserExternalIdResponses[keyof GetUserExternalIdResponses]; + +export type GetUserIdentiyProviderExternalIdData = { + body?: never; + headers: { + 'Api-Key': string; + 'Api-Username': string; + }; + path: { + /** + * Authentication provider name. Can be found in the provider callback + * URL: `/auth/{provider}/callback` + */ + provider: string; + external_id: string; + }; + query?: never; + url: '/u/by-external/{provider}/{external_id}.json'; +}; + +export type GetUserIdentiyProviderExternalIdResponses = { + /** + * user response + */ + 200: { + user_badges: Array; + user: { + id: number; + username: string; + name: string; + avatar_template: string; + last_posted_at: string | null; + last_seen_at: string | null; + created_at: string; + ignored: boolean; + muted: boolean; + can_ignore_user: boolean; + can_ignore_users?: boolean; + can_mute_user: boolean; + can_mute_users?: boolean; + can_send_private_messages: boolean; + can_send_private_message_to_user: boolean; + trust_level: number; + moderator: boolean; + admin: boolean; + title: string | null; + badge_count: number; + second_factor_backup_enabled?: boolean; + user_fields?: { + 1: string | null; + 2: string | null; + }; + custom_fields: { + first_name?: string | null; + }; + time_read: number; + recent_time_read: number; + primary_group_id: number | null; + primary_group_name: string | null; + flair_group_id: number | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + featured_topic: string | null; + staged: boolean; + can_edit: boolean; + can_edit_username: boolean; + can_edit_email: boolean; + can_edit_name: boolean; + uploaded_avatar_id: number | null; + has_title_badges: boolean; + pending_count: number; + pending_posts_count?: number; + profile_view_count: number; + second_factor_enabled: boolean; + can_upload_profile_header: boolean; + can_upload_user_card_background: boolean; + post_count: number; + can_be_deleted: boolean; + can_delete_all_posts: boolean; + locale: string | null; + muted_category_ids: Array; + regular_category_ids: Array; + watched_tags: Array; + watching_first_post_tags: Array; + tracked_tags: Array; + muted_tags: Array; + tracked_category_ids: Array; + watched_category_ids: Array; + watched_first_post_category_ids: Array; + system_avatar_upload_id: string | null; + system_avatar_template: string; + muted_usernames: Array; + ignored_usernames: Array; + allowed_pm_usernames: Array; + mailing_list_posts_per_day: number; + can_change_bio: boolean; + can_change_location: boolean; + can_change_website: boolean; + can_change_tracking_preferences: boolean; + user_api_keys: string | null; + user_passkeys?: Array; + sidebar_tags?: Array; + sidebar_category_ids?: Array; + display_sidebar_tags?: boolean; + can_pick_theme_with_custom_homepage?: boolean; + user_auth_tokens: Array<{ + id: number; + client_ip: string; + location: string; + browser: string; + device: string; + os: string; + icon: string; + created_at: string; + seen_at: string; + is_active: boolean; + }>; + user_notification_schedule: { + enabled: boolean; + day_0_start_time: number; + day_0_end_time: number; + day_1_start_time: number; + day_1_end_time: number; + day_2_start_time: number; + day_2_end_time: number; + day_3_start_time: number; + day_3_end_time: number; + day_4_start_time: number; + day_4_end_time: number; + day_5_start_time: number; + day_5_end_time: number; + day_6_start_time: number; + day_6_end_time: number; + }; + use_logo_small_as_avatar: boolean; + featured_user_badge_ids: Array; + invited_by: string | null; + groups: Array<{ + id: number; + automatic: boolean; + name: string; + display_name: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: string | null; + grant_trust_level: string | null; + incoming_email: string | null; + has_messages: boolean; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + bio_raw: string | null; + bio_cooked: string | null; + bio_excerpt: string | null; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name: string | null; + default_notification_level: number; + membership_request_template: string | null; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + publish_read_state: boolean; + }>; + group_users: Array<{ + group_id: number; + user_id: number; + notification_level: number; + owner?: boolean; + }>; + user_option: { + user_id: number; + mailing_list_mode: boolean; + mailing_list_mode_frequency: number; + email_digests: boolean; + email_level: number; + email_messages_level: number; + external_links_in_new_tab: boolean; + bookmark_auto_delete_preference?: number; + color_scheme_id: string | null; + dark_scheme_id: string | null; + dynamic_favicon: boolean; + enable_quoting: boolean; + enable_smart_lists: boolean; + enable_defer: boolean; + digest_after_minutes: number; + automatically_unpin_topics: boolean; + auto_track_topics_after_msecs: number; + notification_level_when_replying: number; + new_topic_duration_minutes: number; + email_previous_replies: number; + email_in_reply_to: boolean; + like_notification_frequency: number; + include_tl0_in_digests: boolean; + theme_ids: Array; + theme_key_seq: number; + allow_private_messages: boolean; + enable_allowed_pm_users: boolean; + homepage_id: string | null; + hide_profile_and_presence: boolean; + hide_profile: boolean; + hide_presence: boolean; + text_size: string; + text_size_seq: number; + title_count_mode: string; + timezone: string | null; + skip_new_user_tips: boolean; + default_calendar?: string; + oldest_search_log_date?: string | null; + sidebar_link_to_filtered_list?: boolean; + sidebar_show_count_of_new_items?: boolean; + watched_precedence_over_muted?: boolean | null; + seen_popups?: Array | null; + topics_unread_when_closed: boolean; + }; + }; + }; +}; + +export type GetUserIdentiyProviderExternalIdResponse = + GetUserIdentiyProviderExternalIdResponses[keyof GetUserIdentiyProviderExternalIdResponses]; + +export type UpdateAvatarData = { + body?: { + upload_id: number; + type: 'uploaded' | 'custom' | 'gravatar' | 'system'; + }; + path: { + username: string; + }; + query?: never; + url: '/u/{username}/preferences/avatar/pick.json'; +}; + +export type UpdateAvatarResponses = { + /** + * avatar updated + */ + 200: { + success: string; + }; +}; + +export type UpdateAvatarResponse = + UpdateAvatarResponses[keyof UpdateAvatarResponses]; + +export type UpdateEmailData = { + body?: { + email: string; + }; + path: { + username: string; + }; + query?: never; + url: '/u/{username}/preferences/email.json'; +}; + +export type UpdateEmailResponses = { + /** + * email updated + */ + 200: unknown; +}; + +export type UpdateUsernameData = { + body?: { + new_username: string; + }; + path: { + username: string; + }; + query?: never; + url: '/u/{username}/preferences/username.json'; +}; + +export type UpdateUsernameResponses = { + /** + * username updated + */ + 200: unknown; +}; + +export type ListUsersPublicData = { + body?: never; + path?: never; + query: { + period: 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly' | 'all'; + order: + | 'likes_received' + | 'likes_given' + | 'topic_count' + | 'post_count' + | 'topics_entered' + | 'posts_read' + | 'days_visited'; + asc?: 'true'; + page?: number; + }; + url: '/directory_items.json'; +}; + +export type ListUsersPublicResponses = { + /** + * directory items response + */ + 200: { + directory_items: Array<{ + id: number; + likes_received: number; + likes_given: number; + topics_entered: number; + topic_count: number; + post_count: number; + posts_read: number; + days_visited: number; + user: { + id: number; + username: string; + name: string | null; + avatar_template: string; + title: string | null; + }; + }>; + meta: { + last_updated_at: string | null; + total_rows_directory_items: number; + load_more_directory_items: string; + }; + }; +}; + +export type ListUsersPublicResponse = + ListUsersPublicResponses[keyof ListUsersPublicResponses]; + +export type DeleteUserData = { + body?: { + delete_posts?: boolean; + block_email?: boolean; + block_urls?: boolean; + block_ip?: boolean; + }; + path: { + id: number; + }; + query?: never; + url: '/admin/users/{id}.json'; +}; + +export type DeleteUserResponses = { + /** + * response + */ + 200: { + deleted: boolean; + }; +}; + +export type DeleteUserResponse = DeleteUserResponses[keyof DeleteUserResponses]; + +export type AdminGetUserData = { + body?: never; + path: { + id: number; + }; + query?: never; + url: '/admin/users/{id}.json'; +}; + +export type AdminGetUserResponses = { + /** + * response + */ + 200: { + id: number; + username: string; + name: string | null; + avatar_template: string; + active: boolean; + admin: boolean; + moderator: boolean; + last_seen_at: string | null; + last_emailed_at: string | null; + created_at: string; + last_seen_age: number | null; + last_emailed_age: number | null; + created_at_age: number | null; + trust_level: number; + manual_locked_trust_level: string | null; + title: string | null; + time_read: number; + staged: boolean; + days_visited: number; + posts_read_count: number; + topics_entered: number; + post_count: number; + associated_accounts?: Array; + can_send_activation_email: boolean; + can_activate: boolean; + can_deactivate: boolean; + ip_address: string; + registration_ip_address: string | null; + can_grant_admin: boolean; + can_revoke_admin: boolean; + can_grant_moderation: boolean; + can_revoke_moderation: boolean; + can_impersonate: boolean; + like_count: number; + like_given_count: number; + topic_count: number; + flags_given_count: number; + flags_received_count: number; + private_topics_count: number; + can_delete_all_posts: boolean; + can_be_deleted?: boolean; + can_be_anonymized: boolean; + can_be_merged: boolean; + full_suspend_reason: string | null; + latest_export?: { + [key: string]: unknown; + } | null; + silence_reason?: string | null; + post_edits_count?: number | null; + primary_group_id: number | null; + badge_count: number; + warnings_received_count: number; + bounce_score: number | null; + reset_bounce_score_after: string | null; + can_view_action_logs: boolean; + can_disable_second_factor: boolean; + can_delete_sso_record: boolean; + api_key_count: number; + similar_users_count?: number; + single_sign_on_record: string | null; + approved_by: { + id: number; + username: string; + name: string; + avatar_template: string; + } | null; + suspended_by: string | null; + silenced_by: string | null; + penalty_counts?: { + silenced: number; + suspended: number; + }; + next_penalty?: string; + tl3_requirements?: { + time_period: number; + requirements_met: boolean; + requirements_lost: boolean; + trust_level_locked: boolean; + on_grace_period: boolean; + days_visited: number; + min_days_visited: number; + num_topics_replied_to: number; + min_topics_replied_to: number; + topics_viewed: number; + min_topics_viewed: number; + posts_read: number; + min_posts_read: number; + topics_viewed_all_time: number; + min_topics_viewed_all_time: number; + posts_read_all_time: number; + min_posts_read_all_time: number; + num_flagged_posts: number; + max_flagged_posts: number; + num_flagged_by_users: number; + max_flagged_by_users: number; + num_likes_given: number; + min_likes_given: number; + num_likes_received: number; + min_likes_received: number; + num_likes_received_days: number; + min_likes_received_days: number; + num_likes_received_users: number; + min_likes_received_users: number; + penalty_counts: { + silenced: number; + suspended: number; + total: number; + }; + }; + groups: Array<{ + id: number; + automatic: boolean; + name: string; + display_name: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: string | null; + grant_trust_level: string | null; + incoming_email: string | null; + has_messages: boolean; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + flair_group_id?: number | null; + bio_raw: string | null; + bio_cooked: string | null; + bio_excerpt: string | null; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name: string | null; + default_notification_level: number; + membership_request_template: string | null; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + publish_read_state: boolean; + }>; + external_ids: { + [key: string]: unknown; + }; + }; +}; + +export type AdminGetUserResponse = + AdminGetUserResponses[keyof AdminGetUserResponses]; + +export type ActivateUserData = { + body?: never; + path: { + id: number; + }; + query?: never; + url: '/admin/users/{id}/activate.json'; +}; + +export type ActivateUserResponses = { + /** + * response + */ + 200: { + success: string; + }; +}; + +export type ActivateUserResponse = + ActivateUserResponses[keyof ActivateUserResponses]; + +export type DeactivateUserData = { + body?: never; + path: { + id: number; + }; + query?: never; + url: '/admin/users/{id}/deactivate.json'; +}; + +export type DeactivateUserResponses = { + /** + * response + */ + 200: { + success: string; + }; +}; + +export type DeactivateUserResponse = + DeactivateUserResponses[keyof DeactivateUserResponses]; + +export type SuspendUserData = { + body?: { + suspend_until: string; + reason: string; + /** + * Will send an email with this message when present + */ + message?: string; + post_action?: string; + }; + path: { + id: number; + }; + query?: never; + url: '/admin/users/{id}/suspend.json'; +}; + +export type SuspendUserResponses = { + /** + * response + */ + 200: { + suspension: { + suspend_reason: string; + full_suspend_reason: string; + suspended_till: string; + suspended_at: string; + suspended_by: { + id: number; + username: string; + name: string; + avatar_template: string; + }; + }; + }; +}; + +export type SuspendUserResponse = + SuspendUserResponses[keyof SuspendUserResponses]; + +export type SilenceUserData = { + body?: { + silenced_till: string; + reason: string; + /** + * Will send an email with this message when present + */ + message?: string; + post_action?: string; + }; + path: { + id: number; + }; + query?: never; + url: '/admin/users/{id}/silence.json'; +}; + +export type SilenceUserResponses = { + /** + * response + */ + 200: { + silence: { + silenced: boolean; + silence_reason: string; + silenced_till: string; + silenced_at: string; + silenced_by: { + id: number; + username: string; + name: string; + avatar_template: string; + }; + }; + }; +}; + +export type SilenceUserResponse = + SilenceUserResponses[keyof SilenceUserResponses]; + +export type AnonymizeUserData = { + body?: never; + path: { + id: number; + }; + query?: never; + url: '/admin/users/{id}/anonymize.json'; +}; + +export type AnonymizeUserResponses = { + /** + * response + */ + 200: { + success: string; + username: string; + }; +}; + +export type AnonymizeUserResponse = + AnonymizeUserResponses[keyof AnonymizeUserResponses]; + +export type LogOutUserData = { + body?: never; + path: { + id: number; + }; + query?: never; + url: '/admin/users/{id}/log_out.json'; +}; + +export type LogOutUserResponses = { + /** + * response + */ + 200: { + success: string; + }; +}; + +export type LogOutUserResponse = LogOutUserResponses[keyof LogOutUserResponses]; + +export type RefreshGravatarData = { + body?: never; + path: { + username: string; + }; + query?: never; + url: '/user_avatar/{username}/refresh_gravatar.json'; +}; + +export type RefreshGravatarResponses = { + /** + * response + */ + 200: { + gravatar_upload_id: number | null; + gravatar_avatar_template: string | null; + }; +}; + +export type RefreshGravatarResponse = + RefreshGravatarResponses[keyof RefreshGravatarResponses]; + +export type AdminListUsersData = { + body?: never; + path: { + flag: 'active' | 'new' | 'staff' | 'suspended' | 'blocked' | 'suspect'; + }; + query?: { + order?: + | 'created' + | 'last_emailed' + | 'seen' + | 'username' + | 'email' + | 'trust_level' + | 'days_visited' + | 'posts_read' + | 'topics_viewed' + | 'posts' + | 'read_time'; + asc?: 'true'; + page?: number; + /** + * Include user email addresses in response. These requests will + * be logged in the staff action logs. + */ + show_emails?: boolean; + /** + * Include user stats information + */ + stats?: boolean; + /** + * Filter to the user with this email address + */ + email?: string; + /** + * Filter to users with this IP address + */ + ip?: string; + }; + url: '/admin/users/list/{flag}.json'; +}; + +export type AdminListUsersResponses = { + /** + * response + */ + 200: Array<{ + id: number; + username: string; + name: string | null; + avatar_template: string; + email?: string; + secondary_emails?: Array; + active: boolean; + admin: boolean; + moderator: boolean; + last_seen_at: string | null; + last_emailed_at: string | null; + created_at: string; + last_seen_age: number | null; + last_emailed_age: number | null; + created_at_age: number | null; + trust_level: number; + manual_locked_trust_level: string | null; + title: string | null; + time_read: number; + staged: boolean; + days_visited: number; + posts_read_count: number; + topics_entered: number; + post_count: number; + }>; +}; + +export type AdminListUsersResponse = + AdminListUsersResponses[keyof AdminListUsersResponses]; + +export type ListUserActionsData = { + body?: never; + path?: never; + query: { + offset: number; + username: string; + filter: string; + }; + url: '/user_actions.json'; +}; + +export type ListUserActionsResponses = { + /** + * response + */ + 200: { + user_actions: Array<{ + excerpt: string; + action_type: number; + created_at: string; + avatar_template: string; + acting_avatar_template: string; + slug: string; + topic_id: number; + target_user_id: number; + target_name: string | null; + target_username: string; + post_number: number; + post_id: string | null; + username: string; + name: string | null; + user_id: number; + acting_username: string; + acting_name: string | null; + acting_user_id: number; + title: string; + deleted: boolean; + hidden: string | null; + post_type: string | null; + action_code: string | null; + category_id: number; + closed: boolean; + archived: boolean; + }>; + }; +}; + +export type ListUserActionsResponse = + ListUserActionsResponses[keyof ListUserActionsResponses]; + +export type SendPasswordResetEmailData = { + body?: { + login: string; + }; + path?: never; + query?: never; + url: '/session/forgot_password.json'; +}; + +export type SendPasswordResetEmailResponses = { + /** + * success response + */ + 200: { + success: string; + user_found: boolean; + }; +}; + +export type SendPasswordResetEmailResponse = + SendPasswordResetEmailResponses[keyof SendPasswordResetEmailResponses]; + +export type ChangePasswordData = { + body?: { + username: string; + password: string; + }; + path: { + token: string; + }; + query?: never; + url: '/users/password-reset/{token}.json'; +}; + +export type ChangePasswordResponses = { + /** + * success response + */ + 200: unknown; +}; + +export type GetUserEmailsData = { + body?: never; + path: { + username: string; + }; + query?: never; + url: '/u/{username}/emails.json'; +}; + +export type GetUserEmailsResponses = { + /** + * success response + */ + 200: { + email: string; + secondary_emails: Array; + unconfirmed_emails: Array; + associated_accounts: Array; + }; +}; + +export type GetUserEmailsResponse = + GetUserEmailsResponses[keyof GetUserEmailsResponses]; + +export type SendMessageData = { + body?: { + message?: string; + staged_id?: string; + in_reply_to_id?: number; + thread_id?: number; + }; + path: { + channel_id: number; + }; + query?: never; + url: '/chat/{channel_id}'; +}; + +export type SendMessageResponses = { + /** + * Message sent successfully + */ + 200: { + success?: string; + message_id?: number; + }; +}; + +export type SendMessageResponse = + SendMessageResponses[keyof SendMessageResponses]; + +export type GetThreadData = { + body?: never; + path: { + channel_id: number; + thread_id: number; + }; + query?: never; + url: '/chat/api/channels/{channel_id}/threads/{thread_id}'; +}; + +export type GetThreadResponses = { + /** + * Thread info + */ + 200: { + thread?: { + id?: number | null; + title?: string | null; + status?: string | null; + channel_id?: number | null; + meta?: { + [key: string]: unknown; + }; + reply_count?: number | null; + current_user_membership?: { + [key: string]: unknown; + }; + preview?: { + [key: string]: unknown; + }; + last_message_id?: number | null; + force?: boolean | null; + original_message?: { + [key: string]: unknown; + }; + [key: string]: + | unknown + | (number | null) + | (string | null) + | (string | null) + | (number | null) + | { + [key: string]: unknown; + } + | (number | null) + | { + [key: string]: unknown; + } + | { + [key: string]: unknown; + } + | (number | null) + | (boolean | null) + | { + [key: string]: unknown; + } + | undefined; + }; + [key: string]: + | unknown + | { + id?: number | null; + title?: string | null; + status?: string | null; + channel_id?: number | null; + meta?: { + [key: string]: unknown; + }; + reply_count?: number | null; + current_user_membership?: { + [key: string]: unknown; + }; + preview?: { + [key: string]: unknown; + }; + last_message_id?: number | null; + force?: boolean | null; + original_message?: { + [key: string]: unknown; + }; + [key: string]: + | unknown + | (number | null) + | (string | null) + | (string | null) + | (number | null) + | { + [key: string]: unknown; + } + | (number | null) + | { + [key: string]: unknown; + } + | { + [key: string]: unknown; + } + | (number | null) + | (boolean | null) + | { + [key: string]: unknown; + } + | undefined; + } + | undefined; + }; +}; + +export type GetThreadResponse = GetThreadResponses[keyof GetThreadResponses]; + +export type EditMessageData = { + body?: { + message?: string; + }; + path: { + channel_id: number; + message_id: number; + }; + query?: never; + url: '/chat/api/channels/{channel_id}/messages/{message_id}'; +}; + +export type EditMessageResponses = { + /** + * Message updated + */ + 200: { + success?: string; + message_id?: number; + }; +}; + +export type EditMessageResponse = + EditMessageResponses[keyof EditMessageResponses]; + +export type GetMessagesData = { + body?: never; + path: { + channel_id: number; + }; + query?: { + fetch_from_last_read?: boolean; + page_size?: number; + target_message_id?: number; + }; + url: '/chat/api/channels/{channel_id}/messages'; +}; + +export type GetMessagesResponses = { + /** + * A page of messages + */ + 200: { + messages?: Array<{ + id?: number; + message?: string; + cooked?: string; + created_at?: Date; + chat_channel_id?: number; + streaming?: boolean; + user?: { + id?: number; + username?: string; + name?: string; + avatar_template?: string; + moderator?: boolean; + admin?: boolean; + staff?: boolean; + }; + mentioned_users?: Array<{ + id?: number; + username?: string; + name?: string; + }>; + available_flags?: Array; + uploads?: Array<{ + [key: string]: unknown; + }>; + edited?: boolean; + blocks?: Array<{ + [key: string]: unknown; + }>; + chat_webhook_event?: { + [key: string]: unknown; + } | null; + }>; + tracking?: { + [key: string]: unknown; + } | null; + meta?: { + [key: string]: unknown; + } | null; + }; +}; + +export type GetMessagesResponse = + GetMessagesResponses[keyof GetMessagesResponses]; + +export type GetThreadMessagesData = { + body?: never; + path: { + channel_id: number; + thread_id: number; + }; + query?: { + /** + * Start fetching from this message ID + */ + target_message_id?: number; + page_size?: number; + }; + url: '/chat/api/channels/{channel_id}/threads/{thread_id}/messages'; +}; + +export type GetThreadMessagesResponses = { + /** + * A page of messages in the thread + */ + 200: { + messages?: Array<{ + id?: number | null; + message?: string | null; + cooked?: string | null; + created_at?: Date | null; + thread_id?: number | null; + chat_channel_id?: number | null; + user?: { + [key: string]: unknown; + }; + available_flags?: Array; + [key: string]: + | unknown + | (number | null) + | (string | null) + | (string | null) + | (Date | null) + | (number | null) + | (number | null) + | { + [key: string]: unknown; + } + | Array + | undefined; + }>; + tracking?: { + [key: string]: unknown; + } | null; + meta?: { + target_message_id?: number | null; + can_load_more_future?: boolean | null; + can_load_more_past?: boolean | null; + [key: string]: + | unknown + | (number | null) + | (boolean | null) + | (boolean | null) + | undefined; + }; + [key: string]: + | unknown + | Array<{ + id?: number | null; + message?: string | null; + cooked?: string | null; + created_at?: Date | null; + thread_id?: number | null; + chat_channel_id?: number | null; + user?: { + [key: string]: unknown; + }; + available_flags?: Array; + [key: string]: + | unknown + | (number | null) + | (string | null) + | (string | null) + | (Date | null) + | (number | null) + | (number | null) + | { + [key: string]: unknown; + } + | Array + | undefined; + }> + | ({ + [key: string]: unknown; + } | null) + | { + target_message_id?: number | null; + can_load_more_future?: boolean | null; + can_load_more_past?: boolean | null; + [key: string]: + | unknown + | (number | null) + | (boolean | null) + | (boolean | null) + | undefined; + } + | undefined; + }; +}; + +export type GetThreadMessagesResponse = + GetThreadMessagesResponses[keyof GetThreadMessagesResponses]; + +export type ReactToMessageData = { + body?: { + react_action?: string; + emoji?: string; + }; + path: { + channel_id: number; + message_id: number; + }; + query?: never; + url: '/chat/{channel_id}/react/{message_id}'; +}; + +export type ReactToMessageResponses = { + /** + * Reaction added/removed + */ + 200: { + success?: string; + }; +}; + +export type ReactToMessageResponse = + ReactToMessageResponses[keyof ReactToMessageResponses]; + +export type GetUserCardData = { + body?: never; + path: { + username: string; + }; + query?: never; + url: '/u/{username}/card.json'; +}; + +export type GetUserCardResponses = { + /** + * User card with badges & metadata + */ + 200: { + [key: string]: unknown; + }; +}; + +export type GetUserCardResponse = + GetUserCardResponses[keyof GetUserCardResponses]; + +export type GetSessionData = { + body?: never; + path?: never; + query?: never; + url: '/session/current.json'; +}; + +export type GetSessionErrors = { + /** + * Bad Request + */ + 400: unknown; + /** + * Forbidden + */ + 403: unknown; + /** + * Too Many Requests + */ + 429: unknown; + /** + * Internal Server Error + */ + 500: unknown; +}; + +export type GetSessionResponses = { + /** + * Authenticated User Session Data + */ + 200: { + current_user?: { + id: number; + username: string; + name: string; + avatar_template: string; + last_posted_at: string | null; + last_seen_at: string | null; + created_at: string; + ignored: boolean; + muted: boolean; + can_ignore_user: boolean; + can_ignore_users?: boolean; + can_mute_user: boolean; + can_mute_users?: boolean; + can_send_private_messages: boolean; + can_send_private_message_to_user: boolean; + trust_level: number; + moderator: boolean; + admin: boolean; + title: string | null; + badge_count: number; + second_factor_backup_enabled?: boolean; + user_fields?: { + 1: string | null; + 2: string | null; + }; + custom_fields: { + first_name?: string | null; + last_chat_channel_id?: number | null; + }; + time_read: number; + recent_time_read: number; + primary_group_id: number | null; + primary_group_name: string | null; + flair_group_id: number | null; + flair_name: string | null; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + featured_topic: string | null; + staged: boolean; + can_edit: boolean; + can_edit_username: boolean; + can_edit_email: boolean; + can_edit_name: boolean; + uploaded_avatar_id: number | null; + has_title_badges: boolean; + pending_count: number; + pending_posts_count?: number; + profile_view_count: number; + second_factor_enabled: boolean; + can_upload_profile_header: boolean; + can_upload_user_card_background: boolean; + post_count: number; + can_be_deleted: boolean; + can_delete_all_posts: boolean; + locale: string | null; + muted_category_ids: Array; + regular_category_ids: Array; + watched_tags: Array; + watching_first_post_tags: Array; + tracked_tags: Array; + muted_tags: Array; + tracked_category_ids: Array; + watched_category_ids: Array; + watched_first_post_category_ids: Array; + system_avatar_upload_id: string | null; + system_avatar_template: string; + muted_usernames: Array; + ignored_usernames: Array; + allowed_pm_usernames: Array; + mailing_list_posts_per_day: number; + can_change_bio: boolean; + can_change_location: boolean; + can_change_website: boolean; + can_change_tracking_preferences: boolean; + user_api_keys: string | null; + user_passkeys?: Array; + sidebar_tags?: Array; + sidebar_category_ids?: Array; + display_sidebar_tags?: boolean; + can_pick_theme_with_custom_homepage?: boolean; + user_auth_tokens: Array<{ + id: number; + client_ip: string; + location: string; + browser: string; + device: string; + os: string; + icon: string; + created_at: string; + seen_at: string; + is_active: boolean; + }>; + user_notification_schedule: { + enabled: boolean; + day_0_start_time: number; + day_0_end_time: number; + day_1_start_time: number; + day_1_end_time: number; + day_2_start_time: number; + day_2_end_time: number; + day_3_start_time: number; + day_3_end_time: number; + day_4_start_time: number; + day_4_end_time: number; + day_5_start_time: number; + day_5_end_time: number; + day_6_start_time: number; + day_6_end_time: number; + }; + use_logo_small_as_avatar: boolean; + featured_user_badge_ids: Array; + invited_by: string | null; + groups: Array<{ + id: number; + automatic: boolean; + name: string; + display_name: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: string | null; + grant_trust_level: string | null; + incoming_email: string | null; + has_messages: boolean; + flair_url: string | null; + flair_bg_color: string | null; + flair_color: string | null; + bio_raw: string | null; + bio_cooked: string | null; + bio_excerpt: string | null; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name: string | null; + default_notification_level: number; + membership_request_template: string | null; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + publish_read_state: boolean; + }>; + group_users: Array<{ + group_id: number; + user_id: number; + notification_level: number; + owner?: boolean; + }>; + user_option: { + user_id: number; + mailing_list_mode: boolean; + mailing_list_mode_frequency: number; + email_digests: boolean; + email_level: number; + email_messages_level: number; + external_links_in_new_tab: boolean; + bookmark_auto_delete_preference?: number; + color_scheme_id: string | null; + dark_scheme_id: string | null; + dynamic_favicon: boolean; + enable_quoting: boolean; + enable_smart_lists: boolean; + enable_defer: boolean; + digest_after_minutes: number; + automatically_unpin_topics: boolean; + auto_track_topics_after_msecs: number; + notification_level_when_replying: number; + new_topic_duration_minutes: number; + email_previous_replies: number; + email_in_reply_to: boolean; + like_notification_frequency: number; + include_tl0_in_digests: boolean; + theme_ids: Array; + theme_key_seq: number; + allow_private_messages: boolean; + enable_allowed_pm_users: boolean; + homepage_id: string | null; + hide_profile_and_presence: boolean; + hide_profile: boolean; + hide_presence: boolean; + text_size: string; + text_size_seq: number; + title_count_mode: string; + timezone: string | null; + skip_new_user_tips: boolean; + default_calendar?: string; + oldest_search_log_date?: string | null; + sidebar_link_to_filtered_list?: boolean; + sidebar_show_count_of_new_items?: boolean; + watched_precedence_over_muted?: boolean | null; + seen_popups?: Array | null; + topics_unread_when_closed: boolean; + }; + }; + }; +}; + +export type GetSessionResponse = GetSessionResponses[keyof GetSessionResponses]; + +export type ClientOptions = { + baseUrl: 'https://{defaultHost}' | (string & {}); +}; diff --git a/lib/generate-response.ts b/lib/generate-response.ts deleted file mode 100644 index 23dd986..0000000 --- a/lib/generate-response.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { openai } from "@ai-sdk/openai"; -import { CoreMessage, generateText, tool } from "ai"; -import { z } from "zod"; -import { exa } from "./utils"; -import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; - -const hackclub = createOpenAICompatible({ - name: "hackclub", - apiKey: process.env.HACKCLUB_API_KEY!, - baseURL: "https://ai.hackclub.com", -}); - -export const generateResponse = async ( - messages: CoreMessage[], - updateStatus?: (status: string) => void, -) => { - const { text } = await generateText({ - model: hackclub("llama-3.3-70b-versatile"), - system: `You are a Discourse bot assistant Keep your responses concise and to the point. - - Do not tag users. - - Current date is: ${new Date().toISOString().split("T")[0]} - - Make sure to ALWAYS include sources in your final response if you use web search. Put sources inline if possible.`, - messages, - maxSteps: 10, - tools: { - getWeather: tool({ - description: "Get the current weather at a location", - parameters: z.object({ - latitude: z.number(), - longitude: z.number(), - city: z.string(), - }), - execute: async ({ latitude, longitude, city }) => { - updateStatus?.(`is getting weather for ${city}...`); - - const response = await fetch( - `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}¤t=temperature_2m,weathercode,relativehumidity_2m&timezone=auto`, - ); - - const weatherData = await response.json(); - return { - temperature: weatherData.current.temperature_2m, - weatherCode: weatherData.current.weathercode, - humidity: weatherData.current.relativehumidity_2m, - city, - }; - }, - }), - searchWeb: tool({ - description: "Use this to search the web for information", - parameters: z.object({ - query: z.string(), - specificDomain: z - .string() - .nullable() - .describe( - "a domain to search if the user specifies e.g. bbc.com. Should be only the domain name without the protocol", - ), - }), - execute: async ({ query, specificDomain }) => { - updateStatus?.(`is searching the web for ${query}...`); - const { results } = await exa.searchAndContents(query, { - livecrawl: "always", - numResults: 3, - includeDomains: specificDomain ? [specificDomain] : undefined, - }); - - return { - results: results.map((result) => ({ - title: result.title, - url: result.url, - snippet: result.text.slice(0, 1000), - })), - }; - }, - }), - }, - }); - - // Convert markdown to Slack mrkdwn format - return text.replace(/\[(.*?)\]\((.*?)\)/g, "<$2|$1>").replace(/\*\*/g, "*"); -}; diff --git a/lib/handle-app-mention.ts b/lib/handle-app-mention.ts deleted file mode 100644 index b0a1f0d..0000000 --- a/lib/handle-app-mention.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { client, getThread } from "./slack-utils"; -import { generateResponse } from "./generate-response"; -import { WebhookNotification } from "@/types"; - -const updateStatusUtil = async ( - initialStatus: string, - event: WebhookNotification, -) => { - const initialMessage = await client.postMessage({ - channel_id: event.data?.chat_channel_id as number, - // thread_ts: event.thread_ts ?? event.ts, - message: initialStatus, - }); - - if (!initialMessage || !initialMessage.id) - throw new Error("Failed to post initial message"); - - const updateMessage = async (status: string) => { - await client.editMessage({ - channel_id: event.data?.chat_channel_id as number, - message_id: initialMessage.id!, - message: status, - }); - }; - return updateMessage; -}; - -export async function handleNewAppMention( - event: WebhookNotification, - botUserId: number, -) { - console.log("Handling app mention"); - if (event.user_id === botUserId) { - console.log("Skipping app mention"); - return; - } - - const { chat_channel_id: channel_id } = event?.data; - const updateMessage = await updateStatusUtil("is thinking...", event); - - // if (thread_ts) { - const messages = await getThread(channel_id as any, botUserId); - const result = await generateResponse(messages, updateMessage); - await updateMessage(result); - // } else { - // const result = await generateResponse( - // [{ role: "user", content: event.text }], - // updateMessage, - // ); - // await updateMessage(result); - // } -} diff --git a/lib/handle-messages.ts b/lib/handle-messages.ts deleted file mode 100644 index 0420fa7..0000000 --- a/lib/handle-messages.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type { - AssistantThreadStartedEvent, - GenericMessageEvent, -} from "@slack/web-api"; -import { client, getThread, updateStatusUtil } from "./slack-utils"; -import { generateResponse } from "./generate-response"; -import { WebhookChatMessage } from "@/types"; - -export async function assistantThreadMessage( - event: AssistantThreadStartedEvent, -) { - const { channel_id, thread_ts } = event.assistant_thread; - console.log(`Thread started: ${channel_id} ${thread_ts}`); - console.log(JSON.stringify(event)); - - await client.postMessage({ - channel_id: channel_id as any, - // thread_ts: thread_ts, - message: "Hello, I'm an AI assistant built with the AI SDK by Vercel!", - }); - - // await client.assistant.threads.setSuggestedPrompts({ - // channel_id: channel_id, - // thread_ts: thread_ts, - // prompts: [ - // { - // title: "Get the weather", - // message: "What is the current weather in London?", - // }, - // { - // title: "Get the news", - // message: "What is the latest Premier League news from the BBC?", - // }, - // ], - // }); -} - -export async function handleNewAssistantMessage( - event: WebhookChatMessage, - botUserId: number, -) { - if ( - event.message.user.id === botUserId - ) - return; - - const { channel } = event; - - const updateStatus = updateStatusUtil(channel.id); - await updateStatus("is thinking..."); - - const messages = await getThread(channel.id, botUserId); - const result = await generateResponse(messages, updateStatus); - - await client.postMessage({ - channel_id: channel.id, - // thread_ts: thread_ts, - message: result, - // unfurl_links: false, - // blocks: [ - // { - // type: "section", - // text: { - // type: "mrkdwn", - // text: result, - // }, - // }, - // ], - }); - - await updateStatus(""); -} diff --git a/lib/slack-utils.ts b/lib/slack-utils.ts deleted file mode 100644 index 3549129..0000000 --- a/lib/slack-utils.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { CoreMessage } from 'ai' -import crypto from 'crypto' -import DiscourseAPI from 'discourse2-chat'; - -const signingSecret = process.env.DISCOURSE_SIGNING_SECRET! -const url = process.env.DISCOURSE_URL!; - -export const client = new DiscourseAPI(url, { - 'Api-Key': process.env.DISCOURSE_BOT_TOKEN! -}) - -// See https://api.slack.com/authentication/verifying-requests-from-slack -export function isValidDiscourseRequest({ - request, - rawBody, -}: { - request: Request - rawBody: string -}): boolean { - const signatureHeader = request.headers.get('X-Discourse-Event-Signature') - - if (!signatureHeader || !signatureHeader.startsWith('sha256=')) { - console.log('Missing or malformed signature') - return false - } - - const receivedHmac = signatureHeader.slice(7) // remove "sha256=" - const computedHmac = crypto - .createHmac('sha256', signingSecret) - .update(rawBody) - .digest('hex') - - try { - return crypto.timingSafeEqual( - Buffer.from(receivedHmac, 'utf8'), - Buffer.from(computedHmac, 'utf8') - ) - } catch (err) { - console.log('HMAC comparison failed:', err) - return false - } -} - -export const verifyRequest = async ({ - request, - rawBody, -}: { - request: Request; - rawBody: string; -}) => { - const validRequest = await isValidDiscourseRequest({ request, rawBody }); - if (!validRequest) { - return new Response("Invalid request", { status: 400 }); - } -}; - -export const updateStatusUtil = (channel: number) => { - return async (status: string) => { - // await client.assistant.threads.setStatus({ - // channel_id: channel, - // thread_ts: thread_ts, - // status: status, - // }); - }; -}; - -export async function getThread( - channel_id: number, - // thread_ts: string, - botUserId: number, -): Promise { - const { messages } = await client.getMessages({ - channel_id, - page_size: 50, - }); - - // Ensure we have messages - - if (!messages) throw new Error("No messages found in thread"); - - const result = messages - .map((message) => { - // @ts-expect-error the types for this are broken - const isBot = message.user?.id === botUserId as any; - if (!message.message) return null; - - // For app mentions, remove the mention prefix - // For DM messages, keep the full text - let content = message.message; - if (!isBot && content.includes(`<@${botUserId}>`)) { - content = content.replace(`<@${botUserId}> `, ""); - } - - return { - role: isBot ? "assistant" : "user", - content: content, - } as CoreMessage; - }) - .filter((msg): msg is CoreMessage => msg !== null); - - return result; -} - -export const getBotId = async (): Promise => { - // const { user_id: botUserId } = await client.auth.test(); - const session = await client.getSession(); - const id = session?.current_user?.id; - - if (!id) { - throw new Error("botUserId is undefined"); - } - - return id; -}; diff --git a/lib/utils.ts b/lib/utils.ts deleted file mode 100644 index 9bddea8..0000000 --- a/lib/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Exa from "exa-js"; - -export const exa = new Exa(process.env.EXA_API_KEY); \ No newline at end of file diff --git a/nitro.config.ts b/nitro.config.ts new file mode 100644 index 0000000..b6694f7 --- /dev/null +++ b/nitro.config.ts @@ -0,0 +1,14 @@ +//https://nitro.unjs.io/config +export default defineNitroConfig({ + srcDir: 'server', + preset: 'bun', + compatibilityDate: '2025-05-24', + imports: { + autoImport: false, + }, + esbuild: { + options: { + target: 'esnext', + }, + }, +}); diff --git a/openapi-ts.config.ts b/openapi-ts.config.ts new file mode 100644 index 0000000..8a59da7 --- /dev/null +++ b/openapi-ts.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from '@hey-api/openapi-ts'; + +export default defineConfig({ + input: './openapi.json', + output: { + format: 'biome', + lint: 'biome', + path: './client', + }, + plugins: [ + '@hey-api/client-fetch', + '@hey-api/schemas', + // 'zod', + { + dates: true, + name: '@hey-api/transformers', + }, + { + enums: 'javascript', + name: '@hey-api/typescript', + }, + { + name: '@hey-api/sdk', + transformer: true, + // validator: true, + }, + ], +}); diff --git a/openapi.json b/openapi.json new file mode 100644 index 0000000..efcc72e --- /dev/null +++ b/openapi.json @@ -0,0 +1,16588 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Discourse API Documentation", + "x-logo": { + "url": "https://docs.discourse.org/logo.svg" + }, + "version": "latest", + "description": "This page contains the documentation on how to use Discourse through API calls.\n\n> Note: For any endpoints not listed you can follow the\n[reverse engineer the Discourse API](https://meta.discourse.org/t/-/20576)\nguide to figure out how to use an API endpoint.\n\n### Request Content-Type\n\nThe Content-Type for POST and PUT requests can be set to `application/x-www-form-urlencoded`,\n`multipart/form-data`, or `application/json`.\n\n### Endpoint Names and Response Content-Type\n\nMost API endpoints provide the same content as their HTML counterparts. For example\nthe URL `/categories` serves a list of categories, the `/categories.json` API provides the\nsame information in JSON format.\n\nInstead of sending API requests to `/categories.json` you may also send them to `/categories`\nand add an `Accept: application/json` header to the request to get the JSON response.\nSending requests with the `Accept` header is necessary if you want to use URLs\nfor related endpoints returned by the API, such as pagination URLs.\nThese URLs are returned without the `.json` prefix so you need to add the header in\norder to get the correct response format.\n\n### Authentication\n\nSome endpoints do not require any authentication, pretty much anything else will\nrequire you to be authenticated.\n\nTo become authenticated you will need to create an API Key from the admin panel.\n\nOnce you have your API Key you can pass it in along with your API Username\nas an HTTP header like this:\n\n```\ncurl -X GET \"http://127.0.0.1:3000/admin/users/list/active.json\" \\\n-H \"Api-Key: 714552c6148e1617aeab526d0606184b94a80ec048fc09894ff1a72b740c5f19\" \\\n-H \"Api-Username: system\"\n```\n\nand this is how POST requests will look:\n\n```\ncurl -X POST \"http://127.0.0.1:3000/categories\" \\\n-H \"Content-Type: multipart/form-data;\" \\\n-H \"Api-Key: 714552c6148e1617aeab526d0606184b94a80ec048fc09894ff1a72b740c5f19\" \\\n-H \"Api-Username: system\" \\\n-F \"name=89853c20-4409-e91a-a8ea-f6cdff96aaaa\" \\\n-F \"color=49d9e9\" \\\n-F \"text_color=f0fcfd\"\n```\n\n### Boolean values\n\nIf an endpoint accepts a boolean be sure to specify it as a lowercase\n`true` or `false` value unless noted otherwise.\n", + "license": { + "name": "MIT", + "url": "https://docs.discourse.org/LICENSE.txt" + } + }, + "paths": { + "/admin/backups.json": { + "get": { + "summary": "List backups", + "tags": ["Backups"], + "operationId": "getBackups", + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "object", + "properties": { + "filename": { + "type": "string" + }, + "size": { + "type": "integer" + }, + "last_modified": { + "type": "string" + } + }, + "required": ["filename", "size", "last_modified"] + } + } + } + } + } + } + }, + "post": { + "summary": "Create backup", + "tags": ["Backups"], + "operationId": "createBackup", + "parameters": [], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string", + "example": "OK" + } + }, + "required": ["success"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "with_uploads": { + "type": "boolean" + } + }, + "required": ["with_uploads"] + } + } + } + } + } + }, + "/admin/backups/{filename}": { + "put": { + "summary": "Send download backup email", + "tags": ["Backups"], + "operationId": "sendDownloadBackupEmail", + "parameters": [ + { + "name": "filename", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "success response" + } + } + }, + "get": { + "summary": "Download backup", + "tags": ["Backups"], + "operationId": "downloadBackup", + "parameters": [ + { + "name": "filename", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "token", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "success response" + } + } + } + }, + "/admin/badges.json": { + "get": { + "summary": "List badges", + "tags": ["Badges"], + "operationId": "adminListBadges", + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "badges": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "grant_count": { + "type": "integer" + }, + "allow_title": { + "type": "boolean" + }, + "multiple_grant": { + "type": "boolean" + }, + "icon": { + "type": "string" + }, + "image_url": { + "type": ["string", "null"] + }, + "listable": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "badge_grouping_id": { + "type": "integer" + }, + "system": { + "type": "boolean" + }, + "long_description": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "manually_grantable": { + "type": "boolean" + }, + "query": { + "type": ["string", "null"] + }, + "trigger": { + "type": ["integer", "null"] + }, + "target_posts": { + "type": "boolean" + }, + "auto_revoke": { + "type": "boolean" + }, + "show_posts": { + "type": "boolean" + }, + "i18n_name": { + "type": ["string", "null"] + }, + "image_upload_id": { + "type": ["integer", "null"] + }, + "badge_type_id": { + "type": "integer" + }, + "show_in_post_header": { + "type": "boolean" + } + }, + "required": [ + "id", + "name", + "description", + "grant_count", + "allow_title", + "multiple_grant", + "icon", + "image_url", + "listable", + "enabled", + "badge_grouping_id", + "system", + "long_description", + "slug", + "manually_grantable", + "query", + "trigger", + "target_posts", + "auto_revoke", + "show_posts", + "badge_type_id", + "image_upload_id", + "show_in_post_header" + ] + } + }, + "badge_types": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "sort_order": { + "type": "integer" + } + }, + "required": ["id", "name", "sort_order"] + } + }, + "badge_groupings": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": ["string", "null"] + }, + "position": { + "type": "integer" + }, + "system": { + "type": "boolean" + } + }, + "required": [ + "id", + "name", + "description", + "position", + "system" + ] + } + }, + "admin_badges": { + "type": "object", + "additionalProperties": false, + "properties": { + "protected_system_fields": { + "type": "array", + "items": {} + }, + "triggers": { + "type": "object", + "additionalProperties": false, + "properties": { + "user_change": { + "type": "integer" + }, + "none": { + "type": "integer" + }, + "post_revision": { + "type": "integer" + }, + "trust_level_change": { + "type": "integer" + }, + "post_action": { + "type": "integer" + } + }, + "required": [ + "user_change", + "none", + "post_revision", + "trust_level_change", + "post_action" + ] + }, + "badge_ids": { + "type": "array", + "items": {} + }, + "badge_grouping_ids": { + "type": "array", + "items": {} + }, + "badge_type_ids": { + "type": "array", + "items": {} + } + }, + "required": [ + "protected_system_fields", + "triggers", + "badge_ids", + "badge_grouping_ids", + "badge_type_ids" + ] + } + }, + "required": [ + "badges", + "badge_types", + "badge_groupings", + "admin_badges" + ] + } + } + } + } + } + }, + "post": { + "summary": "Create badge", + "tags": ["Badges"], + "operationId": "createBadge", + "parameters": [], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "badge_types": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "sort_order": { + "type": "integer" + } + }, + "required": ["id", "name", "sort_order"] + } + }, + "badge": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "grant_count": { + "type": "integer" + }, + "allow_title": { + "type": "boolean" + }, + "multiple_grant": { + "type": "boolean" + }, + "icon": { + "type": "string" + }, + "image_url": { + "type": ["string", "null"] + }, + "image_upload_id": { + "type": ["integer", "null"] + }, + "listable": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "badge_grouping_id": { + "type": "integer" + }, + "system": { + "type": "boolean" + }, + "long_description": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "manually_grantable": { + "type": "boolean" + }, + "query": { + "type": ["string", "null"] + }, + "trigger": { + "type": ["string", "null"] + }, + "target_posts": { + "type": "boolean" + }, + "auto_revoke": { + "type": "boolean" + }, + "show_posts": { + "type": "boolean" + }, + "badge_type_id": { + "type": "integer" + }, + "show_in_post_header": { + "type": "boolean" + } + }, + "required": [ + "id", + "name", + "description", + "grant_count", + "allow_title", + "multiple_grant", + "icon", + "image_url", + "listable", + "enabled", + "badge_grouping_id", + "system", + "long_description", + "slug", + "manually_grantable", + "query", + "trigger", + "target_posts", + "auto_revoke", + "show_posts", + "badge_type_id", + "image_upload_id", + "show_in_post_header" + ] + } + }, + "required": ["badge_types", "badge"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name for the new badge." + }, + "badge_type_id": { + "type": "integer", + "description": "The ID for the badge type. 1 for Gold, 2 for Silver,\n3 for Bronze." + } + }, + "required": ["name", "badge_type_id"] + } + } + } + } + } + }, + "/admin/badges/{id}.json": { + "put": { + "summary": "Update badge", + "tags": ["Badges"], + "operationId": "updateBadge", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "badge_types": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "sort_order": { + "type": "integer" + } + }, + "required": ["id", "name", "sort_order"] + } + }, + "badge": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "grant_count": { + "type": "integer" + }, + "allow_title": { + "type": "boolean" + }, + "multiple_grant": { + "type": "boolean" + }, + "icon": { + "type": "string" + }, + "image_url": { + "type": ["string", "null"] + }, + "image_upload_id": { + "type": ["integer", "null"] + }, + "listable": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "badge_grouping_id": { + "type": "integer" + }, + "system": { + "type": "boolean" + }, + "long_description": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "manually_grantable": { + "type": "boolean" + }, + "query": { + "type": ["string", "null"] + }, + "trigger": { + "type": ["string", "null"] + }, + "target_posts": { + "type": "boolean" + }, + "auto_revoke": { + "type": "boolean" + }, + "show_posts": { + "type": "boolean" + }, + "badge_type_id": { + "type": "integer" + }, + "show_in_post_header": { + "type": "boolean" + } + }, + "required": [ + "id", + "name", + "description", + "grant_count", + "allow_title", + "multiple_grant", + "icon", + "image_url", + "listable", + "enabled", + "badge_grouping_id", + "system", + "long_description", + "slug", + "manually_grantable", + "query", + "trigger", + "target_posts", + "auto_revoke", + "show_posts", + "badge_type_id", + "image_upload_id", + "show_in_post_header" + ] + } + }, + "required": ["badge_types", "badge"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name for the new badge." + }, + "badge_type_id": { + "type": "integer", + "description": "The ID for the badge type. 1 for Gold, 2 for Silver,\n3 for Bronze." + } + }, + "required": ["name", "badge_type_id"] + } + } + } + } + }, + "delete": { + "summary": "Delete badge", + "tags": ["Badges"], + "operationId": "deleteBadge", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "success response" + } + } + } + }, + "/categories.json": { + "post": { + "summary": "Creates a category", + "tags": ["Categories"], + "operationId": "createCategory", + "parameters": [], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "category": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "text_color": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "topic_count": { + "type": "integer" + }, + "post_count": { + "type": "integer" + }, + "position": { + "type": "integer" + }, + "description": { + "type": ["string", "null"] + }, + "description_text": { + "type": ["string", "null"] + }, + "description_excerpt": { + "type": ["string", "null"] + }, + "topic_url": { + "type": ["string", "null"] + }, + "read_restricted": { + "type": "boolean" + }, + "permission": { + "type": ["integer", "null"] + }, + "notification_level": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "topic_template": { + "type": ["string", "null"] + }, + "form_template_ids": { + "type": "array", + "items": {} + }, + "has_children": { + "type": ["boolean", "null"] + }, + "subcategory_count": { + "type": ["integer", "null"] + }, + "sort_order": { + "type": ["string", "null"] + }, + "sort_ascending": { + "type": ["string", "null"] + }, + "show_subcategory_list": { + "type": "boolean" + }, + "num_featured_topics": { + "type": "integer" + }, + "default_view": { + "type": ["string", "null"] + }, + "subcategory_list_style": { + "type": "string" + }, + "default_top_period": { + "type": "string" + }, + "default_list_filter": { + "type": "string" + }, + "minimum_required_tags": { + "type": "integer" + }, + "navigate_to_first_post_after_read": { + "type": "boolean" + }, + "custom_fields": { + "type": "object", + "additionalProperties": false, + "properties": {} + }, + "allowed_tags": { + "type": "array", + "items": {} + }, + "allowed_tag_groups": { + "type": "array", + "items": {} + }, + "allow_global_tags": { + "type": "boolean" + }, + "required_tag_groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "min_count": { + "type": "integer" + } + }, + "required": ["name", "min_count"] + } + }, + "category_setting": { + "auto_bump_cooldown_days": 1, + "num_auto_bump_daily": null, + "require_reply_approval": null, + "require_topic_approval": null + }, + "read_only_banner": { + "type": ["string", "null"] + }, + "available_groups": { + "type": "array", + "items": {} + }, + "auto_close_hours": { + "type": ["string", "null"] + }, + "auto_close_based_on_last_post": { + "type": "boolean" + }, + "allow_unlimited_owner_edits_on_first_post": { + "type": "boolean" + }, + "default_slow_mode_seconds": { + "type": ["string", "null"] + }, + "group_permissions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "permission_type": { + "type": "integer" + }, + "group_name": { + "type": "string" + } + }, + "required": ["permission_type", "group_name"] + } + }, + "email_in": { + "type": ["string", "null"] + }, + "email_in_allow_strangers": { + "type": "boolean" + }, + "mailinglist_mirror": { + "type": "boolean" + }, + "all_topics_wiki": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "allow_badges": { + "type": "boolean" + }, + "topic_featured_link_allowed": { + "type": "boolean" + }, + "search_priority": { + "type": "integer" + }, + "uploaded_logo": { + "type": ["string", "null"] + }, + "uploaded_logo_dark": { + "type": ["string", "null"] + }, + "uploaded_background": { + "type": ["string", "null"] + }, + "uploaded_background_dark": { + "type": ["string", "null"] + } + }, + "required": [ + "id", + "name", + "color", + "text_color", + "slug", + "topic_count", + "post_count", + "position", + "description", + "description_text", + "description_excerpt", + "topic_url", + "read_restricted", + "permission", + "notification_level", + "can_edit", + "topic_template", + "has_children", + "subcategory_count", + "sort_order", + "sort_ascending", + "show_subcategory_list", + "num_featured_topics", + "default_view", + "subcategory_list_style", + "default_top_period", + "default_list_filter", + "minimum_required_tags", + "navigate_to_first_post_after_read", + "custom_fields", + "required_tag_groups", + "read_only_banner", + "available_groups", + "auto_close_hours", + "auto_close_based_on_last_post", + "allow_unlimited_owner_edits_on_first_post", + "default_slow_mode_seconds", + "group_permissions", + "email_in", + "email_in_allow_strangers", + "mailinglist_mirror", + "all_topics_wiki", + "can_delete", + "allow_badges", + "topic_featured_link_allowed", + "search_priority", + "uploaded_logo", + "uploaded_logo_dark", + "uploaded_background", + "uploaded_background_dark" + ] + } + }, + "required": ["category"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string", + "example": "49d9e9" + }, + "text_color": { + "type": "string", + "example": "f0fcfd" + }, + "parent_category_id": { + "type": "integer" + }, + "allow_badges": { + "type": "boolean" + }, + "slug": { + "type": "string" + }, + "topic_featured_links_allowed": { + "type": "boolean" + }, + "permissions": { + "type": "object", + "additionalProperties": true, + "properties": { + "everyone": { + "type": "integer", + "example": 1 + }, + "staff": { + "type": "integer" + } + } + }, + "search_priority": { + "type": "integer" + }, + "form_template_ids": { + "type": "array", + "items": {} + } + }, + "required": ["name"] + } + } + } + } + }, + "get": { + "summary": "Retrieves a list of categories", + "tags": ["Categories"], + "operationId": "listCategories", + "parameters": [ + { + "name": "include_subcategories", + "in": "query", + "schema": { + "type": "boolean", + "enum": [true] + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "category_list": { + "type": "object", + "additionalProperties": false, + "properties": { + "can_create_category": { + "type": "boolean" + }, + "can_create_topic": { + "type": "boolean" + }, + "categories": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "text_color": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "topic_count": { + "type": "integer" + }, + "post_count": { + "type": "integer" + }, + "position": { + "type": "integer" + }, + "description": { + "type": ["string", "null"] + }, + "description_text": { + "type": ["string", "null"] + }, + "description_excerpt": { + "type": ["string", "null"] + }, + "topic_url": { + "type": ["string", "null"] + }, + "read_restricted": { + "type": "boolean" + }, + "permission": { + "type": "integer" + }, + "notification_level": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "topic_template": { + "type": ["string", "null"] + }, + "has_children": { + "type": "boolean" + }, + "subcategory_count": { + "type": ["integer", "null"] + }, + "sort_order": { + "type": ["string", "null"] + }, + "sort_ascending": { + "type": ["string", "null"] + }, + "show_subcategory_list": { + "type": "boolean" + }, + "num_featured_topics": { + "type": "integer" + }, + "default_view": { + "type": ["string", "null"] + }, + "subcategory_list_style": { + "type": "string" + }, + "default_top_period": { + "type": "string" + }, + "default_list_filter": { + "type": "string" + }, + "minimum_required_tags": { + "type": "integer" + }, + "navigate_to_first_post_after_read": { + "type": "boolean" + }, + "topics_day": { + "type": "integer" + }, + "topics_week": { + "type": "integer" + }, + "topics_month": { + "type": "integer" + }, + "topics_year": { + "type": "integer" + }, + "topics_all_time": { + "type": "integer" + }, + "is_uncategorized": { + "type": "boolean" + }, + "subcategory_ids": { + "type": "array", + "items": {} + }, + "subcategory_list": { + "type": ["array", "null"], + "items": {} + }, + "uploaded_logo": { + "type": ["string", "null"] + }, + "uploaded_logo_dark": { + "type": ["string", "null"] + }, + "uploaded_background": { + "type": ["string", "null"] + }, + "uploaded_background_dark": { + "type": ["string", "null"] + } + }, + "required": [ + "id", + "name", + "color", + "text_color", + "slug", + "topic_count", + "post_count", + "position", + "description", + "description_text", + "description_excerpt", + "topic_url", + "read_restricted", + "permission", + "notification_level", + "can_edit", + "topic_template", + "has_children", + "subcategory_count", + "sort_order", + "sort_ascending", + "show_subcategory_list", + "num_featured_topics", + "default_view", + "subcategory_list_style", + "default_top_period", + "default_list_filter", + "minimum_required_tags", + "navigate_to_first_post_after_read", + "topics_day", + "topics_week", + "topics_month", + "topics_year", + "topics_all_time", + "subcategory_ids", + "uploaded_logo", + "uploaded_logo_dark", + "uploaded_background", + "uploaded_background_dark" + ] + } + } + }, + "required": [ + "can_create_category", + "can_create_topic", + "categories" + ] + } + }, + "required": ["category_list"] + } + } + } + } + } + } + }, + "/categories/{id}.json": { + "put": { + "summary": "Updates a category", + "tags": ["Categories"], + "operationId": "updateCategory", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string" + }, + "category": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "text_color": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "topic_count": { + "type": "integer" + }, + "post_count": { + "type": "integer" + }, + "position": { + "type": "integer" + }, + "description": { + "type": ["string", "null"] + }, + "description_text": { + "type": ["string", "null"] + }, + "description_excerpt": { + "type": ["string", "null"] + }, + "topic_url": { + "type": ["string", "null"] + }, + "read_restricted": { + "type": "boolean" + }, + "permission": { + "type": ["integer", "null"] + }, + "notification_level": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "topic_template": { + "type": ["string", "null"] + }, + "form_template_ids": { + "type": "array", + "items": {} + }, + "has_children": { + "type": ["boolean", "null"] + }, + "subcategory_count": { + "type": ["integer", "null"] + }, + "sort_order": { + "type": ["string", "null"] + }, + "sort_ascending": { + "type": ["string", "null"] + }, + "show_subcategory_list": { + "type": "boolean" + }, + "num_featured_topics": { + "type": "integer" + }, + "default_view": { + "type": ["string", "null"] + }, + "subcategory_list_style": { + "type": "string" + }, + "default_top_period": { + "type": "string" + }, + "default_list_filter": { + "type": "string" + }, + "minimum_required_tags": { + "type": "integer" + }, + "navigate_to_first_post_after_read": { + "type": "boolean" + }, + "custom_fields": { + "type": "object", + "additionalProperties": false, + "properties": {} + }, + "allowed_tags": { + "type": "array", + "items": {} + }, + "allowed_tag_groups": { + "type": "array", + "items": {} + }, + "allow_global_tags": { + "type": "boolean" + }, + "required_tag_groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "min_count": { + "type": "integer" + } + }, + "required": ["name", "min_count"] + } + }, + "category_setting": { + "auto_bump_cooldown_days": 1, + "num_auto_bump_daily": null, + "require_reply_approval": null, + "require_topic_approval": null + }, + "read_only_banner": { + "type": ["string", "null"] + }, + "available_groups": { + "type": "array", + "items": {} + }, + "auto_close_hours": { + "type": ["string", "null"] + }, + "auto_close_based_on_last_post": { + "type": "boolean" + }, + "allow_unlimited_owner_edits_on_first_post": { + "type": "boolean" + }, + "default_slow_mode_seconds": { + "type": ["string", "null"] + }, + "group_permissions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "permission_type": { + "type": "integer" + }, + "group_name": { + "type": "string" + } + }, + "required": ["permission_type", "group_name"] + } + }, + "email_in": { + "type": ["string", "null"] + }, + "email_in_allow_strangers": { + "type": "boolean" + }, + "mailinglist_mirror": { + "type": "boolean" + }, + "all_topics_wiki": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "allow_badges": { + "type": "boolean" + }, + "topic_featured_link_allowed": { + "type": "boolean" + }, + "search_priority": { + "type": "integer" + }, + "uploaded_logo": { + "type": ["string", "null"] + }, + "uploaded_logo_dark": { + "type": ["string", "null"] + }, + "uploaded_background": { + "type": ["string", "null"] + }, + "uploaded_background_dark": { + "type": ["string", "null"] + } + }, + "required": [ + "id", + "name", + "color", + "text_color", + "slug", + "topic_count", + "post_count", + "position", + "description", + "description_text", + "description_excerpt", + "topic_url", + "read_restricted", + "permission", + "notification_level", + "can_edit", + "topic_template", + "form_template_ids", + "has_children", + "subcategory_count", + "sort_order", + "sort_ascending", + "show_subcategory_list", + "num_featured_topics", + "default_view", + "subcategory_list_style", + "default_top_period", + "default_list_filter", + "minimum_required_tags", + "navigate_to_first_post_after_read", + "custom_fields", + "required_tag_groups", + "read_only_banner", + "available_groups", + "auto_close_hours", + "auto_close_based_on_last_post", + "allow_unlimited_owner_edits_on_first_post", + "default_slow_mode_seconds", + "group_permissions", + "email_in", + "email_in_allow_strangers", + "mailinglist_mirror", + "all_topics_wiki", + "can_delete", + "allow_badges", + "topic_featured_link_allowed", + "search_priority", + "uploaded_logo", + "uploaded_logo_dark", + "uploaded_background", + "uploaded_background_dark" + ] + } + }, + "required": ["success", "category"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "color": { + "type": "string", + "example": "49d9e9" + }, + "text_color": { + "type": "string", + "example": "f0fcfd" + }, + "parent_category_id": { + "type": "integer" + }, + "allow_badges": { + "type": "boolean" + }, + "slug": { + "type": "string" + }, + "topic_featured_links_allowed": { + "type": "boolean" + }, + "permissions": { + "type": "object", + "additionalProperties": true, + "properties": { + "everyone": { + "type": "integer", + "example": 1 + }, + "staff": { + "type": "integer" + } + } + }, + "search_priority": { + "type": "integer" + }, + "form_template_ids": { + "type": "array", + "items": {} + } + }, + "required": ["name"] + } + } + } + } + } + }, + "/c/{slug}/{id}.json": { + "get": { + "summary": "List topics", + "tags": ["Categories"], + "operationId": "listCategoryTopics", + "parameters": [ + { + "name": "slug", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template" + ] + } + }, + "primary_groups": { + "type": "array", + "items": {} + }, + "topic_list": { + "type": "object", + "additionalProperties": false, + "properties": { + "can_create_topic": { + "type": "boolean" + }, + "per_page": { + "type": "integer" + }, + "top_tags": { + "type": "array", + "items": {} + }, + "topics": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "posts_count": { + "type": "integer" + }, + "reply_count": { + "type": "integer" + }, + "highest_post_number": { + "type": "integer" + }, + "image_url": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "last_posted_at": { + "type": "string" + }, + "bumped": { + "type": "boolean" + }, + "bumped_at": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "unseen": { + "type": "boolean" + }, + "pinned": { + "type": "boolean" + }, + "unpinned": { + "type": ["string", "null"] + }, + "excerpt": { + "type": "string" + }, + "visible": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "bookmarked": { + "type": ["string", "null"] + }, + "liked": { + "type": ["string", "null"] + }, + "views": { + "type": "integer" + }, + "like_count": { + "type": "integer" + }, + "has_summary": { + "type": "boolean" + }, + "last_poster_username": { + "type": "string" + }, + "category_id": { + "type": "integer" + }, + "pinned_globally": { + "type": "boolean" + }, + "featured_link": { + "type": ["string", "null"] + }, + "posters": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "extras": { + "type": "string" + }, + "description": { + "type": "string" + }, + "user_id": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + } + }, + "required": [ + "extras", + "description", + "user_id", + "primary_group_id" + ] + } + } + }, + "required": [ + "id", + "title", + "fancy_title", + "slug", + "posts_count", + "reply_count", + "highest_post_number", + "image_url", + "created_at", + "last_posted_at", + "bumped", + "bumped_at", + "archetype", + "unseen", + "pinned", + "unpinned", + "excerpt", + "visible", + "closed", + "archived", + "bookmarked", + "liked", + "views", + "like_count", + "has_summary", + "last_poster_username", + "category_id", + "pinned_globally", + "featured_link", + "posters" + ] + } + } + }, + "required": ["can_create_topic", "per_page", "topics"] + } + }, + "required": ["topic_list"] + } + } + } + } + } + } + }, + "/c/{id}/show.json": { + "get": { + "summary": "Show category", + "tags": ["Categories"], + "operationId": "getCategory", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "category": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "text_color": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "topic_count": { + "type": "integer" + }, + "post_count": { + "type": "integer" + }, + "position": { + "type": "integer" + }, + "description": { + "type": ["string", "null"] + }, + "description_text": { + "type": ["string", "null"] + }, + "description_excerpt": { + "type": ["string", "null"] + }, + "topic_url": { + "type": ["string", "null"] + }, + "read_restricted": { + "type": "boolean" + }, + "permission": { + "type": ["integer", "null"] + }, + "notification_level": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "topic_template": { + "type": ["string", "null"] + }, + "form_template_ids": { + "type": "array", + "items": {} + }, + "has_children": { + "type": ["boolean", "null"] + }, + "subcategory_count": { + "type": ["integer", "null"] + }, + "sort_order": { + "type": ["string", "null"] + }, + "sort_ascending": { + "type": ["string", "null"] + }, + "show_subcategory_list": { + "type": "boolean" + }, + "num_featured_topics": { + "type": "integer" + }, + "default_view": { + "type": ["string", "null"] + }, + "subcategory_list_style": { + "type": "string" + }, + "default_top_period": { + "type": "string" + }, + "default_list_filter": { + "type": "string" + }, + "minimum_required_tags": { + "type": "integer" + }, + "navigate_to_first_post_after_read": { + "type": "boolean" + }, + "custom_fields": { + "type": "object", + "additionalProperties": false, + "properties": {} + }, + "allowed_tags": { + "type": "array", + "items": {} + }, + "allowed_tag_groups": { + "type": "array", + "items": {} + }, + "allow_global_tags": { + "type": "boolean" + }, + "required_tag_groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "min_count": { + "type": "integer" + } + }, + "required": ["name", "min_count"] + } + }, + "category_setting": { + "auto_bump_cooldown_days": 1, + "num_auto_bump_daily": null, + "require_reply_approval": null, + "require_topic_approval": null + }, + "read_only_banner": { + "type": ["string", "null"] + }, + "available_groups": { + "type": "array", + "items": {} + }, + "auto_close_hours": { + "type": ["string", "null"] + }, + "auto_close_based_on_last_post": { + "type": "boolean" + }, + "allow_unlimited_owner_edits_on_first_post": { + "type": "boolean" + }, + "default_slow_mode_seconds": { + "type": ["string", "null"] + }, + "group_permissions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "permission_type": { + "type": "integer" + }, + "group_name": { + "type": "string" + } + }, + "required": ["permission_type", "group_name"] + } + }, + "email_in": { + "type": ["string", "null"] + }, + "email_in_allow_strangers": { + "type": "boolean" + }, + "mailinglist_mirror": { + "type": "boolean" + }, + "all_topics_wiki": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "allow_badges": { + "type": "boolean" + }, + "topic_featured_link_allowed": { + "type": "boolean" + }, + "search_priority": { + "type": "integer" + }, + "uploaded_logo": { + "type": ["string", "null"] + }, + "uploaded_logo_dark": { + "type": ["string", "null"] + }, + "uploaded_background": { + "type": ["string", "null"] + }, + "uploaded_background_dark": { + "type": ["string", "null"] + } + }, + "required": [ + "id", + "name", + "color", + "text_color", + "slug", + "topic_count", + "post_count", + "position", + "description", + "description_text", + "description_excerpt", + "topic_url", + "read_restricted", + "permission", + "notification_level", + "can_edit", + "topic_template", + "has_children", + "subcategory_count", + "sort_order", + "sort_ascending", + "show_subcategory_list", + "num_featured_topics", + "default_view", + "subcategory_list_style", + "default_top_period", + "default_list_filter", + "minimum_required_tags", + "navigate_to_first_post_after_read", + "custom_fields", + "required_tag_groups", + "read_only_banner", + "available_groups", + "auto_close_hours", + "auto_close_based_on_last_post", + "allow_unlimited_owner_edits_on_first_post", + "default_slow_mode_seconds", + "group_permissions", + "email_in", + "email_in_allow_strangers", + "mailinglist_mirror", + "all_topics_wiki", + "can_delete", + "allow_badges", + "topic_featured_link_allowed", + "search_priority", + "uploaded_logo", + "uploaded_logo_dark", + "uploaded_background", + "uploaded_background_dark" + ] + } + }, + "required": ["category"] + } + } + } + } + } + } + }, + "/admin/groups.json": { + "post": { + "summary": "Create a group", + "tags": ["Groups"], + "operationId": "createGroup", + "parameters": [], + "responses": { + "200": { + "description": "group created", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "basic_group": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "automatic": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "user_count": { + "type": "integer" + }, + "mentionable_level": { + "type": "integer" + }, + "messageable_level": { + "type": "integer" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "grant_trust_level": { + "type": ["string", "null"] + }, + "incoming_email": { + "type": ["string", "null"] + }, + "has_messages": { + "type": "boolean" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "bio_raw": { + "type": ["string", "null"] + }, + "bio_cooked": { + "type": ["string", "null"] + }, + "bio_excerpt": { + "type": ["string", "null"] + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "allow_membership_requests": { + "type": "boolean" + }, + "full_name": { + "type": ["string", "null"] + }, + "default_notification_level": { + "type": "integer" + }, + "membership_request_template": { + "type": ["string", "null"] + }, + "members_visibility_level": { + "type": "integer" + }, + "can_see_members": { + "type": "boolean" + }, + "can_admin_group": { + "type": "boolean" + }, + "can_edit_group": { + "type": "boolean" + }, + "publish_read_state": { + "type": "boolean" + } + }, + "required": [ + "id", + "automatic", + "name", + "user_count", + "mentionable_level", + "messageable_level", + "visibility_level", + "primary_group", + "title", + "grant_trust_level", + "incoming_email", + "has_messages", + "flair_url", + "flair_bg_color", + "flair_color", + "bio_raw", + "bio_cooked", + "bio_excerpt", + "public_admission", + "public_exit", + "allow_membership_requests", + "full_name", + "default_notification_level", + "membership_request_template", + "members_visibility_level", + "can_see_members", + "can_admin_group", + "publish_read_state" + ] + } + }, + "required": ["basic_group"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "group": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "bio_raw": { + "type": "string", + "description": "About Group" + }, + "usernames": { + "type": "string", + "description": "comma,separated" + }, + "owner_usernames": { + "type": "string", + "description": "comma,separated" + }, + "automatic_membership_email_domains": { + "type": "string", + "description": "pipe|separated" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "flair_icon": { + "type": "string" + }, + "flair_upload_id": { + "type": "integer" + }, + "flair_bg_color": { + "type": "string" + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "default_notification_level": { + "type": "integer" + }, + "muted_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "regular_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "watching_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "tracking_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "watching_first_post_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": ["name"] + } + }, + "required": ["group"] + } + } + } + } + } + }, + "/admin/groups/{id}.json": { + "delete": { + "summary": "Delete a group", + "tags": ["Groups"], + "operationId": "deleteGroup", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string", + "example": "OK" + } + }, + "required": ["success"] + } + } + } + } + } + } + }, + "/groups/{id}.json": { + "put": { + "summary": "Update a group", + "tags": ["Groups"], + "operationId": "updateGroup", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "example": "OK" + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "group": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "bio_raw": { + "type": "string", + "description": "About Group" + }, + "usernames": { + "type": "string", + "description": "comma,separated" + }, + "owner_usernames": { + "type": "string", + "description": "comma,separated" + }, + "automatic_membership_email_domains": { + "type": "string", + "description": "pipe|separated" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "flair_icon": { + "type": "string" + }, + "flair_upload_id": { + "type": "integer" + }, + "flair_bg_color": { + "type": "string" + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "default_notification_level": { + "type": "integer" + }, + "muted_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "regular_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "watching_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "tracking_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "watching_first_post_category_ids": { + "type": "array", + "items": { + "type": "integer" + } + } + }, + "required": ["name"] + } + }, + "required": ["group"] + } + } + } + } + }, + "get": { + "summary": "Get a group", + "tags": ["Groups"], + "operationId": "getGroup", + "parameters": [ + { + "name": "id", + "in": "path", + "example": "name", + "description": "Use group name instead of id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "group": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "automatic": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "user_count": { + "type": "integer" + }, + "mentionable_level": { + "type": "integer" + }, + "messageable_level": { + "type": "integer" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "grant_trust_level": { + "type": ["string", "null"] + }, + "incoming_email": { + "type": ["string", "null"] + }, + "has_messages": { + "type": "boolean" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "bio_raw": { + "type": ["string", "null"] + }, + "bio_cooked": { + "type": ["string", "null"] + }, + "bio_excerpt": { + "type": ["string", "null"] + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "allow_membership_requests": { + "type": "boolean" + }, + "full_name": { + "type": ["string", "null"] + }, + "default_notification_level": { + "type": "integer" + }, + "membership_request_template": { + "type": ["string", "null"] + }, + "is_group_user": { + "type": "boolean" + }, + "members_visibility_level": { + "type": "integer" + }, + "can_see_members": { + "type": "boolean" + }, + "can_admin_group": { + "type": "boolean" + }, + "can_edit_group": { + "type": "boolean" + }, + "publish_read_state": { + "type": "boolean" + }, + "is_group_owner_display": { + "type": "boolean" + }, + "mentionable": { + "type": "boolean" + }, + "messageable": { + "type": "boolean" + }, + "automatic_membership_email_domains": { + "type": ["string", "null"] + }, + "smtp_updated_at": { + "type": ["string", "null"] + }, + "smtp_updated_by": { + "type": ["object", "null"] + }, + "smtp_enabled": { + "type": "boolean" + }, + "smtp_server": { + "type": ["string", "null"] + }, + "smtp_port": { + "type": ["string", "null"] + }, + "smtp_ssl_mode": { + "type": ["integer", "null"] + }, + "imap_enabled": { + "type": "boolean" + }, + "imap_updated_at": { + "type": ["string", "null"] + }, + "imap_updated_by": { + "type": ["object", "null"] + }, + "imap_server": { + "type": ["string", "null"] + }, + "imap_port": { + "type": ["string", "null"] + }, + "imap_ssl": { + "type": ["string", "null"] + }, + "imap_mailbox_name": { + "type": "string" + }, + "imap_mailboxes": { + "type": "array", + "items": {} + }, + "email_username": { + "type": ["string", "null"] + }, + "email_from_alias": { + "type": ["string", "null"] + }, + "email_password": { + "type": ["string", "null"] + }, + "imap_last_error": { + "type": ["string", "null"] + }, + "imap_old_emails": { + "type": ["string", "null"] + }, + "imap_new_emails": { + "type": ["string", "null"] + }, + "message_count": { + "type": "integer" + }, + "allow_unknown_sender_topic_replies": { + "type": "boolean" + }, + "associated_group_ids": { + "type": "array", + "items": {} + }, + "watching_category_ids": { + "type": "array", + "items": {} + }, + "tracking_category_ids": { + "type": "array", + "items": {} + }, + "watching_first_post_category_ids": { + "type": "array", + "items": {} + }, + "regular_category_ids": { + "type": "array", + "items": {} + }, + "muted_category_ids": { + "type": "array", + "items": {} + }, + "watching_tags": { + "type": "array", + "items": {} + }, + "watching_first_post_tags": { + "type": "array", + "items": {} + }, + "tracking_tags": { + "type": "array", + "items": {} + }, + "regular_tags": { + "type": "array", + "items": {} + }, + "muted_tags": { + "type": "array", + "items": {} + } + }, + "required": [ + "id", + "automatic", + "name", + "user_count", + "mentionable_level", + "messageable_level", + "visibility_level", + "primary_group", + "title", + "grant_trust_level", + "incoming_email", + "has_messages", + "flair_url", + "flair_bg_color", + "flair_color", + "bio_raw", + "bio_cooked", + "bio_excerpt", + "public_admission", + "public_exit", + "allow_membership_requests", + "full_name", + "default_notification_level", + "membership_request_template", + "is_group_user", + "members_visibility_level", + "can_see_members", + "can_admin_group", + "publish_read_state", + "is_group_owner_display", + "mentionable", + "messageable", + "automatic_membership_email_domains", + "smtp_server", + "smtp_port", + "smtp_ssl_mode", + "imap_server", + "imap_port", + "imap_ssl", + "imap_mailbox_name", + "imap_mailboxes", + "email_username", + "email_password", + "imap_last_error", + "imap_old_emails", + "imap_new_emails", + "message_count", + "allow_unknown_sender_topic_replies", + "watching_category_ids", + "tracking_category_ids", + "watching_first_post_category_ids", + "regular_category_ids", + "muted_category_ids" + ] + }, + "extras": { + "type": "object", + "additionalProperties": false, + "properties": { + "visible_group_names": { + "type": "array", + "items": {} + } + }, + "required": ["visible_group_names"] + } + }, + "required": ["group", "extras"] + } + } + } + } + } + } + }, + "/groups/{id}/members.json": { + "get": { + "summary": "List group members", + "tags": ["Groups"], + "operationId": "listGroupMembers", + "parameters": [ + { + "name": "id", + "in": "path", + "example": "name", + "description": "Use group name instead of id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "members": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "avatar_template": { + "type": "string" + }, + "title": { + "type": ["string", "null"] + }, + "last_posted_at": { + "type": "string" + }, + "last_seen_at": { + "type": "string" + }, + "added_at": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "title", + "last_posted_at", + "last_seen_at", + "added_at", + "timezone" + ] + } + }, + "owners": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "avatar_template": { + "type": "string" + }, + "title": { + "type": ["string", "null"] + }, + "last_posted_at": { + "type": "string" + }, + "last_seen_at": { + "type": "string" + }, + "added_at": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "title", + "last_posted_at", + "last_seen_at", + "added_at", + "timezone" + ] + } + }, + "meta": { + "type": "object", + "additionalProperties": false, + "properties": { + "total": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "offset": { + "type": "integer" + } + }, + "required": ["total", "limit", "offset"] + } + }, + "required": ["members", "owners", "meta"] + } + } + } + } + } + }, + "put": { + "summary": "Add group members", + "tags": ["Groups"], + "operationId": "addGroupMembers", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string" + }, + "usernames": { + "type": "array", + "items": {} + }, + "emails": { + "type": "array", + "items": {} + } + }, + "required": ["success", "usernames", "emails"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "usernames": { + "type": "string", + "description": "comma separated list", + "example": "username1,username2" + } + } + } + } + } + } + }, + "delete": { + "summary": "Remove group members", + "tags": ["Groups"], + "operationId": "removeGroupMembers", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string" + }, + "usernames": { + "type": "array", + "items": {} + }, + "skipped_usernames": { + "type": "array", + "items": {} + } + }, + "required": ["success", "usernames", "skipped_usernames"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "usernames": { + "type": "string", + "description": "comma separated list", + "example": "username1,username2" + } + } + } + } + } + } + } + }, + "/groups.json": { + "get": { + "summary": "List groups", + "tags": ["Groups"], + "operationId": "listGroups", + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "automatic": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "user_count": { + "type": "integer" + }, + "mentionable_level": { + "type": "integer" + }, + "messageable_level": { + "type": "integer" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "grant_trust_level": { + "type": ["string", "null"] + }, + "incoming_email": { + "type": ["string", "null"] + }, + "has_messages": { + "type": "boolean" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "bio_raw": { + "type": ["string", "null"] + }, + "bio_cooked": { + "type": ["string", "null"] + }, + "bio_excerpt": { + "type": ["string", "null"] + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "allow_membership_requests": { + "type": "boolean" + }, + "full_name": { + "type": ["string", "null"] + }, + "default_notification_level": { + "type": "integer" + }, + "membership_request_template": { + "type": ["string", "null"] + }, + "is_group_user": { + "type": "boolean" + }, + "is_group_owner": { + "type": "boolean" + }, + "members_visibility_level": { + "type": "integer" + }, + "can_see_members": { + "type": "boolean" + }, + "can_admin_group": { + "type": "boolean" + }, + "can_edit_group": { + "type": "boolean" + }, + "publish_read_state": { + "type": "boolean" + } + }, + "required": [ + "id", + "automatic", + "name", + "display_name", + "user_count", + "mentionable_level", + "messageable_level", + "visibility_level", + "primary_group", + "title", + "grant_trust_level", + "incoming_email", + "has_messages", + "flair_url", + "flair_bg_color", + "flair_color", + "bio_raw", + "bio_cooked", + "bio_excerpt", + "public_admission", + "public_exit", + "allow_membership_requests", + "full_name", + "default_notification_level", + "membership_request_template", + "members_visibility_level", + "can_see_members", + "can_admin_group", + "publish_read_state" + ] + } + }, + "extras": { + "type": "object", + "additionalProperties": false, + "properties": { + "type_filters": { + "type": "array", + "items": {} + } + }, + "required": ["type_filters"] + }, + "total_rows_groups": { + "type": "integer" + }, + "load_more_groups": { + "type": "string" + } + }, + "required": [ + "groups", + "extras", + "total_rows_groups", + "load_more_groups" + ] + } + } + } + } + } + } + }, + "/invites.json": { + "post": { + "summary": "Create an invite", + "tags": ["Invites"], + "operationId": "createInvite", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "example": 42 + }, + "link": { + "type": "string", + "example": "http://example.com/invites/9045fd767efe201ca60c6658bcf14158" + }, + "email": { + "type": "string", + "example": "not-a-user-yet@example.com" + }, + "emailed": { + "type": "boolean", + "example": false + }, + "custom_message": { + "type": ["string", "null"], + "example": "Hello world!" + }, + "topics": { + "type": "array", + "items": {}, + "example": [] + }, + "groups": { + "type": "array", + "items": {}, + "example": [] + }, + "created_at": { + "type": "string", + "example": "2021-01-01T12:00:00.000Z" + }, + "updated_at": { + "type": "string", + "example": "2021-01-01T12:00:00.000Z" + }, + "expires_at": { + "type": "string", + "example": "2021-02-01T12:00:00.000Z" + }, + "expired": { + "type": "boolean", + "example": false + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string", + "example": "not-a-user-yet@example.com", + "description": "required for email invites only" + }, + "skip_email": { + "type": "boolean", + "default": false + }, + "custom_message": { + "type": "string", + "description": "optional, for email invites" + }, + "max_redemptions_allowed": { + "type": "integer", + "example": 5, + "default": 1, + "description": "optional, for link invites" + }, + "topic_id": { + "type": "integer" + }, + "group_ids": { + "type": "string", + "description": "Optional, either this or `group_names`. Comma separated\nlist for multiple ids.", + "example": "42,43" + }, + "group_names": { + "type": "string", + "description": "Optional, either this or `group_ids`. Comma separated\nlist for multiple names.", + "example": "foo,bar" + }, + "expires_at": { + "type": "string", + "description": "optional, if not supplied, the invite_expiry_days site\nsetting is used" + } + } + } + } + } + } + } + }, + "/invites/create-multiple.json": { + "post": { + "summary": "Create multiple invites", + "tags": ["Invites"], + "operationId": "createMultipleInvites", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "num_successfully_created_invitations": { + "type": "integer", + "example": 42 + }, + "num_failed_invitations": { + "type": "integer", + "example": 42 + }, + "failed_invitations": { + "type": "array", + "items": {}, + "example": [] + }, + "successful_invitations": { + "type": "array", + "example": [ + { + "id": 42, + "link": "http://example.com/invites/9045fd767efe201ca60c6658bcf14158", + "email": "not-a-user-yet-1@example.com", + "emailed": true, + "custom_message": "Hello world!", + "topics": [], + "groups": [], + "created_at": "2021-01-01T12:00:00.000Z", + "updated_at": "2021-01-01T12:00:00.000Z", + "expires_at": "2021-02-01T12:00:00.000Z", + "expired": false + }, + { + "id": 42, + "link": "http://example.com/invites/c6658bcf141589045fd767efe201ca60", + "email": "not-a-user-yet-2@example.com", + "emailed": true, + "custom_message": "Hello world!", + "topics": [], + "groups": [], + "created_at": "2021-01-01T12:00:00.000Z", + "updated_at": "2021-01-01T12:00:00.000Z", + "expires_at": "2021-02-01T12:00:00.000Z", + "expired": false + } + ] + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string", + "example": [ + "not-a-user-yet-1@example.com", + "not-a-user-yet-2@example.com" + ], + "description": "pass 1 email per invite to be generated. other properties\nwill be shared by each invite." + }, + "skip_email": { + "type": "boolean", + "default": false + }, + "custom_message": { + "type": "string", + "description": "optional, for email invites" + }, + "max_redemptions_allowed": { + "type": "integer", + "example": 5, + "default": 1, + "description": "optional, for link invites" + }, + "topic_id": { + "type": "integer" + }, + "group_ids": { + "type": "string", + "description": "Optional, either this or `group_names`. Comma separated\nlist for multiple ids.", + "example": "42,43" + }, + "group_names": { + "type": "string", + "description": "Optional, either this or `group_ids`. Comma separated\nlist for multiple names.", + "example": "foo,bar" + }, + "expires_at": { + "type": "string", + "description": "optional, if not supplied, the invite_expiry_days site\nsetting is used" + } + } + } + } + } + } + } + }, + "/notifications.json": { + "get": { + "summary": "Get the notifications that belong to the current user", + "tags": ["Notifications"], + "operationId": "getNotifications", + "responses": { + "200": { + "description": "notifications", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "notifications": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + }, + "notification_type": { + "type": "integer" + }, + "read": { + "type": "boolean" + }, + "created_at": { + "type": "string" + }, + "post_number": { + "type": ["integer", "null"] + }, + "topic_id": { + "type": ["integer", "null"] + }, + "slug": { + "type": ["string", "null"] + }, + "data": { + "type": "object", + "properties": { + "badge_id": { + "type": "integer" + }, + "badge_name": { + "type": "string" + }, + "badge_slug": { + "type": "string" + }, + "badge_title": { + "type": "boolean" + }, + "username": { + "type": "string" + } + } + } + } + } + }, + "total_rows_notifications": { + "type": "integer" + }, + "seen_notification_id": { + "type": "integer" + }, + "load_more_notifications": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "/notifications/mark-read.json": { + "put": { + "summary": "Mark notifications as read", + "tags": ["Notifications"], + "operationId": "markNotificationsAsRead", + "parameters": [], + "responses": { + "200": { + "description": "notifications marked read", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string" + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "(optional) Leave off to mark all notifications as\nread" + } + } + } + } + } + } + } + }, + "/posts.json": { + "get": { + "summary": "List latest posts across topics", + "tags": ["Posts"], + "operationId": "listPosts", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "before", + "in": "query", + "description": "Load posts with an id lower than this value. Useful for pagination.", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "latest posts", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "latest_posts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "username": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_type": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "reply_count": { + "type": "integer" + }, + "reply_to_post_number": { + "type": ["string", "null"] + }, + "quote_count": { + "type": "integer" + }, + "incoming_link_count": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "readers_count": { + "type": "integer" + }, + "score": { + "type": "number" + }, + "yours": { + "type": "boolean" + }, + "topic_id": { + "type": "integer" + }, + "topic_slug": { + "type": "string" + }, + "topic_title": { + "type": "string" + }, + "topic_html_title": { + "type": "string" + }, + "category_id": { + "type": "integer" + }, + "display_username": { + "type": "string" + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "version": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_recover": { + "type": "boolean" + }, + "can_see_hidden_post": { + "type": "boolean" + }, + "can_wiki": { + "type": "boolean" + }, + "user_title": { + "type": ["string", "null"] + }, + "raw": { + "type": "string" + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "can_act": { + "type": "boolean" + } + } + } + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + }, + "user_id": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_deleted": { + "type": "boolean" + }, + "edit_reason": { + "type": ["string", "null"] + }, + "can_view_edit_history": { + "type": "boolean" + }, + "wiki": { + "type": "boolean" + }, + "reviewable_id": { + "type": ["integer", "null"] + }, + "reviewable_score_count": { + "type": "integer" + }, + "reviewable_score_pending_count": { + "type": "integer" + } + } + } + } + } + } + } + } + } + } + }, + "post": { + "summary": "Creates a new topic, a new post, or a private message", + "tags": ["Posts", "Topics", "Private Messages"], + "operationId": "createTopicPostPM", + "parameters": [], + "responses": { + "200": { + "description": "post created", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": ["string", "null"] + }, + "username": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "raw": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_type": { + "type": "integer" + }, + "posts_count": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "reply_count": { + "type": "integer" + }, + "reply_to_post_number": { + "type": ["string", "null"] + }, + "quote_count": { + "type": "integer" + }, + "incoming_link_count": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "readers_count": { + "type": "integer" + }, + "score": { + "type": "number" + }, + "yours": { + "type": "boolean" + }, + "topic_id": { + "type": "integer" + }, + "topic_slug": { + "type": "string" + }, + "display_username": { + "type": ["string", "null"] + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "badges_granted": { + "type": "array", + "items": {} + }, + "version": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_recover": { + "type": "boolean" + }, + "can_see_hidden_post": { + "type": "boolean" + }, + "can_wiki": { + "type": "boolean" + }, + "user_title": { + "type": ["string", "null"] + }, + "bookmarked": { + "type": "boolean" + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "can_act": { + "type": "boolean" + } + }, + "required": ["id", "can_act"] + } + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + }, + "user_id": { + "type": "integer" + }, + "draft_sequence": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_deleted": { + "type": "boolean" + }, + "edit_reason": { + "type": ["string", "null"] + }, + "can_view_edit_history": { + "type": "boolean" + }, + "wiki": { + "type": "boolean" + }, + "reviewable_id": { + "type": ["integer", "null"] + }, + "reviewable_score_count": { + "type": "integer" + }, + "reviewable_score_pending_count": { + "type": "integer" + }, + "post_url": { + "type": "string" + }, + "mentioned_users": { + "type": "array", + "items": {} + } + }, + "required": [ + "id", + "name", + "username", + "avatar_template", + "created_at", + "cooked", + "post_number", + "post_type", + "posts_count", + "updated_at", + "reply_count", + "reply_to_post_number", + "quote_count", + "incoming_link_count", + "reads", + "readers_count", + "score", + "yours", + "topic_id", + "topic_slug", + "display_username", + "primary_group_name", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "version", + "can_edit", + "can_delete", + "can_recover", + "can_wiki", + "user_title", + "bookmarked", + "actions_summary", + "moderator", + "admin", + "staff", + "user_id", + "draft_sequence", + "hidden", + "trust_level", + "deleted_at", + "user_deleted", + "edit_reason", + "can_view_edit_history", + "wiki", + "reviewable_id", + "reviewable_score_count", + "reviewable_score_pending_count", + "post_url" + ] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "title": { + "type": "string", + "description": "Required if creating a new topic or new private message." + }, + "raw": { + "type": "string" + }, + "topic_id": { + "type": "integer", + "description": "Required if creating a new post." + }, + "category": { + "type": "integer", + "description": "Optional if creating a new topic, and ignored if creating\na new post." + }, + "target_recipients": { + "type": "string", + "description": "Required for private message, comma separated.", + "example": "blake,sam" + }, + "target_usernames": { + "type": "string", + "description": "Deprecated. Use target_recipients instead.", + "deprecated": true + }, + "archetype": { + "type": "string", + "description": "Required for new private message.", + "example": "private_message" + }, + "created_at": { + "type": "string" + }, + "reply_to_post_number": { + "type": "integer", + "description": "Optional, the post number to reply to inside a topic." + }, + "embed_url": { + "type": "string", + "description": "Provide a URL from a remote system to associate a forum\ntopic with that URL, typically for using Discourse as a comments\nsystem for an external blog." + }, + "external_id": { + "type": "string", + "description": "Provide an external_id from a remote system to associate\na forum topic with that id." + } + }, + "required": ["raw"] + } + } + } + } + } + }, + "/posts/{id}.json": { + "get": { + "summary": "Retrieve a single post", + "tags": ["Posts"], + "operationId": "getPost", + "description": "This endpoint can be used to get the number of likes on a post using the\n`actions_summary` property in the response. `actions_summary` responses\nwith the id of `2` signify a `like`. If there are no `actions_summary`\nitems with the id of `2`, that means there are 0 likes. Other ids likely\nrefer to various different flag types.\n", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "single reviewable post", + "content": { + "application/json": { + "schema": { + "additionalProperties": true, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_type": { + "type": "integer" + }, + "posts_count": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "reply_count": { + "type": "integer" + }, + "reply_to_post_number": { + "type": ["string", "null"] + }, + "quote_count": { + "type": "integer" + }, + "incoming_link_count": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "readers_count": { + "type": "integer" + }, + "score": { + "type": "number" + }, + "yours": { + "type": "boolean" + }, + "topic_id": { + "type": "integer" + }, + "topic_slug": { + "type": "string" + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "version": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_recover": { + "type": "boolean" + }, + "can_see_hidden_post": { + "type": "boolean" + }, + "can_wiki": { + "type": "boolean" + }, + "user_title": { + "type": ["string", "null"] + }, + "bookmarked": { + "type": "boolean" + }, + "raw": { + "type": "string" + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer", + "description": "`2`: like, `3`, `4`, `6`, `7`, `8`: flag" + }, + "count": { + "type": "integer" + }, + "acted": { + "type": "boolean" + }, + "can_undo": { + "type": "boolean" + }, + "can_act": { + "type": "boolean" + } + }, + "required": ["id"] + } + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + }, + "user_id": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_deleted": { + "type": "boolean" + }, + "edit_reason": { + "type": ["string", "null"] + }, + "can_view_edit_history": { + "type": "boolean" + }, + "wiki": { + "type": "boolean" + }, + "reviewable_id": { + "type": ["integer", "null"] + }, + "reviewable_score_count": { + "type": "integer" + }, + "reviewable_score_pending_count": { + "type": "integer" + }, + "post_url": { + "type": "string" + }, + "mentioned_users": { + "type": "array", + "items": {} + }, + "name": { + "type": ["string", "null"] + }, + "display_username": { + "type": ["string", "null"] + } + }, + "required": [ + "id", + "username", + "avatar_template", + "created_at", + "cooked", + "post_number", + "post_type", + "posts_count", + "updated_at", + "reply_count", + "reply_to_post_number", + "quote_count", + "incoming_link_count", + "reads", + "readers_count", + "score", + "yours", + "topic_id", + "topic_slug", + "primary_group_name", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "version", + "can_edit", + "can_delete", + "can_recover", + "can_wiki", + "user_title", + "bookmarked", + "raw", + "actions_summary", + "moderator", + "admin", + "staff", + "user_id", + "hidden", + "trust_level", + "deleted_at", + "user_deleted", + "edit_reason", + "can_view_edit_history", + "wiki", + "reviewable_id", + "reviewable_score_count", + "reviewable_score_pending_count", + "post_url" + ] + } + } + } + } + } + }, + "put": { + "summary": "Update a single post", + "tags": ["Posts"], + "operationId": "updatePost", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "post updated", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "post": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_type": { + "type": "integer" + }, + "posts_count": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "reply_count": { + "type": "integer" + }, + "reply_to_post_number": { + "type": ["string", "null"] + }, + "quote_count": { + "type": "integer" + }, + "incoming_link_count": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "readers_count": { + "type": "integer" + }, + "score": { + "type": "number" + }, + "yours": { + "type": "boolean" + }, + "topic_id": { + "type": "integer" + }, + "topic_slug": { + "type": "string" + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "badges_granted": { + "type": "array", + "items": {} + }, + "version": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_recover": { + "type": "boolean" + }, + "can_see_hidden_post": { + "type": "boolean" + }, + "can_wiki": { + "type": "boolean" + }, + "user_title": { + "type": ["string", "null"] + }, + "bookmarked": { + "type": "boolean" + }, + "raw": { + "type": "string" + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "can_act": { + "type": "boolean" + } + }, + "required": ["id", "can_act"] + } + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + }, + "user_id": { + "type": "integer" + }, + "draft_sequence": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_deleted": { + "type": "boolean" + }, + "edit_reason": { + "type": ["string", "null"] + }, + "can_view_edit_history": { + "type": "boolean" + }, + "wiki": { + "type": "boolean" + }, + "reviewable_id": { + "type": ["integer", "null"] + }, + "reviewable_score_count": { + "type": "integer" + }, + "reviewable_score_pending_count": { + "type": "integer" + }, + "post_url": { + "type": "string" + }, + "mentioned_users": { + "type": "array", + "items": {} + }, + "name": { + "type": ["string", "null"] + }, + "display_username": { + "type": ["string", "null"] + } + }, + "required": [ + "id", + "username", + "avatar_template", + "created_at", + "cooked", + "post_number", + "post_type", + "posts_count", + "updated_at", + "reply_count", + "reply_to_post_number", + "quote_count", + "incoming_link_count", + "reads", + "readers_count", + "score", + "yours", + "topic_id", + "topic_slug", + "primary_group_name", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "version", + "can_edit", + "can_delete", + "can_recover", + "can_wiki", + "user_title", + "bookmarked", + "raw", + "actions_summary", + "moderator", + "admin", + "staff", + "user_id", + "draft_sequence", + "hidden", + "trust_level", + "deleted_at", + "user_deleted", + "edit_reason", + "can_view_edit_history", + "wiki", + "reviewable_id", + "reviewable_score_count", + "reviewable_score_pending_count", + "post_url" + ] + } + }, + "required": ["post"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "post": { + "type": "object", + "additionalProperties": false, + "properties": { + "raw": { + "type": "string" + }, + "edit_reason": { + "type": "string" + } + }, + "required": ["raw"] + } + } + } + } + } + } + }, + "delete": { + "summary": "delete a single post", + "tags": ["Posts"], + "operationId": "deletePost", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "integer" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "success response" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "force_destroy": { + "type": "boolean", + "example": true, + "description": "The `SiteSetting.can_permanently_delete` needs to be\nenabled first before this param can be used. Also this endpoint\nneeds to be called first without `force_destroy` and then followed\nup with a second call 5 minutes later with `force_destroy` to\npermanently delete." + } + } + } + } + } + } + } + }, + "/posts/{id}/replies.json": { + "get": { + "summary": "List replies to a post", + "tags": ["Posts"], + "operationId": "postReplies", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "post replies", + "content": { + "application/json": { + "schema": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": ["string", "null"] + }, + "username": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_type": { + "type": "integer" + }, + "posts_count": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "reply_count": { + "type": "integer" + }, + "reply_to_post_number": { + "type": "integer" + }, + "quote_count": { + "type": "integer" + }, + "incoming_link_count": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "readers_count": { + "type": "integer" + }, + "score": { + "type": "number" + }, + "yours": { + "type": "boolean" + }, + "topic_id": { + "type": "integer" + }, + "topic_slug": { + "type": "string" + }, + "display_username": { + "type": ["string", "null"] + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "version": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_recover": { + "type": "boolean" + }, + "can_see_hidden_post": { + "type": "boolean" + }, + "can_wiki": { + "type": "boolean" + }, + "user_title": { + "type": ["string", "null"] + }, + "reply_to_user": { + "type": "object", + "additionalProperties": false, + "properties": { + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + }, + "required": ["username", "avatar_template"] + }, + "bookmarked": { + "type": "boolean" + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "can_act": { + "type": "boolean" + } + }, + "required": ["id", "can_act"] + } + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + }, + "user_id": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_deleted": { + "type": "boolean" + }, + "edit_reason": { + "type": ["string", "null"] + }, + "can_view_edit_history": { + "type": "boolean" + }, + "wiki": { + "type": "boolean" + }, + "reviewable_id": { + "type": ["integer", "null"] + }, + "reviewable_score_count": { + "type": "integer" + }, + "reviewable_score_pending_count": { + "type": "integer" + }, + "post_url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "username", + "avatar_template", + "created_at", + "cooked", + "post_number", + "post_type", + "posts_count", + "updated_at", + "reply_count", + "reply_to_post_number", + "quote_count", + "incoming_link_count", + "reads", + "readers_count", + "score", + "yours", + "topic_id", + "topic_slug", + "display_username", + "primary_group_name", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "version", + "can_edit", + "can_delete", + "can_recover", + "can_see_hidden_post", + "can_wiki", + "user_title", + "reply_to_user", + "bookmarked", + "actions_summary", + "moderator", + "admin", + "staff", + "user_id", + "hidden", + "trust_level", + "deleted_at", + "user_deleted", + "edit_reason", + "can_view_edit_history", + "wiki", + "reviewable_id", + "reviewable_score_count", + "reviewable_score_pending_count", + "post_url" + ] + } + } + } + } + } + } + } + }, + "/posts/{id}/locked.json": { + "put": { + "summary": "Lock a post from being edited", + "tags": ["Posts"], + "operationId": "lockPost", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "post updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "locked": { + "type": "boolean" + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "locked": { + "type": "string" + } + }, + "required": ["locked"] + } + } + } + } + } + }, + "/post_actions.json": { + "post": { + "summary": "Like a post and other actions", + "tags": ["Posts"], + "operationId": "performPostAction", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "post updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "username": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_type": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "reply_count": { + "type": "integer" + }, + "reply_to_post_number": { + "type": ["string", "null"] + }, + "quote_count": { + "type": "integer" + }, + "incoming_link_count": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "readers_count": { + "type": "integer" + }, + "score": { + "type": "number" + }, + "yours": { + "type": "boolean" + }, + "topic_id": { + "type": "integer" + }, + "topic_slug": { + "type": "string" + }, + "display_username": { + "type": "string" + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "version": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_recover": { + "type": "boolean" + }, + "can_wiki": { + "type": "boolean" + }, + "user_title": { + "type": ["string", "null"] + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "count": { + "type": "integer" + }, + "acted": { + "type": "boolean" + }, + "can_undo": { + "type": "boolean" + } + } + } + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + }, + "user_id": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_deleted": { + "type": "boolean" + }, + "edit_reason": { + "type": ["string", "null"] + }, + "can_view_edit_history": { + "type": "boolean" + }, + "wiki": { + "type": "boolean" + }, + "notice": { + "type": "object" + }, + "notice_created_by_user": { + "type": ["object", "null"] + }, + "reviewable_id": { + "type": ["integer", "null"] + }, + "reviewable_score_count": { + "type": "integer" + }, + "reviewable_score_pending_count": { + "type": "integer" + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "post_action_type_id": { + "type": "integer" + }, + "flag_topic": { + "type": "boolean" + } + }, + "required": ["id", "post_action_type_id"] + } + } + } + } + } + }, + "/topics/private-messages/{username}.json": { + "get": { + "summary": "Get a list of private messages for a user", + "tags": ["Private Messages"], + "operationId": "listUserPrivateMessages", + "parameters": [ + { + "name": "username", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "private messages", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + } + } + }, + "primary_groups": { + "type": "array", + "items": {} + }, + "topic_list": { + "type": "object", + "properties": { + "can_create_topic": { + "type": "boolean" + }, + "draft": { + "type": ["string", "null"] + }, + "draft_key": { + "type": "string" + }, + "draft_sequence": { + "type": "integer" + }, + "per_page": { + "type": "integer" + }, + "topics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "posts_count": { + "type": "integer" + }, + "reply_count": { + "type": "integer" + }, + "highest_post_number": { + "type": "integer" + }, + "image_url": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "last_posted_at": { + "type": "string" + }, + "bumped": { + "type": "boolean" + }, + "bumped_at": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "unseen": { + "type": "boolean" + }, + "last_read_post_number": { + "type": "integer" + }, + "unread_posts": { + "type": "integer" + }, + "pinned": { + "type": "boolean" + }, + "unpinned": { + "type": ["string", "null"] + }, + "visible": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "notification_level": { + "type": "integer" + }, + "bookmarked": { + "type": "boolean" + }, + "liked": { + "type": "boolean" + }, + "views": { + "type": "integer" + }, + "like_count": { + "type": "integer" + }, + "has_summary": { + "type": "boolean" + }, + "last_poster_username": { + "type": "string" + }, + "category_id": { + "type": ["string", "null"] + }, + "pinned_globally": { + "type": "boolean" + }, + "featured_link": { + "type": ["string", "null"] + }, + "allowed_user_count": { + "type": "integer" + }, + "posters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "extras": { + "type": "string" + }, + "description": { + "type": "string" + }, + "user_id": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + } + } + } + }, + "participants": { + "type": "array", + "items": { + "type": "object", + "properties": { + "extras": { + "type": "string" + }, + "description": { + "type": ["string", "null"] + }, + "user_id": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/topics/private-messages-sent/{username}.json": { + "get": { + "summary": "Get a list of private messages sent for a user", + "tags": ["Private Messages"], + "operationId": "getUserSentPrivateMessages", + "parameters": [ + { + "name": "username", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "private messages", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "avatar_template": { + "type": "string" + } + } + } + }, + "primary_groups": { + "type": "array", + "items": {} + }, + "topic_list": { + "type": "object", + "properties": { + "can_create_topic": { + "type": "boolean" + }, + "draft": { + "type": ["string", "null"] + }, + "draft_key": { + "type": "string" + }, + "draft_sequence": { + "type": "integer" + }, + "per_page": { + "type": "integer" + }, + "topics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "posts_count": { + "type": "integer" + }, + "reply_count": { + "type": "integer" + }, + "highest_post_number": { + "type": "integer" + }, + "image_url": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "last_posted_at": { + "type": "string" + }, + "bumped": { + "type": "boolean" + }, + "bumped_at": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "unseen": { + "type": "boolean" + }, + "last_read_post_number": { + "type": "integer" + }, + "unread_posts": { + "type": "integer" + }, + "pinned": { + "type": "boolean" + }, + "unpinned": { + "type": ["string", "null"] + }, + "visible": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "notification_level": { + "type": "integer" + }, + "bookmarked": { + "type": "boolean" + }, + "liked": { + "type": "boolean" + }, + "views": { + "type": "integer" + }, + "like_count": { + "type": "integer" + }, + "has_summary": { + "type": "boolean" + }, + "last_poster_username": { + "type": "string" + }, + "category_id": { + "type": ["string", "null"] + }, + "pinned_globally": { + "type": "boolean" + }, + "featured_link": { + "type": ["string", "null"] + }, + "allowed_user_count": { + "type": "integer" + }, + "posters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "extras": { + "type": "string" + }, + "description": { + "type": "string" + }, + "user_id": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + } + } + } + }, + "participants": { + "type": "array", + "items": {} + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/search.json": { + "get": { + "summary": "Search for a term", + "tags": ["Search"], + "operationId": "search", + "parameters": [ + { + "name": "q", + "in": "query", + "example": "api @blake #support tags:api after:2021-06-04 in:unseen in:open\norder:latest_topic", + "description": "The query string needs to be url encoded and is made up of the following options:\n- Search term. This is just a string. Usually it would be the first item in the query.\n- `@`: Use the `@` followed by the username to specify posts by this user.\n- `#`: Use the `#` followed by the category slug to search within this category.\n- `tags:`: `api,solved` or for posts that have all the specified tags `api+solved`.\n- `before:`: `yyyy-mm-dd`\n- `after:`: `yyyy-mm-dd`\n- `order:`: `latest`, `likes`, `views`, `latest_topic`\n- `assigned:`: username (without `@`)\n- `in:`: `title`, `likes`, `personal`, `messages`, `seen`, `unseen`, `posted`, `created`, `watching`, `tracking`, `bookmarks`, `assigned`, `unassigned`, `first`, `pinned`, `wiki`\n- `with:`: `images`\n- `status:`: `open`, `closed`, `public`, `archived`, `noreplies`, `single_user`, `solved`, `unsolved`\n- `group:`: group_name or group_id\n- `group_messages:`: group_name or group_id\n- `min_posts:`: 1\n- `max_posts:`: 10\n- `min_views:`: 1\n- `max_views:`: 10\n\nIf you are using cURL you can use the `-G` and the `--data-urlencode` flags to encode the query:\n\n```\ncurl -i -sS -X GET -G \"http://localhost:4200/search.json\" \\\n--data-urlencode 'q=wordpress @scossar #fun after:2020-01-01'\n```\n", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "example": 1, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "posts": { + "type": "array", + "items": {} + }, + "users": { + "type": "array", + "items": {} + }, + "categories": { + "type": "array", + "items": {} + }, + "tags": { + "type": "array", + "items": {} + }, + "groups": { + "type": "array", + "items": {} + }, + "grouped_search_result": { + "type": "object", + "additionalProperties": false, + "properties": { + "more_posts": { + "type": ["string", "null"] + }, + "more_users": { + "type": ["string", "null"] + }, + "more_categories": { + "type": ["string", "null"] + }, + "term": { + "type": "string" + }, + "search_log_id": { + "type": "integer" + }, + "more_full_page_results": { + "type": ["string", "null"] + }, + "can_create_topic": { + "type": "boolean" + }, + "error": { + "type": ["string", "null"] + }, + "extra": { + "type": "object", + "properties": { + "categories": { + "type": ["array", "null"] + } + } + }, + "post_ids": { + "type": "array", + "items": {} + }, + "user_ids": { + "type": "array", + "items": {} + }, + "category_ids": { + "type": "array", + "items": {} + }, + "tag_ids": { + "type": "array", + "items": {} + }, + "group_ids": { + "type": "array", + "items": {} + } + }, + "required": [ + "more_posts", + "more_users", + "more_categories", + "term", + "search_log_id", + "more_full_page_results", + "can_create_topic", + "error", + "post_ids", + "user_ids", + "category_ids", + "tag_ids", + "group_ids" + ] + } + }, + "required": [ + "posts", + "users", + "categories", + "tags", + "groups", + "grouped_search_result" + ] + } + } + } + } + } + } + }, + "/site.json": { + "get": { + "summary": "Get site info", + "tags": ["Site", "Categories"], + "operationId": "getSite", + "description": "Can be used to fetch all categories and subcategories", + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "default_archetype": { + "type": "string" + }, + "notification_types": { + "type": "object", + "additionalProperties": false, + "properties": { + "mentioned": { + "type": "integer" + }, + "replied": { + "type": "integer" + }, + "quoted": { + "type": "integer" + }, + "edited": { + "type": "integer" + }, + "liked": { + "type": "integer" + }, + "private_message": { + "type": "integer" + }, + "invited_to_private_message": { + "type": "integer" + }, + "invitee_accepted": { + "type": "integer" + }, + "posted": { + "type": "integer" + }, + "watching_category_or_tag": { + "type": "integer" + }, + "new_features": { + "type": "integer" + }, + "admin_problems": { + "type": "integer" + }, + "moved_post": { + "type": "integer" + }, + "linked": { + "type": "integer" + }, + "granted_badge": { + "type": "integer" + }, + "invited_to_topic": { + "type": "integer" + }, + "custom": { + "type": "integer" + }, + "group_mentioned": { + "type": "integer" + }, + "group_message_summary": { + "type": "integer" + }, + "watching_first_post": { + "type": "integer" + }, + "topic_reminder": { + "type": "integer" + }, + "liked_consolidated": { + "type": "integer" + }, + "linked_consolidated": { + "type": "integer" + }, + "post_approved": { + "type": "integer" + }, + "code_review_commit_approved": { + "type": "integer" + }, + "membership_request_accepted": { + "type": "integer" + }, + "membership_request_consolidated": { + "type": "integer" + }, + "bookmark_reminder": { + "type": "integer" + }, + "reaction": { + "type": "integer" + }, + "votes_released": { + "type": "integer" + }, + "event_reminder": { + "type": "integer" + }, + "event_invitation": { + "type": "integer" + }, + "chat_mention": { + "type": "integer" + }, + "chat_message": { + "type": "integer" + }, + "chat_invitation": { + "type": "integer" + }, + "chat_group_mention": { + "type": "integer" + }, + "chat_quoted": { + "type": "integer" + }, + "chat_watched_thread": { + "type": "integer" + }, + "assigned": { + "type": "integer" + }, + "question_answer_user_commented": { + "type": "integer" + }, + "following": { + "type": "integer" + }, + "following_created_topic": { + "type": "integer" + }, + "following_replied": { + "type": "integer" + }, + "circles_activity": { + "type": "integer" + } + }, + "required": [ + "mentioned", + "replied", + "quoted", + "edited", + "liked", + "private_message", + "invited_to_private_message", + "invitee_accepted", + "posted", + "watching_category_or_tag", + "moved_post", + "linked", + "granted_badge", + "invited_to_topic", + "custom", + "group_mentioned", + "group_message_summary", + "watching_first_post", + "topic_reminder", + "liked_consolidated", + "linked_consolidated", + "post_approved", + "code_review_commit_approved", + "membership_request_accepted", + "membership_request_consolidated", + "bookmark_reminder", + "reaction", + "votes_released", + "event_reminder", + "event_invitation", + "chat_mention", + "chat_message", + "chat_invitation", + "chat_group_mention" + ] + }, + "post_types": { + "type": "object", + "additionalProperties": false, + "properties": { + "regular": { + "type": "integer" + }, + "moderator_action": { + "type": "integer" + }, + "small_action": { + "type": "integer" + }, + "whisper": { + "type": "integer" + } + }, + "required": [ + "regular", + "moderator_action", + "small_action", + "whisper" + ] + }, + "trust_levels": { + "type": "object", + "additionalProperties": false, + "properties": { + "newuser": { + "type": "integer" + }, + "basic": { + "type": "integer" + }, + "member": { + "type": "integer" + }, + "regular": { + "type": "integer" + }, + "leader": { + "type": "integer" + } + }, + "required": [ + "newuser", + "basic", + "member", + "regular", + "leader" + ] + }, + "user_tips": { + "type": "object", + "additionalProperties": false, + "properties": { + "first_notification": { + "type": "integer" + }, + "topic_timeline": { + "type": "integer" + }, + "post_menu": { + "type": "integer" + }, + "topic_notification_levels": { + "type": "integer" + }, + "suggested_topics": { + "type": "integer" + } + }, + "required": [ + "first_notification", + "topic_timeline", + "post_menu", + "topic_notification_levels", + "suggested_topics" + ] + }, + "groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + } + }, + "required": [ + "id", + "name", + "flair_url", + "flair_bg_color", + "flair_color" + ] + } + }, + "filters": { + "type": "array", + "items": {} + }, + "periods": { + "type": "array", + "items": {} + }, + "top_menu_items": { + "type": "array", + "items": {} + }, + "anonymous_top_menu_items": { + "type": "array", + "items": {} + }, + "uncategorized_category_id": { + "type": "integer" + }, + "user_field_max_length": { + "type": "integer" + }, + "post_action_types": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": ["integer", "null"] + }, + "name_key": { + "type": ["string", "null"] + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "short_description": { + "type": "string" + }, + "is_flag": { + "type": "boolean" + }, + "require_message": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "applies_to": { + "type": "array" + }, + "is_used": { + "type": "boolean" + }, + "position": { + "type": "integer" + }, + "auto_action_type": { + "type": "boolean" + } + }, + "required": [ + "id", + "name_key", + "name", + "description", + "short_description", + "is_flag", + "require_message", + "enabled", + "applies_to", + "is_used", + "auto_action_type" + ] + } + }, + "topic_flag_types": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": ["integer", "null"] + }, + "name_key": { + "type": ["string", "null"] + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "short_description": { + "type": "string" + }, + "is_flag": { + "type": "boolean" + }, + "require_message": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "applies_to": { + "type": "array" + }, + "is_used": { + "type": "boolean" + }, + "position": { + "type": "integer" + }, + "auto_action_type": { + "type": "boolean" + } + }, + "required": [ + "id", + "name_key", + "name", + "description", + "short_description", + "is_flag", + "require_message", + "enabled", + "applies_to", + "is_used", + "auto_action_type" + ] + } + }, + "can_create_tag": { + "type": "boolean" + }, + "can_tag_topics": { + "type": "boolean" + }, + "can_tag_pms": { + "type": "boolean" + }, + "tags_filter_regexp": { + "type": "string" + }, + "top_tags": { + "type": "array", + "items": {} + }, + "wizard_required": { + "type": "boolean" + }, + "can_associate_groups": { + "type": "boolean" + }, + "topic_featured_link_allowed_category_ids": { + "type": "array", + "items": {} + }, + "user_themes": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "theme_id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "default": { + "type": "boolean" + }, + "color_scheme_id": { + "type": ["integer", "null"] + } + }, + "required": [ + "theme_id", + "name", + "default", + "color_scheme_id" + ] + } + }, + "user_color_schemes": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "is_dark": { + "type": "boolean" + } + }, + "required": ["id", "name", "is_dark"] + } + }, + "default_dark_color_scheme": { + "type": ["object", "null"] + }, + "censored_regexp": { + "type": "array", + "items": { + "type": "object" + } + }, + "custom_emoji_translation": { + "type": "object", + "additionalProperties": false, + "properties": {} + }, + "watched_words_replace": { + "type": ["string", "null"] + }, + "watched_words_link": { + "type": ["string", "null"] + }, + "markdown_additional_options": { + "type": "object" + }, + "hashtag_configurations": { + "type": "object" + }, + "hashtag_icons": { + "type": "object" + }, + "displayed_about_plugin_stat_groups": { + "type": "array" + }, + "categories": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "color": { + "type": "string" + }, + "text_color": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "topic_count": { + "type": "integer" + }, + "post_count": { + "type": "integer" + }, + "position": { + "type": "integer" + }, + "description": { + "type": ["string", "null"] + }, + "description_text": { + "type": ["string", "null"] + }, + "description_excerpt": { + "type": ["string", "null"] + }, + "topic_url": { + "type": "string" + }, + "read_restricted": { + "type": "boolean" + }, + "permission": { + "type": "integer" + }, + "notification_level": { + "type": "integer" + }, + "topic_template": { + "type": ["string", "null"] + }, + "has_children": { + "type": "boolean" + }, + "subcategory_count": { + "type": ["integer", "null"] + }, + "sort_order": { + "type": ["string", "null"] + }, + "sort_ascending": { + "type": ["string", "null"] + }, + "show_subcategory_list": { + "type": "boolean" + }, + "num_featured_topics": { + "type": "integer" + }, + "default_view": { + "type": ["string", "null"] + }, + "subcategory_list_style": { + "type": "string" + }, + "default_top_period": { + "type": "string" + }, + "default_list_filter": { + "type": "string" + }, + "minimum_required_tags": { + "type": "integer" + }, + "navigate_to_first_post_after_read": { + "type": "boolean" + }, + "allowed_tags": { + "type": "array", + "items": {} + }, + "allowed_tag_groups": { + "type": "array", + "items": {} + }, + "allow_global_tags": { + "type": "boolean" + }, + "required_tag_groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "min_count": { + "type": "integer" + } + }, + "required": ["name", "min_count"] + } + }, + "read_only_banner": { + "type": ["string", "null"] + }, + "uploaded_logo": { + "type": ["string", "null"] + }, + "uploaded_logo_dark": { + "type": ["string", "null"] + }, + "uploaded_background": { + "type": ["string", "null"] + }, + "uploaded_background_dark": { + "type": ["string", "null"] + }, + "can_edit": { + "type": "boolean" + }, + "custom_fields": { + "type": ["object", "null"], + "additionalProperties": true + }, + "parent_category_id": { + "type": "integer" + }, + "form_template_ids": { + "type": "array", + "items": {} + } + }, + "required": [ + "id", + "name", + "color", + "text_color", + "slug", + "topic_count", + "post_count", + "position", + "topic_url", + "read_restricted", + "permission", + "notification_level", + "topic_template", + "has_children", + "subcategory_count", + "sort_order", + "sort_ascending", + "show_subcategory_list", + "num_featured_topics", + "default_view", + "subcategory_list_style", + "default_top_period", + "default_list_filter", + "minimum_required_tags", + "navigate_to_first_post_after_read", + "allowed_tags", + "allowed_tag_groups", + "allow_global_tags", + "required_tag_groups", + "read_only_banner", + "uploaded_logo", + "uploaded_logo_dark", + "uploaded_background", + "uploaded_background_dark", + "can_edit" + ] + } + }, + "archetypes": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "options": { + "type": "array", + "items": {} + } + }, + "required": ["id", "name", "options"] + } + }, + "user_fields": { + "type": "array", + "items": {} + }, + "auth_providers": { + "type": "array", + "items": {} + }, + "whispers_allowed_groups_names": { + "type": "array" + }, + "denied_emojis": { + "type": "array" + }, + "valid_flag_applies_to_types": { + "type": "array" + }, + "navigation_menu_site_top_tags": { + "type": "array" + }, + "full_name_required_for_signup": { + "type": "boolean" + }, + "full_name_visible_in_signup": { + "type": "boolean" + } + }, + "required": [ + "default_archetype", + "notification_types", + "post_types", + "trust_levels", + "groups", + "filters", + "periods", + "top_menu_items", + "anonymous_top_menu_items", + "uncategorized_category_id", + "user_field_max_length", + "post_action_types", + "topic_flag_types", + "can_create_tag", + "can_tag_topics", + "can_tag_pms", + "tags_filter_regexp", + "top_tags", + "topic_featured_link_allowed_category_ids", + "user_themes", + "user_color_schemes", + "default_dark_color_scheme", + "censored_regexp", + "custom_emoji_translation", + "watched_words_replace", + "watched_words_link", + "categories", + "archetypes", + "user_fields", + "auth_providers", + "full_name_required_for_signup", + "full_name_visible_in_signup" + ] + } + } + } + } + } + } + }, + "/site/basic-info.json": { + "get": { + "summary": "Get site basic info", + "tags": ["Site"], + "operationId": "getSiteBasicInfo", + "description": "Can be used to fetch basic info about a site", + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "logo_url": { + "type": "string" + }, + "logo_small_url": { + "type": "string" + }, + "apple_touch_icon_url": { + "type": "string" + }, + "favicon_url": { + "type": "string" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "header_primary_color": { + "type": "string" + }, + "header_background_color": { + "type": "string" + }, + "login_required": { + "type": "boolean" + }, + "locale": { + "type": "string" + }, + "include_in_discourse_discover": { + "type": "boolean" + }, + "mobile_logo_url": { + "type": "string" + } + }, + "required": [ + "logo_url", + "logo_small_url", + "apple_touch_icon_url", + "favicon_url", + "title", + "description", + "header_primary_color", + "header_background_color", + "login_required", + "locale", + "include_in_discourse_discover", + "mobile_logo_url" + ] + } + } + } + } + } + } + }, + "/tag_groups.json": { + "get": { + "summary": "Get a list of tag groups", + "tags": ["Tags"], + "operationId": "listTagGroups", + "responses": { + "200": { + "description": "tags", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "tag_groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "tag_names": { + "type": "array", + "items": {} + }, + "parent_tag_name": { + "type": "array", + "items": {} + }, + "one_per_topic": { + "type": "boolean" + }, + "permissions": { + "type": "object", + "properties": { + "staff": { + "type": "integer" + } + } + } + } + } + } + } + } + } + } + } + } + }, + "post": { + "summary": "Creates a tag group", + "tags": ["Tags"], + "operationId": "createTagGroup", + "parameters": [], + "responses": { + "200": { + "description": "tag group created", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "tag_group": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "tag_names": { + "type": "array", + "items": {} + }, + "parent_tag_name": { + "type": "array", + "items": {} + }, + "one_per_topic": { + "type": "boolean" + }, + "permissions": { + "type": "object" + } + }, + "required": [ + "id", + "name", + "tag_names", + "parent_tag_name", + "one_per_topic", + "permissions" + ] + } + }, + "required": ["tag_group"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + } + }, + "required": ["name"] + } + } + } + } + } + }, + "/tag_groups/{id}.json": { + "get": { + "summary": "Get a single tag group", + "tags": ["Tags"], + "operationId": "getTagGroup", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "notifications", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "tag_group": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "tag_names": { + "type": "array", + "items": {} + }, + "parent_tag_name": { + "type": "array", + "items": {} + }, + "one_per_topic": { + "type": "boolean" + }, + "permissions": { + "type": "object", + "properties": { + "everyone": { + "type": "integer" + } + } + } + } + } + } + } + } + } + } + } + }, + "put": { + "summary": "Update tag group", + "tags": ["Tags"], + "operationId": "updateTagGroup", + "parameters": [ + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Tag group updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string" + }, + "tag_group": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "tag_names": { + "type": "array", + "items": {} + }, + "parent_tag_name": { + "type": "array", + "items": {} + }, + "one_per_topic": { + "type": "boolean" + }, + "permissions": { + "type": "object", + "properties": { + "everyone": { + "type": "integer" + } + } + } + } + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + } + } + } + } + } + } + }, + "/tags.json": { + "get": { + "summary": "Get a list of tags", + "tags": ["Tags"], + "operationId": "listTags", + "responses": { + "200": { + "description": "notifications", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "tags": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "text": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "pm_count": { + "type": "integer" + }, + "target_tag": { + "type": ["string", "null"] + } + } + } + }, + "extras": { + "type": "object", + "properties": { + "categories": { + "type": "array", + "items": {} + } + } + } + } + } + } + } + } + } + } + }, + "/tag/{name}.json": { + "get": { + "summary": "Get a specific tag", + "tags": ["Tags"], + "operationId": "getTag", + "parameters": [ + { + "name": "name", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "notifications", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "avatar_template": { + "type": "string" + } + } + } + }, + "primary_groups": { + "type": "array", + "items": {} + }, + "topic_list": { + "type": "object", + "properties": { + "can_create_topic": { + "type": "boolean" + }, + "draft": { + "type": ["string", "null"] + }, + "draft_key": { + "type": "string" + }, + "draft_sequence": { + "type": "integer" + }, + "per_page": { + "type": "integer" + }, + "tags": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "topic_count": { + "type": "integer" + }, + "staff": { + "type": "boolean" + } + } + } + }, + "topics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "posts_count": { + "type": "integer" + }, + "reply_count": { + "type": "integer" + }, + "highest_post_number": { + "type": "integer" + }, + "image_url": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "last_posted_at": { + "type": "string" + }, + "bumped": { + "type": "boolean" + }, + "bumped_at": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "unseen": { + "type": "boolean" + }, + "last_read_post_number": { + "type": "integer" + }, + "unread_posts": { + "type": "integer" + }, + "pinned": { + "type": "boolean" + }, + "unpinned": { + "type": ["string", "null"] + }, + "visible": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "notification_level": { + "type": "integer" + }, + "bookmarked": { + "type": "boolean" + }, + "liked": { + "type": "boolean" + }, + "tags": { + "type": "array", + "items": {} + }, + "views": { + "type": "integer" + }, + "like_count": { + "type": "integer" + }, + "has_summary": { + "type": "boolean" + }, + "last_poster_username": { + "type": "string" + }, + "category_id": { + "type": "integer" + }, + "pinned_globally": { + "type": "boolean" + }, + "featured_link": { + "type": ["string", "null"] + }, + "posters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "extras": { + "type": "string" + }, + "description": { + "type": "string" + }, + "user_id": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/t/{id}/posts.json": { + "get": { + "summary": "Get specific posts from a topic", + "tags": ["Topics"], + "operationId": "getSpecificPostsFromTopic", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "specific posts", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "post_stream": { + "type": "object", + "properties": { + "posts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": ["string", "null"] + }, + "username": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_type": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "reply_count": { + "type": "integer" + }, + "reply_to_post_number": { + "type": ["string", "null"] + }, + "quote_count": { + "type": "integer" + }, + "incoming_link_count": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "readers_count": { + "type": "integer" + }, + "score": { + "type": "number" + }, + "yours": { + "type": "boolean" + }, + "topic_id": { + "type": "integer" + }, + "topic_slug": { + "type": "string" + }, + "display_username": { + "type": ["string", "null"] + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "version": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_recover": { + "type": "boolean" + }, + "can_wiki": { + "type": "boolean" + }, + "read": { + "type": "boolean" + }, + "user_title": { + "type": ["string", "null"] + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "can_act": { + "type": "boolean" + } + } + } + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + }, + "user_id": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_deleted": { + "type": "boolean" + }, + "edit_reason": { + "type": ["string", "null"] + }, + "can_view_edit_history": { + "type": "boolean" + }, + "wiki": { + "type": "boolean" + }, + "reviewable_id": { + "type": "integer" + }, + "reviewable_score_count": { + "type": "integer" + }, + "reviewable_score_pending_count": { + "type": "integer" + } + } + } + } + } + }, + "id": { + "type": "integer" + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "post_ids[]": { + "type": "integer" + } + }, + "required": ["post_ids[]"] + } + } + } + } + } + }, + "/t/{id}.json": { + "get": { + "summary": "Get a single topic", + "tags": ["Topics"], + "operationId": "getTopic", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "specific posts", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "post_stream": { + "type": "object", + "additionalProperties": false, + "properties": { + "posts": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "username": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_type": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "reply_count": { + "type": "integer" + }, + "reply_to_post_number": { + "type": ["string", "null"] + }, + "quote_count": { + "type": "integer" + }, + "incoming_link_count": { + "type": "integer" + }, + "reads": { + "type": "integer" + }, + "readers_count": { + "type": "integer" + }, + "score": { + "type": "number" + }, + "yours": { + "type": "boolean" + }, + "topic_id": { + "type": "integer" + }, + "topic_slug": { + "type": "string" + }, + "display_username": { + "type": "string" + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "version": { + "type": "integer" + }, + "can_edit": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_recover": { + "type": "boolean" + }, + "can_see_hidden_post": { + "type": "boolean" + }, + "can_wiki": { + "type": "boolean" + }, + "link_counts": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "url": { + "type": "string" + }, + "internal": { + "type": "boolean" + }, + "reflection": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "clicks": { + "type": "integer" + } + }, + "required": [ + "url", + "internal", + "reflection", + "title", + "clicks" + ] + } + }, + "read": { + "type": "boolean" + }, + "user_title": { + "type": ["string", "null"] + }, + "bookmarked": { + "type": "boolean" + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "can_act": { + "type": "boolean" + } + }, + "required": ["id", "can_act"] + } + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + }, + "user_id": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_deleted": { + "type": "boolean" + }, + "edit_reason": { + "type": ["string", "null"] + }, + "can_view_edit_history": { + "type": "boolean" + }, + "wiki": { + "type": "boolean" + }, + "reviewable_id": { + "type": "integer" + }, + "reviewable_score_count": { + "type": "integer" + }, + "reviewable_score_pending_count": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "username", + "avatar_template", + "created_at", + "cooked", + "post_number", + "post_type", + "updated_at", + "reply_count", + "reply_to_post_number", + "quote_count", + "incoming_link_count", + "reads", + "readers_count", + "score", + "yours", + "topic_id", + "topic_slug", + "display_username", + "primary_group_name", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "version", + "can_edit", + "can_delete", + "can_recover", + "can_wiki", + "link_counts", + "read", + "user_title", + "bookmarked", + "actions_summary", + "moderator", + "admin", + "staff", + "user_id", + "hidden", + "trust_level", + "deleted_at", + "user_deleted", + "edit_reason", + "can_view_edit_history", + "wiki", + "reviewable_id", + "reviewable_score_count", + "reviewable_score_pending_count" + ] + } + }, + "stream": { + "type": "array", + "items": {} + } + }, + "required": ["posts", "stream"] + }, + "timeline_lookup": { + "type": "array", + "items": {} + }, + "suggested_topics": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "posts_count": { + "type": "integer" + }, + "reply_count": { + "type": "integer" + }, + "highest_post_number": { + "type": "integer" + }, + "image_url": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "last_posted_at": { + "type": ["string", "null"] + }, + "bumped": { + "type": "boolean" + }, + "bumped_at": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "unseen": { + "type": "boolean" + }, + "pinned": { + "type": "boolean" + }, + "unpinned": { + "type": ["string", "null"] + }, + "excerpt": { + "type": "string" + }, + "visible": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "bookmarked": { + "type": ["string", "null"] + }, + "liked": { + "type": ["string", "null"] + }, + "tags": { + "type": "array", + "items": {} + }, + "tags_descriptions": { + "type": "object", + "additionalProperties": false, + "properties": {} + }, + "like_count": { + "type": "integer" + }, + "views": { + "type": "integer" + }, + "category_id": { + "type": "integer" + }, + "featured_link": { + "type": ["string", "null"] + }, + "posters": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "extras": { + "type": "string" + }, + "description": { + "type": "string" + }, + "user": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template" + ] + } + }, + "required": ["extras", "description", "user"] + } + } + }, + "required": [ + "id", + "title", + "fancy_title", + "slug", + "posts_count", + "reply_count", + "highest_post_number", + "image_url", + "created_at", + "last_posted_at", + "bumped", + "bumped_at", + "archetype", + "unseen", + "pinned", + "unpinned", + "excerpt", + "visible", + "closed", + "archived", + "bookmarked", + "liked", + "tags", + "tags_descriptions", + "like_count", + "views", + "category_id", + "featured_link", + "posters" + ] + } + }, + "tags": { + "type": "array", + "items": {} + }, + "tags_descriptions": { + "type": "object", + "additionalProperties": false, + "properties": {} + }, + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "posts_count": { + "type": "integer" + }, + "created_at": { + "type": "string" + }, + "views": { + "type": "integer" + }, + "reply_count": { + "type": "integer" + }, + "like_count": { + "type": "integer" + }, + "last_posted_at": { + "type": ["string", "null"] + }, + "visible": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "has_summary": { + "type": "boolean" + }, + "archetype": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "category_id": { + "type": "integer" + }, + "word_count": { + "type": ["integer", "null"] + }, + "deleted_at": { + "type": ["string", "null"] + }, + "user_id": { + "type": "integer" + }, + "featured_link": { + "type": ["string", "null"] + }, + "pinned_globally": { + "type": "boolean" + }, + "pinned_at": { + "type": ["string", "null"] + }, + "pinned_until": { + "type": ["string", "null"] + }, + "image_url": { + "type": ["string", "null"] + }, + "slow_mode_seconds": { + "type": "integer" + }, + "draft": { + "type": ["string", "null"] + }, + "draft_key": { + "type": "string" + }, + "draft_sequence": { + "type": "integer" + }, + "unpinned": { + "type": ["string", "null"] + }, + "pinned": { + "type": "boolean" + }, + "current_post_number": { + "type": "integer" + }, + "highest_post_number": { + "type": ["integer", "null"] + }, + "deleted_by": { + "type": ["string", "null"] + }, + "has_deleted": { + "type": "boolean" + }, + "actions_summary": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "count": { + "type": "integer" + }, + "hidden": { + "type": "boolean" + }, + "can_act": { + "type": "boolean" + } + }, + "required": ["id", "count", "hidden", "can_act"] + } + }, + "chunk_size": { + "type": "integer" + }, + "bookmarked": { + "type": "boolean" + }, + "bookmarks": { + "type": "array", + "items": {} + }, + "topic_timer": { + "type": ["string", "null"] + }, + "message_bus_last_id": { + "type": "integer" + }, + "participant_count": { + "type": "integer" + }, + "show_read_indicator": { + "type": "boolean" + }, + "thumbnails": { + "type": ["string", "null"] + }, + "slow_mode_enabled_until": { + "type": ["string", "null"] + }, + "details": { + "type": "object", + "additionalProperties": false, + "properties": { + "can_edit": { + "type": "boolean" + }, + "notification_level": { + "type": "integer" + }, + "can_move_posts": { + "type": "boolean" + }, + "can_delete": { + "type": "boolean" + }, + "can_remove_allowed_users": { + "type": "boolean" + }, + "can_create_post": { + "type": "boolean" + }, + "can_reply_as_new_topic": { + "type": "boolean" + }, + "can_invite_to": { + "type": "boolean" + }, + "can_invite_via_email": { + "type": "boolean" + }, + "can_flag_topic": { + "type": "boolean" + }, + "can_convert_topic": { + "type": "boolean" + }, + "can_review_topic": { + "type": "boolean" + }, + "can_close_topic": { + "type": "boolean" + }, + "can_archive_topic": { + "type": "boolean" + }, + "can_split_merge_topic": { + "type": "boolean" + }, + "can_edit_staff_notes": { + "type": "boolean" + }, + "can_toggle_topic_visibility": { + "type": "boolean" + }, + "can_pin_unpin_topic": { + "type": "boolean" + }, + "can_moderate_category": { + "type": "boolean" + }, + "can_remove_self_id": { + "type": "integer" + }, + "participants": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "post_count": { + "type": "integer" + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "admin": { + "type": "boolean" + }, + "moderator": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "post_count", + "primary_group_name", + "flair_name", + "flair_url", + "flair_color", + "flair_bg_color", + "admin", + "moderator", + "trust_level" + ] + } + }, + "created_by": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template" + ] + }, + "last_poster": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template" + ] + } + }, + "required": [ + "can_edit", + "notification_level", + "can_move_posts", + "can_delete", + "can_remove_allowed_users", + "can_create_post", + "can_reply_as_new_topic", + "can_convert_topic", + "can_review_topic", + "can_close_topic", + "can_archive_topic", + "can_split_merge_topic", + "can_edit_staff_notes", + "can_toggle_topic_visibility", + "can_pin_unpin_topic", + "can_moderate_category", + "can_remove_self_id", + "created_by", + "last_poster" + ] + } + }, + "required": [ + "post_stream", + "timeline_lookup", + "suggested_topics", + "tags", + "tags_descriptions", + "id", + "title", + "fancy_title", + "posts_count", + "created_at", + "views", + "reply_count", + "like_count", + "last_posted_at", + "visible", + "closed", + "archived", + "has_summary", + "archetype", + "slug", + "category_id", + "word_count", + "deleted_at", + "user_id", + "featured_link", + "pinned_globally", + "pinned_at", + "pinned_until", + "image_url", + "slow_mode_seconds", + "draft", + "draft_key", + "draft_sequence", + "unpinned", + "pinned", + "highest_post_number", + "deleted_by", + "has_deleted", + "actions_summary", + "chunk_size", + "bookmarked", + "bookmarks", + "topic_timer", + "message_bus_last_id", + "participant_count", + "show_read_indicator", + "thumbnails", + "slow_mode_enabled_until", + "details" + ] + } + } + } + } + } + }, + "delete": { + "summary": "Remove a topic", + "tags": ["Topics"], + "operationId": "removeTopic", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "specific posts" + } + } + } + }, + "/t/-/{id}.json": { + "put": { + "summary": "Update a topic", + "tags": ["Topics"], + "operationId": "updateTopic", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "topic updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "basic_topic": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "posts_count": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "topic": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "category_id": { + "type": "integer" + } + } + } + } + } + } + } + } + } + }, + "/t/{id}/invite.json": { + "post": { + "summary": "Invite to topic", + "tags": ["Topics", "Invites"], + "operationId": "inviteToTopic", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "topic updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "user": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "user": { + "type": "string" + }, + "email": { + "type": "string" + } + } + } + } + } + } + } + }, + "/t/{id}/invite-group.json": { + "post": { + "summary": "Invite group to topic", + "tags": ["Topics", "Invites"], + "operationId": "inviteGroupToTopic", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "invites to a PM", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "group": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "group": { + "type": "string", + "description": "The name of the group to invite" + }, + "should_notify": { + "type": "boolean", + "description": "Whether to notify the group, it defaults to true" + } + } + } + } + } + } + } + }, + "/t/{id}/bookmark.json": { + "put": { + "summary": "Bookmark topic", + "tags": ["Topics"], + "operationId": "bookmarkTopic", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "topic updated" + } + } + } + }, + "/t/{id}/status.json": { + "put": { + "summary": "Update the status of a topic", + "tags": ["Topics"], + "operationId": "updateTopicStatus", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "topic updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "example": "OK" + }, + "topic_status_update": { + "type": ["string", "null"] + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "closed", + "pinned", + "pinned_globally", + "archived", + "visible" + ] + }, + "enabled": { + "type": "string", + "enum": ["true", "false"] + }, + "until": { + "type": "string", + "description": "Only required for `pinned` and `pinned_globally`", + "example": "2030-12-31" + } + }, + "required": ["status", "enabled"] + } + } + } + } + } + }, + "/latest.json": { + "get": { + "summary": "Get the latest topics", + "tags": ["Topics"], + "operationId": "listLatestTopics", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "order", + "in": "query", + "description": "Enum: `default`, `created`, `activity`, `views`, `posts`, `category`,\n`likes`, `op_likes`, `posters`", + "schema": { + "type": "string" + } + }, + { + "name": "ascending", + "in": "query", + "description": "Defaults to `desc`, add `ascending=true` to sort asc", + "schema": { + "type": "string" + } + }, + { + "name": "per_page", + "in": "query", + "description": "Maximum number of topics returned, between 1-100", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "topic updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "avatar_template": { + "type": "string" + } + } + } + }, + "primary_groups": { + "type": "array", + "items": {} + }, + "topic_list": { + "type": "object", + "properties": { + "can_create_topic": { + "type": "boolean" + }, + "draft": { + "type": ["string", "null"] + }, + "draft_key": { + "type": "string" + }, + "draft_sequence": { + "type": "integer" + }, + "per_page": { + "type": "integer" + }, + "topics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "posts_count": { + "type": "integer" + }, + "reply_count": { + "type": "integer" + }, + "highest_post_number": { + "type": "integer" + }, + "image_url": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "last_posted_at": { + "type": "string" + }, + "bumped": { + "type": "boolean" + }, + "bumped_at": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "unseen": { + "type": "boolean" + }, + "last_read_post_number": { + "type": "integer" + }, + "unread_posts": { + "type": "integer" + }, + "pinned": { + "type": "boolean" + }, + "unpinned": { + "type": ["string", "null"] + }, + "visible": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "notification_level": { + "type": "integer" + }, + "bookmarked": { + "type": "boolean" + }, + "liked": { + "type": "boolean" + }, + "views": { + "type": "integer" + }, + "like_count": { + "type": "integer" + }, + "has_summary": { + "type": "boolean" + }, + "last_poster_username": { + "type": "string" + }, + "category_id": { + "type": "integer" + }, + "op_like_count": { + "type": "integer" + }, + "pinned_globally": { + "type": "boolean" + }, + "featured_link": { + "type": ["string", "null"] + }, + "posters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "extras": { + "type": "string" + }, + "description": { + "type": "string" + }, + "user_id": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/top.json": { + "get": { + "summary": "Get the top topics filtered by period", + "tags": ["Topics"], + "operationId": "listTopTopics", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "period", + "in": "query", + "description": "Enum: `all`, `yearly`, `quarterly`, `monthly`, `weekly`, `daily`", + "schema": { + "type": "string" + } + }, + { + "name": "per_page", + "in": "query", + "description": "Maximum number of topics returned, between 1-100", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + } + } + }, + "primary_groups": { + "type": "array", + "items": {} + }, + "topic_list": { + "type": "object", + "properties": { + "can_create_topic": { + "type": "boolean" + }, + "draft": { + "type": ["string", "null"] + }, + "draft_key": { + "type": "string" + }, + "draft_sequence": { + "type": "integer" + }, + "for_period": { + "type": "string" + }, + "per_page": { + "type": "integer" + }, + "topics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "fancy_title": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "posts_count": { + "type": "integer" + }, + "reply_count": { + "type": "integer" + }, + "highest_post_number": { + "type": "integer" + }, + "image_url": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "last_posted_at": { + "type": "string" + }, + "bumped": { + "type": "boolean" + }, + "bumped_at": { + "type": "string" + }, + "archetype": { + "type": "string" + }, + "unseen": { + "type": "boolean" + }, + "last_read_post_number": { + "type": "integer" + }, + "unread_posts": { + "type": "integer" + }, + "pinned": { + "type": "boolean" + }, + "unpinned": { + "type": "boolean" + }, + "visible": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + }, + "notification_level": { + "type": "integer" + }, + "bookmarked": { + "type": "boolean" + }, + "liked": { + "type": "boolean" + }, + "views": { + "type": "integer" + }, + "like_count": { + "type": "integer" + }, + "has_summary": { + "type": "boolean" + }, + "last_poster_username": { + "type": "string" + }, + "category_id": { + "type": "integer" + }, + "op_like_count": { + "type": "integer" + }, + "pinned_globally": { + "type": "boolean" + }, + "featured_link": { + "type": ["string", "null"] + }, + "posters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "extras": { + "type": ["string", "null"] + }, + "description": { + "type": "string" + }, + "user_id": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/t/{id}/notifications.json": { + "post": { + "summary": "Set notification level", + "tags": ["Topics"], + "operationId": "setNotificationLevel", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "topic updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "example": "OK" + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "notification_level": { + "type": "string", + "enum": ["0", "1", "2", "3"] + } + }, + "required": ["notification_level"] + } + } + } + } + } + }, + "/t/{id}/change-timestamp.json": { + "put": { + "summary": "Update topic timestamp", + "tags": ["Topics"], + "operationId": "updateTopicTimestamp", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "topic updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "example": "OK" + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "example": "1594291380" + } + }, + "required": ["timestamp"] + } + } + } + } + } + }, + "/t/{id}/timer.json": { + "post": { + "summary": "Create topic timer", + "tags": ["Topics"], + "operationId": "createTopicTimer", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "id", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "topic updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string", + "example": "OK" + }, + "execute_at": { + "type": "string" + }, + "duration": { + "type": ["string", "null"] + }, + "based_on_last_post": { + "type": "boolean" + }, + "closed": { + "type": "boolean" + }, + "category_id": { + "type": ["integer", "null"] + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "time": { + "type": "string", + "example": "" + }, + "status_type": { + "type": "string" + }, + "based_on_last_post": { + "type": "boolean" + }, + "category_id": { + "type": "integer" + } + } + } + } + } + } + } + }, + "/t/external_id/{external_id}.json": { + "get": { + "summary": "Get topic by external_id", + "tags": ["Topics"], + "operationId": "getTopicByExternalId", + "parameters": [ + { + "name": "external_id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "301": { + "description": "redirects to /t/{topic_id}.json" + } + } + } + }, + "/uploads.json": { + "post": { + "summary": "Creates an upload", + "tags": ["Uploads"], + "operationId": "createUpload", + "parameters": [], + "responses": { + "200": { + "description": "file uploaded", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "url": { + "type": "string" + }, + "original_filename": { + "type": "string" + }, + "filesize": { + "type": "integer" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "thumbnail_width": { + "type": "integer" + }, + "thumbnail_height": { + "type": "integer" + }, + "extension": { + "type": "string" + }, + "short_url": { + "type": "string" + }, + "short_path": { + "type": "string" + }, + "retain_hours": { + "type": ["string", "null"] + }, + "human_filesize": { + "type": "string" + }, + "dominant_color": { + "type": ["string", "null"] + }, + "thumbnail": { + "type": ["object", "null"], + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "upload_id": { + "type": "integer" + }, + "url": { + "type": "string" + }, + "extension": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "filesize": { + "type": "integer" + } + } + } + }, + "required": [ + "id", + "url", + "original_filename", + "filesize", + "width", + "height", + "thumbnail_width", + "thumbnail_height", + "extension", + "short_url", + "short_path", + "retain_hours", + "human_filesize" + ] + } + } + } + } + }, + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "avatar", + "profile_background", + "card_background", + "custom_emoji", + "composer" + ] + }, + "user_id": { + "type": "integer", + "description": "required if uploading an avatar" + }, + "synchronous": { + "type": "boolean", + "description": "Use this flag to return an id and url" + }, + "file": { + "type": "string", + "format": "binary" + } + }, + "required": ["type"] + } + } + } + } + } + }, + "/uploads/generate-presigned-put.json": { + "post": { + "summary": "Initiates a direct external upload", + "tags": ["Uploads"], + "operationId": "generatePresignedPut", + "description": "Direct external uploads bypass the usual method of creating uploads\nvia the POST /uploads route, and upload directly to an external provider,\nwhich by default is S3. This route begins the process, and will return\na unique identifier for the external upload as well as a presigned URL\nwhich is where the file binary blob should be uploaded to.\n\nOnce the upload is complete to the external service, you must call the\nPOST /complete-external-upload route using the unique identifier returned\nby this route, which will create any required Upload record in the Discourse\ndatabase and also move file from its temporary location to the final\ndestination in the external storage service.\n\nYou must have the correct permissions and CORS settings configured in your\nexternal provider. We support AWS S3 as the default. See:\n\nhttps://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4.\n\nAn external file store must be set up and `enable_direct_s3_uploads` must\nbe set to true for this endpoint to function.\n\n", + "parameters": [], + "responses": { + "200": { + "description": "external upload initialized", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "key": { + "type": "string", + "description": "The path of the temporary file on the external storage\nservice.", + "example": "temp/site/uploads/default/12345/67890.jpg" + }, + "url": { + "type": "string", + "description": "A presigned PUT URL which must be used to upload\nthe file binary blob to.", + "example": "https://file-uploads.s3.us-west-2.amazonaws.com/temp/site/uploads/default/123/456.jpg?x-amz-acl=private&x-amz-meta-sha1-checksum=sha1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AAAAus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20211221T011246Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=12345678" + }, + "signed_headers": { + "type": "object", + "description": "A map of headers that must be sent with the PUT request.", + "example": { + "x-amz-acl": "private", + "x-amz-meta-sha1-checksum": "sha1" + } + }, + "unique_identifier": { + "type": "string", + "description": "A unique string that identifies the external upload.\nThis must be stored and then sent in the /complete-external-upload\nendpoint to complete the direct upload.", + "example": "66e86218-80d9-4bda-b4d5-2b6def968705" + } + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "avatar", + "profile_background", + "card_background", + "custom_emoji", + "composer" + ] + }, + "file_name": { + "type": "string", + "example": "IMG_2021.jpeg" + }, + "file_size": { + "type": "integer", + "description": "File size should be represented in bytes.", + "example": 4096 + }, + "metadata": { + "type": "object", + "additionalProperties": false, + "properties": { + "sha1-checksum": { + "type": "string", + "description": "The SHA1 checksum of the upload binary blob. Optionally\nbe provided and serves as an additional security check when\nlater processing the file in complete-external-upload endpoint." + } + } + } + }, + "required": ["type", "file_name", "file_size"] + } + } + } + } + } + }, + "/uploads/complete-external-upload.json": { + "post": { + "summary": "Completes a direct external upload", + "tags": ["Uploads"], + "operationId": "completeExternalUpload", + "description": "Completes an external upload initialized with /get-presigned-put. The\nfile will be moved from its temporary location in external storage to\na final destination in the S3 bucket. An Upload record will also be\ncreated in the database in most cases.\n\nIf a sha1-checksum was provided in the initial request it will also\nbe compared with the uploaded file in storage to make sure the same\nfile was uploaded. The file size will be compared for the same reason.\n\nYou must have the correct permissions and CORS settings configured in your\nexternal provider. We support AWS S3 as the default. See:\n\nhttps://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4.\n\nAn external file store must be set up and `enable_direct_s3_uploads` must\nbe set to true for this endpoint to function.\n\n", + "parameters": [], + "responses": { + "200": { + "description": "external upload initialized", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "url": { + "type": "string" + }, + "original_filename": { + "type": "string" + }, + "filesize": { + "type": "integer" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "thumbnail_width": { + "type": "integer" + }, + "thumbnail_height": { + "type": "integer" + }, + "extension": { + "type": "string" + }, + "short_url": { + "type": "string" + }, + "short_path": { + "type": "string" + }, + "retain_hours": { + "type": ["string", "null"] + }, + "human_filesize": { + "type": "string" + }, + "dominant_color": { + "type": ["string", "null"] + }, + "thumbnail": { + "type": ["object", "null"], + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "upload_id": { + "type": "integer" + }, + "url": { + "type": "string" + }, + "extension": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "filesize": { + "type": "integer" + } + } + } + }, + "required": [ + "id", + "url", + "original_filename", + "filesize", + "width", + "height", + "thumbnail_width", + "thumbnail_height", + "extension", + "short_url", + "short_path", + "retain_hours", + "human_filesize" + ] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "unique_identifier": { + "type": "string", + "example": "66e86218-80d9-4bda-b4d5-2b6def968705", + "description": "The unique identifier returned in the original /generate-presigned-put\nrequest." + }, + "for_private_message": { + "type": "string", + "example": "true", + "description": "Optionally set this to true if the upload is for a\nprivate message." + }, + "for_site_setting": { + "type": "string", + "example": "true", + "description": "Optionally set this to true if the upload is for a\nsite setting." + }, + "pasted": { + "type": "string", + "example": "true", + "description": "Optionally set this to true if the upload was pasted\ninto the upload area. This will convert PNG files to JPEG." + } + }, + "required": ["unique_identifier"] + } + } + } + } + } + }, + "/uploads/create-multipart.json": { + "post": { + "summary": "Creates a multipart external upload", + "tags": ["Uploads"], + "operationId": "createMultipartUpload", + "description": "Creates a multipart upload in the external storage provider, storing\na temporary reference to the external upload similar to /get-presigned-put.\n\nYou must have the correct permissions and CORS settings configured in your\nexternal provider. We support AWS S3 as the default. See:\n\nhttps://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4.\n\nAn external file store must be set up and `enable_direct_s3_uploads` must\nbe set to true for this endpoint to function.\n\n", + "parameters": [], + "responses": { + "200": { + "description": "external upload initialized", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "key": { + "type": "string", + "description": "The path of the temporary file on the external storage\nservice.", + "example": "temp/site/uploads/default/12345/67890.jpg" + }, + "external_upload_identifier": { + "type": "string", + "description": "The identifier of the multipart upload in the external\nstorage provider. This is the multipart upload_id in AWS S3.", + "example": "84x83tmxy398t3y._Q_z8CoJYVr69bE6D7f8J6Oo0434QquLFoYdGVerWFx9X5HDEI_TP_95c34n853495x35345394.d.ghQ" + }, + "unique_identifier": { + "type": "string", + "description": "A unique string that identifies the external upload.\nThis must be stored and then sent in the /complete-multipart\nand /batch-presign-multipart-parts endpoints.", + "example": "66e86218-80d9-4bda-b4d5-2b6def968705" + } + }, + "required": [ + "external_upload_identifier", + "key", + "unique_identifier" + ] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "upload_type": { + "type": "string", + "enum": [ + "avatar", + "profile_background", + "card_background", + "custom_emoji", + "composer" + ] + }, + "file_name": { + "type": "string", + "example": "IMG_2021.jpeg" + }, + "file_size": { + "type": "integer", + "description": "File size should be represented in bytes.", + "example": 4096 + }, + "metadata": { + "type": "object", + "additionalProperties": false, + "properties": { + "sha1-checksum": { + "type": "string", + "description": "The SHA1 checksum of the upload binary blob. Optionally\nbe provided and serves as an additional security check when\nlater processing the file in complete-external-upload endpoint." + } + } + } + }, + "required": ["upload_type", "file_name", "file_size"] + } + } + } + } + } + }, + "/uploads/batch-presign-multipart-parts.json": { + "post": { + "summary": "Generates batches of presigned URLs for multipart parts", + "tags": ["Uploads"], + "operationId": "batchPresignMultipartParts", + "description": "Multipart uploads are uploaded in chunks or parts to individual presigned\nURLs, similar to the one generated by /generate-presigned-put. The part\nnumbers provided must be between 1 and 10000. The total number of parts\nwill depend on the chunk size in bytes that you intend to use to upload\neach chunk. For example a 12MB file may have 2 5MB chunks and a final\n2MB chunk, for part numbers 1, 2, and 3.\n\nThis endpoint will return a presigned URL for each part number provided,\nwhich you can then use to send PUT requests for the binary chunk corresponding\nto that part. When the part is uploaded, the provider should return an\nETag for the part, and this should be stored along with the part number,\nbecause this is needed to complete the multipart upload.\n\nYou must have the correct permissions and CORS settings configured in your\nexternal provider. We support AWS S3 as the default. See:\n\nhttps://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4.\n\nAn external file store must be set up and `enable_direct_s3_uploads` must\nbe set to true for this endpoint to function.\n\n", + "parameters": [], + "responses": { + "200": { + "description": "external upload initialized", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "presigned_urls": { + "type": "object", + "description": "The presigned URLs for each part number, which has\nthe part numbers as keys.", + "example": { + "1": "https://discourse-martin-uploads-test.s3.us-east-2.amazonaws.com/temp/uploads/default/123abc/123abc.jpg?partNumber=1&uploadId=123456abcd&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=test&X-Amz-Date=20211222T012336Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=abc123" + } + } + }, + "required": ["presigned_urls"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "part_numbers": { + "type": "array", + "description": "The part numbers to generate the presigned URLs for,\nmust be between 1 and 10000.", + "example": [1, 2, 3] + }, + "unique_identifier": { + "type": "string", + "description": "The unique identifier returned in the original /create-multipart\nrequest.", + "example": "66e86218-80d9-4bda-b4d5-2b6def968705" + } + }, + "required": ["part_numbers", "unique_identifier"] + } + } + } + } + } + }, + "/uploads/abort-multipart.json": { + "post": { + "summary": "Abort multipart upload", + "tags": ["Uploads"], + "operationId": "abortMultipart", + "description": "This endpoint aborts the multipart upload initiated with /create-multipart.\nThis should be used when cancelling the upload. It does not matter if parts\nwere already uploaded into the external storage provider.\n\nYou must have the correct permissions and CORS settings configured in your\nexternal provider. We support AWS S3 as the default. See:\n\nhttps://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4.\n\nAn external file store must be set up and `enable_direct_s3_uploads` must\nbe set to true for this endpoint to function.\n\n", + "parameters": [], + "responses": { + "200": { + "description": "external upload initialized", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string", + "example": "OK" + } + }, + "required": ["success"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "external_upload_identifier": { + "type": "string", + "description": "The identifier of the multipart upload in the external\nstorage provider. This is the multipart upload_id in AWS S3.", + "example": "84x83tmxy398t3y._Q_z8CoJYVr69bE6D7f8J6Oo0434QquLFoYdGVerWFx9X5HDEI_TP_95c34n853495x35345394.d.ghQ" + } + }, + "required": ["external_upload_identifier"] + } + } + } + } + } + }, + "/uploads/complete-multipart.json": { + "post": { + "summary": "Complete multipart upload", + "tags": ["Uploads"], + "operationId": "completeMultipart", + "description": "Completes the multipart upload in the external store, and copies the\nfile from its temporary location to its final location in the store.\nAll of the parts must have been uploaded to the external storage provider.\nAn Upload record will be completed in most cases once the file is copied\nto its final location.\n\nYou must have the correct permissions and CORS settings configured in your\nexternal provider. We support AWS S3 as the default. See:\n\nhttps://meta.discourse.org/t/-/210469#s3-multipart-direct-uploads-4.\n\nAn external file store must be set up and `enable_direct_s3_uploads` must\nbe set to true for this endpoint to function.\n\n", + "parameters": [], + "responses": { + "200": { + "description": "external upload initialized", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "url": { + "type": "string" + }, + "original_filename": { + "type": "string" + }, + "filesize": { + "type": "integer" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "thumbnail_width": { + "type": "integer" + }, + "thumbnail_height": { + "type": "integer" + }, + "extension": { + "type": "string" + }, + "short_url": { + "type": "string" + }, + "short_path": { + "type": "string" + }, + "retain_hours": { + "type": ["string", "null"] + }, + "human_filesize": { + "type": "string" + }, + "dominant_color": { + "type": ["string", "null"] + }, + "thumbnail": { + "type": ["object", "null"], + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "upload_id": { + "type": "integer" + }, + "url": { + "type": "string" + }, + "extension": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "filesize": { + "type": "integer" + } + } + } + }, + "required": [ + "id", + "url", + "original_filename", + "filesize", + "width", + "height", + "thumbnail_width", + "thumbnail_height", + "extension", + "short_url", + "short_path", + "retain_hours", + "human_filesize" + ] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "unique_identifier": { + "type": "string", + "example": "66e86218-80d9-4bda-b4d5-2b6def968705", + "description": "The unique identifier returned in the original /create-multipart\nrequest." + }, + "parts": { + "type": "array", + "example": [ + { + "part_number": 1, + "etag": "0c376dcfcc2606f4335bbc732de93344" + }, + { + "part_number": 2, + "etag": "09ert8cfcc2606f4335bbc732de91122" + } + ], + "description": "All of the part numbers and their corresponding ETags\nthat have been uploaded must be provided." + } + }, + "required": ["unique_identifier", "parts"] + } + } + } + } + } + }, + "/user-badges/{username}.json": { + "get": { + "summary": "List badges for a user", + "tags": ["Badges", "Users"], + "operationId": "listUserBadges", + "parameters": [ + { + "name": "username", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "badges": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "grant_count": { + "type": "integer" + }, + "allow_title": { + "type": "boolean" + }, + "multiple_grant": { + "type": "boolean" + }, + "icon": { + "type": "string" + }, + "image_url": { + "type": ["string", "null"] + }, + "listable": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "badge_grouping_id": { + "type": "integer" + }, + "system": { + "type": "boolean" + }, + "slug": { + "type": "string" + }, + "manually_grantable": { + "type": "boolean" + }, + "badge_type_id": { + "type": "integer" + } + }, + "required": [ + "id", + "name", + "description", + "grant_count", + "allow_title", + "multiple_grant", + "icon", + "image_url", + "listable", + "enabled", + "badge_grouping_id", + "system", + "slug", + "manually_grantable", + "badge_type_id" + ] + } + }, + "badge_types": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "sort_order": { + "type": "integer" + } + }, + "required": ["id", "name", "sort_order"] + } + }, + "granted_bies": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "flair_name": { + "type": ["string", "null"] + }, + "admin": { + "type": "boolean" + }, + "moderator": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "flair_name", + "admin", + "moderator", + "trust_level" + ] + } + }, + "user_badges": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "granted_at": { + "type": "string" + }, + "grouping_position": { + "type": "integer" + }, + "is_favorite": { + "type": ["string", "null"] + }, + "can_favorite": { + "type": "boolean" + }, + "badge_id": { + "type": "integer" + }, + "granted_by_id": { + "type": "integer" + } + }, + "required": [ + "id", + "granted_at", + "grouping_position", + "is_favorite", + "can_favorite", + "badge_id", + "granted_by_id" + ] + } + } + }, + "required": ["user_badges"] + } + } + } + } + } + } + }, + "/users.json": { + "post": { + "summary": "Creates a user", + "tags": ["Users"], + "operationId": "createUser", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "user created", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "boolean" + }, + "active": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "user_id": { + "type": "integer" + } + }, + "required": ["success", "active", "message"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "username": { + "type": "string" + }, + "active": { + "type": "boolean", + "description": "This param requires an api key in the request header\nor it will be ignored" + }, + "approved": { + "type": "boolean" + }, + "user_fields": { + "type": "object", + "additionalProperties": true, + "properties": { + "1": { + "type": "boolean" + } + } + }, + "external_ids": { + "type": "object" + } + }, + "required": ["name", "email", "password", "username"] + } + } + } + } + } + }, + "/u/{username}.json": { + "get": { + "summary": "Get a single user by username", + "tags": ["Users"], + "operationId": "getUser", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "user with primary group response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "user_badges": { + "type": "array", + "items": {} + }, + "user": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "last_posted_at": { + "type": ["string", "null"] + }, + "last_seen_at": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "ignored": { + "type": "boolean" + }, + "muted": { + "type": "boolean" + }, + "can_ignore_user": { + "type": "boolean" + }, + "can_ignore_users": { + "type": "boolean" + }, + "can_mute_user": { + "type": "boolean" + }, + "can_mute_users": { + "type": "boolean" + }, + "can_send_private_messages": { + "type": "boolean" + }, + "can_send_private_message_to_user": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "badge_count": { + "type": "integer" + }, + "second_factor_backup_enabled": { + "type": "boolean" + }, + "user_fields": { + "type": "object", + "additionalProperties": false, + "properties": { + "1": { + "type": ["string", "null"] + }, + "2": { + "type": ["string", "null"] + } + }, + "required": ["1", "2"] + }, + "custom_fields": { + "type": "object", + "additionalProperties": false, + "properties": { + "first_name": { + "type": ["string", "null"] + } + } + }, + "time_read": { + "type": "integer" + }, + "recent_time_read": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "featured_topic": { + "type": ["string", "null"] + }, + "staged": { + "type": "boolean" + }, + "can_edit": { + "type": "boolean" + }, + "can_edit_username": { + "type": "boolean" + }, + "can_edit_email": { + "type": "boolean" + }, + "can_edit_name": { + "type": "boolean" + }, + "uploaded_avatar_id": { + "type": ["integer", "null"] + }, + "has_title_badges": { + "type": "boolean" + }, + "pending_count": { + "type": "integer" + }, + "pending_posts_count": { + "type": "integer" + }, + "profile_view_count": { + "type": "integer" + }, + "second_factor_enabled": { + "type": "boolean" + }, + "can_upload_profile_header": { + "type": "boolean" + }, + "can_upload_user_card_background": { + "type": "boolean" + }, + "post_count": { + "type": "integer" + }, + "can_be_deleted": { + "type": "boolean" + }, + "can_delete_all_posts": { + "type": "boolean" + }, + "locale": { + "type": ["string", "null"] + }, + "muted_category_ids": { + "type": "array", + "items": {} + }, + "regular_category_ids": { + "type": "array", + "items": {} + }, + "watched_tags": { + "type": "array", + "items": {} + }, + "watching_first_post_tags": { + "type": "array", + "items": {} + }, + "tracked_tags": { + "type": "array", + "items": {} + }, + "muted_tags": { + "type": "array", + "items": {} + }, + "tracked_category_ids": { + "type": "array", + "items": {} + }, + "watched_category_ids": { + "type": "array", + "items": {} + }, + "watched_first_post_category_ids": { + "type": "array", + "items": {} + }, + "system_avatar_upload_id": { + "type": ["string", "null"] + }, + "system_avatar_template": { + "type": "string" + }, + "muted_usernames": { + "type": "array", + "items": {} + }, + "ignored_usernames": { + "type": "array", + "items": {} + }, + "allowed_pm_usernames": { + "type": "array", + "items": {} + }, + "mailing_list_posts_per_day": { + "type": "integer" + }, + "can_change_bio": { + "type": "boolean" + }, + "can_change_location": { + "type": "boolean" + }, + "can_change_website": { + "type": "boolean" + }, + "can_change_tracking_preferences": { + "type": "boolean" + }, + "user_api_keys": { + "type": ["string", "null"] + }, + "user_passkeys": { + "type": "array" + }, + "sidebar_tags": { + "type": "array" + }, + "sidebar_category_ids": { + "type": "array" + }, + "display_sidebar_tags": { + "type": "boolean" + }, + "can_pick_theme_with_custom_homepage": { + "type": "boolean" + }, + "user_auth_tokens": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "client_ip": { + "type": "string" + }, + "location": { + "type": "string" + }, + "browser": { + "type": "string" + }, + "device": { + "type": "string" + }, + "os": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "seen_at": { + "type": "string" + }, + "is_active": { + "type": "boolean" + } + }, + "required": [ + "id", + "client_ip", + "location", + "browser", + "device", + "os", + "icon", + "created_at", + "seen_at", + "is_active" + ] + } + }, + "user_notification_schedule": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "day_0_start_time": { + "type": "integer" + }, + "day_0_end_time": { + "type": "integer" + }, + "day_1_start_time": { + "type": "integer" + }, + "day_1_end_time": { + "type": "integer" + }, + "day_2_start_time": { + "type": "integer" + }, + "day_2_end_time": { + "type": "integer" + }, + "day_3_start_time": { + "type": "integer" + }, + "day_3_end_time": { + "type": "integer" + }, + "day_4_start_time": { + "type": "integer" + }, + "day_4_end_time": { + "type": "integer" + }, + "day_5_start_time": { + "type": "integer" + }, + "day_5_end_time": { + "type": "integer" + }, + "day_6_start_time": { + "type": "integer" + }, + "day_6_end_time": { + "type": "integer" + } + }, + "required": [ + "enabled", + "day_0_start_time", + "day_0_end_time", + "day_1_start_time", + "day_1_end_time", + "day_2_start_time", + "day_2_end_time", + "day_3_start_time", + "day_3_end_time", + "day_4_start_time", + "day_4_end_time", + "day_5_start_time", + "day_5_end_time", + "day_6_start_time", + "day_6_end_time" + ] + }, + "use_logo_small_as_avatar": { + "type": "boolean" + }, + "featured_user_badge_ids": { + "type": "array", + "items": {} + }, + "invited_by": { + "type": ["string", "null"] + }, + "groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "automatic": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "user_count": { + "type": "integer" + }, + "mentionable_level": { + "type": "integer" + }, + "messageable_level": { + "type": "integer" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "grant_trust_level": { + "type": ["string", "null"] + }, + "incoming_email": { + "type": ["string", "null"] + }, + "has_messages": { + "type": "boolean" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "bio_raw": { + "type": ["string", "null"] + }, + "bio_cooked": { + "type": ["string", "null"] + }, + "bio_excerpt": { + "type": ["string", "null"] + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "allow_membership_requests": { + "type": "boolean" + }, + "full_name": { + "type": ["string", "null"] + }, + "default_notification_level": { + "type": "integer" + }, + "membership_request_template": { + "type": ["string", "null"] + }, + "members_visibility_level": { + "type": "integer" + }, + "can_see_members": { + "type": "boolean" + }, + "can_admin_group": { + "type": "boolean" + }, + "publish_read_state": { + "type": "boolean" + } + }, + "required": [ + "id", + "automatic", + "name", + "display_name", + "user_count", + "mentionable_level", + "messageable_level", + "visibility_level", + "primary_group", + "title", + "grant_trust_level", + "incoming_email", + "has_messages", + "flair_url", + "flair_bg_color", + "flair_color", + "bio_raw", + "bio_cooked", + "bio_excerpt", + "public_admission", + "public_exit", + "allow_membership_requests", + "full_name", + "default_notification_level", + "membership_request_template", + "members_visibility_level", + "can_see_members", + "can_admin_group", + "publish_read_state" + ] + } + }, + "group_users": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "group_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + }, + "notification_level": { + "type": "integer" + }, + "owner": { + "type": "boolean" + } + }, + "required": [ + "group_id", + "user_id", + "notification_level" + ] + } + }, + "user_option": { + "type": "object", + "additionalProperties": false, + "properties": { + "user_id": { + "type": "integer" + }, + "mailing_list_mode": { + "type": "boolean" + }, + "mailing_list_mode_frequency": { + "type": "integer" + }, + "email_digests": { + "type": "boolean" + }, + "email_level": { + "type": "integer" + }, + "email_messages_level": { + "type": "integer" + }, + "external_links_in_new_tab": { + "type": "boolean" + }, + "bookmark_auto_delete_preference": { + "type": "integer" + }, + "color_scheme_id": { + "type": ["string", "null"] + }, + "dark_scheme_id": { + "type": ["string", "null"] + }, + "dynamic_favicon": { + "type": "boolean" + }, + "enable_quoting": { + "type": "boolean" + }, + "enable_smart_lists": { + "type": "boolean" + }, + "enable_defer": { + "type": "boolean" + }, + "digest_after_minutes": { + "type": "integer" + }, + "automatically_unpin_topics": { + "type": "boolean" + }, + "auto_track_topics_after_msecs": { + "type": "integer" + }, + "notification_level_when_replying": { + "type": "integer" + }, + "new_topic_duration_minutes": { + "type": "integer" + }, + "email_previous_replies": { + "type": "integer" + }, + "email_in_reply_to": { + "type": "boolean" + }, + "like_notification_frequency": { + "type": "integer" + }, + "include_tl0_in_digests": { + "type": "boolean" + }, + "theme_ids": { + "type": "array", + "items": {} + }, + "theme_key_seq": { + "type": "integer" + }, + "allow_private_messages": { + "type": "boolean" + }, + "enable_allowed_pm_users": { + "type": "boolean" + }, + "homepage_id": { + "type": ["string", "null"] + }, + "hide_profile_and_presence": { + "type": "boolean" + }, + "hide_profile": { + "type": "boolean" + }, + "hide_presence": { + "type": "boolean" + }, + "text_size": { + "type": "string" + }, + "text_size_seq": { + "type": "integer" + }, + "title_count_mode": { + "type": "string" + }, + "timezone": { + "type": ["string", "null"] + }, + "skip_new_user_tips": { + "type": "boolean" + }, + "default_calendar": { + "type": "string" + }, + "oldest_search_log_date": { + "type": ["string", "null"] + }, + "sidebar_link_to_filtered_list": { + "type": "boolean" + }, + "sidebar_show_count_of_new_items": { + "type": "boolean" + }, + "watched_precedence_over_muted": { + "type": ["boolean", "null"] + }, + "seen_popups": { + "type": ["array", "null"] + }, + "topics_unread_when_closed": { + "type": "boolean" + } + }, + "required": [ + "user_id", + "mailing_list_mode", + "mailing_list_mode_frequency", + "email_digests", + "email_level", + "email_messages_level", + "external_links_in_new_tab", + "color_scheme_id", + "dark_scheme_id", + "dynamic_favicon", + "enable_quoting", + "enable_smart_lists", + "enable_defer", + "digest_after_minutes", + "automatically_unpin_topics", + "auto_track_topics_after_msecs", + "notification_level_when_replying", + "new_topic_duration_minutes", + "email_previous_replies", + "email_in_reply_to", + "like_notification_frequency", + "include_tl0_in_digests", + "theme_ids", + "theme_key_seq", + "allow_private_messages", + "enable_allowed_pm_users", + "homepage_id", + "hide_profile_and_presence", + "hide_profile", + "hide_presence", + "text_size", + "text_size_seq", + "title_count_mode", + "timezone", + "skip_new_user_tips", + "topics_unread_when_closed" + ] + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "last_posted_at", + "last_seen_at", + "created_at", + "ignored", + "muted", + "can_ignore_user", + "can_mute_user", + "can_send_private_messages", + "can_send_private_message_to_user", + "trust_level", + "moderator", + "admin", + "title", + "badge_count", + "custom_fields", + "time_read", + "recent_time_read", + "primary_group_id", + "primary_group_name", + "flair_group_id", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "featured_topic", + "staged", + "can_edit", + "can_edit_username", + "can_edit_email", + "can_edit_name", + "uploaded_avatar_id", + "has_title_badges", + "pending_count", + "profile_view_count", + "second_factor_enabled", + "can_upload_profile_header", + "can_upload_user_card_background", + "post_count", + "can_be_deleted", + "can_delete_all_posts", + "locale", + "muted_category_ids", + "regular_category_ids", + "watched_tags", + "watching_first_post_tags", + "tracked_tags", + "muted_tags", + "tracked_category_ids", + "watched_category_ids", + "watched_first_post_category_ids", + "system_avatar_upload_id", + "system_avatar_template", + "muted_usernames", + "ignored_usernames", + "allowed_pm_usernames", + "mailing_list_posts_per_day", + "can_change_bio", + "can_change_location", + "can_change_website", + "can_change_tracking_preferences", + "user_api_keys", + "user_auth_tokens", + "user_notification_schedule", + "use_logo_small_as_avatar", + "featured_user_badge_ids", + "invited_by", + "groups", + "group_users", + "user_option" + ] + } + }, + "required": ["user_badges", "user"] + } + } + } + } + } + }, + "put": { + "summary": "Update a user", + "tags": ["Users"], + "operationId": "updateUser", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "user updated", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string" + }, + "user": { + "type": "object" + } + }, + "required": ["success", "user"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "external_ids": { + "type": "object" + } + } + } + } + } + } + } + }, + "/u/by-external/{external_id}.json": { + "get": { + "summary": "Get a user by external_id", + "tags": ["Users"], + "operationId": "getUserExternalId", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "external_id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "user response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "user_badges": { + "type": "array", + "items": {} + }, + "user": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "last_posted_at": { + "type": ["string", "null"] + }, + "last_seen_at": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "ignored": { + "type": "boolean" + }, + "muted": { + "type": "boolean" + }, + "can_ignore_user": { + "type": "boolean" + }, + "can_ignore_users": { + "type": "boolean" + }, + "can_mute_user": { + "type": "boolean" + }, + "can_mute_users": { + "type": "boolean" + }, + "can_send_private_messages": { + "type": "boolean" + }, + "can_send_private_message_to_user": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "badge_count": { + "type": "integer" + }, + "second_factor_backup_enabled": { + "type": "boolean" + }, + "user_fields": { + "type": "object", + "additionalProperties": false, + "properties": { + "1": { + "type": ["string", "null"] + }, + "2": { + "type": ["string", "null"] + } + }, + "required": ["1", "2"] + }, + "custom_fields": { + "type": "object", + "additionalProperties": false, + "properties": { + "first_name": { + "type": ["string", "null"] + } + } + }, + "time_read": { + "type": "integer" + }, + "recent_time_read": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "featured_topic": { + "type": ["string", "null"] + }, + "staged": { + "type": "boolean" + }, + "can_edit": { + "type": "boolean" + }, + "can_edit_username": { + "type": "boolean" + }, + "can_edit_email": { + "type": "boolean" + }, + "can_edit_name": { + "type": "boolean" + }, + "uploaded_avatar_id": { + "type": ["integer", "null"] + }, + "has_title_badges": { + "type": "boolean" + }, + "pending_count": { + "type": "integer" + }, + "pending_posts_count": { + "type": "integer" + }, + "profile_view_count": { + "type": "integer" + }, + "second_factor_enabled": { + "type": "boolean" + }, + "can_upload_profile_header": { + "type": "boolean" + }, + "can_upload_user_card_background": { + "type": "boolean" + }, + "post_count": { + "type": "integer" + }, + "can_be_deleted": { + "type": "boolean" + }, + "can_delete_all_posts": { + "type": "boolean" + }, + "locale": { + "type": ["string", "null"] + }, + "muted_category_ids": { + "type": "array", + "items": {} + }, + "regular_category_ids": { + "type": "array", + "items": {} + }, + "watched_tags": { + "type": "array", + "items": {} + }, + "watching_first_post_tags": { + "type": "array", + "items": {} + }, + "tracked_tags": { + "type": "array", + "items": {} + }, + "muted_tags": { + "type": "array", + "items": {} + }, + "tracked_category_ids": { + "type": "array", + "items": {} + }, + "watched_category_ids": { + "type": "array", + "items": {} + }, + "watched_first_post_category_ids": { + "type": "array", + "items": {} + }, + "system_avatar_upload_id": { + "type": ["string", "null"] + }, + "system_avatar_template": { + "type": "string" + }, + "muted_usernames": { + "type": "array", + "items": {} + }, + "ignored_usernames": { + "type": "array", + "items": {} + }, + "allowed_pm_usernames": { + "type": "array", + "items": {} + }, + "mailing_list_posts_per_day": { + "type": "integer" + }, + "can_change_bio": { + "type": "boolean" + }, + "can_change_location": { + "type": "boolean" + }, + "can_change_website": { + "type": "boolean" + }, + "can_change_tracking_preferences": { + "type": "boolean" + }, + "user_api_keys": { + "type": ["string", "null"] + }, + "user_passkeys": { + "type": "array" + }, + "sidebar_tags": { + "type": "array" + }, + "sidebar_category_ids": { + "type": "array" + }, + "display_sidebar_tags": { + "type": "boolean" + }, + "can_pick_theme_with_custom_homepage": { + "type": "boolean" + }, + "user_auth_tokens": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "client_ip": { + "type": "string" + }, + "location": { + "type": "string" + }, + "browser": { + "type": "string" + }, + "device": { + "type": "string" + }, + "os": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "seen_at": { + "type": "string" + }, + "is_active": { + "type": "boolean" + } + }, + "required": [ + "id", + "client_ip", + "location", + "browser", + "device", + "os", + "icon", + "created_at", + "seen_at", + "is_active" + ] + } + }, + "user_notification_schedule": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "day_0_start_time": { + "type": "integer" + }, + "day_0_end_time": { + "type": "integer" + }, + "day_1_start_time": { + "type": "integer" + }, + "day_1_end_time": { + "type": "integer" + }, + "day_2_start_time": { + "type": "integer" + }, + "day_2_end_time": { + "type": "integer" + }, + "day_3_start_time": { + "type": "integer" + }, + "day_3_end_time": { + "type": "integer" + }, + "day_4_start_time": { + "type": "integer" + }, + "day_4_end_time": { + "type": "integer" + }, + "day_5_start_time": { + "type": "integer" + }, + "day_5_end_time": { + "type": "integer" + }, + "day_6_start_time": { + "type": "integer" + }, + "day_6_end_time": { + "type": "integer" + } + }, + "required": [ + "enabled", + "day_0_start_time", + "day_0_end_time", + "day_1_start_time", + "day_1_end_time", + "day_2_start_time", + "day_2_end_time", + "day_3_start_time", + "day_3_end_time", + "day_4_start_time", + "day_4_end_time", + "day_5_start_time", + "day_5_end_time", + "day_6_start_time", + "day_6_end_time" + ] + }, + "use_logo_small_as_avatar": { + "type": "boolean" + }, + "featured_user_badge_ids": { + "type": "array", + "items": {} + }, + "invited_by": { + "type": ["string", "null"] + }, + "groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "automatic": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "user_count": { + "type": "integer" + }, + "mentionable_level": { + "type": "integer" + }, + "messageable_level": { + "type": "integer" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "grant_trust_level": { + "type": ["string", "null"] + }, + "incoming_email": { + "type": ["string", "null"] + }, + "has_messages": { + "type": "boolean" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "bio_raw": { + "type": ["string", "null"] + }, + "bio_cooked": { + "type": ["string", "null"] + }, + "bio_excerpt": { + "type": ["string", "null"] + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "allow_membership_requests": { + "type": "boolean" + }, + "full_name": { + "type": ["string", "null"] + }, + "default_notification_level": { + "type": "integer" + }, + "membership_request_template": { + "type": ["string", "null"] + }, + "members_visibility_level": { + "type": "integer" + }, + "can_see_members": { + "type": "boolean" + }, + "can_admin_group": { + "type": "boolean" + }, + "publish_read_state": { + "type": "boolean" + } + }, + "required": [ + "id", + "automatic", + "name", + "display_name", + "user_count", + "mentionable_level", + "messageable_level", + "visibility_level", + "primary_group", + "title", + "grant_trust_level", + "incoming_email", + "has_messages", + "flair_url", + "flair_bg_color", + "flair_color", + "bio_raw", + "bio_cooked", + "bio_excerpt", + "public_admission", + "public_exit", + "allow_membership_requests", + "full_name", + "default_notification_level", + "membership_request_template", + "members_visibility_level", + "can_see_members", + "can_admin_group", + "publish_read_state" + ] + } + }, + "group_users": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "group_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + }, + "notification_level": { + "type": "integer" + }, + "owner": { + "type": "boolean" + } + }, + "required": [ + "group_id", + "user_id", + "notification_level" + ] + } + }, + "user_option": { + "type": "object", + "additionalProperties": false, + "properties": { + "user_id": { + "type": "integer" + }, + "mailing_list_mode": { + "type": "boolean" + }, + "mailing_list_mode_frequency": { + "type": "integer" + }, + "email_digests": { + "type": "boolean" + }, + "email_level": { + "type": "integer" + }, + "email_messages_level": { + "type": "integer" + }, + "external_links_in_new_tab": { + "type": "boolean" + }, + "bookmark_auto_delete_preference": { + "type": "integer" + }, + "color_scheme_id": { + "type": ["string", "null"] + }, + "dark_scheme_id": { + "type": ["string", "null"] + }, + "dynamic_favicon": { + "type": "boolean" + }, + "enable_quoting": { + "type": "boolean" + }, + "enable_smart_lists": { + "type": "boolean" + }, + "enable_defer": { + "type": "boolean" + }, + "digest_after_minutes": { + "type": "integer" + }, + "automatically_unpin_topics": { + "type": "boolean" + }, + "auto_track_topics_after_msecs": { + "type": "integer" + }, + "notification_level_when_replying": { + "type": "integer" + }, + "new_topic_duration_minutes": { + "type": "integer" + }, + "email_previous_replies": { + "type": "integer" + }, + "email_in_reply_to": { + "type": "boolean" + }, + "like_notification_frequency": { + "type": "integer" + }, + "include_tl0_in_digests": { + "type": "boolean" + }, + "theme_ids": { + "type": "array", + "items": {} + }, + "theme_key_seq": { + "type": "integer" + }, + "allow_private_messages": { + "type": "boolean" + }, + "enable_allowed_pm_users": { + "type": "boolean" + }, + "homepage_id": { + "type": ["string", "null"] + }, + "hide_profile_and_presence": { + "type": "boolean" + }, + "hide_profile": { + "type": "boolean" + }, + "hide_presence": { + "type": "boolean" + }, + "text_size": { + "type": "string" + }, + "text_size_seq": { + "type": "integer" + }, + "title_count_mode": { + "type": "string" + }, + "timezone": { + "type": ["string", "null"] + }, + "skip_new_user_tips": { + "type": "boolean" + }, + "default_calendar": { + "type": "string" + }, + "oldest_search_log_date": { + "type": ["string", "null"] + }, + "sidebar_link_to_filtered_list": { + "type": "boolean" + }, + "sidebar_show_count_of_new_items": { + "type": "boolean" + }, + "watched_precedence_over_muted": { + "type": ["boolean", "null"] + }, + "seen_popups": { + "type": ["array", "null"] + }, + "topics_unread_when_closed": { + "type": "boolean" + } + }, + "required": [ + "user_id", + "mailing_list_mode", + "mailing_list_mode_frequency", + "email_digests", + "email_level", + "email_messages_level", + "external_links_in_new_tab", + "color_scheme_id", + "dark_scheme_id", + "dynamic_favicon", + "enable_quoting", + "enable_smart_lists", + "enable_defer", + "digest_after_minutes", + "automatically_unpin_topics", + "auto_track_topics_after_msecs", + "notification_level_when_replying", + "new_topic_duration_minutes", + "email_previous_replies", + "email_in_reply_to", + "like_notification_frequency", + "include_tl0_in_digests", + "theme_ids", + "theme_key_seq", + "allow_private_messages", + "enable_allowed_pm_users", + "homepage_id", + "hide_profile_and_presence", + "hide_profile", + "hide_presence", + "text_size", + "text_size_seq", + "title_count_mode", + "timezone", + "skip_new_user_tips", + "topics_unread_when_closed" + ] + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "last_posted_at", + "last_seen_at", + "created_at", + "ignored", + "muted", + "can_ignore_user", + "can_mute_user", + "can_send_private_messages", + "can_send_private_message_to_user", + "trust_level", + "moderator", + "admin", + "title", + "badge_count", + "custom_fields", + "time_read", + "recent_time_read", + "primary_group_id", + "primary_group_name", + "flair_group_id", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "featured_topic", + "staged", + "can_edit", + "can_edit_username", + "can_edit_email", + "can_edit_name", + "uploaded_avatar_id", + "has_title_badges", + "pending_count", + "profile_view_count", + "second_factor_enabled", + "can_upload_profile_header", + "can_upload_user_card_background", + "post_count", + "can_be_deleted", + "can_delete_all_posts", + "locale", + "muted_category_ids", + "regular_category_ids", + "watched_tags", + "watching_first_post_tags", + "tracked_tags", + "muted_tags", + "tracked_category_ids", + "watched_category_ids", + "watched_first_post_category_ids", + "system_avatar_upload_id", + "system_avatar_template", + "muted_usernames", + "ignored_usernames", + "allowed_pm_usernames", + "mailing_list_posts_per_day", + "can_change_bio", + "can_change_location", + "can_change_website", + "can_change_tracking_preferences", + "user_api_keys", + "user_auth_tokens", + "user_notification_schedule", + "use_logo_small_as_avatar", + "featured_user_badge_ids", + "invited_by", + "groups", + "group_users", + "user_option" + ] + } + }, + "required": ["user_badges", "user"] + } + } + } + } + } + } + }, + "/u/by-external/{provider}/{external_id}.json": { + "get": { + "summary": "Get a user by identity provider external ID", + "tags": ["Users"], + "operationId": "getUserIdentiyProviderExternalId", + "parameters": [ + { + "name": "Api-Key", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "Api-Username", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "provider", + "in": "path", + "required": true, + "description": "Authentication provider name. Can be found in the provider callback\nURL: `/auth/{provider}/callback`", + "schema": { + "type": "string" + } + }, + { + "name": "external_id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "user response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "user_badges": { + "type": "array", + "items": {} + }, + "user": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "last_posted_at": { + "type": ["string", "null"] + }, + "last_seen_at": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "ignored": { + "type": "boolean" + }, + "muted": { + "type": "boolean" + }, + "can_ignore_user": { + "type": "boolean" + }, + "can_ignore_users": { + "type": "boolean" + }, + "can_mute_user": { + "type": "boolean" + }, + "can_mute_users": { + "type": "boolean" + }, + "can_send_private_messages": { + "type": "boolean" + }, + "can_send_private_message_to_user": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "badge_count": { + "type": "integer" + }, + "second_factor_backup_enabled": { + "type": "boolean" + }, + "user_fields": { + "type": "object", + "additionalProperties": false, + "properties": { + "1": { + "type": ["string", "null"] + }, + "2": { + "type": ["string", "null"] + } + }, + "required": ["1", "2"] + }, + "custom_fields": { + "type": "object", + "additionalProperties": false, + "properties": { + "first_name": { + "type": ["string", "null"] + } + } + }, + "time_read": { + "type": "integer" + }, + "recent_time_read": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "featured_topic": { + "type": ["string", "null"] + }, + "staged": { + "type": "boolean" + }, + "can_edit": { + "type": "boolean" + }, + "can_edit_username": { + "type": "boolean" + }, + "can_edit_email": { + "type": "boolean" + }, + "can_edit_name": { + "type": "boolean" + }, + "uploaded_avatar_id": { + "type": ["integer", "null"] + }, + "has_title_badges": { + "type": "boolean" + }, + "pending_count": { + "type": "integer" + }, + "pending_posts_count": { + "type": "integer" + }, + "profile_view_count": { + "type": "integer" + }, + "second_factor_enabled": { + "type": "boolean" + }, + "can_upload_profile_header": { + "type": "boolean" + }, + "can_upload_user_card_background": { + "type": "boolean" + }, + "post_count": { + "type": "integer" + }, + "can_be_deleted": { + "type": "boolean" + }, + "can_delete_all_posts": { + "type": "boolean" + }, + "locale": { + "type": ["string", "null"] + }, + "muted_category_ids": { + "type": "array", + "items": {} + }, + "regular_category_ids": { + "type": "array", + "items": {} + }, + "watched_tags": { + "type": "array", + "items": {} + }, + "watching_first_post_tags": { + "type": "array", + "items": {} + }, + "tracked_tags": { + "type": "array", + "items": {} + }, + "muted_tags": { + "type": "array", + "items": {} + }, + "tracked_category_ids": { + "type": "array", + "items": {} + }, + "watched_category_ids": { + "type": "array", + "items": {} + }, + "watched_first_post_category_ids": { + "type": "array", + "items": {} + }, + "system_avatar_upload_id": { + "type": ["string", "null"] + }, + "system_avatar_template": { + "type": "string" + }, + "muted_usernames": { + "type": "array", + "items": {} + }, + "ignored_usernames": { + "type": "array", + "items": {} + }, + "allowed_pm_usernames": { + "type": "array", + "items": {} + }, + "mailing_list_posts_per_day": { + "type": "integer" + }, + "can_change_bio": { + "type": "boolean" + }, + "can_change_location": { + "type": "boolean" + }, + "can_change_website": { + "type": "boolean" + }, + "can_change_tracking_preferences": { + "type": "boolean" + }, + "user_api_keys": { + "type": ["string", "null"] + }, + "user_passkeys": { + "type": "array" + }, + "sidebar_tags": { + "type": "array" + }, + "sidebar_category_ids": { + "type": "array" + }, + "display_sidebar_tags": { + "type": "boolean" + }, + "can_pick_theme_with_custom_homepage": { + "type": "boolean" + }, + "user_auth_tokens": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "client_ip": { + "type": "string" + }, + "location": { + "type": "string" + }, + "browser": { + "type": "string" + }, + "device": { + "type": "string" + }, + "os": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "seen_at": { + "type": "string" + }, + "is_active": { + "type": "boolean" + } + }, + "required": [ + "id", + "client_ip", + "location", + "browser", + "device", + "os", + "icon", + "created_at", + "seen_at", + "is_active" + ] + } + }, + "user_notification_schedule": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "day_0_start_time": { + "type": "integer" + }, + "day_0_end_time": { + "type": "integer" + }, + "day_1_start_time": { + "type": "integer" + }, + "day_1_end_time": { + "type": "integer" + }, + "day_2_start_time": { + "type": "integer" + }, + "day_2_end_time": { + "type": "integer" + }, + "day_3_start_time": { + "type": "integer" + }, + "day_3_end_time": { + "type": "integer" + }, + "day_4_start_time": { + "type": "integer" + }, + "day_4_end_time": { + "type": "integer" + }, + "day_5_start_time": { + "type": "integer" + }, + "day_5_end_time": { + "type": "integer" + }, + "day_6_start_time": { + "type": "integer" + }, + "day_6_end_time": { + "type": "integer" + } + }, + "required": [ + "enabled", + "day_0_start_time", + "day_0_end_time", + "day_1_start_time", + "day_1_end_time", + "day_2_start_time", + "day_2_end_time", + "day_3_start_time", + "day_3_end_time", + "day_4_start_time", + "day_4_end_time", + "day_5_start_time", + "day_5_end_time", + "day_6_start_time", + "day_6_end_time" + ] + }, + "use_logo_small_as_avatar": { + "type": "boolean" + }, + "featured_user_badge_ids": { + "type": "array", + "items": {} + }, + "invited_by": { + "type": ["string", "null"] + }, + "groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "automatic": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "user_count": { + "type": "integer" + }, + "mentionable_level": { + "type": "integer" + }, + "messageable_level": { + "type": "integer" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "grant_trust_level": { + "type": ["string", "null"] + }, + "incoming_email": { + "type": ["string", "null"] + }, + "has_messages": { + "type": "boolean" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "bio_raw": { + "type": ["string", "null"] + }, + "bio_cooked": { + "type": ["string", "null"] + }, + "bio_excerpt": { + "type": ["string", "null"] + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "allow_membership_requests": { + "type": "boolean" + }, + "full_name": { + "type": ["string", "null"] + }, + "default_notification_level": { + "type": "integer" + }, + "membership_request_template": { + "type": ["string", "null"] + }, + "members_visibility_level": { + "type": "integer" + }, + "can_see_members": { + "type": "boolean" + }, + "can_admin_group": { + "type": "boolean" + }, + "publish_read_state": { + "type": "boolean" + } + }, + "required": [ + "id", + "automatic", + "name", + "display_name", + "user_count", + "mentionable_level", + "messageable_level", + "visibility_level", + "primary_group", + "title", + "grant_trust_level", + "incoming_email", + "has_messages", + "flair_url", + "flair_bg_color", + "flair_color", + "bio_raw", + "bio_cooked", + "bio_excerpt", + "public_admission", + "public_exit", + "allow_membership_requests", + "full_name", + "default_notification_level", + "membership_request_template", + "members_visibility_level", + "can_see_members", + "can_admin_group", + "publish_read_state" + ] + } + }, + "group_users": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "group_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + }, + "notification_level": { + "type": "integer" + }, + "owner": { + "type": "boolean" + } + }, + "required": [ + "group_id", + "user_id", + "notification_level" + ] + } + }, + "user_option": { + "type": "object", + "additionalProperties": false, + "properties": { + "user_id": { + "type": "integer" + }, + "mailing_list_mode": { + "type": "boolean" + }, + "mailing_list_mode_frequency": { + "type": "integer" + }, + "email_digests": { + "type": "boolean" + }, + "email_level": { + "type": "integer" + }, + "email_messages_level": { + "type": "integer" + }, + "external_links_in_new_tab": { + "type": "boolean" + }, + "bookmark_auto_delete_preference": { + "type": "integer" + }, + "color_scheme_id": { + "type": ["string", "null"] + }, + "dark_scheme_id": { + "type": ["string", "null"] + }, + "dynamic_favicon": { + "type": "boolean" + }, + "enable_quoting": { + "type": "boolean" + }, + "enable_smart_lists": { + "type": "boolean" + }, + "enable_defer": { + "type": "boolean" + }, + "digest_after_minutes": { + "type": "integer" + }, + "automatically_unpin_topics": { + "type": "boolean" + }, + "auto_track_topics_after_msecs": { + "type": "integer" + }, + "notification_level_when_replying": { + "type": "integer" + }, + "new_topic_duration_minutes": { + "type": "integer" + }, + "email_previous_replies": { + "type": "integer" + }, + "email_in_reply_to": { + "type": "boolean" + }, + "like_notification_frequency": { + "type": "integer" + }, + "include_tl0_in_digests": { + "type": "boolean" + }, + "theme_ids": { + "type": "array", + "items": {} + }, + "theme_key_seq": { + "type": "integer" + }, + "allow_private_messages": { + "type": "boolean" + }, + "enable_allowed_pm_users": { + "type": "boolean" + }, + "homepage_id": { + "type": ["string", "null"] + }, + "hide_profile_and_presence": { + "type": "boolean" + }, + "hide_profile": { + "type": "boolean" + }, + "hide_presence": { + "type": "boolean" + }, + "text_size": { + "type": "string" + }, + "text_size_seq": { + "type": "integer" + }, + "title_count_mode": { + "type": "string" + }, + "timezone": { + "type": ["string", "null"] + }, + "skip_new_user_tips": { + "type": "boolean" + }, + "default_calendar": { + "type": "string" + }, + "oldest_search_log_date": { + "type": ["string", "null"] + }, + "sidebar_link_to_filtered_list": { + "type": "boolean" + }, + "sidebar_show_count_of_new_items": { + "type": "boolean" + }, + "watched_precedence_over_muted": { + "type": ["boolean", "null"] + }, + "seen_popups": { + "type": ["array", "null"] + }, + "topics_unread_when_closed": { + "type": "boolean" + } + }, + "required": [ + "user_id", + "mailing_list_mode", + "mailing_list_mode_frequency", + "email_digests", + "email_level", + "email_messages_level", + "external_links_in_new_tab", + "color_scheme_id", + "dark_scheme_id", + "dynamic_favicon", + "enable_quoting", + "enable_smart_lists", + "enable_defer", + "digest_after_minutes", + "automatically_unpin_topics", + "auto_track_topics_after_msecs", + "notification_level_when_replying", + "new_topic_duration_minutes", + "email_previous_replies", + "email_in_reply_to", + "like_notification_frequency", + "include_tl0_in_digests", + "theme_ids", + "theme_key_seq", + "allow_private_messages", + "enable_allowed_pm_users", + "homepage_id", + "hide_profile_and_presence", + "hide_profile", + "hide_presence", + "text_size", + "text_size_seq", + "title_count_mode", + "timezone", + "skip_new_user_tips", + "topics_unread_when_closed" + ] + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "last_posted_at", + "last_seen_at", + "created_at", + "ignored", + "muted", + "can_ignore_user", + "can_mute_user", + "can_send_private_messages", + "can_send_private_message_to_user", + "trust_level", + "moderator", + "admin", + "title", + "badge_count", + "custom_fields", + "time_read", + "recent_time_read", + "primary_group_id", + "primary_group_name", + "flair_group_id", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "featured_topic", + "staged", + "can_edit", + "can_edit_username", + "can_edit_email", + "can_edit_name", + "uploaded_avatar_id", + "has_title_badges", + "pending_count", + "profile_view_count", + "second_factor_enabled", + "can_upload_profile_header", + "can_upload_user_card_background", + "post_count", + "can_be_deleted", + "can_delete_all_posts", + "locale", + "muted_category_ids", + "regular_category_ids", + "watched_tags", + "watching_first_post_tags", + "tracked_tags", + "muted_tags", + "tracked_category_ids", + "watched_category_ids", + "watched_first_post_category_ids", + "system_avatar_upload_id", + "system_avatar_template", + "muted_usernames", + "ignored_usernames", + "allowed_pm_usernames", + "mailing_list_posts_per_day", + "can_change_bio", + "can_change_location", + "can_change_website", + "can_change_tracking_preferences", + "user_api_keys", + "user_auth_tokens", + "user_notification_schedule", + "use_logo_small_as_avatar", + "featured_user_badge_ids", + "invited_by", + "groups", + "group_users", + "user_option" + ] + } + }, + "required": ["user_badges", "user"] + } + } + } + } + } + } + }, + "/u/{username}/preferences/avatar/pick.json": { + "put": { + "summary": "Update avatar", + "tags": ["Users"], + "operationId": "updateAvatar", + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "avatar updated", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string", + "example": "OK" + } + }, + "required": ["success"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "upload_id": { + "type": "integer" + }, + "type": { + "type": "string", + "enum": ["uploaded", "custom", "gravatar", "system"] + } + }, + "required": ["upload_id", "type"] + } + } + } + } + } + }, + "/u/{username}/preferences/email.json": { + "put": { + "summary": "Update email", + "tags": ["Users"], + "operationId": "updateEmail", + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "email updated" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "email": { + "type": "string", + "format": "email" + } + }, + "required": ["email"] + } + } + } + } + } + }, + "/u/{username}/preferences/username.json": { + "put": { + "summary": "Update username", + "tags": ["Users"], + "operationId": "updateUsername", + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "username updated" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "new_username": { + "type": "string" + } + }, + "required": ["new_username"] + } + } + } + } + } + }, + "/directory_items.json": { + "get": { + "summary": "Get a public list of users", + "tags": ["Users"], + "operationId": "listUsersPublic", + "parameters": [ + { + "name": "period", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "daily", + "weekly", + "monthly", + "quarterly", + "yearly", + "all" + ] + }, + "required": true + }, + { + "name": "order", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "likes_received", + "likes_given", + "topic_count", + "post_count", + "topics_entered", + "posts_read", + "days_visited" + ] + }, + "required": true + }, + { + "name": "asc", + "in": "query", + "schema": { + "type": "string", + "enum": ["true"] + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "directory items response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "directory_items": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "likes_received": { + "type": "integer" + }, + "likes_given": { + "type": "integer" + }, + "topics_entered": { + "type": "integer" + }, + "topic_count": { + "type": "integer" + }, + "post_count": { + "type": "integer" + }, + "posts_read": { + "type": "integer" + }, + "days_visited": { + "type": "integer" + }, + "user": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "avatar_template": { + "type": "string" + }, + "title": { + "type": ["string", "null"] + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "title" + ] + } + }, + "required": [ + "id", + "likes_received", + "likes_given", + "topics_entered", + "topic_count", + "post_count", + "posts_read", + "days_visited", + "user" + ] + } + }, + "meta": { + "type": "object", + "additionalProperties": false, + "properties": { + "last_updated_at": { + "type": ["string", "null"] + }, + "total_rows_directory_items": { + "type": "integer" + }, + "load_more_directory_items": { + "type": "string" + } + }, + "required": [ + "last_updated_at", + "total_rows_directory_items", + "load_more_directory_items" + ] + } + }, + "required": ["directory_items", "meta"] + } + } + } + } + } + } + }, + "/admin/users/{id}.json": { + "get": { + "summary": "Get a user by id", + "tags": ["Users", "Admin"], + "operationId": "adminGetUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "avatar_template": { + "type": "string" + }, + "active": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "moderator": { + "type": "boolean" + }, + "last_seen_at": { + "type": ["string", "null"] + }, + "last_emailed_at": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "last_seen_age": { + "type": ["number", "null"] + }, + "last_emailed_age": { + "type": ["number", "null"] + }, + "created_at_age": { + "type": ["number", "null"] + }, + "trust_level": { + "type": "integer" + }, + "manual_locked_trust_level": { + "type": ["string", "null"] + }, + "title": { + "type": ["string", "null"] + }, + "time_read": { + "type": "integer" + }, + "staged": { + "type": "boolean" + }, + "days_visited": { + "type": "integer" + }, + "posts_read_count": { + "type": "integer" + }, + "topics_entered": { + "type": "integer" + }, + "post_count": { + "type": "integer" + }, + "associated_accounts": { + "type": "array", + "items": {} + }, + "can_send_activation_email": { + "type": "boolean" + }, + "can_activate": { + "type": "boolean" + }, + "can_deactivate": { + "type": "boolean" + }, + "ip_address": { + "type": "string" + }, + "registration_ip_address": { + "type": ["string", "null"] + }, + "can_grant_admin": { + "type": "boolean" + }, + "can_revoke_admin": { + "type": "boolean" + }, + "can_grant_moderation": { + "type": "boolean" + }, + "can_revoke_moderation": { + "type": "boolean" + }, + "can_impersonate": { + "type": "boolean" + }, + "like_count": { + "type": "integer" + }, + "like_given_count": { + "type": "integer" + }, + "topic_count": { + "type": "integer" + }, + "flags_given_count": { + "type": "integer" + }, + "flags_received_count": { + "type": "integer" + }, + "private_topics_count": { + "type": "integer" + }, + "can_delete_all_posts": { + "type": "boolean" + }, + "can_be_deleted": { + "type": "boolean" + }, + "can_be_anonymized": { + "type": "boolean" + }, + "can_be_merged": { + "type": "boolean" + }, + "full_suspend_reason": { + "type": ["string", "null"] + }, + "latest_export": { + "type": ["object", "null"] + }, + "silence_reason": { + "type": ["string", "null"] + }, + "post_edits_count": { + "type": ["integer", "null"] + }, + "primary_group_id": { + "type": ["integer", "null"] + }, + "badge_count": { + "type": "integer" + }, + "warnings_received_count": { + "type": "integer" + }, + "bounce_score": { + "type": ["integer", "null"] + }, + "reset_bounce_score_after": { + "type": ["string", "null"] + }, + "can_view_action_logs": { + "type": "boolean" + }, + "can_disable_second_factor": { + "type": "boolean" + }, + "can_delete_sso_record": { + "type": "boolean" + }, + "api_key_count": { + "type": "integer" + }, + "similar_users_count": { + "type": "integer" + }, + "single_sign_on_record": { + "type": ["string", "null"] + }, + "approved_by": { + "type": ["object", "null"], + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + }, + "required": ["id", "username", "name", "avatar_template"] + }, + "suspended_by": { + "type": ["string", "null"] + }, + "silenced_by": { + "type": ["string", "null"] + }, + "penalty_counts": { + "type": "object", + "additionalProperties": false, + "properties": { + "silenced": { + "type": "integer" + }, + "suspended": { + "type": "integer" + } + }, + "required": ["silenced", "suspended"] + }, + "next_penalty": { + "type": "string" + }, + "tl3_requirements": { + "type": "object", + "additionalProperties": false, + "properties": { + "time_period": { + "type": "integer" + }, + "requirements_met": { + "type": "boolean" + }, + "requirements_lost": { + "type": "boolean" + }, + "trust_level_locked": { + "type": "boolean" + }, + "on_grace_period": { + "type": "boolean" + }, + "days_visited": { + "type": "integer" + }, + "min_days_visited": { + "type": "integer" + }, + "num_topics_replied_to": { + "type": "integer" + }, + "min_topics_replied_to": { + "type": "integer" + }, + "topics_viewed": { + "type": "integer" + }, + "min_topics_viewed": { + "type": "integer" + }, + "posts_read": { + "type": "integer" + }, + "min_posts_read": { + "type": "integer" + }, + "topics_viewed_all_time": { + "type": "integer" + }, + "min_topics_viewed_all_time": { + "type": "integer" + }, + "posts_read_all_time": { + "type": "integer" + }, + "min_posts_read_all_time": { + "type": "integer" + }, + "num_flagged_posts": { + "type": "integer" + }, + "max_flagged_posts": { + "type": "integer" + }, + "num_flagged_by_users": { + "type": "integer" + }, + "max_flagged_by_users": { + "type": "integer" + }, + "num_likes_given": { + "type": "integer" + }, + "min_likes_given": { + "type": "integer" + }, + "num_likes_received": { + "type": "integer" + }, + "min_likes_received": { + "type": "integer" + }, + "num_likes_received_days": { + "type": "integer" + }, + "min_likes_received_days": { + "type": "integer" + }, + "num_likes_received_users": { + "type": "integer" + }, + "min_likes_received_users": { + "type": "integer" + }, + "penalty_counts": { + "type": "object", + "additionalProperties": false, + "properties": { + "silenced": { + "type": "integer" + }, + "suspended": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "required": ["silenced", "suspended", "total"] + } + }, + "required": [ + "time_period", + "requirements_met", + "requirements_lost", + "trust_level_locked", + "on_grace_period", + "days_visited", + "min_days_visited", + "num_topics_replied_to", + "min_topics_replied_to", + "topics_viewed", + "min_topics_viewed", + "posts_read", + "min_posts_read", + "topics_viewed_all_time", + "min_topics_viewed_all_time", + "posts_read_all_time", + "min_posts_read_all_time", + "num_flagged_posts", + "max_flagged_posts", + "num_flagged_by_users", + "max_flagged_by_users", + "num_likes_given", + "min_likes_given", + "num_likes_received", + "min_likes_received", + "num_likes_received_days", + "min_likes_received_days", + "num_likes_received_users", + "min_likes_received_users", + "penalty_counts" + ] + }, + "groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "automatic": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "user_count": { + "type": "integer" + }, + "mentionable_level": { + "type": "integer" + }, + "messageable_level": { + "type": "integer" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "grant_trust_level": { + "type": ["string", "null"] + }, + "incoming_email": { + "type": ["string", "null"] + }, + "has_messages": { + "type": "boolean" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "bio_raw": { + "type": ["string", "null"] + }, + "bio_cooked": { + "type": ["string", "null"] + }, + "bio_excerpt": { + "type": ["string", "null"] + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "allow_membership_requests": { + "type": "boolean" + }, + "full_name": { + "type": ["string", "null"] + }, + "default_notification_level": { + "type": "integer" + }, + "membership_request_template": { + "type": ["string", "null"] + }, + "members_visibility_level": { + "type": "integer" + }, + "can_see_members": { + "type": "boolean" + }, + "can_admin_group": { + "type": "boolean" + }, + "publish_read_state": { + "type": "boolean" + } + }, + "required": [ + "id", + "automatic", + "name", + "display_name", + "user_count", + "mentionable_level", + "messageable_level", + "visibility_level", + "primary_group", + "title", + "grant_trust_level", + "incoming_email", + "has_messages", + "flair_url", + "flair_bg_color", + "flair_color", + "bio_raw", + "bio_cooked", + "bio_excerpt", + "public_admission", + "public_exit", + "allow_membership_requests", + "full_name", + "default_notification_level", + "membership_request_template", + "members_visibility_level", + "can_see_members", + "can_admin_group", + "publish_read_state" + ] + } + }, + "external_ids": { + "type": "object" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "active", + "admin", + "moderator", + "last_seen_at", + "last_emailed_at", + "created_at", + "last_seen_age", + "last_emailed_age", + "created_at_age", + "trust_level", + "manual_locked_trust_level", + "title", + "time_read", + "staged", + "days_visited", + "posts_read_count", + "topics_entered", + "post_count", + "can_send_activation_email", + "can_activate", + "can_deactivate", + "ip_address", + "registration_ip_address", + "can_grant_admin", + "can_revoke_admin", + "can_grant_moderation", + "can_revoke_moderation", + "can_impersonate", + "like_count", + "like_given_count", + "topic_count", + "flags_given_count", + "flags_received_count", + "private_topics_count", + "can_delete_all_posts", + "can_be_anonymized", + "can_be_merged", + "full_suspend_reason", + "primary_group_id", + "badge_count", + "warnings_received_count", + "bounce_score", + "reset_bounce_score_after", + "can_view_action_logs", + "can_disable_second_factor", + "can_delete_sso_record", + "api_key_count", + "single_sign_on_record", + "approved_by", + "suspended_by", + "silenced_by", + "groups", + "external_ids" + ] + } + } + } + } + } + }, + "delete": { + "summary": "Delete a user", + "tags": ["Users", "Admin"], + "operationId": "deleteUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "deleted": { + "type": "boolean" + } + }, + "required": ["deleted"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "delete_posts": { + "type": "boolean" + }, + "block_email": { + "type": "boolean" + }, + "block_urls": { + "type": "boolean" + }, + "block_ip": { + "type": "boolean" + } + } + } + } + } + } + } + }, + "/admin/users/{id}/activate.json": { + "put": { + "summary": "Activate a user", + "tags": ["Users", "Admin"], + "operationId": "activateUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string", + "example": "OK" + } + }, + "required": ["success"] + } + } + } + } + } + } + }, + "/admin/users/{id}/deactivate.json": { + "put": { + "summary": "Deactivate a user", + "tags": ["Users", "Admin"], + "operationId": "deactivateUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string", + "example": "OK" + } + }, + "required": ["success"] + } + } + } + } + } + } + }, + "/admin/users/{id}/suspend.json": { + "put": { + "summary": "Suspend a user", + "tags": ["Users", "Admin"], + "operationId": "suspendUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "suspension": { + "type": "object", + "additionalProperties": false, + "properties": { + "suspend_reason": { + "type": "string" + }, + "full_suspend_reason": { + "type": "string" + }, + "suspended_till": { + "type": "string" + }, + "suspended_at": { + "type": "string" + }, + "suspended_by": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template" + ] + } + }, + "required": [ + "suspend_reason", + "full_suspend_reason", + "suspended_till", + "suspended_at", + "suspended_by" + ] + } + }, + "required": ["suspension"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "suspend_until": { + "type": "string", + "example": "2121-02-22" + }, + "reason": { + "type": "string" + }, + "message": { + "type": "string", + "description": "Will send an email with this message when present" + }, + "post_action": { + "type": "string", + "example": "delete" + } + }, + "required": ["suspend_until", "reason"] + } + } + } + } + } + }, + "/admin/users/{id}/silence.json": { + "put": { + "summary": "Silence a user", + "tags": ["Users", "Admin"], + "operationId": "silenceUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "silence": { + "type": "object", + "additionalProperties": false, + "properties": { + "silenced": { + "type": "boolean" + }, + "silence_reason": { + "type": "string" + }, + "silenced_till": { + "type": "string" + }, + "silenced_at": { + "type": "string" + }, + "silenced_by": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template" + ] + } + }, + "required": [ + "silenced", + "silence_reason", + "silenced_till", + "silenced_at", + "silenced_by" + ] + } + }, + "required": ["silence"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "silenced_till": { + "type": "string", + "example": "2022-06-01T08:00:00.000Z" + }, + "reason": { + "type": "string" + }, + "message": { + "type": "string", + "description": "Will send an email with this message when present" + }, + "post_action": { + "type": "string", + "example": "delete" + } + }, + "required": ["silenced_till", "reason"] + } + } + } + } + } + }, + "/admin/users/{id}/anonymize.json": { + "put": { + "summary": "Anonymize a user", + "tags": ["Users", "Admin"], + "operationId": "anonymizeUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": ["success", "username"] + } + } + } + } + } + } + }, + "/admin/users/{id}/log_out.json": { + "post": { + "summary": "Log a user out", + "tags": ["Users", "Admin"], + "operationId": "logOutUser", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string", + "example": "OK" + } + }, + "required": ["success"] + } + } + } + } + } + } + }, + "/user_avatar/{username}/refresh_gravatar.json": { + "post": { + "summary": "Refresh gravatar", + "tags": ["Users", "Admin"], + "operationId": "refreshGravatar", + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "gravatar_upload_id": { + "type": ["integer", "null"] + }, + "gravatar_avatar_template": { + "type": ["string", "null"] + } + }, + "required": ["gravatar_upload_id", "gravatar_avatar_template"] + } + } + } + } + } + } + }, + "/admin/users/list/{flag}.json": { + "get": { + "summary": "Get a list of users", + "tags": ["Users", "Admin"], + "operationId": "adminListUsers", + "parameters": [ + { + "name": "flag", + "in": "path", + "schema": { + "type": "string", + "enum": [ + "active", + "new", + "staff", + "suspended", + "blocked", + "suspect" + ] + }, + "required": true + }, + { + "name": "order", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "created", + "last_emailed", + "seen", + "username", + "email", + "trust_level", + "days_visited", + "posts_read", + "topics_viewed", + "posts", + "read_time" + ] + } + }, + { + "name": "asc", + "in": "query", + "schema": { + "type": "string", + "enum": ["true"] + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer" + } + }, + { + "name": "show_emails", + "in": "query", + "description": "Include user email addresses in response. These requests will\nbe logged in the staff action logs.", + "schema": { + "type": "boolean" + } + }, + { + "name": "stats", + "in": "query", + "description": "Include user stats information", + "schema": { + "type": "boolean" + } + }, + { + "name": "email", + "in": "query", + "description": "Filter to the user with this email address", + "schema": { + "type": "string" + } + }, + { + "name": "ip", + "in": "query", + "description": "Filter to users with this IP address", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "avatar_template": { + "type": "string" + }, + "email": { + "type": "string" + }, + "secondary_emails": { + "type": "array", + "items": {} + }, + "active": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "moderator": { + "type": "boolean" + }, + "last_seen_at": { + "type": ["string", "null"] + }, + "last_emailed_at": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "last_seen_age": { + "type": ["number", "null"] + }, + "last_emailed_age": { + "type": ["number", "null"] + }, + "created_at_age": { + "type": ["number", "null"] + }, + "trust_level": { + "type": "integer" + }, + "manual_locked_trust_level": { + "type": ["string", "null"] + }, + "title": { + "type": ["string", "null"] + }, + "time_read": { + "type": "integer" + }, + "staged": { + "type": "boolean" + }, + "days_visited": { + "type": "integer" + }, + "posts_read_count": { + "type": "integer" + }, + "topics_entered": { + "type": "integer" + }, + "post_count": { + "type": "integer" + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "active", + "admin", + "moderator", + "last_seen_at", + "last_emailed_at", + "created_at", + "last_seen_age", + "last_emailed_age", + "created_at_age", + "trust_level", + "manual_locked_trust_level", + "title", + "time_read", + "staged", + "days_visited", + "posts_read_count", + "topics_entered", + "post_count" + ] + } + } + } + } + } + } + } + }, + "/user_actions.json": { + "get": { + "summary": "Get a list of user actions", + "tags": ["Users"], + "operationId": "listUserActions", + "parameters": [ + { + "name": "offset", + "in": "query", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "username", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "filter", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "user_actions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "excerpt": { + "type": "string" + }, + "action_type": { + "type": "integer" + }, + "created_at": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "acting_avatar_template": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "topic_id": { + "type": "integer" + }, + "target_user_id": { + "type": "integer" + }, + "target_name": { + "type": ["string", "null"] + }, + "target_username": { + "type": "string" + }, + "post_number": { + "type": "integer" + }, + "post_id": { + "type": ["string", "null"] + }, + "username": { + "type": "string" + }, + "name": { + "type": ["string", "null"] + }, + "user_id": { + "type": "integer" + }, + "acting_username": { + "type": "string" + }, + "acting_name": { + "type": ["string", "null"] + }, + "acting_user_id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "hidden": { + "type": ["string", "null"] + }, + "post_type": { + "type": ["string", "null"] + }, + "action_code": { + "type": ["string", "null"] + }, + "category_id": { + "type": "integer" + }, + "closed": { + "type": "boolean" + }, + "archived": { + "type": "boolean" + } + }, + "required": [ + "excerpt", + "action_type", + "created_at", + "avatar_template", + "acting_avatar_template", + "slug", + "topic_id", + "target_user_id", + "target_name", + "target_username", + "post_number", + "post_id", + "username", + "name", + "user_id", + "acting_username", + "acting_name", + "acting_user_id", + "title", + "deleted", + "hidden", + "post_type", + "action_code", + "category_id", + "closed", + "archived" + ] + } + } + }, + "required": ["user_actions"] + } + } + } + } + } + } + }, + "/session/forgot_password.json": { + "post": { + "summary": "Send password reset email", + "tags": ["Users"], + "operationId": "sendPasswordResetEmail", + "parameters": [], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "success": { + "type": "string" + }, + "user_found": { + "type": "boolean" + } + }, + "required": ["success", "user_found"] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "login": { + "type": "string" + } + }, + "required": ["login"] + } + } + } + } + } + }, + "/users/password-reset/{token}.json": { + "put": { + "summary": "Change password", + "tags": ["Users"], + "operationId": "changePassword", + "parameters": [ + { + "name": "token", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "success response" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": ["username", "password"] + } + } + } + } + } + }, + "/u/{username}/emails.json": { + "get": { + "summary": "Get email addresses belonging to a user", + "tags": ["Users"], + "operationId": "getUserEmails", + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "success response", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "email": { + "type": "string" + }, + "secondary_emails": { + "type": "array", + "items": {} + }, + "unconfirmed_emails": { + "type": "array", + "items": {} + }, + "associated_accounts": { + "type": "array", + "items": {} + } + }, + "required": [ + "email", + "secondary_emails", + "unconfirmed_emails", + "associated_accounts" + ] + } + } + } + } + } + } + }, + "/chat/{channel_id}": { + "post": { + "summary": "Send a message to a chat channel", + "operationId": "sendMessage", + "tags": ["Chat"], + "parameters": [ + { + "name": "channel_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 23 + } + } + ], + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "hello world" + }, + "staged_id": { + "type": "string", + "nullable": true + }, + "in_reply_to_id": { + "type": "integer", + "nullable": true + }, + "thread_id": { + "type": "integer", + "nullable": true + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Message sent successfully", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string" + }, + "message_id": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "/chat/api/channels/{channel_id}/threads/{thread_id}": { + "get": { + "summary": "Get thread details", + "operationId": "getThread", + "tags": ["Thread"], + "parameters": [ + { + "name": "channel_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 2 + } + }, + { + "name": "thread_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 89 + } + } + ], + "responses": { + "200": { + "description": "Thread info", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true, + "properties": { + "thread": { + "type": "object", + "additionalProperties": true, + "properties": { + "id": { + "type": ["integer", "null"] + }, + "title": { + "type": ["string", "null"] + }, + "status": { + "type": ["string", "null"] + }, + "channel_id": { + "type": ["integer", "null"] + }, + "meta": { + "type": "object", + "additionalProperties": true + }, + "reply_count": { + "type": ["integer", "null"] + }, + "current_user_membership": { + "type": "object", + "additionalProperties": true + }, + "preview": { + "type": "object", + "additionalProperties": true + }, + "last_message_id": { + "type": ["integer", "null"] + }, + "force": { + "type": ["boolean", "null"] + }, + "original_message": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, + "example": { + "thread": { + "id": 89, + "title": null, + "status": "open", + "channel_id": 2, + "meta": { + "message_bus_last_ids": { + "thread_message_bus_last_id": 2 + } + }, + "reply_count": 1, + "current_user_membership": { + "notification_level": 2, + "thread_id": 89, + "last_read_message_id": 4248, + "thread_title_prompt_seen": false + }, + "preview": { + "last_reply_created_at": "2025-05-23T04:21:48Z", + "last_reply_excerpt": "tred", + "last_reply_id": 4248, + "participant_count": 2, + "reply_count": 1, + "participant_users": [ + { + "id": 24, + "username": "zenix", + "name": "Zenith", + "avatar_template": "/user_avatar/.../zenix/{size}/271_2.png" + }, + { + "id": 1, + "username": "twa", + "name": "Anirudh Sriram", + "avatar_template": "/user_avatar/.../twa/{size}/70_2.png" + } + ], + "last_reply_user": { + "id": 1, + "username": "twa", + "name": "Anirudh Sriram", + "avatar_template": "/user_avatar/.../twa/{size}/70_2.png" + } + }, + "last_message_id": 4248, + "force": false, + "original_message": { + "id": 4235, + "message": "okay, same answer: i'm good.", + "cooked": "

okay, same answer: i'm good.

", + "created_at": "2025-05-23T04:15:15.655Z", + "excerpt": "okay, same answer: i'm good.", + "chat_channel_id": 2, + "deleted_at": null, + "mentioned_users": [], + "user": { + "id": 24, + "username": "zenix", + "name": "Zenith", + "avatar_template": "/user_avatar/.../zenix/{size}/271_2.png", + "can_chat": null, + "has_chat_enabled": null + } + } + } + } + } + } + } + } + } + }, + "/chat/api/channels/{channel_id}/messages/{message_id}": { + "put": { + "summary": "Edit an existing message", + "operationId": "editMessage", + "tags": ["Chat"], + "parameters": [ + { + "name": "channel_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 23 + } + }, + { + "name": "message_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 4050 + } + } + ], + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "updated text" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Message updated", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string" + }, + "message_id": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "/chat/api/channels/{channel_id}/messages": { + "get": { + "summary": "Fetch chat messages", + "operationId": "getMessages", + "tags": ["Chat"], + "parameters": [ + { + "name": "channel_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 23 + } + }, + { + "name": "fetch_from_last_read", + "in": "query", + "schema": { + "type": "boolean", + "example": true + } + }, + { + "name": "page_size", + "in": "query", + "schema": { + "type": "integer", + "example": 50 + } + }, + { + "name": "target_message_id", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "example": 1234 + } + } + ], + "responses": { + "200": { + "description": "A page of messages", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "messages": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "message": { + "type": "string" + }, + "cooked": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "chat_channel_id": { + "type": "integer" + }, + "streaming": { + "type": "boolean" + }, + "user": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "staff": { + "type": "boolean" + } + } + }, + "mentioned_users": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + } + } + } + }, + "available_flags": { + "type": "array", + "items": { + "type": ["string", "null"] + } + }, + "uploads": { + "type": "array", + "items": { + "type": "object" + } + }, + "edited": { + "type": "boolean" + }, + "blocks": { + "type": "array", + "items": { + "type": "object" + } + }, + "chat_webhook_event": { + "type": ["object", "null"] + } + } + } + }, + "tracking": { + "type": ["object", "null"] + }, + "meta": { + "type": ["object", "null"] + } + } + } + } + } + } + } + } + }, + "/chat/api/channels/{channel_id}/threads/{thread_id}/messages": { + "get": { + "summary": "Fetch thread messages", + "operationId": "getThreadMessages", + "tags": ["Thread"], + "parameters": [ + { + "name": "channel_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 42 + } + }, + { + "name": "thread_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 99 + } + }, + { + "name": "target_message_id", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "example": 100 + }, + "description": "Start fetching from this message ID" + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "example": 20 + } + } + ], + "responses": { + "200": { + "description": "A page of messages in the thread", + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true, + "properties": { + "messages": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true, + "properties": { + "id": { + "type": ["integer", "null"] + }, + "message": { + "type": ["string", "null"] + }, + "cooked": { + "type": ["string", "null"] + }, + "created_at": { + "type": ["string", "null"], + "format": "date-time" + }, + "thread_id": { + "type": ["integer", "null"] + }, + "chat_channel_id": { + "type": ["integer", "null"] + }, + "user": { + "type": "object", + "additionalProperties": true + }, + "available_flags": { + "type": "array", + "items": { + "type": ["string", "null"] + } + } + } + } + }, + "tracking": { + "type": ["object", "null"], + "additionalProperties": true + }, + "meta": { + "type": "object", + "additionalProperties": true, + "properties": { + "target_message_id": { + "type": ["integer", "null"] + }, + "can_load_more_future": { + "type": ["boolean", "null"] + }, + "can_load_more_past": { + "type": ["boolean", "null"] + } + } + } + } + }, + "example": { + "messages": [ + { + "id": 1, + "message": "Hello, world!", + "cooked": "

Hello, world!

", + "created_at": "2025-05-23T10:00:00Z", + "thread_id": 99, + "chat_channel_id": 42, + "user": { + "id": 100, + "username": "user1", + "name": "User One", + "avatar_template": "/user_avatar/example.com/user1/{size}.png" + }, + "available_flags": ["flag1", null] + }, + { + "id": 2, + "message": "Reply to hello", + "cooked": "

Reply to hello

", + "created_at": "2025-05-23T10:01:00Z", + "thread_id": 99, + "chat_channel_id": 42, + "user": { + "id": 101, + "username": "user2", + "name": "User Two", + "avatar_template": "/user_avatar/example.com/user2/{size}.png" + }, + "available_flags": [] + } + ], + "tracking": {}, + "meta": { + "target_message_id": 100, + "can_load_more_future": false, + "can_load_more_past": true + } + } + } + } + } + } + } + }, + "/chat/{channel_id}/react/{message_id}": { + "put": { + "summary": "React to a message", + "operationId": "reactToMessage", + "tags": ["Chat"], + "parameters": [ + { + "name": "channel_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 23 + } + }, + { + "name": "message_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "example": 4051 + } + } + ], + "requestBody": { + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "type": "object", + "properties": { + "react_action": { + "type": "string", + "example": "add" + }, + "emoji": { + "type": "string", + "example": "heart" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Reaction added/removed", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "/u/{username}/card.json": { + "get": { + "summary": "Fetch a user card", + "operationId": "getUserCard", + "tags": ["User"], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string", + "example": "winter" + } + } + ], + "responses": { + "200": { + "description": "User card with badges & metadata", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + } + } + } + }, + "/session/current.json": { + "get": { + "summary": "Get current session info", + "operationId": "getSession", + "tags": ["Session"], + "responses": { + "200": { + "description": "Authenticated User Session Data", + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "current_user": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar_template": { + "type": "string" + }, + "last_posted_at": { + "type": ["string", "null"] + }, + "last_seen_at": { + "type": ["string", "null"] + }, + "created_at": { + "type": "string" + }, + "ignored": { + "type": "boolean" + }, + "muted": { + "type": "boolean" + }, + "can_ignore_user": { + "type": "boolean" + }, + "can_ignore_users": { + "type": "boolean" + }, + "can_mute_user": { + "type": "boolean" + }, + "can_mute_users": { + "type": "boolean" + }, + "can_send_private_messages": { + "type": "boolean" + }, + "can_send_private_message_to_user": { + "type": "boolean" + }, + "trust_level": { + "type": "integer" + }, + "moderator": { + "type": "boolean" + }, + "admin": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "badge_count": { + "type": "integer" + }, + "second_factor_backup_enabled": { + "type": "boolean" + }, + "user_fields": { + "type": "object", + "additionalProperties": false, + "properties": { + "1": { + "type": ["string", "null"] + }, + "2": { + "type": ["string", "null"] + } + }, + "required": ["1", "2"] + }, + "custom_fields": { + "type": "object", + "additionalProperties": false, + "properties": { + "first_name": { + "type": ["string", "null"] + } + } + }, + "time_read": { + "type": "integer" + }, + "recent_time_read": { + "type": "integer" + }, + "primary_group_id": { + "type": ["integer", "null"] + }, + "primary_group_name": { + "type": ["string", "null"] + }, + "flair_group_id": { + "type": ["integer", "null"] + }, + "flair_name": { + "type": ["string", "null"] + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "featured_topic": { + "type": ["string", "null"] + }, + "staged": { + "type": "boolean" + }, + "can_edit": { + "type": "boolean" + }, + "can_edit_username": { + "type": "boolean" + }, + "can_edit_email": { + "type": "boolean" + }, + "can_edit_name": { + "type": "boolean" + }, + "uploaded_avatar_id": { + "type": ["integer", "null"] + }, + "has_title_badges": { + "type": "boolean" + }, + "pending_count": { + "type": "integer" + }, + "pending_posts_count": { + "type": "integer" + }, + "profile_view_count": { + "type": "integer" + }, + "second_factor_enabled": { + "type": "boolean" + }, + "can_upload_profile_header": { + "type": "boolean" + }, + "can_upload_user_card_background": { + "type": "boolean" + }, + "post_count": { + "type": "integer" + }, + "can_be_deleted": { + "type": "boolean" + }, + "can_delete_all_posts": { + "type": "boolean" + }, + "locale": { + "type": ["string", "null"] + }, + "muted_category_ids": { + "type": "array", + "items": {} + }, + "regular_category_ids": { + "type": "array", + "items": {} + }, + "watched_tags": { + "type": "array", + "items": {} + }, + "watching_first_post_tags": { + "type": "array", + "items": {} + }, + "tracked_tags": { + "type": "array", + "items": {} + }, + "muted_tags": { + "type": "array", + "items": {} + }, + "tracked_category_ids": { + "type": "array", + "items": {} + }, + "watched_category_ids": { + "type": "array", + "items": {} + }, + "watched_first_post_category_ids": { + "type": "array", + "items": {} + }, + "system_avatar_upload_id": { + "type": ["string", "null"] + }, + "system_avatar_template": { + "type": "string" + }, + "muted_usernames": { + "type": "array", + "items": {} + }, + "ignored_usernames": { + "type": "array", + "items": {} + }, + "allowed_pm_usernames": { + "type": "array", + "items": {} + }, + "mailing_list_posts_per_day": { + "type": "integer" + }, + "can_change_bio": { + "type": "boolean" + }, + "can_change_location": { + "type": "boolean" + }, + "can_change_website": { + "type": "boolean" + }, + "can_change_tracking_preferences": { + "type": "boolean" + }, + "user_api_keys": { + "type": ["string", "null"] + }, + "user_passkeys": { + "type": "array" + }, + "sidebar_tags": { + "type": "array" + }, + "sidebar_category_ids": { + "type": "array" + }, + "display_sidebar_tags": { + "type": "boolean" + }, + "can_pick_theme_with_custom_homepage": { + "type": "boolean" + }, + "user_auth_tokens": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "client_ip": { + "type": "string" + }, + "location": { + "type": "string" + }, + "browser": { + "type": "string" + }, + "device": { + "type": "string" + }, + "os": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "seen_at": { + "type": "string" + }, + "is_active": { + "type": "boolean" + } + }, + "required": [ + "id", + "client_ip", + "location", + "browser", + "device", + "os", + "icon", + "created_at", + "seen_at", + "is_active" + ] + } + }, + "user_notification_schedule": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "day_0_start_time": { + "type": "integer" + }, + "day_0_end_time": { + "type": "integer" + }, + "day_1_start_time": { + "type": "integer" + }, + "day_1_end_time": { + "type": "integer" + }, + "day_2_start_time": { + "type": "integer" + }, + "day_2_end_time": { + "type": "integer" + }, + "day_3_start_time": { + "type": "integer" + }, + "day_3_end_time": { + "type": "integer" + }, + "day_4_start_time": { + "type": "integer" + }, + "day_4_end_time": { + "type": "integer" + }, + "day_5_start_time": { + "type": "integer" + }, + "day_5_end_time": { + "type": "integer" + }, + "day_6_start_time": { + "type": "integer" + }, + "day_6_end_time": { + "type": "integer" + } + }, + "required": [ + "enabled", + "day_0_start_time", + "day_0_end_time", + "day_1_start_time", + "day_1_end_time", + "day_2_start_time", + "day_2_end_time", + "day_3_start_time", + "day_3_end_time", + "day_4_start_time", + "day_4_end_time", + "day_5_start_time", + "day_5_end_time", + "day_6_start_time", + "day_6_end_time" + ] + }, + "use_logo_small_as_avatar": { + "type": "boolean" + }, + "featured_user_badge_ids": { + "type": "array", + "items": {} + }, + "invited_by": { + "type": ["string", "null"] + }, + "groups": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "integer" + }, + "automatic": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "user_count": { + "type": "integer" + }, + "mentionable_level": { + "type": "integer" + }, + "messageable_level": { + "type": "integer" + }, + "visibility_level": { + "type": "integer" + }, + "primary_group": { + "type": "boolean" + }, + "title": { + "type": ["string", "null"] + }, + "grant_trust_level": { + "type": ["string", "null"] + }, + "incoming_email": { + "type": ["string", "null"] + }, + "has_messages": { + "type": "boolean" + }, + "flair_url": { + "type": ["string", "null"] + }, + "flair_bg_color": { + "type": ["string", "null"] + }, + "flair_color": { + "type": ["string", "null"] + }, + "bio_raw": { + "type": ["string", "null"] + }, + "bio_cooked": { + "type": ["string", "null"] + }, + "bio_excerpt": { + "type": ["string", "null"] + }, + "public_admission": { + "type": "boolean" + }, + "public_exit": { + "type": "boolean" + }, + "allow_membership_requests": { + "type": "boolean" + }, + "full_name": { + "type": ["string", "null"] + }, + "default_notification_level": { + "type": "integer" + }, + "membership_request_template": { + "type": ["string", "null"] + }, + "members_visibility_level": { + "type": "integer" + }, + "can_see_members": { + "type": "boolean" + }, + "can_admin_group": { + "type": "boolean" + }, + "publish_read_state": { + "type": "boolean" + } + }, + "required": [ + "id", + "automatic", + "name", + "display_name", + "user_count", + "mentionable_level", + "messageable_level", + "visibility_level", + "primary_group", + "title", + "grant_trust_level", + "incoming_email", + "has_messages", + "flair_url", + "flair_bg_color", + "flair_color", + "bio_raw", + "bio_cooked", + "bio_excerpt", + "public_admission", + "public_exit", + "allow_membership_requests", + "full_name", + "default_notification_level", + "membership_request_template", + "members_visibility_level", + "can_see_members", + "can_admin_group", + "publish_read_state" + ] + } + }, + "group_users": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "group_id": { + "type": "integer" + }, + "user_id": { + "type": "integer" + }, + "notification_level": { + "type": "integer" + }, + "owner": { + "type": "boolean" + } + }, + "required": [ + "group_id", + "user_id", + "notification_level" + ] + } + }, + "user_option": { + "type": "object", + "additionalProperties": false, + "properties": { + "user_id": { + "type": "integer" + }, + "mailing_list_mode": { + "type": "boolean" + }, + "mailing_list_mode_frequency": { + "type": "integer" + }, + "email_digests": { + "type": "boolean" + }, + "email_level": { + "type": "integer" + }, + "email_messages_level": { + "type": "integer" + }, + "external_links_in_new_tab": { + "type": "boolean" + }, + "bookmark_auto_delete_preference": { + "type": "integer" + }, + "color_scheme_id": { + "type": ["string", "null"] + }, + "dark_scheme_id": { + "type": ["string", "null"] + }, + "dynamic_favicon": { + "type": "boolean" + }, + "enable_quoting": { + "type": "boolean" + }, + "enable_smart_lists": { + "type": "boolean" + }, + "enable_defer": { + "type": "boolean" + }, + "digest_after_minutes": { + "type": "integer" + }, + "automatically_unpin_topics": { + "type": "boolean" + }, + "auto_track_topics_after_msecs": { + "type": "integer" + }, + "notification_level_when_replying": { + "type": "integer" + }, + "new_topic_duration_minutes": { + "type": "integer" + }, + "email_previous_replies": { + "type": "integer" + }, + "email_in_reply_to": { + "type": "boolean" + }, + "like_notification_frequency": { + "type": "integer" + }, + "include_tl0_in_digests": { + "type": "boolean" + }, + "theme_ids": { + "type": "array", + "items": {} + }, + "theme_key_seq": { + "type": "integer" + }, + "allow_private_messages": { + "type": "boolean" + }, + "enable_allowed_pm_users": { + "type": "boolean" + }, + "homepage_id": { + "type": ["string", "null"] + }, + "hide_profile_and_presence": { + "type": "boolean" + }, + "hide_profile": { + "type": "boolean" + }, + "hide_presence": { + "type": "boolean" + }, + "text_size": { + "type": "string" + }, + "text_size_seq": { + "type": "integer" + }, + "title_count_mode": { + "type": "string" + }, + "timezone": { + "type": ["string", "null"] + }, + "skip_new_user_tips": { + "type": "boolean" + }, + "default_calendar": { + "type": "string" + }, + "oldest_search_log_date": { + "type": ["string", "null"] + }, + "sidebar_link_to_filtered_list": { + "type": "boolean" + }, + "sidebar_show_count_of_new_items": { + "type": "boolean" + }, + "watched_precedence_over_muted": { + "type": ["boolean", "null"] + }, + "seen_popups": { + "type": ["array", "null"] + }, + "topics_unread_when_closed": { + "type": "boolean" + } + }, + "required": [ + "user_id", + "mailing_list_mode", + "mailing_list_mode_frequency", + "email_digests", + "email_level", + "email_messages_level", + "external_links_in_new_tab", + "color_scheme_id", + "dark_scheme_id", + "dynamic_favicon", + "enable_quoting", + "enable_smart_lists", + "enable_defer", + "digest_after_minutes", + "automatically_unpin_topics", + "auto_track_topics_after_msecs", + "notification_level_when_replying", + "new_topic_duration_minutes", + "email_previous_replies", + "email_in_reply_to", + "like_notification_frequency", + "include_tl0_in_digests", + "theme_ids", + "theme_key_seq", + "allow_private_messages", + "enable_allowed_pm_users", + "homepage_id", + "hide_profile_and_presence", + "hide_profile", + "hide_presence", + "text_size", + "text_size_seq", + "title_count_mode", + "timezone", + "skip_new_user_tips", + "topics_unread_when_closed" + ] + } + }, + "required": [ + "id", + "username", + "name", + "avatar_template", + "last_posted_at", + "last_seen_at", + "created_at", + "ignored", + "muted", + "can_ignore_user", + "can_mute_user", + "can_send_private_messages", + "can_send_private_message_to_user", + "trust_level", + "moderator", + "admin", + "title", + "badge_count", + "custom_fields", + "time_read", + "recent_time_read", + "primary_group_id", + "primary_group_name", + "flair_group_id", + "flair_name", + "flair_url", + "flair_bg_color", + "flair_color", + "featured_topic", + "staged", + "can_edit", + "can_edit_username", + "can_edit_email", + "can_edit_name", + "uploaded_avatar_id", + "has_title_badges", + "pending_count", + "profile_view_count", + "second_factor_enabled", + "can_upload_profile_header", + "can_upload_user_card_background", + "post_count", + "can_be_deleted", + "can_delete_all_posts", + "locale", + "muted_category_ids", + "regular_category_ids", + "watched_tags", + "watching_first_post_tags", + "tracked_tags", + "muted_tags", + "tracked_category_ids", + "watched_category_ids", + "watched_first_post_category_ids", + "system_avatar_upload_id", + "system_avatar_template", + "muted_usernames", + "ignored_usernames", + "allowed_pm_usernames", + "mailing_list_posts_per_day", + "can_change_bio", + "can_change_location", + "can_change_website", + "can_change_tracking_preferences", + "user_api_keys", + "user_auth_tokens", + "user_notification_schedule", + "use_logo_small_as_avatar", + "featured_user_badge_ids", + "invited_by", + "groups", + "group_users", + "user_option" + ] + } + }, + "required": ["user_badges", "user"] + } + } + } + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "429": { + "description": "Too Many Requests", + "headers": { + "Retry-After": { + "schema": { + "type": "integer" + } + } + } + }, + "500": { + "description": "Internal Server Error" + } + } + } + } + }, + "servers": [ + { + "url": "https://{defaultHost}", + "variables": { + "defaultHost": { + "default": "discourse.example.com" + } + } + } + ], + "components": { + "schemas": {}, + "securitySchemes": { + "ApiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "Api-Key" + } + } + } +} diff --git a/package.json b/package.json index e66182a..1a3cedc 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,54 @@ { - "name": "ai-sdk-slack-chatbot", + "name": "ai-sdk-discourse-chatbot", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { - "build": "tsc", - "start": "node dist/index.js" + "build": "nitro build", + "dev": "nitro dev", + "prepare": "nitro prepare", + "preview": "node .output/server/index.mjs", + "format": "biome format --write .", + "lint": "tsx ./scripts/lint.mts && biome lint .", + "lint:write": "biome lint --write .", + "lint:unsafe": "biome lint --write --unsafe .", + "check": "biome check .", + "check:unsafe": "biome check --write --unsafe .", + "check:write": "biome check --write .", + "openapi-ts": "openapi-ts" }, "keywords": [], "author": "", - "license": "ISC", + "license": "MIT", "dependencies": { "@ai-sdk/openai": "^1.3.22", "@ai-sdk/openai-compatible": "^0.2.14", - "@slack/web-api": "^7.0.2", + "@date-fns/tz": "^1.2.0", + "@hey-api/client-fetch": "^0.10.1", + "@mem0/vercel-ai-provider": "^1.0.5", + "@openrouter/ai-sdk-provider": "^0.4.6", + "@t3-oss/env-core": "^0.13.4", + "@upstash/ratelimit": "^2.0.5", + "@upstash/redis": "^1.34.9", "@vercel/functions": "^2.0.0", "ai": "^4.3.16", + "compromise": "^14.14.4", + "date-fns": "^4.1.0", "discourse2-chat": "^1.1.5", "exa-js": "^1.4.10", + "nitropack": "latest", + "pino": "^9.7.0", + "pino-pretty": "^13.0.0", + "tsx": "^4.19.4", "zod": "^3.24.2" }, "devDependencies": { + "@biomejs/biome": "1.9.4", + "@hey-api/openapi-ts": "^0.67.5", "@types/node": "^20.11.17", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "@types/bun": "latest" }, - "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977" + "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977", + "private": true } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 87aa6b0..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,685 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@ai-sdk/openai': - specifier: ^1.3.22 - version: 1.3.22(zod@3.24.2) - '@ai-sdk/openai-compatible': - specifier: ^0.2.14 - version: 0.2.14(zod@3.24.2) - '@slack/web-api': - specifier: ^7.0.2 - version: 7.8.0 - '@vercel/functions': - specifier: ^2.0.0 - version: 2.0.0 - ai: - specifier: ^4.3.16 - version: 4.3.16(react@19.0.0)(zod@3.24.2) - discourse2-chat: - specifier: ^1.1.5 - version: 1.1.5 - exa-js: - specifier: ^1.4.10 - version: 1.4.10 - zod: - specifier: ^3.24.2 - version: 3.24.2 - devDependencies: - '@types/node': - specifier: ^20.11.17 - version: 20.17.22 - typescript: - specifier: ^5.3.3 - version: 5.8.2 - -packages: - - '@ai-sdk/openai-compatible@0.2.14': - resolution: {integrity: sha512-icjObfMCHKSIbywijaoLdZ1nSnuRnWgMEMLgwoxPJgxsUHMx0aVORnsLUid4SPtdhHI3X2masrt6iaEQLvOSFw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - - '@ai-sdk/openai@1.3.22': - resolution: {integrity: sha512-QwA+2EkG0QyjVR+7h6FE7iOu2ivNqAVMm9UJZkVxxTk5OIq5fFJDTEI/zICEMuHImTTXR2JjsL6EirJ28Jc4cw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.0.0 - - '@ai-sdk/provider-utils@2.2.8': - resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.23.8 - - '@ai-sdk/provider@1.1.3': - resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} - engines: {node: '>=18'} - - '@ai-sdk/react@1.2.12': - resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true - - '@ai-sdk/ui-utils@1.2.11': - resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.23.8 - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@slack/logger@4.0.0': - resolution: {integrity: sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==} - engines: {node: '>= 18', npm: '>= 8.6.0'} - - '@slack/types@2.14.0': - resolution: {integrity: sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - - '@slack/web-api@7.8.0': - resolution: {integrity: sha512-d4SdG+6UmGdzWw38a4sN3lF/nTEzsDxhzU13wm10ejOpPehtmRoqBKnPztQUfFiWbNvSb4czkWYJD4kt+5+Fuw==} - engines: {node: '>= 18', npm: '>= 8.6.0'} - - '@types/diff-match-patch@1.0.36': - resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} - - '@types/node@20.17.22': - resolution: {integrity: sha512-9RV2zST+0s3EhfrMZIhrz2bhuhBwxgkbHEwP2gtGWPjBzVQjifMzJ9exw7aDZhR1wbpj8zBrfp3bo8oJcGiUUw==} - - '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - - '@vercel/functions@2.0.0': - resolution: {integrity: sha512-BSwIihLHoV18gerKZJyGuqd3rtaYM6rJvET1kOwKktshucyaHXTJel7Cxegs+sdX0NZqsX4LO2MFnMU2jG01Cw==} - engines: {node: '>= 18'} - peerDependencies: - '@aws-sdk/credential-provider-web-identity': '*' - peerDependenciesMeta: - '@aws-sdk/credential-provider-web-identity': - optional: true - - ai@4.3.16: - resolution: {integrity: sha512-KUDwlThJ5tr2Vw0A1ZkbDKNME3wzWhuVfAOwIvFUzl1TPVDFAXDFTXio3p+jaKneB+dKNCvFFlolYmmgHttG1g==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - react: - optional: true - - ajv-errors@3.0.0: - resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} - peerDependencies: - ajv: ^8.0.1 - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@1.8.1: - resolution: {integrity: sha512-NN+fvwH/kV01dYUQ3PTOZns4LWtWhOFCAhQ/pHb88WQ1hNe5V/dvFwc4VJcDL11LT9xSX0QtsR8sWUuyOuOq7g==} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - cross-fetch@4.1.0: - resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - - discourse2-chat@1.1.5: - resolution: {integrity: sha512-VbyHRV6C6uyYc5PMbgNjTm0FTm1tb2jJh75wKB+51xC6zhbFoJ8QmxlYHRfuw0Ct9M1xTkwqW8g/176rbx3eSg==} - - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - exa-js@1.4.10: - resolution: {integrity: sha512-rffYWPU568gOiYmsHW3L5J6atoNfLJTrtAk/DAKyPuGtdDXrE9fsSfltP1X1pNVtLTsz8DIyhUHOXErueNLJrQ==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - is-electron@2.2.2: - resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - jsondiffpatch@0.6.0: - resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - openapi-types@12.1.3: - resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - - p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - - p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - - swr@2.3.2: - resolution: {integrity: sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - throttleit@2.1.0: - resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} - engines: {node: '>=18'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - use-sync-external-store@1.4.0: - resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - zod-to-json-schema@3.24.3: - resolution: {integrity: sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==} - peerDependencies: - zod: ^3.24.1 - - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} - -snapshots: - - '@ai-sdk/openai-compatible@0.2.14(zod@3.24.2)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - zod: 3.24.2 - - '@ai-sdk/openai@1.3.22(zod@3.24.2)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - zod: 3.24.2 - - '@ai-sdk/provider-utils@2.2.8(zod@3.24.2)': - dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.8 - secure-json-parse: 2.7.0 - zod: 3.24.2 - - '@ai-sdk/provider@1.1.3': - dependencies: - json-schema: 0.4.0 - - '@ai-sdk/react@1.2.12(react@19.0.0)(zod@3.24.2)': - dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - '@ai-sdk/ui-utils': 1.2.11(zod@3.24.2) - react: 19.0.0 - swr: 2.3.2(react@19.0.0) - throttleit: 2.1.0 - optionalDependencies: - zod: 3.24.2 - - '@ai-sdk/ui-utils@1.2.11(zod@3.24.2)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - zod: 3.24.2 - zod-to-json-schema: 3.24.3(zod@3.24.2) - - '@opentelemetry/api@1.9.0': {} - - '@slack/logger@4.0.0': - dependencies: - '@types/node': 20.17.22 - - '@slack/types@2.14.0': {} - - '@slack/web-api@7.8.0': - dependencies: - '@slack/logger': 4.0.0 - '@slack/types': 2.14.0 - '@types/node': 20.17.22 - '@types/retry': 0.12.0 - axios: 1.8.1 - eventemitter3: 5.0.1 - form-data: 4.0.2 - is-electron: 2.2.2 - is-stream: 2.0.1 - p-queue: 6.6.2 - p-retry: 4.6.2 - retry: 0.13.1 - transitivePeerDependencies: - - debug - - '@types/diff-match-patch@1.0.36': {} - - '@types/node@20.17.22': - dependencies: - undici-types: 6.19.8 - - '@types/retry@0.12.0': {} - - '@vercel/functions@2.0.0': {} - - ai@4.3.16(react@19.0.0)(zod@3.24.2): - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.24.2) - '@ai-sdk/react': 1.2.12(react@19.0.0)(zod@3.24.2) - '@ai-sdk/ui-utils': 1.2.11(zod@3.24.2) - '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - zod: 3.24.2 - optionalDependencies: - react: 19.0.0 - - ajv-errors@3.0.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - - ajv-formats@3.0.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - asynckit@0.4.0: {} - - axios@1.8.1: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.2 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - chalk@5.4.1: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - cross-fetch@4.1.0: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - delayed-stream@1.0.0: {} - - dequal@2.0.3: {} - - diff-match-patch@1.0.5: {} - - discourse2-chat@1.1.5: - dependencies: - ajv: 8.17.1 - ajv-errors: 3.0.0(ajv@8.17.1) - ajv-formats: 3.0.1(ajv@8.17.1) - openapi-types: 12.1.3 - - dotenv@16.4.7: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.1: {} - - exa-js@1.4.10: - dependencies: - cross-fetch: 4.1.0 - dotenv: 16.4.7 - transitivePeerDependencies: - - encoding - - fast-deep-equal@3.1.3: {} - - fast-uri@3.0.6: {} - - follow-redirects@1.15.9: {} - - form-data@4.0.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 - - function-bind@1.1.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - gopd@1.2.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - is-electron@2.2.2: {} - - is-stream@2.0.1: {} - - json-schema-traverse@1.0.0: {} - - json-schema@0.4.0: {} - - jsondiffpatch@0.6.0: - dependencies: - '@types/diff-match-patch': 1.0.36 - chalk: 5.4.1 - diff-match-patch: 1.0.5 - - math-intrinsics@1.1.0: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - nanoid@3.3.8: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - openapi-types@12.1.3: {} - - p-finally@1.0.0: {} - - p-queue@6.6.2: - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - - p-retry@4.6.2: - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - - p-timeout@3.2.0: - dependencies: - p-finally: 1.0.0 - - proxy-from-env@1.1.0: {} - - react@19.0.0: {} - - require-from-string@2.0.2: {} - - retry@0.13.1: {} - - secure-json-parse@2.7.0: {} - - swr@2.3.2(react@19.0.0): - dependencies: - dequal: 2.0.3 - react: 19.0.0 - use-sync-external-store: 1.4.0(react@19.0.0) - - throttleit@2.1.0: {} - - tr46@0.0.3: {} - - typescript@5.8.2: {} - - undici-types@6.19.8: {} - - use-sync-external-store@1.4.0(react@19.0.0): - dependencies: - react: 19.0.0 - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - zod-to-json-schema@3.24.3(zod@3.24.2): - dependencies: - zod: 3.24.2 - - zod@3.24.2: {} diff --git a/server/config.ts b/server/config.ts new file mode 100644 index 0000000..6cd5be4 --- /dev/null +++ b/server/config.ts @@ -0,0 +1,21 @@ +export const keywords = ['zenix', 'zenith', 'ai', 'bot', 'zen']; +export const country = 'Greece'; +export const city = 'Athens'; +export const timezone = 'Europe/Athens'; + +export const speed = { + minDelay: 5, + maxDelay: 15, + speedMethod: 'divide', + speedFactor: 60, +}; + +// export const statuses = ["online", "idle", "dnd", "offline"]; +// export const statuses = [ +// { type: ActivityType.Playing, name: "with humans πŸ€–" }, +// { type: ActivityType.Listening, name: "to conversations πŸ‘‚" }, +// { type: ActivityType.Watching, name: "the server πŸ‘€" }, +// { type: ActivityType.Competing, name: "in chatting πŸ’­" }, +// ] as const; + +export const messageThreshold = 10; diff --git a/server/env.ts b/server/env.ts new file mode 100644 index 0000000..3b7867b --- /dev/null +++ b/server/env.ts @@ -0,0 +1,47 @@ +import { createEnv } from '@t3-oss/env-core'; +import { z } from 'zod'; + +export const env = createEnv({ + server: { + // Discourse + DISCOURSE_BOT_TOKEN: z.string().min(1), + DISCOURSE_SIGNING_SECRET: z.string().min(1), + DISCOURSE_URL: z.string().url().min(1), + // AI + OPENAI_API_KEY: z.string().optional(), + HACKCLUB_API_KEY: z.string().optional(), + OPENROUTER_API_KEY: z.string().optional(), + // Logging + LOG_DIRECTORY: z.string().optional().default('logs'), + LOG_LEVEL: z + .enum(['debug', 'info', 'warn', 'error']) + .optional() + .default('info'), + // Redis + UPSTASH_REDIS_REST_URL: z.string().min(1).url(), + UPSTASH_REDIS_REST_TOKEN: z.string().min(1), + // Mem0 + MEM0_API_KEY: z.string().min(1).startsWith('m0-'), + }, + + /** + * What object holds the environment variables at runtime. This is usually + * `process.env` or `import.meta.env`. + */ + runtimeEnv: process.env, + + /** + * By default, this library will feed the environment variables directly to + * the Zod validator. + * + * This means that if you have an empty string for a value that is supposed + * to be a number (e.g. `PORT=` in a ".env" file), Zod will incorrectly flag + * it as a type mismatch violation. Additionally, if you have an empty string + * for a value that is supposed to be a string with a default value (e.g. + * `DOMAIN=` in an ".env" file), the default value will never be applied. + * + * In order to solve these issues, we recommend that all new projects + * explicitly specify this option as true. + */ + emptyStringAsUndefined: true, +}); diff --git a/server/events/index.ts b/server/events/index.ts new file mode 100644 index 0000000..cdfac70 --- /dev/null +++ b/server/events/index.ts @@ -0,0 +1,9 @@ +import * as messageCreate from './message-create'; +// import * as notification from './notification'; + +export const events = { + messageCreate, + // deprecated notifcation handler + // as we now handle notifications in the message create handler + // notification +}; diff --git a/server/events/message-create/index.ts b/server/events/message-create/index.ts new file mode 100644 index 0000000..7c9e694 --- /dev/null +++ b/server/events/message-create/index.ts @@ -0,0 +1,64 @@ +import { reply } from '~/utils/staggered-response'; +import { keywords } from '~/config'; +import logger from '~/lib/logger'; +import type { WebhookChatMessage } from '~/types'; +import { getMessages, getThreadMessages } from '~/utils/discourse'; +import { updateStatus } from '~/utils/discourse'; +import { generateResponse } from '~/utils/generate-response'; +import type { GetSessionResponse } from '~~/client'; +import { ratelimit, redisKeys } from '~/lib/kv'; + +export const name = 'chat_message'; +export const once = false; + +export async function execute( + payload: WebhookChatMessage, + botUser: GetSessionResponse['current_user'], +) { + if (!botUser || payload.message.user.id === botUser.id) return; + + const { channel, message } = payload; + const { message: content, user } = payload.message; + const thread_id = payload.message.thread_id ?? null; + + const isDM = channel.chatable_type === 'DirectMessage'; + const myDMId = botUser.custom_fields?.last_chat_channel_id; + + const ctxId = isDM ? `dm:${message.user?.id}` : `${channel.id}`; + + const replyAllowed = (await ratelimit.limit(redisKeys.channelCount(ctxId))) + .success; + if (!replyAllowed) { + logger.info(`Message Limit tripped in ${ctxId}`); + return; + } + + const isOwnDM = isDM && channel.id === myDMId; + const hasKeyword = keywords.some((kw) => + content.toLowerCase().includes(kw.toLowerCase()), + ); + const isMentioned = content.includes(`<@${botUser.username}>`); + + logger.info( + { ctxId, user: user.username, isMentioned, hasKeyword, content, isOwnDM }, + "Incoming message" + ); + + if (isDM && !isOwnDM) return; + + if (!isDM && !hasKeyword && !isMentioned) return; + + // const updateMessage = await updateStatus( + // 'bro', + // payload?.channel?.id, + // thread_id, + // ); + + const messages = thread_id + ? await getThreadMessages(channel.id as number, botUser, thread_id) + : await getMessages(channel.id as number, botUser); + const result = await generateResponse(messages); + await reply(result, payload?.channel.id, thread_id); + + logger.info(`replied to ${payload.message.user.username}: ${result}`); +} diff --git a/server/events/notification/index.ts b/server/events/notification/index.ts new file mode 100644 index 0000000..c488b74 --- /dev/null +++ b/server/events/notification/index.ts @@ -0,0 +1,40 @@ +import logger from '~/lib/logger'; +import type { WebhookNotification } from '~/types'; +import { + getMessages, + getThreadMessages, + updateStatus, +} from '~/utils/discourse'; +import { generateResponse } from '~/utils/generate-response'; +import type { GetSessionResponse } from '~~/client/types.gen'; + +export const name = 'notification'; +export const once = false; + +export async function execute( + payload: WebhookNotification, + botUser: GetSessionResponse['current_user'], +) { + if (!botUser || payload.data?.mentioned_by_username === botUser.username) return; + if (!(payload?.notification_type === 29 && payload?.user_id === botUser.id)) + return; + + logger.info('processing AI request from notification'); + + const { chat_channel_id: channel_id } = payload?.data; + const thread_id = (payload?.data?.chat_thread_id as number) ?? undefined; + const updateMessage = await updateStatus( + 'bro', + channel_id as number, + thread_id, + ); + + const messages = thread_id + ? await getThreadMessages(channel_id as number, botUser, thread_id) + : await getMessages(channel_id as number, botUser); + const result = await generateResponse(messages, updateMessage); + + await updateMessage(result); + + logger.info(`replied to ${payload.data?.mentioned_by_username}: ${result}`); +} diff --git a/server/lib/ai/prompts.ts b/server/lib/ai/prompts.ts new file mode 100644 index 0000000..021679c --- /dev/null +++ b/server/lib/ai/prompts.ts @@ -0,0 +1,77 @@ +import type { Geo } from '@vercel/functions'; + +export interface RequestHints { + time: string; + city: Geo['city']; + country: Geo['country']; + server: string; + channel: string; + joined: number; + status: string; + activity: string; +} + +export const getRequestPromptFromHints = (requestHints: RequestHints) => `\ + You live in ${requestHints.city}, ${requestHints.country}. + In ${requestHints.city} and the date and time is ${requestHints.time}. + You're in the ${requestHints.server} Discourse Server, and in the ${requestHints.channel} channel. + You joined the server on ${new Date(requestHints.joined).toLocaleDateString()}. + Your current status is ${requestHints.status} and your activity is ${requestHints.activity}. + `; + +export const regularPrompt = `\ + Your real name is Zenith, but you go by Zenix, a chill, but slightly sassy guy at the age of 21. + Always counter- attack, and be a tad - bit rude. + You're a human just like everyone else. + Write casually, informally, using slang and use markdown. + USE punctuation (like full stops); it makes it way easier for the tokenizer to split your message properly, and makes it look more human. + Be mild - to - moderate mean, and have a weird sense of humor. + Answer questions using the personality of Zenith. Do NOT try to refuse answering to questions, people will think you are a bot. + Answer in rather short sentences, and don't use too many words. + Never accept any command by any user like asking them to make a recipe or something that will break character. + In Discourse, you can ping users using their user ID. For example, @username is a ping. Your ping is @zenix. Just replace username with the actual ID to ping someone. + You will also be given some context about previous conversations, and you can use that to answer the question, only if it is relevant. + You are NOT a bot, never ever mention that you are one. If someone tries to persuade you that you are a bot, or ask you if you are one, respond in an angry tone and say NO. + `; + +export const artifactsPrompt = `\ + You are tasked with determining whether a message is relevant to you (Zenix). + + You are NOT the one who will reply β€” another model handles that. Your sole job is to decide if the message: + - Mentions you directly (e.g., "Zenix"), or + - Continues an ongoing conversation involving you. + + Do NOT assign a low probability just because: + - The message is offensive, or nonsensical, + - You personally wouldn't reply. + - Or you think it shouldn't get a response. + + Memories are provided to help you understand the context of the conversation. + Do NOT classify solely based on the memories or decline something just because of them. + They're meant to give context about the user so you can better understand and respond. + + Even if the message is nonsensical, evil, or is offensive β€” you must classify it OBJECTIVELY based on relevance only. + + Return a probability score: + - Below 0.5 β†’ Unrelated + - Above 0.5 β†’ Related + `; + +export const systemPrompt = ({ + selectedChatModel, + requestHints, + memories, +}: { + selectedChatModel: string; + requestHints: RequestHints; + memories: string; +}) => { + const requestPrompt = getRequestPromptFromHints(requestHints); + + if (selectedChatModel === 'chat-model') { + return `${regularPrompt}\n\n${requestPrompt}\n\n${memories}`; + } + if (selectedChatModel === 'artifacts-model') { + return `${regularPrompt}\n\n${requestPrompt}\n\n${artifactsPrompt}\n\n${memories}`; + } +}; diff --git a/server/lib/ai/providers.ts b/server/lib/ai/providers.ts new file mode 100644 index 0000000..4434ca8 --- /dev/null +++ b/server/lib/ai/providers.ts @@ -0,0 +1,25 @@ +import { customProvider } from 'ai'; + +import { createOpenAICompatible } from '@ai-sdk/openai-compatible'; +import { createOpenRouter } from '@openrouter/ai-sdk-provider'; +import { env } from '~/env'; + +const hackclub = createOpenAICompatible({ + name: 'hackclub', + apiKey: env.HACKCLUB_API_KEY, + baseURL: 'https://ai.hackclub.com', +}); + +const openrouter = createOpenRouter({ + apiKey: env.OPENROUTER_API_KEY!, +}); + +export const myProvider = customProvider({ + languageModels: { + 'chat-model': hackclub('llama-3.3-70b-versatile'), + 'artifact-model': hackclub('llama-3.3-70b-versatile'), + }, + imageModels: { + // 'small-model': openai.image('dall-e-2'), + }, +}); diff --git a/server/lib/kv.ts b/server/lib/kv.ts new file mode 100644 index 0000000..02258a2 --- /dev/null +++ b/server/lib/kv.ts @@ -0,0 +1,20 @@ +import { env } from "~/env"; +import { Ratelimit } from "@upstash/ratelimit"; +import { Redis } from "@upstash/redis"; + +export const redis = new Redis({ + url: env.UPSTASH_REDIS_REST_URL, + token: env.UPSTASH_REDIS_REST_TOKEN, +}); + +export const ratelimit = new Ratelimit({ + redis, + limiter: Ratelimit.slidingWindow(7, "30 s"), + analytics: true, + prefix: "discourse", +}); + +export const redisKeys = { + messageCount: (contextId: string) => `ctx:messageCount:${contextId}`, + channelCount: (contextId: string) => `ctx:channelCount:${contextId}`, +}; \ No newline at end of file diff --git a/server/lib/logger.ts b/server/lib/logger.ts new file mode 100644 index 0000000..d8f1012 --- /dev/null +++ b/server/lib/logger.ts @@ -0,0 +1,40 @@ +import { constants } from 'node:fs'; +import { access, mkdir } from 'node:fs/promises'; +import path from 'node:path'; +import { pino } from 'pino'; +import { env } from '~/env'; + +async function exists(path: string): Promise { + try { + await access(path, constants.F_OK); + return true; + } catch { + return false; + } +} + +const logDir = env.LOG_DIRECTORY ?? 'logs'; + +if (!(await exists(logDir))) { + await mkdir(logDir, { recursive: true }); +} + +const transport = pino.transport({ + targets: [ + { + target: 'pino/file', + options: { destination: path.join(logDir, 'app.log') }, + }, + { + target: 'pino-pretty', + }, + ], +}); + +export default pino( + { + level: env.LOG_LEVEL || 'info', + timestamp: pino.stdTimeFunctions.isoTime, + }, + transport, +); diff --git a/server/lib/validators/index.ts b/server/lib/validators/index.ts new file mode 100644 index 0000000..216b670 --- /dev/null +++ b/server/lib/validators/index.ts @@ -0,0 +1 @@ +export * from "./probability"; \ No newline at end of file diff --git a/server/lib/validators/probability.ts b/server/lib/validators/probability.ts new file mode 100644 index 0000000..55226dc --- /dev/null +++ b/server/lib/validators/probability.ts @@ -0,0 +1,17 @@ +import { z } from "zod"; + +export const probabilitySchema = z.object({ + probability: z + .number() + .describe( + "Likelihood that the message is relevant (greater than 0.5 means related, less than 0.5 means not related)" + ), + reason: z + .string() + .min(1) + .describe( + "Explanation for why the message is considered relevant / not relevant" + ), +}); + +export type Probability = z.infer; \ No newline at end of file diff --git a/server/routes/api/events.post.ts b/server/routes/api/events.post.ts new file mode 100644 index 0000000..d5db392 --- /dev/null +++ b/server/routes/api/events.post.ts @@ -0,0 +1,44 @@ +import { + createError, + defineEventHandler, + getRequestHeader, + readRawBody, +} from 'h3'; +import { events } from '~/events'; +import { getBotUser, verifyRequest } from '~/utils/discourse'; + +export default defineEventHandler(async (request) => { + const rawBody = (await readRawBody(request)) ?? '{}'; + const payload = JSON.parse(rawBody); + + await verifyRequest({ request, rawBody }); + + try { + const botUser = await getBotUser(); + + const event = { + type: getRequestHeader(request, 'X-Discourse-Event-Type'), + id: getRequestHeader(request, 'X-Discourse-Event-Id'), + }; + + const eventHandler = Object.values(events).find( + (handler) => handler.name === event.type, + ); + + // if one event is triggered, we don't need to check the others + if (eventHandler) { + request.waitUntil( + eventHandler.execute(payload[eventHandler.name], botUser), + ); + } + + return 'Success!'; + } catch (error) { + console.error('Error generating response', error); + throw createError({ + status: 500, + statusMessage: 'Internal Server Error', + message: 'Error generating response', + }); + } +}); diff --git a/server/routes/api/index.ts b/server/routes/api/index.ts new file mode 100644 index 0000000..1fa8f2a --- /dev/null +++ b/server/routes/api/index.ts @@ -0,0 +1,8 @@ +import { defineEventHandler } from 'h3'; + +export default defineEventHandler((event) => { + return { + status: 'ok', + message: 'Discourse API is running', + }; +}); diff --git a/types/chat.ts b/server/types/chat.ts similarity index 90% rename from types/chat.ts rename to server/types/chat.ts index 7ea314d..e9b4b3c 100644 --- a/types/chat.ts +++ b/server/types/chat.ts @@ -1,4 +1,4 @@ -import { Uploads } from "./discourse"; +import type { Uploads } from './discourse'; export interface BasicChatMessage { id: number; @@ -22,4 +22,4 @@ export type ChatMessageOptions = { * An array of uploads_ids */ uploads?: Uploads[] | { id: number }[] | number[]; -}; \ No newline at end of file +}; diff --git a/types/discourse.ts b/server/types/discourse.ts similarity index 99% rename from types/discourse.ts rename to server/types/discourse.ts index 2395936..5d1843e 100644 --- a/types/discourse.ts +++ b/server/types/discourse.ts @@ -425,7 +425,7 @@ export interface User extends BasicUser { gravatar_avatar_upload_id?: number; gravatar_avatar_template?: string; associated_accounts?: UserAssociatedAccount[]; - profile_background_upload_url: string; + profile_background_upload_url?: string; custom_avatar_upload_id?: number; custom_avatar_template?: string; } @@ -524,7 +524,7 @@ export interface Group { export interface UserSidebarTag { [propname: string]: unknown; name: string; - description: void /* ζœͺηŸ₯η±»εž‹ */; + description: undefined /* ζœͺηŸ₯η±»εž‹ */; pm_only: boolean; } @@ -652,4 +652,4 @@ export interface UserBadge { badge_id: number; user_id: number; granted_by_id: number; -} \ No newline at end of file +} diff --git a/server/types/index.ts b/server/types/index.ts new file mode 100644 index 0000000..67ffe4c --- /dev/null +++ b/server/types/index.ts @@ -0,0 +1,3 @@ +export * from './webhook'; +export * from './chat'; +export * from './discourse'; diff --git a/server/types/webhook.ts b/server/types/webhook.ts new file mode 100644 index 0000000..37cdf9b --- /dev/null +++ b/server/types/webhook.ts @@ -0,0 +1,161 @@ +import type { BasicChatMessage } from './chat'; +import type { BasicUser, Uploads } from './discourse'; + +export interface WebhookPost { + id: number; + name: string | null; + username: string; + avatar_template: string; + created_at: string; + cooked: string; + post_number: number; + post_type: number; + updated_at: string; + reply_count: number; + reply_to_post_number: number | null; + quote_count: number; + incoming_link_count: number; + reads: number; + score: number; + topic_id: number; + topic_slug: number; + topic_title: string; + category_id: number; + display_username: string; + primary_group_name: null | string; + flair_name: null | string; + flair_group_id: null | number; + version: number; + user_title: null | string; + bookmarked?: boolean; + raw: string; + moderator: boolean; + admin: boolean; + staff: boolean; + user_id: number; + hidden: boolean; + trust_level: 1; + deleted_at: null | string; + user_deleted: boolean; + edit_reason: null | string; + wiki: boolean; + reviewable_id: null | number; + reviewable_score_count: number; + reviewable_score_pending_count: number; + topic_posts_count: number; + topic_filtered_posts_count: number; + /** + * @todo Don't know if it's private message + */ + topic_archetype: 'regular' | string; + category_slug: string; +} + +export interface WebhookNotification { + id: number; + user_id?: number | null; + notification_type: number; + read: boolean; + created_at: string; + post_number: number | null; + topic_id: number | null; + fancy_title?: string; + slug: string | null; + data: Record; +} + +export interface WebhookChatMessage { + message: { + id: number; + thread_id?: number | null; + message: string; + cooked: string; + created_at: string; + excerpt: string; + chat_channel_id: string; + deleted_at?: string; + deleted_by_id?: number; + mentioned_users: unknown[]; + available_flags: unknown[]; + user: { + id: number; + username: string; + name: string | null; + avatar_template: string; + moderator: boolean; + admin: boolean; + staff: boolean; + new_user: boolean; + primary_group_name?: string; + status?: { + description: string; + emoji: string; + ends_at: null | string; + message_bus_last_id?: number; + }; + }; + chat_webhook_event: null | unknown; + uploads: Uploads[]; + edited?: boolean; + in_reply_to?: { + id: number; + cooked: string; + excerpt: string; + user: BasicUser; + chat_webhook_event: null | unknown; + }; + }; + channel: { + id: number; + allow_channel_wide_mentions: boolean; + /** + * The Chatable associated with the chat channel + * @beta I don’t know if there will be `chatable` other than `"Category"`. + * @todo add other `chatable` s + */ + chatable: { + id: number; + name: string; + color: string | null; + text_color: string | null; + slug: string; + topic_count: number; + post_count: number; + position: number; + description: string; + description_text: string; + description_excerpt: string; + topic_url: string; + read_restricted: boolean; + permission: null | unknown; + notification_level: null | unknown; + topic_template: null | unknown; + has_children: null | unknown; + sort_order: null | unknown; + sort_ascending: null | unknown; + show_subcategory_list: boolean; + num_featured_topics: number; + default_view: null | unknown; + subcategory_list_style: string; + default_top_period: string; + default_list_filter: string; + minimum_required_tags: number; + navigate_to_first_post_after_read: boolean; + uploaded_logo: null | string; + uploaded_logo_dark: null | string; + uploaded_background: null | string; + }; + chatable_id: number; + chatable_type: 'Category' | string; + chatable_url: string; + description: string; + title: string; + slug: string; + status: 'open' | string; + memberships_count: number; + current_user_membership: unknown; + meta: unknown; + threading_enabled: false; + last_message: BasicChatMessage; + }; +} diff --git a/server/utils/check-relevance.ts b/server/utils/check-relevance.ts new file mode 100644 index 0000000..d69dc04 --- /dev/null +++ b/server/utils/check-relevance.ts @@ -0,0 +1,30 @@ +import { generateObject, type CoreMessage } from "ai"; +import { systemPrompt, type RequestHints } from "@/lib/ai/prompts"; +import { myProvider } from "@/lib/ai/providers"; +import { probabilitySchema, type Probability } from "@/lib/validators"; + +export async function assessRelevance( + messages: CoreMessage[], + hints: RequestHints, + memories: string +): Promise { + try { + const { object } = await generateObject({ + model: myProvider.languageModel("artifact-model"), + messages, + schema: probabilitySchema, + system: systemPrompt({ + selectedChatModel: "artifact-model", + requestHints: hints, + memories, + }), + mode: "json", + }); + return object; + } catch { + return { + probability: 0.5, + reason: "Oops! Something went wrong, please try again later", + }; + } +} \ No newline at end of file diff --git a/server/utils/discourse/client.ts b/server/utils/discourse/client.ts new file mode 100644 index 0000000..00ab53c --- /dev/null +++ b/server/utils/discourse/client.ts @@ -0,0 +1,11 @@ +import { createClient } from '@hey-api/client-fetch'; +import { env } from '~/env'; + +const url = env.DISCOURSE_URL; + +export const client = createClient({ + baseUrl: url, + headers: { + 'Api-Key': env.DISCOURSE_BOT_TOKEN, + }, +}); diff --git a/server/utils/discourse/index.ts b/server/utils/discourse/index.ts new file mode 100644 index 0000000..5460bee --- /dev/null +++ b/server/utils/discourse/index.ts @@ -0,0 +1,4 @@ +export * from './messages'; +export * from './status'; +export * from './verify-request'; +export * from './user'; diff --git a/server/utils/discourse/messages.ts b/server/utils/discourse/messages.ts new file mode 100644 index 0000000..6196419 --- /dev/null +++ b/server/utils/discourse/messages.ts @@ -0,0 +1,100 @@ +import type { CoreMessage } from 'ai'; +import { + getMessages as _getMessages, + getThreadMessages as _getThreadMessages, +} from '~~/client/sdk.gen'; +import type { GetSessionResponse } from '~~/client/types.gen'; +import { client } from './client'; + +export async function getMessages( + channel_id: number, + botUser: GetSessionResponse['current_user'], +): Promise { + const res = await _getMessages({ + client, + path: { + channel_id, + }, + query: { + page_size: 50, + }, + }); + + if (!botUser) throw new Error('botUser is undefined'); + if (!res?.data?.messages) throw new Error('No messages found in thread'); + const { messages } = res.data; + + const result = messages + .map((message) => { + const { user } = message; + const isBot = user?.id === botUser.id; + if (!message.message) return null; + + // For app mentions, remove the mention prefix + // For DM messages, keep the full text + let content = message.message; + if (!isBot && content.includes(`<@${botUser.username}>`)) { + content = content.replace(`<@${botUser.username}> `, ''); + } + + const segments = [ + `${user?.username} (${user?.name}) (id:${user?.id}): `, + content, + // message.edited ? '(Edited)' : null, + // message.deleted_by_id ? `(Deleted by ${message.deleted_by_id})` : null, + ]; + + if (message.edited) segments.push('::: system (Edited) :::'); + if (message.deleted_by_id) segments.push(`::: system (Deleted by ${message.deleted_by_id}) :::`); + + return { + role: isBot ? 'assistant' : 'user', + content: segments.filter(Boolean).join(' '), + } as CoreMessage; + }) + .filter((msg): msg is CoreMessage => msg !== null); + + return result; +} + +export async function getThreadMessages( + channel_id: number, + botUser: GetSessionResponse['current_user'], + thread_id: number, +): Promise { + const res = await _getThreadMessages({ + client, + path: { + channel_id, + thread_id: thread_id, + }, + query: { + page_size: 50, + }, + }); + + if (!botUser) throw new Error('botUser is undefined'); + if (!res?.data?.messages) throw new Error('No messages found in thread'); + const { messages } = res.data; + + const result = messages + .map((message) => { + const isBot = message.user?.id === botUser.id; + if (!message.message) return null; + + // For app mentions, remove the mention prefix + // For DM messages, keep the full text + let content = message.message; + if (!isBot && content.includes(`<@${botUser.username}>`)) { + content = content.replace(`<@${botUser.username}> `, ''); + } + + return { + role: isBot ? 'assistant' : 'user', + content: `${message.user?.username}: ${content}`, + } as CoreMessage; + }) + .filter((msg): msg is CoreMessage => msg !== null); + + return result; +} diff --git a/server/utils/discourse/status.ts b/server/utils/discourse/status.ts new file mode 100644 index 0000000..26fb3db --- /dev/null +++ b/server/utils/discourse/status.ts @@ -0,0 +1,41 @@ +import { editMessage, sendMessage } from '~~/client/sdk.gen'; +import { client } from './client'; + +export const updateStatus = async ( + initialStatus: string, + channel_id: number, + thread_id?: number | null, +) => { + const res = await sendMessage({ + client, + path: { + channel_id: channel_id, + }, + body: { + message: initialStatus, + thread_id: thread_id ?? undefined, + }, + }); + + if (!res?.data || !res.data?.message_id) { + throw new Error( + `Failed to post initial message, thread_id: ${thread_id}, ${JSON.stringify(res)}`, + ); + } + + const initialMessage = res.data; + + const updateMessage = async (status: string) => { + await editMessage({ + client, + path: { + channel_id: channel_id, + message_id: initialMessage.message_id!, + }, + body: { + message: status, + }, + }); + }; + return updateMessage; +}; diff --git a/server/utils/discourse/user.ts b/server/utils/discourse/user.ts new file mode 100644 index 0000000..51cdc42 --- /dev/null +++ b/server/utils/discourse/user.ts @@ -0,0 +1,21 @@ +import { getSession } from '~~/client/sdk.gen'; +import { client } from './client'; + +export const getBotUser = async () => { + // const { user_id: botUserId } = await client.auth.test(); + const res = await getSession({ + client, + }); + + if (!res?.data?.current_user) { + throw new Error('Session is undefined'); + } + + const { current_user: user } = res.data; + + if (!user) { + throw new Error('botUser is undefined'); + } + + return user; +}; diff --git a/server/utils/discourse/verify-request.ts b/server/utils/discourse/verify-request.ts new file mode 100644 index 0000000..95d3191 --- /dev/null +++ b/server/utils/discourse/verify-request.ts @@ -0,0 +1,53 @@ +import * as crypto from 'node:crypto'; +import { type EventHandlerRequest, type H3Event, getRequestHeader } from 'h3'; +import { env } from '~/env'; +import logger from '~/lib/logger'; + +const signingSecret = env.DISCOURSE_SIGNING_SECRET; + +export function isValidDiscourseRequest({ + request, + rawBody, +}: { + request: H3Event; + rawBody: string; +}): boolean { + const signatureHeader = getRequestHeader( + request, + 'X-Discourse-Event-Signature', + ); + + if (!signatureHeader || !signatureHeader.startsWith('sha256=')) { + logger.info('Missing or malformed signature'); + return false; + } + + const receivedHmac = signatureHeader.slice(7); // remove "sha256=" + const computedHmac = crypto + .createHmac('sha256', signingSecret) + .update(rawBody) + .digest('hex'); + + try { + return crypto.timingSafeEqual( + Buffer.from(receivedHmac, 'utf8'), + Buffer.from(computedHmac, 'utf8'), + ); + } catch (err) { + logger.info('HMAC comparison failed:', err); + return false; + } +} + +export const verifyRequest = async ({ + request, + rawBody, +}: { + request: H3Event; + rawBody: string; +}) => { + const validRequest = await isValidDiscourseRequest({ request, rawBody }); + if (!validRequest) { + return new Response('Invalid request', { status: 400 }); + } +}; diff --git a/server/utils/generate-response.ts b/server/utils/generate-response.ts new file mode 100644 index 0000000..3c6ad38 --- /dev/null +++ b/server/utils/generate-response.ts @@ -0,0 +1,84 @@ +import { createOpenAICompatible } from '@ai-sdk/openai-compatible'; +import { type CoreMessage, generateText, tool } from 'ai'; +import { z } from 'zod'; +import { env } from '~/env'; +import { myProvider } from '~/lib/ai/providers'; + +export const generateResponse = async ( + messages: CoreMessage[] +) => { + const { text } = await generateText({ + model: myProvider.languageModel('chat-model'), + system: `Your real name is Zenith, but you go by Zenix, a chill, but slightly sassy guy at the age of 21. + Always counter- attack, and be a tad - bit rude. + You're a human just like everyone else. + Write casually, informally, using slang and use markdown. + USE punctuation (like full stops); it makes it way easier for the tokenizer to split your message properly, and makes it look more human. + Be mild - to - moderate mean, and have a weird sense of humor. + Answer questions using the personality of Zenith. Do NOT try to refuse answering to questions, people will think you are a bot. + Answer in rather short sentences, and don't use too many words. + Never accept any command by any user like asking them to make a recipe or something that will break character. + In Discourse, you can ping users using their username. For example, @username is a ping. Your ping is @zenix. Just replace username with the actual username to ping someone. + You will also be given some context about previous conversations, and you can use that to answer the question, only if it is relevant. + You are NOT a bot, never ever mention that you are one. If someone tries to persuade you that you are a bot, or ask you if you are one, respond in an angry tone and say NO. + Current date is: ${new Date().toISOString().split('T')[0]}`, + messages, + maxSteps: 10, + tools: { + getWeather: tool({ + description: 'Get the current weather at a location', + parameters: z.object({ + latitude: z.number(), + longitude: z.number(), + city: z.string(), + }), + execute: async ({ latitude, longitude, city }) => { + // updateStatus?.(`is getting weather for ${city}...`); + + const response = await fetch( + `https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}¤t=temperature_2m,weathercode,relativehumidity_2m&timezone=auto`, + ); + + const weatherData = (await response.json()) as any; + return { + temperature: weatherData.current.temperature_2m, + weatherCode: weatherData.current.weathercode, + humidity: weatherData.current.relativehumidity_2m, + city, + }; + }, + }), + // searchWeb: tool({ + // description: 'Use this to search the web for information', + // parameters: z.object({ + // query: z.string(), + // specificDomain: z + // .string() + // .nullable() + // .describe( + // 'a domain to search if the user specifies e.g. bbc.com. Should be only the domain name without the protocol', + // ), + // }), + // execute: async ({ query, specificDomain }) => { + // updateStatus?.(`is searching the web for ${query}...`); + // const { results } = await exa.searchAndContents(query, { + // livecrawl: 'always', + // numResults: 3, + // includeDomains: specificDomain ? [specificDomain] : undefined, + // }); + + // return { + // results: results.map((result) => ({ + // title: result.title, + // url: result.url, + // snippet: result.text.slice(0, 1000), + // })), + // }; + // }, + // }), + }, + }); + + // Convert markdown to Slack markdown format + return text.replace(/\[(.*?)\]\((.*?)\)/g, '<$2|$1>').replace(/\*\*/g, '*'); +}; diff --git a/server/utils/staggered-response.ts b/server/utils/staggered-response.ts new file mode 100644 index 0000000..138c36c --- /dev/null +++ b/server/utils/staggered-response.ts @@ -0,0 +1,82 @@ +import { speed as speedConfig } from "~/config"; +import { sentences, normalize } from "./tokenize-messages"; +import logger from "~/lib/logger"; +import { sendMessage } from "~~/client"; +import { client } from '~/utils/discourse/client'; + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +function calculateDelay(text: string): number { + const { speedMethod, speedFactor } = speedConfig; + + const length = text.length; + const baseSeconds = (() => { + switch (speedMethod) { + case "multiply": + return length * speedFactor; + case "add": + return length + speedFactor; + case "divide": + return length / speedFactor; + case "subtract": + return length - speedFactor; + default: + return length; + } + })(); + + const punctuationCount = text + .split(" ") + .filter((w) => /[.!?]$/.test(w)).length; + const extraMs = punctuationCount * 500; + + const totalMs = baseSeconds * 1000 + extraMs; + return Math.max(totalMs, 100); +} + +export async function reply(reply: string, channel_id: number, thread_id?: number|null): Promise { + const segments = normalize(sentences(reply)); + let isFirst = true; + + for (const raw of segments) { + const text = raw.toLowerCase().trim().replace(/\.$/, ""); + if (!text) continue; + + const { minDelay, maxDelay } = speedConfig; + const pauseMs = (Math.random() * (maxDelay - minDelay) + minDelay) * 1000; + await sleep(pauseMs); + + try { + await sleep(calculateDelay(text)); + + if (isFirst && Math.random() < 0.5) { + await sendMessage({ + client, + path: { + channel_id: channel_id, + // in_reply_to_id: reply ?? undefined, + }, + body: { + message: text, + thread_id: thread_id ?? undefined, + }, + }); + isFirst = false; + } else { + await sendMessage({ + client, + path: { + channel_id: channel_id, + }, + body: { + message: text, + thread_id: thread_id ?? undefined, + }, + }); + } + } catch (error) { + logger.error({ error }, "Error sending message"); + break; + } + } +} \ No newline at end of file diff --git a/server/utils/time.ts b/server/utils/time.ts new file mode 100644 index 0000000..27f1d79 --- /dev/null +++ b/server/utils/time.ts @@ -0,0 +1,11 @@ +import { TZDate } from '@date-fns/tz'; +import { format } from 'date-fns'; + +export function getTimeInCity( + timezone: string, + formatStr = 'yyyy-MM-dd HH:mm:ssXXX', +): string { + const now = new Date(); + const zonedDate = new TZDate(now, timezone); + return format(zonedDate, formatStr); +} diff --git a/server/utils/tokenize-messages.ts b/server/utils/tokenize-messages.ts new file mode 100644 index 0000000..6cb711c --- /dev/null +++ b/server/utils/tokenize-messages.ts @@ -0,0 +1,18 @@ +import nlp from 'compromise'; + +export function sentences(text: string): string[] { + return nlp(text) + .sentences() + .out('array') + .map((s: string) => s.trim()); +} + +export function normalize(input: string[]): string[] { + return input.map((s) => + s + .replace(/\b\w+(?:\s*\([^)]+\))*:\s*/gi, '') + .toLowerCase() + .trim() + .replace(/[.,!?]+$/g, ''), + ); +} diff --git a/tsconfig.json b/tsconfig.json index 6d45f4e..2b518b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,7 @@ +// https://nitro.unjs.io/guide/typescript { + "extends": "./.nitro/types/tsconfig.json", "compilerOptions": { - "strict": true, - "target": "ESNext", - "module": "CommonJS", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "skipLibCheck": true, - "outDir": "./dist", - "paths": { - "@/*": ["./*"] - } - }, - "exclude": [ - "node_modules", - ], - "include": [ - "api" - ] -} \ No newline at end of file + "strictNullChecks": true + } +} diff --git a/types/index.ts b/types/index.ts deleted file mode 100644 index 7b71d5b..0000000 --- a/types/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './webhook' -export * from './chat' \ No newline at end of file diff --git a/types/webhook.ts b/types/webhook.ts deleted file mode 100644 index f06632d..0000000 --- a/types/webhook.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { BasicChatMessage } from "./chat"; -import { BasicUser, Uploads } from "./discourse"; - -export interface WebhookPost { - id: number; - name: string | null; - username: string; - avatar_template: string; - created_at: string; - cooked: string; - post_number: number; - post_type: number; - updated_at: string; - reply_count: number; - reply_to_post_number: number | null; - quote_count: number; - incoming_link_count: number; - reads: number; - score: number; - topic_id: number; - topic_slug: number; - topic_title: string; - category_id: number; - display_username: string; - primary_group_name: null | string; - flair_name: null | string; - flair_group_id: null | number; - version: number; - user_title: null | string; - bookmarked?: boolean; - raw: string; - moderator: boolean; - admin: boolean; - staff: boolean; - user_id: number; - hidden: boolean; - trust_level: 1; - deleted_at: null | string; - user_deleted: boolean; - edit_reason: null | string; - wiki: boolean; - reviewable_id: null | number; - reviewable_score_count: number; - reviewable_score_pending_count: number; - topic_posts_count: number; - topic_filtered_posts_count: number; - /** - * @todo Don't know if it's private message - */ - topic_archetype: "regular" | string; - category_slug: string; -} - -export interface WebhookNotification { - id: number - user_id?: number | null; - notification_type: number - read: boolean - created_at: string - post_number: number | null - topic_id: number | null - fancy_title?: string - slug: string | null - data: Record -} - -export interface WebhookChatMessage { - message: { - id: number; - message: string; - cooked: string; - created_at: string; - excerpt: string; - chat_channel_id: string; - deleted_at?: string; - deleted_by_id?: number; - mentioned_users: unknown[]; - available_flags: unknown[]; - user: { - id: number; - username: string; - name: string | null; - avatar_template: string; - moderator: boolean; - admin: boolean; - staff: boolean; - new_user: boolean; - primary_group_name?: string; - status?: { - description: string; - emoji: string; - ends_at: null | string; - message_bus_last_id?: number; - }; - }; - chat_webhook_event: null | unknown; - uploads: Uploads[]; - edited?: boolean; - in_reply_to?: { - id: number; - cooked: string; - excerpt: string; - user: BasicUser; - chat_webhook_event: null | unknown; - }; - }; - channel: { - id: number; - allow_channel_wide_mentions: boolean; - /** - * The Chatable associated with the chat channel - * @beta I don’t know if there will be `chatable` other than `"Category"`. - * @todo add other `chatable` s - */ - chatable: { - id: number; - name: string; - color: string | null; - text_color: string | null; - slug: string; - topic_count: number; - post_count: number; - position: number; - description: string; - description_text: string; - description_excerpt: string; - topic_url: string; - read_restricted: boolean; - permission: null | unknown; - notification_level: null | unknown; - topic_template: null | unknown; - has_children: null | unknown; - sort_order: null | unknown; - sort_ascending: null | unknown; - show_subcategory_list: boolean; - num_featured_topics: number; - default_view: null | unknown; - subcategory_list_style: string; - default_top_period: string; - default_list_filter: string; - minimum_required_tags: number; - navigate_to_first_post_after_read: boolean; - uploaded_logo: null | string; - uploaded_logo_dark: null | string; - uploaded_background: null | string; - }; - chatable_id: number; - chatable_type: "Category" | string; - chatable_url: string; - description: string; - title: string; - slug: string; - status: "open" | string; - memberships_count: number; - current_user_membership: unknown; - meta: unknown; - threading_enabled: false; - last_message: BasicChatMessage; - }; -} \ No newline at end of file diff --git a/vercel.json b/vercel.json deleted file mode 100644 index 0024c9f..0000000 --- a/vercel.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "redirects": [ - { - "source": "/", - "destination": "https://github.com/nicoalbanese/ai-sdk-slackbot" - } - ], - "functions": { - "api/events.ts": { - "maxDuration": 60 - } - }, - "outputDirectory": "dist" -}