diff --git a/.gitignore b/.gitignore
index 6635cf5..415b7c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@ node_modules
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
+litegraph/
diff --git a/.gitmodules b/.gitmodules
index ddec2b8..519f86b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,4 +4,4 @@
branch = v3.24.1
[submodule "litegraph"]
path = litegraph
- url = https://github.com/space-nuko/litegraph.js
+ url = https://github.com/space-nuko/litegraph.ts
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 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 General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is 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. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ 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.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ 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 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. Use with the GNU Affero General Public License.
+
+ 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 Affero 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 special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 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 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 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.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ 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 GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/package.json b/package.json
index c1ed4ae..d5a2fa6 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"scripts": {
"dev": "vite dev",
"build": "vite build",
- "preview": "vite preview",
+ "preview": "turbo run preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch",
"test:unit": "vitest",
@@ -16,19 +16,19 @@
},
"devDependencies": {
"@sveltejs/adapter-auto": "^2.0.0",
- "@sveltejs/kit": "^1.5.0",
- "eslint": "^8.28.0",
- "eslint-config-prettier": "^8.5.0",
+ "@sveltejs/kit": "^1.15.2",
+ "eslint": "^8.37.0",
+ "eslint-config-prettier": "^8.8.0",
"eslint-plugin-svelte3": "^4.0.0",
- "prettier": "^2.8.0",
- "prettier-plugin-svelte": "^2.8.1",
- "svelte": "^3.54.0",
+ "prettier": "^2.8.7",
+ "prettier-plugin-svelte": "^2.10.0",
+ "svelte": "^3.58.0",
"svelte-check": "^3.2.0",
"svelte-dnd-action": "^0.9.22",
- "typescript": "^5.0.0",
- "vite": "^4.2.0",
+ "typescript": "^5.0.3",
+ "vite": "^4.2.1",
"vite-tsconfig-paths": "^4.0.8",
- "vitest": "^0.25.3"
+ "vitest": "^0.25.8"
},
"type": "module",
"dependencies": {
@@ -39,14 +39,14 @@
"@gradio/icons": "workspace:*",
"@gradio/theme": "workspace:*",
"@gradio/utils": "workspace:*",
- "events": "^3.3.0",
"@litegraph-ts/core": "workspace:*",
"@litegraph-ts/nodes-basic": "workspace:*",
+ "events": "^3.3.0",
"pollen-css": "^4.6.2",
"radix-icons-svelte": "^1.2.1",
"svelte-preprocess": "^5.0.3",
"svelte-splitpanes": "^0.7.13",
- "tailwindcss": "^3.0.12",
+ "tailwindcss": "^3.3.1",
"typed-emitter": "github:andywer/typed-emitter",
"vite-plugin-full-reload": "^1.0.5"
}
diff --git a/patches/litegraph.js@0.7.12.patch b/patches/litegraph.js@0.7.12.patch
deleted file mode 100644
index bcc21da..0000000
--- a/patches/litegraph.js@0.7.12.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/src/litegraph.d.ts b/src/litegraph.d.ts
-index c9fbe0ced078548f95382eaa39be2b736be2a1bd..3ee29f82d614cd9f460f56228c56ea4eadc1b3fb 100644
---- a/src/litegraph.d.ts
-+++ b/src/litegraph.d.ts
-@@ -1260,6 +1260,9 @@ export declare class LGraphCanvas {
- visible_nodes: LGraphNode[];
- zoom_modify_alpha: boolean;
-
-+ release_link_on_empty_shows_menu: boolean;
-+ alt_drag_do_clone_nodes: boolean;
-+
- /** clears all the data inside */
- clear(): void;
- /** assigns a graph, you can reassign graphs to the same canvas */
\ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 5aa7194..eb12ade 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,27 +14,27 @@ importers:
'@litegraph-ts/core': workspace:*
'@litegraph-ts/nodes-basic': workspace:*
'@sveltejs/adapter-auto': ^2.0.0
- '@sveltejs/kit': ^1.5.0
- eslint: ^8.28.0
- eslint-config-prettier: ^8.5.0
+ '@sveltejs/kit': ^1.15.2
+ eslint: ^8.37.0
+ eslint-config-prettier: ^8.8.0
eslint-plugin-svelte3: ^4.0.0
events: ^3.3.0
pollen-css: ^4.6.2
- prettier: ^2.8.0
- prettier-plugin-svelte: ^2.8.1
+ prettier: ^2.8.7
+ prettier-plugin-svelte: ^2.10.0
radix-icons-svelte: ^1.2.1
- svelte: ^3.54.0
+ svelte: ^3.58.0
svelte-check: ^3.2.0
svelte-dnd-action: ^0.9.22
svelte-preprocess: ^5.0.3
svelte-splitpanes: ^0.7.13
- tailwindcss: ^3.0.12
+ tailwindcss: ^3.3.1
typed-emitter: github:andywer/typed-emitter
- typescript: ^5.0.0
- vite: ^4.2.0
+ typescript: ^5.0.3
+ vite: ^4.2.1
vite-plugin-full-reload: ^1.0.5
vite-tsconfig-paths: ^4.0.8
- vitest: ^0.25.3
+ vitest: ^0.25.8
dependencies:
'@gradio/atoms': link:gradio/js/atoms
'@gradio/button': link:gradio/js/button
@@ -54,8 +54,8 @@ importers:
typed-emitter: github.com/andywer/typed-emitter/9a139b6fa0ec6b0db6141b5b756b784e4f7ef4e4
vite-plugin-full-reload: 1.0.5_vite@4.2.1
devDependencies:
- '@sveltejs/adapter-auto': 2.0.0_@sveltejs+kit@1.15.0
- '@sveltejs/kit': 1.15.0_svelte@3.58.0+vite@4.2.1
+ '@sveltejs/adapter-auto': 2.0.0_@sveltejs+kit@1.15.2
+ '@sveltejs/kit': 1.15.2_svelte@3.58.0+vite@4.2.1
eslint: 8.37.0
eslint-config-prettier: 8.8.0_eslint@8.37.0
eslint-plugin-svelte3: 4.0.0_4gllgxcu6gmiyy5rrmqexpx7de
@@ -69,14 +69,6 @@ importers:
vite-tsconfig-paths: 4.0.8_mqt6hr36lqfsnn3kcfure5ceka
vitest: 0.25.8
- litegraph/packages/editor:
- specifiers:
- typescript: ^5.0.3
- vite: ^4.2.1
- dependencies:
- typescript: 5.0.3
- vite: 4.2.1
-
packages:
/@esbuild/android-arm/0.17.15:
@@ -323,9 +315,13 @@ packages:
/@jridgewell/sourcemap-codec/1.4.14:
resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+ dev: true
- /@jridgewell/trace-mapping/0.3.17:
- resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
+ /@jridgewell/sourcemap-codec/1.4.15:
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+ /@jridgewell/trace-mapping/0.3.18:
+ resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
dependencies:
'@jridgewell/resolve-uri': 3.1.0
'@jridgewell/sourcemap-codec': 1.4.14
@@ -353,17 +349,17 @@ packages:
resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
dev: true
- /@sveltejs/adapter-auto/2.0.0_@sveltejs+kit@1.15.0:
+ /@sveltejs/adapter-auto/2.0.0_@sveltejs+kit@1.15.2:
resolution: {integrity: sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==}
peerDependencies:
'@sveltejs/kit': ^1.0.0
dependencies:
- '@sveltejs/kit': 1.15.0_svelte@3.58.0+vite@4.2.1
+ '@sveltejs/kit': 1.15.2_svelte@3.58.0+vite@4.2.1
import-meta-resolve: 2.2.2
dev: true
- /@sveltejs/kit/1.15.0_svelte@3.58.0+vite@4.2.1:
- resolution: {integrity: sha512-fvDsW9msxWjDU/j9wwLlxEZ6cpXQYcmcQHq7neJMqibMEl39gI1ztVymGnYqM8KLqZXwNmhKtLu8EPheukKtXQ==}
+ /@sveltejs/kit/1.15.2_svelte@3.58.0+vite@4.2.1:
+ resolution: {integrity: sha512-rLNxZrjbrlPf8AWW8GAU4L/Vvu17e9v8EYl7pUip7x72lTft7RcxeP3z7tsrHpMSBBxC9o4XdKzFvz1vMZyXZw==}
engines: {node: ^16.14 || >=18}
hasBin: true
requiresBuild: true
@@ -384,7 +380,7 @@ packages:
sirv: 2.0.2
svelte: 3.58.0
tiny-glob: 0.2.9
- undici: 5.21.0
+ undici: 5.20.0
vite: 4.2.1
transitivePeerDependencies:
- supports-color
@@ -1129,13 +1125,13 @@ packages:
resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
engines: {node: '>=12'}
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.14
+ '@jridgewell/sourcemap-codec': 1.4.15
/magic-string/0.30.0:
resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==}
engines: {node: '>=12'}
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.14
+ '@jridgewell/sourcemap-codec': 1.4.15
dev: true
/map-obj/5.0.2:
@@ -1322,7 +1318,7 @@ packages:
postcss: 8.4.21
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.1
+ resolve: 1.22.2
dev: false
/postcss-js/4.0.1_postcss@8.4.21:
@@ -1436,8 +1432,8 @@ packages:
engines: {node: '>=4'}
dev: true
- /resolve/1.22.1:
- resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
+ /resolve/1.22.2:
+ resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
hasBin: true
dependencies:
is-core-module: 2.11.0
@@ -1525,7 +1521,7 @@ packages:
resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==}
hasBin: true
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.14
+ '@jridgewell/sourcemap-codec': 1.4.15
buffer-crc32: 0.2.13
minimist: 1.2.8
sander: 0.5.1
@@ -1598,7 +1594,7 @@ packages:
peerDependencies:
svelte: ^3.55.0
dependencies:
- '@jridgewell/trace-mapping': 0.3.17
+ '@jridgewell/trace-mapping': 0.3.18
chokidar: 3.5.3
fast-glob: 3.2.12
import-fresh: 3.3.0
@@ -1722,7 +1718,7 @@ packages:
postcss-selector-parser: 6.0.11
postcss-value-parser: 4.2.0
quick-lru: 5.1.1
- resolve: 1.22.1
+ resolve: 1.22.2
sucrase: 3.31.0
transitivePeerDependencies:
- ts-node
@@ -1821,8 +1817,8 @@ packages:
engines: {node: '>=12.20'}
hasBin: true
- /undici/5.21.0:
- resolution: {integrity: sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==}
+ /undici/5.20.0:
+ resolution: {integrity: sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==}
engines: {node: '>=12.18'}
dependencies:
busboy: 1.6.0
@@ -1892,7 +1888,7 @@ packages:
dependencies:
esbuild: 0.17.15
postcss: 8.4.21
- resolve: 1.22.1
+ resolve: 1.22.2
rollup: 3.20.2
optionalDependencies:
fsevents: 2.3.2
@@ -1925,7 +1921,7 @@ packages:
'@types/node': 18.15.11
esbuild: 0.17.15
postcss: 8.4.21
- resolve: 1.22.1
+ resolve: 1.22.2
rollup: 3.20.2
optionalDependencies:
fsevents: 2.3.2
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index d5a678d..61a8b2c 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,3 +1,4 @@
packages:
- 'gradio/js/*'
- - 'litegraph/packages/*'
+ - 'litegraph/packages/core'
+ - 'litegraph/packages/nodes-basic'
diff --git a/src/lib/components/ComfyApp.svelte b/src/lib/components/ComfyApp.svelte
index c43abec..c122f5b 100644
--- a/src/lib/components/ComfyApp.svelte
+++ b/src/lib/components/ComfyApp.svelte
@@ -1,5 +1,6 @@
diff --git a/src/routes/+page.ts b/src/routes/+page.ts
index 719b517..1e6f27a 100644
--- a/src/routes/+page.ts
+++ b/src/routes/+page.ts
@@ -9,8 +9,8 @@ type OutputProps = {}
// contain a `PageLoad` type with a `params` and `data` object that matches our route.
// You need to run the dev server or `svelte-kit sync` to generate them.
export const load: PageLoad = async ({
- params,
- data,
+ params,
+ data,
}) => {
- return {}
+ return {}
}
diff --git a/src/types/litegraph.js/litegraph.d.ts b/src/types/litegraph.js/litegraph.d.ts
deleted file mode 100644
index 14c8432..0000000
--- a/src/types/litegraph.js/litegraph.d.ts
+++ /dev/null
@@ -1,1604 +0,0 @@
-// Type definitions for litegraph.js 0.7.0
-// Project: litegraph.js
-// Definitions by: NateScarlet
-
-declare module "litegraph.js" {
- export type Vector2 = [number, number];
- export type Vector4 = [number, number, number, number];
- export type widgetTypes =
- | "number"
- | "slider"
- | "combo"
- | "text"
- | "toggle"
- | "button";
- export type SlotShape =
- | typeof LiteGraph.BOX_SHAPE
- | typeof LiteGraph.CIRCLE_SHAPE
- | typeof LiteGraph.ARROW_SHAPE
- | typeof LiteGraph.SQUARE_SHAPE
- | number; // For custom shapes
-
- /** https://github.com/jagenjo/litegraph.js/tree/master/guides#node-slots */
- export interface INodeSlot {
- name: string;
- type: string | -1;
- label?: string;
- dir?:
- | typeof LiteGraph.UP
- | typeof LiteGraph.RIGHT
- | typeof LiteGraph.DOWN
- | typeof LiteGraph.LEFT;
- color_on?: string;
- color_off?: string;
- shape?: SlotShape;
- locked?: boolean;
- nameLocked?: boolean;
- }
-
- export interface INodeInputSlot extends INodeSlot {
- link: LLink["id"] | null;
- }
- export interface INodeOutputSlot extends INodeSlot {
- links: LLink["id"][] | null;
- }
-
- export type WidgetCallback = (
- this: T,
- value: T["value"],
- graphCanvas: LGraphCanvas,
- node: LGraphNode,
- pos: Vector2,
- event?: MouseEvent
- ) => void;
-
- export interface IWidget {
- name: string | null;
- value: TValue;
- options?: TOptions;
- type?: widgetTypes;
- y?: number;
- property?: string;
- last_y?: number;
- clicked?: boolean;
- marker?: boolean;
- callback?: WidgetCallback;
- /** Called by `LGraphCanvas.drawNodeWidgets` */
- draw?(
- ctx: CanvasRenderingContext2D,
- node: LGraphNode,
- width: number,
- posY: number,
- height: number
- ): void;
- /**
- * Called by `LGraphCanvas.processNodeWidgets`
- * https://github.com/jagenjo/litegraph.js/issues/76
- */
- mouse?(
- event: MouseEvent,
- pos: Vector2,
- node: LGraphNode
- ): boolean;
- /** Called by `LGraphNode.computeSize` */
- computeSize?(width: number): [number, number];
- }
- export interface IButtonWidget extends IWidget {
- type: "button";
- }
- export interface IToggleWidget
- extends IWidget {
- type: "toggle";
- }
- export interface ISliderWidget
- extends IWidget {
- type: "slider";
- }
- export interface INumberWidget extends IWidget {
- type: "number";
- }
- export interface IComboWidget
- extends IWidget<
- string[],
- {
- values:
- | string[]
- | ((widget: IComboWidget, node: LGraphNode) => string[]);
- }
- > {
- type: "combo";
- }
-
- export interface ITextWidget extends IWidget {
- type: "text";
- }
-
- export interface IContextMenuItem {
- content: string;
- callback?: ContextMenuEventListener;
- /** Used as innerHTML for extra child element */
- title?: string;
- disabled?: boolean;
- has_submenu?: boolean;
- submenu?: {
- options: ContextMenuItem[];
- } & IContextMenuOptions;
- className?: string;
- }
- export interface IContextMenuOptions {
- callback?: ContextMenuEventListener;
- ignore_item_callbacks?: Boolean;
- event?: MouseEvent | CustomEvent;
- parentMenu?: ContextMenu;
- autoopen?: boolean;
- title?: string;
- extra?: any;
- }
-
- export type ContextMenuItem = IContextMenuItem | null;
- export type ContextMenuEventListener = (
- value: ContextMenuItem,
- options: IContextMenuOptions,
- event: MouseEvent,
- parentMenu: ContextMenu | undefined,
- node: LGraphNode
- ) => boolean | void;
-
- export interface LGraphNodeBase {
- (this: LGraphNode),
- title?: string,
- category?: string,
- supported_extensions?: string[]
- }
-
- export const LiteGraph: {
- VERSION: number;
-
- CANVAS_GRID_SIZE: number;
-
- NODE_TITLE_HEIGHT: number;
- NODE_TITLE_TEXT_Y: number;
- NODE_SLOT_HEIGHT: number;
- NODE_WIDGET_HEIGHT: number;
- NODE_WIDTH: number;
- NODE_MIN_WIDTH: number;
- NODE_COLLAPSED_RADIUS: number;
- NODE_COLLAPSED_WIDTH: number;
- NODE_TITLE_COLOR: string;
- NODE_TEXT_SIZE: number;
- NODE_TEXT_COLOR: string;
- NODE_SUBTEXT_SIZE: number;
- NODE_DEFAULT_COLOR: string;
- NODE_DEFAULT_BGCOLOR: string;
- NODE_DEFAULT_BOXCOLOR: string;
- NODE_DEFAULT_SHAPE: string;
- DEFAULT_SHADOW_COLOR: string;
- DEFAULT_GROUP_FONT: number;
-
- LINK_COLOR: string;
- EVENT_LINK_COLOR: string;
- CONNECTING_LINK_COLOR: string;
-
- MAX_NUMBER_OF_NODES: number; //avoid infinite loops
- DEFAULT_POSITION: Vector2; //default node position
- VALID_SHAPES: ["default", "box", "round", "card"]; //,"circle"
-
- //shapes are used for nodes but also for slots
- BOX_SHAPE: 1;
- ROUND_SHAPE: 2;
- CIRCLE_SHAPE: 3;
- CARD_SHAPE: 4;
- ARROW_SHAPE: 5;
- SQUARE_SHAPE: 6;
-
- //enums
- INPUT: 1;
- OUTPUT: 2;
-
- EVENT: -1; //for outputs
- ACTION: -1; //for inputs
-
- ALWAYS: 0;
- ON_EVENT: 1;
- NEVER: 2;
- ON_TRIGGER: 3;
-
- UP: 1;
- DOWN: 2;
- LEFT: 3;
- RIGHT: 4;
- CENTER: 5;
-
- STRAIGHT_LINK: 0;
- LINEAR_LINK: 1;
- SPLINE_LINK: 2;
-
- NORMAL_TITLE: 0;
- NO_TITLE: 1;
- TRANSPARENT_TITLE: 2;
- AUTOHIDE_TITLE: 3;
-
- node_images_path: string;
-
- debug: boolean;
- catch_exceptions: boolean;
- throw_errors: boolean;
- /** if set to true some nodes like Formula would be allowed to evaluate code that comes from unsafe sources (like node configuration), which could lead to exploits */
- allow_scripts: boolean;
- /** node types by string */
- registered_node_types: Record;
- /** used for dropping files in the canvas */
- node_types_by_file_extension: Record;
- /** node types by class name */
- Nodes: Record;
- /** used to store vars between graphs **/
- Globals: Record;
-
- /** used to add extra features to the search box */
- searchbox_extras: Record<
- string,
- {
- data: { outputs: string[][]; title: string };
- desc: string;
- type: string;
- }
- >;
-
- // [true!] this make the nodes box (top left circle) coloured when triggered (execute/action), visual feedback
- node_box_coloured_when_on: boolean;
- // [true!] nodebox based on node mode; visual feedback
- node_box_coloured_by_mode: boolean;
-
- // [false on mobile] better true if not touch device, TODO add an helper/listener to close if false
- dialog_close_on_mouse_leave: boolean;
- dialog_close_on_mouse_leave_delay: number;
-
- // [false!] prefer false if results too easy to break links - implement with ALT or TODO custom keys
- shift_click_do_break_link_from: boolean;
- // [false!]prefer false, way too easy to break links
- click_do_break_link_to: boolean;
-
- // [false on mobile] better true if not touch device, TODO add an helper/listener to close if false
- search_hide_on_mouse_leave: boolean;
- // [true!] enable filtering slots type in the search widget, !requires auto_load_slot_types or manual set registered_slot_[in/out]_types and slot_types_[in/out]
- search_filter_enabled: boolean;
- // [true!] opens the results list when opening the search widget
- search_show_all_on_open: boolean;
-
- // [if want false, use true, run, get vars values to be statically set, than disable] nodes types and nodeclass association with node types need to be calculated, if dont want this, calculate once and set registered_slot_[in/out]_types and slot_types_[in/out]
- auto_load_slot_types: boolean;
-
- // slot types for nodeclass
- registered_slot_in_types: Record }>;
- // slot types for nodeclass
- registered_slot_out_types: Record }>;
- // slot types IN
- slot_types_in: Array;
- // slot types OUT
- slot_types_out: Array;
- // specify for each IN slot type a(/many) default node(s), use single string, array, or object (with node, title, parameters, ..) like for search
- slot_types_default_in: Record;
- // specify for each OUT slot type a(/many) default node(s), use single string, array, or object (with node, title, parameters, ..) like for search
- slot_types_default_out: Record;
-
- // [true!] very handy, ALT click to clone and drag the new node
- alt_drag_do_clone_nodes: boolean;
-
- // [true!] will create and connect event slots when using action/events connections, !WILL CHANGE node mode when using onTrigger (enable mode colors), onExecuted does not need this
- do_add_triggers_slots: boolean;
-
- // [false!] being events, it is strongly reccomended to use them sequentially, one by one
- allow_multi_output_for_events: boolean;
-
- //[true!] allows to create and connect a ndoe clicking with the third button (wheel)
- middle_click_slot_add_default_node: boolean;
-
- //[true!] dragging a link to empty space will open a menu, add from list, search or defaults
- release_link_on_empty_shows_menu: boolean;
-
- // use mouse for retrocompatibility issues? (none found @ now)
- pointerevents_method: "mouse" | "pointer";
-
- createNode(type: string): T;
- /** Register a node class so it can be listed when the user wants to create a new one */
- registerNodeType(type: string, base: LGraphNodeBase ): void;
- /** removes a node type from the system */
- unregisterNodeType(type: string): void;
- /** Removes all previously registered node's types. */
- clearRegisteredTypes(): void;
- /**
- * Create a new node type by passing a function, it wraps it with a proper class and generates inputs according to the parameters of the function.
- * Useful to wrap simple methods that do not require properties, and that only process some input to generate an output.
- * @param name node name with namespace (p.e.: 'math/sum')
- * @param func
- * @param param_types an array containing the type of every parameter, otherwise parameters will accept any type
- * @param return_type string with the return type, otherwise it will be generic
- * @param properties properties to be configurable
- */
- wrapFunctionAsNode(
- name: string,
- func: (...args: any[]) => any,
- param_types?: string[],
- return_type?: string,
- properties?: object
- ): void;
-
- /**
- * Adds this method to all node types, existing and to be created
- * (You can add it to LGraphNode.prototype but then existing node types wont have it)
- */
- addNodeMethod(name: string, func: (...args: any[]) => any): void;
-
- /**
- * Create a node of a given type with a name. The node is not attached to any graph yet.
- * @param type full name of the node class. p.e. "math/sin"
- * @param name a name to distinguish from other nodes
- * @param options to set options
- */
- createNode(
- type: string,
- title: string,
- options: object
- ): T;
-
- /**
- * Returns a registered node type with a given name
- * @param type full name of the node class. p.e. "math/sin"
- */
- getNodeType(type: string): LGraphNodeConstructor;
-
- /**
- * Returns a list of node types matching one category
- * @method getNodeTypesInCategory
- * @param {String} category category name
- * @param {String} filter only nodes with ctor.filter equal can be shown
- * @return {Array} array with all the node classes
- */
- getNodeTypesInCategory(
- category: string,
- filter: string
- ): LGraphNodeConstructor[];
-
- /**
- * Returns a list with all the node type categories
- * @method getNodeTypesCategories
- * @param {String} filter only nodes with ctor.filter equal can be shown
- * @return {Array} array with all the names of the categories
- */
- getNodeTypesCategories(filter: string): string[];
-
- /** debug purposes: reloads all the js scripts that matches a wildcard */
- reloadNodes(folder_wildcard: string): void;
-
- getTime(): number;
- LLink: typeof LLink;
- LGraph: typeof LGraph;
- DragAndScale: typeof DragAndScale;
- compareObjects(a: object, b: object): boolean;
- distance(a: Vector2, b: Vector2): number;
- colorToString(c: string): string;
- isInsideRectangle(
- x: number,
- y: number,
- left: number,
- top: number,
- width: number,
- height: number
- ): boolean;
- growBounding(bounding: Vector4, x: number, y: number): Vector4;
- isInsideBounding(p: Vector2, bb: Vector4): boolean;
- hex2num(hex: string): [number, number, number];
- num2hex(triplet: [number, number, number]): string;
- ContextMenu: typeof ContextMenu;
- extendClass(target: A, origin: B): A & B;
- getParameterNames(func: string): string[];
- };
-
- export type serializedLGraph<
- TNode = ReturnType,
- // https://github.com/jagenjo/litegraph.js/issues/74
- TLink = [number, number, number, number, number, string],
- TGroup = ReturnType
- > = {
- last_node_id: LGraph["last_node_id"];
- last_link_id: LGraph["last_link_id"];
- nodes: TNode[];
- links: TLink[];
- groups: TGroup[];
- config: LGraph["config"];
- version: typeof LiteGraph.VERSION;
- };
-
- export type LConnectionKind = LiteGraph.INPUT | LiteGraph.OUTPUT;
-
- export declare class LGraph {
- static supported_types: string[];
- static STATUS_STOPPED: 1;
- static STATUS_RUNNING: 2;
-
- constructor(o?: object);
-
- filter: string;
- catch_errors: boolean;
- /** custom data */
- config: object;
- elapsed_time: number;
- fixedtime: number;
- fixedtime_lapse: number;
- globaltime: number;
- inputs: any;
- iteration: number;
- last_link_id: number;
- last_node_id: number;
- last_update_time: number;
- links: Record;
- list_of_graphcanvas: LGraphCanvas[];
- outputs: any;
- runningtime: number;
- starttime: number;
- status: typeof LGraph.STATUS_RUNNING | typeof LGraph.STATUS_STOPPED;
-
- private _nodes: LGraphNode[];
- private _groups: LGraphGroup[];
- private _nodes_by_id: Record;
- /** nodes that are executable sorted in execution order */
- private _nodes_executable:
- | (LGraphNode & { onExecute: NonNullable }[])
- | null;
- /** nodes that contain onExecute */
- private _nodes_in_order: LGraphNode[];
- private _version: number;
-
- getSupportedTypes(): string[];
- /** Removes all nodes from this graph */
- clear(): void;
- /** Attach Canvas to this graph */
- attachCanvas(graphCanvas: LGraphCanvas): void;
- /** Detach Canvas to this graph */
- detachCanvas(graphCanvas: LGraphCanvas): void;
- /**
- * Starts running this graph every interval milliseconds.
- * @param interval amount of milliseconds between executions, if 0 then it renders to the monitor refresh rate
- */
- start(interval?: number): void;
- /** Stops the execution loop of the graph */
- stop(): void;
- /**
- * Run N steps (cycles) of the graph
- * @param num number of steps to run, default is 1
- */
- runStep(num?: number, do_not_catch_errors?: boolean): void;
- /**
- * Updates the graph execution order according to relevance of the nodes (nodes with only outputs have more relevance than
- * nodes with only inputs.
- */
- updateExecutionOrder(): void;
- /** This is more internal, it computes the executable nodes in order and returns it */
- computeExecutionOrder(only_onExecute: boolean, set_level: any): T;
- /**
- * Returns all the nodes that could affect this one (ancestors) by crawling all the inputs recursively.
- * It doesn't include the node itself
- * @return an array with all the LGraphNodes that affect this node, in order of execution
- */
- getAncestors(node: LGraphNode): LGraphNode[];
- /**
- * Positions every node in a more readable manner
- */
- arrange(margin?: number,layout?: string): void;
- /**
- * Returns the amount of time the graph has been running in milliseconds
- * @return number of milliseconds the graph has been running
- */
- getTime(): number;
-
- /**
- * Returns the amount of time accumulated using the fixedtime_lapse var. This is used in context where the time increments should be constant
- * @return number of milliseconds the graph has been running
- */
- getFixedTime(): number;
-
- /**
- * Returns the amount of time it took to compute the latest iteration. Take into account that this number could be not correct
- * if the nodes are using graphical actions
- * @return number of milliseconds it took the last cycle
- */
- getElapsedTime(): number;
- /**
- * Sends an event to all the nodes, useful to trigger stuff
- * @param eventName the name of the event (function to be called)
- * @param params parameters in array format
- */
- sendEventToAllNodes(eventName: string, params: any[], mode?: any): void;
-
- sendActionToCanvas(action: any, params: any[]): void;
- /**
- * Adds a new node instance to this graph
- * @param node the instance of the node
- */
- add(node: LGraphNode, skip_compute_order?: boolean): void;
- /**
- * Called before the graph is changed
- */
- onBeforeChange(graph: LGraph, info: any): void;
- /**
- * Called after the graph is changed
- */
- onAfterChange(graph: LGraph, info: any): void;
- /**
- * Called when a new node is added
- * @param node the instance of the node
- */
- onNodeAdded(node: LGraphNode): void;
- /**
- * Called when a node is removed
- * @param node the instance of the node
- */
- onNodeRemoved(node: LGraphNode): void;
- /**
- * Called when a node's connection is changed
- * @param node the instance of the node
- */
- onNodeConnectionChange(kind: LConnectionKind,
- node: LGraphNode,
- slot: INodeSlot,
- target_node: LGraphNode,
- target_slot: INodeSlot): void;
- /** Called by `LGraph.configure` */
- onConfigure?(o: SerializedLGraphNode): void;
- /** Removes a node from the graph */
- remove(node: LGraphNode): void;
- /** Returns a node by its id. */
- getNodeById(id: number): LGraphNode | undefined;
- /**
- * Returns a list of nodes that matches a class
- * @param classObject the class itself (not an string)
- * @return a list with all the nodes of this type
- */
- findNodesByClass(
- classObject: LGraphNodeConstructor
- ): T[];
- /**
- * Returns a list of nodes that matches a type
- * @param type the name of the node type
- * @return a list with all the nodes of this type
- */
- findNodesByType(type: string): T[];
- /**
- * Returns the first node that matches a name in its title
- * @param title the name of the node to search
- * @return the node or null
- */
- findNodeByTitle(title: string): T | null;
- /**
- * Returns a list of nodes that matches a name
- * @param title the name of the node to search
- * @return a list with all the nodes with this name
- */
- findNodesByTitle(title: string): T[];
- /**
- * Returns the top-most node in this position of the canvas
- * @param x the x coordinate in canvas space
- * @param y the y coordinate in canvas space
- * @param nodes_list a list with all the nodes to search from, by default is all the nodes in the graph
- * @return the node at this position or null
- */
- getNodeOnPos(
- x: number,
- y: number,
- node_list?: LGraphNode[],
- margin?: number
- ): T | null;
- /**
- * Returns the top-most group in that position
- * @param x the x coordinate in canvas space
- * @param y the y coordinate in canvas space
- * @return the group or null
- */
- getGroupOnPos(x: number, y: number): LGraphGroup | null;
-
- onAction(action: any, param: any): void;
- trigger(action: any, param: any): void;
- /** Tell this graph it has a global graph input of this type */
- addInput(name: string, type: string, value?: any): void;
- /** Assign a data to the global graph input */
- setInputData(name: string, data: any): void;
- /** Returns the current value of a global graph input */
- getInputData(name: string): T;
- /** Changes the name of a global graph input */
- renameInput(old_name: string, name: string): false | undefined;
- /** Changes the type of a global graph input */
- changeInputType(name: string, type: string): false | undefined;
- /** Removes a global graph input */
- removeInput(name: string): boolean;
- /** Creates a global graph output */
- addOutput(name: string, type: string, value: any): void;
- /** Assign a data to the global output */
- setOutputData(name: string, value: string): void;
- /** Returns the current value of a global graph output */
- getOutputData(name: string): T;
-
- /** Renames a global graph output */
- renameOutput(old_name: string, name: string): false | undefined;
- /** Changes the type of a global graph output */
- changeOutputType(name: string, type: string): false | undefined;
- /** Removes a global graph output */
- removeOutput(name: string): boolean;
- triggerInput(name: string, value: any): void;
- setCallback(name: string, func: (...args: any[]) => any): void;
- beforeChange(info?: LGraphNode): void;
- afterChange(info?: LGraphNode): void;
- connectionChange(node: LGraphNode): void;
- /** returns if the graph is in live mode */
- isLive(): boolean;
- /** clears the triggered slot animation in all links (stop visual animation) */
- clearTriggeredSlots(): void;
- /* Called when something visually changed (not the graph!) */
- change(): void;
- setDirtyCanvas(fg: boolean, bg: boolean): void;
- /** Destroys a link */
- removeLink(link_id: number): void;
- /** Creates a Object containing all the info about this graph, it can be serialized */
- serialize(): T;
- /**
- * Configure a graph from a JSON string
- * @param data configure a graph from a JSON string
- * @returns if there was any error parsing
- */
- configure(data: object, keep_old?: boolean): boolean | undefined;
- load(url: string): void;
- }
-
- export type SerializedLLink = [number, string, number, number, number, number];
- export declare class LLink {
- id: number;
- type: string;
- origin_id: number;
- origin_slot: number;
- target_id: number;
- target_slot: number;
- constructor(
- id: number,
- type: string,
- origin_id: number,
- origin_slot: number,
- target_id: number,
- target_slot: number
- );
- configure(o: LLink | SerializedLLink): void;
- serialize(): SerializedLLink;
- }
-
- export type SerializedLGraphNode = {
- id: T["id"];
- type: T["type"];
- pos: T["pos"];
- size: T["size"];
- flags: T["flags"];
- mode: T["mode"];
- inputs: T["inputs"];
- outputs: T["outputs"];
- title: T["title"];
- properties: T["properties"];
- widgets_values?: IWidget["value"][];
- };
-
- /** https://github.com/jagenjo/litegraph.js/blob/master/guides/README.md#lgraphnode */
- export declare class LGraphNode {
- static title_color: string;
- static title: string;
- static type: null | string;
- static widgets_up: boolean;
- constructor(title?: string);
-
- title: string;
- type: null | string;
- category: null | string;
- size: Vector2;
- graph: null | LGraph;
- graph_version: number;
- pos: Vector2;
- is_selected: boolean;
- mouseOver: boolean;
-
- id: number;
-
- widgets: IWidget[] | null | undefined;
- widgets_values?: IWidget["value"][];
-
- //inputs available: array of inputs
- inputs: INodeInputSlot[];
- outputs: INodeOutputSlot[];
- connections: any[];
-
- //local data
- properties: Record;
- properties_info: any[];
-
- flags: Partial<{
- collapsed: boolean
- }>;
-
- color: string;
- bgcolor: string;
- boxcolor: string;
- shape:
- | typeof LiteGraph.BOX_SHAPE
- | typeof LiteGraph.ROUND_SHAPE
- | typeof LiteGraph.CIRCLE_SHAPE
- | typeof LiteGraph.CARD_SHAPE
- | typeof LiteGraph.ARROW_SHAPE;
-
- serialize_widgets: boolean;
- skip_list: boolean;
-
- /** Used in `LGraphCanvas.onMenuNodeMode` */
- mode?:
- | typeof LiteGraph.ON_EVENT
- | typeof LiteGraph.ON_TRIGGER
- | typeof LiteGraph.NEVER
- | typeof LiteGraph.ALWAYS;
-
- /** If set to true widgets do not start after the slots */
- widgets_up: boolean;
- /** widgets start at y distance from the top of the node */
- widgets_start_y: number;
- /** if you render outside the node, it will be clipped */
- clip_area: boolean;
- /** if set to false it wont be resizable with the mouse */
- resizable: boolean;
- /** slots are distributed horizontally */
- horizontal: boolean;
- /** if true, the node will show the bgcolor as 'red' */
- has_errors?: boolean;
-
- /** configure a node from an object containing the serialized info */
- configure(info: SerializedLGraphNode): void;
- /** serialize the content */
- serialize(): SerializedLGraphNode;
- /** Creates a clone of this node */
- clone(): this;
- /** serialize and stringify */
- toString(): string;
- /** get the title string */
- getTitle(): string;
- /** sets the value of a property */
- setProperty(name: string, value: any): void;
- /** sets the output data */
- setOutputData(slot: number, data: any): void;
- /** sets the output data */
- setOutputDataType(slot: number, type: string): void;
- /**
- * Retrieves the input data (data traveling through the connection) from one slot
- * @param slot
- * @param force_update if set to true it will force the connected node of this slot to output data into this link
- * @return data or if it is not connected returns undefined
- */
- getInputData(slot: number, force_update?: boolean): T;
- /**
- * Retrieves the input data type (in case this supports multiple input types)
- * @param slot
- * @return datatype in string format
- */
- getInputDataType(slot: number): string;
- /**
- * Retrieves the input data from one slot using its name instead of slot number
- * @param slot_name
- * @param force_update if set to true it will force the connected node of this slot to output data into this link
- * @return data or if it is not connected returns null
- */
- getInputDataByName(slot_name: string, force_update?: boolean): T;
- /** tells you if there is a connection in one input slot */
- isInputConnected(slot: number): boolean;
- /** tells you info about an input connection (which node, type, etc) */
- getInputInfo(
- slot: number
- ): { link: number; name: string; type: string | 0 } | null;
- /** returns the node connected in the input slot */
- getInputNode(slot: number): LGraphNode | null;
- /** returns the value of an input with this name, otherwise checks if there is a property with that name */
- getInputOrProperty(name: string): T;
- /** tells you the last output data that went in that slot */
- getOutputData(slot: number): T | null;
- /** tells you info about an output connection (which node, type, etc) */
- getOutputInfo(
- slot: number
- ): { name: string; type: string; links: number[] } | null;
- /** tells you if there is a connection in one output slot */
- isOutputConnected(slot: number): boolean;
- /** tells you if there is any connection in the output slots */
- isAnyOutputConnected(): boolean;
- /** retrieves all the nodes connected to this output slot */
- getOutputNodes(slot: number): LGraphNode[];
- /** Triggers an event in this node, this will trigger any output with the same name */
- trigger(action: string, param: any): void;
- /**
- * Triggers an slot event in this node
- * @param slot the index of the output slot
- * @param param
- * @param link_id in case you want to trigger and specific output link in a slot
- */
- triggerSlot(slot: number, param: any, link_id?: number): void;
- /**
- * clears the trigger slot animation
- * @param slot the index of the output slot
- * @param link_id in case you want to trigger and specific output link in a slot
- */
- clearTriggeredSlot(slot: number, link_id?: number): void;
- /**
- * add a new property to this node
- * @param name
- * @param default_value
- * @param type string defining the output type ("vec3","number",...)
- * @param extra_info this can be used to have special properties of the property (like values, etc)
- */
- addProperty(
- name: string,
- default_value: any,
- type: string,
- extra_info?: object
- ): T;
- /**
- * add a new output slot to use in this node
- * @param name
- * @param type string defining the output type ("vec3","number",...)
- * @param extra_info this can be used to have special properties of an output (label, special color, position, etc)
- */
- addOutput(
- name: string,
- type: string | -1,
- extra_info?: Partial
- ): INodeOutputSlot;
- /**
- * add a new output slot to use in this node
- * @param array of triplets like [[name,type,extra_info],[...]]
- */
- addOutputs(
- array: [string, string | -1, Partial | undefined][]
- ): void;
- /** remove an existing output slot */
- removeOutput(slot: number): void;
- /**
- * add a new input slot to use in this node
- * @param name
- * @param type string defining the input type ("vec3","number",...), it its a generic one use 0
- * @param extra_info this can be used to have special properties of an input (label, color, position, etc)
- */
- addInput(
- name: string,
- type: string | -1,
- extra_info?: Partial
- ): INodeInputSlot;
- /**
- * add several new input slots in this node
- * @param array of triplets like [[name,type,extra_info],[...]]
- */
- addInputs(
- array: [string, string | -1, Partial | undefined][]
- ): void;
- /** remove an existing input slot */
- removeInput(slot: number): void;
- /**
- * add an special connection to this node (used for special kinds of graphs)
- * @param name
- * @param type string defining the input type ("vec3","number",...)
- * @param pos position of the connection inside the node
- * @param direction if is input or output
- */
- addConnection(
- name: string,
- type: string,
- pos: Vector2,
- direction: string
- ): {
- name: string;
- type: string;
- pos: Vector2;
- direction: string;
- links: null;
- };
- setValue(v: any): void;
- /** computes the size of a node according to its inputs and output slots */
- computeSize(): [number, number];
- /**
- * https://github.com/jagenjo/litegraph.js/blob/master/guides/README.md#node-widgets
- * @return created widget
- */
- addWidget(
- type: T["type"],
- name: string,
- value: T["value"],
- callback?: WidgetCallback | string,
- options?: T["options"]
- ): T;
-
- addCustomWidget(customWidget: T): T;
-
- /**
- * returns the bounding of the object, used for rendering purposes
- * @return [x, y, width, height]
- */
- getBounding(): Vector4;
- /** checks if a point is inside the shape of a node */
- isPointInside(
- x: number,
- y: number,
- margin?: number,
- skipTitle?: boolean
- ): boolean;
- /** checks if a point is inside a node slot, and returns info about which slot */
- getSlotInPosition(
- x: number,
- y: number
- ): {
- input?: INodeInputSlot;
- output?: INodeOutputSlot;
- slot: number;
- link_pos: Vector2;
- };
- /**
- * returns the input slot with a given name (used for dynamic slots), -1 if not found
- * @param name the name of the slot
- * @return the slot (-1 if not found)
- */
- findInputSlot(name: string): number;
- /**
- * returns the output slot with a given name (used for dynamic slots), -1 if not found
- * @param name the name of the slot
- * @return the slot (-1 if not found)
- */
- findOutputSlot(name: string): number;
- /**
- * connect this node output to the input of another node
- * @param slot (could be the number of the slot or the string with the name of the slot)
- * @param targetNode the target node
- * @param targetSlot the input slot of the target node (could be the number of the slot or the string with the name of the slot, or -1 to connect a trigger)
- * @return {Object} the link_info is created, otherwise null
- */
- connect(
- slot: number | string,
- targetNode: LGraphNode,
- targetSlot: number | string
- ): T | null;
- /**
- * disconnect one output to an specific node
- * @param slot (could be the number of the slot or the string with the name of the slot)
- * @param target_node the target node to which this slot is connected [Optional, if not target_node is specified all nodes will be disconnected]
- * @return if it was disconnected successfully
- */
- disconnectOutput(slot: number | string, targetNode?: LGraphNode): boolean;
- /**
- * disconnect one input
- * @param slot (could be the number of the slot or the string with the name of the slot)
- * @return if it was disconnected successfully
- */
- disconnectInput(slot: number | string): boolean;
- /**
- * returns the center of a connection point in canvas coords
- * @param is_input true if if a input slot, false if it is an output
- * @param slot (could be the number of the slot or the string with the name of the slot)
- * @param out a place to store the output, to free garbage
- * @return the position
- **/
- getConnectionPos(
- is_input: boolean,
- slot: number | string,
- out?: Vector2
- ): Vector2;
- /** Force align to grid */
- alignToGrid(): void;
- /** Console output */
- trace(msg: string): void;
- /** Forces to redraw or the main canvas (LGraphNode) or the bg canvas (links) */
- setDirtyCanvas(fg: boolean, bg: boolean): void;
- loadImage(url: string): void;
- /** Allows to get onMouseMove and onMouseUp events even if the mouse is out of focus */
- captureInput(v: any): void;
- /** Collapse the node to make it smaller on the canvas */
- collapse(force: boolean): void;
- /** Forces the node to do not move or realign on Z */
- pin(v?: boolean): void;
- localToScreen(x: number, y: number, graphCanvas: LGraphCanvas): Vector2;
-
- // https://github.com/jagenjo/litegraph.js/blob/master/guides/README.md#custom-node-appearance
- onDrawBackground?(
- ctx: CanvasRenderingContext2D,
- canvas: HTMLCanvasElement
- ): void;
- onDrawForeground?(
- ctx: CanvasRenderingContext2D,
- canvas: HTMLCanvasElement
- ): void;
-
- // https://github.com/jagenjo/litegraph.js/blob/master/guides/README.md#custom-node-behaviour
- onMouseDown?(
- event: MouseEvent,
- pos: Vector2,
- graphCanvas: LGraphCanvas
- ): void;
- onMouseMove?(
- event: MouseEvent,
- pos: Vector2,
- graphCanvas: LGraphCanvas
- ): void;
- onMouseUp?(
- event: MouseEvent,
- pos: Vector2,
- graphCanvas: LGraphCanvas
- ): void;
- onMouseEnter?(
- event: MouseEvent,
- pos: Vector2,
- graphCanvas: LGraphCanvas
- ): void;
- onMouseLeave?(
- event: MouseEvent,
- pos: Vector2,
- graphCanvas: LGraphCanvas
- ): void;
- onKey?(event: KeyboardEvent, pos: Vector2, graphCanvas: LGraphCanvas): void;
-
- /** Called by `LGraphCanvas.selectNodes` */
- onSelected?(): void;
- /** Called by `LGraphCanvas.deselectNode` */
- onDeselected?(): void;
- /** Called by `LGraph.runStep` `LGraphNode.getInputData` */
- onExecute?(): void;
- /** Called by `LGraph.serialize` */
- onSerialize?(o: SerializedLGraphNode): void;
- /** Called by `LGraph.configure` */
- onConfigure?(o: SerializedLGraphNode): void;
- /**
- * when added to graph (warning: this is called BEFORE the node is configured when loading)
- * Called by `LGraph.add`
- */
- onAdded?(graph: LGraph): void;
- /**
- * when removed from graph
- * Called by `LGraph.remove` `LGraph.clear`
- */
- onRemoved?(): void;
- /**
- * if returns false the incoming connection will be canceled
- * Called by `LGraph.connect`
- * @param inputIndex target input slot number
- * @param outputType type of output slot
- * @param outputSlot output slot object
- * @param outputNode node containing the output
- * @param outputIndex index of output slot
- */
- onConnectInput?(
- inputIndex: number,
- outputType: INodeOutputSlot["type"],
- outputSlot: INodeOutputSlot,
- outputNode: LGraphNode,
- outputIndex: number
- ): boolean;
- /**
- * if returns false the incoming connection will be canceled
- * Called by `LGraph.connect`
- * @param outputIndex target output slot number
- * @param inputType type of input slot
- * @param inputSlot input slot object
- * @param inputNode node containing the input
- * @param inputIndex index of input slot
- */
- onConnectOutput?(
- outputIndex: number,
- inputType: INodeInputSlot["type"],
- inputSlot: INodeInputSlot,
- inputNode: LGraphNode,
- inputIndex: number
- ): boolean;
-
- /**
- * Called just before connection (or disconnect - if input is linked).
- * A convenient place to switch to another input, or create new one.
- * This allow for ability to automatically add slots if needed
- * @param inputIndex
- * @return selected input slot index, can differ from parameter value
- */
- onBeforeConnectInput?(
- inputIndex: number
- ): number;
-
- /** a connection changed (new one or removed) (LiteGraph.INPUT or LiteGraph.OUTPUT, slot, true if connected, link_info, input_info or output_info ) */
- onConnectionsChange(
- type: number,
- slotIndex: number,
- isConnected: boolean,
- link: LLink,
- ioSlot: (INodeOutputSlot | INodeInputSlot)
- ): void;
-
- /**
- * if returns false, will abort the `LGraphNode.setProperty`
- * Called when a property is changed
- * @param property
- * @param value
- * @param prevValue
- */
- onPropertyChanged?(property: string, value: any, prevValue: any): void | boolean;
-
- /** Called by `LGraphCanvas.processContextMenu` */
- getMenuOptions?(graphCanvas: LGraphCanvas): ContextMenuItem[];
- getSlotMenuOptions?(slot: INodeSlot): ContextMenuItem[];
- }
-
- export type LGraphNodeConstructor = {
- new (): T;
- };
-
- export type SerializedLGraphGroup = {
- title: LGraphGroup["title"];
- bounding: LGraphGroup["_bounding"];
- color: LGraphGroup["color"];
- font: LGraphGroup["font"];
- };
- export declare class LGraphGroup {
- title: string;
- private _bounding: Vector4;
- color: string;
- font: string;
-
- configure(o: SerializedLGraphGroup): void;
- serialize(): SerializedLGraphGroup;
- move(deltaX: number, deltaY: number, ignoreNodes?: boolean): void;
- recomputeInsideNodes(): void;
- isPointInside: LGraphNode["isPointInside"];
- setDirtyCanvas: LGraphNode["setDirtyCanvas"];
- }
-
- export declare class DragAndScale {
- constructor(element?: HTMLElement, skipEvents?: boolean);
- offset: [number, number];
- scale: number;
- max_scale: number;
- min_scale: number;
- onredraw: Function | null;
- enabled: boolean;
- last_mouse: Vector2;
- element: HTMLElement | null;
- visible_area: Vector4;
- bindEvents(element: HTMLElement): void;
- computeVisibleArea(): void;
- onMouse(e: MouseEvent): void;
- toCanvasContext(ctx: CanvasRenderingContext2D): void;
- convertOffsetToCanvas(pos: Vector2): Vector2;
- convertCanvasToOffset(pos: Vector2): Vector2;
- mouseDrag(x: number, y: number): void;
- changeScale(value: number, zooming_center?: Vector2): void;
- changeDeltaScale(value: number, zooming_center?: Vector2): void;
- reset(): void;
- }
-
- /**
- * This class is in charge of rendering one graph inside a canvas. And provides all the interaction required.
- * Valid callbacks are: onNodeSelected, onNodeDeselected, onShowNodePanel, onNodeDblClicked
- *
- * @param canvas the canvas where you want to render (it accepts a selector in string format or the canvas element itself)
- * @param graph
- * @param options { skip_rendering, autoresize }
- */
- export declare class LGraphCanvas {
- static node_colors: Record<
- string,
- {
- color: string;
- bgcolor: string;
- groupcolor: string;
- }
- >;
- static link_type_colors: Record;
- static gradients: object;
- static search_limit: number;
-
- static getFileExtension(url: string): string;
- static decodeHTML(str: string): string;
-
- static onMenuCollapseAll(): void;
- static onMenuNodeEdit(): void;
- static onShowPropertyEditor(
- item: any,
- options: any,
- e: any,
- menu: any,
- node: any
- ): void;
- /** Create menu for `Add Group` */
- static onGroupAdd: ContextMenuEventListener;
- /** Create menu for `Add Node` */
- static onMenuAdd: ContextMenuEventListener;
- static showMenuNodeOptionalInputs: ContextMenuEventListener;
- static showMenuNodeOptionalOutputs: ContextMenuEventListener;
- static onShowMenuNodeProperties: ContextMenuEventListener;
- static onResizeNode: ContextMenuEventListener;
- static onMenuNodeCollapse: ContextMenuEventListener;
- static onMenuNodePin: ContextMenuEventListener;
- static onMenuNodeMode: ContextMenuEventListener;
- static onMenuNodeColors: ContextMenuEventListener;
- static onMenuNodeShapes: ContextMenuEventListener;
- static onMenuNodeRemove: ContextMenuEventListener;
- static onMenuNodeClone: ContextMenuEventListener;
-
- constructor(
- canvas: HTMLCanvasElement | string,
- graph?: LGraph,
- options?: {
- skip_render?: boolean;
- autoresize?: boolean;
- }
- );
-
- static active_canvas: HTMLCanvasElement;
-
- allow_dragcanvas: boolean;
- allow_dragnodes: boolean;
- /** allow to control widgets, buttons, collapse, etc */
- allow_interaction: boolean;
- /** allows to change a connection with having to redo it again */
- allow_reconnect_links: boolean;
- /** allow selecting multi nodes without pressing extra keys */
- multi_select: boolean;
- /** No effect */
- allow_searchbox: boolean;
- always_render_background: boolean;
- autoresize?: boolean;
- background_image: string;
- bgcanvas: HTMLCanvasElement;
- bgctx: CanvasRenderingContext2D;
- canvas: HTMLCanvasElement;
- canvas_mouse: Vector2;
- clear_background: boolean;
- connecting_node: LGraphNode | null;
- connections_width: number;
- ctx: CanvasRenderingContext2D;
- current_node: LGraphNode | null;
- default_connection_color: {
- input_off: string;
- input_on: string;
- output_off: string;
- output_on: string;
- };
- default_link_color: string;
- dirty_area: Vector4 | null;
- dirty_bgcanvas?: boolean;
- dirty_canvas?: boolean;
- drag_mode: boolean;
- dragging_canvas: boolean;
- dragging_rectangle: Vector4 | null;
- ds: DragAndScale;
- /** used for transition */
- editor_alpha: number;
- filter: any;
- fps: number;
- frame: number;
- graph: LGraph;
- highlighted_links: Record;
- highquality_render: boolean;
- inner_text_font: string;
- is_rendering: boolean;
- last_draw_time: number;
- last_mouse: Vector2;
- /**
- * Possible duplicated with `last_mouse`
- * https://github.com/jagenjo/litegraph.js/issues/70
- */
- last_mouse_position: Vector2;
- /** Timestamp of last mouse click, defaults to 0 */
- last_mouseclick: number;
- links_render_mode:
- | typeof LiteGraph.STRAIGHT_LINK
- | typeof LiteGraph.LINEAR_LINK
- | typeof LiteGraph.SPLINE_LINK;
- live_mode: boolean;
- node_capturing_input: LGraphNode | null;
- node_dragged: LGraphNode | null;
- node_in_panel: LGraphNode | null;
- node_over: LGraphNode | null;
- node_title_color: string;
- node_widget: [LGraphNode, IWidget] | null;
- /** Called by `LGraphCanvas.clear` */
- onClear?(): void;
- /** Called by `LGraphCanvas.drawBackCanvas` */
- onDrawBackground:
- | ((ctx: CanvasRenderingContext2D, visibleArea: Vector4) => void)
- | null;
- /** Called by `LGraphCanvas.drawFrontCanvas` */
- onDrawForeground:
- | ((ctx: CanvasRenderingContext2D, visibleArea: Vector4) => void)
- | null;
- onDrawOverlay: ((ctx: CanvasRenderingContext2D) => void) | null;
- /** Called by `LGraphCanvas.processMouseDown` */
- onMouse: ((event: MouseEvent) => boolean) | null;
- /** Called by `LGraphCanvas.drawFrontCanvas` and `LGraphCanvas.drawLinkTooltip` */
- onDrawLinkTooltip: ((ctx: CanvasRenderingContext2D, link: LLink, _this: this) => void) | null;
- /** Called by `LGraphCanvas.selectNodes` */
- onNodeMoved: ((node: LGraphNode) => void) | null;
- /** Called by `LGraphCanvas.processNodeSelected` */
- onNodeSelected: ((node: LGraphNode) => void) | null;
- /** Called by `LGraphCanvas.deselectNode` */
- onNodeDeselected: ((node: LGraphNode) => void) | null;
- /** Called by `LGraphCanvas.processNodeDblClicked` */
- onShowNodePanel: ((node: LGraphNode) => void) | null;
- /** Called by `LGraphCanvas.processNodeDblClicked` */
- onNodeDblClicked: ((node: LGraphNode) => void) | null;
- /** Called by `LGraphCanvas.selectNodes` */
- onSelectionChange: ((nodes: Record) => void) | null;
- /** Called by `LGraphCanvas.showSearchBox` */
- onSearchBox:
- | ((
- helper: Element,
- value: string,
- graphCanvas: LGraphCanvas
- ) => string[])
- | null;
- onSearchBoxSelection:
- | ((name: string, event: MouseEvent, graphCanvas: LGraphCanvas) => void)
- | null;
- pause_rendering: boolean;
- render_canvas_border: boolean;
- render_collapsed_slots: boolean;
- render_connection_arrows: boolean;
- render_connections_border: boolean;
- render_connections_shadows: boolean;
- render_curved_connections: boolean;
- render_execution_order: boolean;
- render_only_selected: boolean;
- render_shadows: boolean;
- render_title_colored: boolean;
- round_radius: number;
- selected_group: null | LGraphGroup;
- selected_group_resizing: boolean;
- selected_nodes: Record;
- show_info: boolean;
- title_text_font: string;
- /** set to true to render title bar with gradients */
- use_gradients: boolean;
- visible_area: DragAndScale["visible_area"];
- visible_links: LLink[];
- visible_nodes: LGraphNode[];
- zoom_modify_alpha: boolean;
-
- /** clears all the data inside */
- clear(): void;
- /** assigns a graph, you can reassign graphs to the same canvas */
- setGraph(graph: LGraph, skipClear?: boolean): void;
- /** opens a graph contained inside a node in the current graph */
- openSubgraph(graph: LGraph): void;
- /** closes a subgraph contained inside a node */
- closeSubgraph(): void;
- /** assigns a canvas */
- setCanvas(canvas: HTMLCanvasElement, skipEvents?: boolean): void;
- /** binds mouse, keyboard, touch and drag events to the canvas */
- bindEvents(): void;
- /** unbinds mouse events from the canvas */
- unbindEvents(): void;
-
- /**
- * this function allows to render the canvas using WebGL instead of Canvas2D
- * this is useful if you plant to render 3D objects inside your nodes, it uses litegl.js for webgl and canvas2DtoWebGL to emulate the Canvas2D calls in webGL
- **/
- enableWebGL(): void;
-
- /**
- * marks as dirty the canvas, this way it will be rendered again
- * @param fg if the foreground canvas is dirty (the one containing the nodes)
- * @param bg if the background canvas is dirty (the one containing the wires)
- */
- setDirty(fg: boolean, bg: boolean): void;
-
- /**
- * Used to attach the canvas in a popup
- * @return the window where the canvas is attached (the DOM root node)
- */
- getCanvasWindow(): Window;
- /** starts rendering the content of the canvas when needed */
- startRendering(): void;
- /** stops rendering the content of the canvas (to save resources) */
- stopRendering(): void;
-
- processMouseDown(e: MouseEvent): boolean | undefined;
- processMouseMove(e: MouseEvent): boolean | undefined;
- processMouseUp(e: MouseEvent): boolean | undefined;
- processMouseWheel(e: MouseEvent): boolean | undefined;
-
- /** returns true if a position (in graph space) is on top of a node little corner box */
- isOverNodeBox(node: LGraphNode, canvasX: number, canvasY: number): boolean;
- /** returns true if a position (in graph space) is on top of a node input slot */
- isOverNodeInput(
- node: LGraphNode,
- canvasX: number,
- canvasY: number,
- slotPos: Vector2
- ): boolean;
-
- /** process a key event */
- processKey(e: KeyboardEvent): boolean | undefined;
-
- copyToClipboard(): void;
- pasteFromClipboard(): void;
- processDrop(e: DragEvent): void;
- checkDropItem(e: DragEvent): void;
- processNodeDblClicked(n: LGraphNode): void;
- processNodeSelected(n: LGraphNode, e: MouseEvent): void;
- processNodeDeselected(node: LGraphNode): void;
-
- /** selects a given node (or adds it to the current selection) */
- selectNode(node: LGraphNode, add?: boolean): void;
- /** selects several nodes (or adds them to the current selection) */
- selectNodes(nodes?: LGraphNode[], add?: boolean): void;
- /** removes a node from the current selection */
- deselectNode(node: LGraphNode): void;
- /** removes all nodes from the current selection */
- deselectAllNodes(): void;
- /** deletes all nodes in the current selection from the graph */
- deleteSelectedNodes(): void;
-
- /** centers the camera on a given node */
- centerOnNode(node: LGraphNode): void;
- /** changes the zoom level of the graph (default is 1), you can pass also a place used to pivot the zoom */
- setZoom(value: number, center: Vector2): void;
- /** brings a node to front (above all other nodes) */
- bringToFront(node: LGraphNode): void;
- /** sends a node to the back (below all other nodes) */
- sendToBack(node: LGraphNode): void;
- /** checks which nodes are visible (inside the camera area) */
- computeVisibleNodes(nodes: LGraphNode[]): LGraphNode[];
- /** renders the whole canvas content, by rendering in two separated canvas, one containing the background grid and the connections, and one containing the nodes) */
- draw(forceFG?: boolean, forceBG?: boolean): void;
- /** draws the front canvas (the one containing all the nodes) */
- drawFrontCanvas(): void;
- /** draws some useful stats in the corner of the canvas */
- renderInfo(ctx: CanvasRenderingContext2D, x: number, y: number): void;
- /** draws the back canvas (the one containing the background and the connections) */
- drawBackCanvas(): void;
- /** draws the given node inside the canvas */
- drawNode(node: LGraphNode, ctx: CanvasRenderingContext2D): void;
- /** draws graphic for node's slot */
- drawSlotGraphic(ctx: CanvasRenderingContext2D, pos: number[], shape: SlotShape, horizontal: boolean): void;
- /** draws the shape of the given node in the canvas */
- drawNodeShape(
- node: LGraphNode,
- ctx: CanvasRenderingContext2D,
- size: [number, number],
- fgColor: string,
- bgColor: string,
- selected: boolean,
- mouseOver: boolean
- ): void;
- /** draws every connection visible in the canvas */
- drawConnections(ctx: CanvasRenderingContext2D): void;
- /**
- * draws a link between two points
- * @param a start pos
- * @param b end pos
- * @param link the link object with all the link info
- * @param skipBorder ignore the shadow of the link
- * @param flow show flow animation (for events)
- * @param color the color for the link
- * @param startDir the direction enum
- * @param endDir the direction enum
- * @param numSublines number of sublines (useful to represent vec3 or rgb)
- **/
- renderLink(
- a: Vector2,
- b: Vector2,
- link: object,
- skipBorder: boolean,
- flow: boolean,
- color?: string,
- startDir?: number,
- endDir?: number,
- numSublines?: number
- ): void;
-
- computeConnectionPoint(
- a: Vector2,
- b: Vector2,
- t: number,
- startDir?: number,
- endDir?: number
- ): void;
-
- drawExecutionOrder(ctx: CanvasRenderingContext2D): void;
- /** draws the widgets stored inside a node */
- drawNodeWidgets(
- node: LGraphNode,
- posY: number,
- ctx: CanvasRenderingContext2D,
- activeWidget: object
- ): void;
- /** process an event on widgets */
- processNodeWidgets(
- node: LGraphNode,
- pos: Vector2,
- event: Event,
- activeWidget: object
- ): void;
- /** draws every group area in the background */
- drawGroups(canvas: any, ctx: CanvasRenderingContext2D): void;
- adjustNodesSize(): void;
- /** resizes the canvas to a given size, if no size is passed, then it tries to fill the parentNode */
- resize(width?: number, height?: number): void;
- /**
- * switches to live mode (node shapes are not rendered, only the content)
- * this feature was designed when graphs where meant to create user interfaces
- **/
- switchLiveMode(transition?: boolean): void;
- onNodeSelectionChange(): void;
- touchHandler(event: TouchEvent): void;
-
- showLinkMenu(link: LLink, e: any): false;
- prompt(
- title: string,
- value: any,
- callback: Function,
- event: any
- ): HTMLDivElement;
- showSearchBox(event?: MouseEvent): void;
- showEditPropertyValue(node: LGraphNode, property: any, options: any): void;
- createDialog(
- html: string,
- options?: { position?: Vector2; event?: MouseEvent }
- ): void;
-
- convertOffsetToCanvas: DragAndScale["convertOffsetToCanvas"];
- convertCanvasToOffset: DragAndScale["convertCanvasToOffset"];
- /** converts event coordinates from canvas2D to graph coordinates */
- convertEventToCanvasOffset(e: MouseEvent): Vector2;
- /** adds some useful properties to a mouse event, like the position in graph coordinates */
- adjustMouseEvent(e: MouseEvent): void;
-
- getCanvasMenuOptions(): ContextMenuItem[];
- getNodeMenuOptions(node: LGraphNode): ContextMenuItem[];
- getGroupMenuOptions(): ContextMenuItem[];
- /** Called by `getCanvasMenuOptions`, replace default options */
- getMenuOptions?(): ContextMenuItem[];
- /** Called by `getCanvasMenuOptions`, append to default options */
- getExtraMenuOptions?(): ContextMenuItem[];
- /** Called when mouse right click */
- processContextMenu(node: LGraphNode, event: Event): void;
- }
-
- declare class ContextMenu {
- static trigger(
- element: HTMLElement,
- event_name: string,
- params: any,
- origin: any
- ): void;
- static isCursorOverElement(event: MouseEvent, element: HTMLElement): void;
- static closeAllContextMenus(window: Window): void;
- constructor(values: ContextMenuItem[], options?: IContextMenuOptions, window?: Window);
- options: IContextMenuOptions;
- parentMenu?: ContextMenu;
- lock: boolean;
- current_submenu?: ContextMenu;
- addItem(
- name: string,
- value: ContextMenuItem,
- options?: IContextMenuOptions
- ): void;
- close(e?: MouseEvent, ignore_parent_menu?: boolean): void;
- getTopMenu(): void;
- getFirstEvent(): void;
- }
-
- declare global {
- interface CanvasRenderingContext2D {
- /** like rect but rounded corners */
- roundRect(
- x: number,
- y: number,
- width: number,
- height: number,
- radius: number,
- radiusLow: number
- ): void;
- }
-
- interface Math {
- clamp(v: number, min: number, max: number): number;
- }
- }
-}
diff --git a/tsconfig.json b/tsconfig.json
index fcdfe27..136c663 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,14 +1,3 @@
{
- "extends": "./.svelte-kit/tsconfig.json",
- "exclude": ["node_modules/litegraph.js/src/*"],
- "compilerOptions": {
- "typeRoots": [
- "types",
- "../node_modules/@types"
- ],
- "paths": {
- "$lib": ["./src/lib"],
- "$lib/*": ["./src/lib/*"]
- }
- }
+ "extends": "./.svelte-kit/tsconfig.json"
}
diff --git a/vite.config.ts b/vite.config.ts
index 062c6bc..dbf5327 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -6,7 +6,7 @@ import FullReload from 'vite-plugin-full-reload';
export default defineConfig({
clearScreen: false,
plugins: [
- tsconfigPaths({loose: true}),
+ tsconfigPaths({ loose: true }),
sveltekit(),
FullReload(["src/**/*.{js,ts,svelte}"])
],
@@ -16,7 +16,10 @@ export default defineConfig({
server: {
port: 3000,
fs: {
- allow: ["./gradio"]
+ allow: [
+ "./gradio",
+ "./litegraph",
+ ]
}
},
test: {