This commit is contained in:
sheepbox8646
2026-04-16 09:46:44 +00:00
parent 859d656049
commit 1aed632edf
115 changed files with 345 additions and 228 deletions
+2 -2
View File
File diff suppressed because one or more lines are too long
+5 -5
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1774787421000}'),n={name:"about.md"};function r(s,e,l,c,d,m){return a(),o("div",null,[...e[0]||(e[0]=[i("",41)])])}const p=t(n,[["render",r]]);export{u as __pageData,p as default};
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{_ as t,o as a,c as o,ag as s}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1776332711000}'),i={name:"about.md"};function n(r,e,l,d,h,c){return a(),o("div",null,[...e[0]||(e[0]=[s("",37)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default};
@@ -1 +1 @@
import{t as p}from"./chunks/theme.Ckb1ymJK.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.DXGyWiRo.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
import{t as p}from"./chunks/theme.B63eKdwJ.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.DXGyWiRo.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
+1
View File
@@ -0,0 +1 @@
import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"DingTalk Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/dingtalk.md","filePath":"channels/dingtalk.md","lastUpdated":1776332711000}'),i={name:"channels/dingtalk.md"};function r(l,e,s,p,g,h){return t(),n("div",null,[...e[0]||(e[0]=[o('<h1 id="dingtalk-channel-configuration" tabindex="-1">DingTalk Channel Configuration <a class="header-anchor" href="#dingtalk-channel-configuration" aria-label="Permalink to &quot;DingTalk Channel Configuration&quot;"></a></h1><p>Memoh supports DingTalk bots for private chats and group chats. The adapter uses DingTalk&#39;s stream connection for inbound events and the official APIs for outbound replies and media.</p><h2 id="step-1-create-a-dingtalk-app" tabindex="-1">Step 1: Create A DingTalk App <a class="header-anchor" href="#step-1-create-a-dingtalk-app" aria-label="Permalink to &quot;Step 1: Create A DingTalk App&quot;"></a></h2><ol><li>Open the DingTalk developer platform for your organization.</li><li>Create or choose the app that will act as your bot.</li><li>Enable the bot / messaging capability for that app.</li><li>Copy the app credentials: <ul><li><strong>App Key</strong></li><li><strong>App Secret</strong></li></ul></li></ol><p>Depending on your DingTalk environment, you may also need to grant message permissions and publish the app before it is available to end users.</p><h2 id="step-2-configure-memoh" tabindex="-1">Step 2: Configure Memoh <a class="header-anchor" href="#step-2-configure-memoh" aria-label="Permalink to &quot;Step 2: Configure Memoh&quot;"></a></h2><ol><li>Open your bot in the Memoh Web UI.</li><li>Go to <strong>Platforms</strong>.</li><li>Click <strong>Add Channel</strong> and choose <strong>DingTalk</strong>.</li><li>Fill in <strong>App Key</strong> and <strong>App Secret</strong>.</li><li>Click <strong>Save and Enable</strong>.</li></ol><p>Memoh maintains the DingTalk stream connection automatically. For the normal setup, you do not need to manually paste a webhook callback URL.</p><h2 id="step-3-verify-messaging" tabindex="-1">Step 3: Verify Messaging <a class="header-anchor" href="#step-3-verify-messaging" aria-label="Permalink to &quot;Step 3: Verify Messaging&quot;"></a></h2><p>After the channel is enabled:</p><ol><li>Send a private message to the DingTalk bot, or mention it in a supported group chat.</li><li>Confirm the bot receives the message and can reply.</li></ol><h2 id="features-supported" tabindex="-1">Features Supported <a class="header-anchor" href="#features-supported" aria-label="Permalink to &quot;Features Supported&quot;"></a></h2><ul><li><strong>Private chats</strong></li><li><strong>Group chats</strong></li><li><strong>Text and Markdown-style output</strong></li><li><strong>Replies</strong></li><li><strong>Attachments and media</strong></li></ul><p>Current behavior note:</p><ul><li>Outbound responses are non-streaming on DingTalk in Memoh.</li></ul>',15)])])}const c=a(i,[["render",r]]);export{u as __pageData,c as default};
@@ -0,0 +1 @@
import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"DingTalk Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/dingtalk.md","filePath":"channels/dingtalk.md","lastUpdated":1776332711000}'),i={name:"channels/dingtalk.md"};function r(l,e,s,p,g,h){return t(),n("div",null,[...e[0]||(e[0]=[o("",15)])])}const c=a(i,[["render",r]]);export{u as __pageData,c as default};
-1
View File
@@ -1 +0,0 @@
import{_ as t,o as r,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1774787421000}'),n={name:"channels/index.md"};function s(i,e,l,h,g,c){return r(),a("div",null,[...e[0]||(e[0]=[o('<h1 id="channels-overview" tabindex="-1">Channels Overview <a class="header-anchor" href="#channels-overview" aria-label="Permalink to &quot;Channels Overview&quot;"></a></h1><p>Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.</p><p>Memoh currently supports the following channels:</p><ul><li><strong><a href="./telegram.html">Telegram</a></strong>: Feature-rich integration with streaming and attachment support.</li><li><strong><a href="./feishu.html">Feishu (Lark)</a></strong>: Enterprise-ready integration for business workflows.</li><li><strong><a href="./discord.html">Discord</a></strong>: Community-focused integration for servers and direct messages.</li><li><strong><a href="./qq.html">QQ</a></strong>: Quick setup for personal DM bots via the dedicated AI bot registration portal.</li><li><strong><a href="./matrix.html">Matrix</a></strong>: Decentralized messaging protocol support for any Matrix homeserver.</li><li><strong><a href="./wecom.html">WeCom (WeWork)</a></strong>: Enterprise messaging integration for WeCom workspaces.</li><li><strong><a href="./weixin.html">WeChat</a></strong>: Personal messaging via the WeChat AI bot platform.</li><li><strong>Email</strong>: Connect via SMTP providers, Mailgun, or Gmail OAuth (configured through Email Providers).</li><li><strong>Web</strong>: Built-in chat interface for immediate access.</li></ul><h2 id="general-setup-flow" tabindex="-1">General Setup Flow <a class="header-anchor" href="#general-setup-flow" aria-label="Permalink to &quot;General Setup Flow&quot;"></a></h2><ol><li><strong>Create an external app/bot</strong>: Register your bot on the target platform (e.g., via BotFather on Telegram).</li><li><strong>Obtain credentials</strong>: Fetch API tokens, App IDs, or secrets.</li><li><strong>Configure in Memoh</strong>: Add the channel to your Bot&#39;s <strong>Platforms</strong> tab and paste the credentials.</li><li><strong>Enable</strong>: Activate the channel to start receiving and sending messages.</li></ol><p>Choose a channel from the sidebar to see detailed configuration guides for each platform.</p>',7)])])}const p=t(n,[["render",s]]);export{m as __pageData,p as default};
@@ -1 +0,0 @@
import{_ as t,o as r,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1774787421000}'),n={name:"channels/index.md"};function s(i,e,l,h,g,c){return r(),a("div",null,[...e[0]||(e[0]=[o("",7)])])}const p=t(n,[["render",s]]);export{m as __pageData,p as default};
+1
View File
@@ -0,0 +1 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1776332711000}'),i={name:"channels/index.md"};function r(s,e,l,c,h,g){return a(),o("div",null,[...e[0]||(e[0]=[n('<h1 id="channels-overview" tabindex="-1">Channels Overview <a class="header-anchor" href="#channels-overview" aria-label="Permalink to &quot;Channels Overview&quot;"></a></h1><p>Channels are the gateways that connect your Memoh Bots to the outside world. By configuring channels, you can interact with your bots via your favorite messaging platforms.</p><p>Memoh currently supports the following channels:</p><ul><li><strong><a href="./telegram.html">Telegram</a></strong>: Feature-rich integration with streaming and attachment support.</li><li><strong><a href="./feishu.html">Feishu (Lark)</a></strong>: Enterprise-ready integration for business workflows.</li><li><strong><a href="./discord.html">Discord</a></strong>: Community-focused integration for servers and direct messages.</li><li><strong><a href="./qq.html">QQ</a></strong>: Quick setup for personal DM bots via the dedicated AI bot registration portal.</li><li><strong><a href="./matrix.html">Matrix</a></strong>: Decentralized messaging protocol support for any Matrix homeserver.</li><li><strong><a href="./misskey.html">Misskey</a></strong>: Federated social/chat style integration with replies and reactions.</li><li><strong><a href="./dingtalk.html">DingTalk</a></strong>: Enterprise chat integration for private and group conversations.</li><li><strong><a href="./wecom.html">WeCom (WeWork)</a></strong>: Enterprise messaging integration for WeCom workspaces.</li><li><strong><a href="./weixin.html">WeChat</a></strong>: Personal messaging via QR login.</li><li><strong><a href="./wechatoa.html">WeChat Official Account</a></strong>: Official account webhook integration for private message scenarios.</li><li><strong>Email</strong>: Connect via SMTP providers, Mailgun, or Gmail OAuth (configured through Email Providers).</li><li><strong>Web</strong>: Built-in chat interface for immediate access.</li></ul><h3 id="wechat-vs-wechat-official-account" tabindex="-1">WeChat vs WeChat Official Account <a class="header-anchor" href="#wechat-vs-wechat-official-account" aria-label="Permalink to &quot;WeChat vs WeChat Official Account&quot;"></a></h3><p>Memoh supports two different WeChat-related adapters:</p><ul><li><strong>WeChat (<code>weixin</code>)</strong> is the personal-account style integration that relies on QR login.</li><li><strong>WeChat Official Account (<code>wechatoa</code>)</strong> is the official-account / webhook style integration that uses <code>App ID</code>, <code>App Secret</code>, <code>Token</code>, and optional AES settings.</li></ul><p>Choose the one that matches your actual WeChat deployment model.</p><h2 id="general-setup-flow" tabindex="-1">General Setup Flow <a class="header-anchor" href="#general-setup-flow" aria-label="Permalink to &quot;General Setup Flow&quot;"></a></h2><ol><li><strong>Create an external app/bot</strong>: Register your bot on the target platform.</li><li><strong>Obtain credentials</strong>: Fetch API tokens, App IDs, app secrets, or access tokens.</li><li><strong>Configure in Memoh</strong>: Add the channel from your bot&#39;s <strong>Platforms</strong> tab.</li><li><strong>Save and enable</strong>: Activate the channel to start receiving and sending messages.</li></ol><p>Depending on the platform, the final step may involve:</p><ul><li>copying a webhook callback URL into the platform console</li><li>approving a QR login on mobile</li><li>leaving a long-lived stream/WebSocket connection running through Memoh</li></ul><p>Choose a channel from the sidebar to see detailed configuration guides for each platform.</p>',13)])])}const f=t(i,[["render",r]]);export{p as __pageData,f as default};
@@ -0,0 +1 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1776332711000}'),i={name:"channels/index.md"};function r(s,e,l,c,h,g){return a(),o("div",null,[...e[0]||(e[0]=[n("",13)])])}const f=t(i,[["render",r]]);export{p as __pageData,f as default};
+1
View File
@@ -0,0 +1 @@
import{_ as t,o as n,c as s,ag as o}from"./chunks/framework.DXGyWiRo.js";const d=JSON.parse('{"title":"Misskey Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/misskey.md","filePath":"channels/misskey.md","lastUpdated":1776332711000}'),a={name:"channels/misskey.md"};function i(r,e,l,c,h,u){return n(),s("div",null,[...e[0]||(e[0]=[o('<h1 id="misskey-channel-configuration" tabindex="-1">Misskey Channel Configuration <a class="header-anchor" href="#misskey-channel-configuration" aria-label="Permalink to &quot;Misskey Channel Configuration&quot;"></a></h1><p>Memoh can connect a bot to a Misskey server so it can read inbound mentions and reply as a Misskey account. This adapter is best for text-first social interactions on self-hosted or public Misskey instances.</p><h2 id="step-1-prepare-a-misskey-account-and-token" tabindex="-1">Step 1: Prepare A Misskey Account And Token <a class="header-anchor" href="#step-1-prepare-a-misskey-account-and-token" aria-label="Permalink to &quot;Step 1: Prepare A Misskey Account And Token&quot;"></a></h2><ol><li>Sign in to the Misskey instance you want to use.</li><li>Create or choose the account that should represent your bot.</li><li>Generate an <strong>Access Token</strong> for that account.</li></ol><p>Memoh needs:</p><ul><li><strong>Instance URL</strong>: for example <code>https://misskey.io</code></li><li><strong>Access Token</strong>: a token for the bot account</li></ul><p>The exact token-creation UI varies by Misskey instance. Make sure the token is allowed to read inbound events for the bot account and publish replies.</p><h2 id="step-2-configure-memoh" tabindex="-1">Step 2: Configure Memoh <a class="header-anchor" href="#step-2-configure-memoh" aria-label="Permalink to &quot;Step 2: Configure Memoh&quot;"></a></h2><ol><li>Open your bot in the Memoh Web UI.</li><li>Go to <strong>Platforms</strong>.</li><li>Click <strong>Add Channel</strong> and choose <strong>Misskey</strong>.</li><li>Enter the <strong>Instance URL</strong>.</li><li>Paste the <strong>Access Token</strong>.</li><li>Click <strong>Save and Enable</strong>.</li></ol><p>Memoh uses these credentials to discover the bot identity and start the Misskey connection.</p><h2 id="step-3-start-chatting" tabindex="-1">Step 3: Start Chatting <a class="header-anchor" href="#step-3-start-chatting" aria-label="Permalink to &quot;Step 3: Start Chatting&quot;"></a></h2><p>After the channel is enabled, users can interact with the bot on that Misskey instance.</p><p>Misskey in Memoh is generally best suited for:</p><ul><li>replies to users</li><li>text and Markdown-style output</li><li>reaction-aware social conversations</li></ul><h2 id="features-supported" tabindex="-1">Features Supported <a class="header-anchor" href="#features-supported" aria-label="Permalink to &quot;Features Supported&quot;"></a></h2><ul><li><strong>Text</strong></li><li><strong>Markdown</strong></li><li><strong>Replies</strong></li><li><strong>Reactions</strong></li></ul><p>Current limitations:</p><ul><li><strong>No attachments / media upload</strong></li><li><strong>No streaming output</strong></li></ul>',18)])])}const g=t(a,[["render",i]]);export{d as __pageData,g as default};
@@ -0,0 +1 @@
import{_ as t,o as n,c as s,ag as o}from"./chunks/framework.DXGyWiRo.js";const d=JSON.parse('{"title":"Misskey Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/misskey.md","filePath":"channels/misskey.md","lastUpdated":1776332711000}'),a={name:"channels/misskey.md"};function i(r,e,l,c,h,u){return n(),s("div",null,[...e[0]||(e[0]=[o("",18)])])}const g=t(a,[["render",i]]);export{d as __pageData,g as default};
+1
View File
@@ -0,0 +1 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"WeChat Official Account Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wechatoa.md","filePath":"channels/wechatoa.md","lastUpdated":1776332711000}'),i={name:"channels/wechatoa.md"};function r(l,e,s,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[n('<h1 id="wechat-official-account-channel-configuration" tabindex="-1">WeChat Official Account Channel Configuration <a class="header-anchor" href="#wechat-official-account-channel-configuration" aria-label="Permalink to &quot;WeChat Official Account Channel Configuration&quot;"></a></h1><p>This guide covers the <strong>WeChat Official Account</strong> adapter in Memoh. It is different from the personal <strong>WeChat</strong> QR-login adapter: this one is for official-account webhook integration and is intended for inbound private-message scenarios.</p><h2 id="step-1-prepare-official-account-credentials" tabindex="-1">Step 1: Prepare Official Account Credentials <a class="header-anchor" href="#step-1-prepare-official-account-credentials" aria-label="Permalink to &quot;Step 1: Prepare Official Account Credentials&quot;"></a></h2><p>From the WeChat Official Account platform, prepare:</p><ul><li><strong>App ID</strong></li><li><strong>App Secret</strong></li><li><strong>Token</strong></li></ul><p>You may also need:</p><ul><li><strong>Encoding AES Key</strong> if you use encrypted webhook delivery</li><li>an outbound <strong>HTTP Proxy URL</strong> if your deployment must reach WeChat APIs through a proxy</li></ul><h2 id="step-2-add-the-channel-in-memoh" tabindex="-1">Step 2: Add The Channel In Memoh <a class="header-anchor" href="#step-2-add-the-channel-in-memoh" aria-label="Permalink to &quot;Step 2: Add The Channel In Memoh&quot;"></a></h2><ol><li>Open your bot in the Memoh Web UI.</li><li>Go to <strong>Platforms</strong>.</li><li>Click <strong>Add Channel</strong> and choose <strong>WeChat Official Account</strong>.</li><li>Fill in the required fields: <ul><li><strong>App ID</strong></li><li><strong>App Secret</strong></li><li><strong>Token</strong></li></ul></li><li>Choose the <strong>Encryption Mode</strong>.</li><li>If you use <code>safe</code> or <code>compat</code> mode, also provide the <strong>Encoding AES Key</strong>.</li><li>Save the channel.</li></ol><p>Memoh generates a <strong>Webhook Callback URL</strong> after the channel has been saved.</p><h2 id="step-3-configure-the-wechat-platform" tabindex="-1">Step 3: Configure The WeChat Platform <a class="header-anchor" href="#step-3-configure-the-wechat-platform" aria-label="Permalink to &quot;Step 3: Configure The WeChat Platform&quot;"></a></h2><ol><li>Copy the <strong>Webhook Callback URL</strong> from Memoh.</li><li>Paste it into the WeChat Official Account platform callback configuration.</li><li>Make sure the WeChat platform and Memoh use the same: <ul><li><strong>Token</strong></li><li><strong>Encryption Mode</strong></li><li><strong>Encoding AES Key</strong> when encryption is enabled</li></ul></li></ol><p>WeChat will verify the callback before delivering real messages.</p><h2 id="step-4-enable-and-test" tabindex="-1">Step 4: Enable And Test <a class="header-anchor" href="#step-4-enable-and-test" aria-label="Permalink to &quot;Step 4: Enable And Test&quot;"></a></h2><ol><li>Enable the channel in Memoh.</li><li>Send a test private message from the official account side.</li><li>Confirm that Memoh receives the message and the bot can reply.</li></ol><h2 id="features-supported" tabindex="-1">Features Supported <a class="header-anchor" href="#features-supported" aria-label="Permalink to &quot;Features Supported&quot;"></a></h2><ul><li><strong>Private chats</strong></li><li><strong>Replies</strong></li><li><strong>Attachments and media</strong></li></ul><p>Current behavior notes:</p><ul><li>This adapter is intended for <strong>private-message</strong> conversations, not group-style chats.</li><li>Outbound responses are non-streaming on this channel.</li></ul>',19)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default};
@@ -0,0 +1 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"WeChat Official Account Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/wechatoa.md","filePath":"channels/wechatoa.md","lastUpdated":1776332711000}'),i={name:"channels/wechatoa.md"};function r(l,e,s,c,h,d){return a(),o("div",null,[...e[0]||(e[0]=[n("",19)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1776332711000}'),s={name:"getting-started/access.md"};function l(n,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",58)])])}const g=t(s,[["render",l]]);export{p as __pageData,g as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{_ as t,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Access Control","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/access.md","filePath":"getting-started/access.md","lastUpdated":1774787421000}'),s={name:"getting-started/access.md"};function n(l,e,i,c,d,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",40)])])}const p=t(s,[["render",n]]);export{g as __pageData,p as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as e,o,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1776332711000}'),n={name:"getting-started/bot.md"};function s(i,t,d,l,c,h){return o(),a("div",null,[...t[0]||(t[0]=[r("",51)])])}const b=e(n,[["render",s]]);export{m as __pageData,b as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{_ as e,o as r,c as o,ag as a}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1774787421000}'),n={name:"getting-started/bot.md"};function i(s,t,d,l,g,c){return r(),o("div",null,[...t[0]||(t[0]=[a("",28)])])}const b=e(n,[["render",i]]);export{m as __pageData,b as default};
@@ -1 +0,0 @@
import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1774787421000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o('<h1 id="bot-channels" tabindex="-1">Bot Channels <a class="header-anchor" href="#bot-channels" aria-label="Permalink to &quot;Bot Channels&quot;"></a></h1><p>Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.</p><h2 id="concept-unified-communication" tabindex="-1">Concept: Unified Communication <a class="header-anchor" href="#concept-unified-communication" aria-label="Permalink to &quot;Concept: Unified Communication&quot;"></a></h2><p>Memoh acts as a hub that bridges different messaging services. You can configure multiple channels for a single bot, enabling it to chat on Telegram, Discord, Matrix, and more simultaneously.</p><hr><h2 id="supported-channels" tabindex="-1">Supported Channels <a class="header-anchor" href="#supported-channels" aria-label="Permalink to &quot;Supported Channels&quot;"></a></h2><p>Configure your bot&#39;s connections from the <strong>Platforms</strong> tab in the Bot Detail page.</p><h3 id="platform-guides" tabindex="-1">Platform Guides <a class="header-anchor" href="#platform-guides" aria-label="Permalink to &quot;Platform Guides&quot;"></a></h3><p>For detailed step-by-step guides on how to create and configure bots for each platform, see:</p><ul><li><strong><a href="/channels/telegram.html">Telegram Configuration</a></strong></li><li><strong><a href="/channels/feishu.html">Feishu (Lark) Configuration</a></strong></li><li><strong><a href="/channels/discord.html">Discord Configuration</a></strong></li><li><strong><a href="/channels/qq.html">QQ Configuration</a></strong></li><li><strong><a href="/channels/matrix.html">Matrix Configuration</a></strong></li><li><strong><a href="/channels/wecom.html">WeCom (WeWork) Configuration</a></strong></li><li><strong><a href="/channels/weixin.html">WeChat Configuration</a></strong></li></ul><hr><h2 id="configuration-flow" tabindex="-1">Configuration Flow <a class="header-anchor" href="#configuration-flow" aria-label="Permalink to &quot;Configuration Flow&quot;"></a></h2><h3 id="_1-adding-a-channel" tabindex="-1">1. Adding a Channel <a class="header-anchor" href="#_1-adding-a-channel" aria-label="Permalink to &quot;1. Adding a Channel&quot;"></a></h3><ol><li>Click <strong>Add Channel</strong>.</li><li>Select the platform from the list.</li><li>Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.</li></ol><h3 id="_2-common-fields" tabindex="-1">2. Common Fields <a class="header-anchor" href="#_2-common-fields" aria-label="Permalink to &quot;2. Common Fields&quot;"></a></h3><table tabindex="0"><thead><tr><th>Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Credentials</strong></td><td>API tokens, secrets, or bot keys provided by the platform.</td></tr><tr><td><strong>Disabled</strong></td><td>Quickly enable or disable a channel without removing its configuration.</td></tr><tr><td><strong>Routing</strong></td><td>Configure how messages are mapped between the platform and Memoh.</td></tr></tbody></table><h3 id="_3-special-case-feishu-webhook" tabindex="-1">3. Special Case: Feishu Webhook <a class="header-anchor" href="#_3-special-case-feishu-webhook" aria-label="Permalink to &quot;3. Special Case: Feishu Webhook&quot;"></a></h3><p>If using <strong>Feishu</strong> in <code>webhook</code> inbound mode:</p><ol><li>Memoh will generate a <strong>Webhook Callback URL</strong>.</li><li>Copy this URL and paste it into your Feishu App&#39;s event configuration.</li><li>This allows Feishu to send messages directly to Memoh.</li></ol><h3 id="_4-special-case-wechat-qr-code" tabindex="-1">4. Special Case: WeChat QR Code <a class="header-anchor" href="#_4-special-case-wechat-qr-code" aria-label="Permalink to &quot;4. Special Case: WeChat QR Code&quot;"></a></h3><p>If using <strong>WeChat</strong>:</p><ol><li>After enabling the channel, a QR code flow is provided for connecting.</li><li>Scan the QR code with WeChat to link the bot.</li></ol><hr><h2 id="operations" tabindex="-1">Operations <a class="header-anchor" href="#operations" aria-label="Permalink to &quot;Operations&quot;"></a></h2><ul><li><strong>Save</strong>: Update the configuration.</li><li><strong>Save and Enable</strong>: Update and immediately activate the channel.</li><li><strong>Enable/Disable Toggle</strong>: Switch the channel&#39;s active status.</li><li><strong>Delete</strong>: Permanently remove a channel&#39;s configuration.</li></ul>',25)])])}const f=a(i,[["render",r]]);export{u as __pageData,f as default};
@@ -1 +0,0 @@
import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1774787421000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",25)])])}const f=a(i,[["render",r]]);export{u as __pageData,f as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1776332711000}'),i={name:"getting-started/channels.md"};function r(l,t,s,d,h,c){return a(),n("div",null,[...t[0]||(t[0]=[o("",32)])])}const f=e(i,[["render",r]]);export{u as __pageData,f as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as e,o,c as a,ag as s}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Context Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1776332711000}'),n={name:"getting-started/compaction.md"};function i(r,t,c,l,d,h){return o(),a("div",null,[...t[0]||(t[0]=[s("",54)])])}const u=e(n,[["render",i]]);export{p as __pageData,u as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{_ as o,o as t,c as a,ag as r}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Memory Compaction","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/compaction.md","filePath":"getting-started/compaction.md","lastUpdated":1774787421000}'),i={name:"getting-started/compaction.md"};function n(s,e,l,m,c,d){return t(),a("div",null,[...e[0]||(e[0]=[r("",29)])])}const p=o(i,[["render",n]]);export{g as __pageData,p as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as e,o,c as n,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1774787421000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",31)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default};
import{_ as e,o,c as n,ag as r}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1776332711000}'),a={name:"getting-started/mcp.md"};function i(s,t,c,l,d,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",32)])])}const g=e(a,[["render",i]]);export{p as __pageData,g as default};
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1774787421000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",38)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default};
import{_ as t,o,c as r,ag as a}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1776332711000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",48)])])}const u=t(i,[["render",n]]);export{g as __pageData,u as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as t,o,c as d,ag as a}from"./chunks/framework.DXGyWiRo.js";const m=JSON.parse('{"title":"Providers And Models","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1776332711000}'),i={name:"getting-started/provider-and-model.md"};function r(s,e,n,l,c,h){return o(),d("div",null,[...e[0]||(e[0]=[a("",73)])])}const u=t(i,[["render",r]]);export{m as __pageData,u as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{_ as t,o,c as r,ag as i}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"LLM Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1774787421000}'),a={name:"getting-started/provider-and-model.md"};function d(n,e,l,s,h,c){return o(),r("div",null,[...e[0]||(e[0]=[i("",27)])])}const m=t(a,[["render",d]]);export{p as __pageData,m as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as s,o as t,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1776332711000}'),a={name:"getting-started/sessions.md"};function i(r,e,l,c,h,d){return t(),o("div",null,[...e[0]||(e[0]=[n("",54)])])}const p=s(a,[["render",i]]);export{g as __pageData,p as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{_ as s,o as t,c as n,ag as o}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Sessions","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/sessions.md","filePath":"getting-started/sessions.md","lastUpdated":1774787421000}'),a={name:"getting-started/sessions.md"};function i(r,e,h,l,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",34)])])}const b=s(a,[["render",i]]);export{u as __pageData,b as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as t,o as a,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const k=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1776332711000}'),s={name:"getting-started/skills.md"};function o(r,e,n,d,h,c){return a(),l("div",null,[...e[0]||(e[0]=[i("",55)])])}const p=t(s,[["render",o]]);export{k as __pageData,p as default};
@@ -1,8 +0,0 @@
import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e(`<h1 id="bot-skills" tabindex="-1">Bot Skills <a class="header-anchor" href="#bot-skills" aria-label="Permalink to &quot;Bot Skills&quot;"></a></h1><p>Skills are the &quot;personality&quot; and &quot;capabilities&quot; of a Memoh Bot. They define how the bot should behave and what tools it can use.</p><h2 id="concept-skills-as-markdown" tabindex="-1">Concept: Skills as Markdown <a class="header-anchor" href="#concept-skills-as-markdown" aria-label="Permalink to &quot;Concept: Skills as Markdown&quot;"></a></h2><p>A <strong>Skill</strong> is represented as a Markdown document with YAML frontmatter. These files are stored within the bot&#39;s container and parsed into tools and personality traits.</p><h3 id="example-skill-structure" tabindex="-1">Example Skill Structure <a class="header-anchor" href="#example-skill-structure" aria-label="Permalink to &quot;Example Skill Structure&quot;"></a></h3><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">---</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">coder-skill</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">Enables advanced coding capabilities and tool use.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">---</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Coder Skill</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">As a coder, you always follow best practices and write clean, documented code.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">You can use the \`edit_file\` and \`run_command\` tools to assist the user.</span></span></code></pre></div><hr><h2 id="managing-skills" tabindex="-1">Managing Skills <a class="header-anchor" href="#managing-skills" aria-label="Permalink to &quot;Managing Skills&quot;"></a></h2><p>Manage your bot&#39;s skill set from the <strong>Skills</strong> tab in the Bot Detail page.</p><h3 id="adding-a-skill" tabindex="-1">Adding a Skill <a class="header-anchor" href="#adding-a-skill" aria-label="Permalink to &quot;Adding a Skill&quot;"></a></h3><ol><li>Click <strong>Add Skill</strong>.</li><li>A dialog with a basic template will open in the <strong>Monaco Editor</strong>.</li><li>Fill in the <code>name</code>, <code>description</code>, and content.</li><li>Click <strong>Save</strong>.</li></ol><h3 id="editing-and-deleting" tabindex="-1">Editing and Deleting <a class="header-anchor" href="#editing-and-deleting" aria-label="Permalink to &quot;Editing and Deleting&quot;"></a></h3><ul><li><strong>Edit</strong>: Click the pencil icon next to a skill card to modify its content or frontmatter.</li><li><strong>Delete</strong>: Click the trash icon to remove a skill from the bot&#39;s container.</li></ul><hr><h2 id="how-bots-use-skills" tabindex="-1">How Bots Use Skills <a class="header-anchor" href="#how-bots-use-skills" aria-label="Permalink to &quot;How Bots Use Skills&quot;"></a></h2><ul><li>Skills are injected into the bot&#39;s system prompt during conversation.</li><li>The YAML frontmatter helps the system categorize and manage the skills as tools.</li><li>Modular skills allow you to easily &quot;swap&quot; behaviors or capabilities without rewriting the entire bot.</li></ul>`,16)])])}const g=s(l,[["render",n]]);export{c as __pageData,g as default};
@@ -1 +0,0 @@
import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.DXGyWiRo.js";const c=JSON.parse('{"title":"Bot Skills","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/skills.md","filePath":"getting-started/skills.md","lastUpdated":1772359263000}'),l={name:"getting-started/skills.md"};function n(o,a,r,d,h,k){return i(),t("div",null,[...a[0]||(a[0]=[e("",16)])])}const g=s(l,[["render",n]]);export{c as __pageData,g as default};
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
import{_ as e,o,c as d,ag as a}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1776332711000}'),s={name:"getting-started/slash-commands.md"};function c(n,t,r,i,l,h){return o(),d("div",null,[...t[0]||(t[0]=[a("",134)])])}const m=e(s,[["render",c]]);export{u as __pageData,m as default};
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
import{_ as t,o as d,c as a,ag as o}from"./chunks/framework.DXGyWiRo.js";const p=JSON.parse('{"title":"Slash Commands","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/slash-commands.md","filePath":"getting-started/slash-commands.md","lastUpdated":1774787421000}'),s={name:"getting-started/slash-commands.md"};function r(n,e,c,l,i,h){return d(),a("div",null,[...e[0]||(e[0]=[o("",76)])])}const b=t(s,[["render",r]]);export{p as __pageData,b as default};
@@ -0,0 +1 @@
import{_ as e,o as a,c as l,ag as r}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Supermarket","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/supermarket.md","filePath":"getting-started/supermarket.md","lastUpdated":1776332711000}'),i={name:"getting-started/supermarket.md"};function n(o,t,s,h,p,m){return a(),l("div",null,[...t[0]||(t[0]=[r('<h1 id="supermarket" tabindex="-1">Supermarket <a class="header-anchor" href="#supermarket" aria-label="Permalink to &quot;Supermarket&quot;"></a></h1><p>Supermarket is Memoh&#39;s built-in catalog for <strong>skills</strong> and <strong>MCP templates</strong>.</p><hr><h2 id="install-a-skill" tabindex="-1">Install A Skill <a class="header-anchor" href="#install-a-skill" aria-label="Permalink to &quot;Install A Skill&quot;"></a></h2><ol><li>Open <strong>Supermarket</strong> in the Web UI.</li><li>Switch to the <strong>Skills</strong> tab.</li><li>Choose a skill and click <strong>Install</strong>.</li><li>Select the target bot.</li><li>Confirm the install.</li><li>The skill appears in that bot&#39;s <strong>Skills</strong> tab.</li></ol><hr><h2 id="install-an-mcp-template" tabindex="-1">Install An MCP Template <a class="header-anchor" href="#install-an-mcp-template" aria-label="Permalink to &quot;Install An MCP Template&quot;"></a></h2><ol><li>Open <strong>Supermarket</strong> in the Web UI.</li><li>Switch to the <strong>MCP</strong> tab.</li><li>Choose an entry and click <strong>Install</strong>.</li><li>Select the target bot.</li><li>Memoh opens that bot&#39;s <strong>MCP</strong> tab with a prefilled draft connection.</li><li>Fill in any required secrets or OAuth details.</li><li>Save the connection.</li><li>Probe it if you want to refresh tool discovery.</li></ol><hr><h2 id="contribute" tabindex="-1">Contribute <a class="header-anchor" href="#contribute" aria-label="Permalink to &quot;Contribute&quot;"></a></h2><p>Contribute new skills or MCP templates here:</p><ul><li><a href="https://github.com/memohai/supermarket" target="_blank" rel="noreferrer">memohai/supermarket</a></li></ul>',12)])])}const d=e(i,[["render",n]]);export{u as __pageData,d as default};
@@ -0,0 +1 @@
import{_ as e,o as a,c as l,ag as r}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Supermarket","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/supermarket.md","filePath":"getting-started/supermarket.md","lastUpdated":1776332711000}'),i={name:"getting-started/supermarket.md"};function n(o,t,s,h,p,m){return a(),l("div",null,[...t[0]||(t[0]=[r("",12)])])}const d=e(i,[["render",n]]);export{u as __pageData,d as default};
+1
View File
@@ -0,0 +1 @@
import{_ as t,o as a,c as r,ag as o}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1776332711000}'),n={name:"index.md"};function s(i,e,l,d,m,h){return a(),r("div",null,[...e[0]||(e[0]=[o('<h1 id="memoh-documentation" tabindex="-1">Memoh Documentation <a class="header-anchor" href="#memoh-documentation" aria-label="Permalink to &quot;Memoh Documentation&quot;"></a></h1><p>Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent platform. Create bots with isolated workspaces, persistent memory, tool access, and channel integrations across Telegram, Discord, Lark (Feishu), QQ, Matrix, Misskey, DingTalk, WeCom, WeChat, WeChat Official Account, Email, and Web.</p><h2 id="start-here" tabindex="-1">Start Here <a class="header-anchor" href="#start-here" aria-label="Permalink to &quot;Start Here&quot;"></a></h2><ul><li><strong><a href="/about.html">About Memoh</a></strong> — Product overview, platform model, and where to begin.</li><li><strong><a href="/installation/docker.html">Docker Installation</a></strong> — Recommended deployment path.</li><li><strong><a href="/getting-started/provider-and-model.html">Providers And Models</a></strong> — Set up providers, client types, and model roles.</li><li><strong><a href="/getting-started/bot.html">Bot Setup</a></strong> — Create a bot and configure its main tabs.</li><li><strong><a href="/getting-started/sessions.html">Sessions</a></strong> — Understand chat vs discuss sessions, status panels, and routing.</li><li><strong><a href="/getting-started/slash-commands.html">Slash Commands</a></strong> — Learn the command model and daily control surface.</li></ul><h2 id="feature-guides" tabindex="-1">Feature Guides <a class="header-anchor" href="#feature-guides" aria-label="Permalink to &quot;Feature Guides&quot;"></a></h2><ul><li><strong><a href="/getting-started/channels.html">Channels</a></strong> — Platform overview and links to per-channel guides.</li><li><strong><a href="/getting-started/access.html">Access Control</a></strong> — ACL presets, rule ordering, and scoped access.</li><li><strong><a href="/getting-started/skills.html">Skills</a></strong> — Managed skills, effective/shadowed states, and adoption workflow.</li><li><strong><a href="/getting-started/supermarket.html">Supermarket</a></strong> — Install skills and MCP templates from the catalog.</li><li><strong><a href="/getting-started/mcp.html">MCP</a></strong> — Configure tool servers, OAuth, probing, import/export.</li><li><strong><a href="/getting-started/memory.html">Memory</a></strong> — Long-term memory providers and memory compaction.</li><li><strong><a href="/getting-started/compaction.html">Context Compaction</a></strong> — Reduce active session context size without changing stored memory.</li></ul><h2 id="chinese-entry" tabindex="-1">Chinese Entry <a class="header-anchor" href="#chinese-entry" aria-label="Permalink to &quot;Chinese Entry&quot;"></a></h2><ul><li><strong><a href="/zh/">简体中文入口</a></strong> — Chinese landing page with translated concepts and links to key guides.</li></ul>',8)])])}const u=t(n,[["render",s]]);export{g as __pageData,u as default};
+1
View File
@@ -0,0 +1 @@
import{_ as t,o as a,c as r,ag as o}from"./chunks/framework.DXGyWiRo.js";const g=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1776332711000}'),n={name:"index.md"};function s(i,e,l,d,m,h){return a(),r("div",null,[...e[0]||(e[0]=[o("",8)])])}const u=t(n,[["render",s]]);export{g as __pageData,u as default};
-1
View File
@@ -1 +0,0 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1774787421000}'),i={name:"index.md"};function r(s,e,m,l,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n('<h1 id="memoh-documentation" tabindex="-1">Memoh Documentation <a class="header-anchor" href="#memoh-documentation" aria-label="Permalink to &quot;Memoh Documentation&quot;"></a></h1><p>Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Discord, Lark (Feishu), QQ, Matrix, WeCom, WeChat, Email, or Web. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.</p><h2 id="documentation" tabindex="-1">Documentation <a class="header-anchor" href="#documentation" aria-label="Permalink to &quot;Documentation&quot;"></a></h2><ul><li><strong><a href="/about.html">About Memoh</a></strong> — What Memoh is, key features, and installation links.</li><li><strong><a href="/installation/docker.html">Installation</a></strong> — Docker setup (recommended).</li><li><strong><a href="/getting-started/provider-and-model.html">Getting Started</a></strong> — Step-by-step guide to configure models, bots, and channels.</li><li><strong><a href="/channels/index.html">Channels</a></strong> — Detailed guides for Telegram, Feishu, Discord, QQ, Matrix, WeCom, and WeChat.</li></ul>',4)])])}const _=t(i,[["render",r]]);export{u as __pageData,_ as default};
-1
View File
@@ -1 +0,0 @@
import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1774787421000}'),i={name:"index.md"};function r(s,e,m,l,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n("",4)])])}const _=t(i,[["render",r]]);export{u as __pageData,_ as default};
+1
View File
@@ -0,0 +1 @@
import{_ as e,o as t,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Memoh 中文入口","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1776332711000}'),r={name:"zh/index.md"};function h(o,a,n,s,d,m){return t(),l("div",null,[...a[0]||(a[0]=[i('<h1 id="memoh-中文入口" tabindex="-1">Memoh 中文入口 <a class="header-anchor" href="#memoh-中文入口" aria-label="Permalink to &quot;Memoh 中文入口&quot;"></a></h1><p>Memoh 是一个多成员、长记忆、容器化的 AI Agent 平台。当前中文站点同时包含:</p><ul><li>已翻译的中文概念文档</li><li>指向英文主文档的常用功能入口</li></ul><p>如果你是第一次接触 Memoh,建议先看英文主文档里的功能指南;如果你正在理解账号语义、绑定关系和访问控制,再看下面的中文概念页。</p><h2 id="常用功能入口" tabindex="-1">常用功能入口 <a class="header-anchor" href="#常用功能入口" aria-label="Permalink to &quot;常用功能入口&quot;"></a></h2><ul><li><a href="/about.html">产品概览(英文)</a></li><li><a href="/installation/docker.html">Docker 安装(英文)</a></li><li><a href="/getting-started/provider-and-model.html">Providers And Models(英文)</a></li><li><a href="/getting-started/bot.html">Bot 配置(英文)</a></li><li><a href="/getting-started/sessions.html">Sessions / Discuss 模式(英文)</a></li><li><a href="/getting-started/channels.html">Channels 渠道接入(英文)</a></li><li><a href="/getting-started/skills.html">Skills(英文)</a></li><li><a href="/getting-started/supermarket.html">Supermarket(英文)</a></li><li><a href="/getting-started/slash-commands.html">Slash Commands(英文)</a></li></ul><h2 id="中文概念文档" tabindex="-1">中文概念文档 <a class="header-anchor" href="#中文概念文档" aria-label="Permalink to &quot;中文概念文档&quot;"></a></h2><ul><li><a href="/zh/concepts/">核心概念</a></li><li><a href="/zh/concepts/identity-and-binding.html">账号模型与绑定</a></li></ul><h2 id="面向文档维护者" tabindex="-1">面向文档维护者 <a class="header-anchor" href="#面向文档维护者" aria-label="Permalink to &quot;面向文档维护者&quot;"></a></h2><ul><li><a href="/zh/style/terminology.html">术语规范</a></li></ul><h2 id="当前中文维护范围" tabindex="-1">当前中文维护范围 <a class="header-anchor" href="#当前中文维护范围" aria-label="Permalink to &quot;当前中文维护范围&quot;"></a></h2><p>当前中文内容优先覆盖账号语义与访问控制相关的概念:</p><ul><li>区分系统账号与平台账号</li><li>解释为什么账号绑定是账号作用域</li><li>说明账号绑定与 bot 访问控制之间的关系</li></ul><p>说明:“平台账号”指用户在外部平台上的真实账号,例如飞书账号,而不是 Memoh 系统账号。</p>',14)])])}const f=e(r,[["render",h]]);export{u as __pageData,f as default};
+1
View File
@@ -0,0 +1 @@
import{_ as e,o as t,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const u=JSON.parse('{"title":"Memoh 中文入口","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1776332711000}'),r={name:"zh/index.md"};function h(o,a,n,s,d,m){return t(),l("div",null,[...a[0]||(a[0]=[i("",14)])])}const f=e(r,[["render",h]]);export{u as __pageData,f as default};
-1
View File
@@ -1 +0,0 @@
import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i('<h1 id="memoh-文档" tabindex="-1">Memoh 文档 <a class="header-anchor" href="#memoh-文档" aria-label="Permalink to &quot;Memoh 文档&quot;"></a></h1><p>Memoh 是一个多成员、长记忆、容器化的 AI Agent 系统。</p><h2 id="文档章节" tabindex="-1">文档章节 <a class="header-anchor" href="#文档章节" aria-label="Permalink to &quot;文档章节&quot;"></a></h2><ul><li><a href="/getting-started.html">快速开始</a></li><li><a href="/zh/concepts/">核心概念</a></li></ul><h2 id="面向文档贡献者" tabindex="-1">面向文档贡献者 <a class="header-anchor" href="#面向文档贡献者" aria-label="Permalink to &quot;面向文档贡献者&quot;"></a></h2><ul><li><a href="/zh/style/terminology.html">术语规范</a></li></ul><h2 id="当前维护范围" tabindex="-1">当前维护范围 <a class="header-anchor" href="#当前维护范围" aria-label="Permalink to &quot;当前维护范围&quot;"></a></h2><p>当前文档先聚焦账号语义与访问控制:</p><ul><li>区分系统账号与平台账号</li><li>解释为什么账号绑定是账号作用域</li><li>说明账号绑定与 bot 访问控制之间的关系</li></ul><p>说明:“平台账号”指用户在外部平台上的真实账号(例如飞书账号),不是 Memoh 系统账号。</p>',10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default};
-1
View File
@@ -1 +0,0 @@
import{_ as a,o as t,c as l,ag as i}from"./chunks/framework.DXGyWiRo.js";const _=JSON.parse('{"title":"Memoh 文档","description":"","frontmatter":{},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md","lastUpdated":1770887583000}'),o={name:"zh/index.md"};function r(h,e,n,d,s,m){return t(),l("div",null,[...e[0]||(e[0]=[i("",10)])])}const p=a(o,[["render",r]]);export{_ as __pageData,p as default};
File diff suppressed because one or more lines are too long
+3 -3
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4 -4
View File
File diff suppressed because one or more lines are too long
+5 -5
View File
File diff suppressed because one or more lines are too long
+5 -5
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4 -4
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4 -4
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More