It is the core of Kotori and provides many important features of kotori (encapsulates fluoro).It has fully the support for browser and other not node.js (such as quick.js or service-worker),more details view Use in browser.
The @kotori-bot/core package is the core package of the bot,it only used ecmascript standard api, so you can use it in any the environments which support ecmascript >= 2020.
typescript
import { Adapter, Api, Core, Elements, type Message, Messages, MessageScope } from '@kotori-bot/core'
+
+const core = new Core({
+ global: {
+ commandPrefix: '/'
+ }
+})
+
+function MyPlugin(ctx: Core) {
+ ctx.command('echo <msg>').action(({ args: [msg] }, session) => {
+ alert(`You said: ${msg}`)
+ console.log(session)
+ })
+}
+
+core.load(MyPlugin)
+
+core.start()
+
+class BrowserAdapter extends Adapter {
+ public platform = 'browser'
+
+ public constructor(ctx: Core) {
+ super(ctx, { commandPrefix: '/', extends: 'browser', master: '1', lang: 'zh_CN' }, 'browser')
+ }
+
+ public api = new (class extends Api {
+ public getSupportedEvents(): ReturnType<Api['getSupportedEvents']> {
+ return ['on_message']
+ }
+ })(this) as Api
+
+ public elements = new (class extends Elements {
+ getSupportsElements(): ReturnType<Elements['getSupportsElements']> {
+ return []
+ }
+
+ decode(message: Message): string {
+ return message.toString()
+ }
+
+ encode(raw: string): Message {
+ return Messages(raw)
+ }
+ })(this) as Elements
+
+ public handle = this.session.bind(this)
+
+ public start() {}
+ public stop() {}
+ public send() {}
+}
+
+const bot = new BrowserAdapter(core)
+
+const result = prompt('input:')
+
+bot.handle('on_message', {
+ type: MessageScope.PRIVATE,
+ message: result ?? '',
+ messageAlt: 'alt',
+ messageId: '1',
+ time: Date.now(),
+ userId: '1',
+ sender: {
+ nickname: 'my-browser'
+ }
+})
+
+
+
+
\ No newline at end of file
diff --git a/advanced/contributing.html b/advanced/contributing.html
new file mode 100644
index 00000000..23c99ecf
--- /dev/null
+++ b/advanced/contributing.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+ Contributing | Kotori
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Of course, you can also install @kotori-bot/core or @kotori-bot/loader by according your needs, about the difference and modifications between them, see architecture.
typescript
import { Loader } from 'kotori-bot'
+
+const loader = new Loader()
+
+loader.run(true)
On May In 2023 years,AI chat models(mainly referred to Claude and OpenAi) rose,I was interested in them. Many people use python to build QQ chatbot and connect to the AI chat models,but as a JavaScript developer, I decided to use JavaScript to do the same thing (Just for fun and to learn).Of course,at that time I didn't know that the community had already the chatbot framework base on Node.js.
At first,I only intended to implement QQ platform's access and the project's name is ISLABot.The name could be followed 2022 years and more early,at that time I was develop another chatbot framework's plugins by chinese language(be like shit),I named the plugin ISLABot(was from the anime character).I forgot the time when started use typescript as developing language for the project.The first commit to github is at 14th on June and the project had already renamed Kotori Bot,at the some time I fell in love with using romaji to named the project.
During the 0.x ~ 1.0 version,I had been adapted to QQ platform(base on go-cqhttp), During that time,I referred to many similar projects's api interface designs and thinkings.Finally,I released v1.0 at 29th on Dec In 2023 and moved repository from my own account biyuehu/kotori-bot to organization account kotorijs/kotori.
Waiting update...
+
+
+
+
\ No newline at end of file
diff --git a/advanced/index.html b/advanced/index.html
new file mode 100644
index 00000000..42fa3392
--- /dev/null
+++ b/advanced/index.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+ Fluoro | Kotori
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Fluoro, its original word is Fluorine (F₂), it is the strongest monatomic oxidant in nature, except for some inert gases, it can react with almost all elements, and its compounds are extremely rich and diverse and have stability. Take this name, hoping Fluoro has strong ability, thus build various diversified frameworks and provide strong underlying support.
Misakura is a galgame(Visual novel games) made framework based on tauri, PIXI.js (solid.js) and Fluoro. It used Fluoro to implement scripts(lines command) parser.
Open source is a great thing,the developing process of every open-source projects need other projects' support and reference to help self improvement and walking farther.
This page is currently being written.For the time being, you can only view the TSDoc comments in the source code for details.Italics indicate that the documentation for this content needs to be improved.
+
+
+
+
\ No newline at end of file
diff --git a/architecture.png b/architecture.png
new file mode 100644
index 00000000..bff4cfd0
Binary files /dev/null and b/architecture.png differ
diff --git a/architecture.svg b/architecture.svg
new file mode 100644
index 00000000..4a50b6fc
--- /dev/null
+++ b/architecture.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/advanced_architecture.md.BdGjYBxR.js b/assets/advanced_architecture.md.BdGjYBxR.js
new file mode 100644
index 00000000..bf0e1665
--- /dev/null
+++ b/assets/advanced_architecture.md.BdGjYBxR.js
@@ -0,0 +1 @@
+import{N as t}from"./chunks/NpmBadge.B2DFOvX-.js";import{c as r,I as a,a3 as i,j as o,a as e,o as s}from"./chunks/framework.8cvu3CMh.js";const l="/architecture.svg",n=i('
',4),c=o("p",null,[e("Fluoro is universal meta-framework,provides "),o("code",null,"Context"),e(),o("code",null,"Modules"),e(" and "),o("code",null,"Events"),e(". it is the base of whole Kotori,more details view "),o("a",{href:"./"},"Fluoro"),e(".")],-1),d=o("h3",{id:"kotori-bot-core",tabindex:"-1"},[e("@kotori-bot/core "),o("a",{class:"header-anchor",href:"#kotori-bot-core","aria-label":'Permalink to "@kotori-bot/core"'},"")],-1),h=o("p",null,[e("It is the core of Kotori and provides many important features of kotori (encapsulates "),o("code",null,"fluoro"),e(").It has fully the support for browser and other not node.js (such as "),o("a",{href:"https://bellard.org/quickjs/",target:"_blank",rel:"noreferrer"},"quick.js"),e(" or service-worker),more details view "),o("a",{href:"./browser.html"},"Use in browser"),e(".")],-1),u=o("h3",{id:"kotori-bot-loader",tabindex:"-1"},[e("@kotori-bot/loader "),o("a",{class:"header-anchor",href:"#kotori-bot-loader","aria-label":'Permalink to "@kotori-bot/loader"'},"")],-1),k=o("p",null,[e("It encapsulates "),o("code",null,"@kotori-bot/loader"),e(" and provides some interface and features need server environments (Node.js).")],-1),b=o("h3",{id:"kotori-bot-logger",tabindex:"-1"},[e("@kotori-bot/logger "),o("a",{class:"header-anchor",href:"#kotori-bot-logger","aria-label":'Permalink to "@kotori-bot/logger"'},"")],-1),_=o("p",null,"It is fully functional logger base on adapters thinking and supports browser.",-1),p=o("h3",{id:"kotori-bot-i18n",tabindex:"-1"},[e("@kotori-bot/i18n "),o("a",{class:"header-anchor",href:"#kotori-bot-i18n","aria-label":'Permalink to "@kotori-bot/i18n"'},"")],-1),m=o("p",null,[e("It is a i18n module,provides "),o("code",null,"i18n"),e(" for "),o("code",null,"@kotori-bot/core"),e(".")],-1),f=o("h3",{id:"kotori-bot-tools",tabindex:"-1"},[e("@kotori-bot/tools "),o("a",{class:"header-anchor",href:"#kotori-bot-tools","aria-label":'Permalink to "@kotori-bot/tools"'},"")],-1),g=o("p",null,[e("It is a tools module,provides some useful tools for "),o("code",null,"@kotori-bot/core"),e(" and "),o("code",null,"@kotori-bot/loader"),e(".")],-1),v=o("h3",{id:"tsukiko",tabindex:"-1"},[e("tsukiko "),o("a",{class:"header-anchor",href:"#tsukiko","aria-label":'Permalink to "tsukiko"'},"")],-1),P=o("p",null,"It used to parse and check data type at running time.",-1),x=o("h2",{id:"process-image",tabindex:"-1"},[e("Process image "),o("a",{class:"header-anchor",href:"#process-image","aria-label":'Permalink to "Process image"'},"")],-1),w=o("p",null,[o("img",{src:l,alt:"architecture"})],-1),A=JSON.parse('{"title":"Architecture","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/architecture.md","filePath":"advanced/architecture.md","lastUpdated":1723295344000}'),I={name:"advanced/architecture.md"},V=Object.assign(I,{setup(N){return(q,j)=>(s(),r("div",null,[n,a(t,{package:"fluoro"}),c,d,a(t,{package:"@kotori-bot/core"}),h,u,a(t,{package:"@kotori-bot/loader"}),k,b,a(t,{package:"@kotori-bot/logger"}),_,p,a(t,{package:"@kotori-bot/i18n"}),m,f,a(t,{package:"@kotori-bot/tools"}),g,v,a(t,{package:"tsukiko"}),P,x,w]))}});export{A as __pageData,V as default};
diff --git a/assets/advanced_architecture.md.BdGjYBxR.lean.js b/assets/advanced_architecture.md.BdGjYBxR.lean.js
new file mode 100644
index 00000000..1346c64f
--- /dev/null
+++ b/assets/advanced_architecture.md.BdGjYBxR.lean.js
@@ -0,0 +1 @@
+import{N as t}from"./chunks/NpmBadge.B2DFOvX-.js";import{c as r,I as a,a3 as i,j as o,a as e,o as s}from"./chunks/framework.8cvu3CMh.js";const l="/architecture.svg",n=i("",4),c=o("p",null,[e("Fluoro is universal meta-framework,provides "),o("code",null,"Context"),e(),o("code",null,"Modules"),e(" and "),o("code",null,"Events"),e(". it is the base of whole Kotori,more details view "),o("a",{href:"./"},"Fluoro"),e(".")],-1),d=o("h3",{id:"kotori-bot-core",tabindex:"-1"},[e("@kotori-bot/core "),o("a",{class:"header-anchor",href:"#kotori-bot-core","aria-label":'Permalink to "@kotori-bot/core"'},"")],-1),h=o("p",null,[e("It is the core of Kotori and provides many important features of kotori (encapsulates "),o("code",null,"fluoro"),e(").It has fully the support for browser and other not node.js (such as "),o("a",{href:"https://bellard.org/quickjs/",target:"_blank",rel:"noreferrer"},"quick.js"),e(" or service-worker),more details view "),o("a",{href:"./browser.html"},"Use in browser"),e(".")],-1),u=o("h3",{id:"kotori-bot-loader",tabindex:"-1"},[e("@kotori-bot/loader "),o("a",{class:"header-anchor",href:"#kotori-bot-loader","aria-label":'Permalink to "@kotori-bot/loader"'},"")],-1),k=o("p",null,[e("It encapsulates "),o("code",null,"@kotori-bot/loader"),e(" and provides some interface and features need server environments (Node.js).")],-1),b=o("h3",{id:"kotori-bot-logger",tabindex:"-1"},[e("@kotori-bot/logger "),o("a",{class:"header-anchor",href:"#kotori-bot-logger","aria-label":'Permalink to "@kotori-bot/logger"'},"")],-1),_=o("p",null,"It is fully functional logger base on adapters thinking and supports browser.",-1),p=o("h3",{id:"kotori-bot-i18n",tabindex:"-1"},[e("@kotori-bot/i18n "),o("a",{class:"header-anchor",href:"#kotori-bot-i18n","aria-label":'Permalink to "@kotori-bot/i18n"'},"")],-1),m=o("p",null,[e("It is a i18n module,provides "),o("code",null,"i18n"),e(" for "),o("code",null,"@kotori-bot/core"),e(".")],-1),f=o("h3",{id:"kotori-bot-tools",tabindex:"-1"},[e("@kotori-bot/tools "),o("a",{class:"header-anchor",href:"#kotori-bot-tools","aria-label":'Permalink to "@kotori-bot/tools"'},"")],-1),g=o("p",null,[e("It is a tools module,provides some useful tools for "),o("code",null,"@kotori-bot/core"),e(" and "),o("code",null,"@kotori-bot/loader"),e(".")],-1),v=o("h3",{id:"tsukiko",tabindex:"-1"},[e("tsukiko "),o("a",{class:"header-anchor",href:"#tsukiko","aria-label":'Permalink to "tsukiko"'},"")],-1),P=o("p",null,"It used to parse and check data type at running time.",-1),x=o("h2",{id:"process-image",tabindex:"-1"},[e("Process image "),o("a",{class:"header-anchor",href:"#process-image","aria-label":'Permalink to "Process image"'},"")],-1),w=o("p",null,[o("img",{src:l,alt:"architecture"})],-1),A=JSON.parse('{"title":"Architecture","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/architecture.md","filePath":"advanced/architecture.md","lastUpdated":1723295344000}'),I={name:"advanced/architecture.md"},V=Object.assign(I,{setup(N){return(q,j)=>(s(),r("div",null,[n,a(t,{package:"fluoro"}),c,d,a(t,{package:"@kotori-bot/core"}),h,u,a(t,{package:"@kotori-bot/loader"}),k,b,a(t,{package:"@kotori-bot/logger"}),_,p,a(t,{package:"@kotori-bot/i18n"}),m,f,a(t,{package:"@kotori-bot/tools"}),g,v,a(t,{package:"tsukiko"}),P,x,w]))}});export{A as __pageData,V as default};
diff --git a/assets/advanced_browser.md.Dq7g-2RL.js b/assets/advanced_browser.md.Dq7g-2RL.js
new file mode 100644
index 00000000..f67cfb88
--- /dev/null
+++ b/assets/advanced_browser.md.Dq7g-2RL.js
@@ -0,0 +1,68 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const F=JSON.parse('{"title":"Use in browser","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/browser.md","filePath":"advanced/browser.md","lastUpdated":1723293723000}'),h={name:"advanced/browser.md"},k=n(`
The @kotori-bot/core package is the core package of the bot,it only used ecmascript standard api, so you can use it in any the environments which support ecmascript >= 2020.
typescript
import { Adapter, Api, Core, Elements, type Message, Messages, MessageScope } from '@kotori-bot/core'
+
+const core = new Core({
+ global: {
+ commandPrefix: '/'
+ }
+})
+
+function MyPlugin(ctx: Core) {
+ ctx.command('echo <msg>').action(({ args: [msg] }, session) => {
+ alert(\`You said: \${msg}\`)
+ console.log(session)
+ })
+}
+
+core.load(MyPlugin)
+
+core.start()
+
+class BrowserAdapter extends Adapter {
+ public platform = 'browser'
+
+ public constructor(ctx: Core) {
+ super(ctx, { commandPrefix: '/', extends: 'browser', master: '1', lang: 'zh_CN' }, 'browser')
+ }
+
+ public api = new (class extends Api {
+ public getSupportedEvents(): ReturnType<Api['getSupportedEvents']> {
+ return ['on_message']
+ }
+ })(this) as Api
+
+ public elements = new (class extends Elements {
+ getSupportsElements(): ReturnType<Elements['getSupportsElements']> {
+ return []
+ }
+
+ decode(message: Message): string {
+ return message.toString()
+ }
+
+ encode(raw: string): Message {
+ return Messages(raw)
+ }
+ })(this) as Elements
+
+ public handle = this.session.bind(this)
+
+ public start() {}
+ public stop() {}
+ public send() {}
+}
+
+const bot = new BrowserAdapter(core)
+
+const result = prompt('input:')
+
+bot.handle('on_message', {
+ type: MessageScope.PRIVATE,
+ message: result ?? '',
+ messageAlt: 'alt',
+ messageId: '1',
+ time: Date.now(),
+ userId: '1',
+ sender: {
+ nickname: 'my-browser'
+ }
+})
`,5),p=[k];function l(t,e,E,r,d,g){return a(),i("div",null,p)}const c=s(h,[["render",l]]);export{F as __pageData,c as default};
diff --git a/assets/advanced_browser.md.Dq7g-2RL.lean.js b/assets/advanced_browser.md.Dq7g-2RL.lean.js
new file mode 100644
index 00000000..66cac942
--- /dev/null
+++ b/assets/advanced_browser.md.Dq7g-2RL.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const F=JSON.parse('{"title":"Use in browser","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/browser.md","filePath":"advanced/browser.md","lastUpdated":1723293723000}'),h={name:"advanced/browser.md"},k=n("",5),p=[k];function l(t,e,E,r,d,g){return a(),i("div",null,p)}const c=s(h,[["render",l]]);export{F as __pageData,c as default};
diff --git a/assets/advanced_contributing.md.Btuh7jEk.js b/assets/advanced_contributing.md.Btuh7jEk.js
new file mode 100644
index 00000000..361ffb94
--- /dev/null
+++ b/assets/advanced_contributing.md.Btuh7jEk.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o as a,a3 as o}from"./chunks/framework.8cvu3CMh.js";const b=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/contributing.md","filePath":"advanced/contributing.md","lastUpdated":1723293723000}'),r={name:"advanced/contributing.md"},i=o('
It's used for documentation purposes and styles (such as language and formatting).
',8),s=[i];function n(c,d,l,p,u,h){return a(),e("div",null,s)}const _=t(r,[["render",n]]);export{b as __pageData,_ as default};
diff --git a/assets/advanced_contributing.md.Btuh7jEk.lean.js b/assets/advanced_contributing.md.Btuh7jEk.lean.js
new file mode 100644
index 00000000..296a7352
--- /dev/null
+++ b/assets/advanced_contributing.md.Btuh7jEk.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o as a,a3 as o}from"./chunks/framework.8cvu3CMh.js";const b=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/contributing.md","filePath":"advanced/contributing.md","lastUpdated":1723293723000}'),r={name:"advanced/contributing.md"},i=o("",8),s=[i];function n(c,d,l,p,u,h){return a(),e("div",null,s)}const _=t(r,[["render",n]]);export{b as __pageData,_ as default};
diff --git a/assets/advanced_develop.md.C9UbVuuv.js b/assets/advanced_develop.md.C9UbVuuv.js
new file mode 100644
index 00000000..3dc9ab77
--- /dev/null
+++ b/assets/advanced_develop.md.C9UbVuuv.js
@@ -0,0 +1,5 @@
+import{_ as s,c as e,o as a,a3 as i}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"Develop","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/develop.md","filePath":"advanced/develop.md","lastUpdated":1723293723000}'),t={name:"advanced/develop.md"},n=i(`
Of course, you can also install @kotori-bot/core or @kotori-bot/loader by according your needs, about the difference and modifications between them, see architecture.
typescript
import { Loader } from 'kotori-bot'
+
+const loader = new Loader()
+
+loader.run(true)
build:action Build all packages at the workspace base safe mode.
dev:only Only start else nodemon
pub Publish all packages at the workspace base public access
test Run all unit tests at the workspace
version Generate CHANGELOG.md
`,14),l=[n];function p(d,o,h,c,r,k){return a(),e("div",null,l)}const b=s(t,[["render",p]]);export{u as __pageData,b as default};
diff --git a/assets/advanced_develop.md.C9UbVuuv.lean.js b/assets/advanced_develop.md.C9UbVuuv.lean.js
new file mode 100644
index 00000000..6dd7d117
--- /dev/null
+++ b/assets/advanced_develop.md.C9UbVuuv.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as e,o as a,a3 as i}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"Develop","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/develop.md","filePath":"advanced/develop.md","lastUpdated":1723293723000}'),t={name:"advanced/develop.md"},n=i("",14),l=[n];function p(d,o,h,c,r,k){return a(),e("div",null,l)}const b=s(t,[["render",p]]);export{u as __pageData,b as default};
diff --git a/assets/advanced_history.md.CGTpUhpG.js b/assets/advanced_history.md.CGTpUhpG.js
new file mode 100644
index 00000000..60c6d3f4
--- /dev/null
+++ b/assets/advanced_history.md.CGTpUhpG.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o,a3 as a}from"./chunks/framework.8cvu3CMh.js";const f=JSON.parse('{"title":"History","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/history.md","filePath":"advanced/history.md","lastUpdated":1723293723000}'),r={name:"advanced/history.md"},n=a('
On May In 2023 years,AI chat models(mainly referred to Claude and OpenAi) rose,I was interested in them. Many people use python to build QQ chatbot and connect to the AI chat models,but as a JavaScript developer, I decided to use JavaScript to do the same thing (Just for fun and to learn).Of course,at that time I didn't know that the community had already the chatbot framework base on Node.js.
At first,I only intended to implement QQ platform's access and the project's name is ISLABot.The name could be followed 2022 years and more early,at that time I was develop another chatbot framework's plugins by chinese language(be like shit),I named the plugin ISLABot(was from the anime character).I forgot the time when started use typescript as developing language for the project.The first commit to github is at 14th on June and the project had already renamed Kotori Bot,at the some time I fell in love with using romaji to named the project.
During the 0.x ~ 1.0 version,I had been adapted to QQ platform(base on go-cqhttp), During that time,I referred to many similar projects's api interface designs and thinkings.Finally,I released v1.0 at 29th on Dec In 2023 and moved repository from my own account biyuehu/kotori-bot to organization account kotorijs/kotori.
Waiting update...
',6),s=[n];function i(d,h,c,l,p,m){return o(),e("div",null,s)}const g=t(r,[["render",i]]);export{f as __pageData,g as default};
diff --git a/assets/advanced_history.md.CGTpUhpG.lean.js b/assets/advanced_history.md.CGTpUhpG.lean.js
new file mode 100644
index 00000000..16be2159
--- /dev/null
+++ b/assets/advanced_history.md.CGTpUhpG.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o,a3 as a}from"./chunks/framework.8cvu3CMh.js";const f=JSON.parse('{"title":"History","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/history.md","filePath":"advanced/history.md","lastUpdated":1723293723000}'),r={name:"advanced/history.md"},n=a("",6),s=[n];function i(d,h,c,l,p,m){return o(),e("div",null,s)}const g=t(r,[["render",i]]);export{f as __pageData,g as default};
diff --git a/assets/advanced_index.md.CTptRUsD.js b/assets/advanced_index.md.CTptRUsD.js
new file mode 100644
index 00000000..204e3f87
--- /dev/null
+++ b/assets/advanced_index.md.CTptRUsD.js
@@ -0,0 +1 @@
+import{_ as e,c as a,o,a3 as t}from"./chunks/framework.8cvu3CMh.js";const r="/fluoro.png",_=JSON.parse('{"title":"Fluoro","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/index.md","filePath":"advanced/index.md","lastUpdated":1723295344000}'),i={name:"advanced/index.md"},s=t('
Fluoro, its original word is Fluorine (F₂), it is the strongest monatomic oxidant in nature, except for some inert gases, it can react with almost all elements, and its compounds are extremely rich and diverse and have stability. Take this name, hoping Fluoro has strong ability, thus build various diversified frameworks and provide strong underlying support.
Misakura is a galgame(Visual novel games) made framework based on tauri, PIXI.js (solid.js) and Fluoro. It used Fluoro to implement scripts(lines command) parser.
',12),n=[s];function l(d,c,h,u,p,m){return o(),a("div",null,n)}const f=e(i,[["render",l]]);export{_ as __pageData,f as default};
diff --git a/assets/advanced_index.md.CTptRUsD.lean.js b/assets/advanced_index.md.CTptRUsD.lean.js
new file mode 100644
index 00000000..48e7aa3b
--- /dev/null
+++ b/assets/advanced_index.md.CTptRUsD.lean.js
@@ -0,0 +1 @@
+import{_ as e,c as a,o,a3 as t}from"./chunks/framework.8cvu3CMh.js";const r="/fluoro.png",_=JSON.parse('{"title":"Fluoro","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/index.md","filePath":"advanced/index.md","lastUpdated":1723295344000}'),i={name:"advanced/index.md"},s=t("",12),n=[s];function l(d,c,h,u,p,m){return o(),a("div",null,n)}const f=e(i,[["render",l]]);export{_ as __pageData,f as default};
diff --git a/assets/advanced_testing.md.BO4L03-4.js b/assets/advanced_testing.md.BO4L03-4.js
new file mode 100644
index 00000000..b4a57d89
--- /dev/null
+++ b/assets/advanced_testing.md.BO4L03-4.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o as s,a3 as a}from"./chunks/framework.8cvu3CMh.js";const g=JSON.parse('{"title":"Testing","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/testing.md","filePath":"advanced/testing.md","lastUpdated":1723293723000}'),n={name:"advanced/testing.md"},i=a('
',6),o=[i];function r(d,c,l,p,h,_){return s(),e("div",null,o)}const m=t(n,[["render",r]]);export{g as __pageData,m as default};
diff --git a/assets/advanced_testing.md.BO4L03-4.lean.js b/assets/advanced_testing.md.BO4L03-4.lean.js
new file mode 100644
index 00000000..2a7cdc72
--- /dev/null
+++ b/assets/advanced_testing.md.BO4L03-4.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o as s,a3 as a}from"./chunks/framework.8cvu3CMh.js";const g=JSON.parse('{"title":"Testing","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/testing.md","filePath":"advanced/testing.md","lastUpdated":1723293723000}'),n={name:"advanced/testing.md"},i=a("",6),o=[i];function r(d,c,l,p,h,_){return s(),e("div",null,o)}const m=t(n,[["render",r]]);export{g as __pageData,m as default};
diff --git a/assets/advanced_thanks.md.BRroQCpD.js b/assets/advanced_thanks.md.BRroQCpD.js
new file mode 100644
index 00000000..bc125d69
--- /dev/null
+++ b/assets/advanced_thanks.md.BRroQCpD.js
@@ -0,0 +1 @@
+import{_ as e,c as t,o as a,a3 as r}from"./chunks/framework.8cvu3CMh.js";const k=JSON.parse('{"title":"Thanks","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/thanks.md","filePath":"advanced/thanks.md","lastUpdated":1723293723000}'),n={name:"advanced/thanks.md"},o=r('
Open source is a great thing,the developing process of every open-source projects need other projects' support and reference to help self improvement and walking farther.
',7),s=[o];function i(l,h,c,d,p,_){return a(),t("div",null,s)}const u=e(n,[["render",i]]);export{k as __pageData,u as default};
diff --git a/assets/advanced_thanks.md.BRroQCpD.lean.js b/assets/advanced_thanks.md.BRroQCpD.lean.js
new file mode 100644
index 00000000..776f271f
--- /dev/null
+++ b/assets/advanced_thanks.md.BRroQCpD.lean.js
@@ -0,0 +1 @@
+import{_ as e,c as t,o as a,a3 as r}from"./chunks/framework.8cvu3CMh.js";const k=JSON.parse('{"title":"Thanks","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/thanks.md","filePath":"advanced/thanks.md","lastUpdated":1723293723000}'),n={name:"advanced/thanks.md"},o=r("",7),s=[o];function i(l,h,c,d,p,_){return a(),t("div",null,s)}const u=e(n,[["render",i]]);export{k as __pageData,u as default};
diff --git a/assets/api_index.md.BWFmbu5J.js b/assets/api_index.md.BWFmbu5J.js
new file mode 100644
index 00000000..76d4862e
--- /dev/null
+++ b/assets/api_index.md.BWFmbu5J.js
@@ -0,0 +1 @@
+import{_ as e,c as r,o as t,a3 as o}from"./chunks/framework.8cvu3CMh.js";const g=JSON.parse('{"title":"Api references","description":"","frontmatter":{},"headers":[],"relativePath":"api/index.md","filePath":"api/index.md","lastUpdated":1723293723000}'),a={name:"api/index.md"},s=o('
This page is currently being written.For the time being, you can only view the TSDoc comments in the source code for details.Italics indicate that the documentation for this content needs to be improved.
',10),i=[s];function l(c,n,h,m,b,k){return t(),r("div",null,i)}const f=e(a,[["render",l]]);export{g as __pageData,f as default};
diff --git a/assets/api_index.md.BWFmbu5J.lean.js b/assets/api_index.md.BWFmbu5J.lean.js
new file mode 100644
index 00000000..76dcc26e
--- /dev/null
+++ b/assets/api_index.md.BWFmbu5J.lean.js
@@ -0,0 +1 @@
+import{_ as e,c as r,o as t,a3 as o}from"./chunks/framework.8cvu3CMh.js";const g=JSON.parse('{"title":"Api references","description":"","frontmatter":{},"headers":[],"relativePath":"api/index.md","filePath":"api/index.md","lastUpdated":1723293723000}'),a={name:"api/index.md"},s=o("",10),i=[s];function l(c,n,h,m,b,k){return t(),r("div",null,i)}const f=e(a,[["render",l]]);export{g as __pageData,f as default};
diff --git a/assets/app.Cre6H7Sg.js b/assets/app.Cre6H7Sg.js
new file mode 100644
index 00000000..e4575238
--- /dev/null
+++ b/assets/app.Cre6H7Sg.js
@@ -0,0 +1 @@
+import{R as i}from"./chunks/theme.yfXX7Drk.js";import{U as o,a4 as u,a5 as c,a6 as l,a7 as f,a8 as d,a9 as m,aa as h,ab as g,ac as A,ad as y,d as P,u as v,y as w,x as C,ae as R,af as b,ag as E,a2 as S}from"./chunks/framework.8cvu3CMh.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(i),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return w(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),b(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function x(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function D(){return g(T)}function _(){let e=o,a;return A(t=>{let n=y(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&x().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{x as createApp};
diff --git a/assets/basic_config.md.C3s1f9Xj.js b/assets/basic_config.md.C3s1f9Xj.js
new file mode 100644
index 00000000..e3527453
--- /dev/null
+++ b/assets/basic_config.md.C3s1f9Xj.js
@@ -0,0 +1,55 @@
+import{_ as i,c as s,o as a,a3 as l}from"./chunks/framework.8cvu3CMh.js";const E=JSON.parse('{"title":"配置详解","description":"","frontmatter":{},"headers":[],"relativePath":"basic/config.md","filePath":"basic/config.md","lastUpdated":1723345558000}'),n={name:"basic/config.md"},e=l(`
`,69),t=[e];function p(h,k,o,d,r,g){return a(),s("div",null,t)}const y=i(n,[["render",p]]);export{E as __pageData,y as default};
diff --git a/assets/basic_config.md.C3s1f9Xj.lean.js b/assets/basic_config.md.C3s1f9Xj.lean.js
new file mode 100644
index 00000000..76e01b4f
--- /dev/null
+++ b/assets/basic_config.md.C3s1f9Xj.lean.js
@@ -0,0 +1 @@
+import{_ as i,c as s,o as a,a3 as l}from"./chunks/framework.8cvu3CMh.js";const E=JSON.parse('{"title":"配置详解","description":"","frontmatter":{},"headers":[],"relativePath":"basic/config.md","filePath":"basic/config.md","lastUpdated":1723345558000}'),n={name:"basic/config.md"},e=l("",69),t=[e];function p(h,k,o,d,r,g){return a(),s("div",null,t)}const y=i(n,[["render",p]]);export{E as __pageData,y as default};
diff --git a/assets/basic_index.md.BZl8Y3qq.js b/assets/basic_index.md.BZl8Y3qq.js
new file mode 100644
index 00000000..b05059a0
--- /dev/null
+++ b/assets/basic_index.md.BZl8Y3qq.js
@@ -0,0 +1 @@
+import{d as c,o,c as n,j as e,I as l,a as t,a3 as h}from"./chunks/framework.8cvu3CMh.js";import{N as d}from"./chunks/NpmBadge.B2DFOvX-.js";const p=c({__name:"Voice",setup(s){function a(){new Audio("/assets/kotori.mp3").play()}return(r,i)=>(o(),n("span",null,[e("input",{type:"image",src:"https://cn.vitejs.dev/voice.svg#voice",onClick:i[0]||(i[0]=q=>a()),class:"voice",style:{"background-color":"rgb(243, 244, 245)",border:"none",padding:"3px","border-radius":"4px","vertical-align":"bottom",height:"1.5em",width:"1.5em"}})]))}}),_=e("h1",{id:"简介",tabindex:"-1"},[t("简介 "),e("a",{class:"header-anchor",href:"#简介","aria-label":'Permalink to "简介"'},"")],-1),u=e("hr",null,null,-1),b=e("p",null,[t("kotori 是一个"),e("strong",null,"跨平台、解耦合、现代化"),t("于一体的聊天机器人框架,运行于 Node.js 环境,使用 TypeScript 语言开发。")],-1),g=e("h2",{id:"概述",tabindex:"-1"},[t("概述 "),e("a",{class:"header-anchor",href:"#概述","aria-label":'Permalink to "概述"'},"")],-1),m=e("code",null,"/kotolɪ/",-1),f=e("a",{href:"http://key.visualarts.gr.jp/",target:"_blank",rel:"noreferrer"},"Key 公式",-1),k=e("a",{href:"https://bgm.tv/subject/4022",target:"_blank",rel:"noreferrer"},"《Rewrite》",-1),v=e("a",{href:"https://bgm.tv/character/12063",target:"_blank",rel:"noreferrer"},"神户小鸟",-1),x=h('
`,41),l=[e];function p(o,h,k,d,r,c){return a(),i("div",null,l)}const u=s(n,[["render",p]]);export{g as __pageData,u as default};
diff --git a/assets/basic_modules.md.BLLWjbYM.lean.js b/assets/basic_modules.md.BLLWjbYM.lean.js
new file mode 100644
index 00000000..4914a022
--- /dev/null
+++ b/assets/basic_modules.md.BLLWjbYM.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as t}from"./chunks/framework.8cvu3CMh.js";const g=JSON.parse('{"title":"模块安装","description":"","frontmatter":{},"headers":[],"relativePath":"basic/modules.md","filePath":"basic/modules.md","lastUpdated":1723293723000}'),n={name:"basic/modules.md"},e=t("",41),l=[e];function p(o,h,k,d,r,c){return a(),i("div",null,l)}const u=s(n,[["render",p]]);export{g as __pageData,u as default};
diff --git a/assets/basic_start.md.6V305fMK.js b/assets/basic_start.md.6V305fMK.js
new file mode 100644
index 00000000..9d3a3d47
--- /dev/null
+++ b/assets/basic_start.md.6V305fMK.js
@@ -0,0 +1,17 @@
+import{_ as s,c as i,o as a,a3 as t}from"./chunks/framework.8cvu3CMh.js";const F=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"basic/start.md","filePath":"basic/start.md","lastUpdated":1723345558000}'),e={name:"basic/start.md"},h=t(`
7/19 23:59:59 LOG (1372799) : Http server started at http://127.0.0.1:720
+7/20 0:0:0 LOG (1372799) : WebSocket server started at ws://127.0.0.1:720
+KotoriO > 当前未设置 Webui 账号与密码,请输入 /webui 指令以进行初始化
`,57),n=[h];function l(p,k,o,d,r,c){return a(),i("div",null,n)}const b=s(e,[["render",l]]);export{F as __pageData,b as default};
diff --git a/assets/basic_start.md.6V305fMK.lean.js b/assets/basic_start.md.6V305fMK.lean.js
new file mode 100644
index 00000000..efa24ba5
--- /dev/null
+++ b/assets/basic_start.md.6V305fMK.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as t}from"./chunks/framework.8cvu3CMh.js";const F=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"basic/start.md","filePath":"basic/start.md","lastUpdated":1723345558000}'),e={name:"basic/start.md"},h=t("",57),n=[h];function l(p,k,o,d,r,c){return a(),i("div",null,n)}const b=s(e,[["render",l]]);export{F as __pageData,b as default};
diff --git a/assets/basic_usage.md.DE7RZjNK.js b/assets/basic_usage.md.DE7RZjNK.js
new file mode 100644
index 00000000..f0481231
--- /dev/null
+++ b/assets/basic_usage.md.DE7RZjNK.js
@@ -0,0 +1,45 @@
+import{_ as i,c as a,o as s,a3 as l}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"立即使用","description":"","frontmatter":{},"headers":[],"relativePath":"basic/usage.md","filePath":"basic/usage.md","lastUpdated":1723293723000}'),t={name:"basic/usage.md"},e=l(`
/github kotorijs/kotori
+> 地址:kotorijs/kotori
+描述:Cross platform, decoupled, and modernized ChatBot framework base on NodeJS
+语言:TypeScript
+所有者:kotorijs
+创建时间:
+2023-06-14T11:45:16Z
+最后更新时间:2023-12-31T15:28:10Z
+最后推送时间:2024-01-14T09:48:13Z
+开源协议:GNU General Public License v3.0
但是,其需要判断 args[0] 并处理无效时的情况,额外的代码嵌套依旧不够优雅。且多个操作下对于参数个数要求不一,如查询可以直接输入 list query,但对于添加/删除往往需要在后方再传入一个参数以指定添加/删除目标 list add xxx。因此,当同一指令有多个操作(即多个指令回调函数)且各个操作间相对独立时可使用子指令。基础用法:
`,86),t=[k];function l(p,e,E,d,r,g){return a(),i("div",null,t)}const c=s(h,[["render",l]]);export{F as __pageData,c as default};
diff --git a/assets/guide_base_command.md.PWBzd1WC.lean.js b/assets/guide_base_command.md.PWBzd1WC.lean.js
new file mode 100644
index 00000000..f8272f65
--- /dev/null
+++ b/assets/guide_base_command.md.PWBzd1WC.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const F=JSON.parse('{"title":"指令注册","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/command.md","filePath":"guide/base/command.md","lastUpdated":1723293723000}'),h={name:"guide/base/command.md"},k=n("",86),t=[k];function l(p,e,E,d,r,g){return a(),i("div",null,t)}const c=s(h,[["render",l]]);export{F as __pageData,c as default};
diff --git a/assets/guide_base_events.md.BhNr5NVY.js b/assets/guide_base_events.md.BhNr5NVY.js
new file mode 100644
index 00000000..d5d7ba82
--- /dev/null
+++ b/assets/guide_base_events.md.BhNr5NVY.js
@@ -0,0 +1,63 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const c=JSON.parse('{"title":"事件系统","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/events.md","filePath":"guide/base/events.md","lastUpdated":1712229374000}'),h={name:"guide/base/events.md"},t=n(`
`,46),p=[t];function k(l,e,E,d,r,g){return a(),i("div",null,p)}const y=s(h,[["render",k]]);export{c as __pageData,y as default};
diff --git a/assets/guide_base_events.md.BhNr5NVY.lean.js b/assets/guide_base_events.md.BhNr5NVY.lean.js
new file mode 100644
index 00000000..5f577d52
--- /dev/null
+++ b/assets/guide_base_events.md.BhNr5NVY.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const c=JSON.parse('{"title":"事件系统","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/events.md","filePath":"guide/base/events.md","lastUpdated":1712229374000}'),h={name:"guide/base/events.md"},t=n("",46),p=[t];function k(l,e,E,d,r,g){return a(),i("div",null,p)}const y=s(h,[["render",k]]);export{c as __pageData,y as default};
diff --git a/assets/guide_base_middleware.md.DM4acwvC.js b/assets/guide_base_middleware.md.DM4acwvC.js
new file mode 100644
index 00000000..0528a373
--- /dev/null
+++ b/assets/guide_base_middleware.md.DM4acwvC.js
@@ -0,0 +1,59 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const c=JSON.parse('{"title":"中间件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/middleware.md","filePath":"guide/base/middleware.md","lastUpdated":1723293723000}'),h={name:"guide/base/middleware.md"},l=n(`
`,30),p=[l];function k(t,e,E,d,r,g){return a(),i("div",null,p)}const o=s(h,[["render",k]]);export{c as __pageData,o as default};
diff --git a/assets/guide_base_middleware.md.DM4acwvC.lean.js b/assets/guide_base_middleware.md.DM4acwvC.lean.js
new file mode 100644
index 00000000..19815a10
--- /dev/null
+++ b/assets/guide_base_middleware.md.DM4acwvC.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const c=JSON.parse('{"title":"中间件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/middleware.md","filePath":"guide/base/middleware.md","lastUpdated":1723293723000}'),h={name:"guide/base/middleware.md"},l=n("",30),p=[l];function k(t,e,E,d,r,g){return a(),i("div",null,p)}const o=s(h,[["render",k]]);export{c as __pageData,o as default};
diff --git a/assets/guide_base_regexp.md.CT1wfhEq.js b/assets/guide_base_regexp.md.CT1wfhEq.js
new file mode 100644
index 00000000..ff5b433b
--- /dev/null
+++ b/assets/guide_base_regexp.md.CT1wfhEq.js
@@ -0,0 +1,48 @@
+import{_ as s,c as i,o as a,a3 as h}from"./chunks/framework.8cvu3CMh.js";const y=JSON.parse('{"title":"正则匹配","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/regexp.md","filePath":"guide/base/regexp.md","lastUpdated":1723293723000}'),k={name:"guide/base/regexp.md"},n=h(`
`,30),p=[n];function t(l,e,E,d,r,g){return a(),i("div",null,p)}const c=s(k,[["render",t]]);export{y as __pageData,c as default};
diff --git a/assets/guide_base_regexp.md.CT1wfhEq.lean.js b/assets/guide_base_regexp.md.CT1wfhEq.lean.js
new file mode 100644
index 00000000..fdc6d2ca
--- /dev/null
+++ b/assets/guide_base_regexp.md.CT1wfhEq.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as h}from"./chunks/framework.8cvu3CMh.js";const y=JSON.parse('{"title":"正则匹配","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/regexp.md","filePath":"guide/base/regexp.md","lastUpdated":1723293723000}'),k={name:"guide/base/regexp.md"},n=h("",30),p=[n];function t(l,e,E,d,r,g){return a(),i("div",null,p)}const c=s(k,[["render",t]]);export{y as __pageData,c as default};
diff --git a/assets/guide_components_adapter.md.D1rga5Px.js b/assets/guide_components_adapter.md.D1rga5Px.js
new file mode 100644
index 00000000..67fdd733
--- /dev/null
+++ b/assets/guide_components_adapter.md.D1rga5Px.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o,j as e,a as r}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"实现适配器类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components/adapter.md","filePath":"guide/components/adapter.md","lastUpdated":1712229374000}'),s={name:"guide/components/adapter.md"},n=e("h1",{id:"实现适配器类",tabindex:"-1"},[r("实现适配器类 "),e("a",{class:"header-anchor",href:"#实现适配器类","aria-label":'Permalink to "实现适配器类"'},"")],-1),d=[n];function c(i,p,_,l,m,h){return o(),t("div",null,d)}const x=a(s,[["render",c]]);export{u as __pageData,x as default};
diff --git a/assets/guide_components_adapter.md.D1rga5Px.lean.js b/assets/guide_components_adapter.md.D1rga5Px.lean.js
new file mode 100644
index 00000000..67fdd733
--- /dev/null
+++ b/assets/guide_components_adapter.md.D1rga5Px.lean.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o,j as e,a as r}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"实现适配器类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components/adapter.md","filePath":"guide/components/adapter.md","lastUpdated":1712229374000}'),s={name:"guide/components/adapter.md"},n=e("h1",{id:"实现适配器类",tabindex:"-1"},[r("实现适配器类 "),e("a",{class:"header-anchor",href:"#实现适配器类","aria-label":'Permalink to "实现适配器类"'},"")],-1),d=[n];function c(i,p,_,l,m,h){return o(),t("div",null,d)}const x=a(s,[["render",c]]);export{u as __pageData,x as default};
diff --git a/assets/guide_components_api.md.B4IuZxK4.js b/assets/guide_components_api.md.B4IuZxK4.js
new file mode 100644
index 00000000..c4253995
--- /dev/null
+++ b/assets/guide_components_api.md.B4IuZxK4.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o,j as e,a as s}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"实现接口类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components/api.md","filePath":"guide/components/api.md","lastUpdated":1712229374000}'),n={name:"guide/components/api.md"},r=e("h1",{id:"实现接口类",tabindex:"-1"},[s("实现接口类 "),e("a",{class:"header-anchor",href:"#实现接口类","aria-label":'Permalink to "实现接口类"'},"")],-1),c=[r];function i(d,p,_,l,m,h){return o(),t("div",null,c)}const x=a(n,[["render",i]]);export{u as __pageData,x as default};
diff --git a/assets/guide_components_api.md.B4IuZxK4.lean.js b/assets/guide_components_api.md.B4IuZxK4.lean.js
new file mode 100644
index 00000000..c4253995
--- /dev/null
+++ b/assets/guide_components_api.md.B4IuZxK4.lean.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o,j as e,a as s}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"实现接口类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components/api.md","filePath":"guide/components/api.md","lastUpdated":1712229374000}'),n={name:"guide/components/api.md"},r=e("h1",{id:"实现接口类",tabindex:"-1"},[s("实现接口类 "),e("a",{class:"header-anchor",href:"#实现接口类","aria-label":'Permalink to "实现接口类"'},"")],-1),c=[r];function i(d,p,_,l,m,h){return o(),t("div",null,c)}const x=a(n,[["render",i]]);export{u as __pageData,x as default};
diff --git a/assets/guide_components_custom.md.DwyDIpIY.js b/assets/guide_components_custom.md.DwyDIpIY.js
new file mode 100644
index 00000000..c8b123d4
--- /dev/null
+++ b/assets/guide_components_custom.md.DwyDIpIY.js
@@ -0,0 +1 @@
+import{_ as t,c as a,o,j as e,a as s}from"./chunks/framework.8cvu3CMh.js";const f=JSON.parse('{"title":"自定义服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components/custom.md","filePath":"guide/components/custom.md","lastUpdated":1712229374000}'),c={name:"guide/components/custom.md"},n=e("h1",{id:"自定义服务",tabindex:"-1"},[s("自定义服务 "),e("a",{class:"header-anchor",href:"#自定义服务","aria-label":'Permalink to "自定义服务"'},"")],-1),r=[n];function d(i,m,p,_,l,u){return o(),a("div",null,r)}const x=t(c,[["render",d]]);export{f as __pageData,x as default};
diff --git a/assets/guide_components_custom.md.DwyDIpIY.lean.js b/assets/guide_components_custom.md.DwyDIpIY.lean.js
new file mode 100644
index 00000000..c8b123d4
--- /dev/null
+++ b/assets/guide_components_custom.md.DwyDIpIY.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as a,o,j as e,a as s}from"./chunks/framework.8cvu3CMh.js";const f=JSON.parse('{"title":"自定义服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components/custom.md","filePath":"guide/components/custom.md","lastUpdated":1712229374000}'),c={name:"guide/components/custom.md"},n=e("h1",{id:"自定义服务",tabindex:"-1"},[s("自定义服务 "),e("a",{class:"header-anchor",href:"#自定义服务","aria-label":'Permalink to "自定义服务"'},"")],-1),r=[n];function d(i,m,p,_,l,u){return o(),a("div",null,r)}const x=t(c,[["render",d]]);export{f as __pageData,x as default};
diff --git a/assets/guide_components_elements.md.DOLNBvNk.js b/assets/guide_components_elements.md.DOLNBvNk.js
new file mode 100644
index 00000000..7e033c39
--- /dev/null
+++ b/assets/guide_components_elements.md.DOLNBvNk.js
@@ -0,0 +1 @@
+import{_ as t,c as a,o as s,j as e,a as n}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"实现元素类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components/elements.md","filePath":"guide/components/elements.md","lastUpdated":1712229374000}'),o={name:"guide/components/elements.md"},r=e("h1",{id:"实现元素类",tabindex:"-1"},[n("实现元素类 "),e("a",{class:"header-anchor",href:"#实现元素类","aria-label":'Permalink to "实现元素类"'},"")],-1),c=[r];function d(i,l,m,p,_,h){return s(),a("div",null,c)}const x=t(o,[["render",d]]);export{u as __pageData,x as default};
diff --git a/assets/guide_components_elements.md.DOLNBvNk.lean.js b/assets/guide_components_elements.md.DOLNBvNk.lean.js
new file mode 100644
index 00000000..7e033c39
--- /dev/null
+++ b/assets/guide_components_elements.md.DOLNBvNk.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as a,o as s,j as e,a as n}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"实现元素类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/components/elements.md","filePath":"guide/components/elements.md","lastUpdated":1712229374000}'),o={name:"guide/components/elements.md"},r=e("h1",{id:"实现元素类",tabindex:"-1"},[n("实现元素类 "),e("a",{class:"header-anchor",href:"#实现元素类","aria-label":'Permalink to "实现元素类"'},"")],-1),c=[r];function d(i,l,m,p,_,h){return s(),a("div",null,c)}const x=t(o,[["render",d]]);export{u as __pageData,x as default};
diff --git a/assets/guide_extend_tools.md.DomO41uh.js b/assets/guide_extend_tools.md.DomO41uh.js
new file mode 100644
index 00000000..5165e909
--- /dev/null
+++ b/assets/guide_extend_tools.md.DomO41uh.js
@@ -0,0 +1 @@
+import{_ as t,c as a,o,j as e,a as s}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"工具函数","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/tools.md","filePath":"guide/extend/tools.md","lastUpdated":1707642172000}'),d={name:"guide/extend/tools.md"},r=e("h1",{id:"工具函数",tabindex:"-1"},[s("工具函数 "),e("a",{class:"header-anchor",href:"#工具函数","aria-label":'Permalink to "工具函数"'},"")],-1),n=[r];function c(i,l,_,p,h,m){return o(),a("div",null,n)}const x=t(d,[["render",c]]);export{u as __pageData,x as default};
diff --git a/assets/guide_extend_tools.md.DomO41uh.lean.js b/assets/guide_extend_tools.md.DomO41uh.lean.js
new file mode 100644
index 00000000..5165e909
--- /dev/null
+++ b/assets/guide_extend_tools.md.DomO41uh.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as a,o,j as e,a as s}from"./chunks/framework.8cvu3CMh.js";const u=JSON.parse('{"title":"工具函数","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/tools.md","filePath":"guide/extend/tools.md","lastUpdated":1707642172000}'),d={name:"guide/extend/tools.md"},r=e("h1",{id:"工具函数",tabindex:"-1"},[s("工具函数 "),e("a",{class:"header-anchor",href:"#工具函数","aria-label":'Permalink to "工具函数"'},"")],-1),n=[r];function c(i,l,_,p,h,m){return o(),a("div",null,n)}const x=t(d,[["render",c]]);export{u as __pageData,x as default};
diff --git a/assets/guide_index.md.CIwc4bXE.js b/assets/guide_index.md.CIwc4bXE.js
new file mode 100644
index 00000000..b7b27ef1
--- /dev/null
+++ b/assets/guide_index.md.CIwc4bXE.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o as e,a3 as r}from"./chunks/framework.8cvu3CMh.js";const S=JSON.parse('{"title":"前言","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md","filePath":"guide/index.md","lastUpdated":1723293723000}'),i={name:"guide/index.md"},o=r('
',13),c=[o];function l(p,s,n,d,h,u){return e(),t("div",null,c)}const f=a(i,[["render",l]]);export{S as __pageData,f as default};
diff --git a/assets/guide_index.md.CIwc4bXE.lean.js b/assets/guide_index.md.CIwc4bXE.lean.js
new file mode 100644
index 00000000..9b088416
--- /dev/null
+++ b/assets/guide_index.md.CIwc4bXE.lean.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o as e,a3 as r}from"./chunks/framework.8cvu3CMh.js";const S=JSON.parse('{"title":"前言","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md","filePath":"guide/index.md","lastUpdated":1723293723000}'),i={name:"guide/index.md"},o=r("",13),c=[o];function l(p,s,n,d,h,u){return e(),t("div",null,c)}const f=a(i,[["render",l]]);export{S as __pageData,f as default};
diff --git a/assets/guide_modules_context.md.DUkg9QAh.js b/assets/guide_modules_context.md.DUkg9QAh.js
new file mode 100644
index 00000000..122fe0f4
--- /dev/null
+++ b/assets/guide_modules_context.md.DUkg9QAh.js
@@ -0,0 +1,200 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const c=JSON.parse('{"title":"上下文","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/context.md","filePath":"guide/modules/context.md","lastUpdated":1723293723000}'),h={name:"guide/modules/context.md"},k=n(`
`,44),t=[k];function p(l,e,E,d,r,g){return a(),i("div",null,t)}const F=s(h,[["render",p]]);export{c as __pageData,F as default};
diff --git a/assets/guide_modules_context.md.DUkg9QAh.lean.js b/assets/guide_modules_context.md.DUkg9QAh.lean.js
new file mode 100644
index 00000000..52554244
--- /dev/null
+++ b/assets/guide_modules_context.md.DUkg9QAh.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const c=JSON.parse('{"title":"上下文","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/context.md","filePath":"guide/modules/context.md","lastUpdated":1723293723000}'),h={name:"guide/modules/context.md"},k=n("",44),t=[k];function p(l,e,E,d,r,g){return a(),i("div",null,t)}const F=s(h,[["render",p]]);export{c as __pageData,F as default};
diff --git a/assets/guide_modules_decorator.md.DbuHSZHe.js b/assets/guide_modules_decorator.md.DbuHSZHe.js
new file mode 100644
index 00000000..8d26ab8c
--- /dev/null
+++ b/assets/guide_modules_decorator.md.DbuHSZHe.js
@@ -0,0 +1 @@
+import{_ as e,c as t,o}from"./chunks/framework.8cvu3CMh.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/decorator.md","filePath":"guide/modules/decorator.md","lastUpdated":1713967430000}'),a={name:"guide/modules/decorator.md"};function r(d,s,c,n,i,m){return o(),t("div")}const _=e(a,[["render",r]]);export{l as __pageData,_ as default};
diff --git a/assets/guide_modules_decorator.md.DbuHSZHe.lean.js b/assets/guide_modules_decorator.md.DbuHSZHe.lean.js
new file mode 100644
index 00000000..8d26ab8c
--- /dev/null
+++ b/assets/guide_modules_decorator.md.DbuHSZHe.lean.js
@@ -0,0 +1 @@
+import{_ as e,c as t,o}from"./chunks/framework.8cvu3CMh.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/decorator.md","filePath":"guide/modules/decorator.md","lastUpdated":1713967430000}'),a={name:"guide/modules/decorator.md"};function r(d,s,c,n,i,m){return o(),t("div")}const _=e(a,[["render",r]]);export{l as __pageData,_ as default};
diff --git a/assets/guide_modules_filter.md.N_gag-pP.js b/assets/guide_modules_filter.md.N_gag-pP.js
new file mode 100644
index 00000000..4aa02c69
--- /dev/null
+++ b/assets/guide_modules_filter.md.N_gag-pP.js
@@ -0,0 +1 @@
+import{_ as t,c as a,o as r,j as e,a as s}from"./chunks/framework.8cvu3CMh.js";const h=JSON.parse('{"title":"滤器","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/filter.md","filePath":"guide/modules/filter.md","lastUpdated":1723293723000}'),o={name:"guide/modules/filter.md"},d=e("h1",{id:"滤器",tabindex:"-1"},[s("滤器 "),e("a",{class:"header-anchor",href:"#滤器","aria-label":'Permalink to "滤器"'},"")],-1),i=[d];function c(l,n,_,f,m,p){return r(),a("div",null,i)}const x=t(o,[["render",c]]);export{h as __pageData,x as default};
diff --git a/assets/guide_modules_filter.md.N_gag-pP.lean.js b/assets/guide_modules_filter.md.N_gag-pP.lean.js
new file mode 100644
index 00000000..4aa02c69
--- /dev/null
+++ b/assets/guide_modules_filter.md.N_gag-pP.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as a,o as r,j as e,a as s}from"./chunks/framework.8cvu3CMh.js";const h=JSON.parse('{"title":"滤器","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/filter.md","filePath":"guide/modules/filter.md","lastUpdated":1723293723000}'),o={name:"guide/modules/filter.md"},d=e("h1",{id:"滤器",tabindex:"-1"},[s("滤器 "),e("a",{class:"header-anchor",href:"#滤器","aria-label":'Permalink to "滤器"'},"")],-1),i=[d];function c(l,n,_,f,m,p){return r(),a("div",null,i)}const x=t(o,[["render",c]]);export{h as __pageData,x as default};
diff --git a/assets/guide_modules_i18n.md.Bypdo8-z.js b/assets/guide_modules_i18n.md.Bypdo8-z.js
new file mode 100644
index 00000000..7dd49a6b
--- /dev/null
+++ b/assets/guide_modules_i18n.md.Bypdo8-z.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o as s,j as e,a as o}from"./chunks/framework.8cvu3CMh.js";const f=JSON.parse('{"title":"国际化","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/i18n.md","filePath":"guide/modules/i18n.md","lastUpdated":1712229374000}'),d={name:"guide/modules/i18n.md"},n=e("h1",{id:"国际化",tabindex:"-1"},[o("国际化 "),e("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化"'},"")],-1),r=[n];function i(c,l,_,m,p,u){return s(),t("div",null,r)}const x=a(d,[["render",i]]);export{f as __pageData,x as default};
diff --git a/assets/guide_modules_i18n.md.Bypdo8-z.lean.js b/assets/guide_modules_i18n.md.Bypdo8-z.lean.js
new file mode 100644
index 00000000..7dd49a6b
--- /dev/null
+++ b/assets/guide_modules_i18n.md.Bypdo8-z.lean.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o as s,j as e,a as o}from"./chunks/framework.8cvu3CMh.js";const f=JSON.parse('{"title":"国际化","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/i18n.md","filePath":"guide/modules/i18n.md","lastUpdated":1712229374000}'),d={name:"guide/modules/i18n.md"},n=e("h1",{id:"国际化",tabindex:"-1"},[o("国际化 "),e("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化"'},"")],-1),r=[n];function i(c,l,_,m,p,u){return s(),t("div",null,r)}const x=a(d,[["render",i]]);export{f as __pageData,x as default};
diff --git a/assets/guide_modules_plugin.md.Dt00Ji1P.js b/assets/guide_modules_plugin.md.Dt00Ji1P.js
new file mode 100644
index 00000000..aa9bab6b
--- /dev/null
+++ b/assets/guide_modules_plugin.md.Dt00Ji1P.js
@@ -0,0 +1,176 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const o=JSON.parse('{"title":"模块与插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/plugin.md","filePath":"guide/modules/plugin.md","lastUpdated":1723293723000}'),h={name:"guide/modules/plugin.md"},t=n(`
`,63),k=[t];function l(p,e,E,d,r,g){return a(),i("div",null,k)}const c=s(h,[["render",l]]);export{o as __pageData,c as default};
diff --git a/assets/guide_modules_plugin.md.Dt00Ji1P.lean.js b/assets/guide_modules_plugin.md.Dt00Ji1P.lean.js
new file mode 100644
index 00000000..c468c2d7
--- /dev/null
+++ b/assets/guide_modules_plugin.md.Dt00Ji1P.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const o=JSON.parse('{"title":"模块与插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/plugin.md","filePath":"guide/modules/plugin.md","lastUpdated":1723293723000}'),h={name:"guide/modules/plugin.md"},t=n("",63),k=[t];function l(p,e,E,d,r,g){return a(),i("div",null,k)}const c=s(h,[["render",l]]);export{o as __pageData,c as default};
diff --git a/assets/guide_modules_schema.md.BOAID70E.js b/assets/guide_modules_schema.md.BOAID70E.js
new file mode 100644
index 00000000..7dc694d5
--- /dev/null
+++ b/assets/guide_modules_schema.md.BOAID70E.js
@@ -0,0 +1,50 @@
+import{_ as s,c as i,o as a,a3 as h}from"./chunks/framework.8cvu3CMh.js";const o=JSON.parse('{"title":"配置检测","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/schema.md","filePath":"guide/modules/schema.md","lastUpdated":1723202493000}'),n={name:"guide/modules/schema.md"},t=h(`
`,40),e=[t];function l(k,p,r,d,E,c){return a(),i("div",null,e)}const y=s(n,[["render",l]]);export{o as __pageData,y as default};
diff --git a/assets/guide_modules_schema.md.BOAID70E.lean.js b/assets/guide_modules_schema.md.BOAID70E.lean.js
new file mode 100644
index 00000000..32913ba6
--- /dev/null
+++ b/assets/guide_modules_schema.md.BOAID70E.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as h}from"./chunks/framework.8cvu3CMh.js";const o=JSON.parse('{"title":"配置检测","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/schema.md","filePath":"guide/modules/schema.md","lastUpdated":1723202493000}'),n={name:"guide/modules/schema.md"},t=h("",40),e=[t];function l(k,p,r,d,E,c){return a(),i("div",null,e)}const y=s(n,[["render",l]]);export{o as __pageData,y as default};
diff --git a/assets/guide_modules_service.md.DtlL03on.js b/assets/guide_modules_service.md.DtlL03on.js
new file mode 100644
index 00000000..ac22d1b2
--- /dev/null
+++ b/assets/guide_modules_service.md.DtlL03on.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o as s,j as e,a as r}from"./chunks/framework.8cvu3CMh.js";const f=JSON.parse('{"title":"依赖与服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/service.md","filePath":"guide/modules/service.md","lastUpdated":1712229374000}'),o={name:"guide/modules/service.md"},c=e("h1",{id:"依赖与服务",tabindex:"-1"},[r("依赖与服务 "),e("a",{class:"header-anchor",href:"#依赖与服务","aria-label":'Permalink to "依赖与服务"'},"")],-1),d=[c];function i(n,l,_,m,p,u){return s(),t("div",null,d)}const v=a(o,[["render",i]]);export{f as __pageData,v as default};
diff --git a/assets/guide_modules_service.md.DtlL03on.lean.js b/assets/guide_modules_service.md.DtlL03on.lean.js
new file mode 100644
index 00000000..ac22d1b2
--- /dev/null
+++ b/assets/guide_modules_service.md.DtlL03on.lean.js
@@ -0,0 +1 @@
+import{_ as a,c as t,o as s,j as e,a as r}from"./chunks/framework.8cvu3CMh.js";const f=JSON.parse('{"title":"依赖与服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/service.md","filePath":"guide/modules/service.md","lastUpdated":1712229374000}'),o={name:"guide/modules/service.md"},c=e("h1",{id:"依赖与服务",tabindex:"-1"},[r("依赖与服务 "),e("a",{class:"header-anchor",href:"#依赖与服务","aria-label":'Permalink to "依赖与服务"'},"")],-1),d=[c];function i(n,l,_,m,p,u){return s(),t("div",null,d)}const v=a(o,[["render",i]]);export{f as __pageData,v as default};
diff --git a/assets/guide_start_environment.md.PRLaaBZD.js b/assets/guide_start_environment.md.PRLaaBZD.js
new file mode 100644
index 00000000..ee8a1068
--- /dev/null
+++ b/assets/guide_start_environment.md.PRLaaBZD.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o as a,a3 as i}from"./chunks/framework.8cvu3CMh.js";const _=JSON.parse('{"title":"环境搭建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/environment.md","filePath":"guide/start/environment.md","lastUpdated":1712229374000}'),r={name:"guide/start/environment.md"},o=i('
显然 Kotori 并不属于 Web 前端的范畴,但依旧隶属于 JavaScript 生态,因此推荐 世界上最好的 Web 开发 IDE 「Visual Studio Code」(以下简称「VSC」)。虽然 VSC 本质上只是文本编辑器,但因其强大的扩展商店使其能做到大部分 IDE 的功能,当然你也可以根据你的喜好选择,如:
WebStorm
',9),n=[o];function s(d,l,p,h,m,c){return a(),e("div",null,n)}const b=t(r,[["render",s]]);export{_ as __pageData,b as default};
diff --git a/assets/guide_start_environment.md.PRLaaBZD.lean.js b/assets/guide_start_environment.md.PRLaaBZD.lean.js
new file mode 100644
index 00000000..99766ead
--- /dev/null
+++ b/assets/guide_start_environment.md.PRLaaBZD.lean.js
@@ -0,0 +1 @@
+import{_ as t,c as e,o as a,a3 as i}from"./chunks/framework.8cvu3CMh.js";const _=JSON.parse('{"title":"环境搭建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/environment.md","filePath":"guide/start/environment.md","lastUpdated":1712229374000}'),r={name:"guide/start/environment.md"},o=i("",9),n=[o];function s(d,l,p,h,m,c){return a(),e("div",null,n)}const b=t(r,[["render",s]]);export{_ as __pageData,b as default};
diff --git a/assets/guide_start_publish.md.B0dbgGAK.js b/assets/guide_start_publish.md.B0dbgGAK.js
new file mode 100644
index 00000000..29e5608b
--- /dev/null
+++ b/assets/guide_start_publish.md.B0dbgGAK.js
@@ -0,0 +1,40 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const E=JSON.parse('{"title":"模块发布","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/publish.md","filePath":"guide/start/publish.md","lastUpdated":1716217371000}'),t={name:"guide/start/publish.md"},e=n(`
`,45),p=[e];function l(h,r,o,k,d,c){return a(),i("div",null,p)}const u=s(t,[["render",l]]);export{E as __pageData,u as default};
diff --git a/assets/guide_start_publish.md.B0dbgGAK.lean.js b/assets/guide_start_publish.md.B0dbgGAK.lean.js
new file mode 100644
index 00000000..e0efab82
--- /dev/null
+++ b/assets/guide_start_publish.md.B0dbgGAK.lean.js
@@ -0,0 +1 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const E=JSON.parse('{"title":"模块发布","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/publish.md","filePath":"guide/start/publish.md","lastUpdated":1716217371000}'),t={name:"guide/start/publish.md"},e=n("",45),p=[e];function l(h,r,o,k,d,c){return a(),i("div",null,p)}const u=s(t,[["render",l]]);export{E as __pageData,u as default};
diff --git a/assets/guide_start_setup.md.wbUfb5bx.js b/assets/guide_start_setup.md.wbUfb5bx.js
new file mode 100644
index 00000000..958061b5
--- /dev/null
+++ b/assets/guide_start_setup.md.wbUfb5bx.js
@@ -0,0 +1,144 @@
+import{_ as s,c as i,o as a,a3 as n}from"./chunks/framework.8cvu3CMh.js";const c=JSON.parse('{"title":"项目构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/setup.md","filePath":"guide/start/setup.md","lastUpdated":1723345558000}'),t={name:"guide/start/setup.md"},p=n(`
7/19 23:59:59 LOG (1372799) : Http server started at http://127.0.0.1:720
+7/20 0:0:0 LOG (1372799) : WebSocket server started at ws://127.0.0.1:720
+KotoriO > 当前未设置 Webui 账号与密码,请输入 /webui 指令以进行初始化
/github kotorijs/kotori
+> 地址:kotorijs/kotori
+描述:Cross platform, decoupled, and modernized ChatBot framework base on NodeJS
+语言:TypeScript
+所有者:kotorijs
+创建时间:
+2023-06-14T11:45:16Z
+最后更新时间:2023-12-31T15:28:10Z
+最后推送时间:2024-01-14T09:48:13Z
+开源协议:GNU General Public License v3.0
但是,其需要判断 args[0] 并处理无效时的情况,额外的代码嵌套依旧不够优雅。且多个操作下对于参数个数要求不一,如查询可以直接输入 list query,但对于添加/删除往往需要在后方再传入一个参数以指定添加/删除目标 list add xxx。因此,当同一指令有多个操作(即多个指令回调函数)且各个操作间相对独立时可使用子指令。基础用法:
显然 Kotori 并不属于 Web 前端的范畴,但依旧隶属于 JavaScript 生态,因此推荐 世界上最好的 Web 开发 IDE 「Visual Studio Code」(以下简称「VSC」)。虽然 VSC 本质上只是文本编辑器,但因其强大的扩展商店使其能做到大部分 IDE 的功能,当然你也可以根据你的喜好选择,如:
WebStorm
+
+
+
+
\ No newline at end of file
diff --git a/guide/start/publish.html b/guide/start/publish.html
new file mode 100644
index 00000000..bcefb5dd
--- /dev/null
+++ b/guide/start/publish.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+ 模块发布 | Kotori
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+