diff --git a/404.html b/404.html index 4fd3eb7a..b5e4c4ba 100644 --- a/404.html +++ b/404.html @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@
- + \ No newline at end of file diff --git a/about.html b/about.html new file mode 100644 index 00000000..1214fe3a --- /dev/null +++ b/about.html @@ -0,0 +1,26 @@ + + + + + + About Memoh | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

About Memoh

What is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent system platform. You can create your own AI bots and chat with them via Telegram, Discord, Lark (Feishu), Email, Web, or CLI. Every bot has an independent container and memory system, allowing it to edit files, execute commands, and access the network within its own container — like having its own computer and brain.

Key Features

Multi-Bot Management

Create multiple bots. Humans and bots, or bots with each other, can chat privately, in groups, or collaborate. Supports role-based access control (owner / admin / member) with ownership transfer. Build bot teams, or set up accounts for family members to manage daily tasks with bots.

Multi-User & Identity Recognition

Bots can distinguish individual users in group chats, remember each person's context separately, and send direct messages to specific users. Cross-platform identity binding unifies the same person across Telegram, Discord, Lark, and Web.

Containerized Isolation

Each bot runs in its own isolated container (powered by Containerd) with a separate filesystem and network. Bots can freely read/write files and execute commands within their containers without interfering with each other. Supports container snapshots for save/restore.

Memory Engineering

A deeply engineered memory layer:

  • Automatically extracts key facts from each conversation turn and stores them as structured memories
  • Hybrid retrieval: semantic search (via Qdrant vector database) + keyword retrieval (BM25)
  • Loads the last 24 hours of conversation context by default
  • Automatic memory compaction and rebuild capabilities
  • Multi-language auto-detection

Multi-Platform Support

Unified channel adapter architecture for connecting to multiple messaging platforms:

  • Telegram — Full support with streaming, Markdown, attachments, and replies
  • Discord — Full support
  • Lark (Feishu) — Full support
  • Email — Inbound webhook + outbound providers (Mailgun, generic SMTP)
  • Web — Built-in web chat interface with streaming
  • CLI — Command-line chat

Agent Capabilities

Bots come with a rich set of built-in tools:

  • Web Search — Configurable search providers (Brave, Bing, Google, Tavily, SearXNG, DuckDuckGo, and more) for real-time information
  • Subagents — Create specialized subagents with independent context, assign skills, and delegate complex tasks
  • Skills — Define bot personality via IDENTITY.md, SOUL.md, and modular skill files that bots can enable/disable at runtime
  • Container Operations — Read/write files, edit code, and execute commands inside the container
  • Memory Management — Search and manage memories
  • Messaging — Send messages and reactions to specific users or channels

Multi-LLM Provider Support

Flexibly switch between a wide range of LLM providers via four client types:

  • OpenAI Responses API, OpenAI Chat Completions API (including compatible services)
  • Anthropic Messages API, Google Generative AI API

Per-bot model assignment for chat, memory, and embedding.

MCP Protocol Support

Full MCP (Model Context Protocol) support via HTTP, SSE, and Stdio to connect external tool services. Built-in tools for container operations, memory search, web search, scheduling, messaging, and more. Each bot can have its own independent MCP connections.

Scheduled Tasks

Configure scheduled tasks using cron expressions to automatically run commands at specified times. Supports max execution count limits and manual triggers.

Inbox

Cross-channel inbox — messages from other channels are queued and surfaced in the system prompt so the bot never misses context.

Graphical Configuration

Modern web UI (Vue 3 + Tailwind CSS) with real-time streaming chat, tool call visualization, container filesystem browser, and visual configuration for bots, channels, providers, models, MCP, skills, and all other settings. Dark/light theme, i18n. No coding required to set up your own AI bot.

CLI Tool

A command-line tool for bot management, channel configuration, model management, streaming chat, and more — designed for developers who prefer the terminal. See CLI documentation.

Installation

To get Memoh running:

  • Docker — Recommended. One-click or manual setup with Docker Compose. Includes all services (PostgreSQL, Qdrant, Containerd, server, agent, web) — no extra dependencies on the host.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/assets/about.md.Ce_QDK5Z.js b/assets/about.md.Ce_QDK5Z.js new file mode 100644 index 00000000..56d66053 --- /dev/null +++ b/assets/about.md.Ce_QDK5Z.js @@ -0,0 +1 @@ +import{_ as a,o as t,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const h=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1772359263000}'),n={name:"about.md"};function r(s,e,l,c,d,u){return t(),o("div",null,[...e[0]||(e[0]=[i('

About Memoh

What is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent system platform. You can create your own AI bots and chat with them via Telegram, Discord, Lark (Feishu), Email, Web, or CLI. Every bot has an independent container and memory system, allowing it to edit files, execute commands, and access the network within its own container — like having its own computer and brain.

Key Features

Multi-Bot Management

Create multiple bots. Humans and bots, or bots with each other, can chat privately, in groups, or collaborate. Supports role-based access control (owner / admin / member) with ownership transfer. Build bot teams, or set up accounts for family members to manage daily tasks with bots.

Multi-User & Identity Recognition

Bots can distinguish individual users in group chats, remember each person's context separately, and send direct messages to specific users. Cross-platform identity binding unifies the same person across Telegram, Discord, Lark, and Web.

Containerized Isolation

Each bot runs in its own isolated container (powered by Containerd) with a separate filesystem and network. Bots can freely read/write files and execute commands within their containers without interfering with each other. Supports container snapshots for save/restore.

Memory Engineering

A deeply engineered memory layer:

Multi-Platform Support

Unified channel adapter architecture for connecting to multiple messaging platforms:

Agent Capabilities

Bots come with a rich set of built-in tools:

Multi-LLM Provider Support

Flexibly switch between a wide range of LLM providers via four client types:

Per-bot model assignment for chat, memory, and embedding.

MCP Protocol Support

Full MCP (Model Context Protocol) support via HTTP, SSE, and Stdio to connect external tool services. Built-in tools for container operations, memory search, web search, scheduling, messaging, and more. Each bot can have its own independent MCP connections.

Scheduled Tasks

Configure scheduled tasks using cron expressions to automatically run commands at specified times. Supports max execution count limits and manual triggers.

Inbox

Cross-channel inbox — messages from other channels are queued and surfaced in the system prompt so the bot never misses context.

Graphical Configuration

Modern web UI (Vue 3 + Tailwind CSS) with real-time streaming chat, tool call visualization, container filesystem browser, and visual configuration for bots, channels, providers, models, MCP, skills, and all other settings. Dark/light theme, i18n. No coding required to set up your own AI bot.

CLI Tool

A command-line tool for bot management, channel configuration, model management, streaming chat, and more — designed for developers who prefer the terminal. See CLI documentation.

Installation

To get Memoh running:

',36)])])}const p=a(n,[["render",r]]);export{h as __pageData,p as default}; diff --git a/assets/about.md.Ce_QDK5Z.lean.js b/assets/about.md.Ce_QDK5Z.lean.js new file mode 100644 index 00000000..e1792632 --- /dev/null +++ b/assets/about.md.Ce_QDK5Z.lean.js @@ -0,0 +1 @@ +import{_ as a,o as t,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const h=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1772359263000}'),n={name:"about.md"};function r(s,e,l,c,d,u){return t(),o("div",null,[...e[0]||(e[0]=[i("",36)])])}const p=a(n,[["render",r]]);export{h as __pageData,p as default}; diff --git a/assets/app.CxqLIhm3.js b/assets/app.C3UDSdfi.js similarity index 95% rename from assets/app.CxqLIhm3.js rename to assets/app.C3UDSdfi.js index 7616e52e..5eeb5f75 100644 --- a/assets/app.CxqLIhm3.js +++ b/assets/app.C3UDSdfi.js @@ -1 +1 @@ -import{t as p}from"./chunks/theme.CVaJS-5R.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.ePeAWSvT.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.C3TxVq5K.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.ePeAWSvT.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}; diff --git a/assets/channels_discord.md.DBWQl28b.js b/assets/channels_discord.md.DBWQl28b.js new file mode 100644 index 00000000..e98af880 --- /dev/null +++ b/assets/channels_discord.md.DBWQl28b.js @@ -0,0 +1 @@ +import{_ as t,o,c as r,ag as a}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1772359263000}'),i={name:"channels/discord.md"};function n(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a('

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent (required for the bot to read user messages).
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Channels tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

',13)])])}const u=t(i,[["render",n]]);export{p as __pageData,u as default}; diff --git a/assets/channels_discord.md.DBWQl28b.lean.js b/assets/channels_discord.md.DBWQl28b.lean.js new file mode 100644 index 00000000..3b67d877 --- /dev/null +++ b/assets/channels_discord.md.DBWQl28b.lean.js @@ -0,0 +1 @@ +import{_ as t,o,c as r,ag as a}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Discord Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/discord.md","filePath":"channels/discord.md","lastUpdated":1772359263000}'),i={name:"channels/discord.md"};function n(s,e,l,c,d,h){return o(),r("div",null,[...e[0]||(e[0]=[a("",13)])])}const u=t(i,[["render",n]]);export{p as __pageData,u as default}; diff --git a/assets/channels_feishu.md.-Rc8F8IG.js b/assets/channels_feishu.md.-Rc8F8IG.js new file mode 100644 index 00000000..a48fe1b7 --- /dev/null +++ b/assets/channels_feishu.md.-Rc8F8IG.js @@ -0,0 +1 @@ +import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1772359263000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a('

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Channels tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.
',13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; diff --git a/assets/channels_feishu.md.-Rc8F8IG.lean.js b/assets/channels_feishu.md.-Rc8F8IG.lean.js new file mode 100644 index 00000000..d493c8bf --- /dev/null +++ b/assets/channels_feishu.md.-Rc8F8IG.lean.js @@ -0,0 +1 @@ +import{_ as o,o as t,c as i,ag as a}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Feishu (Lark) Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/feishu.md","filePath":"channels/feishu.md","lastUpdated":1772359263000}'),n={name:"channels/feishu.md"};function s(r,e,l,p,h,g){return t(),i("div",null,[...e[0]||(e[0]=[a("",13)])])}const d=o(n,[["render",s]]);export{c as __pageData,d as default}; diff --git a/assets/channels_index.md.Cd1GuQFE.js b/assets/channels_index.md.Cd1GuQFE.js new file mode 100644 index 00000000..bd96b4d9 --- /dev/null +++ b/assets/channels_index.md.Cd1GuQFE.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as n,ag as r}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1772359263000}'),o={name:"channels/index.md"};function s(i,e,l,h,c,d){return a(),n("div",null,[...e[0]||(e[0]=[r('

Channels Overview

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.

Memoh currently supports the following channels:

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform (e.g., via BotFather on Telegram).
  2. Obtain credentials: Fetch API tokens, App IDs, or secrets.
  3. Configure in Memoh: Add the channel to your Bot's settings and paste the credentials.
  4. Enable: Activate the channel to start receiving and sending messages.

Choose a channel from the sidebar to see detailed configuration guides for each platform.

',7)])])}const m=t(o,[["render",s]]);export{u as __pageData,m as default}; diff --git a/assets/channels_index.md.Cd1GuQFE.lean.js b/assets/channels_index.md.Cd1GuQFE.lean.js new file mode 100644 index 00000000..60e40ad0 --- /dev/null +++ b/assets/channels_index.md.Cd1GuQFE.lean.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as n,ag as r}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Channels Overview","description":"","frontmatter":{},"headers":[],"relativePath":"channels/index.md","filePath":"channels/index.md","lastUpdated":1772359263000}'),o={name:"channels/index.md"};function s(i,e,l,h,c,d){return a(),n("div",null,[...e[0]||(e[0]=[r("",7)])])}const m=t(o,[["render",s]]);export{u as __pageData,m as default}; diff --git a/assets/channels_telegram.md.URjBaQHx.js b/assets/channels_telegram.md.URjBaQHx.js new file mode 100644 index 00000000..37ad0b1e --- /dev/null +++ b/assets/channels_telegram.md.URjBaQHx.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1772359263000}'),r={name:"channels/telegram.md"};function l(i,e,s,d,g,h){return o(),a("div",null,[...e[0]||(e[0]=[n('

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Channels tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

If your bot is a personal type bot, you need to bind your Telegram identity to your Memoh account to chat with it directly.

  1. In Memoh Web UI, go to Settings > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

',13)])])}const p=t(r,[["render",l]]);export{u as __pageData,p as default}; diff --git a/assets/channels_telegram.md.URjBaQHx.lean.js b/assets/channels_telegram.md.URjBaQHx.lean.js new file mode 100644 index 00000000..2ff074a4 --- /dev/null +++ b/assets/channels_telegram.md.URjBaQHx.lean.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Telegram Channel Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"channels/telegram.md","filePath":"channels/telegram.md","lastUpdated":1772359263000}'),r={name:"channels/telegram.md"};function l(i,e,s,d,g,h){return o(),a("div",null,[...e[0]||(e[0]=[n("",13)])])}const p=t(r,[["render",l]]);export{u as __pageData,p as default}; diff --git a/assets/chunks/@localSearchIndexroot.B9pKhhFx.js b/assets/chunks/@localSearchIndexroot.B9pKhhFx.js new file mode 100644 index 00000000..1220c6b7 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.B9pKhhFx.js @@ -0,0 +1 @@ +const e='{"documentCount":163,"nextId":163,"documentIds":{"0":"/about.html#about-memoh","1":"/about.html#what-is-memoh","2":"/about.html#key-features","3":"/about.html#multi-bot-management","4":"/about.html#multi-user-identity-recognition","5":"/about.html#containerized-isolation","6":"/about.html#memory-engineering","7":"/about.html#multi-platform-support","8":"/about.html#agent-capabilities","9":"/about.html#multi-llm-provider-support","10":"/about.html#mcp-protocol-support","11":"/about.html#scheduled-tasks","12":"/about.html#inbox","13":"/about.html#graphical-configuration","14":"/about.html#cli-tool","15":"/about.html#installation","16":"/blogs/2026-02-16.html#introduction-to-memoh-the-case-for-an-always-on-containerized-home-agent","17":"/blogs/2026-02-16.html#overview","18":"/blogs/2026-02-16.html#story-time","19":"/blogs/2026-02-16.html#what","20":"/blogs/2026-02-16.html#why","21":"/blogs/2026-02-16.html#how","22":"/blogs/2026-02-16.html#features","23":"/blogs/2026-02-16.html#compare-to-openclaw","24":"/blogs/2026-02-16.html#conclusion","25":"/blogs/#blogs","26":"/channels/discord.html#discord-channel-configuration","27":"/channels/discord.html#step-1-create-a-discord-application","28":"/channels/discord.html#step-2-configure-bot-settings","29":"/channels/discord.html#step-3-invite-the-bot-to-your-server","30":"/channels/discord.html#step-4-configure-memoh","31":"/channels/discord.html#features-supported","32":"/channels/feishu.html#feishu-lark-channel-configuration","33":"/channels/feishu.html#step-1-create-a-feishu-app","34":"/channels/feishu.html#step-2-enable-bot-capability","35":"/channels/feishu.html#step-3-configure-permissions","36":"/channels/feishu.html#step-4-configure-events-webhook-mode","37":"/channels/feishu.html#step-5-publish-your-app","38":"/channels/#channels-overview","39":"/channels/#general-setup-flow","40":"/channels/telegram.html#telegram-channel-configuration","41":"/channels/telegram.html#step-1-create-a-telegram-bot","42":"/channels/telegram.html#step-2-configure-memoh","43":"/channels/telegram.html#step-3-bind-your-identity-optional","44":"/channels/telegram.html#features-supported","45":"/getting-started/bot.html#bot-management","46":"/getting-started/bot.html#creating-a-bot","47":"/getting-started/bot.html#bot-detail-page","48":"/getting-started/bot.html#overview-tab","49":"/getting-started/bot.html#configuring-the-bot-s-brain-models","50":"/getting-started/bot.html#settings-tab-reference","51":"/getting-started/bot.html#deleting-a-bot","52":"/getting-started/container.html#bot-container-management","53":"/getting-started/container.html#concept-the-isolated-workspace","54":"/getting-started/container.html#operations","55":"/getting-started/container.html#lifecycle-actions","56":"/getting-started/container.html#container-information","57":"/getting-started/container.html#snapshots","58":"/getting-started/container.html#creating-a-snapshot","59":"/getting-started/container.html#restoring-a-snapshot","60":"/getting-started/container.html#managing-snapshots","61":"/getting-started/channels.html#bot-channels","62":"/getting-started/channels.html#concept-unified-communication","63":"/getting-started/channels.html#supported-channels","64":"/getting-started/channels.html#popular-platforms","65":"/getting-started/channels.html#configuration-flow","66":"/getting-started/channels.html#_1-adding-a-channel","67":"/getting-started/channels.html#_2-common-fields","68":"/getting-started/channels.html#_3-special-case-feishu-webhook","69":"/getting-started/channels.html#operations","70":"/getting-started/email.html#email-providers-and-bindings","71":"/getting-started/email.html#concept-email-as-a-bot-channel","72":"/getting-started/email.html#email-provider","73":"/getting-started/email.html#creating-a-provider","74":"/getting-started/email.html#bot-email-bindings","75":"/getting-started/email.html#adding-a-binding","76":"/getting-started/email.html#outbox-and-history","77":"/getting-started/email.html#bot-interaction","78":"/getting-started/heartbeat.html#bot-heartbeat","79":"/getting-started/heartbeat.html#concept-scheduled-autonomy","80":"/getting-started/heartbeat.html#configuration","81":"/getting-started/heartbeat.html#logs-and-monitoring","82":"/getting-started/heartbeat.html#managing-logs","83":"/getting-started/heartbeat.html#bot-interaction","84":"/getting-started/files.html#bot-files-management","85":"/getting-started/files.html#operations","86":"/getting-started/files.html#browsing-and-navigation","87":"/getting-started/files.html#managing-files","88":"/getting-started/files.html#viewing-and-editing","89":"/getting-started/files.html#text-files","90":"/getting-started/files.html#images","91":"/getting-started/files.html#bot-interaction-with-files","92":"/getting-started/mcp.html#mcp-connections","93":"/getting-started/mcp.html#concept-extending-bot-capabilities","94":"/getting-started/mcp.html#connection-types","95":"/getting-started/mcp.html#_1-stdio-local-process","96":"/getting-started/mcp.html#_2-remote-http-sse","97":"/getting-started/mcp.html#operations","98":"/getting-started/mcp.html#bot-interaction","99":"/getting-started/memory.html#bot-memory-management","100":"/getting-started/memory.html#concept-semantic-search","101":"/getting-started/memory.html#operations","102":"/getting-started/memory.html#_1-creating-memories","103":"/getting-started/memory.html#_2-searching-and-managing","104":"/getting-started/memory.html#memory-compression-compact","105":"/getting-started/memory.html#visualization-vector-manifold","106":"/getting-started/memory.html#top-k-bucket-chart","107":"/getting-started/memory.html#cdf-curve-cumulative-distribution-function","108":"/getting-started/memory.html#bot-interaction","109":"/getting-started/provider-and-model.html#llm-provider-and-model","110":"/getting-started/provider-and-model.html#llm-provider","111":"/getting-started/provider-and-model.html#creating-a-provider","112":"/getting-started/provider-and-model.html#managing-providers","113":"/getting-started/provider-and-model.html#model","114":"/getting-started/provider-and-model.html#adding-a-model","115":"/getting-started/provider-and-model.html#managing-models","116":"/getting-started/provider-and-model.html#next-steps","117":"/getting-started/schedule.html#scheduled-tasks","118":"/getting-started/schedule.html#concept-cron-based-automation","119":"/getting-started/schedule.html#schedule-fields","120":"/getting-started/schedule.html#cron-pattern-reference","121":"/getting-started/schedule.html#viewing-schedules","122":"/getting-started/schedule.html#creating-schedules","123":"/getting-started/schedule.html#via-the-bot-conversational","124":"/getting-started/schedule.html#via-the-api","125":"/getting-started/schedule.html#execution-flow","126":"/getting-started/schedule.html#schedule-vs-heartbeat","127":"/getting-started/skills.html#bot-skills","128":"/getting-started/skills.html#concept-skills-as-markdown","129":"/getting-started/skills.html#example-skill-structure","130":"/getting-started/skills.html#managing-skills","131":"/getting-started/skills.html#adding-a-skill","132":"/getting-started/skills.html#editing-and-deleting","133":"/getting-started/skills.html#how-bots-use-skills","134":"/getting-started/search-provider.html#search-providers","135":"/getting-started/search-provider.html#concept-real-time-knowledge","136":"/getting-started/search-provider.html#supported-search-engines","137":"/getting-started/search-provider.html#configuration-flow","138":"/getting-started/search-provider.html#_1-adding-a-search-provider","139":"/getting-started/search-provider.html#_2-managing-providers","140":"/getting-started/search-provider.html#assigning-a-search-provider-to-a-bot","141":"/getting-started/search-provider.html#bot-interaction","142":"/getting-started/subagents.html#bot-subagents","143":"/getting-started/subagents.html#concept-task-specialization","144":"/getting-started/subagents.html#fields","145":"/getting-started/subagents.html#operations","146":"/getting-started/subagents.html#bot-interaction","147":"/#memoh-documentation","148":"/#documentation","149":"/installation/docker.html#docker-installation","150":"/installation/docker.html#prerequisites","151":"/installation/docker.html#one-click-install-recommended","152":"/installation/docker.html#manual-install","153":"/installation/docker.html#china-mainland-mirror","154":"/installation/docker.html#service-architecture","155":"/installation/docker.html#access-points","156":"/installation/docker.html#data-persistence","157":"/installation/docker.html#common-commands","158":"/installation/docker.html#upgrading","159":"/installation/docker.html#environment-variables","160":"/installation/docker.html#production-checklist","161":"/installation/docker.html#troubleshooting","162":"/installation/docker.html#security-warnings"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,1],"1":[4,2,55],"2":[2,2,1],"3":[3,4,39],"4":[5,4,33],"5":[2,4,38],"6":[2,4,48],"7":[3,4,41],"8":[2,4,81],"9":[4,4,36],"10":[3,4,37],"11":[2,4,22],"12":[1,4,21],"13":[2,4,47],"14":[2,4,24],"15":[1,2,29],"16":[12,1,1],"17":[1,12,74],"18":[2,12,215],"19":[1,12,29],"20":[1,12,54],"21":[1,12,65],"22":[1,12,104],"23":[3,12,83],"24":[1,12,62],"25":[1,1,12],"26":[3,1,16],"27":[6,3,28],"28":[5,3,21],"29":[8,3,42],"30":[4,3,23],"31":[2,3,25],"32":[4,1,24],"33":[6,4,34],"34":[5,4,13],"35":[4,4,31],"36":[7,4,56],"37":[5,4,30],"38":[2,1,66],"39":[3,2,53],"40":[3,1,28],"41":[6,3,55],"42":[4,3,30],"43":[7,3,45],"44":[2,3,35],"45":[2,1,34],"46":[3,2,42],"47":[3,2,23],"48":[2,4,37],"49":[7,2,92],"50":[3,2,102],"51":[3,2,44],"52":[3,1,35],"53":[4,3,30],"54":[1,3,16],"55":[2,4,51],"56":[2,3,46],"57":[1,3,32],"58":[3,4,18],"59":[3,4,17],"60":[2,4,23],"61":[2,1,18],"62":[3,2,29],"63":[2,2,14],"64":[2,3,22],"65":[2,2,1],"66":[4,4,24],"67":[3,4,33],"68":[5,4,32],"69":[1,2,20],"70":[4,1,18],"71":[6,4,28],"72":[2,4,13],"73":[3,5,38],"74":[3,4,15],"75":[3,5,41],"76":[3,4,34],"77":[2,4,45],"78":[2,1,24],"79":[3,2,38],"80":[1,2,41],"81":[3,2,46],"82":[2,5,29],"83":[2,2,36],"84":[3,1,24],"85":[1,3,17],"86":[3,4,31],"87":[2,4,42],"88":[3,3,17],"89":[2,6,39],"90":[1,6,20],"91":[4,3,36],"92":[2,1,21],"93":[4,2,25],"94":[2,2,11],"95":[5,4,51],"96":[5,4,36],"97":[1,2,43],"98":[2,2,32],"99":[3,1,22],"100":[3,3,31],"101":[1,3,14],"102":[3,4,26],"103":[4,4,25],"104":[4,3,48],"105":[3,3,18],"106":[4,6,12],"107":[6,6,20],"108":[2,3,38],"109":[4,1,16],"110":[2,4,27],"111":[3,4,46],"112":[2,4,27],"113":[1,4,31],"114":[3,4,88],"115":[2,4,16],"116":[2,4,16],"117":[2,1,33],"118":[4,2,37],"119":[2,2,77],"120":[3,2,46],"121":[2,2,31],"122":[2,2,8],"123":[5,4,46],"124":[3,4,42],"125":[2,2,48],"126":[3,2,52],"127":[2,1,23],"128":[4,2,27],"129":[3,5,37],"130":[2,2,15],"131":[3,3,22],"132":[3,3,23],"133":[4,2,35],"134":[2,1,23],"135":[4,2,28],"136":[3,2,53],"137":[2,2,1],"138":[5,4,44],"139":[3,4,21],"140":[6,2,22],"141":[2,2,35],"142":[2,1,27],"143":[3,2,31],"144":[1,2,48],"145":[1,2,37],"146":[2,2,43],"147":[2,1,46],"148":[1,2,34],"149":[2,1,44],"150":[1,2,5],"151":[5,2,76],"152":[2,2,90],"153":[3,4,46],"154":[2,2,70],"155":[2,2,37],"156":[2,2,53],"157":[2,2,38],"158":[1,2,29],"159":[2,2,22],"160":[2,2,48],"161":[1,2,23],"162":[2,2,31]},"averageFieldLength":[2.858895705521473,3.2638036809815945,35.95705521472395],"storedFields":{"0":{"title":"About Memoh","titles":[]},"1":{"title":"What is Memoh?","titles":["About Memoh"]},"2":{"title":"Key Features","titles":["About Memoh"]},"3":{"title":"Multi-Bot Management","titles":["About Memoh","Key Features"]},"4":{"title":"Multi-User & Identity Recognition","titles":["About Memoh","Key Features"]},"5":{"title":"Containerized Isolation","titles":["About Memoh","Key Features"]},"6":{"title":"Memory Engineering","titles":["About Memoh","Key Features"]},"7":{"title":"Multi-Platform Support","titles":["About Memoh","Key Features"]},"8":{"title":"Agent Capabilities","titles":["About Memoh","Key Features"]},"9":{"title":"Multi-LLM Provider Support","titles":["About Memoh","Key Features"]},"10":{"title":"MCP Protocol Support","titles":["About Memoh","Key Features"]},"11":{"title":"Scheduled Tasks","titles":["About Memoh","Key Features"]},"12":{"title":"Inbox","titles":["About Memoh","Key Features"]},"13":{"title":"Graphical Configuration","titles":["About Memoh","Key Features"]},"14":{"title":"CLI Tool","titles":["About Memoh","Key Features"]},"15":{"title":"Installation","titles":["About Memoh"]},"16":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","titles":[]},"17":{"title":"Overview","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"18":{"title":"Story Time","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"19":{"title":"What","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"20":{"title":"Why","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"21":{"title":"How","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"22":{"title":"Features","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"23":{"title":"Compare to OpenClaw","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"24":{"title":"Conclusion","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"25":{"title":"Blogs","titles":[]},"26":{"title":"Discord Channel Configuration","titles":[]},"27":{"title":"Step 1: Create a Discord Application","titles":["Discord Channel Configuration"]},"28":{"title":"Step 2: Configure Bot Settings","titles":["Discord Channel Configuration"]},"29":{"title":"Step 3: Invite the Bot to Your Server","titles":["Discord Channel Configuration"]},"30":{"title":"Step 4: Configure Memoh","titles":["Discord Channel Configuration"]},"31":{"title":"Features Supported","titles":["Discord Channel Configuration"]},"32":{"title":"Feishu (Lark) Channel Configuration","titles":[]},"33":{"title":"Step 1: Create a Feishu App","titles":["Feishu (Lark) Channel Configuration"]},"34":{"title":"Step 2: Enable Bot Capability","titles":["Feishu (Lark) Channel Configuration"]},"35":{"title":"Step 3: Configure Permissions","titles":["Feishu (Lark) Channel Configuration"]},"36":{"title":"Step 4: Configure Events (Webhook Mode)","titles":["Feishu (Lark) Channel Configuration"]},"37":{"title":"Step 5: Publish Your App","titles":["Feishu (Lark) Channel Configuration"]},"38":{"title":"Channels Overview","titles":[]},"39":{"title":"General Setup Flow","titles":["Channels Overview"]},"40":{"title":"Telegram Channel Configuration","titles":[]},"41":{"title":"Step 1: Create a Telegram Bot","titles":["Telegram Channel Configuration"]},"42":{"title":"Step 2: Configure Memoh","titles":["Telegram Channel Configuration"]},"43":{"title":"Step 3: Bind Your Identity (Optional)","titles":["Telegram Channel Configuration"]},"44":{"title":"Features Supported","titles":["Telegram Channel Configuration"]},"45":{"title":"Bot Management","titles":[]},"46":{"title":"Creating a Bot","titles":["Bot Management"]},"47":{"title":"Bot Detail Page","titles":["Bot Management"]},"48":{"title":"Overview Tab","titles":["Bot Management","Bot Detail Page"]},"49":{"title":"Configuring the Bot\'s Brain (Models)","titles":["Bot Management"]},"50":{"title":"Settings Tab Reference","titles":["Bot Management"]},"51":{"title":"Deleting a Bot","titles":["Bot Management"]},"52":{"title":"Bot Container Management","titles":[]},"53":{"title":"Concept: The Isolated Workspace","titles":["Bot Container Management"]},"54":{"title":"Operations","titles":["Bot Container Management"]},"55":{"title":"Lifecycle Actions","titles":["Bot Container Management","Operations"]},"56":{"title":"Container Information","titles":["Bot Container Management"]},"57":{"title":"Snapshots","titles":["Bot Container Management"]},"58":{"title":"Creating a Snapshot","titles":["Bot Container Management","Snapshots"]},"59":{"title":"Restoring a Snapshot","titles":["Bot Container Management","Snapshots"]},"60":{"title":"Managing Snapshots","titles":["Bot Container Management","Snapshots"]},"61":{"title":"Bot Channels","titles":[]},"62":{"title":"Concept: Unified Communication","titles":["Bot Channels"]},"63":{"title":"Supported Channels","titles":["Bot Channels"]},"64":{"title":"Popular Platforms","titles":["Bot Channels","Supported Channels"]},"65":{"title":"Configuration Flow","titles":["Bot Channels"]},"66":{"title":"1. Adding a Channel","titles":["Bot Channels","Configuration Flow"]},"67":{"title":"2. Common Fields","titles":["Bot Channels","Configuration Flow"]},"68":{"title":"3. Special Case: Feishu Webhook","titles":["Bot Channels","Configuration Flow"]},"69":{"title":"Operations","titles":["Bot Channels"]},"70":{"title":"Email Providers and Bindings","titles":[]},"71":{"title":"Concept: Email as a Bot Channel","titles":["Email Providers and Bindings"]},"72":{"title":"Email Provider","titles":["Email Providers and Bindings"]},"73":{"title":"Creating a Provider","titles":["Email Providers and Bindings","Email Provider"]},"74":{"title":"Bot Email Bindings","titles":["Email Providers and Bindings"]},"75":{"title":"Adding a Binding","titles":["Email Providers and Bindings","Bot Email Bindings"]},"76":{"title":"Outbox and History","titles":["Email Providers and Bindings"]},"77":{"title":"Bot Interaction","titles":["Email Providers and Bindings"]},"78":{"title":"Bot Heartbeat","titles":[]},"79":{"title":"Concept: Scheduled Autonomy","titles":["Bot Heartbeat"]},"80":{"title":"Configuration","titles":["Bot Heartbeat"]},"81":{"title":"Logs and Monitoring","titles":["Bot Heartbeat"]},"82":{"title":"Managing Logs","titles":["Bot Heartbeat","Logs and Monitoring"]},"83":{"title":"Bot Interaction","titles":["Bot Heartbeat"]},"84":{"title":"Bot Files Management","titles":[]},"85":{"title":"Operations","titles":["Bot Files Management"]},"86":{"title":"Browsing and Navigation","titles":["Bot Files Management","Operations"]},"87":{"title":"Managing Files","titles":["Bot Files Management","Operations"]},"88":{"title":"Viewing and Editing","titles":["Bot Files Management"]},"89":{"title":"Text Files","titles":["Bot Files Management","Viewing and Editing"]},"90":{"title":"Images","titles":["Bot Files Management","Viewing and Editing"]},"91":{"title":"Bot Interaction with Files","titles":["Bot Files Management"]},"92":{"title":"MCP Connections","titles":[]},"93":{"title":"Concept: Extending Bot Capabilities","titles":["MCP Connections"]},"94":{"title":"Connection Types","titles":["MCP Connections"]},"95":{"title":"1. Stdio (Local Process)","titles":["MCP Connections","Connection Types"]},"96":{"title":"2. Remote (HTTP/SSE)","titles":["MCP Connections","Connection Types"]},"97":{"title":"Operations","titles":["MCP Connections"]},"98":{"title":"Bot Interaction","titles":["MCP Connections"]},"99":{"title":"Bot Memory Management","titles":[]},"100":{"title":"Concept: Semantic Search","titles":["Bot Memory Management"]},"101":{"title":"Operations","titles":["Bot Memory Management"]},"102":{"title":"1. Creating Memories","titles":["Bot Memory Management","Operations"]},"103":{"title":"2. Searching and Managing","titles":["Bot Memory Management","Operations"]},"104":{"title":"Memory Compression (Compact)","titles":["Bot Memory Management"]},"105":{"title":"Visualization: Vector Manifold","titles":["Bot Memory Management"]},"106":{"title":"Top-K Bucket Chart","titles":["Bot Memory Management","Visualization: Vector Manifold"]},"107":{"title":"CDF Curve (Cumulative Distribution Function)","titles":["Bot Memory Management","Visualization: Vector Manifold"]},"108":{"title":"Bot Interaction","titles":["Bot Memory Management"]},"109":{"title":"LLM Provider and Model","titles":[]},"110":{"title":"LLM Provider","titles":["LLM Provider and Model"]},"111":{"title":"Creating a Provider","titles":["LLM Provider and Model","LLM Provider"]},"112":{"title":"Managing Providers","titles":["LLM Provider and Model","LLM Provider"]},"113":{"title":"Model","titles":["LLM Provider and Model"]},"114":{"title":"Adding a Model","titles":["LLM Provider and Model","Model"]},"115":{"title":"Managing Models","titles":["LLM Provider and Model","Model"]},"116":{"title":"Next Steps","titles":["LLM Provider and Model"]},"117":{"title":"Scheduled Tasks","titles":[]},"118":{"title":"Concept: Cron-Based Automation","titles":["Scheduled Tasks"]},"119":{"title":"Schedule Fields","titles":["Scheduled Tasks"]},"120":{"title":"Cron Pattern Reference","titles":["Scheduled Tasks"]},"121":{"title":"Viewing Schedules","titles":["Scheduled Tasks"]},"122":{"title":"Creating Schedules","titles":["Scheduled Tasks"]},"123":{"title":"Via the Bot (Conversational)","titles":["Scheduled Tasks","Creating Schedules"]},"124":{"title":"Via the API","titles":["Scheduled Tasks","Creating Schedules"]},"125":{"title":"Execution Flow","titles":["Scheduled Tasks"]},"126":{"title":"Schedule vs. Heartbeat","titles":["Scheduled Tasks"]},"127":{"title":"Bot Skills","titles":[]},"128":{"title":"Concept: Skills as Markdown","titles":["Bot Skills"]},"129":{"title":"Example Skill Structure","titles":["Bot Skills","Concept: Skills as Markdown"]},"130":{"title":"Managing Skills","titles":["Bot Skills"]},"131":{"title":"Adding a Skill","titles":["Bot Skills","Managing Skills"]},"132":{"title":"Editing and Deleting","titles":["Bot Skills","Managing Skills"]},"133":{"title":"How Bots Use Skills","titles":["Bot Skills"]},"134":{"title":"Search Providers","titles":[]},"135":{"title":"Concept: Real-Time Knowledge","titles":["Search Providers"]},"136":{"title":"Supported Search Engines","titles":["Search Providers"]},"137":{"title":"Configuration Flow","titles":["Search Providers"]},"138":{"title":"1. Adding a Search Provider","titles":["Search Providers","Configuration Flow"]},"139":{"title":"2. Managing Providers","titles":["Search Providers","Configuration Flow"]},"140":{"title":"Assigning a Search Provider to a Bot","titles":["Search Providers"]},"141":{"title":"Bot Interaction","titles":["Search Providers"]},"142":{"title":"Bot Subagents","titles":[]},"143":{"title":"Concept: Task Specialization","titles":["Bot Subagents"]},"144":{"title":"Fields","titles":["Bot Subagents"]},"145":{"title":"Operations","titles":["Bot Subagents"]},"146":{"title":"Bot Interaction","titles":["Bot Subagents"]},"147":{"title":"Memoh Documentation","titles":[]},"148":{"title":"Documentation","titles":["Memoh Documentation"]},"149":{"title":"Docker Installation","titles":[]},"150":{"title":"Prerequisites","titles":["Docker Installation"]},"151":{"title":"One-Click Install (Recommended)","titles":["Docker Installation"]},"152":{"title":"Manual Install","titles":["Docker Installation"]},"153":{"title":"China Mainland Mirror","titles":["Docker Installation","Manual Install"]},"154":{"title":"Service Architecture","titles":["Docker Installation"]},"155":{"title":"Access Points","titles":["Docker Installation"]},"156":{"title":"Data Persistence","titles":["Docker Installation"]},"157":{"title":"Common Commands","titles":["Docker Installation"]},"158":{"title":"Upgrading","titles":["Docker Installation"]},"159":{"title":"Environment Variables","titles":["Docker Installation"]},"160":{"title":"Production Checklist","titles":["Docker Installation"]},"161":{"title":"Troubleshooting","titles":["Docker Installation"]},"162":{"title":"Security Warnings","titles":["Docker Installation"]}},"dirtCount":0,"index":[["x26",{"2":{"157":2,"161":2}}],["=",{"2":{"153":1}}],["$",{"2":{"152":1}}],["~",{"2":{"151":2}}],["|",{"2":{"151":2}}],["ˈmemoʊ",{"2":{"147":1}}],["`run",{"2":{"129":1}}],["`edit",{"2":{"129":1}}],["6",{"2":{"120":1}}],["│",{"2":{"120":15}}],["┌─────────────",{"2":{"120":5}}],["9",{"2":{"119":2,"120":2}}],["8081",{"2":{"155":1}}],["8080",{"2":{"155":1}}],["8082",{"2":{"155":1}}],["8",{"2":{"104":1,"120":3,"123":1,"124":1}}],["00",{"2":{"119":1,"120":3}}],["0",{"2":{"104":3,"119":1,"120":9,"124":1}}],["zone",{"2":{"51":1}}],["59",{"2":{"120":1}}],["5",{"0":{"37":1},"2":{"104":1}}],["4o",{"2":{"49":1,"113":1,"114":1}}],["4",{"0":{"30":1,"36":1}}],["18",{"2":{"154":1}}],["12",{"2":{"120":1}}],["123456789",{"2":{"41":1}}],["1536",{"2":{"114":1}}],["1",{"0":{"27":1,"33":1,"41":1,"66":1,"95":1,"102":1,"138":1},"2":{"120":4,"152":1,"155":1}}],["jwt",{"2":{"151":2,"152":1}}],["jina",{"2":{"136":1}}],["jpg",{"2":{"90":1}}],["json",{"2":{"97":3,"124":1}}],["js",{"2":{"89":1}}],["join",{"2":{"26":1}}],["jobs",{"2":{"23":1}}],["just",{"2":{"18":1,"77":1}}],["k",{"0":{"106":1}}],["known",{"2":{"57":1}}],["knowledge",{"0":{"135":1},"2":{"19":1,"108":1,"134":1}}],["kind",{"2":{"18":1}}],["keep",{"2":{"18":1,"24":2,"41":1,"82":1}}],["kept",{"2":{"17":1}}],["keys",{"2":{"67":1}}],["keyword",{"2":{"6":1}}],["key",{"0":{"2":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"49":1,"73":1,"95":1,"111":1,"112":1,"138":1,"148":1}}],["yml",{"2":{"152":1,"153":2,"160":1}}],["yandex",{"2":{"136":1}}],["yaml",{"2":{"128":1,"129":1,"133":1}}],["yes",{"2":{"114":5,"153":1}}],["year",{"2":{"17":1,"18":1}}],["y",{"2":{"95":1,"151":1}}],["yours",{"2":{"24":1}}],["your",{"0":{"29":1,"37":1,"43":1},"2":{"1":1,"13":1,"18":1,"19":1,"22":1,"26":1,"29":1,"30":2,"32":1,"33":1,"35":1,"36":2,"38":3,"39":2,"40":1,"41":1,"42":2,"43":5,"49":1,"50":1,"54":1,"61":2,"63":1,"68":1,"70":1,"71":1,"72":1,"74":1,"78":1,"87":2,"91":1,"92":1,"101":1,"111":1,"116":1,"130":1,"134":1,"135":1,"136":2,"138":1,"140":1,"143":1,"147":1,"149":1,"151":1,"152":1,"157":1}}],["you",{"2":{"1":1,"18":5,"21":1,"24":1,"29":1,"38":1,"40":1,"41":2,"43":1,"47":2,"49":2,"57":1,"61":1,"62":1,"75":1,"78":2,"84":1,"88":1,"92":1,"105":1,"107":1,"109":1,"116":2,"117":1,"123":1,"124":1,"129":2,"133":1,"134":1,"138":1,"140":1,"149":1,"152":1,"153":1,"162":1}}],["20",{"2":{"120":1}}],["2026",{"2":{"17":1,"25":1}}],["23",{"2":{"120":1}}],["2",{"0":{"28":1,"34":1,"42":1,"67":1,"96":1,"103":1,"139":1},"2":{"155":1}}],["24",{"2":{"6":1,"22":1}}],["nginx",{"2":{"154":1}}],["null",{"2":{"124":1}}],["number",{"2":{"56":1,"104":1,"119":2}}],["npx",{"2":{"95":1}}],["navigation",{"0":{"86":1},"2":{"86":1}}],["navigate",{"2":{"46":1,"49":1,"51":1,"73":1,"111":1,"121":1,"138":1,"140":1}}],["named",{"2":{"156":1}}],["name",{"2":{"27":1,"33":1,"41":2,"46":2,"58":1,"97":1,"111":2,"112":1,"114":2,"119":2,"121":1,"124":1,"129":1,"131":1,"138":2,"144":1,"145":2}}],["natural",{"2":{"17":1,"119":1,"123":1,"126":1}}],["night",{"2":{"18":1}}],["now",{"2":{"116":1}}],["non",{"2":{"50":1}}],["node",{"2":{"18":1,"21":1}}],["notes",{"2":{"136":1}}],["notifications",{"2":{"79":1}}],["noticed",{"2":{"18":1}}],["not",{"2":{"17":1,"18":3,"21":1,"149":1,"152":1,"157":1}}],["no",{"2":{"13":1,"15":1,"22":1,"103":1,"114":2,"151":1}}],["necessary",{"2":{"160":1}}],["nerdctl",{"2":{"149":1}}],["next",{"0":{"116":1},"2":{"60":1,"115":2,"132":1}}],["needed",{"2":{"103":1}}],["need",{"2":{"21":1,"41":1,"43":1,"109":1,"138":1,"149":1}}],["news",{"2":{"119":2}}],["newbot",{"2":{"41":1}}],["new",{"2":{"18":1,"27":1,"43":1,"86":1,"102":1,"145":1,"158":1}}],["never",{"2":{"12":1}}],["networking",{"2":{"156":1}}],["network",{"2":{"1":1,"5":1,"22":1,"23":1,"96":1,"147":1,"156":1}}],["32",{"2":{"152":1}}],["31",{"2":{"120":1}}],["30",{"2":{"80":1,"120":2}}],["3",{"0":{"29":1,"35":1,"43":1,"68":1},"2":{"13":1,"104":1,"113":1,"154":1}}],["quality",{"2":{"49":1}}],["quarter",{"2":{"17":1}}],["quickly",{"2":{"67":1,"82":1,"86":1,"97":2}}],["quick",{"2":{"48":1}}],["quietly",{"2":{"18":1}}],["quot",{"2":{"44":2,"53":2,"77":2,"79":2,"83":4,"100":2,"102":2,"107":2,"108":2,"111":2,"119":4,"123":2,"126":2,"127":4,"133":2,"138":2,"144":2,"146":2,"153":2}}],["queries",{"2":{"106":1}}],["question",{"2":{"100":1,"141":1}}],["questions",{"2":{"17":2}}],["queued",{"2":{"12":1}}],["qdrant",{"2":{"6":1,"15":1,"100":1,"149":1,"154":5,"156":2,"160":1}}],["github",{"2":{"152":1}}],["git",{"2":{"150":1,"152":1,"158":1}}],["give",{"2":{"18":1,"23":1,"27":1}}],["global",{"2":{"136":1}}],["gpt",{"2":{"49":1,"113":1,"114":1}}],["guest",{"2":{"50":1}}],["guests",{"2":{"46":1}}],["guides",{"2":{"39":1,"64":1,"148":1}}],["guide",{"2":{"29":1,"36":2,"40":1,"41":1,"148":1}}],["g",{"2":{"39":1,"41":3,"49":1,"73":1,"86":1,"89":1,"90":1,"95":2,"96":1,"104":1,"111":2,"114":3,"119":3,"125":1,"138":2,"144":1,"160":1}}],["gt",{"2":{"29":1,"33":1,"34":1,"35":1,"36":1,"37":1,"43":1}}],["gateways",{"2":{"38":1}}],["gateway",{"2":{"28":1,"149":1,"154":1,"155":1}}],["good",{"2":{"57":1}}],["google",{"2":{"8":1,"9":1,"114":1,"135":1,"136":1}}],["go",{"2":{"27":2,"29":1,"30":1,"33":2,"34":1,"35":1,"36":2,"37":1,"42":1,"43":1,"49":1,"140":1}}],["got",{"2":{"18":1}}],["getting",{"2":{"148":1}}],["gets",{"2":{"23":1}}],["get",{"2":{"15":1,"17":1,"41":1}}],["general",{"0":{"39":1},"2":{"126":1,"143":1}}],["generation",{"2":{"50":1}}],["generating",{"2":{"50":1}}],["generative",{"2":{"9":1,"114":1}}],["generator",{"2":{"29":1}}],["generate",{"2":{"27":1,"36":1,"43":1,"50":1,"68":1,"151":1,"152":1}}],["generated",{"2":{"18":1,"29":1,"151":1}}],["generic",{"2":{"7":1,"71":1,"73":1,"126":1}}],["grounded",{"2":{"141":1}}],["group",{"2":{"4":1,"35":1,"46":1,"152":1,"157":1}}],["groups",{"2":{"3":1,"22":1,"32":1}}],["gracefully",{"2":{"55":1}}],["grade",{"2":{"19":1}}],["graphical",{"0":{"13":1},"2":{"22":1}}],["+",{"2":{"6":1,"7":1,"13":1,"23":1,"154":1}}],["v",{"2":{"156":1}}],["v2",{"2":{"150":1}}],["vs",{"0":{"126":1}}],["volume",{"2":{"73":1,"156":1}}],["volumes",{"2":{"55":1,"156":2,"160":1}}],["v1",{"2":{"36":1,"111":1}}],["validate",{"2":{"161":1}}],["value",{"2":{"17":1,"95":1}}],["var",{"2":{"152":1}}],["variable",{"2":{"159":1}}],["variables",{"0":{"159":1},"2":{"95":1}}],["various",{"2":{"22":1,"45":1,"61":1,"134":1}}],["versioning",{"2":{"57":1}}],["version",{"2":{"37":2,"158":1}}],["versioned",{"2":{"21":1}}],["verification",{"2":{"36":1}}],["vector",{"0":{"105":1},"1":{"106":1,"107":1},"2":{"6":1,"21":1,"49":1,"50":1,"100":1,"114":2,"154":1,"156":1}}],["video",{"2":{"114":1}}],["viewing",{"0":{"88":1,"121":1},"1":{"89":1,"90":1}}],["view",{"2":{"60":1,"82":1,"145":1,"157":2,"161":1}}],["visualizes",{"2":{"107":1}}],["visualization",{"0":{"105":1},"1":{"106":1,"107":1},"2":{"13":1}}],["visual",{"2":{"13":1,"90":1,"105":1}}],["via",{"0":{"123":1,"124":1},"2":{"1":1,"6":1,"8":1,"9":1,"10":1,"31":1,"32":1,"38":2,"39":1,"45":1,"53":1,"77":2,"95":1,"147":1,"149":1,"160":1}}],["vue",{"2":{"13":1,"154":1}}],["rule",{"2":{"118":1}}],["running",{"2":{"15":1,"48":1,"55":1,"56":2,"151":1,"152":1}}],["run",{"2":{"11":1,"20":1,"21":1,"22":1,"24":1,"95":1,"147":1,"149":1,"151":1,"152":1,"156":1,"162":1}}],["runtime",{"2":{"8":1,"21":1,"50":1,"56":1}}],["runs",{"2":{"5":1,"22":1,"119":1,"123":1,"147":1,"149":1,"154":2,"158":1,"162":1}}],["right",{"2":{"112":1,"139":1}}],["rich",{"2":{"8":1,"38":1}}],["rand",{"2":{"152":1}}],["range",{"2":{"9":1}}],["ratio",{"2":{"104":2}}],["raise",{"2":{"20":1}}],["ram",{"2":{"18":1}}],["rag",{"2":{"18":1,"19":1}}],["root",{"2":{"111":1,"152":1}}],["routine",{"2":{"83":1,"117":1,"126":1}}],["routing",{"2":{"67":1}}],["router",{"2":{"18":3,"21":2}}],["role",{"2":{"3":1,"144":1}}],["regular",{"2":{"160":1}}],["registry",{"2":{"153":2}}],["registered",{"2":{"50":1}}],["register",{"2":{"39":1,"123":1}}],["reverse",{"2":{"160":1}}],["rewriting",{"2":{"133":1}}],["retained",{"2":{"104":1}}],["retrieve",{"2":{"87":1,"108":1}}],["retrieved",{"2":{"22":1,"106":1,"107":1}}],["retrieval",{"2":{"6":2,"21":1}}],["redundant",{"2":{"104":1}}],["requires",{"2":{"141":1,"151":1}}],["required",{"2":{"13":1,"22":1,"28":1,"35":1,"66":1,"73":1,"114":1,"152":1,"162":1}}],["requested",{"2":{"98":1}}],["rename",{"2":{"87":2}}],["refresh",{"2":{"82":1,"86":1,"121":1}}],["reference",{"0":{"50":1,"120":1},"2":{"148":1}}],["relevant",{"2":{"99":1,"100":1,"106":1,"107":1}}],["release",{"2":{"37":2}}],["reload",{"2":{"86":1,"121":1}}],["relationships",{"2":{"60":1}}],["recent",{"2":{"106":1}}],["receiving",{"2":{"39":1}}],["receives",{"2":{"83":1,"125":1}}],["receive",{"2":{"35":1,"36":2,"70":1,"146":1}}],["recursive",{"2":{"87":1}}],["recurring",{"2":{"79":1,"117":1,"126":1}}],["recipient",{"2":{"76":1}}],["records",{"2":{"82":1}}],["recommended",{"0":{"151":1},"2":{"15":1,"136":1,"148":1,"149":1}}],["recognition",{"0":{"4":1}}],["remote",{"0":{"96":1},"2":{"96":2}}],["removing",{"2":{"67":1}}],["remove",{"2":{"51":1,"55":1,"60":1,"69":1,"82":1,"87":1,"103":1,"115":1,"132":1,"145":1}}],["remains",{"2":{"21":1}}],["remembers",{"2":{"49":1}}],["remember",{"2":{"4":1,"18":1,"23":1,"91":1,"99":1}}],["repository",{"2":{"151":1}}],["reports",{"2":{"77":1,"117":1}}],["represented",{"2":{"128":1}}],["represents",{"2":{"110":1}}],["reproducible",{"2":{"20":1}}],["replies",{"2":{"7":1,"44":2}}],["re",{"2":{"20":1}}],["resource",{"2":{"160":1}}],["resources",{"2":{"55":1,"98":1}}],["research",{"2":{"136":1,"143":1,"144":1}}],["reset",{"2":{"27":1,"59":1,"156":1}}],["restart",{"2":{"161":1}}],["restrict",{"2":{"160":1}}],["rest",{"2":{"124":1}}],["restoring",{"0":{"59":1}}],["restore",{"2":{"5":1,"57":1,"59":1}}],["results",{"2":{"118":1,"125":1,"141":2,"146":1}}],["result",{"2":{"81":1,"124":1}}],["response",{"2":{"81":1,"141":1}}],["responses",{"2":{"9":1,"40":1,"44":1,"50":1,"114":1}}],["respond",{"2":{"43":1,"77":1}}],["reached",{"2":{"125":1}}],["reactions",{"2":{"8":1}}],["reasoning",{"2":{"50":4,"98":1,"114":2}}],["realized",{"2":{"18":1}}],["reality",{"2":{"17":1}}],["real",{"0":{"135":1},"2":{"8":1,"13":1,"17":2,"18":4,"23":1,"56":1,"134":1,"141":1}}],["ready",{"2":{"37":1,"38":1}}],["read",{"2":{"5":1,"8":1,"28":1,"29":1,"75":1,"89":1,"91":1,"125":1}}],["rebuild",{"2":{"6":1}}],["url",{"2":{"29":2,"36":4,"46":1,"68":2,"96":1,"110":1,"111":2,"112":1,"138":1,"155":1}}],["uncomment",{"2":{"153":1}}],["uncomfortable",{"2":{"20":1}}],["unread",{"2":{"123":1,"124":2}}],["unlimited",{"2":{"119":1,"126":1}}],["unique",{"2":{"41":1,"56":1,"108":1}}],["unified",{"0":{"62":1},"2":{"7":1}}],["unifies",{"2":{"4":1}}],["understand",{"2":{"105":1}}],["understands",{"2":{"44":1}}],["under",{"2":{"19":1}}],["ui",{"2":{"13":1,"30":1,"42":1,"43":1,"88":1,"149":1,"154":1,"155":1}}],["usage",{"2":{"144":1,"145":1}}],["uses",{"2":{"120":1,"146":1}}],["useful",{"2":{"57":1,"79":1,"117":1}}],["used",{"2":{"49":3,"50":4,"56":1,"80":1,"108":1,"114":1}}],["use",{"0":{"133":1},"2":{"22":1,"23":1,"37":1,"50":1,"60":1,"77":1,"83":1,"87":1,"91":1,"97":1,"98":1,"109":1,"112":2,"126":2,"127":1,"129":2,"135":1,"139":1,"151":1,"153":1,"162":2}}],["username",{"2":{"41":2,"73":1}}],["users",{"2":{"4":2,"8":1,"21":1,"32":1,"46":1,"49":1,"50":1,"153":1}}],["user",{"0":{"4":1},"2":{"18":1,"23":1,"28":1,"77":1,"98":1,"100":1,"129":1,"141":1,"152":1,"157":1}}],["using",{"2":{"11":1,"45":1,"55":1,"61":1,"68":1,"117":1,"118":1,"124":1,"125":1}}],["upgrade",{"2":{"158":1}}],["upgrading",{"0":{"158":1}}],["upgradable",{"2":{"21":1}}],["upload",{"2":{"87":1}}],["update",{"2":{"69":2,"87":1,"112":1,"139":1,"145":1,"157":1}}],["up",{"2":{"3":1,"13":1,"22":1,"79":1,"143":1,"152":2,"153":1,"154":1,"157":2,"158":1,"161":1}}],["d",{"2":{"152":2,"153":1,"157":2,"158":1,"161":1}}],["dropdown",{"2":{"140":1}}],["dropdowns",{"2":{"49":1}}],["dynamic",{"2":{"66":1}}],["db",{"2":{"21":1,"152":2}}],["during",{"2":{"81":1,"83":2,"108":1,"133":1,"135":1}}],["duration",{"2":{"81":1}}],["durable",{"2":{"20":1,"21":1,"24":1}}],["duckduckgo",{"2":{"8":1,"136":1}}],["do",{"2":{"149":1}}],["domains",{"2":{"142":1}}],["domain",{"2":{"73":1}}],["download",{"2":{"87":1}}],["down",{"2":{"28":1,"55":1,"156":2,"157":1,"161":1}}],["don",{"2":{"18":2,"20":2}}],["doing",{"2":{"18":1}}],["doesn",{"2":{"18":1,"55":1}}],["does",{"2":{"17":1,"77":1,"119":1}}],["documented",{"2":{"129":1}}],["document",{"2":{"128":1}}],["documentation",{"0":{"147":1,"148":1},"1":{"148":1},"2":{"14":1}}],["docker",{"0":{"149":1},"1":{"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1},"2":{"15":2,"56":1,"148":1,"149":2,"150":2,"151":5,"152":5,"153":5,"154":1,"156":2,"157":7,"158":2,"160":1,"161":4}}],["decay",{"2":{"104":1}}],["decide",{"2":{"18":1}}],["delivered",{"2":{"125":1}}],["deliver",{"2":{"118":1}}],["delivery",{"2":{"73":1,"76":1}}],["delete",{"2":{"51":1,"55":2,"60":1,"69":1,"75":1,"87":1,"103":1,"112":2,"115":1,"132":1,"139":2,"145":1}}],["deleting",{"0":{"51":1,"132":1},"2":{"97":1}}],["delegate",{"2":{"8":1,"142":1}}],["dedicated",{"2":{"52":1,"84":1}}],["deep",{"2":{"50":1,"143":1}}],["deeply",{"2":{"6":1}}],["determine",{"2":{"104":1}}],["detection",{"2":{"6":1}}],["detail",{"0":{"47":1},"1":{"48":1},"2":{"42":1,"47":1,"49":1,"51":1,"54":1,"63":1,"74":1,"80":1,"84":1,"94":1,"101":1,"121":1,"130":1,"144":1}}],["detailed",{"2":{"39":1,"64":1,"81":1,"148":1}}],["details",{"2":{"37":1,"48":1}}],["desired",{"2":{"59":1}}],["designed",{"2":{"14":1,"136":1}}],["description",{"2":{"33":1,"50":1,"67":1,"80":1,"95":1,"96":1,"114":1,"119":2,"124":1,"129":1,"131":1,"144":2,"145":2,"154":1,"156":1,"159":1}}],["depth",{"2":{"152":1}}],["deployable",{"2":{"21":1}}],["depending",{"2":{"138":1}}],["dependable",{"2":{"20":1}}],["dependencies",{"2":{"15":1}}],["developer",{"2":{"27":1,"29":1,"34":1}}],["developers",{"2":{"14":1}}],["device",{"2":{"18":1,"21":1,"23":1}}],["density",{"2":{"18":2}}],["defines",{"2":{"119":1}}],["define",{"2":{"8":1,"49":1,"50":1,"127":1}}],["defaults",{"2":{"114":1,"151":2}}],["default",{"2":{"6":1,"22":1,"23":1,"80":1,"114":1,"155":1,"159":1,"160":1,"162":1}}],["danger",{"2":{"51":1}}],["data",{"0":{"156":1},"2":{"51":2,"55":1,"56":2,"79":1,"93":1,"95":1,"117":1,"151":3,"156":8,"160":1}}],["database",{"2":{"6":1,"22":1,"48":1,"100":1,"152":1,"154":4,"156":1,"158":1}}],["days",{"2":{"104":2}}],["day",{"2":{"20":1,"120":5,"123":1}}],["dark",{"2":{"13":1}}],["daily",{"2":{"3":1,"119":1,"123":1,"124":1}}],["dialog",{"2":{"131":1,"145":1}}],["digest",{"2":{"123":1,"124":1}}],["dimensions",{"2":{"114":1}}],["different",{"2":{"62":1,"80":1}}],["differs",{"2":{"23":1}}],["did",{"2":{"18":1}}],["directories",{"2":{"86":1,"87":1}}],["directory",{"2":{"85":1,"86":1,"95":1,"151":2}}],["directly",{"2":{"43":1,"68":1,"84":1,"90":1,"103":1,"153":1}}],["direct",{"2":{"4":1,"38":1}}],["distribution",{"0":{"107":1},"2":{"106":1}}],["distinguishes",{"2":{"113":1}}],["distinguish",{"2":{"4":1}}],["discover",{"2":{"98":1}}],["discord",{"0":{"26":1,"27":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1},"2":{"1":1,"4":1,"7":1,"26":1,"27":1,"29":1,"30":1,"31":1,"38":1,"62":1,"64":1,"148":1}}],["displays",{"2":{"56":1}}],["display",{"2":{"41":1,"46":1,"111":1,"114":1,"119":1}}],["disappears",{"2":{"18":1}}],["disabled",{"2":{"67":1,"125":1}}],["disable",{"2":{"8":1,"67":1,"69":1,"97":1}}],["ps",{"2":{"157":1}}],["pm",{"2":{"120":1}}],["png",{"2":{"90":1}}],["python3",{"2":{"95":1}}],["py",{"2":{"89":1}}],["picture",{"2":{"46":1}}],["pulled",{"2":{"155":1}}],["pull",{"2":{"151":1,"157":1,"158":2}}],["purpose",{"2":{"126":1,"144":1}}],["public",{"2":{"46":1,"50":1}}],["published",{"2":{"37":1}}],["publish",{"0":{"37":1}}],["push",{"2":{"23":1}}],["pencil",{"2":{"132":1}}],["people",{"2":{"20":1}}],["periodic",{"2":{"78":1,"79":1,"117":1,"126":2}}],["performance",{"2":{"136":1}}],["performing",{"2":{"105":1,"117":1}}],["performs",{"2":{"100":1}}],["perform",{"2":{"45":1,"55":1,"78":1,"83":1,"91":1,"98":1,"143":1}}],["persistence",{"0":{"156":1},"2":{"56":1}}],["persistent",{"2":{"45":1,"51":1,"55":1,"156":1}}],["personalized",{"2":{"99":1}}],["personality",{"2":{"8":1,"45":1,"127":1,"128":1}}],["personal",{"2":{"17":1,"18":1,"43":1,"46":1}}],["person",{"2":{"4":2}}],["permissions",{"0":{"35":1},"2":{"29":1,"35":3,"75":1,"77":1,"146":1}}],["permanently",{"2":{"24":1,"51":1,"69":1,"145":1}}],["per",{"2":{"9":1}}],["phones",{"2":{"18":1}}],["playground",{"2":{"23":1}}],["plane",{"2":{"21":1}}],["plainly",{"2":{"18":1}}],["platforms",{"0":{"64":1},"2":{"7":1,"22":1,"38":1,"40":1,"45":1,"61":1}}],["platform",{"0":{"7":1},"2":{"1":1,"4":1,"32":1,"33":1,"39":2,"64":1,"66":1,"67":2}}],["pattern",{"0":{"120":1},"2":{"119":1,"120":2,"121":1,"124":1}}],["path",{"2":{"86":1,"158":1,"159":1}}],["paths",{"2":{"56":2}}],["passwords",{"2":{"160":2,"162":1}}],["password=your",{"2":{"152":2}}],["password",{"2":{"73":1,"151":3,"152":7,"159":3}}],["paste",{"2":{"30":1,"36":1,"39":1,"42":1,"68":1}}],["past",{"2":{"17":1}}],["package",{"2":{"53":1}}],["parsed",{"2":{"128":1}}],["parent",{"2":{"60":1,"86":1}}],["parameters",{"2":{"50":1,"138":1}}],["part",{"2":{"18":1}}],["page",{"0":{"47":1},"1":{"48":1},"2":{"42":1,"46":1,"47":1,"49":2,"51":1,"54":1,"63":1,"72":1,"73":1,"74":1,"80":1,"84":1,"94":1,"101":1,"111":1,"114":1,"121":1,"130":1,"136":1,"138":1,"140":1,"144":1}}],["pairs",{"2":{"95":1}}],["paired",{"2":{"19":1}}],["paid",{"2":{"18":1}}],["points",{"0":{"155":1}}],["pool",{"2":{"104":1}}],["ports",{"2":{"160":1}}],["port",{"2":{"73":1}}],["portal",{"2":{"27":1,"29":1,"91":1}}],["portable",{"2":{"18":1,"20":1}}],["popular",{"0":{"64":1}}],["powerful",{"2":{"18":1,"70":1,"136":1}}],["powered",{"2":{"5":1,"136":1}}],["postgres",{"2":{"151":3,"152":3,"154":3,"156":1,"159":2,"160":1}}],["postgresql",{"2":{"15":1,"149":1,"154":1,"156":1,"159":1}}],["post",{"2":{"124":1}}],["position",{"2":{"18":1}}],["polite",{"2":{"18":1}}],["practices",{"2":{"129":1}}],["primarily",{"2":{"122":1}}],["primary",{"2":{"50":1}}],["privileged",{"2":{"28":1,"154":1,"162":1}}],["privileges",{"2":{"18":1}}],["private",{"2":{"20":1,"21":2,"32":1,"46":1,"53":1}}],["privately",{"2":{"3":1,"22":1}}],["privacy",{"2":{"17":1,"23":1,"136":2}}],["prefix",{"2":{"157":1}}],["prefer",{"2":{"14":1}}],["prerequisites",{"0":{"150":1}}],["precise",{"2":{"126":1}}],["preview",{"2":{"90":2}}],["previously",{"2":{"49":1}}],["preserve",{"2":{"55":1}}],["proxy",{"2":{"160":1}}],["project",{"2":{"152":1}}],["proceed",{"2":{"116":1}}],["process",{"0":{"95":1},"2":{"75":1,"81":1,"95":1,"98":1,"141":1}}],["processes",{"2":{"49":1}}],["programmatically",{"2":{"124":1}}],["programming",{"2":{"89":1}}],["progress",{"2":{"18":2}}],["providing",{"2":{"70":1,"99":1,"145":1}}],["provided",{"2":{"48":1,"67":1,"98":1,"102":1}}],["provides",{"2":{"48":1,"52":1,"76":1,"81":1,"85":1,"93":1}}],["provide",{"2":{"41":1,"58":1,"75":1,"83":1,"108":1,"141":2}}],["provider",{"0":{"9":1,"72":1,"73":1,"109":1,"110":1,"111":1,"138":1,"140":1},"1":{"73":1,"110":1,"111":2,"112":2,"113":1,"114":1,"115":1,"116":1},"2":{"22":1,"50":1,"71":2,"72":1,"73":3,"75":1,"109":1,"110":1,"111":2,"112":3,"113":1,"114":2,"135":1,"136":1,"138":2,"139":3,"140":2,"141":1}}],["providers",{"0":{"70":1,"112":1,"134":1,"139":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1},"2":{"7":1,"8":1,"9":1,"13":1,"38":1,"92":1,"136":1}}],["profile",{"2":{"46":1}}],["production",{"0":{"160":1},"2":{"162":2}}],["product",{"2":{"24":1}}],["prompts",{"2":{"41":1,"79":1,"151":1}}],["prompt",{"2":{"12":1,"83":1,"100":1,"126":1,"133":1,"151":1,"153":1}}],["protocol",{"0":{"10":1},"2":{"10":1,"92":1,"114":1}}],["hub",{"2":{"62":1,"153":1}}],["human",{"2":{"18":1}}],["humans",{"2":{"3":1,"22":1}}],["helping",{"2":{"107":1}}],["help",{"2":{"105":1}}],["helps",{"2":{"104":1,"133":1}}],["held",{"2":{"23":1}}],["headers",{"2":{"96":2}}],["heartbeat",{"0":{"78":1,"126":1},"1":{"79":1,"80":1,"81":1,"82":1,"83":1},"2":{"78":1,"79":1,"80":5,"81":4,"82":1,"83":3,"126":2}}],["healthy",{"2":{"154":1}}],["health",{"2":{"48":2}}],["highly",{"2":{"136":1}}],["highlighting",{"2":{"89":1}}],["high",{"2":{"49":1,"50":1,"73":1}}],["history",{"0":{"76":1},"2":{"19":1,"29":1,"50":1,"82":1,"102":1,"144":1,"145":1}}],["hide",{"2":{"18":1}}],["hour",{"2":{"120":1}}],["hours",{"2":{"6":1,"22":1}}],["how",{"0":{"21":1,"133":1},"2":{"49":1,"64":1,"67":1,"80":1,"81":1,"104":1,"105":1,"107":1,"127":1}}],["home",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"18":2,"19":1,"23":1,"24":1}}],["hosted",{"2":{"110":1,"136":1}}],["host",{"2":{"15":1,"52":1,"56":1,"73":1,"149":1}}],["https",{"2":{"111":1,"151":2,"152":1,"160":1,"162":1}}],["http",{"0":{"96":1},"2":{"10":1,"96":2,"155":3}}],["hybrid",{"2":{"6":1,"23":1}}],["handles",{"2":{"77":1,"143":1,"153":1}}],["half",{"2":{"18":1}}],["happening",{"2":{"18":1}}],["hardware",{"2":{"17":1,"18":1}}],["have",{"2":{"10":1,"23":1,"55":1,"93":1,"116":1}}],["having",{"2":{"1":1,"22":1}}],["has",{"2":{"1":1,"18":1,"84":1,"119":1,"123":1}}],["blocks",{"2":{"44":1}}],["blogs",{"0":{"25":1},"2":{"25":1}}],["best",{"2":{"129":1}}],["belongs",{"2":{"113":1}}],["belief",{"2":{"23":1}}],["before",{"2":{"50":1,"152":1,"162":1}}],["behave",{"2":{"127":1}}],["behaviors",{"2":{"133":1}}],["behavior",{"2":{"50":1}}],["behind",{"2":{"18":1}}],["bet",{"2":{"24":1}}],["between",{"2":{"9":1,"18":1,"67":1,"86":1,"96":1,"113":1}}],["be",{"2":{"22":1,"23":1,"49":1,"51":1,"75":1,"80":1,"125":1,"141":1}}],["become",{"2":{"104":1}}],["becomes",{"2":{"18":1,"20":1,"135":1}}],["because",{"2":{"18":1}}],["being",{"2":{"18":1}}],["bashcd",{"2":{"158":1}}],["bashcurl",{"2":{"151":2}}],["bashdocker",{"2":{"156":1,"157":1,"161":1}}],["bashsudo",{"2":{"152":2,"153":1}}],["bashgit",{"2":{"152":1}}],["basic",{"2":{"33":1,"46":1,"131":1}}],["base64",{"2":{"152":1}}],["base",{"2":{"18":1,"19":2,"56":1,"110":1,"111":1,"138":1}}],["based",{"0":{"118":1},"2":{"3":1,"66":1,"77":1}}],["battery",{"2":{"18":1}}],["backups",{"2":{"160":2}}],["backend",{"2":{"154":1}}],["background",{"2":{"56":1}}],["back",{"2":{"18":1,"44":1,"87":1}}],["bocha",{"2":{"136":1}}],["bound",{"2":{"118":1}}],["boundaries",{"2":{"21":1,"23":1}}],["boundary",{"2":{"17":1}}],["bold",{"2":{"44":1}}],["bottom",{"2":{"49":1,"51":1,"111":1}}],["botfather",{"2":{"39":1,"41":2}}],["both",{"2":{"23":1,"126":1}}],["bot",{"0":{"3":1,"28":1,"29":1,"34":1,"41":1,"45":1,"46":1,"47":1,"49":1,"51":1,"52":1,"61":1,"71":1,"74":1,"77":1,"78":1,"83":1,"84":1,"91":1,"93":1,"98":1,"99":1,"108":1,"123":1,"127":1,"140":1,"141":1,"142":1,"146":1},"1":{"46":1,"47":1,"48":2,"49":1,"50":1,"51":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"75":1,"79":1,"80":1,"81":1,"82":1,"83":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"143":1,"144":1,"145":1,"146":1},"2":{"1":1,"3":1,"5":1,"8":1,"9":1,"10":1,"12":1,"13":1,"14":1,"22":3,"23":1,"26":1,"27":2,"28":1,"29":2,"30":2,"34":2,"36":2,"37":1,"39":3,"40":1,"41":7,"42":1,"43":4,"44":4,"45":1,"46":2,"47":1,"48":1,"49":4,"50":3,"51":4,"52":2,"53":2,"54":2,"55":1,"56":1,"57":2,"61":1,"62":1,"63":2,"67":1,"70":1,"71":2,"74":2,"75":5,"76":1,"77":2,"78":1,"79":1,"80":1,"81":2,"83":3,"84":2,"86":1,"87":2,"88":1,"89":1,"91":2,"92":1,"93":1,"94":1,"98":1,"100":1,"101":2,"102":1,"107":1,"108":2,"116":1,"117":1,"118":2,"121":2,"123":3,"124":1,"127":2,"128":1,"130":2,"132":1,"133":2,"134":1,"135":1,"140":1,"141":2,"142":1,"143":2,"144":2,"146":3,"147":1,"156":1}}],["bots",{"0":{"133":1},"2":{"1":1,"3":4,"4":1,"5":1,"8":2,"13":1,"22":6,"29":1,"32":1,"38":2,"45":1,"46":1,"50":1,"52":1,"64":1,"93":1,"99":1,"124":1,"140":1,"147":1,"148":1}}],["bun",{"2":{"154":1}}],["bucket",{"0":{"106":1}}],["business",{"2":{"38":1}}],["button",{"2":{"46":1,"60":1,"97":1,"111":1,"112":1,"139":1}}],["but",{"2":{"17":2,"18":1,"20":1,"55":1,"146":1}}],["built",{"2":{"7":1,"8":1,"10":1,"23":1,"24":1,"38":1,"89":1}}],["buildkit",{"2":{"149":1}}],["building",{"2":{"18":1,"146":1}}],["buildable",{"2":{"17":1}}],["build",{"2":{"3":1,"18":1,"23":1}}],["breadcrumb",{"2":{"86":1}}],["breaks",{"2":{"17":1}}],["bridges",{"2":{"62":1}}],["brief",{"2":{"20":1,"119":1,"144":1}}],["browse",{"2":{"134":1}}],["browser",{"2":{"13":1,"29":1}}],["browsing",{"0":{"86":1},"2":{"50":1,"85":1}}],["brave",{"2":{"8":1,"135":1,"136":1,"138":1}}],["brain",{"0":{"49":1},"2":{"1":1}}],["bind",{"0":{"43":1},"2":{"43":3}}],["bindings",{"0":{"70":1,"74":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":2,"76":1,"77":1}}],["binding",{"0":{"75":1},"2":{"4":1,"71":1,"75":1}}],["bing",{"2":{"8":1,"135":1,"136":1}}],["bm25",{"2":{"6":1}}],["by",{"2":{"5":1,"6":1,"22":2,"23":1,"35":1,"38":1,"64":1,"67":1,"76":1,"82":1,"86":1,"97":1,"98":3,"103":1,"114":1,"142":1,"145":1,"148":1}}],["f",{"2":{"153":2,"157":1}}],["fssl",{"2":{"151":2}}],["flexible",{"2":{"126":1}}],["flexibly",{"2":{"9":1}}],["flow",{"0":{"39":1,"65":1,"125":1,"137":1},"1":{"66":1,"67":1,"68":1,"138":1,"139":1}}],["function",{"0":{"107":1}}],["furthermore",{"2":{"24":1}}],["fully",{"2":{"20":2,"92":1,"156":1}}],["full",{"2":{"7":3,"10":1,"31":1,"161":1}}],["fixed",{"2":{"126":1}}],["fixes",{"2":{"18":1}}],["five",{"2":{"120":1}}],["firewall",{"2":{"160":1}}],["fired",{"2":{"119":1}}],["fires",{"2":{"118":1,"125":1}}],["first",{"2":{"18":1,"19":1,"23":2,"109":1,"120":1,"154":1,"155":1}}],["finally",{"2":{"154":1}}],["fine",{"2":{"107":1}}],["find",{"2":{"49":1,"59":1,"82":1,"97":1,"100":1,"140":1}}],["finished",{"2":{"18":1}}],["fields",{"0":{"67":1,"119":1,"144":1},"2":{"66":1,"73":1,"111":1,"114":1,"120":1}}],["field",{"2":{"36":1,"42":1,"50":1,"67":1,"80":1,"95":1,"96":1,"114":1,"119":1,"120":1,"144":1}}],["filter",{"2":{"82":1,"103":1}}],["file`",{"2":{"129":1}}],["fileviewer",{"2":{"88":1}}],["filemanager",{"2":{"85":1}}],["file",{"2":{"55":1,"85":1,"86":1,"87":2,"89":2,"90":2,"97":2,"114":1,"125":1,"151":1,"152":2,"159":1}}],["filesystem",{"2":{"5":1,"13":1,"52":1,"79":1,"84":2,"89":1,"95":1}}],["files",{"0":{"84":1,"87":1,"89":1,"91":1},"1":{"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1},"2":{"1":1,"5":1,"8":2,"21":1,"22":1,"23":1,"29":1,"31":1,"44":2,"51":1,"53":1,"84":1,"86":1,"87":2,"88":1,"91":2,"128":1,"147":1,"156":1}}],["fill",{"2":{"36":1,"37":1,"46":1,"66":1,"73":1,"97":1,"111":1,"131":1,"138":1}}],["focus",{"2":{"142":1}}],["focused",{"2":{"38":1,"136":1}}],["folders",{"2":{"87":1}}],["folder",{"2":{"86":1,"87":1}}],["follow",{"2":{"41":1,"48":1,"129":1}}],["following",{"2":{"35":1,"38":1,"111":1,"114":1,"138":1,"154":1}}],["four",{"2":{"9":1}}],["forward",{"2":{"23":1}}],["forcing",{"2":{"18":1}}],["formats",{"2":{"89":1}}],["formatting",{"2":{"40":1}}],["form",{"2":{"17":1,"18":1,"49":1,"112":2,"139":2}}],["for",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"3":1,"5":1,"7":1,"8":1,"9":1,"10":1,"13":1,"14":2,"18":2,"20":1,"21":1,"22":1,"24":1,"28":1,"31":1,"35":2,"37":1,"38":3,"39":1,"41":2,"44":1,"46":1,"49":3,"50":6,"51":1,"56":2,"57":1,"58":1,"62":1,"64":2,"70":1,"73":2,"77":1,"78":1,"79":1,"87":1,"93":1,"95":2,"96":1,"106":1,"108":2,"111":2,"113":2,"114":3,"117":1,"119":3,"121":1,"126":2,"134":1,"136":2,"138":2,"143":1,"144":1,"146":1,"148":1,"151":2,"153":1,"154":2,"156":1,"160":1,"162":1}}],["friendly",{"2":{"114":1,"138":1}}],["frontmatter",{"2":{"128":1,"132":1,"133":1}}],["frontier",{"2":{"21":1,"24":1}}],["from",{"2":{"6":1,"12":1,"18":1,"39":1,"44":1,"46":1,"54":1,"63":1,"66":1,"71":1,"72":1,"73":1,"74":1,"80":2,"84":1,"87":2,"94":1,"97":1,"101":1,"102":2,"111":1,"112":1,"114":1,"130":1,"132":1,"136":1,"138":1,"139":1,"144":2,"146":1,"151":1}}],["freely",{"2":{"5":1,"22":1}}],["fail",{"2":{"152":1}}],["failed",{"2":{"81":1}}],["favorite",{"2":{"38":1,"61":1}}],["faster",{"2":{"23":1}}],["fast",{"2":{"18":1}}],["factor",{"2":{"17":1}}],["facts",{"2":{"6":1,"49":1}}],["familiar",{"2":{"17":1,"85":1}}],["family",{"2":{"3":1}}],["featuring",{"2":{"40":1}}],["feature",{"2":{"38":1,"78":1,"104":1,"126":1}}],["features",{"0":{"2":1,"22":1,"31":1,"44":1},"1":{"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"126":1,"148":1}}],["fetch",{"2":{"39":1}}],["feb",{"2":{"25":1}}],["feed",{"2":{"20":1}}],["feels",{"2":{"24":1}}],["feeling",{"2":{"18":1}}],["feel",{"2":{"17":1,"18":2}}],["feishu",{"0":{"32":1,"33":1,"68":1},"1":{"33":1,"34":1,"35":1,"36":1,"37":1},"2":{"1":1,"7":1,"22":1,"32":1,"33":1,"34":1,"36":3,"37":1,"38":1,"64":1,"68":3,"147":1,"148":1}}],["icon",{"2":{"115":2,"132":2}}],["irreversible",{"2":{"51":1}}],["identifier",{"2":{"56":1,"87":1,"114":1,"144":1}}],["identity",{"0":{"4":1,"43":1},"2":{"4":1,"8":1,"43":2}}],["ids",{"2":{"39":1}}],["id",{"2":{"33":1,"36":1,"56":1,"97":1,"103":1,"114":2,"124":1}}],["import",{"2":{"97":2}}],["important",{"2":{"49":1,"152":1}}],["impact",{"2":{"24":1}}],["immediately",{"2":{"69":1}}],["immediate",{"2":{"38":1}}],["image",{"2":{"55":1,"56":2,"90":1,"114":1,"154":1,"156":1}}],["images",{"0":{"90":1},"2":{"31":1,"44":1,"151":1,"155":1,"157":1}}],["imap",{"2":{"38":1}}],["im",{"2":{"35":2,"36":1}}],["if",{"2":{"18":1,"24":1,"31":1,"35":1,"43":1,"48":1,"50":2,"55":1,"68":1,"75":3,"114":1,"125":1,"152":1,"157":1,"161":1}}],["i",{"2":{"18":7}}],["i18n",{"2":{"13":1}}],["inherit",{"2":{"146":1}}],["injected",{"2":{"133":1}}],["input",{"2":{"95":1,"114":1}}],["inquiries",{"2":{"77":1}}],["incremented",{"2":{"125":1}}],["incoming",{"2":{"75":1,"77":1}}],["include",{"2":{"98":1}}],["includes",{"2":{"15":1,"100":1,"105":1,"149":1}}],["including",{"2":{"9":1,"51":1,"121":1}}],["involves",{"2":{"71":1}}],["invite",{"0":{"29":1}}],["initialize",{"2":{"55":1,"155":1}}],["info",{"2":{"33":1,"46":1}}],["information",{"0":{"56":1},"2":{"8":1,"18":1,"35":1,"49":1,"99":1,"104":1,"107":1,"134":1,"141":1}}],["inference",{"2":{"21":1,"23":1,"24":1}}],["infrastructure",{"2":{"18":1,"20":1,"23":1,"24":1}}],["inflate",{"2":{"18":1}}],["integrated",{"2":{"85":1,"88":1}}],["integrating",{"2":{"32":1}}],["integration",{"2":{"31":1,"38":3}}],["intent",{"2":{"28":1}}],["intents",{"2":{"28":1}}],["intelligence",{"2":{"18":1}}],["internal",{"2":{"114":1}}],["internet",{"2":{"18":1}}],["intervention",{"2":{"117":1}}],["intervene",{"2":{"91":1}}],["interval",{"2":{"79":1,"80":1,"126":1}}],["interactions",{"2":{"99":1}}],["interaction",{"0":{"77":1,"83":1,"91":1,"98":1,"108":1,"141":1,"146":1},"2":{"108":1}}],["interact",{"2":{"26":1,"32":1,"38":1,"50":1,"61":1,"88":1}}],["interface",{"2":{"7":1,"22":1,"38":1,"82":1}}],["interfering",{"2":{"5":1}}],["into",{"2":{"17":1,"18":1,"36":1,"42":1,"49":2,"68":1,"87":1,"102":1,"123":1,"128":1,"133":1,"152":1}}],["introduction",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"25":1}}],["inspect",{"2":{"145":1}}],["instruction",{"2":{"119":1,"126":1}}],["instance",{"2":{"55":1,"56":1,"113":1}}],["install",{"0":{"151":1,"152":1},"1":{"153":1},"2":{"53":1,"149":1,"151":2,"153":1}}],["installation",{"0":{"15":1,"149":1},"1":{"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1},"2":{"148":2}}],["instinct",{"2":{"18":1}}],["inside",{"2":{"8":1,"84":1,"149":1,"156":1}}],["inbox",{"0":{"12":1},"2":{"12":1,"75":1}}],["inbound",{"2":{"7":1,"36":1,"68":1}}],["indexing",{"2":{"21":1,"23":1}}],["index",{"2":{"21":1}}],["independent",{"2":{"1":1,"8":1,"10":1,"45":1,"93":1,"142":1,"145":1}}],["individual",{"2":{"4":1}}],["in",{"2":{"3":1,"4":1,"5":1,"7":1,"8":1,"10":1,"12":1,"18":1,"20":1,"22":3,"23":1,"24":1,"27":1,"29":1,"30":1,"32":1,"33":2,"34":1,"36":3,"37":2,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"46":2,"49":2,"51":1,"52":1,"54":1,"55":1,"56":1,"58":1,"59":1,"63":1,"66":1,"68":1,"72":1,"73":1,"74":1,"77":2,"80":2,"84":1,"89":2,"90":1,"91":1,"94":1,"97":1,"98":1,"100":2,"101":1,"102":1,"103":1,"108":1,"111":1,"112":1,"114":1,"115":1,"122":1,"123":1,"130":1,"131":2,"136":1,"138":1,"139":2,"144":1,"147":1,"152":2,"153":2,"155":1,"156":1,"157":1,"159":1,"160":1,"162":2}}],["italic",{"2":{"44":1}}],["iterate",{"2":{"23":1}}],["itself",{"2":{"91":1,"123":1}}],["its",{"2":{"1":2,"5":1,"10":1,"22":1,"45":1,"47":2,"49":1,"50":1,"51":1,"52":1,"67":1,"75":1,"77":1,"79":1,"83":2,"84":2,"87":1,"91":2,"93":1,"98":1,"108":1,"112":1,"118":1,"125":1,"132":1,"139":1,"141":1,"145":1,"147":1}}],["it",{"2":{"1":1,"18":9,"23":2,"24":1,"26":1,"27":2,"29":2,"43":1,"48":1,"53":1,"55":1,"56":1,"57":1,"60":1,"61":1,"62":1,"68":1,"77":2,"78":2,"83":1,"89":1,"110":1,"115":1,"118":2,"119":1,"127":1,"134":1,"135":1,"143":1,"152":1}}],["issue",{"2":{"81":1}}],["isolated",{"0":{"53":1},"2":{"5":1,"21":1,"22":1,"23":1,"45":1,"52":1,"84":1,"147":1}}],["isolation",{"0":{"5":1},"2":{"52":1}}],["is",{"0":{"1":1},"2":{"1":1,"17":1,"18":3,"19":1,"21":2,"22":2,"24":2,"37":1,"40":1,"43":2,"45":1,"49":1,"51":1,"57":1,"58":1,"79":2,"80":1,"91":1,"98":1,"104":1,"105":1,"108":1,"113":1,"117":1,"118":1,"119":1,"125":3,"128":1,"135":1,"143":1,"147":1,"148":1,"149":1,"152":2,"156":1,"157":1}}],["elysia",{"2":{"154":1}}],["else",{"2":{"18":1,"20":1}}],["effort",{"2":{"50":2}}],["errors",{"2":{"82":1}}],["error",{"2":{"48":1,"81":1}}],["e",{"2":{"39":1,"41":3,"49":1,"73":1,"86":1,"89":1,"90":1,"95":2,"96":1,"104":1,"111":2,"114":3,"119":3,"125":1,"138":2,"144":1,"160":1}}],["edge",{"2":{"23":1}}],["editor",{"2":{"85":1,"89":1,"131":1}}],["editing",{"0":{"88":1,"132":1},"1":{"89":1,"90":1},"2":{"55":1}}],["edit",{"2":{"1":1,"8":1,"22":1,"89":1,"103":1,"112":1,"115":2,"132":1,"139":1,"145":1,"147":1,"152":1}}],["easily",{"2":{"133":1}}],["easy",{"2":{"22":1}}],["each",{"2":{"3":1,"4":1,"5":2,"6":1,"10":1,"22":3,"23":1,"39":1,"64":1,"93":1,"108":1,"126":1,"147":1}}],["even",{"2":{"78":1}}],["event",{"2":{"36":1,"68":1}}],["events",{"0":{"36":1},"2":{"36":1,"96":1}}],["eventually",{"2":{"18":1}}],["everything",{"2":{"21":1,"24":1,"149":1}}],["every",{"2":{"1":1,"17":1,"18":1,"20":1,"22":1,"52":1,"81":1,"84":1,"108":1,"120":5,"123":1,"124":1,"158":1}}],["evolves",{"2":{"18":1}}],["economics",{"2":{"18":1}}],["embedded",{"2":{"149":1,"154":1,"162":1}}],["embeddings",{"2":{"49":1,"50":1}}],["embedding",{"2":{"9":1,"49":2,"50":1,"113":2,"114":2}}],["embed",{"2":{"29":1,"114":1}}],["empty",{"2":{"18":1,"119":1}}],["emails",{"2":{"70":1,"75":2,"76":1,"77":1,"123":1,"124":2}}],["email",{"0":{"70":1,"71":1,"72":1,"74":1},"1":{"71":1,"72":1,"73":2,"74":1,"75":2,"76":1,"77":1},"2":{"1":1,"7":1,"38":2,"71":5,"72":2,"73":3,"74":2,"75":3,"76":5,"77":3}}],["endpoint",{"2":{"96":1}}],["ending",{"2":{"41":1}}],["envpostgres",{"2":{"152":1}}],["env",{"2":{"95":1,"151":1,"152":2}}],["environments",{"2":{"162":1}}],["environment",{"0":{"159":1},"2":{"23":1,"52":1,"54":1,"57":1,"95":1}}],["encountered",{"2":{"81":1}}],["enabling",{"2":{"62":1,"78":1,"134":1}}],["enables",{"2":{"129":1}}],["enabled",{"2":{"50":2,"75":3,"80":1,"119":1,"121":1,"124":1}}],["enable",{"0":{"34":1},"2":{"8":1,"28":1,"30":1,"34":1,"35":1,"39":1,"42":1,"50":1,"67":1,"69":2,"97":1,"114":1}}],["ensure",{"2":{"58":1}}],["ensures",{"2":{"52":1}}],["engines",{"0":{"136":1},"2":{"134":1,"136":2}}],["engine",{"2":{"50":1,"138":2}}],["engineered",{"2":{"6":1}}],["engineering",{"0":{"6":1},"2":{"22":1}}],["entity",{"2":{"145":1}}],["entities",{"2":{"142":1}}],["entire",{"2":{"47":1,"133":1}}],["entries",{"2":{"82":1,"103":1}}],["enterprise",{"2":{"32":1,"38":1}}],["enter",{"2":{"17":1,"33":1,"102":1}}],["enough",{"2":{"18":1}}],["exits",{"2":{"154":1}}],["existing",{"2":{"60":1,"103":1,"145":1}}],["exist",{"2":{"55":1}}],["exa",{"2":{"136":1}}],["example",{"0":{"129":1}}],["examples",{"2":{"120":1}}],["exact",{"2":{"114":1}}],["expression",{"2":{"119":1,"123":1,"126":1}}],["expressions",{"2":{"11":1,"22":1,"117":1}}],["explanation",{"2":{"119":1,"144":1}}],["explicit",{"2":{"21":1,"23":1}}],["exposed",{"2":{"98":1}}],["export",{"2":{"97":2}}],["expensive",{"2":{"20":1}}],["experienced",{"2":{"23":1}}],["experience",{"2":{"17":1,"85":1}}],["executable",{"2":{"95":1}}],["executing",{"2":{"55":1}}],["executions",{"2":{"119":1}}],["execution",{"0":{"125":1},"2":{"11":1,"21":1,"81":1,"121":1,"126":1,"143":1,"154":1}}],["executes",{"2":{"95":1,"118":1,"125":1}}],["execute",{"2":{"1":1,"5":1,"8":1,"22":1,"52":1,"53":1,"79":1,"80":1}}],["extending",{"0":{"93":1}}],["external",{"2":{"10":1,"39":1,"92":1,"93":1,"117":1,"134":1}}],["extract",{"2":{"102":1}}],["extracting",{"2":{"49":1,"108":1}}],["extracts",{"2":{"6":1}}],["extra",{"2":{"15":1}}],["older",{"2":{"82":1,"104":1}}],["old",{"2":{"82":1}}],["ok",{"2":{"81":1}}],["okay",{"2":{"18":1}}],["o1",{"2":{"50":1,"114":1}}],["optimize",{"2":{"104":1}}],["optionally",{"2":{"104":1}}],["optional",{"0":{"43":1},"2":{"119":1,"126":1}}],["opt",{"2":{"95":1,"156":1}}],["operates",{"2":{"52":1}}],["operate",{"2":{"24":1,"146":1}}],["operations",{"0":{"54":1,"69":1,"85":1,"97":1,"101":1,"145":1},"1":{"55":1,"86":1,"87":1,"102":1,"103":1},"2":{"8":1,"10":1,"55":1,"91":1}}],["openssl",{"2":{"152":1}}],["open",{"2":{"24":1,"29":1,"32":1,"33":1,"41":1,"43":1,"89":1,"131":1,"145":1}}],["openclaw",{"0":{"23":1},"2":{"23":1}}],["openai",{"2":{"9":2,"50":1,"110":1,"111":2,"114":3}}],["obtain",{"2":{"39":1}}],["oauth2",{"2":{"29":1}}],["oem",{"2":{"18":1}}],["os",{"2":{"18":1}}],["occasional",{"2":{"18":1}}],["output",{"2":{"95":1}}],["outbox",{"0":{"76":1},"2":{"76":1,"77":1}}],["outbound",{"2":{"7":1}}],["outgoing",{"2":{"75":1,"77":1}}],["outside",{"2":{"38":1}}],["out",{"2":{"18":1}}],["our",{"2":{"17":1,"18":1}}],["override",{"2":{"160":1}}],["overlay",{"2":{"153":1}}],["over",{"2":{"17":1,"96":1,"104":1}}],["overview",{"0":{"17":1,"38":1,"48":1},"1":{"39":1},"2":{"48":1}}],["only",{"2":{"50":1,"104":1,"162":1}}],["online",{"2":{"24":1}}],["once",{"2":{"37":1,"47":1,"98":1,"135":1,"154":1}}],["on",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"15":1,"17":2,"18":1,"20":1,"21":1,"24":2,"39":2,"41":1,"43":1,"47":1,"62":1,"64":1,"66":1,"77":1,"80":1,"87":1,"95":1,"112":1,"114":1,"119":1,"138":1,"139":1,"142":1,"144":1,"149":1,"152":1,"157":1,"158":1}}],["one",{"0":{"151":1},"2":{"15":1,"24":1,"40":1,"109":2,"154":1}}],["often",{"2":{"80":1}}],["official",{"2":{"29":1,"36":1,"41":2,"151":1}}],["off",{"2":{"18":1,"80":1}}],["of",{"2":{"6":1,"8":1,"9":1,"17":2,"18":3,"22":1,"40":1,"48":1,"49":1,"50":1,"54":1,"56":1,"57":1,"60":1,"76":2,"81":2,"83":2,"93":1,"95":2,"96":2,"104":1,"106":1,"107":1,"111":2,"119":3,"120":3,"123":1,"127":1,"144":2,"145":1,"160":1}}],["other",{"2":{"3":1,"5":1,"12":1,"13":1,"22":1,"52":1,"126":1,"136":1,"138":1}}],["order",{"2":{"154":1}}],["orchestrated",{"2":{"149":1}}],["oriented",{"2":{"126":1}}],["organization",{"2":{"35":1}}],["or",{"2":{"1":1,"3":3,"8":1,"15":1,"22":2,"32":1,"39":1,"44":1,"46":1,"48":1,"52":2,"55":1,"56":1,"58":1,"67":2,"71":1,"77":1,"79":1,"80":1,"81":2,"82":1,"83":1,"87":2,"91":1,"96":1,"97":2,"103":1,"110":1,"112":1,"113":1,"114":1,"117":1,"132":1,"133":1,"135":1,"142":1,"143":1,"145":1,"147":1,"149":1,"152":1,"160":1}}],["ownership",{"2":{"3":1}}],["owner",{"2":{"3":1,"46":1,"108":1}}],["own",{"2":{"1":3,"5":1,"10":1,"13":1,"22":3,"45":1,"52":1,"75":1,"84":1,"91":1,"93":1,"136":1,"142":1,"146":1,"147":2}}],["leave",{"2":{"119":1}}],["leaving",{"2":{"88":1}}],["least",{"2":{"109":2}}],["level",{"2":{"50":1}}],["left",{"2":{"27":1,"33":1}}],["less",{"2":{"24":1}}],["ll",{"2":{"18":1}}],["llms",{"2":{"18":1}}],["llm",{"0":{"9":1,"109":1,"110":1},"1":{"110":1,"111":2,"112":2,"113":1,"114":1,"115":1,"116":1},"2":{"9":1,"23":1,"49":1,"50":2,"80":1,"109":1,"110":1}}],["list",{"2":{"59":1,"60":1,"66":1,"86":1,"95":1,"103":1,"112":1,"114":2,"115":1,"121":2,"144":1}}],["limit",{"2":{"50":2,"119":1,"126":1}}],["limits",{"2":{"11":1,"160":2}}],["linux",{"2":{"157":1}}],["link",{"2":{"71":1}}],["linked",{"2":{"43":1}}],["links",{"2":{"29":1,"44":1,"148":1}}],["line",{"2":{"7":1,"14":1,"76":1,"95":1,"153":1}}],["lifecycle",{"0":{"55":1},"2":{"47":1,"54":1}}],["life",{"2":{"18":1}}],["live",{"2":{"18":1}}],["lighter",{"2":{"23":1}}],["light",{"2":{"13":1}}],["like",{"2":{"1":1,"18":1,"21":1,"22":1,"24":2,"36":1,"50":1,"55":1,"71":1,"110":1,"113":1,"135":1,"143":1}}],["lost",{"2":{"51":1}}],["login",{"2":{"155":1}}],["logs",{"0":{"81":1,"82":1},"1":{"82":1},"2":{"82":1,"83":1,"157":4,"161":3}}],["log",{"2":{"33":1,"76":1,"81":1,"82":1}}],["loading",{"2":{"50":1}}],["load",{"2":{"50":1,"82":2}}],["loaded",{"2":{"22":1,"50":1}}],["loads",{"2":{"6":1}}],["localhost",{"2":{"155":3}}],["local",{"0":{"95":1},"2":{"19":1,"20":1,"21":1,"23":1,"24":1,"87":2,"95":1}}],["looked",{"2":{"18":1}}],["low",{"2":{"18":1,"50":1}}],["longer",{"2":{"18":1,"103":1}}],["long",{"2":{"1":1,"17":1,"20":1,"24":1,"49":1,"81":1,"99":1,"108":1,"147":1}}],["launch",{"2":{"55":1}}],["later",{"2":{"57":1}}],["latest",{"2":{"25":1,"82":1,"86":1,"154":5,"157":1,"158":1}}],["late",{"2":{"18":1}}],["latency",{"2":{"17":1}}],["languages",{"2":{"89":1}}],["language",{"2":{"6":1,"50":2,"119":1,"123":1,"126":1}}],["last",{"2":{"6":1,"22":1}}],["layer",{"2":{"6":1,"18":1,"19":1}}],["lark",{"0":{"32":1},"1":{"33":1,"34":1,"35":1,"36":1,"37":1},"2":{"1":1,"4":1,"7":1,"22":1,"32":1,"38":1,"64":1,"147":1}}],["two",{"2":{"71":1,"122":1}}],["type",{"2":{"43":1,"46":1,"49":1,"73":1,"95":1,"96":1,"97":1,"114":2}}],["types",{"0":{"94":1},"1":{"95":1,"96":1},"2":{"9":1}}],["tune",{"2":{"107":1}}],["tutorial",{"2":{"41":1}}],["turning",{"2":{"18":1}}],["turn",{"2":{"6":1,"17":1,"22":1}}],["timing",{"2":{"126":1}}],["timestamp",{"2":{"76":1}}],["timestamps",{"2":{"60":1}}],["times",{"2":{"11":1,"22":1,"119":1}}],["time",{"0":{"18":1,"135":1},"2":{"8":1,"13":1,"18":3,"50":2,"56":1,"81":1,"104":2,"134":1,"141":1}}],["tiny",{"2":{"18":1}}],["t",{"2":{"18":6,"20":2,"55":1,"78":1}}],["trusted",{"2":{"162":1}}],["true",{"2":{"124":1}}],["tree",{"2":{"85":1}}],["treat",{"2":{"23":1}}],["triggering",{"2":{"117":1}}],["triggered",{"2":{"81":1,"118":1}}],["trigger",{"2":{"77":1,"79":1,"80":1,"126":1}}],["triggers",{"2":{"11":1,"119":1,"125":1}}],["troubleshooting",{"0":{"161":1},"2":{"77":1}}],["troubleshoot",{"2":{"48":1}}],["traits",{"2":{"128":1}}],["trash",{"2":{"115":1,"132":1}}],["translate",{"2":{"123":1}}],["transport",{"2":{"96":1}}],["transfer",{"2":{"3":1,"87":1}}],["tracked",{"2":{"77":1}}],["traditional",{"2":{"73":1}}],["trade",{"2":{"18":1}}],["trapped",{"2":{"20":1}}],["travels",{"2":{"18":1}}],["than",{"2":{"23":1,"104":1}}],["that",{"2":{"8":1,"17":1,"18":8,"19":1,"24":4,"38":1,"43":1,"45":1,"50":1,"62":1,"79":1,"81":1,"83":1,"91":1,"103":1,"108":1,"113":1,"116":1,"119":1,"123":1,"135":1}}],["through",{"2":{"22":2,"38":1,"40":1,"47":1}}],["threshold",{"2":{"107":1}}],["threads",{"2":{"18":1}}],["three",{"2":{"17":1,"49":1}}],["thing",{"2":{"18":1,"24":1}}],["thinking",{"2":{"50":1,"126":1}}],["thinks",{"2":{"44":1,"49":1}}],["think",{"2":{"18":1,"79":1}}],["this",{"2":{"18":2,"25":1,"27":1,"32":1,"36":1,"40":1,"41":1,"49":1,"50":1,"51":2,"52":1,"55":1,"57":1,"59":1,"68":2,"79":1,"80":1,"84":1,"95":1,"96":1,"111":1,"117":1,"119":1,"121":1,"123":1,"144":1,"146":1,"152":1,"153":1,"155":1}}],["those",{"2":{"17":1}}],["these",{"2":{"49":1,"91":1,"98":1,"108":1,"128":1,"156":1}}],["they",{"2":{"20":2,"127":1,"142":1}}],["then",{"2":{"18":1,"33":1,"118":1,"152":2,"154":1}}],["there",{"2":{"18":1}}],["their",{"2":{"5":1,"20":1,"22":2,"60":1,"121":1,"142":1,"146":1}}],["the",{"0":{"16":1,"29":1,"49":1,"53":1,"123":1,"124":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"1":1,"4":1,"6":1,"8":1,"12":2,"14":1,"15":1,"17":4,"18":12,"20":1,"21":2,"22":3,"23":3,"24":2,"25":1,"27":2,"28":2,"29":3,"30":1,"32":1,"33":2,"34":1,"35":1,"36":3,"37":3,"38":4,"39":5,"40":1,"41":3,"42":3,"43":3,"44":4,"46":6,"48":3,"49":10,"50":11,"51":5,"52":2,"53":3,"54":3,"55":8,"56":6,"57":3,"58":2,"59":4,"60":1,"63":2,"66":5,"67":2,"69":3,"72":2,"73":4,"74":2,"75":7,"76":7,"77":3,"78":1,"79":2,"80":9,"81":6,"82":2,"83":4,"84":2,"85":1,"86":4,"87":3,"88":3,"89":4,"90":1,"91":3,"92":1,"94":2,"95":3,"96":3,"97":3,"98":6,"100":2,"101":2,"102":2,"103":1,"104":3,"105":2,"106":2,"107":2,"108":4,"110":1,"111":9,"112":5,"114":9,"115":3,"118":2,"119":10,"120":1,"121":4,"123":4,"124":2,"125":9,"127":2,"128":1,"129":2,"130":2,"131":2,"132":3,"133":5,"134":1,"136":2,"138":5,"139":5,"140":4,"141":3,"142":1,"143":1,"144":7,"145":2,"146":3,"147":1,"149":3,"151":4,"152":4,"153":4,"154":1,"156":1,"157":1,"158":2,"159":1,"162":1}}],["theme",{"2":{"13":1}}],["them",{"2":{"1":1,"6":1,"87":1,"97":1,"100":1,"147":1}}],["task",{"0":{"143":1},"2":{"70":1,"80":1,"81":1,"117":1,"119":3,"126":1}}],["tasks",{"0":{"11":1,"117":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1},"2":{"3":1,"8":1,"11":1,"22":2,"45":1,"56":2,"78":1,"83":1,"98":1,"117":1,"126":1,"142":1}}],["target",{"2":{"39":1}}],["tabs",{"2":{"47":1}}],["tab",{"0":{"48":1,"50":1},"2":{"30":1,"36":1,"42":1,"48":1,"49":1,"50":1,"51":1,"54":1,"56":1,"63":1,"74":1,"76":1,"80":1,"81":1,"84":1,"91":1,"94":1,"101":1,"105":1,"108":1,"121":1,"130":1,"140":1,"144":1}}],["takes",{"2":{"47":1}}],["take",{"2":{"18":1,"155":1}}],["talk",{"2":{"18":1}}],["tailwind",{"2":{"13":1}}],["tavily",{"2":{"8":1,"136":1}}],["template",{"2":{"131":1,"151":1}}],["temporary",{"2":{"55":1}}],["tech",{"2":{"119":1}}],["testing",{"2":{"57":1}}],["term",{"2":{"49":1,"99":1,"108":1}}],["terminal",{"2":{"14":1}}],["teammate",{"2":{"143":1}}],["team",{"2":{"23":1}}],["teams",{"2":{"3":1}}],["textarea",{"2":{"102":1}}],["text",{"0":{"89":1},"2":{"18":1,"31":1,"49":1,"89":1,"103":1,"113":1,"114":1}}],["tension",{"2":{"17":1}}],["telegram",{"0":{"40":1,"41":1},"1":{"41":1,"42":1,"43":1,"44":1},"2":{"1":1,"4":1,"7":1,"22":1,"38":1,"39":1,"40":2,"41":3,"42":1,"43":3,"62":1,"64":1,"119":1,"124":1,"147":1,"148":1}}],["total",{"2":{"119":1}}],["today",{"2":{"119":1}}],["top",{"0":{"106":1},"2":{"119":1}}],["toml",{"2":{"89":1,"148":1,"151":1,"152":5,"153":2,"155":1,"159":2,"160":1}}],["toggle",{"2":{"69":1,"80":1,"97":1}}],["tokens",{"2":{"39":1,"50":1,"67":1}}],["token",{"2":{"27":3,"30":1,"41":3,"42":1,"50":1,"111":1,"144":1}}],["took",{"2":{"81":1}}],["too",{"2":{"18":3}}],["toolbar",{"2":{"85":1}}],["tool",{"0":{"14":1},"2":{"10":1,"13":1,"14":1,"21":1,"92":1,"123":1,"129":1,"135":1,"146":1,"154":1}}],["tools",{"2":{"8":1,"10":1,"18":1,"23":1,"45":1,"55":1,"79":1,"83":1,"91":1,"93":1,"98":2,"105":1,"118":1,"125":1,"127":1,"128":1,"129":1,"133":1}}],["to",{"0":{"16":1,"23":1,"29":1,"140":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"1":1,"3":1,"4":1,"7":1,"8":1,"10":1,"11":1,"13":1,"15":1,"17":1,"18":2,"20":2,"22":3,"23":1,"24":1,"26":2,"27":3,"28":2,"29":3,"30":1,"31":1,"32":1,"33":2,"34":1,"35":1,"36":2,"37":2,"38":1,"39":3,"40":1,"41":2,"42":1,"43":4,"44":1,"46":3,"47":1,"48":1,"49":3,"50":2,"51":3,"52":1,"55":2,"57":1,"59":1,"60":2,"61":2,"62":1,"64":1,"68":2,"70":1,"71":3,"73":1,"75":1,"76":1,"77":3,"78":2,"79":1,"80":1,"81":1,"82":1,"86":1,"87":3,"88":1,"89":3,"90":1,"91":2,"92":2,"93":1,"95":1,"96":1,"97":2,"98":1,"99":1,"100":1,"102":1,"104":2,"105":1,"108":1,"109":2,"110":1,"111":1,"112":1,"113":1,"114":1,"115":3,"116":1,"117":1,"118":3,"119":2,"121":2,"123":2,"124":1,"125":1,"129":1,"132":3,"133":1,"134":3,"135":1,"136":1,"138":2,"140":2,"141":2,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":2,"153":1,"156":1,"157":1,"158":3,"159":1,"160":1}}],["wrote",{"2":{"18":1}}],["write",{"2":{"5":1,"8":1,"75":1,"91":1,"129":1,"151":1}}],["ways",{"2":{"122":1}}],["way",{"2":{"77":1,"93":1,"149":1}}],["warnings",{"0":{"162":1}}],["warning",{"2":{"48":1,"51":1}}],["walks",{"2":{"40":1}}],["want",{"2":{"20":2,"24":1,"29":1}}],["wanted",{"2":{"18":2}}],["wasn",{"2":{"18":1}}],["was",{"2":{"18":1,"76":1,"81":1}}],["wait",{"2":{"18":1}}],["working",{"2":{"95":1}}],["workspace",{"0":{"53":1},"2":{"91":1,"146":1,"151":2}}],["workflows",{"2":{"17":1,"38":1}}],["worse",{"2":{"18":1}}],["world",{"2":{"17":1,"38":1}}],["week",{"2":{"120":1}}],["were",{"2":{"18":1}}],["weight",{"2":{"18":1}}],["we",{"2":{"17":2,"18":2,"21":1,"23":2,"24":2}}],["webp",{"2":{"90":1}}],["webhook",{"0":{"36":1,"68":1},"2":{"7":1,"36":2,"68":2}}],["web",{"2":{"1":1,"4":1,"7":2,"8":1,"10":1,"13":1,"15":1,"30":1,"38":1,"42":1,"43":1,"50":1,"88":1,"125":1,"134":1,"136":1,"147":1,"149":1,"154":4,"155":1}}],["which",{"2":{"118":1}}],["while",{"2":{"18":1,"143":1,"155":1}}],["whether",{"2":{"56":1,"76":1,"81":1,"119":1}}],["when",{"2":{"18":2,"21":1,"78":1,"81":1,"100":1,"118":1,"119":2,"125":1,"141":1,"151":1,"153":1}}],["where",{"2":{"17":1,"18":1,"23":2,"47":1}}],["why",{"0":{"20":1},"2":{"18":1}}],["who",{"2":{"14":1,"153":1}}],["what",{"0":{"1":1,"19":1},"2":{"17":2,"18":1,"119":1,"127":1,"148":1}}],["window",{"2":{"104":1}}],["will",{"2":{"24":1,"36":1,"41":1,"46":1,"49":1,"51":1,"55":1,"59":1,"68":1,"98":1,"108":1,"123":1,"131":1,"141":2,"151":1,"152":1}}],["wide",{"2":{"9":1}}],["without",{"2":{"5":1,"18":2,"52":1,"67":1,"88":1,"97":1,"117":1,"133":1,"152":1}}],["within",{"2":{"1":1,"5":1,"22":1,"49":1,"52":1,"53":1,"86":1,"128":1,"146":1}}],["with",{"0":{"91":1},"2":{"1":1,"3":3,"5":2,"7":2,"8":2,"13":1,"15":1,"17":2,"18":1,"19":1,"21":1,"22":3,"24":1,"26":1,"31":1,"32":2,"38":2,"41":1,"43":2,"45":1,"49":1,"50":1,"60":1,"61":1,"75":1,"78":1,"85":1,"87":1,"88":1,"120":1,"125":1,"128":1,"131":1,"142":1,"143":1,"146":2,"147":2,"149":1,"151":2,"152":1,"154":1,"157":1,"160":1,"162":1}}],["cni",{"2":{"156":2}}],["cn",{"2":{"153":2}}],["cpu",{"2":{"160":1}}],["cp",{"2":{"152":1}}],["cd",{"2":{"152":1}}],["cdf",{"0":{"107":1}}],["certs",{"2":{"160":1}}],["certain",{"2":{"104":1}}],["ceiling",{"2":{"20":1}}],["cwd",{"2":{"95":1}}],["cumulative",{"0":{"107":1}}],["curve",{"0":{"107":1}}],["current",{"2":{"57":1,"86":1,"119":1,"125":1}}],["currently",{"2":{"38":1,"56":1,"119":1}}],["custom",{"2":{"33":1,"36":1,"96":1,"126":1}}],["clear",{"2":{"82":1}}],["clean",{"2":{"82":1,"129":1}}],["cleaning",{"2":{"79":1}}],["cleaner",{"2":{"18":1}}],["clone",{"2":{"151":1,"152":1}}],["cloud",{"2":{"19":1,"20":1,"21":1,"23":1,"24":1}}],["closed",{"2":{"18":1}}],["class",{"2":{"18":1}}],["clash",{"2":{"18":1}}],["clicking",{"2":{"47":1}}],["clicks",{"2":{"18":1}}],["click",{"0":{"151":1},"2":{"15":1,"27":2,"30":2,"33":2,"34":1,"35":1,"36":1,"37":1,"42":2,"43":1,"46":2,"49":1,"51":1,"58":1,"59":1,"66":1,"73":2,"75":2,"87":1,"89":2,"90":1,"97":1,"111":2,"114":2,"115":2,"121":1,"131":2,"132":2,"138":1,"140":1}}],["client",{"2":{"9":1,"114":1}}],["cli",{"0":{"14":1},"2":{"1":1,"7":1,"14":1,"147":1}}],["china",{"0":{"153":1},"2":{"151":1,"153":3}}],["checklist",{"0":{"160":1}}],["checking",{"2":{"117":1}}],["checks",{"2":{"79":1}}],["check",{"2":{"48":2,"75":1,"126":1,"151":1,"161":1}}],["cheap",{"2":{"20":1}}],["choose",{"2":{"36":1,"39":1,"41":2,"46":1,"73":1,"96":1,"97":1}}],["choices",{"2":{"18":1}}],["chart",{"0":{"106":1}}],["change",{"2":{"66":1,"152":1,"155":1,"160":1,"162":1}}],["changes",{"2":{"28":1,"57":1,"86":1,"89":1}}],["channels",{"0":{"38":1,"61":1,"63":1},"1":{"39":1,"62":1,"63":1,"64":2,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"8":1,"12":1,"13":1,"30":1,"36":1,"38":3,"42":1,"45":1,"61":1,"62":1,"63":1,"148":2}}],["channel",{"0":{"26":1,"32":1,"40":1,"66":1,"71":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"33":1,"34":1,"35":1,"36":1,"37":1,"41":1,"42":1,"43":1,"44":1},"2":{"7":1,"12":1,"14":1,"22":1,"30":1,"36":1,"39":3,"42":1,"48":1,"66":2,"67":1,"69":3,"70":1,"118":1,"119":1,"125":1}}],["chatting",{"2":{"78":1}}],["chatbox",{"2":{"23":1}}],["chats",{"2":{"4":1,"32":1,"46":1}}],["chat",{"2":{"1":1,"3":1,"7":2,"9":2,"13":1,"14":1,"22":2,"31":1,"35":2,"38":1,"43":2,"45":1,"49":2,"50":2,"61":1,"62":1,"77":1,"80":1,"113":1,"114":3,"147":1,"154":1}}],["circling",{"2":{"17":1}}],["css",{"2":{"13":1}}],["categorize",{"2":{"133":1}}],["category",{"2":{"18":1}}],["captured",{"2":{"59":1}}],["capture",{"2":{"57":1}}],["capability",{"0":{"34":1},"2":{"17":1,"19":1,"21":1,"136":1}}],["capabilities",{"0":{"8":1,"93":1},"2":{"6":1,"34":1,"35":1,"50":2,"74":1,"114":1,"127":1,"129":1,"133":1}}],["card",{"2":{"47":1,"132":1}}],["carry",{"2":{"18":1}}],["caught",{"2":{"18":1}}],["case",{"0":{"16":1,"68":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"126":1}}],["called",{"2":{"123":1}}],["callback",{"2":{"36":1,"68":1}}],["calls",{"2":{"21":1,"119":2,"124":1,"125":2,"126":1}}],["call",{"2":{"13":1,"141":1}}],["cannot",{"2":{"153":1}}],["can",{"2":{"1":1,"3":1,"4":1,"5":1,"8":1,"10":1,"17":1,"18":5,"22":3,"23":2,"38":1,"44":1,"45":1,"47":1,"50":1,"53":1,"62":1,"75":6,"77":1,"80":1,"83":1,"84":1,"91":1,"93":1,"104":1,"116":1,"118":1,"123":1,"124":1,"125":1,"127":1,"129":1,"135":1,"141":1,"143":1}}],["creation",{"2":{"60":1}}],["creating",{"0":{"46":1,"58":1,"73":1,"102":1,"111":1,"122":1},"1":{"123":1,"124":1},"2":{"49":1,"56":1}}],["created",{"2":{"47":1,"75":1,"86":1,"122":1,"140":1}}],["create",{"0":{"27":1,"33":1,"41":1},"2":{"1":1,"3":1,"8":1,"22":1,"33":2,"37":1,"39":1,"41":1,"46":2,"55":1,"58":1,"64":1,"73":1,"75":1,"86":1,"111":1,"114":1,"116":1,"123":2,"124":1,"145":1,"146":1,"147":1,"152":2}}],["credentials",{"2":{"33":1,"39":2,"42":1,"66":1,"67":1,"110":1,"138":1,"151":1}}],["cron",{"0":{"118":1,"120":1},"2":{"11":1,"22":1,"117":1,"118":1,"119":1,"120":1,"121":1,"123":1,"125":1,"126":1}}],["cross",{"2":{"4":1,"12":1}}],["collection",{"2":{"79":1}}],["collaborate",{"2":{"3":1,"22":1}}],["copy",{"2":{"27":1,"29":1,"33":1,"36":1,"43":1,"68":1}}],["core",{"2":{"23":1,"50":1}}],["cost",{"2":{"18":1}}],["could",{"2":{"18":1}}],["counter",{"2":{"125":1}}],["counts",{"2":{"121":1}}],["count",{"2":{"11":1}}],["coding",{"2":{"13":1,"22":1,"129":1}}],["coder",{"2":{"129":3}}],["code",{"2":{"8":1,"43":3,"44":1,"52":1,"129":1}}],["conf",{"2":{"152":1}}],["config=",{"2":{"152":1}}],["config",{"2":{"97":1,"148":1,"151":2,"152":5,"153":1,"155":1,"159":3,"160":1,"161":1}}],["configuring",{"0":{"49":1},"2":{"38":1}}],["configurations",{"2":{"48":1}}],["configuration",{"0":{"13":1,"26":1,"32":1,"40":1,"65":1,"80":1,"137":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"33":1,"34":1,"35":1,"36":1,"37":1,"41":1,"42":1,"43":1,"44":1,"66":1,"67":1,"68":1,"138":1,"139":1},"2":{"13":1,"14":1,"39":1,"50":1,"57":1,"64":3,"66":1,"67":1,"68":1,"69":2,"89":1,"97":2,"139":1,"151":1,"159":1,"161":1}}],["configurable",{"2":{"8":1,"45":1}}],["configured",{"2":{"31":1,"38":1,"49":1,"55":1,"108":1,"116":1,"135":1}}],["configure",{"0":{"28":1,"30":1,"35":1,"36":1,"42":1},"2":{"11":1,"22":1,"39":1,"62":1,"63":1,"64":1,"67":1,"71":1,"74":1,"80":1,"94":1,"109":1,"114":1,"116":1,"136":1,"144":1,"148":1,"160":1}}],["confirm",{"2":{"51":1}}],["confidence",{"2":{"23":1}}],["converse",{"2":{"77":1}}],["conversational",{"0":{"123":1}}],["conversations",{"2":{"49":1,"99":1}}],["conversation",{"2":{"6":2,"19":1,"22":1,"50":1,"102":2,"113":1,"114":1,"133":1,"135":1,"142":1,"143":1,"144":1,"145":1}}],["convert",{"2":{"49":1}}],["consumption",{"2":{"144":1}}],["consider",{"2":{"107":1}}],["console",{"2":{"34":1,"36":1,"37":1}}],["constraint",{"2":{"18":1}}],["concept",{"0":{"53":1,"62":1,"71":1,"79":1,"93":1,"100":1,"118":1,"128":1,"135":1,"143":1},"1":{"129":1}}],["conceptually",{"2":{"18":1}}],["conclusion",{"0":{"24":1}}],["connected",{"2":{"118":1,"125":1}}],["connects",{"2":{"96":1}}],["connection",{"0":{"94":1},"1":{"95":1,"96":1},"2":{"71":1,"95":1,"96":1,"97":3,"98":1,"110":1,"135":1}}],["connections",{"0":{"92":1},"1":{"93":1,"94":1,"95":1,"96":1,"97":1,"98":1},"2":{"10":1,"63":1,"72":1,"93":1,"94":1,"97":2}}],["connectivity",{"2":{"48":1}}],["connecting",{"2":{"7":1,"26":1,"40":1,"71":1}}],["connect",{"2":{"10":1,"38":2,"61":1,"92":1,"134":1,"136":1}}],["continue",{"2":{"24":1}}],["continuity",{"2":{"20":1,"24":1}}],["continuously",{"2":{"18":1}}],["content",{"2":{"18":1,"28":1,"31":1,"89":1,"102":1,"103":1,"131":1,"132":1}}],["contextually",{"2":{"99":1}}],["context",{"2":{"4":1,"6":1,"8":1,"10":1,"12":1,"17":2,"18":1,"20":2,"21":1,"22":1,"24":1,"44":1,"49":1,"50":4,"92":2,"98":1,"118":1,"125":1,"142":1,"144":1,"145":2}}],["contains",{"2":{"25":1,"50":1}}],["containerization",{"2":{"20":1}}],["containerized",{"0":{"5":1,"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"1":1,"19":1,"21":1,"22":1,"23":1,"24":1,"147":1}}],["containers",{"2":{"5":1,"21":1,"22":1,"149":1,"152":1,"160":1}}],["containerd",{"2":{"5":1,"15":1,"56":1,"149":2,"154":1,"156":2,"162":1}}],["container",{"0":{"52":1,"56":1},"1":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1},"2":{"1":2,"5":2,"8":2,"10":1,"13":1,"22":1,"23":1,"45":1,"48":1,"51":1,"52":1,"53":1,"54":1,"55":5,"56":4,"57":1,"58":1,"59":1,"84":1,"87":2,"128":1,"132":1,"144":1,"146":1,"147":1,"156":2,"162":1}}],["contact",{"2":{"17":1}}],["control",{"2":{"3":1,"19":1,"21":1}}],["com",{"2":{"111":1,"152":1}}],["common",{"0":{"67":1,"157":1},"2":{"89":1,"120":1}}],["communicate",{"2":{"143":1,"146":1}}],["communicates",{"2":{"95":1}}],["communication",{"0":{"62":1},"2":{"50":1,"70":1}}],["community",{"2":{"26":1,"38":1}}],["command`",{"2":{"129":1}}],["command",{"2":{"7":1,"14":1,"41":1,"95":3,"118":1,"119":1,"124":1,"125":2,"126":1}}],["commands",{"0":{"157":1},"2":{"1":1,"5":1,"8":1,"11":1,"22":2,"23":1,"29":1,"31":2,"52":1,"147":1}}],["comes",{"2":{"45":1}}],["come",{"2":{"8":1,"154":1}}],["comprehensive",{"2":{"136":1,"141":1}}],["compression",{"0":{"104":1},"2":{"104":1}}],["component",{"2":{"85":1}}],["compose",{"2":{"15":1,"75":1,"149":1,"150":1,"151":2,"152":3,"153":4,"154":1,"156":2,"157":7,"158":2,"160":1,"161":6}}],["compact",{"0":{"104":1},"2":{"104":2}}],["compaction",{"2":{"6":1}}],["compare",{"0":{"23":1}}],["compatible",{"2":{"9":1,"110":1}}],["complement",{"2":{"126":1}}],["completes",{"2":{"154":1}}],["completed",{"2":{"81":1}}],["completions",{"2":{"9":1,"114":1}}],["complex",{"2":{"8":1,"45":1,"57":1,"142":1}}],["computer",{"2":{"1":1,"22":1,"53":1,"87":1}}],["ssl",{"2":{"160":1}}],["sse",{"0":{"96":1},"2":{"10":1,"96":1,"154":1}}],["swap",{"2":{"133":1}}],["switch",{"2":{"9":1,"69":1}}],["synthesized",{"2":{"141":1}}],["syntax",{"2":{"89":1,"120":1}}],["systems",{"2":{"146":1}}],["system",{"2":{"1":2,"12":1,"17":1,"48":1,"49":1,"52":1,"83":1,"99":1,"100":1,"105":1,"133":2,"147":2}}],["snapshot",{"0":{"58":1,"59":1},"2":{"58":2,"59":1,"60":1}}],["snapshots",{"0":{"57":1,"60":1},"1":{"58":1,"59":1,"60":1},"2":{"5":1,"57":1,"60":1,"156":1}}],["sh",{"2":{"151":4}}],["shut",{"2":{"55":1}}],["shot",{"2":{"154":1}}],["showing",{"2":{"76":1}}],["shows",{"2":{"48":1,"106":1,"121":1}}],["should",{"2":{"43":1,"80":1,"83":1,"107":1,"127":1}}],["share",{"2":{"23":1}}],["sharing",{"2":{"21":1,"23":1}}],["slash",{"2":{"31":1}}],["sludge",{"2":{"18":1}}],["spin",{"2":{"143":1}}],["split",{"2":{"23":1}}],["speaker",{"2":{"18":1}}],["specify",{"2":{"104":1,"138":1}}],["specified",{"2":{"11":1,"22":1}}],["specifically",{"2":{"136":1}}],["specific",{"2":{"4":1,"8":1,"71":1,"97":1,"102":1,"113":1,"118":1,"126":1,"135":1,"138":1,"142":1,"144":2,"157":1}}],["specialization",{"0":{"143":1}}],["specialized",{"2":{"8":1,"45":1,"47":1,"142":1,"143":1}}],["special",{"0":{"68":1},"2":{"83":1}}],["silently",{"2":{"151":1}}],["silent",{"2":{"151":1}}],["size",{"2":{"114":1}}],["simply",{"2":{"152":1}}],["simple",{"2":{"22":1}}],["simultaneously",{"2":{"62":1}}],["single",{"2":{"62":1,"146":1}}],["sidebar",{"2":{"27":1,"33":1,"39":1,"46":1,"72":1,"73":1,"111":2,"136":1,"138":1,"139":1}}],["sit",{"2":{"17":1,"18":1}}],["scope",{"2":{"146":1}}],["scopes",{"2":{"29":1}}],["scoring",{"2":{"107":1}}],["script",{"2":{"151":2,"153":1}}],["scripts",{"2":{"53":1}}],["scroll",{"2":{"28":1,"51":1}}],["screen",{"2":{"18":1}}],["schedules",{"0":{"121":1,"122":1},"1":{"123":1,"124":1},"2":{"121":1,"122":1,"124":1}}],["schedule",{"0":{"119":1,"126":1},"2":{"22":1,"78":1,"118":2,"119":3,"121":1,"123":4,"124":1,"125":4,"126":2}}],["scheduled",{"0":{"11":1,"79":1,"117":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1},"2":{"11":1,"22":1,"79":1,"117":1}}],["scheduling",{"2":{"10":1}}],["smell",{"2":{"18":1}}],["smoother",{"2":{"18":1}}],["small",{"2":{"18":1,"113":1}}],["smarter",{"2":{"17":1}}],["smtp",{"2":{"7":1,"38":1,"71":1,"73":1}}],["sogou",{"2":{"136":1}}],["software",{"2":{"53":1}}],["sources",{"2":{"93":1}}],["source",{"2":{"24":1}}],["soul",{"2":{"8":1}}],["someone",{"2":{"20":1}}],["somewhere",{"2":{"18":2}}],["something",{"2":{"17":1,"18":3}}],["so",{"2":{"12":1,"18":2,"20":1}}],["skill",{"0":{"129":1,"131":1},"2":{"8":1,"128":1,"129":2,"130":1,"131":1,"132":2}}],["skills",{"0":{"127":1,"128":1,"130":1,"133":1},"1":{"128":1,"129":2,"130":1,"131":2,"132":2,"133":1},"2":{"8":2,"13":1,"22":1,"79":1,"83":1,"91":1,"118":1,"127":1,"130":1,"133":3,"144":2}}],["succeeded",{"2":{"161":1}}],["successfully",{"2":{"43":1,"76":1,"81":1}}],["sudo",{"2":{"151":2,"152":1,"157":1}}],["sun=0",{"2":{"120":1}}],["summarize",{"2":{"119":1,"124":2}}],["summarizing",{"2":{"49":1,"50":1,"108":1}}],["summary",{"2":{"81":1,"119":1,"123":1}}],["subagent",{"2":{"143":2,"144":3,"145":4,"146":1}}],["subagents",{"0":{"142":1},"1":{"143":1,"144":1,"145":1,"146":1},"2":{"8":2,"142":1,"144":2,"146":2}}],["subject",{"2":{"76":2}}],["submit",{"2":{"37":1}}],["subscriptions",{"2":{"36":1}}],["sustainable",{"2":{"23":1}}],["survive",{"2":{"17":1,"156":1}}],["surfaced",{"2":{"12":1}}],["supported",{"0":{"31":1,"44":1,"63":1,"136":1},"1":{"64":1},"2":{"40":1,"114":1,"136":1}}],["support",{"0":{"7":1,"9":1,"10":1},"2":{"7":3,"10":1,"23":1,"31":1,"38":1,"40":1,"44":1,"87":1}}],["supports",{"2":{"3":1,"5":1,"11":1,"22":1,"32":1,"38":1,"50":1,"89":1,"92":1,"114":2}}],["steps",{"0":{"116":1},"2":{"71":1,"114":1}}],["step",{"0":{"27":1,"28":1,"29":1,"30":1,"33":1,"34":1,"35":1,"36":1,"37":1,"41":1,"42":1,"43":1},"2":{"49":1,"64":2,"148":2}}],["studio",{"2":{"19":1,"23":1}}],["stop",{"2":{"55":1,"157":1}}],["stopped",{"2":{"48":1,"56":1,"58":1}}],["stops",{"2":{"18":1}}],["stood",{"2":{"18":1}}],["store",{"2":{"27":1,"53":1,"156":1}}],["stored",{"2":{"22":2,"100":1,"128":1,"156":1}}],["stores",{"2":{"6":1,"110":1}}],["storage",{"2":{"18":1,"21":1,"156":1}}],["story",{"0":{"18":1}}],["style",{"2":{"18":1}}],["stable",{"2":{"58":1}}],["statistics",{"2":{"144":1}}],["state",{"2":{"53":1,"55":1,"57":1,"58":1,"59":1,"156":2}}],["status",{"2":{"48":1,"56":1,"69":1,"76":1,"79":1,"81":1,"82":1,"121":1,"157":1}}],["startup",{"2":{"154":1,"155":2,"158":1}}],["starts",{"2":{"154":2}}],["starting",{"2":{"152":1}}],["start",{"2":{"39":1,"55":1,"151":1,"152":1,"154":1,"157":1}}],["started",{"2":{"18":2,"148":1}}],["standardized",{"2":{"93":1}}],["standard",{"2":{"38":1,"49":1,"95":1,"97":1,"120":1}}],["stay",{"2":{"21":1}}],["stays",{"2":{"19":1,"24":2}}],["stack",{"2":{"21":1,"24":1,"149":1}}],["stakes",{"2":{"18":1}}],["still",{"2":{"17":1}}],["stdio",{"0":{"95":1},"2":{"10":1}}],["structure",{"0":{"129":1}}],["structured",{"2":{"1":1,"6":1,"77":1,"99":1,"147":1}}],["strict",{"2":{"21":1}}],["stream",{"2":{"18":1}}],["streaming",{"2":{"7":2,"13":1,"14":1,"38":1,"40":1,"44":1,"154":1}}],["saving",{"2":{"57":1}}],["save",{"2":{"5":1,"28":1,"30":1,"36":2,"42":1,"49":1,"55":1,"69":2,"89":2,"131":1,"140":1}}],["safely",{"2":{"57":1}}],["safe",{"2":{"20":1}}],["say",{"2":{"18":1}}],["same",{"2":{"4":1,"18":1}}],["serper",{"2":{"136":1}}],["service",{"0":{"154":1},"2":{"71":1,"72":1,"110":1,"111":1,"125":1,"154":2,"155":1,"157":1,"158":1,"161":1,"162":1}}],["services",{"2":{"9":1,"10":1,"15":1,"21":1,"48":1,"62":1,"92":1,"151":1,"154":1,"155":1}}],["serving",{"2":{"21":1}}],["servers",{"2":{"26":1,"38":1,"73":1}}],["server",{"0":{"29":1},"2":{"15":1,"29":1,"71":1,"95":2,"96":3,"98":2,"149":1,"154":4,"156":2,"157":1,"161":1}}],["self",{"2":{"110":1,"136":1}}],["selected",{"2":{"50":1,"66":1}}],["selection",{"2":{"49":1}}],["select",{"2":{"29":3,"30":1,"42":2,"43":1,"49":2,"66":1,"75":1,"87":1,"102":1,"112":1,"114":1,"121":1,"139":1,"140":2}}],["sent",{"2":{"76":3,"96":1,"119":1}}],["sends",{"2":{"118":1,"123":1}}],["sending",{"2":{"39":1,"79":1,"117":1}}],["send",{"2":{"4":1,"8":1,"29":1,"35":1,"41":1,"43":1,"44":2,"68":1,"70":1,"75":1,"77":1,"119":1,"124":1,"125":1}}],["sessions",{"2":{"53":1}}],["several",{"2":{"47":1}}],["security",{"0":{"162":1},"2":{"52":1}}],["securely",{"2":{"27":1}}],["seconds",{"2":{"50":1}}],["secrets",{"2":{"39":1,"67":1,"160":1,"162":1}}],["secret",{"2":{"33":1,"36":1,"41":1,"151":2,"152":1}}],["section",{"2":{"25":1,"28":1,"49":1,"114":1}}],["see",{"2":{"14":1,"39":1,"46":1,"64":1,"86":1,"90":1}}],["searxng",{"2":{"8":1,"136":1,"138":1}}],["searching",{"0":{"103":1}}],["search",{"0":{"100":1,"134":1,"136":1,"138":1,"140":1},"1":{"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1},"2":{"6":1,"8":3,"10":2,"19":1,"22":1,"35":1,"41":1,"49":1,"50":3,"97":1,"100":1,"103":1,"108":1,"113":1,"114":1,"125":1,"134":1,"135":2,"136":6,"138":4,"140":1,"141":3,"154":1}}],["semantic",{"0":{"100":1},"2":{"6":1,"22":1,"49":1,"50":1,"100":1,"154":1}}],["separate",{"2":{"5":1}}],["separately",{"2":{"4":1}}],["setup",{"0":{"39":1},"2":{"15":1}}],["settings",{"0":{"28":1,"50":1},"2":{"13":1,"22":1,"33":1,"36":1,"39":1,"43":1,"49":1,"50":1,"51":1,"108":1,"112":1,"138":1,"139":1,"140":1,"151":1}}],["set",{"2":{"3":1,"8":1,"13":1,"22":1,"50":1,"75":1,"79":1,"93":1,"104":1,"125":1,"130":1,"160":1}}],["s",{"0":{"49":1},"2":{"4":1,"17":1,"18":6,"20":1,"24":1,"30":1,"31":1,"36":1,"39":1,"42":1,"46":1,"48":1,"49":2,"50":2,"53":1,"54":1,"56":2,"57":2,"63":1,"68":1,"69":2,"74":1,"75":1,"76":2,"81":1,"83":1,"87":2,"88":1,"89":2,"91":1,"99":1,"100":1,"101":1,"102":2,"119":1,"128":1,"130":1,"132":1,"133":1,"141":1,"144":2,"145":1,"146":2,"151":1,"157":1}}],["my",{"2":{"41":2,"123":1,"124":1,"138":1}}],["myself",{"2":{"18":1}}],["migration",{"2":{"154":1}}],["migrations",{"2":{"154":2,"158":1,"161":1}}],["migrate",{"2":{"154":2,"158":1,"161":1}}],["mirror",{"0":{"153":1},"2":{"151":1,"153":2}}],["midnight",{"2":{"120":2}}],["minute",{"2":{"120":1}}],["minutes",{"2":{"80":2,"120":1,"126":1,"155":1}}],["minimum",{"2":{"35":1,"152":1}}],["mic",{"2":{"18":1}}],["misses",{"2":{"12":1}}],["must",{"2":{"49":1,"55":1,"152":2,"159":1,"162":1}}],["much",{"2":{"18":1,"104":1,"107":1}}],["multiple",{"2":{"3":1,"7":1,"21":1,"22":1,"53":1,"62":1,"97":1,"99":1,"141":1}}],["multi",{"0":{"3":1,"4":1,"7":1,"9":1},"2":{"1":1,"6":1,"18":1,"22":1,"23":1,"146":1,"147":1}}],["mcpservers",{"2":{"97":1}}],["mcp",{"0":{"10":1,"92":1},"1":{"93":1,"94":1,"95":1,"96":1,"97":1,"98":1},"2":{"10":2,"13":1,"22":1,"31":1,"83":1,"91":1,"92":1,"93":2,"94":2,"96":2,"98":3,"153":1}}],["mounted",{"2":{"156":1}}],["mounts",{"2":{"152":1}}],["morning",{"2":{"119":1,"124":1}}],["more",{"2":{"8":1,"10":1,"14":1,"18":3,"22":2,"23":1,"24":1,"62":1,"82":1}}],["monday",{"2":{"120":1}}],["month",{"2":{"120":3}}],["monaco",{"2":{"89":1,"131":1}}],["monitor",{"2":{"91":1}}],["monitoring",{"0":{"81":1},"1":{"82":1},"2":{"77":1}}],["monitors",{"2":{"48":1}}],["move",{"2":{"86":1}}],["mobile",{"2":{"18":1}}],["moment",{"2":{"18":3}}],["most",{"2":{"18":1,"38":1,"40":1,"49":1,"100":1,"106":1}}],["modalities",{"2":{"114":1}}],["modify",{"2":{"53":1,"89":1,"103":1,"132":1}}],["mode",{"0":{"36":1},"2":{"36":1,"68":1}}],["modern",{"2":{"13":1}}],["modelcontextprotocol",{"2":{"95":1}}],["models",{"0":{"49":1,"115":1},"2":{"13":1,"17":1,"20":1,"49":3,"111":1,"113":2,"114":2,"116":1,"148":1}}],["model",{"0":{"109":1,"113":1,"114":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":2,"115":2,"116":1},"2":{"9":1,"10":1,"14":1,"19":1,"22":1,"49":6,"50":5,"80":2,"92":1,"108":1,"109":1,"113":1,"114":5,"115":2}}],["modular",{"2":{"8":1,"133":1,"146":1}}],["md",{"2":{"8":2,"89":1}}],["macos",{"2":{"152":1}}],["machine",{"2":{"87":1}}],["match",{"2":{"152":1,"159":1}}],["mattered",{"2":{"18":1}}],["may",{"2":{"138":1,"155":1}}],["mapped",{"2":{"67":1}}],["mail",{"2":{"77":1}}],["mailgun",{"2":{"7":1,"71":1,"73":1}}],["mainland",{"0":{"153":1},"2":{"153":1}}],["maintenance",{"2":{"117":1}}],["maintain",{"2":{"53":1}}],["main",{"2":{"50":1,"80":1,"142":1,"143":1,"146":2,"149":1,"154":1,"161":1,"162":1}}],["making",{"2":{"24":2}}],["make",{"2":{"20":1}}],["makes",{"2":{"17":1,"20":1,"108":1}}],["manifold",{"0":{"105":1},"1":{"106":1,"107":1}}],["manifesto",{"2":{"17":1}}],["managing",{"0":{"60":1,"82":1,"87":1,"103":1,"112":1,"115":1,"130":1,"139":1},"1":{"131":1,"132":1},"2":{"50":1}}],["managed",{"2":{"142":1}}],["manager",{"2":{"90":1}}],["managers",{"2":{"53":1}}],["manage",{"2":{"3":1,"8":1,"47":1,"54":1,"72":1,"75":1,"84":1,"91":1,"101":1,"130":1,"133":1}}],["management",{"0":{"3":1,"45":1,"52":1,"84":1,"99":1},"1":{"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"8":1,"14":2,"22":1,"37":1,"70":1}}],["many",{"2":{"18":1,"55":1}}],["manually",{"2":{"91":1,"102":1}}],["manual",{"0":{"152":1},"1":{"153":1},"2":{"11":1,"15":1,"117":1}}],["max",{"2":{"11":1,"50":2,"119":1,"124":1,"125":1,"126":1}}],["markdown",{"0":{"128":1},"1":{"129":1},"2":{"7":1,"40":1,"44":1,"128":1}}],["mental",{"2":{"146":1}}],["metrics",{"2":{"145":1}}],["metaphors",{"2":{"18":1}}],["me",{"2":{"123":1}}],["meaning",{"2":{"120":1}}],["medium",{"2":{"50":1}}],["message",{"2":{"28":1,"29":1,"31":1,"35":1,"36":2,"44":1,"125":1}}],["messages",{"2":{"4":1,"8":1,"9":1,"12":1,"28":1,"29":1,"35":1,"38":1,"39":1,"67":1,"68":1,"102":1,"114":1,"144":1}}],["messaging",{"2":{"7":1,"8":1,"10":1,"38":1,"45":1,"61":1,"62":1}}],["memories",{"0":{"102":1},"2":{"6":1,"8":1,"50":1,"100":2,"101":1,"103":2,"104":2,"106":1,"107":1,"108":3}}],["memory",{"0":{"6":1,"99":1,"104":1},"1":{"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1},"2":{"1":2,"6":2,"8":1,"9":1,"10":1,"18":1,"19":1,"21":1,"22":3,"23":1,"24":1,"45":1,"48":1,"49":3,"50":2,"51":1,"83":1,"99":1,"101":1,"102":3,"103":1,"104":1,"105":2,"108":1,"113":1,"147":2,"154":1,"160":1}}],["memohai",{"2":{"152":1,"154":4}}],["memoh123",{"2":{"151":1,"159":1}}],["memoh",{"0":{"0":1,"1":1,"16":1,"30":1,"42":1,"147":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"148":1},"2":{"1":1,"15":1,"17":1,"19":1,"20":1,"21":1,"23":2,"24":3,"25":1,"26":1,"30":1,"32":1,"36":2,"38":2,"39":1,"40":2,"41":2,"42":1,"43":2,"52":1,"62":1,"67":1,"68":2,"70":1,"84":1,"92":1,"95":1,"99":1,"100":1,"109":1,"113":1,"127":1,"134":1,"147":1,"148":2,"149":1,"151":5,"152":4,"153":1,"156":2,"158":1,"159":1}}],["members",{"2":{"3":1,"26":1}}],["member",{"2":{"1":1,"3":1,"147":1}}],["available",{"2":{"118":1}}],["avatar",{"2":{"46":1}}],["audio",{"2":{"114":1}}],["audit",{"2":{"76":1,"81":1}}],["auth",{"2":{"152":1}}],["authentication",{"2":{"96":1,"110":1,"111":1}}],["authorize",{"2":{"29":1}}],["automation",{"0":{"118":1},"2":{"126":1}}],["automatic",{"2":{"6":1,"79":1}}],["automatically",{"2":{"6":1,"11":1,"98":1,"108":1,"123":1,"125":1,"141":1,"153":1,"158":1}}],["automate",{"2":{"117":1}}],["autonomy",{"0":{"79":1}}],["autonomous",{"2":{"78":1,"83":1,"126":1}}],["auto",{"2":{"6":1,"151":1}}],["affecting",{"2":{"52":1}}],["after",{"2":{"49":1,"154":1,"155":1}}],["able",{"2":{"147":1}}],["abcdefghijklmnopqrstuvwxyz",{"2":{"41":1}}],["about",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"25":1,"56":1,"148":1}}],["a2a",{"2":{"23":1}}],["am",{"2":{"119":1,"120":2,"123":1}}],["ambient",{"2":{"18":1}}],["amp",{"0":{"4":1},"2":{"33":1,"37":1}}],["approach",{"2":{"146":1}}],["approved",{"2":{"37":1}}],["approval",{"2":{"37":1}}],["appear",{"2":{"44":1}}],["applying",{"2":{"158":1}}],["apply",{"2":{"35":1,"89":1}}],["applications",{"2":{"29":1,"61":1}}],["application",{"0":{"27":1},"2":{"27":1}}],["app",{"0":{"33":1,"37":1},"2":{"18":1,"24":1,"33":4,"36":3,"37":1,"39":2,"68":1,"152":1}}],["apis",{"2":{"21":1}}],["api",{"0":{"124":1},"2":{"9":4,"39":1,"41":2,"42":1,"67":1,"73":1,"110":1,"111":3,"112":1,"114":1,"124":2,"135":1,"138":2,"155":1}}],["aggregator",{"2":{"136":1}}],["agreement",{"2":{"18":1}}],["agent2agent",{"2":{"23":1}}],["agents",{"2":{"17":1,"18":1,"20":1}}],["agent",{"0":{"8":1,"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"1":1,"15":1,"17":1,"18":1,"23":1,"24":1,"45":1,"118":1,"119":1,"125":2,"146":1,"147":1,"149":1,"154":4,"155":1}}],["alpine",{"2":{"154":1}}],["alternatively",{"2":{"152":1}}],["along",{"2":{"125":1}}],["alerts",{"2":{"82":1}}],["alert",{"2":{"81":1}}],["also",{"2":{"20":1,"44":1,"76":1,"91":1,"124":1}}],["already",{"2":{"18":1,"119":1}}],["always",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"17":1,"18":2,"20":1,"21":1,"24":2,"129":1}}],["allow",{"2":{"50":1,"57":1,"117":1,"133":1}}],["allows",{"2":{"26":1,"32":1,"52":1,"68":1,"70":1,"78":1,"88":1,"99":1,"134":1,"146":1}}],["allowing",{"2":{"1":1,"61":1,"77":1,"92":1}}],["all",{"2":{"13":1,"15":1,"50":1,"51":2,"76":1,"121":1,"149":1,"151":2,"156":2,"160":1,"162":1}}],["arguments",{"2":{"95":2}}],["around",{"2":{"18":1}}],["aren",{"2":{"78":1}}],["are",{"2":{"12":1,"38":1,"66":1,"67":1,"77":1,"100":1,"103":1,"122":1,"127":1,"128":1,"133":1,"142":2,"155":1}}],["architecture",{"0":{"154":1},"2":{"7":1}}],["attachment",{"2":{"38":1,"40":1}}],["attachments",{"2":{"7":1,"31":1,"44":1}}],["attach",{"2":{"29":1}}],["attempt",{"2":{"17":1}}],["at",{"2":{"8":1,"11":1,"22":1,"35":1,"49":1,"51":1,"76":1,"79":1,"109":2,"111":1,"119":1,"120":4,"123":1,"152":1,"156":1}}],["advanced",{"2":{"105":1,"129":1}}],["additional",{"2":{"138":1}}],["adding",{"0":{"66":1,"75":1,"114":1,"131":1,"138":1}}],["address",{"2":{"71":1,"75":1,"76":1}}],["add",{"2":{"29":1,"30":1,"36":2,"39":1,"42":1,"66":1,"73":1,"75":1,"97":3,"111":1,"114":1,"131":1,"138":1,"145":1}}],["adapter",{"2":{"7":1}}],["admin123",{"2":{"151":1,"155":1}}],["admin",{"2":{"3":1,"151":3,"152":2,"155":1}}],["ask",{"2":{"123":1}}],["asks",{"2":{"100":1}}],["assistant",{"2":{"144":1}}],["assist",{"2":{"129":1}}],["assigned",{"2":{"83":1,"141":1,"144":1}}],["assigning",{"0":{"140":1},"2":{"49":1}}],["assignment",{"2":{"9":1}}],["assign",{"2":{"8":1}}],["associated",{"2":{"51":1,"75":1}}],["as",{"0":{"71":1,"128":1},"1":{"129":1},"2":{"6":1,"20":1,"21":3,"22":1,"23":2,"24":1,"44":1,"53":1,"56":1,"62":1,"77":1,"128":1,"129":1,"133":1}}],["activity",{"2":{"126":1,"144":1}}],["activities",{"2":{"83":1}}],["active",{"2":{"56":1,"69":1,"97":1,"98":1,"119":1}}],["activate",{"2":{"39":1,"69":1}}],["actions",{"0":{"55":1},"2":{"77":1,"78":1,"117":1}}],["action",{"2":{"51":2,"81":1,"87":1}}],["acts",{"2":{"21":1,"53":1,"62":1}}],["actually",{"2":{"17":1,"18":2}}],["across",{"2":{"4":1,"53":1,"99":1}}],["accurate",{"2":{"141":1}}],["accumulate",{"2":{"104":1}}],["accumulating",{"2":{"18":1}}],["account",{"2":{"43":1}}],["accounts",{"2":{"3":1}}],["accessible",{"2":{"46":1}}],["access",{"0":{"155":1},"2":{"1":1,"3":1,"22":1,"31":1,"35":1,"38":1,"93":1,"123":1,"147":1,"153":1,"160":1,"162":1}}],["analysis",{"2":{"143":1}}],["answer",{"2":{"141":1,"153":1}}],["another",{"2":{"70":1}}],["any",{"2":{"48":1,"83":1,"117":1,"118":1,"125":1,"158":1}}],["anchor",{"2":{"18":1}}],["annoying",{"2":{"18":1}}],["anthropic",{"2":{"9":1,"110":1,"114":1}}],["an",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1},"2":{"1":1,"18":3,"21":1,"23":2,"24":3,"39":1,"41":2,"45":1,"49":1,"71":1,"76":2,"81":1,"90":1,"98":1,"110":2,"145":1,"147":1}}],["and",{"0":{"70":1,"76":1,"81":1,"86":1,"88":1,"103":1,"109":1,"132":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"82":1,"89":1,"90":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1},"2":{"1":4,"3":1,"4":2,"5":2,"6":2,"7":1,"8":6,"9":1,"10":2,"11":1,"12":1,"13":2,"14":1,"17":1,"18":6,"20":4,"21":3,"22":7,"23":6,"24":4,"26":1,"27":2,"29":2,"30":2,"31":1,"33":3,"35":2,"36":3,"37":2,"38":3,"39":2,"40":1,"41":1,"42":2,"43":2,"44":1,"45":2,"49":2,"50":2,"51":3,"52":1,"53":1,"56":1,"57":1,"59":1,"60":1,"62":1,"64":1,"66":2,"67":1,"68":1,"69":2,"70":2,"75":2,"77":1,"79":1,"85":1,"87":1,"89":2,"91":2,"92":1,"93":1,"95":1,"97":1,"98":1,"99":1,"100":1,"104":1,"108":2,"109":1,"110":1,"112":1,"113":1,"116":1,"118":1,"119":1,"120":1,"121":1,"123":2,"124":1,"125":1,"126":1,"127":2,"128":2,"129":3,"131":1,"133":1,"134":1,"136":1,"139":1,"140":2,"141":1,"143":1,"144":3,"145":3,"146":1,"147":1,"148":4,"149":1,"151":4,"153":1,"154":3,"155":1,"156":1,"160":2,"162":1}}],["ai",{"2":{"1":2,"9":1,"13":1,"17":1,"18":2,"19":1,"20":1,"22":1,"24":1,"45":1,"110":1,"113":1,"114":1,"136":1,"142":1,"147":2,"154":1}}],["a",{"0":{"27":1,"33":1,"41":1,"46":1,"51":1,"58":1,"59":1,"66":1,"71":1,"73":1,"75":1,"111":1,"114":1,"131":1,"138":1,"140":2},"2":{"1":1,"5":1,"6":1,"8":1,"9":1,"14":1,"17":3,"18":11,"19":1,"21":2,"22":1,"23":4,"24":3,"27":2,"33":1,"36":2,"37":1,"39":1,"41":3,"43":2,"45":1,"46":1,"47":1,"48":2,"49":2,"51":1,"52":1,"55":1,"57":1,"58":2,"60":2,"62":2,"67":1,"68":1,"69":1,"71":5,"77":1,"79":3,"81":2,"83":3,"85":2,"86":1,"87":2,"89":1,"90":1,"93":1,"95":2,"96":1,"97":4,"100":4,"102":1,"104":2,"110":2,"111":1,"112":1,"113":3,"114":2,"115":2,"116":1,"118":5,"119":3,"123":5,"125":1,"127":1,"128":2,"129":1,"131":2,"132":2,"135":4,"138":1,"139":1,"141":3,"143":3,"144":2,"145":4,"146":1,"147":1,"151":1,"152":1,"157":1,"160":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.C8Ng6z1P.js b/assets/chunks/@localSearchIndexroot.C8Ng6z1P.js deleted file mode 100644 index b5dba832..00000000 --- a/assets/chunks/@localSearchIndexroot.C8Ng6z1P.js +++ /dev/null @@ -1 +0,0 @@ -const e='{"documentCount":168,"nextId":168,"documentIds":{"0":"/blogs/2026-02-16.html#introduction-to-memoh-the-case-for-an-always-on-containerized-home-agent","1":"/blogs/2026-02-16.html#overview","2":"/blogs/2026-02-16.html#story-time","3":"/blogs/2026-02-16.html#what","4":"/blogs/2026-02-16.html#why","5":"/blogs/2026-02-16.html#how","6":"/blogs/2026-02-16.html#features","7":"/blogs/2026-02-16.html#compare-to-openclaw","8":"/blogs/2026-02-16.html#conclusion","9":"/blogs/#blogs","10":"/cli/auth.html#auth-commands","11":"/cli/auth.html#login","12":"/cli/auth.html#logout","13":"/cli/auth.html#whoami","14":"/cli/bot.html#bot-commands","15":"/cli/bot.html#bot-list","16":"/cli/bot.html#bot-create","17":"/cli/bot.html#bot-update","18":"/cli/bot.html#bot-delete","19":"/cli/bot.html#bot-chat","20":"/cli/bot.html#bot-set-model","21":"/cli/channel.html#channel-commands","22":"/cli/channel.html#channel-list","23":"/cli/channel.html#channel-info","24":"/cli/channel.html#channel-config-get","25":"/cli/channel.html#channel-config-set","26":"/cli/channel.html#channel-bind-get","27":"/cli/channel.html#channel-bind-set","28":"/cli/chat.html#chat-commands","29":"/cli/chat.html#default-interactive-chat","30":"/cli/chat.html#tui","31":"/cli/chat.html#version","32":"/cli/config.html#config-commands","33":"/cli/config.html#config","34":"/cli/config.html#config-set","35":"/cli/#memoh-cli","36":"/cli/#installation","37":"/cli/#configuration","38":"/cli/#commands","39":"/cli/provider.html#provider-commands","40":"/cli/provider.html#provider-list","41":"/cli/provider.html#provider-create","42":"/cli/provider.html#provider-delete","43":"/cli/model.html#model-commands","44":"/cli/model.html#model-list","45":"/cli/model.html#model-create","46":"/cli/model.html#model-delete","47":"/cli/schedule.html#schedule-commands","48":"/cli/schedule.html#schedule-list","49":"/cli/schedule.html#schedule-get","50":"/cli/schedule.html#schedule-create","51":"/cli/schedule.html#schedule-update","52":"/cli/schedule.html#schedule-toggle","53":"/cli/schedule.html#schedule-delete","54":"/concepts/bot.html#bot","55":"/concepts/bot.html#key-settings","56":"/concepts/bot.html#why-it-matters","57":"/concepts/bot.html#web-ui-path","58":"/concepts/channel.html#channel","59":"/concepts/channel.html#what-a-channel-configuration-defines","60":"/concepts/channel.html#why-it-matters","61":"/concepts/channel.html#web-ui-path","62":"/concepts/container.html#container","63":"/concepts/container.html#what-isolation-gives-you","64":"/concepts/container.html#why-it-matters","65":"/concepts/container.html#web-ui-path","66":"/concepts/conversation-and-history.html#conversation-and-history","67":"/concepts/conversation-and-history.html#what-this-includes","68":"/concepts/conversation-and-history.html#why-it-matters","69":"/concepts/conversation-and-history.html#web-ui-path","70":"/concepts/#concepts-overview","71":"/concepts/#concept-map","72":"/concepts/#recommended-reading-order","73":"/concepts/memory.html#memory","74":"/concepts/memory.html#how-it-works","75":"/concepts/memory.html#why-it-matters","76":"/concepts/memory.html#web-ui-path","77":"/concepts/mcp.html#mcp","78":"/concepts/mcp.html#what-mcp-adds","79":"/concepts/mcp.html#why-it-matters","80":"/concepts/mcp.html#web-ui-path","81":"/concepts/provider-and-model.html#provider-and-model","82":"/concepts/provider-and-model.html#client-types","83":"/concepts/provider-and-model.html#typical-setup","84":"/concepts/provider-and-model.html#model-assignment-to-bot","85":"/concepts/provider-and-model.html#web-ui-path","86":"/concepts/schedule.html#schedule","87":"/concepts/schedule.html#core-fields","88":"/concepts/schedule.html#why-it-matters","89":"/concepts/schedule.html#web-ui-path","90":"/concepts/skills.html#skills","91":"/concepts/skills.html#typical-skill-content","92":"/concepts/skills.html#why-it-matters","93":"/concepts/skills.html#web-ui-path","94":"/concepts/subagents.html#subagents","95":"/concepts/subagents.html#core-idea","96":"/concepts/subagents.html#why-it-matters","97":"/concepts/subagents.html#web-ui-path","98":"/getting-started.html#about-memoh","99":"/getting-started.html#what-is-memoh","100":"/getting-started.html#key-features","101":"/getting-started.html#multi-bot-management","102":"/getting-started.html#containerized-isolation","103":"/getting-started.html#memory-engineering","104":"/getting-started.html#multi-platform-support","105":"/getting-started.html#agent-capabilities","106":"/getting-started.html#multi-llm-provider-support","107":"/getting-started.html#mcp-protocol-support","108":"/getting-started.html#scheduled-tasks","109":"/getting-started.html#graphical-configuration","110":"/getting-started.html#cli-tool","111":"/getting-started.html#installation","112":"/getting-started/create-bot.html#create-bot","113":"/getting-started/create-bot.html#prerequisites","114":"/getting-started/create-bot.html#step-1-open-the-bot-page","115":"/getting-started/create-bot.html#step-2-create-a-bot","116":"/getting-started/create-bot.html#step-3-bot-configuration","117":"/getting-started/create-bot.html#step-4-check-bot","118":"/getting-started/create-bot.html#next-steps","119":"/getting-started/platform-telegram.html#configure-telegram-channel","120":"/getting-started/platform-telegram.html#prerequisites","121":"/getting-started/platform-telegram.html#step-1-create-a-telegram-bot","122":"/getting-started/platform-telegram.html#step-2-open-the-bot-platforms-page","123":"/getting-started/platform-telegram.html#step-3-add-telegram-channel","124":"/getting-started/platform-telegram.html#step-4-bind-your-telegram-account","125":"/getting-started/platform-telegram.html#step-6-test-the-connection","126":"/getting-started/platform-telegram.html#next-steps","127":"/#memoh-documentation","128":"/#documentation","129":"/getting-started/provider-and-model.html#configure-provider-and-model","130":"/getting-started/provider-and-model.html#prerequisites","131":"/getting-started/provider-and-model.html#step-1-open-the-models-page","132":"/getting-started/provider-and-model.html#step-2-add-a-provider","133":"/getting-started/provider-and-model.html#step-3-add-models","134":"/getting-started/provider-and-model.html#step-4-edit-or-delete","135":"/getting-started/provider-and-model.html#next-steps","136":"/installation/config-toml.html#config-toml-reference","137":"/installation/config-toml.html#full-example","138":"/installation/config-toml.html#section-reference","139":"/installation/config-toml.html#log","140":"/installation/config-toml.html#server","141":"/installation/config-toml.html#admin","142":"/installation/config-toml.html#auth","143":"/installation/config-toml.html#containerd","144":"/installation/config-toml.html#mcp","145":"/installation/config-toml.html#postgres","146":"/installation/config-toml.html#qdrant","147":"/installation/config-toml.html#agent-gateway","148":"/installation/config-toml.html#web","149":"/installation/docker.html#docker-installation","150":"/installation/docker.html#prerequisites","151":"/installation/docker.html#one-click-install-recommended","152":"/installation/docker.html#manual-install","153":"/installation/docker.html#china-mainland-mirror","154":"/installation/docker.html#access-points","155":"/installation/docker.html#common-commands","156":"/installation/docker.html#production-checklist","157":"/installation/docker.html#troubleshooting","158":"/installation/docker.html#security-warnings","159":"/troubleshooting.html#troubleshooting","160":"/troubleshooting.html#mcp-container-no-running-task-found-task-mcp-xxx-not-found","161":"/troubleshooting.html#symptom","162":"/troubleshooting.html#cause","163":"/troubleshooting.html#solution","164":"/troubleshooting.html#mcp-container-image-update-not-taking-effect-after-rebuild","165":"/troubleshooting.html#symptom-1","166":"/troubleshooting.html#cause-1","167":"/troubleshooting.html#solution-1"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[12,1,1],"1":[1,12,74],"2":[2,12,215],"3":[1,12,29],"4":[1,12,54],"5":[1,12,65],"6":[1,12,104],"7":[3,12,83],"8":[1,12,62],"9":[1,1,12],"10":[2,1,1],"11":[1,2,25],"12":[1,2,10],"13":[1,2,23],"14":[2,1,7],"15":[2,2,23],"16":[2,2,29],"17":[2,2,31],"18":[2,2,10],"19":[2,2,19],"20":[3,2,26],"21":[2,1,8],"22":[2,2,12],"23":[2,2,20],"24":[3,2,18],"25":[3,2,36],"26":[3,2,21],"27":[3,2,30],"28":[2,1,1],"29":[3,2,46],"30":[1,2,29],"31":[1,2,6],"32":[2,1,18],"33":[1,2,16],"34":[2,2,39],"35":[2,1,28],"36":[1,2,56],"37":[1,2,20],"38":[1,2,61],"39":[2,1,8],"40":[2,2,21],"41":[2,2,37],"42":[2,2,13],"43":[2,1,6],"44":[2,2,15],"45":[2,2,57],"46":[2,2,13],"47":[2,1,18],"48":[2,2,12],"49":[2,2,11],"50":[2,2,51],"51":[2,2,32],"52":[2,2,14],"53":[2,2,9],"54":[1,1,23],"55":[2,1,31],"56":[3,1,21],"57":[3,1,7],"58":[1,1,18],"59":[5,1,20],"60":[3,1,15],"61":[3,1,7],"62":[1,1,9],"63":[4,1,24],"64":[3,1,19],"65":[3,1,7],"66":[3,1,9],"67":[3,3,17],"68":[3,3,16],"69":[3,3,9],"70":[2,1,29],"71":[2,2,56],"72":[3,2,14],"73":[1,1,12],"74":[3,1,30],"75":[3,1,16],"76":[3,1,7],"77":[1,1,12],"78":[3,1,31],"79":[3,1,16],"80":[3,1,7],"81":[3,1,35],"82":[2,3,45],"83":[2,3,20],"84":[4,3,21],"85":[3,3,16],"86":[1,1,16],"87":[2,1,23],"88":[3,1,20],"89":[3,1,23],"90":[1,1,18],"91":[3,1,11],"92":[3,1,16],"93":[3,1,28],"94":[1,1,13],"95":[2,1,30],"96":[3,1,15],"97":[3,1,7],"98":[2,1,1],"99":[4,2,50],"100":[2,2,1],"101":[3,4,29],"102":[2,4,33],"103":[2,4,51],"104":[3,4,31],"105":[2,4,57],"106":[4,4,27],"107":[3,4,23],"108":[2,4,22],"109":[2,4,27],"110":[2,4,24],"111":[1,2,35],"112":[2,1,1],"113":[1,2,7],"114":[6,2,11],"115":[5,2,47],"116":[4,2,23],"117":[4,2,18],"118":[2,2,16],"119":[3,1,17],"120":[1,3,27],"121":[6,3,48],"122":[7,3,25],"123":[5,3,31],"124":[6,3,44],"125":[5,3,38],"126":[2,3,21],"127":[2,1,46],"128":[1,2,32],"129":[4,1,25],"130":[1,4,19],"131":[6,4,34],"132":[5,4,65],"133":[4,4,91],"134":[5,4,29],"135":[2,4,24],"136":[3,1,27],"137":[2,3,81],"138":[2,3,1],"139":[2,4,17],"140":[2,4,24],"141":[2,4,18],"142":[2,4,30],"143":[2,4,20],"144":[2,4,74],"145":[2,4,29],"146":[2,4,34],"147":[3,4,32],"148":[2,4,43],"149":[2,1,44],"150":[1,2,5],"151":[5,2,68],"152":[2,2,80],"153":[3,4,46],"154":[2,2,37],"155":[2,2,33],"156":[2,2,47],"157":[1,2,20],"158":[2,2,27],"159":[1,1,1],"160":[9,1,1],"161":[1,10,46],"162":[1,10,65],"163":[1,10,58],"164":[9,1,1],"165":[1,10,33],"166":[1,10,44],"167":[1,10,55]},"averageFieldLength":[2.5000000000000004,2.8452380952380953,28.660714285714285],"storedFields":{"0":{"title":"Introduction to Memoh - The Case for an Always-On, Containerized Home Agent","titles":[]},"1":{"title":"Overview","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"2":{"title":"Story Time","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"3":{"title":"What","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"4":{"title":"Why","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"5":{"title":"How","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"6":{"title":"Features","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"7":{"title":"Compare to OpenClaw","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"8":{"title":"Conclusion","titles":["Introduction to Memoh - The Case for an Always-On, Containerized Home Agent"]},"9":{"title":"Blogs","titles":[]},"10":{"title":"Auth Commands","titles":[]},"11":{"title":"login","titles":["Auth Commands"]},"12":{"title":"logout","titles":["Auth Commands"]},"13":{"title":"whoami","titles":["Auth Commands"]},"14":{"title":"Bot Commands","titles":[]},"15":{"title":"bot list","titles":["Bot Commands"]},"16":{"title":"bot create","titles":["Bot Commands"]},"17":{"title":"bot update","titles":["Bot Commands"]},"18":{"title":"bot delete","titles":["Bot Commands"]},"19":{"title":"bot chat","titles":["Bot Commands"]},"20":{"title":"bot set-model","titles":["Bot Commands"]},"21":{"title":"Channel Commands","titles":[]},"22":{"title":"channel list","titles":["Channel Commands"]},"23":{"title":"channel info","titles":["Channel Commands"]},"24":{"title":"channel config get","titles":["Channel Commands"]},"25":{"title":"channel config set","titles":["Channel Commands"]},"26":{"title":"channel bind get","titles":["Channel Commands"]},"27":{"title":"channel bind set","titles":["Channel Commands"]},"28":{"title":"Chat Commands","titles":[]},"29":{"title":"Default: Interactive Chat","titles":["Chat Commands"]},"30":{"title":"tui","titles":["Chat Commands"]},"31":{"title":"version","titles":["Chat Commands"]},"32":{"title":"Config Commands","titles":[]},"33":{"title":"config","titles":["Config Commands"]},"34":{"title":"config set","titles":["Config Commands"]},"35":{"title":"Memoh CLI","titles":[]},"36":{"title":"Installation","titles":["Memoh CLI"]},"37":{"title":"Configuration","titles":["Memoh CLI"]},"38":{"title":"Commands","titles":["Memoh CLI"]},"39":{"title":"Provider Commands","titles":[]},"40":{"title":"provider list","titles":["Provider Commands"]},"41":{"title":"provider create","titles":["Provider Commands"]},"42":{"title":"provider delete","titles":["Provider Commands"]},"43":{"title":"Model Commands","titles":[]},"44":{"title":"model list","titles":["Model Commands"]},"45":{"title":"model create","titles":["Model Commands"]},"46":{"title":"model delete","titles":["Model Commands"]},"47":{"title":"Schedule Commands","titles":[]},"48":{"title":"schedule list","titles":["Schedule Commands"]},"49":{"title":"schedule get","titles":["Schedule Commands"]},"50":{"title":"schedule create","titles":["Schedule Commands"]},"51":{"title":"schedule update","titles":["Schedule Commands"]},"52":{"title":"schedule toggle","titles":["Schedule Commands"]},"53":{"title":"schedule delete","titles":["Schedule Commands"]},"54":{"title":"Bot","titles":[]},"55":{"title":"Key Settings","titles":["Bot"]},"56":{"title":"Why It Matters","titles":["Bot"]},"57":{"title":"Web UI Path","titles":["Bot"]},"58":{"title":"Channel","titles":[]},"59":{"title":"What a Channel Configuration Defines","titles":["Channel"]},"60":{"title":"Why It Matters","titles":["Channel"]},"61":{"title":"Web UI Path","titles":["Channel"]},"62":{"title":"Container","titles":[]},"63":{"title":"What Isolation Gives You","titles":["Container"]},"64":{"title":"Why It Matters","titles":["Container"]},"65":{"title":"Web UI Path","titles":["Container"]},"66":{"title":"Conversation and History","titles":[]},"67":{"title":"What This Includes","titles":["Conversation and History"]},"68":{"title":"Why It Matters","titles":["Conversation and History"]},"69":{"title":"Web UI Path","titles":["Conversation and History"]},"70":{"title":"Concepts Overview","titles":[]},"71":{"title":"Concept Map","titles":["Concepts Overview"]},"72":{"title":"Recommended Reading Order","titles":["Concepts Overview"]},"73":{"title":"Memory","titles":[]},"74":{"title":"How It Works","titles":["Memory"]},"75":{"title":"Why It Matters","titles":["Memory"]},"76":{"title":"Web UI Path","titles":["Memory"]},"77":{"title":"MCP","titles":[]},"78":{"title":"What MCP Adds","titles":["MCP"]},"79":{"title":"Why It Matters","titles":["MCP"]},"80":{"title":"Web UI Path","titles":["MCP"]},"81":{"title":"Provider and Model","titles":[]},"82":{"title":"Client Types","titles":["Provider and Model"]},"83":{"title":"Typical Setup","titles":["Provider and Model"]},"84":{"title":"Model Assignment to Bot","titles":["Provider and Model"]},"85":{"title":"Web UI Path","titles":["Provider and Model"]},"86":{"title":"Schedule","titles":[]},"87":{"title":"Core Fields","titles":["Schedule"]},"88":{"title":"Why It Matters","titles":["Schedule"]},"89":{"title":"Web UI Path","titles":["Schedule"]},"90":{"title":"Skills","titles":[]},"91":{"title":"Typical Skill Content","titles":["Skills"]},"92":{"title":"Why It Matters","titles":["Skills"]},"93":{"title":"Web UI Path","titles":["Skills"]},"94":{"title":"Subagents","titles":[]},"95":{"title":"Core Idea","titles":["Subagents"]},"96":{"title":"Why It Matters","titles":["Subagents"]},"97":{"title":"Web UI Path","titles":["Subagents"]},"98":{"title":"About Memoh","titles":[]},"99":{"title":"What is Memoh?","titles":["About Memoh"]},"100":{"title":"Key Features","titles":["About Memoh"]},"101":{"title":"Multi-Bot Management","titles":["About Memoh","Key Features"]},"102":{"title":"Containerized Isolation","titles":["About Memoh","Key Features"]},"103":{"title":"Memory Engineering","titles":["About Memoh","Key Features"]},"104":{"title":"Multi-Platform Support","titles":["About Memoh","Key Features"]},"105":{"title":"Agent Capabilities","titles":["About Memoh","Key Features"]},"106":{"title":"Multi-LLM Provider Support","titles":["About Memoh","Key Features"]},"107":{"title":"MCP Protocol Support","titles":["About Memoh","Key Features"]},"108":{"title":"Scheduled Tasks","titles":["About Memoh","Key Features"]},"109":{"title":"Graphical Configuration","titles":["About Memoh","Key Features"]},"110":{"title":"CLI Tool","titles":["About Memoh","Key Features"]},"111":{"title":"Installation","titles":["About Memoh"]},"112":{"title":"Create Bot","titles":[]},"113":{"title":"Prerequisites","titles":["Create Bot"]},"114":{"title":"Step 1: Open the Bot Page","titles":["Create Bot"]},"115":{"title":"Step 2: create a Bot","titles":["Create Bot"]},"116":{"title":"Step 3: Bot Configuration","titles":["Create Bot"]},"117":{"title":"Step 4: Check Bot","titles":["Create Bot"]},"118":{"title":"Next Steps","titles":["Create Bot"]},"119":{"title":"Configure Telegram Channel","titles":[]},"120":{"title":"Prerequisites","titles":["Configure Telegram Channel"]},"121":{"title":"Step 1: Create a Telegram Bot","titles":["Configure Telegram Channel"]},"122":{"title":"Step 2: Open the Bot Platforms Page","titles":["Configure Telegram Channel"]},"123":{"title":"Step 3: Add Telegram Channel","titles":["Configure Telegram Channel"]},"124":{"title":"Step 4: Bind Your Telegram Account","titles":["Configure Telegram Channel"]},"125":{"title":"Step 6: Test the Connection","titles":["Configure Telegram Channel"]},"126":{"title":"Next Steps","titles":["Configure Telegram Channel"]},"127":{"title":"Memoh Documentation","titles":[]},"128":{"title":"Documentation","titles":["Memoh Documentation"]},"129":{"title":"Configure Provider and Model","titles":[]},"130":{"title":"Prerequisites","titles":["Configure Provider and Model"]},"131":{"title":"Step 1: Open the Models Page","titles":["Configure Provider and Model"]},"132":{"title":"Step 2: Add a Provider","titles":["Configure Provider and Model"]},"133":{"title":"Step 3: Add Models","titles":["Configure Provider and Model"]},"134":{"title":"Step 4: Edit or Delete","titles":["Configure Provider and Model"]},"135":{"title":"Next Steps","titles":["Configure Provider and Model"]},"136":{"title":"config.toml Reference","titles":[]},"137":{"title":"Full Example","titles":["config.toml Reference"]},"138":{"title":"Section Reference","titles":["config.toml Reference"]},"139":{"title":"[log]","titles":["config.toml Reference","Section Reference"]},"140":{"title":"[server]","titles":["config.toml Reference","Section Reference"]},"141":{"title":"[admin]","titles":["config.toml Reference","Section Reference"]},"142":{"title":"[auth]","titles":["config.toml Reference","Section Reference"]},"143":{"title":"[containerd]","titles":["config.toml Reference","Section Reference"]},"144":{"title":"[mcp]","titles":["config.toml Reference","Section Reference"]},"145":{"title":"[postgres]","titles":["config.toml Reference","Section Reference"]},"146":{"title":"[qdrant]","titles":["config.toml Reference","Section Reference"]},"147":{"title":"[agent_gateway]","titles":["config.toml Reference","Section Reference"]},"148":{"title":"[web]","titles":["config.toml Reference","Section Reference"]},"149":{"title":"Docker Installation","titles":[]},"150":{"title":"Prerequisites","titles":["Docker Installation"]},"151":{"title":"One-Click Install (Recommended)","titles":["Docker Installation"]},"152":{"title":"Manual Install","titles":["Docker Installation"]},"153":{"title":"China Mainland Mirror","titles":["Docker Installation","Manual Install"]},"154":{"title":"Access Points","titles":["Docker Installation"]},"155":{"title":"Common Commands","titles":["Docker Installation"]},"156":{"title":"Production Checklist","titles":["Docker Installation"]},"157":{"title":"Troubleshooting","titles":["Docker Installation"]},"158":{"title":"Security Warnings","titles":["Docker Installation"]},"159":{"title":"Troubleshooting","titles":[]},"160":{"title":"MCP Container: no running task found: task mcp-xxx not found","titles":["Troubleshooting"]},"161":{"title":"Symptom","titles":["Troubleshooting","MCP Container: no running task found: task mcp-xxx not found"]},"162":{"title":"Cause","titles":["Troubleshooting","MCP Container: no running task found: task mcp-xxx not found"]},"163":{"title":"Solution","titles":["Troubleshooting","MCP Container: no running task found: task mcp-xxx not found"]},"164":{"title":"MCP Container: Image update not taking effect after rebuild","titles":["Troubleshooting"]},"165":{"title":"Symptom","titles":["Troubleshooting","MCP Container: Image update not taking effect after rebuild"]},"166":{"title":"Cause","titles":["Troubleshooting","MCP Container: Image update not taking effect after rebuild"]},"167":{"title":"Solution","titles":["Troubleshooting","MCP Container: Image update not taking effect after rebuild"]}},"dirtCount":0,"index":[["$path",{"2":{"165":1}}],["xxx",{"0":{"160":1},"1":{"161":1,"162":1,"163":1},"2":{"161":1,"162":1}}],["x26",{"2":{"155":2,"157":2}}],["x3c",{"2":{"29":1,"30":1,"42":1,"46":1,"48":1,"49":2,"50":1,"51":2,"52":2,"53":2,"163":1}}],["|",{"2":{"151":2}}],["→",{"2":{"144":1}}],["7",{"2":{"142":1}}],["ˈmemoʊ",{"2":{"127":1}}],["5432",{"2":{"137":1,"145":1}}],["5",{"2":{"125":1}}],["6334",{"2":{"137":1,"146":1}}],["6",{"0":{"125":1}}],["8081",{"2":{"137":1,"147":1,"154":1}}],["8082",{"2":{"120":1,"130":1,"137":1,"148":1,"154":1}}],["8080",{"2":{"33":1,"34":2,"36":1,"137":2,"140":3,"147":2,"154":1}}],["qq",{"2":{"115":1}}],["qdrant",{"0":{"146":1},"2":{"103":1,"111":1,"137":1,"146":2,"149":1,"156":1}}],["quot",{"2":{"139":4,"140":2,"141":2,"142":6,"143":4,"144":14,"145":8,"146":6,"147":8,"148":2,"153":2}}],["quality",{"2":{"84":1}}],["quarter",{"2":{"1":1}}],["quit",{"2":{"19":1,"29":1}}],["quietly",{"2":{"2":1}}],["questions",{"2":{"1":2}}],["9am",{"2":{"50":1}}],["9",{"2":{"50":1}}],["32",{"2":{"137":1,"142":1,"152":1}}],["3",{"0":{"116":1,"123":1,"133":1},"2":{"45":2,"133":2}}],["10",{"2":{"137":1,"146":1}}],["100",{"2":{"34":1}}],["123456789",{"2":{"121":1,"123":1}}],["127",{"2":{"33":1,"34":1,"36":1,"137":4,"145":1,"146":1,"147":1,"148":1}}],["1536",{"2":{"45":1,"133":1}}],["11434",{"2":{"41":1,"132":2}}],["168h",{"2":{"137":1,"142":1}}],["168",{"2":{"34":1}}],["192",{"2":{"34":1}}],["1",{"0":{"114":1,"121":1,"131":1},"2":{"33":1,"34":2,"36":1,"137":4,"145":1,"146":1,"147":1,"148":1,"154":1}}],["0",{"2":{"33":2,"34":2,"36":2,"50":1,"137":8,"145":2,"146":2,"147":2,"148":2}}],["=",{"2":{"33":2,"137":29,"153":1,"161":2,"163":1}}],["4",{"0":{"117":1,"124":1,"134":1},"2":{"20":1,"45":2,"46":1,"133":2}}],["~",{"2":{"11":1,"32":1,"37":2,"151":2}}],["+",{"2":{"7":1}}],["js",{"2":{"165":1,"167":1}}],["json",{"2":{"11":1,"37":1,"139":1}}],["jina",{"2":{"148":1}}],["jwt",{"2":{"11":1,"137":2,"142":4,"151":2,"152":1}}],["jobs",{"2":{"7":1}}],["just",{"2":{"2":1}}],["2",{"0":{"115":1,"122":1,"132":1},"2":{"133":2,"154":1}}],["24h",{"2":{"142":2}}],["24",{"2":{"6":1,"103":1}}],["2026",{"2":{"1":1,"9":1}}],["volume",{"2":{"162":1,"166":1}}],["v2",{"2":{"150":1}}],["v1",{"2":{"41":1,"132":4}}],["visible",{"2":{"93":1}}],["via",{"2":{"34":1,"35":1,"99":1,"103":1,"106":1,"107":1,"119":1,"127":1,"135":1,"149":1,"156":1}}],["view",{"2":{"32":1,"37":1,"155":1,"157":1}}],["validate",{"2":{"157":1}}],["value",{"2":{"1":1}}],["var",{"2":{"152":1}}],["various",{"2":{"6":1}}],["verify",{"2":{"145":2,"167":1}}],["verification",{"2":{"25":2}}],["version",{"0":{"31":1},"2":{"31":2,"38":2}}],["versioned",{"2":{"5":1}}],["vector",{"2":{"5":1,"74":1,"103":1,"146":1}}],["ui",{"0":{"57":1,"61":1,"65":1,"69":1,"76":1,"80":1,"85":1,"89":1,"93":1,"97":1},"2":{"30":1,"38":1,"56":1,"89":2,"109":1,"120":1,"122":1,"124":1,"129":1,"130":1,"148":3,"149":1,"154":1}}],["using",{"2":{"108":1}}],["usually",{"2":{"83":1}}],["usage",{"2":{"20":1}}],["uses",{"2":{"136":1,"147":1,"162":1,"167":1}}],["used",{"2":{"55":1}}],["use",{"2":{"6":1,"7":1,"29":1,"32":1,"36":1,"37":1,"70":1,"81":1,"132":1,"134":1,"140":1,"147":2,"151":1,"153":1,"158":2,"161":1,"162":1}}],["username",{"2":{"11":2,"13":1,"121":1,"137":1,"141":2}}],["users",{"2":{"5":1,"59":1,"60":1,"67":1,"119":1,"153":1,"162":2}}],["user",{"2":{"2":1,"7":1,"13":2,"15":2,"21":1,"26":1,"27":4,"38":2,"115":1,"137":1,"145":2,"152":1,"155":1}}],["url",{"2":{"16":2,"17":2,"41":4,"115":1,"132":4,"134":1,"137":1,"146":2,"154":1}}],["updating",{"2":{"165":1}}],["update",{"0":{"17":1,"51":1,"164":1},"1":{"165":1,"166":1,"167":1},"2":{"17":2,"32":1,"34":1,"38":3,"51":2,"155":1,"163":1}}],["up",{"2":{"6":1,"101":1,"109":1,"126":1,"152":1,"153":1,"155":2,"157":1,"163":1}}],["upgradable",{"2":{"5":1}}],["uncomment",{"2":{"137":1,"153":1}}],["uncomfortable",{"2":{"4":1}}],["unified",{"2":{"78":1,"104":1}}],["units",{"2":{"95":1}}],["unit",{"2":{"71":1}}],["unlimited",{"2":{"50":1}}],["understand",{"2":{"70":1}}],["under",{"2":{"3":1,"81":1,"133":1,"148":1}}],["rm",{"2":{"163":1,"167":1}}],["rpc",{"2":{"161":1}}],["right",{"2":{"131":1,"133":1,"134":1}}],["rich",{"2":{"105":1}}],["rule",{"2":{"86":1}}],["runc",{"2":{"162":1}}],["running",{"0":{"160":1},"1":{"161":1,"162":1,"163":1},"2":{"29":1,"35":1,"36":1,"111":1,"120":1,"130":1,"151":1,"152":1,"161":1}}],["runs",{"2":{"6":1,"62":1,"86":1,"102":1,"127":1,"144":1,"149":1,"158":1}}],["runtime",{"2":{"5":1,"54":1,"63":1,"71":1,"93":1}}],["run",{"2":{"4":1,"5":1,"6":1,"8":1,"36":1,"38":1,"50":1,"64":1,"87":1,"108":1,"127":1,"137":1,"143":1,"149":1,"151":1,"158":1,"163":1}}],["root",{"2":{"136":1,"137":1,"144":1,"162":2,"163":2}}],["routing",{"2":{"59":1}}],["router",{"2":{"2":3,"5":2}}],["role",{"2":{"13":1,"96":1}}],["rand",{"2":{"137":1,"142":1,"152":1}}],["range",{"2":{"106":1}}],["raise",{"2":{"4":1}}],["ram",{"2":{"2":1}}],["rag",{"2":{"2":1,"3":1}}],["rebuilt",{"2":{"166":1}}],["rebuilding",{"2":{"165":1}}],["rebuild",{"0":{"164":1},"1":{"165":1,"166":1,"167":1},"2":{"157":1}}],["regular",{"2":{"156":1}}],["registry",{"2":{"137":1,"144":3,"153":2}}],["reverse",{"2":{"156":1}}],["ref",{"2":{"144":1}}],["reference",{"0":{"136":1,"138":1},"1":{"137":1,"138":1,"139":2,"140":2,"141":2,"142":2,"143":2,"144":2,"145":2,"146":2,"147":2,"148":2},"2":{"84":1,"111":1,"128":1}}],["request",{"2":{"146":1,"162":1}}],["requests",{"2":{"95":1}}],["requires",{"2":{"125":1,"151":1}}],["require",{"2":{"38":1,"47":1,"145":1}}],["required",{"2":{"6":1,"45":1,"109":1,"133":1,"142":1,"152":1}}],["reliable",{"2":{"95":1}}],["related",{"2":{"93":1}}],["relevant",{"2":{"74":1}}],["reduce",{"2":{"92":1}}],["recreate",{"2":{"167":1}}],["recurring",{"2":{"88":1}}],["recall",{"2":{"74":1}}],["recommended",{"0":{"72":1,"151":1},"2":{"111":1,"128":1,"149":1}}],["recent",{"2":{"55":1}}],["reusable",{"2":{"71":1,"90":1}}],["repository",{"2":{"151":1}}],["replies",{"2":{"104":1}}],["reply",{"2":{"59":1}}],["reproducible",{"2":{"4":1}}],["restarts",{"2":{"166":1}}],["restarting",{"2":{"165":1}}],["restart",{"2":{"163":2,"167":2}}],["restrict",{"2":{"156":1}}],["resource",{"2":{"156":1}}],["resources",{"2":{"56":1}}],["respond",{"2":{"125":1}}],["responsibilities",{"2":{"96":1}}],["response",{"2":{"68":1}}],["responses",{"2":{"29":1,"45":2,"82":2,"106":1,"133":2}}],["results",{"2":{"95":1}}],["reach",{"2":{"147":1}}],["reachable",{"2":{"36":1}}],["reactions",{"2":{"105":1}}],["reactive",{"2":{"88":1}}],["read",{"2":{"102":1,"105":1}}],["ready",{"2":{"83":1}}],["reading",{"0":{"72":1}}],["realized",{"2":{"2":1}}],["reality",{"2":{"1":1}}],["real",{"2":{"1":2,"2":4,"7":1,"29":1,"105":1}}],["retrieved",{"2":{"6":1,"71":1,"74":1}}],["retrieval",{"2":{"5":1,"74":2,"83":1,"103":1}}],["remove",{"2":{"167":1}}],["remote",{"2":{"78":1}}],["reminders",{"2":{"88":1}}],["remains",{"2":{"5":1}}],["remember",{"2":{"2":1,"7":1}}],["re",{"2":{"4":1,"167":1}}],["gateway",{"0":{"147":1},"2":{"137":1,"147":2,"149":1,"154":1}}],["guide",{"2":{"90":1,"119":1,"129":1}}],["google",{"2":{"45":1,"82":2,"106":1,"133":1,"148":1}}],["got",{"2":{"2":1}}],["global",{"2":{"36":2}}],["git",{"2":{"36":1,"150":1,"152":1}}],["github",{"2":{"36":1,"152":1}}],["gives",{"0":{"63":1}}],["give",{"2":{"2":1,"7":1}}],["g",{"2":{"22":1,"25":1,"27":1,"34":1,"45":1,"50":1,"115":3,"118":1,"121":3,"123":1,"132":2,"133":2,"140":1,"142":1,"144":1,"156":1,"161":1,"162":1,"165":1}}],["gpt",{"2":{"20":1,"45":2,"46":1,"133":2}}],["gt",{"2":{"15":1,"16":3,"17":2,"20":2,"24":1,"25":5,"26":1,"27":3,"29":2,"30":1,"34":2,"40":1,"41":3,"45":6,"47":1,"50":5,"51":5,"57":2,"61":2,"65":2,"69":3,"76":2,"80":2,"85":6,"93":2,"97":2}}],["group",{"2":{"115":2,"125":1,"152":1,"155":1}}],["groups",{"2":{"6":1,"101":1}}],["gravatar",{"2":{"115":1}}],["graphical",{"0":{"109":1},"2":{"6":1}}],["grade",{"2":{"3":1}}],["generate",{"2":{"124":1,"142":1,"151":1,"152":1}}],["generated",{"2":{"2":1,"151":1}}],["generation",{"2":{"83":1}}],["generative",{"2":{"45":1,"82":2,"106":1,"133":1}}],["getting",{"2":{"128":1}}],["gets",{"2":{"7":1}}],["get",{"0":{"24":1,"26":1,"49":1},"2":{"1":1,"24":2,"26":2,"38":2,"49":2,"111":1,"124":1}}],["yes",{"2":{"153":1}}],["year",{"2":{"1":1,"2":1}}],["yml",{"2":{"152":1,"153":2,"156":1,"163":1}}],["y",{"2":{"151":1}}],["yandex",{"2":{"148":1}}],["yours",{"2":{"8":1}}],["your",{"0":{"124":1},"2":{"2":1,"3":1,"6":1,"29":1,"36":1,"99":1,"109":1,"116":1,"117":1,"118":1,"119":2,"121":2,"124":1,"125":2,"126":2,"127":1,"132":1,"137":3,"149":1,"151":1,"152":1,"155":1,"163":2}}],["you",{"0":{"63":1},"2":{"2":5,"5":1,"8":1,"29":1,"70":1,"79":1,"88":1,"99":1,"119":1,"120":2,"121":1,"122":1,"124":1,"129":2,"130":1,"132":1,"133":1,"134":1,"135":2,"149":1,"152":1,"153":1,"158":1,"162":2,"163":1}}],["knowledge",{"2":{"3":1,"71":1,"73":1}}],["keyword",{"2":{"74":1,"103":1}}],["key",{"0":{"55":1,"100":1},"1":{"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1},"2":{"25":3,"41":3,"81":1,"103":1,"128":1,"132":4,"134":1,"137":1,"146":2}}],["keeping",{"2":{"56":1}}],["keep",{"2":{"2":1,"8":2,"92":1,"103":1,"163":1}}],["kept",{"2":{"1":1}}],["kind",{"2":{"2":1}}],["d",{"2":{"144":1,"152":1,"153":1,"155":2,"157":1}}],["duckduckgo",{"2":{"148":1}}],["duplication",{"2":{"92":1}}],["durable",{"2":{"4":1,"5":1,"8":1}}],["data",{"2":{"137":2,"144":4,"151":3,"156":1,"162":5,"163":3,"166":1}}],["database",{"2":{"6":1,"103":1,"137":1,"145":4,"152":1}}],["daily",{"2":{"50":1,"101":1}}],["days",{"2":{"142":1}}],["day",{"2":{"4":1}}],["db",{"2":{"5":1,"152":1}}],["down",{"2":{"155":1}}],["do",{"2":{"149":1}}],["documentation",{"0":{"127":1,"128":1},"1":{"128":1},"2":{"110":1}}],["dockerfile",{"2":{"165":1}}],["docker",{"0":{"149":1},"1":{"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1},"2":{"36":1,"111":2,"120":1,"128":1,"130":1,"136":3,"140":1,"144":3,"147":2,"149":2,"150":2,"151":5,"152":4,"153":5,"155":6,"156":1,"157":3,"162":1,"163":5,"166":2,"167":1}}],["don",{"2":{"2":2,"4":2}}],["doing",{"2":{"2":1}}],["doesn",{"2":{"2":1}}],["does",{"2":{"1":1,"162":1}}],["debug",{"2":{"139":1}}],["debugging",{"2":{"67":1}}],["detail",{"2":{"167":1}}],["details",{"2":{"131":1,"136":1}}],["detection",{"2":{"103":1}}],["determines",{"2":{"81":1,"82":1}}],["developers",{"2":{"110":1}}],["device",{"2":{"2":1,"5":1,"7":1}}],["deeply",{"2":{"103":1}}],["dedicated",{"2":{"89":1}}],["designed",{"2":{"70":1,"110":1}}],["design",{"2":{"70":1}}],["desc",{"2":{"50":1,"51":1,"161":1}}],["description",{"2":{"15":1,"16":1,"17":1,"20":1,"24":1,"25":1,"26":1,"27":1,"29":1,"30":1,"34":1,"38":1,"40":1,"41":1,"45":1,"50":4,"51":3,"82":1,"115":1,"123":1,"132":1,"133":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1}}],["decomposition",{"2":{"95":1}}],["decouple",{"2":{"60":1}}],["decide",{"2":{"2":1}}],["delegate",{"2":{"94":1,"105":1}}],["delegated",{"2":{"71":1}}],["delete",{"0":{"18":1,"42":1,"46":1,"53":1,"134":1},"2":{"18":2,"38":4,"42":3,"46":3,"53":2,"63":1,"134":2,"161":1,"167":1}}],["delivery",{"2":{"59":1}}],["defined",{"2":{"86":1}}],["defines",{"0":{"59":1}}],["defaults",{"2":{"151":2}}],["default",{"0":{"29":1},"2":{"6":1,"7":1,"30":1,"34":1,"36":1,"38":1,"55":1,"103":1,"137":1,"139":1,"140":1,"141":1,"142":1,"143":2,"144":1,"145":1,"146":1,"147":1,"148":1,"152":1,"154":1,"156":1,"158":1,"163":1,"166":1,"167":2}}],["deployments",{"2":{"136":1}}],["deployable",{"2":{"5":1}}],["dependencies",{"2":{"111":1}}],["dependable",{"2":{"4":1}}],["density",{"2":{"2":2}}],["dir",{"2":{"144":2}}],["directly",{"2":{"153":1}}],["directory",{"2":{"144":2,"151":2,"162":1}}],["direct",{"2":{"125":1}}],["dialog",{"2":{"83":1,"115":1,"123":1,"124":1,"132":1,"133":1}}],["different",{"2":{"70":1,"133":1}}],["differs",{"2":{"7":1}}],["dimensions",{"2":{"45":4,"133":1}}],["discord",{"2":{"115":1,"118":1}}],["discovery",{"2":{"78":1}}],["disable",{"2":{"51":1,"52":1,"137":1,"145":2}}],["disabled",{"2":{"50":2,"51":1}}],["disappears",{"2":{"2":1}}],["display",{"2":{"13":1,"16":1,"17":1,"45":1,"115":1,"121":1,"132":1,"133":2,"141":1}}],["did",{"2":{"2":1}}],["npx",{"2":{"165":1}}],["n",{"2":{"45":1,"50":1,"51":1,"163":1,"166":1,"167":2}}],["narrower",{"2":{"95":1}}],["name==$",{"2":{"166":1}}],["named",{"2":{"162":1}}],["names",{"2":{"144":1}}],["namespace",{"2":{"137":1,"143":2}}],["name>",{"2":{"42":1}}],["name",{"2":{"13":1,"16":4,"17":3,"40":3,"41":4,"42":1,"45":4,"50":4,"51":3,"115":2,"121":2,"132":4,"133":2,"134":1,"145":1,"146":1,"147":1}}],["natural",{"2":{"1":1}}],["never",{"2":{"166":1}}],["nerdctl",{"2":{"149":1}}],["net",{"2":{"144":1}}],["network",{"2":{"6":1,"7":1,"99":1,"102":1,"127":1}}],["necessary",{"2":{"124":1,"156":1}}],["next",{"0":{"118":1,"126":1,"135":1},"2":{"121":1}}],["needs",{"2":{"83":1}}],["needed",{"2":{"74":1}}],["need",{"2":{"5":1,"121":1,"129":1,"133":1,"149":1}}],["newbot",{"2":{"121":1}}],["new",{"2":{"2":1,"16":1,"41":1,"45":1,"50":1,"115":1,"132":1,"166":1,"167":2}}],["normalized",{"2":{"144":1}}],["nomic",{"2":{"133":1}}],["none",{"2":{"131":1}}],["no",{"0":{"160":1},"1":{"161":1,"162":1,"163":1},"2":{"6":1,"29":1,"89":1,"109":1,"111":1,"151":1,"157":1,"161":1,"162":1}}],["node",{"2":{"2":1,"5":1,"165":1,"167":1}}],["note",{"2":{"163":1}}],["notfound",{"2":{"161":1}}],["noticed",{"2":{"2":1}}],["not",{"0":{"160":1,"164":1},"1":{"161":1,"162":1,"163":1,"165":1,"166":1,"167":1},"2":{"1":1,"2":3,"5":1,"34":1,"88":1,"89":1,"148":1,"149":1,"152":1,"155":1,"161":3,"162":1,"165":1}}],["night",{"2":{"2":1}}],["io",{"2":{"144":1,"167":1}}],["image",{"0":{"164":1},"1":{"165":1,"166":1,"167":1},"2":{"137":1,"144":6,"165":1,"166":7,"167":3}}],["images",{"2":{"133":1,"151":1,"154":1,"155":1,"166":1,"167":2}}],["imported",{"2":{"166":1,"167":1}}],["import",{"2":{"166":2,"167":1}}],["important",{"2":{"74":1,"152":1}}],["improves",{"2":{"96":1}}],["impact",{"2":{"8":1}}],["icon",{"2":{"115":1,"132":1}}],["id=xxx",{"2":{"161":1}}],["identity",{"2":{"124":1}}],["idea",{"0":{"95":1}}],["ids",{"2":{"55":1,"84":1}}],["id>",{"2":{"29":1,"30":1,"46":1,"48":1,"49":2,"50":1,"51":2,"52":2,"53":2,"163":1}}],["id",{"2":{"13":1,"15":2,"17":2,"18":1,"19":1,"20":4,"24":1,"25":4,"27":8,"29":3,"30":2,"45":6,"46":1,"47":1,"49":1,"84":3,"133":1}}],["if",{"2":{"2":1,"8":1,"13":1,"23":1,"34":1,"124":1,"131":1,"133":1,"152":1,"155":1,"163":2,"166":1,"167":1}}],["initialize",{"2":{"154":1}}],["inside",{"2":{"105":1,"149":1,"162":2}}],["inspired",{"2":{"103":1}}],["instead",{"2":{"163":1}}],["instructions",{"2":{"71":1,"90":1}}],["install",{"0":{"151":1,"152":1},"1":{"153":1},"2":{"36":2,"149":1,"151":2,"153":1}}],["installation",{"0":{"36":1,"111":1,"149":1},"1":{"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1},"2":{"36":1,"120":1,"128":2,"130":1,"136":1}}],["instinct",{"2":{"2":1}}],["independent",{"2":{"99":1,"107":1}}],["indexed",{"2":{"74":1}}],["indexing",{"2":{"5":1,"7":1,"83":1}}],["index",{"2":{"5":1}}],["input",{"2":{"91":1}}],["including",{"2":{"81":1,"106":1}}],["includes",{"0":{"67":1},"2":{"111":1,"149":1}}],["include",{"2":{"58":1}}],["invocation",{"2":{"78":1}}],["invoked",{"2":{"30":1}}],["inactive",{"2":{"16":2,"17":2}}],["in",{"2":{"2":1,"4":1,"6":3,"7":1,"8":1,"11":2,"13":1,"29":1,"32":1,"37":2,"38":1,"50":1,"54":1,"56":1,"62":1,"64":1,"71":1,"81":1,"84":1,"89":2,"101":1,"102":1,"104":1,"105":1,"114":1,"115":2,"116":1,"117":1,"120":1,"121":1,"122":2,"123":2,"124":1,"125":1,"127":1,"130":1,"131":1,"132":3,"133":1,"134":2,"135":2,"136":1,"137":1,"140":1,"141":1,"142":1,"144":1,"146":1,"147":2,"148":1,"152":1,"153":2,"154":1,"155":1,"156":1,"158":2,"162":1,"163":2,"165":1,"166":2}}],["info",{"0":{"23":1},"2":{"13":1,"17":1,"23":1,"137":1,"139":2}}],["information",{"2":{"2":1,"105":1}}],["inference",{"2":{"5":1,"7":1,"8":1}}],["infrastructure",{"2":{"2":1,"4":1,"7":1,"8":1}}],["inflate",{"2":{"2":1}}],["int",{"2":{"145":1,"146":1,"147":1,"148":1}}],["integration",{"2":{"71":1,"78":1,"105":1}}],["interfering",{"2":{"63":1,"102":1}}],["interfaces",{"2":{"140":1}}],["interface",{"2":{"6":1,"104":1}}],["interactions",{"2":{"66":1}}],["interaction",{"2":{"55":1}}],["interactively",{"2":{"17":1}}],["interactive",{"0":{"29":1},"2":{"11":1,"19":1,"29":1,"34":1,"38":1,"41":1,"45":1}}],["internet",{"2":{"2":1}}],["intelligence",{"2":{"2":1}}],["into",{"2":{"1":1,"2":1,"55":1,"95":2}}],["introduction",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"9":1}}],["iterate",{"2":{"7":1}}],["its",{"2":{"6":1,"32":1,"35":1,"54":1,"62":1,"81":1,"99":2,"102":1,"107":1,"125":1,"127":1}}],["it",{"0":{"56":1,"60":1,"64":1,"68":1,"74":1,"75":1,"79":1,"88":1,"92":1,"96":1},"2":{"2":9,"7":2,"8":1,"32":1,"35":1,"99":1,"121":1,"152":1,"162":1,"163":1,"167":2}}],["i",{"2":{"2":7}}],["isolation",{"0":{"63":1,"102":1},"2":{"64":1}}],["isolate",{"2":{"56":1}}],["isolated",{"2":{"5":1,"6":1,"7":1,"62":1,"71":1,"102":1,"127":1}}],["is",{"0":{"99":1},"2":{"1":1,"2":3,"3":1,"5":2,"6":2,"8":2,"23":1,"35":1,"36":3,"54":1,"55":1,"64":1,"70":1,"71":2,"73":1,"81":2,"86":1,"87":1,"89":2,"93":1,"99":1,"120":1,"127":1,"128":1,"130":1,"149":1,"152":2,"155":1,"162":1,"166":2}}],["hub",{"2":{"144":1,"153":1}}],["humans",{"2":{"6":1,"101":1}}],["human",{"2":{"2":1}}],["http",{"2":{"41":1,"107":1,"120":1,"130":1,"132":2,"137":1,"140":1,"146":2,"154":3}}],["https",{"2":{"36":1,"115":1,"132":2,"151":2,"152":1,"156":1,"158":1}}],["helps",{"2":{"96":1}}],["helper",{"2":{"94":1}}],["help",{"2":{"36":2,"92":1}}],["held",{"2":{"7":1}}],["hybrid",{"2":{"7":1}}],["hoc",{"2":{"68":1}}],["host",{"2":{"33":2,"34":6,"36":1,"37":1,"38":1,"111":1,"137":3,"140":1,"144":1,"145":2,"147":2,"148":2,"149":1,"162":2}}],["hours",{"2":{"6":1,"103":1}}],["how",{"0":{"5":1,"74":1},"2":{"55":1,"70":2,"71":4,"82":1,"90":1}}],["home",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"2":2,"3":1,"7":1,"8":1}}],["history",{"0":{"66":1},"1":{"67":1,"68":1,"69":1},"2":{"3":1,"66":1,"68":1,"69":1,"71":1,"72":1}}],["hide",{"2":{"2":1}}],["handles",{"2":{"153":1}}],["have",{"2":{"7":1,"107":1,"120":2,"125":1,"130":1,"135":1}}],["having",{"2":{"6":1,"99":1}}],["has",{"2":{"2":1,"54":1,"82":1,"99":1,"124":1,"131":1}}],["half",{"2":{"2":1}}],["happening",{"2":{"2":1}}],["hardware",{"2":{"1":1,"2":1}}],["ls",{"2":{"167":1}}],["least",{"2":{"129":1,"133":1,"135":1}}],["lean",{"2":{"103":1}}],["left",{"2":{"114":1,"117":1,"122":1,"131":2,"132":2,"133":1}}],["level=error",{"2":{"161":1}}],["level=warn",{"2":{"161":1}}],["level",{"2":{"67":1,"137":1,"139":2}}],["less",{"2":{"8":1}}],["lt",{"2":{"15":1,"16":3,"17":2,"20":2,"24":1,"25":5,"26":1,"27":3,"29":2,"30":1,"34":2,"40":1,"41":3,"45":6,"47":1,"50":5,"51":5}}],["larger",{"2":{"167":1}}],["lark",{"2":{"6":1,"58":1,"99":1,"104":1,"118":1,"127":1}}],["language",{"2":{"55":2,"103":1}}],["last",{"2":{"6":1,"103":1}}],["layer",{"2":{"2":1,"3":1,"103":1}}],["latest",{"2":{"9":1,"137":1,"144":3,"155":1,"167":1}}],["late",{"2":{"2":1}}],["latency",{"2":{"1":1,"84":1}}],["library",{"2":{"167":1}}],["limits",{"2":{"108":1,"156":2}}],["linux",{"2":{"155":1}}],["links",{"2":{"128":1}}],["linked",{"2":{"124":1}}],["link",{"2":{"36":1}}],["line",{"2":{"35":1,"104":1,"110":1,"128":1,"153":1}}],["listen",{"2":{"140":1}}],["list",{"0":{"15":1,"22":1,"40":1,"44":1,"48":1},"2":{"15":2,"22":2,"38":5,"40":4,"44":2,"48":2,"131":1,"133":1,"134":1}}],["lighter",{"2":{"7":1}}],["lifecycle",{"2":{"54":1,"63":1}}],["life",{"2":{"2":1}}],["live",{"2":{"2":1}}],["like",{"2":{"2":1,"5":1,"6":1,"8":2,"82":1,"88":1,"99":1,"132":2,"165":1}}],["loads",{"2":{"103":1}}],["load",{"2":{"55":2}}],["loaded",{"2":{"6":1,"55":1}}],["logs",{"2":{"155":2,"157":2,"161":2}}],["logic",{"2":{"60":1}}],["login",{"0":{"11":1},"2":{"11":1,"38":2,"141":2,"154":1}}],["logged",{"2":{"13":1,"120":1,"130":1}}],["logout",{"0":{"12":1},"2":{"12":1,"38":1}}],["log",{"0":{"139":1},"2":{"11":1,"12":1,"38":2,"137":1,"139":2}}],["locally",{"2":{"163":1}}],["localhost",{"2":{"41":1,"120":1,"130":1,"132":2,"154":3}}],["local",{"2":{"3":1,"4":1,"5":1,"7":1,"8":1,"22":1,"132":3,"163":1}}],["looked",{"2":{"2":1}}],["low",{"2":{"2":1}}],["longer",{"2":{"2":1}}],["long",{"2":{"1":1,"4":1,"8":1,"71":1,"73":1,"75":1,"99":1,"126":1,"127":1}}],["llama3",{"2":{"133":2}}],["llm",{"0":{"106":1},"2":{"7":1,"38":1,"39":1,"71":1,"81":1,"82":1,"106":1,"129":1}}],["llms",{"2":{"2":1}}],["ll",{"2":{"2":1,"29":1}}],["python",{"2":{"165":1,"167":1}}],["ps",{"2":{"155":1}}],["plugin",{"2":{"144":1}}],["plugged",{"2":{"71":1}}],["plus",{"2":{"115":1,"132":1}}],["placeholder",{"2":{"132":1}}],["platform",{"0":{"104":1},"2":{"26":1,"58":1,"59":2,"99":1,"118":1,"124":1}}],["platforms",{"0":{"122":1},"2":{"6":1,"60":1,"71":1,"104":1,"122":1}}],["playground",{"2":{"7":1}}],["plane",{"2":{"5":1}}],["plainly",{"2":{"2":1}}],["pnpm",{"2":{"36":4}}],["pulled",{"2":{"154":1}}],["pull",{"2":{"151":1,"155":1}}],["purpose",{"2":{"91":1}}],["public",{"2":{"16":1,"115":3,"125":1}}],["push",{"2":{"7":1}}],["persistent",{"2":{"166":1}}],["person",{"2":{"115":2,"125":1}}],["personal",{"2":{"1":1,"2":1,"16":1}}],["per",{"2":{"56":1,"63":1,"71":1,"78":1,"84":1}}],["permanently",{"2":{"8":1}}],["people",{"2":{"4":1}}],["phones",{"2":{"2":1}}],["points",{"0":{"154":1}}],["postgres",{"0":{"145":1},"2":{"137":1,"151":2,"152":3,"156":1}}],["postgresql",{"2":{"111":1,"145":2,"149":1}}],["post",{"2":{"68":1}}],["position",{"2":{"2":1}}],["powered",{"2":{"102":1}}],["powers",{"2":{"68":1}}],["powerful",{"2":{"2":1}}],["ports",{"2":{"156":1}}],["port",{"2":{"33":2,"34":6,"36":1,"37":1,"38":1,"137":3,"140":1,"145":2,"147":2,"148":2}}],["portable",{"2":{"2":1,"4":1}}],["polite",{"2":{"2":1}}],["prefix",{"2":{"144":1,"155":1}}],["prefer",{"2":{"110":1}}],["preferred",{"2":{"55":1}}],["prerequisites",{"0":{"113":1,"120":1,"130":1,"150":1}}],["precision",{"2":{"74":1}}],["preserved",{"2":{"66":1}}],["press",{"2":{"19":1,"29":1}}],["prevents",{"2":{"63":1}}],["primarily",{"2":{"93":1}}],["primary",{"2":{"54":1}}],["privileged",{"2":{"158":1}}],["privileges",{"2":{"2":1}}],["privately",{"2":{"6":1,"101":1}}],["private",{"2":{"4":1,"5":2}}],["privacy",{"2":{"1":1,"7":1}}],["proxy",{"2":{"156":1}}],["project",{"2":{"136":1}}],["proactive",{"2":{"88":1}}],["protocol",{"0":{"107":1},"2":{"71":1,"77":1,"78":1,"81":1,"107":1,"133":1,"144":1}}],["process",{"2":{"63":1}}],["provide",{"2":{"121":1}}],["provided",{"2":{"34":1}}],["provider=container",{"2":{"161":1}}],["providers",{"2":{"35":1,"38":1,"39":1,"40":1,"106":1,"109":1,"128":1,"133":1,"148":2}}],["provider",{"0":{"39":1,"40":1,"41":1,"42":1,"81":1,"106":1,"129":1,"132":1},"1":{"40":1,"41":1,"42":1,"82":1,"83":1,"84":1,"85":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1},"2":{"6":1,"38":1,"40":7,"41":5,"42":5,"44":1,"45":6,"71":1,"72":1,"81":3,"85":2,"113":1,"128":1,"129":1,"131":3,"132":3,"133":2,"134":3}}],["prompt",{"2":{"75":1,"92":1,"117":1,"125":1,"151":1,"153":1}}],["prompted",{"2":{"29":1}}],["prompts",{"2":{"11":2,"16":1,"23":1,"34":2,"41":2,"45":2,"50":1,"55":1,"71":1,"121":1,"151":1}}],["production",{"0":{"156":1},"2":{"83":1,"141":1,"158":2}}],["product",{"2":{"8":1}}],["progress",{"2":{"2":2}}],["panel",{"2":{"132":1,"133":2,"134":1}}],["panels",{"2":{"131":1}}],["page",{"0":{"114":1,"122":1,"131":1},"2":{"89":1,"114":1,"116":1,"117":1,"122":2,"124":1,"131":2,"167":1}}],["pages",{"2":{"70":1}}],["parallel",{"2":{"64":1}}],["parts",{"2":{"70":1}}],["part",{"2":{"2":1,"36":1}}],["path",{"0":{"57":1,"61":1,"65":1,"69":1,"76":1,"80":1,"85":1,"89":1,"93":1,"97":1},"2":{"137":1,"143":2,"144":1,"162":2,"163":1}}],["pattern",{"2":{"50":4,"51":3,"87":1}}],["packages",{"2":{"36":2}}],["passed",{"2":{"17":1}}],["passwords",{"2":{"156":2,"158":1}}],["password=your",{"2":{"152":1}}],["password",{"2":{"11":2,"137":4,"141":2,"145":2,"151":2,"152":6}}],["past",{"2":{"1":1}}],["paired",{"2":{"3":1}}],["paid",{"2":{"2":1}}],["bing",{"2":{"148":1}}],["binary",{"2":{"144":1}}],["bin",{"2":{"144":2}}],["bindings",{"2":{"54":1}}],["binding",{"2":{"26":1,"27":1,"38":1,"124":2,"125":1}}],["bind",{"0":{"26":1,"27":1,"124":1},"2":{"26":1,"27":1,"115":1,"124":3,"147":1,"148":1}}],["bm25",{"2":{"103":1}}],["blogs",{"0":{"9":1},"2":{"9":1}}],["by",{"2":{"6":2,"7":1,"15":2,"40":2,"42":1,"46":1,"49":1,"55":1,"74":1,"89":1,"96":1,"102":1,"103":2,"152":1}}],["bocha",{"2":{"148":1}}],["bottom",{"2":{"132":1}}],["botfather",{"2":{"121":3,"123":1}}],["both",{"2":{"7":1}}],["bots",{"2":{"6":6,"14":1,"15":1,"35":2,"38":1,"47":1,"57":1,"61":1,"64":1,"65":1,"67":1,"69":1,"71":1,"75":1,"76":1,"77":1,"78":1,"80":1,"84":1,"85":1,"88":1,"93":1,"97":1,"99":1,"101":4,"102":1,"105":1,"109":1,"114":2,"115":1,"116":1,"122":2,"125":2,"127":1,"128":1,"129":1,"135":1,"162":1}}],["bot",{"0":{"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"54":1,"84":1,"101":1,"112":1,"114":1,"115":1,"116":1,"117":1,"121":1,"122":1},"1":{"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"55":1,"56":1,"57":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1},"2":{"6":3,"7":1,"15":1,"16":4,"17":5,"18":2,"19":2,"20":4,"21":1,"24":2,"25":2,"29":6,"30":4,"38":4,"47":2,"48":3,"49":2,"50":3,"51":2,"52":2,"53":2,"54":2,"55":1,"56":1,"57":1,"58":1,"59":1,"60":2,"61":1,"62":1,"63":3,"65":1,"68":1,"69":1,"71":2,"72":1,"73":1,"76":1,"78":2,"80":1,"83":1,"84":1,"85":1,"86":1,"90":1,"93":1,"94":1,"95":1,"97":1,"99":1,"101":1,"102":1,"105":1,"107":1,"109":1,"110":1,"115":4,"116":1,"117":1,"118":1,"119":2,"120":2,"121":8,"122":1,"123":1,"124":1,"125":4,"126":2,"127":1,"135":2,"143":1,"144":2,"161":2,"163":1,"167":2}}],["boundaries",{"2":{"5":1,"7":1}}],["boundary",{"2":{"1":1}}],["brave",{"2":{"105":1,"148":1}}],["brief",{"2":{"4":1}}],["breaks",{"2":{"1":1}}],["basic",{"2":{"116":1}}],["bashdocker",{"2":{"155":1,"157":1,"163":2,"167":3}}],["bashsudo",{"2":{"152":1,"153":1}}],["bashcurl",{"2":{"151":2}}],["bashcd",{"2":{"36":2}}],["bashgit",{"2":{"36":1,"152":1}}],["bashmemoh",{"2":{"11":1,"12":1,"13":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":2,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"33":1,"34":2,"40":2,"41":2,"42":2,"44":1,"45":2,"46":2,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1}}],["base64",{"2":{"137":1,"142":1,"152":1}}],["based",{"2":{"47":1,"86":1}}],["base",{"2":{"2":1,"3":2,"41":3,"115":1,"132":4,"134":1,"137":1,"146":1}}],["battery",{"2":{"2":1}}],["backups",{"2":{"156":2}}],["backend",{"2":{"89":1}}],["backends",{"2":{"79":1}}],["back",{"2":{"2":1,"13":1,"59":1,"95":1}}],["before",{"2":{"129":1,"152":1,"158":1}}],["been",{"2":{"124":1}}],["beyond",{"2":{"75":1}}],["behavior",{"2":{"30":1,"56":1,"68":1,"92":1,"93":1}}],["behind",{"2":{"2":1,"70":1}}],["better",{"2":{"68":1,"74":1}}],["bet",{"2":{"8":1}}],["between",{"2":{"2":1,"67":1,"106":1}}],["belief",{"2":{"7":1}}],["be",{"2":{"6":1,"7":1,"17":1,"29":1,"167":1}}],["becomes",{"2":{"2":1,"4":1,"144":1}}],["because",{"2":{"2":1}}],["being",{"2":{"2":1}}],["built",{"2":{"7":1,"8":1,"104":1,"105":1,"144":1}}],["buildkit",{"2":{"149":1}}],["build",{"2":{"2":1,"7":1,"36":1,"101":1,"157":1}}],["building",{"2":{"2":1}}],["buildable",{"2":{"1":1}}],["button",{"2":{"115":1,"123":1,"132":1}}],["but",{"2":{"1":2,"2":1,"4":1,"30":1,"81":1,"89":1,"162":1}}],["symptom",{"0":{"161":1,"165":1}}],["systems",{"2":{"78":1}}],["system",{"2":{"1":1,"73":1,"99":2,"105":1,"125":1,"127":2}}],["ssl",{"2":{"145":1,"156":1}}],["sslmode",{"2":{"137":1,"145":1}}],["sse",{"2":{"107":1}}],["snapshotter",{"2":{"137":1,"144":2}}],["skips",{"2":{"166":1}}],["skill",{"0":{"91":1},"2":{"105":1}}],["skills",{"0":{"90":1},"1":{"91":1,"92":1,"93":1},"2":{"6":1,"71":1,"72":1,"90":1,"92":1,"93":1,"105":2,"109":1,"126":1}}],["sk",{"2":{"132":1}}],["switch",{"2":{"106":1}}],["swap",{"2":{"79":1}}],["shif",{"2":{"166":1}}],["sh",{"2":{"151":4,"166":1}}],["should",{"2":{"124":1,"125":1,"167":1}}],["short",{"2":{"75":1,"144":1}}],["shows",{"2":{"133":1}}],["show",{"2":{"13":1,"23":1,"31":1,"33":1,"38":3,"161":2}}],["share",{"2":{"7":1}}],["sharing",{"2":{"5":1,"7":1}}],["space",{"2":{"63":1}}],["split",{"2":{"7":1}}],["specialized",{"2":{"71":1,"94":1,"105":1}}],["specific",{"2":{"90":1,"163":1}}],["specified",{"2":{"6":1,"108":1}}],["specify",{"2":{"29":1,"47":1}}],["speaker",{"2":{"2":1}}],["script",{"2":{"151":2,"153":1,"166":1}}],["screen",{"2":{"2":1}}],["scalability",{"2":{"96":1}}],["scope",{"2":{"54":1,"91":1}}],["schema",{"2":{"23":1}}],["schedules",{"2":{"35":1,"38":1,"47":1,"48":1,"88":1,"126":1,"128":1}}],["schedule",{"0":{"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"86":1},"1":{"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"87":1,"88":1,"89":1},"2":{"6":1,"38":1,"47":1,"48":1,"49":2,"50":3,"51":3,"52":2,"53":2,"71":1,"72":1,"86":1,"87":1,"89":2}}],["scheduled",{"0":{"108":1},"2":{"6":1,"108":1}}],["significantly",{"2":{"167":1}}],["signing",{"2":{"142":1}}],["size",{"2":{"167":1}}],["since",{"2":{"162":1,"166":1}}],["silently",{"2":{"151":1}}],["silent",{"2":{"151":1}}],["sidebar",{"2":{"114":1,"117":1,"122":1,"131":1,"132":1,"135":1}}],["similarity",{"2":{"74":1}}],["simple",{"2":{"6":1}}],["sit",{"2":{"1":1,"2":1}}],["such",{"2":{"162":1}}],["successful",{"2":{"124":2}}],["sudo",{"2":{"151":2,"152":1,"155":1}}],["summaries",{"2":{"88":1}}],["subagent",{"2":{"90":1,"93":1,"96":1}}],["subagents",{"0":{"94":1},"1":{"95":1,"96":1,"97":1},"2":{"71":1,"72":1,"93":2,"94":1,"95":1,"97":1,"105":2}}],["subcommand",{"2":{"29":1}}],["sustainable",{"2":{"7":1}}],["supported",{"2":{"89":1}}],["support",{"0":{"104":1,"106":1,"107":1},"2":{"7":1,"104":2}}],["supports",{"2":{"6":1,"25":1,"27":1,"78":1,"95":1,"103":1,"107":1,"108":1,"133":1}}],["survives",{"2":{"166":1}}],["survive",{"2":{"1":1}}],["searxng",{"2":{"148":1}}],["search",{"2":{"3":1,"6":1,"103":1,"105":3,"121":1,"131":1,"148":2}}],["serper",{"2":{"148":1}}],["serve",{"2":{"60":1}}],["server",{"0":{"140":1},"2":{"11":1,"35":1,"36":1,"38":1,"111":1,"137":2,"140":1,"147":3,"149":1,"157":1,"161":1,"162":2,"163":3}}],["service",{"2":{"71":1,"81":1,"82":1,"147":1,"154":1,"157":1,"158":1}}],["services",{"2":{"5":1,"77":1,"82":1,"106":1,"107":1,"111":1,"132":1,"151":1,"154":1}}],["serving",{"2":{"5":1}}],["sending",{"2":{"125":1}}],["send",{"2":{"105":1,"121":1,"124":1,"125":2}}],["separate",{"2":{"63":2,"81":1,"96":1,"102":1,"163":1}}],["see",{"2":{"36":1,"110":1,"120":2,"130":1,"136":1}}],["session",{"2":{"30":1,"38":1}}],["security",{"0":{"158":1}}],["securely",{"2":{"121":1}}],["seconds",{"2":{"124":1,"137":1,"146":2}}],["secrets",{"2":{"156":1,"158":1}}],["secret",{"2":{"25":3,"137":2,"142":2,"151":2,"152":1}}],["section",{"0":{"138":1},"1":{"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1},"2":{"9":1,"70":1,"116":1,"124":1}}],["selecting",{"2":{"134":1}}],["select",{"2":{"23":1,"29":1,"57":1,"61":1,"65":1,"69":2,"76":1,"80":1,"85":2,"93":1,"97":1,"116":1,"122":1,"123":1,"124":1,"133":1}}],["selected",{"2":{"17":1,"131":2}}],["setting",{"2":{"124":1}}],["settings",{"0":{"55":1},"2":{"6":1,"57":1,"84":1,"85":1,"109":1,"116":1,"135":1,"151":1}}],["setup",{"0":{"83":1},"2":{"111":1}}],["set",{"0":{"20":1,"25":1,"27":1,"34":1},"2":{"6":1,"16":2,"17":2,"20":2,"25":2,"27":2,"34":3,"37":1,"38":3,"101":1,"105":1,"109":1,"126":1,"144":2,"152":1,"156":1,"162":1,"163":1}}],["semantic",{"2":{"6":1,"74":1,"103":1}}],["sludge",{"2":{"2":1}}],["save",{"2":{"116":1,"121":1,"123":1,"124":1,"132":1}}],["safely",{"2":{"64":1}}],["safe",{"2":{"4":1}}],["say",{"2":{"2":1}}],["same",{"2":{"2":1,"30":1,"133":1}}],["solution",{"0":{"163":1,"167":1}}],["solves",{"2":{"90":1}}],["sogou",{"2":{"148":1}}],["sock",{"2":{"137":1,"143":1}}],["socket",{"2":{"137":1,"143":2}}],["source",{"2":{"8":1,"36":1,"59":1,"67":1,"162":1}}],["so",{"2":{"2":2,"4":1,"60":1,"75":1,"78":1,"167":1}}],["someone",{"2":{"4":1}}],["somewhere",{"2":{"2":2}}],["something",{"2":{"1":1,"2":3}}],["smell",{"2":{"2":1}}],["smoother",{"2":{"2":1}}],["smaller",{"2":{"95":1}}],["small",{"2":{"2":1,"45":2,"133":2}}],["smarter",{"2":{"1":1}}],["step",{"0":{"114":1,"115":1,"116":1,"117":1,"121":1,"122":1,"123":1,"124":1,"125":1,"131":1,"132":1,"133":1,"134":1},"2":{"96":1,"121":1,"125":1}}],["steps",{"0":{"118":1,"126":1,"135":1},"2":{"91":1}}],["string",{"2":{"139":2,"140":1,"141":3,"142":2,"143":2,"144":6,"145":5,"146":3,"147":2,"148":1}}],["strict",{"2":{"5":1}}],["structured",{"2":{"99":1,"103":1,"127":1}}],["streaming",{"2":{"19":1,"104":1,"110":1}}],["stream",{"2":{"2":1,"29":1}}],["studio",{"2":{"3":1,"7":1}}],["stop",{"2":{"63":1,"155":1}}],["stops",{"2":{"2":1}}],["store",{"2":{"103":1,"166":1}}],["stores",{"2":{"11":1,"32":1,"37":1,"103":1}}],["stored",{"2":{"6":2,"12":1,"71":1,"74":1}}],["storage",{"2":{"2":1,"5":1}}],["story",{"0":{"2":1}}],["stood",{"2":{"2":1}}],["style",{"2":{"2":1,"74":1}}],["stale",{"2":{"163":1}}],["status",{"2":{"155":1}}],["state",{"2":{"52":1,"131":1}}],["standardized",{"2":{"78":1}}],["startup",{"2":{"154":2}}],["starting",{"2":{"152":1}}],["starts",{"2":{"29":1}}],["start",{"2":{"19":1,"36":1,"63":1,"151":1,"152":1,"155":1}}],["started",{"2":{"2":2,"128":1}}],["stay",{"2":{"5":1}}],["stays",{"2":{"3":1,"8":2}}],["stack",{"2":{"5":1,"8":1,"149":1}}],["stakes",{"2":{"2":1}}],["still",{"2":{"1":1,"165":1}}],["s",{"2":{"1":1,"2":6,"4":1,"8":1,"24":1,"25":1,"26":1,"27":1,"63":1,"73":1,"126":1,"131":1,"151":1,"166":1,"167":1}}],["effect",{"0":{"164":1},"1":{"165":1,"166":1,"167":1}}],["errors",{"2":{"165":1}}],["error=",{"2":{"161":2}}],["error",{"2":{"139":1,"161":1}}],["etc",{"2":{"82":1,"144":1}}],["e",{"2":{"22":1,"25":1,"27":1,"34":1,"45":1,"50":1,"115":3,"118":1,"121":3,"123":1,"132":2,"133":2,"140":1,"142":1,"144":1,"156":1,"161":1,"162":1,"165":1}}],["email",{"2":{"137":1,"141":2}}],["embedded",{"2":{"149":1,"166":1}}],["embeddings",{"2":{"133":1}}],["embedding",{"2":{"20":2,"43":1,"45":7,"55":1,"81":1,"83":1,"84":1,"85":1,"116":1,"129":1,"133":6,"135":1}}],["embed",{"2":{"133":1}}],["empty",{"2":{"2":1,"50":1,"131":1}}],["edge",{"2":{"7":1}}],["edit",{"0":{"134":1},"2":{"6":1,"99":1,"105":1,"127":1,"134":2,"152":1}}],["easier",{"2":{"92":1}}],["easy",{"2":{"6":1}}],["each",{"2":{"6":3,"7":1,"54":1,"62":1,"73":1,"82":1,"101":1,"102":2,"103":1,"107":1,"127":1,"134":1,"144":1}}],["exec",{"2":{"161":1,"163":1,"165":1,"167":2}}],["executable",{"2":{"165":1}}],["execute",{"2":{"6":1,"87":1,"99":1,"102":1,"105":1,"161":1}}],["executions",{"2":{"50":1,"51":1}}],["execution",{"2":{"5":1,"63":1,"71":1,"87":1,"91":1,"95":1,"108":1}}],["exa",{"2":{"148":1}}],["examples",{"2":{"34":1,"40":1,"41":1,"45":1,"58":1}}],["example",{"0":{"137":1},"2":{"20":1,"33":1,"34":1,"42":1,"46":1,"132":2,"133":1,"137":1}}],["exists",{"2":{"163":1,"166":1}}],["exist",{"2":{"70":1,"162":1}}],["exit",{"2":{"19":1,"29":1}}],["extra",{"2":{"111":1}}],["extracts",{"2":{"103":1}}],["extracted",{"2":{"74":1}}],["extraction",{"2":{"67":1}}],["extend",{"2":{"105":1,"126":1}}],["extension",{"2":{"78":1,"79":1}}],["external",{"2":{"58":1,"59":1,"71":2,"77":1,"78":1,"107":1}}],["expiration",{"2":{"142":1}}],["expires",{"2":{"137":1,"142":1}}],["expression",{"2":{"87":1}}],["expressions",{"2":{"6":1,"108":1}}],["explains",{"2":{"70":1}}],["explicitly",{"2":{"30":1}}],["explicit",{"2":{"5":1,"7":1}}],["expectations",{"2":{"91":1}}],["expensive",{"2":{"4":1}}],["experienced",{"2":{"7":1}}],["experience",{"2":{"1":1}}],["eventually",{"2":{"2":1}}],["everything",{"2":{"5":1,"8":1,"149":1}}],["every",{"2":{"1":1,"2":1,"4":1,"6":1,"99":1}}],["evolves",{"2":{"2":1}}],["economics",{"2":{"2":1}}],["env",{"2":{"152":1}}],["environments",{"2":{"158":1}}],["environment",{"2":{"7":1,"63":1,"71":1}}],["end",{"2":{"121":1}}],["endpoint",{"2":{"81":1}}],["endpoints",{"2":{"39":1}}],["engineered",{"2":{"103":1}}],["engineering",{"0":{"103":1},"2":{"6":1}}],["entrypoint",{"2":{"166":2}}],["entity",{"2":{"54":1}}],["enter",{"2":{"1":1,"19":1,"29":1,"121":2}}],["ensure",{"2":{"36":1}}],["encrypt",{"2":{"25":2}}],["enables",{"2":{"75":1,"84":1}}],["enabled",{"2":{"50":2,"51":1,"87":1}}],["enable",{"2":{"20":1,"51":1,"52":1,"126":1,"133":1}}],["enough",{"2":{"2":1}}],["else",{"2":{"2":1,"4":1}}],["msg=",{"2":{"161":2}}],["mirror",{"0":{"153":1},"2":{"137":1,"144":1,"151":1,"153":2}}],["mistral",{"2":{"82":1}}],["missing",{"2":{"41":1}}],["minimum",{"2":{"83":1,"152":1}}],["minimal",{"2":{"79":1}}],["minutes",{"2":{"55":1,"154":1}}],["mic",{"2":{"2":1}}],["my",{"2":{"20":1,"40":1,"41":1,"42":1,"45":2,"115":1,"121":2,"132":1}}],["myself",{"2":{"2":1}}],["mcp",{"0":{"77":1,"78":1,"107":1,"144":1,"160":2,"164":1},"1":{"78":1,"79":1,"80":1,"161":2,"162":2,"163":2,"165":1,"166":1,"167":1},"2":{"6":1,"71":1,"72":1,"77":1,"78":1,"79":1,"80":1,"107":2,"109":1,"137":2,"144":5,"153":1,"161":1,"162":2,"163":2,"165":2,"166":2,"167":3}}],["must",{"2":{"121":1,"152":1,"158":1}}],["multimodal",{"2":{"44":1,"45":2,"133":1}}],["multiple",{"2":{"5":1,"6":1,"60":1,"101":1,"104":1}}],["multi",{"0":{"101":1,"104":1,"106":1},"2":{"2":1,"6":1,"7":1,"96":1,"99":1,"103":1,"127":1}}],["much",{"2":{"2":1}}],["mention",{"2":{"125":1}}],["messaging",{"2":{"104":1,"105":1}}],["message",{"2":{"29":1,"59":1,"67":1,"124":1,"125":2}}],["messages",{"2":{"19":1,"45":1,"82":2,"105":1,"106":1,"119":1,"125":1,"133":1}}],["mem0",{"2":{"103":1}}],["members",{"2":{"101":1}}],["member",{"2":{"99":1,"127":1}}],["memories",{"2":{"74":2,"103":1,"105":1,"146":1}}],["memory",{"0":{"73":1,"103":1},"1":{"74":1,"75":1,"76":1},"2":{"2":1,"3":1,"5":1,"6":3,"7":1,"8":1,"20":2,"54":1,"55":1,"67":1,"71":1,"72":1,"73":1,"75":1,"76":1,"83":1,"84":1,"85":1,"99":2,"103":3,"105":1,"116":1,"118":1,"126":2,"127":2,"133":1,"137":1,"146":1,"156":1}}],["memoh123",{"2":{"151":1}}],["memohai",{"2":{"36":1,"137":1,"144":3,"152":1}}],["memoh",{"0":{"0":1,"35":1,"98":1,"99":1,"127":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"36":1,"37":1,"38":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"128":1},"2":{"1":1,"3":1,"4":1,"5":1,"7":2,"8":3,"9":1,"11":2,"29":2,"30":1,"32":1,"34":1,"35":3,"36":6,"37":4,"38":2,"40":1,"41":1,"45":2,"54":1,"56":1,"66":1,"70":2,"73":1,"74":1,"77":1,"78":1,"81":1,"82":1,"99":1,"111":1,"120":1,"121":2,"122":1,"124":1,"127":1,"128":2,"130":1,"136":1,"137":3,"144":2,"145":2,"149":1,"151":4,"152":2,"153":1,"162":3,"163":2,"167":3}}],["metadata",{"2":{"23":1}}],["metaphors",{"2":{"2":1}}],["mount",{"2":{"162":2,"163":1}}],["mounted",{"2":{"162":1}}],["mounts",{"2":{"152":1}}],["mode",{"2":{"145":1}}],["model",{"0":{"20":1,"43":1,"44":1,"45":1,"46":1,"81":1,"84":1,"129":1},"1":{"44":1,"45":1,"46":1,"82":1,"83":1,"84":1,"85":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1},"2":{"3":1,"6":1,"20":7,"38":2,"44":1,"45":10,"46":7,"54":1,"55":4,"71":1,"72":1,"77":1,"81":3,"82":1,"83":2,"84":4,"85":1,"107":1,"110":1,"113":1,"116":3,"125":1,"128":1,"131":1,"133":8,"134":2,"135":2,"144":1}}],["models",{"0":{"131":1,"133":1},"2":{"1":1,"4":1,"35":1,"38":1,"43":1,"44":1,"45":2,"85":2,"109":1,"128":1,"129":1,"131":2,"133":2,"135":1}}],["modular",{"2":{"79":1}}],["monorepo",{"2":{"36":1}}],["mobile",{"2":{"2":1}}],["more",{"2":{"2":3,"6":2,"7":1,"8":1,"95":1,"99":1,"110":1}}],["moment",{"2":{"2":3}}],["most",{"2":{"2":1,"38":1}}],["machine",{"2":{"162":1}}],["macos",{"2":{"152":1}}],["may",{"2":{"154":1,"161":1}}],["match",{"2":{"152":1}}],["matters",{"0":{"56":1,"60":1,"64":1,"68":1,"75":1,"79":1,"88":1,"92":1,"96":1}}],["mattered",{"2":{"2":1}}],["mainland",{"0":{"153":1},"2":{"137":1,"144":1,"153":1}}],["main",{"2":{"95":2,"147":1,"149":1,"157":1,"158":1}}],["maintenance",{"2":{"88":1}}],["maintain",{"2":{"75":1,"92":1}}],["map",{"0":{"71":1}}],["max",{"2":{"50":3,"51":2,"55":2,"87":1,"108":1}}],["markdown",{"2":{"104":1}}],["mark",{"2":{"45":1}}],["making",{"2":{"8":2}}],["make",{"2":{"4":1,"88":1,"92":1}}],["makes",{"2":{"1":1,"4":1,"79":1}}],["manual",{"0":{"152":1},"1":{"153":1},"2":{"108":1,"111":1}}],["managing",{"2":{"35":1}}],["managed",{"2":{"93":1}}],["manage",{"2":{"14":1,"21":1,"39":1,"43":1,"47":1,"101":1,"105":1,"118":1}}],["management",{"0":{"101":1},"2":{"6":1,"56":1,"105":1,"109":1,"110":2}}],["many",{"2":{"2":1,"55":1}}],["manifesto",{"2":{"1":1}}],["f",{"2":{"153":2,"155":1}}],["fssl",{"2":{"151":2}}],["follow",{"2":{"121":1}}],["found",{"0":{"160":2},"1":{"161":2,"162":2,"163":2},"2":{"161":3,"165":1}}],["foundation",{"2":{"64":1}}],["four",{"2":{"106":1}}],["focus",{"2":{"95":1}}],["forward",{"2":{"7":1}}],["forcing",{"2":{"2":1}}],["format",{"2":{"91":1,"137":1,"139":2}}],["form",{"2":{"1":1,"2":1,"133":1}}],["for",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"2":2,"4":1,"5":1,"6":1,"8":1,"11":1,"16":1,"18":1,"20":1,"23":1,"26":1,"34":2,"35":1,"41":2,"45":3,"47":1,"48":1,"50":3,"55":1,"67":1,"73":1,"74":1,"83":2,"84":1,"96":1,"101":1,"104":1,"105":1,"110":2,"111":1,"115":3,"116":1,"121":3,"125":2,"126":2,"128":1,"132":3,"133":6,"136":2,"137":1,"140":1,"141":1,"142":1,"143":1,"144":3,"146":2,"151":2,"153":1,"156":1}}],["flexibly",{"2":{"106":1}}],["flexibility",{"2":{"78":1}}],["flip",{"2":{"52":1}}],["flag",{"2":{"44":1}}],["fulfil",{"2":{"162":1}}],["full",{"0":{"137":1},"2":{"104":2,"145":1,"157":1}}],["fully",{"2":{"4":2}}],["furthermore",{"2":{"8":1}}],["freely",{"2":{"6":1,"102":1}}],["frontier",{"2":{"5":1,"8":1}}],["from",{"2":{"2":1,"23":1,"36":1,"59":1,"60":1,"63":1,"74":1,"93":1,"103":1,"123":1,"133":1,"137":1,"144":1,"151":1,"163":1,"167":2}}],["feb",{"2":{"9":1}}],["feishu",{"2":{"6":1,"22":1,"25":4,"27":4,"58":1,"99":1,"104":1,"118":1,"127":1}}],["features",{"0":{"6":1,"100":1},"1":{"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1},"2":{"70":1,"128":1}}],["feed",{"2":{"4":1}}],["feels",{"2":{"8":1}}],["feeling",{"2":{"2":1}}],["feel",{"2":{"1":1,"2":2}}],["fi",{"2":{"166":1}}],["firewall",{"2":{"156":1}}],["first",{"2":{"2":1,"3":1,"7":2,"38":1,"136":1,"154":1}}],["final",{"2":{"144":1}}],["find",{"2":{"124":1}}],["finished",{"2":{"2":1}}],["field",{"2":{"115":1,"123":1,"132":1,"133":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1}}],["fields",{"0":{"87":1},"2":{"41":1,"111":1}}],["fill",{"2":{"115":1,"123":1,"132":1,"133":1}}],["file",{"2":{"64":1,"136":1,"152":1,"162":1,"165":1}}],["filesystem",{"2":{"63":1,"102":1}}],["files",{"2":{"5":1,"6":1,"7":1,"99":1,"102":1,"105":1,"127":1}}],["filter",{"2":{"15":2,"40":2}}],["fixes",{"2":{"2":1}}],["failed",{"2":{"161":2,"162":1}}],["fail",{"2":{"152":1,"165":1}}],["fails",{"2":{"13":1,"162":1}}],["family",{"2":{"101":1}}],["familiar",{"2":{"1":1}}],["facts",{"2":{"74":1,"103":1}}],["factor",{"2":{"1":1}}],["falls",{"2":{"13":1}}],["faster",{"2":{"7":1}}],["fast",{"2":{"2":1}}],["write",{"2":{"102":1,"105":1}}],["wrote",{"2":{"2":1}}],["wide",{"2":{"106":1}}],["windows",{"2":{"75":1}}],["will",{"2":{"8":1,"121":2,"151":1,"152":1}}],["within",{"2":{"6":1,"99":1,"102":1}}],["without",{"2":{"2":2,"78":1,"102":1,"152":1}}],["with",{"2":{"1":2,"2":1,"3":1,"5":1,"6":3,"8":1,"14":1,"19":1,"29":3,"30":1,"35":1,"38":1,"44":1,"63":1,"66":1,"74":1,"79":1,"82":2,"99":1,"101":2,"102":2,"104":1,"105":1,"111":1,"115":1,"119":1,"121":1,"127":2,"132":1,"133":4,"142":1,"149":1,"151":1,"152":1,"155":1,"156":1,"158":1,"162":1,"165":1}}],["way",{"2":{"149":1}}],["warnings",{"0":{"158":1}}],["warn",{"2":{"139":1}}],["walks",{"2":{"119":1,"129":1}}],["want",{"2":{"4":2,"8":1,"70":1,"122":1}}],["wanted",{"2":{"2":2}}],["wasn",{"2":{"2":1}}],["was",{"2":{"2":1,"167":1}}],["wait",{"2":{"2":1}}],["who",{"2":{"110":1,"153":1}}],["whoami",{"0":{"13":1},"2":{"13":1,"38":1}}],["which",{"2":{"29":1,"81":2}}],["while",{"2":{"2":1,"56":1,"93":1,"154":1}}],["whether",{"2":{"87":1}}],["when",{"2":{"2":2,"5":1,"70":1,"74":1,"125":1,"144":1,"151":1,"153":1,"161":1,"162":1}}],["where",{"2":{"1":1,"2":1,"7":2}}],["why",{"0":{"4":1,"56":1,"60":1,"64":1,"68":1,"75":1,"79":1,"88":1,"92":1,"96":1},"2":{"2":1,"70":1}}],["what",{"0":{"3":1,"59":1,"63":1,"67":1,"78":1,"99":1},"2":{"1":2,"2":1,"128":1}}],["workflow",{"2":{"95":1}}],["workflows",{"2":{"1":1,"92":1}}],["workspace",{"2":{"93":1,"151":2}}],["works",{"0":{"74":1},"2":{"82":1}}],["work",{"2":{"70":1}}],["worse",{"2":{"2":1}}],["world",{"2":{"1":1}}],["wechat",{"2":{"118":1}}],["web",{"0":{"57":1,"61":1,"65":1,"69":1,"76":1,"80":1,"85":1,"89":1,"93":1,"97":1,"148":1},"2":{"56":1,"58":1,"89":2,"104":2,"105":1,"109":1,"111":1,"120":1,"122":1,"124":1,"127":1,"129":1,"130":1,"137":1,"148":4,"149":1,"154":1}}],["were",{"2":{"2":1,"167":1}}],["weight",{"2":{"2":1}}],["we",{"2":{"1":2,"2":2,"5":1,"7":2,"8":2}}],["old",{"2":{"166":1,"167":1}}],["ollama",{"2":{"41":1,"42":1,"82":1,"132":7,"133":2}}],["omitted",{"2":{"23":1}}],["opt",{"2":{"144":2,"162":1,"163":1}}],["optional",{"2":{"25":2,"50":2,"87":1,"133":1,"146":1}}],["optionally",{"2":{"16":1,"40":1}}],["option",{"2":{"15":1,"16":1,"17":1,"20":1,"24":1,"25":1,"26":1,"27":1,"29":1,"30":1,"34":1,"40":1,"41":1,"45":1,"50":1,"51":1}}],["options",{"2":{"15":1,"16":1,"17":1,"20":1,"24":1,"25":1,"26":1,"27":1,"29":1,"30":1,"34":2,"40":1,"41":1,"45":1,"50":1,"51":1}}],["operations",{"2":{"64":1,"88":1,"105":1}}],["operate",{"2":{"8":1}}],["openssl",{"2":{"137":1,"142":1,"152":1}}],["openai",{"2":{"40":1,"45":6,"82":4,"106":2,"132":5,"133":9}}],["open",{"0":{"114":1,"122":1,"131":1},"2":{"8":1,"27":3,"114":1,"116":1,"117":1,"121":1,"122":2,"124":2,"131":1,"133":1,"162":1}}],["openclaw",{"0":{"7":1},"2":{"7":1}}],["owner",{"2":{"15":3}}],["own",{"2":{"6":3,"54":1,"62":1,"99":3,"102":1,"107":1,"109":1,"127":2}}],["others",{"2":{"125":1}}],["otherwise",{"2":{"29":1}}],["other",{"2":{"6":1,"101":1,"102":1,"109":1}}],["orchestrated",{"2":{"149":1}}],["order",{"0":{"72":1}}],["organizes",{"2":{"66":1}}],["or",{"0":{"134":1},"2":{"6":2,"16":1,"17":1,"20":2,"27":1,"32":1,"34":1,"38":1,"45":1,"52":1,"79":1,"81":1,"84":1,"87":1,"90":1,"101":3,"111":1,"127":1,"131":1,"133":5,"134":2,"139":1,"140":1,"149":1,"152":1,"156":1,"162":1}}],["outside",{"2":{"163":1}}],["output",{"2":{"33":1,"91":1}}],["out",{"2":{"2":1,"12":1,"38":1}}],["our",{"2":{"1":1,"2":1}}],["oem",{"2":{"2":1}}],["os",{"2":{"2":1}}],["okay",{"2":{"2":1}}],["occasional",{"2":{"2":1}}],["official",{"2":{"121":1,"151":1}}],["off",{"2":{"2":1}}],["of",{"2":{"1":2,"2":3,"6":1,"36":1,"55":1,"68":1,"90":1,"95":1,"103":1,"105":1,"106":1,"132":1,"156":1}}],["override",{"2":{"156":1}}],["overlay",{"2":{"153":1}}],["overlayfs",{"2":{"137":1,"144":1}}],["over",{"2":{"1":1}}],["overview",{"0":{"1":1,"70":1},"1":{"71":1,"72":1}}],["once",{"2":{"135":1}}],["ongoing",{"2":{"67":1}}],["only",{"2":{"15":1,"88":1,"133":1,"158":1}}],["online",{"2":{"8":1}}],["one",{"0":{"151":1},"2":{"8":1,"29":1,"56":1,"60":1,"63":1,"83":2,"111":1,"116":1,"129":1,"133":2,"135":2}}],["on",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"1":2,"2":1,"4":1,"5":1,"8":2,"95":1,"111":1,"125":1,"134":1,"149":1,"152":1,"155":1}}],["ctr",{"2":{"163":1,"166":1,"167":2}}],["cni",{"2":{"144":6}}],["cn",{"2":{"137":1,"144":1,"153":2}}],["cpu",{"2":{"156":1}}],["cp",{"2":{"136":1,"152":1}}],["customization",{"2":{"84":1}}],["currently",{"2":{"25":1,"27":1,"89":1,"93":1}}],["current",{"2":{"13":1,"26":1,"27":1,"33":1,"38":1,"52":1,"87":2,"89":1}}],["certs",{"2":{"156":1}}],["centralized",{"2":{"56":1}}],["ceiling",{"2":{"4":1}}],["cmd",{"2":{"50":1,"51":1}}],["cd",{"2":{"36":1,"152":1}}],["creation",{"2":{"133":1}}],["creating",{"2":{"129":1}}],["creates",{"2":{"162":1}}],["created",{"2":{"120":1,"161":1}}],["create",{"0":{"16":1,"41":1,"45":1,"50":1,"112":1,"115":1,"121":1},"1":{"113":1,"114":1,"115":1,"116":1,"117":1,"118":1},"2":{"6":1,"16":2,"38":4,"41":4,"45":5,"50":4,"63":1,"99":1,"101":1,"105":1,"120":1,"121":1,"127":1,"135":1,"152":1}}],["credentials",{"2":{"39":1,"59":1,"151":1}}],["cron",{"2":{"6":1,"47":1,"50":2,"51":1,"86":1,"87":1,"108":1}}],["china",{"0":{"153":1},"2":{"137":1,"144":1,"151":1,"153":3}}],["checklist",{"0":{"156":1}}],["check",{"0":{"117":1},"2":{"151":1,"166":1}}],["checks",{"2":{"88":1}}],["cheap",{"2":{"4":1}}],["choose",{"2":{"85":1}}],["choices",{"2":{"2":1}}],["changing",{"2":{"78":1}}],["change",{"2":{"37":1,"137":1,"141":1,"152":1,"154":1,"156":1,"158":1}}],["channels",{"2":{"21":1,"23":1,"35":1,"38":1,"60":1,"61":1,"109":1,"128":1}}],["channel",{"0":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"58":1,"59":1,"119":1,"123":1},"1":{"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"59":1,"60":1,"61":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1},"2":{"6":1,"21":1,"22":2,"23":3,"24":3,"25":3,"26":3,"27":3,"38":2,"54":1,"58":1,"71":1,"72":1,"104":1,"110":1,"115":2,"118":1,"122":1,"123":3}}],["chatting",{"2":{"35":1}}],["chatbox",{"2":{"7":1}}],["chat",{"0":{"19":1,"28":1,"29":1},"1":{"29":1,"30":1,"31":1},"2":{"6":2,"14":1,"19":2,"20":3,"29":3,"30":3,"38":4,"43":1,"45":2,"55":1,"58":1,"67":1,"69":1,"71":1,"81":1,"82":1,"83":1,"84":1,"85":1,"99":1,"101":1,"104":2,"106":1,"110":1,"116":1,"117":2,"119":1,"124":1,"127":1,"128":1,"129":1,"133":4,"135":1}}],["collection",{"2":{"137":1,"146":2}}],["collaborate",{"2":{"6":1,"101":1}}],["copy",{"2":{"136":1}}],["coordinator",{"2":{"95":1}}],["count",{"2":{"87":1,"108":1}}],["coupling",{"2":{"79":1}}],["could",{"2":{"2":1}}],["code",{"2":{"78":1,"105":1,"124":3,"161":1,"162":2}}],["coding",{"2":{"6":1,"109":1}}],["core",{"0":{"87":1,"95":1},"2":{"7":1,"70":1,"71":1,"78":1}}],["come",{"2":{"105":1}}],["combined",{"2":{"95":1}}],["combines",{"2":{"74":1}}],["common",{"0":{"155":1}}],["communicates",{"2":{"82":1}}],["communication",{"2":{"58":1}}],["command=date",{"2":{"161":1}}],["command",{"2":{"35":1,"36":1,"38":2,"50":3,"51":2,"87":2,"104":1,"110":1,"121":1,"128":1}}],["commands",{"0":{"10":1,"14":1,"21":1,"28":1,"32":1,"38":1,"39":1,"43":1,"47":1,"155":1},"1":{"11":1,"12":1,"13":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"33":1,"34":1,"40":1,"41":1,"42":1,"44":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1},"2":{"6":2,"7":1,"32":1,"38":1,"47":1,"64":1,"86":1,"99":1,"102":1,"105":1,"108":1,"127":1,"161":1}}],["com",{"2":{"34":1,"36":1,"115":1,"132":2,"137":1,"152":1}}],["compose",{"2":{"111":1,"149":1,"150":1,"151":2,"152":2,"153":4,"155":6,"156":1,"157":4,"163":2,"167":1}}],["complete",{"2":{"113":1,"124":1}}],["completions",{"2":{"45":2,"82":2,"106":1,"133":4}}],["complex",{"2":{"92":1,"95":1,"105":1}}],["compaction",{"2":{"103":1}}],["compatible",{"2":{"82":1,"106":1}}],["compare",{"0":{"7":1}}],["computer",{"2":{"6":1,"99":1}}],["cost",{"2":{"2":1,"84":1}}],["conf",{"2":{"136":1,"144":1,"152":1,"163":1}}],["config",{"0":{"24":1,"25":1,"32":1,"33":1,"34":1,"136":1},"1":{"33":1,"34":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1},"2":{"24":1,"25":1,"32":2,"33":2,"34":4,"37":4,"38":3,"111":1,"128":1,"136":2,"148":1,"151":1,"152":3,"153":1,"154":1,"156":1,"157":1,"162":1,"163":4}}],["configurable",{"2":{"105":1}}],["configuration",{"0":{"37":1,"59":1,"109":1,"116":1},"2":{"21":1,"24":1,"25":1,"54":1,"81":1,"93":1,"110":1,"111":1,"113":1,"114":1,"116":1,"117":1,"122":1,"123":1,"131":1,"136":1,"144":2,"151":1,"157":1}}],["configured",{"2":{"36":1,"125":1,"148":1}}],["configure",{"0":{"119":1,"129":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1},"2":{"6":1,"108":1,"109":1,"126":1,"128":1,"129":1,"156":1}}],["confirmation",{"2":{"18":1}}],["confidence",{"2":{"7":1}}],["conventions",{"2":{"93":1}}],["conversations",{"2":{"66":1,"74":1}}],["conversation",{"0":{"66":1},"1":{"67":1,"68":1,"69":1},"2":{"3":1,"6":1,"55":1,"68":1,"69":1,"71":1,"72":1,"103":2,"133":1}}],["consistent",{"2":{"92":1}}],["constraints",{"2":{"91":1}}],["constraint",{"2":{"2":1}}],["connection",{"0":{"125":1}}],["connections",{"2":{"78":1,"107":1}}],["connecting",{"2":{"104":1,"119":1}}],["connected",{"2":{"81":1}}],["connect",{"2":{"71":1,"107":1,"122":1}}],["connects",{"2":{"58":1,"77":1}}],["concrete",{"2":{"81":1}}],["concept",{"0":{"71":1}}],["concepts",{"0":{"70":1},"1":{"71":1,"72":1},"2":{"70":1,"81":1}}],["conceptually",{"2":{"2":1}}],["conclusion",{"0":{"8":1}}],["continue",{"2":{"8":1}}],["continuity",{"2":{"4":1,"8":1,"68":1,"75":1}}],["continuously",{"2":{"2":1}}],["controlled",{"2":{"63":1}}],["control",{"2":{"3":1,"5":1}}],["content",{"0":{"91":1},"2":{"2":1}}],["context",{"2":{"1":2,"2":1,"4":2,"5":1,"6":1,"8":1,"55":2,"67":2,"71":1,"75":1,"77":1,"103":1,"107":1,"144":1}}],["contains",{"2":{"9":1}}],["containerd",{"0":{"143":1},"2":{"102":1,"111":1,"137":3,"143":4,"144":2,"149":2,"161":1,"162":3,"163":2,"165":2,"166":4,"167":5}}],["container",{"0":{"62":1,"160":1,"164":1},"1":{"63":1,"64":1,"65":1,"161":1,"162":1,"163":1,"165":1,"166":1,"167":1},"2":{"6":1,"7":1,"50":1,"54":1,"62":1,"64":1,"65":1,"71":1,"72":1,"99":2,"102":1,"105":2,"127":1,"144":3,"158":1,"161":3,"162":2,"163":2,"165":1,"166":1,"167":2}}],["containers",{"2":{"5":1,"6":1,"102":1,"143":1,"149":1,"156":1,"162":1,"163":1}}],["containerization",{"2":{"4":1}}],["containerized",{"0":{"0":1,"102":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"3":1,"5":1,"6":1,"7":1,"8":1,"99":1,"127":1}}],["contact",{"2":{"1":1}}],["click",{"0":{"151":1},"2":{"111":1,"114":1,"115":1,"116":1,"117":1,"122":2,"123":2,"124":1,"131":1,"132":2,"133":1}}],["clicks",{"2":{"2":1}}],["client",{"0":{"82":1},"2":{"44":1,"45":5,"81":1,"82":2,"106":1,"133":5}}],["cli",{"0":{"35":1,"110":1},"1":{"36":1,"37":1,"38":1},"2":{"31":1,"32":1,"35":1,"36":4,"37":1,"38":2,"89":1,"104":1,"110":1,"127":1,"128":1}}],["clean",{"2":{"163":1}}],["cleaner",{"2":{"2":1}}],["clear",{"2":{"12":1,"38":1}}],["clone",{"2":{"36":1,"151":1,"152":1}}],["cloud",{"2":{"3":1,"4":1,"5":1,"7":1,"8":1,"146":1}}],["closed",{"2":{"2":1}}],["classes",{"2":{"90":1}}],["class",{"2":{"2":1}}],["clash",{"2":{"2":1}}],["cause",{"0":{"162":1,"166":1}}],["caught",{"2":{"2":1}}],["cache",{"2":{"157":1}}],["ca",{"2":{"145":1}}],["card",{"2":{"116":1,"134":1}}],["carry",{"2":{"2":1}}],["capabilities",{"0":{"105":1},"2":{"105":1,"126":1}}],["capability",{"2":{"1":1,"3":1,"5":1,"71":2,"78":1,"79":1,"90":1}}],["cap",{"2":{"87":1}}],["call",{"2":{"13":1}}],["calls",{"2":{"5":1,"50":2,"51":1,"87":2}}],["category",{"2":{"2":1}}],["cannot",{"2":{"153":1}}],["can",{"2":{"1":1,"2":5,"6":3,"7":2,"15":1,"17":1,"60":1,"75":1,"78":1,"79":1,"88":1,"94":1,"99":1,"101":1,"102":1,"107":1,"132":1,"134":1,"135":1}}],["case",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1}}],["circling",{"2":{"1":1}}],["after",{"0":{"164":1},"1":{"165":1,"166":1,"167":1},"2":{"134":1,"154":1,"165":1}}],["adapter",{"2":{"104":1}}],["added",{"2":{"167":1}}],["adding",{"2":{"165":1}}],["address",{"2":{"140":1,"147":1}}],["addr",{"2":{"137":2,"140":1,"147":1}}],["add",{"0":{"123":1,"132":1,"133":1},"2":{"79":1,"85":2,"118":1,"123":2,"125":1,"126":1,"129":1,"132":2,"133":2}}],["adds",{"0":{"78":1}}],["admin123",{"2":{"151":1,"154":1}}],["admin",{"0":{"141":1},"2":{"15":1,"137":3,"141":4,"151":3,"152":2,"154":1}}],["admins",{"2":{"15":1}}],["auditing",{"2":{"68":1}}],["automated",{"2":{"126":1}}],["automate",{"2":{"88":1}}],["automatic",{"2":{"103":1}}],["automatically",{"2":{"71":1,"103":1,"108":1,"153":1}}],["automation",{"2":{"86":1}}],["auto",{"2":{"55":1,"103":1,"144":1,"151":1}}],["authentication",{"2":{"38":1}}],["auth",{"0":{"10":1,"142":1},"1":{"11":1,"12":1,"13":1},"2":{"37":1,"137":1,"152":1}}],["able",{"2":{"127":1}}],["abcdefghijklmnopqrstuvwxyz",{"2":{"121":1,"123":1}}],["abstraction",{"2":{"56":1}}],["about",{"0":{"98":1},"1":{"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1},"2":{"9":1,"128":1}}],["available",{"2":{"22":1,"23":1,"89":1,"116":1}}],["avatar",{"2":{"16":2,"17":2,"115":3}}],["architecture",{"2":{"96":1,"104":1}}],["area",{"2":{"93":1}}],["are",{"2":{"55":1,"71":1,"74":3,"81":1,"90":1,"93":1,"94":1,"95":1,"144":1,"148":1,"154":1}}],["argument",{"2":{"17":1}}],["around",{"2":{"2":1}}],["a2a",{"2":{"7":1}}],["attachments",{"2":{"104":1}}],["attempt",{"2":{"1":1}}],["at",{"2":{"6":1,"36":1,"50":1,"83":1,"86":1,"108":1,"120":1,"129":1,"130":1,"132":1,"133":1,"135":1,"152":1,"162":1}}],["api",{"2":{"13":1,"34":3,"35":1,"36":1,"39":1,"41":3,"81":2,"82":4,"89":1,"106":4,"115":1,"132":7,"133":1,"134":1,"137":1,"146":3,"154":1}}],["apis",{"2":{"5":1}}],["appears",{"2":{"132":1}}],["app",{"2":{"2":1,"8":1,"25":4,"136":1,"152":1,"163":1}}],["assign",{"2":{"105":1,"135":1}}],["assignment",{"0":{"84":1}}],["assignments",{"2":{"54":1}}],["asks",{"2":{"18":1}}],["as",{"2":{"4":1,"5":3,"6":1,"7":2,"8":1,"17":1,"20":2,"30":1,"36":1,"45":1,"50":2,"66":1,"95":1,"103":1,"123":1,"162":1}}],["allowing",{"2":{"99":1,"119":1}}],["allows",{"2":{"56":1,"64":1}}],["all",{"2":{"15":1,"40":1,"44":1,"47":1,"48":1,"109":1,"111":2,"140":1,"149":1,"151":2,"156":1,"158":1}}],["also",{"2":{"4":1,"82":1,"152":1,"161":1,"163":1}}],["already",{"2":{"2":1,"166":1}}],["always",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"1":1,"2":2,"4":1,"5":1,"8":2}}],["ambient",{"2":{"2":1}}],["across",{"2":{"60":1,"75":1,"166":1}}],["according",{"2":{"125":1}}],["account",{"0":{"124":1},"2":{"120":1}}],["accounts",{"2":{"101":1}}],["access",{"0":{"154":1},"2":{"6":1,"78":1,"99":1,"127":1,"153":1,"156":1,"158":1}}],["accumulating",{"2":{"2":1}}],["actions",{"2":{"134":1}}],["active",{"2":{"16":2,"17":2,"87":1}}],["acts",{"2":{"5":1,"95":1}}],["actually",{"2":{"1":1,"2":2}}],["agreement",{"2":{"2":1}}],["agent2agent",{"2":{"7":1}}],["agents",{"2":{"1":1,"2":1,"4":1,"71":1,"94":1}}],["agent",{"0":{"0":1,"105":1,"147":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"1":1,"2":1,"7":1,"8":1,"56":1,"93":1,"99":1,"111":1,"127":1,"137":1,"147":4,"149":1,"154":1}}],["ai",{"2":{"1":1,"2":2,"3":1,"4":1,"6":1,"8":1,"45":1,"82":2,"99":2,"106":1,"109":1,"127":2,"133":1}}],["a",{"0":{"59":1,"115":1,"121":1,"132":1},"2":{"1":3,"2":11,"3":1,"5":2,"6":1,"7":4,"8":3,"16":1,"18":1,"19":1,"20":2,"23":1,"24":1,"25":1,"26":1,"35":2,"36":1,"38":1,"41":1,"42":1,"45":1,"46":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"57":1,"58":2,"59":1,"61":1,"65":1,"69":1,"76":1,"78":1,"80":1,"81":2,"82":1,"83":1,"85":1,"86":2,"90":1,"93":1,"94":1,"97":1,"99":1,"102":1,"103":1,"105":1,"106":1,"109":1,"110":1,"115":2,"120":2,"121":3,"125":3,"127":1,"132":3,"133":1,"134":1,"135":1,"136":1,"144":1,"156":1,"161":1,"162":2,"166":1}}],["answer",{"2":{"153":1}}],["analysis",{"2":{"68":1}}],["another",{"2":{"63":1}}],["anthropic",{"2":{"45":1,"82":2,"106":1,"133":1}}],["any",{"2":{"41":1}}],["anchor",{"2":{"2":1}}],["annoying",{"2":{"2":1}}],["and",{"0":{"66":1,"81":1,"129":1},"1":{"67":1,"68":1,"69":1,"82":1,"83":1,"84":1,"85":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1},"2":{"1":1,"2":6,"4":4,"5":3,"6":7,"7":6,"8":4,"11":1,"12":1,"14":1,"16":1,"19":1,"21":1,"23":1,"29":1,"33":1,"34":2,"35":1,"36":1,"37":2,"38":1,"39":1,"43":1,"44":1,"45":1,"50":1,"56":1,"59":1,"64":1,"67":3,"68":1,"70":1,"71":5,"72":2,"74":2,"78":1,"81":2,"83":1,"88":1,"89":1,"91":2,"92":1,"93":1,"96":1,"99":4,"101":1,"102":2,"103":2,"104":1,"105":4,"107":1,"108":1,"109":1,"110":1,"113":1,"116":1,"121":3,"124":1,"125":1,"127":1,"128":4,"129":2,"131":3,"133":1,"134":1,"135":2,"149":1,"151":3,"153":1,"154":1,"156":2,"158":1,"162":1,"163":1,"165":1,"167":1}}],["an",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"2":3,"5":1,"7":2,"8":3,"19":1,"29":1,"58":1,"99":1,"127":1,"131":1,"162":1}}],["two",{"2":{"131":1}}],["ttl",{"2":{"124":1}}],["typical",{"0":{"83":1,"91":1}}],["types",{"0":{"82":1},"2":{"22":1,"106":1}}],["type",{"2":{"16":3,"19":2,"23":3,"24":3,"25":3,"26":3,"27":3,"29":2,"44":2,"45":11,"59":1,"81":1,"82":2,"115":2,"117":1,"123":1,"133":6,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1}}],["tui",{"0":{"30":1},"2":{"30":2,"38":1}}],["turning",{"2":{"2":1}}],["turn",{"2":{"1":1,"6":1,"103":1}}],["tries",{"2":{"161":1}}],["trigger",{"2":{"167":1}}],["triggers",{"2":{"108":1}}],["triggered",{"2":{"71":1}}],["trusted",{"2":{"158":1}}],["troubleshooting",{"0":{"157":1,"159":1},"1":{"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":1,"167":1},"2":{"68":1}}],["treat",{"2":{"7":1}}],["traceability",{"2":{"67":1,"71":1}}],["transport",{"2":{"60":1}}],["trapped",{"2":{"4":1}}],["trade",{"2":{"2":1}}],["travels",{"2":{"2":1}}],["taking",{"0":{"164":1},"1":{"165":1,"166":1,"167":1}}],["take",{"2":{"2":1,"154":1}}],["tavily",{"2":{"148":1}}],["tab",{"2":{"122":1}}],["task",{"0":{"160":2},"1":{"161":2,"162":2,"163":2},"2":{"87":1,"161":3}}],["tasks",{"0":{"108":1},"2":{"6":2,"71":1,"88":1,"90":1,"94":1,"95":1,"96":1,"101":1,"105":1,"108":1,"126":1}}],["target",{"2":{"59":1}}],["talks",{"2":{"35":1}}],["talk",{"2":{"2":1}}],["tiny",{"2":{"2":1}}],["timeout",{"2":{"137":1,"146":2}}],["timelines",{"2":{"75":1}}],["timeline",{"2":{"67":1}}],["times",{"2":{"6":1,"86":1,"108":1}}],["time",{"0":{"2":1},"2":{"2":3,"29":1,"55":2,"105":1}}],["template",{"2":{"136":1,"151":1}}],["test",{"0":{"125":1},"2":{"117":1}}],["term",{"2":{"71":1,"73":1,"126":1}}],["terminal",{"2":{"30":1,"38":1,"110":1}}],["teams",{"2":{"101":1}}],["team",{"2":{"7":1}}],["telegram",{"0":{"119":1,"121":1,"123":1,"124":1},"1":{"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1},"2":{"6":1,"22":1,"58":1,"99":1,"104":1,"115":2,"118":1,"119":2,"120":1,"121":1,"122":1,"123":1,"124":2,"125":1,"127":1}}],["text",{"2":{"2":1,"45":2,"133":3,"137":1,"139":2}}],["tension",{"2":{"1":1}}],["t",{"2":{"2":6,"4":2}}],["than",{"2":{"7":1}}],["that",{"2":{"1":1,"2":8,"3":1,"8":4,"64":1,"81":1,"82":1,"86":1,"90":1,"94":1}}],["through",{"2":{"6":2,"78":1,"93":1,"109":1,"119":1,"129":1,"148":1}}],["threads",{"2":{"2":1}}],["three",{"2":{"1":1}}],["thing",{"2":{"2":1,"8":1}}],["think",{"2":{"2":1}}],["this",{"0":{"67":1},"2":{"2":2,"9":1,"55":1,"63":1,"70":1,"84":1,"95":1,"115":1,"119":1,"121":1,"129":1,"132":1,"144":1,"152":1,"153":1,"154":1,"162":1}}],["those",{"2":{"1":1}}],["these",{"2":{"32":1,"70":1,"135":1}}],["them",{"2":{"14":1,"99":1,"103":1,"127":1,"133":1}}],["their",{"2":{"4":1,"6":2,"44":1,"102":1}}],["they",{"2":{"4":2}}],["then",{"2":{"2":1,"11":1,"117":1,"152":1,"166":1}}],["there",{"2":{"2":1,"89":1}}],["the",{"0":{"0":1,"114":1,"122":1,"125":1,"131":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"1":4,"2":12,"4":1,"5":2,"6":3,"7":3,"8":2,"9":1,"11":2,"12":1,"13":2,"26":1,"27":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":5,"37":1,"38":1,"41":1,"47":1,"50":1,"54":1,"56":1,"59":1,"64":1,"70":1,"71":1,"81":2,"82":1,"87":1,"89":1,"93":1,"95":2,"99":1,"103":2,"105":1,"110":1,"111":1,"113":1,"114":2,"115":3,"117":2,"120":1,"121":5,"122":6,"123":6,"124":3,"125":2,"127":1,"129":1,"130":1,"131":3,"132":7,"133":7,"134":4,"135":2,"136":2,"144":1,"147":2,"148":1,"149":3,"151":4,"152":1,"153":4,"155":1,"158":1,"161":2,"162":5,"163":6,"165":2,"166":5,"167":6}}],["together",{"2":{"70":1}}],["toggle",{"0":{"52":1},"2":{"38":1,"52":1}}],["toml",{"0":{"136":1},"1":{"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1},"2":{"32":1,"37":1,"111":1,"128":1,"136":4,"137":1,"148":1,"151":1,"152":4,"153":2,"154":1,"156":1,"162":1,"163":3}}],["tokens",{"2":{"142":1}}],["token",{"2":{"11":2,"12":1,"13":1,"25":3,"37":2,"38":1,"121":2,"123":2}}],["tool",{"0":{"110":1},"2":{"5":1,"35":1,"71":1,"77":1,"78":1,"79":1,"107":1,"110":1,"128":1,"161":1}}],["tools",{"2":{"2":1,"7":1,"64":1,"105":1,"161":1,"165":1}}],["too",{"2":{"2":3}}],["to",{"0":{"0":1,"7":1,"84":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"1":1,"2":2,"4":2,"6":3,"7":1,"8":1,"11":1,"13":1,"19":1,"23":1,"29":5,"30":1,"32":1,"35":1,"36":1,"37":2,"38":1,"47":1,"50":1,"56":1,"58":1,"59":2,"64":1,"70":1,"71":1,"77":1,"81":1,"87":1,"92":1,"94":1,"99":1,"101":1,"103":1,"104":1,"105":1,"107":1,"108":1,"109":1,"111":1,"114":1,"117":2,"118":1,"119":2,"120":1,"121":1,"122":4,"123":1,"124":2,"125":3,"126":2,"127":1,"129":1,"130":1,"131":1,"132":1,"133":1,"143":1,"144":1,"147":1,"149":2,"152":1,"153":1,"155":1,"156":1,"161":2,"162":2,"163":2,"165":1,"167":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexzh.dDuBvO1t.js b/assets/chunks/@localSearchIndexzh.dDuBvO1t.js new file mode 100644 index 00000000..744fcffb --- /dev/null +++ b/assets/chunks/@localSearchIndexzh.dDuBvO1t.js @@ -0,0 +1 @@ +const t='{"documentCount":20,"nextId":20,"documentIds":{"0":"/zh/concepts/identity-and-binding.html#账号模型与绑定","1":"/zh/concepts/identity-and-binding.html#账号模型","2":"/zh/concepts/identity-and-binding.html#接入平台与-bot","3":"/zh/concepts/identity-and-binding.html#为什么账号绑定是账号作用域","4":"/zh/concepts/identity-and-binding.html#账号绑定流程-当前共识","5":"/zh/concepts/identity-and-binding.html#bot-类型语义","6":"/zh/concepts/#核心概念","7":"/zh/concepts/#概念图","8":"/zh/concepts/#为什么重要","9":"/zh/concepts/#本章内容","10":"/zh/#memoh-文档","11":"/zh/#文档章节","12":"/zh/#面向文档贡献者","13":"/zh/#当前维护范围","14":"/zh/style/terminology.html#术语规范","15":"/zh/style/terminology.html#规范术语","16":"/zh/style/terminology.html#推荐写法","17":"/zh/style/terminology.html#禁用或不推荐写法","18":"/zh/style/terminology.html#示例","19":"/zh/style/terminology.html#自检清单"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,1],"1":[1,1,16],"2":[2,1,8],"3":[1,1,10],"4":[3,1,9],"5":[2,1,11],"6":[1,1,4],"7":[1,1,15],"8":[1,1,13],"9":[1,1,2],"10":[2,1,8],"11":[1,2,3],"12":[1,2,2],"13":[1,2,14],"14":[1,1,5],"15":[1,1,22],"16":[1,1,16],"17":[1,1,12],"18":[1,1,11],"19":[1,1,6]},"averageFieldLength":[1.25,1.15,9.400000000000002],"storedFields":{"0":{"title":"账号模型与绑定","titles":[]},"1":{"title":"账号模型","titles":["账号模型与绑定"]},"2":{"title":"接入平台与 Bot","titles":["账号模型与绑定"]},"3":{"title":"为什么账号绑定是账号作用域","titles":["账号模型与绑定"]},"4":{"title":"账号绑定流程(当前共识)","titles":["账号模型与绑定"]},"5":{"title":"Bot 类型语义","titles":["账号模型与绑定"]},"6":{"title":"核心概念","titles":[]},"7":{"title":"概念图","titles":["核心概念"]},"8":{"title":"为什么重要","titles":["核心概念"]},"9":{"title":"本章内容","titles":["核心概念"]},"10":{"title":"Memoh 文档","titles":[]},"11":{"title":"文档章节","titles":["Memoh 文档"]},"12":{"title":"面向文档贡献者","titles":["Memoh 文档"]},"13":{"title":"当前维护范围","titles":["Memoh 文档"]},"14":{"title":"术语规范","titles":[]},"15":{"title":"规范术语","titles":["术语规范"]},"16":{"title":"推荐写法","titles":["术语规范"]},"17":{"title":"禁用或不推荐写法","titles":["术语规范"]},"18":{"title":"示例","titles":["术语规范"]},"19":{"title":"自检清单","titles":["术语规范"]}},"dirtCount":0,"index":[["表述为接入平台",{"2":{"19":1}}],["叙述中是否将",{"2":{"19":1}}],["自检清单",{"0":{"19":1}}],["里的用户",{"2":{"18":1}}],["错误",{"2":{"18":1}}],["正确",{"2":{"18":2}}],["示例",{"0":{"18":1}}],["这类错误语义",{"2":{"17":1}}],["写出",{"2":{"17":1}}],["未区分系统账号与平台账号",{"2":{"17":1}}],["平台用户",{"2":{"17":1}}],["平台账号是用户在飞书上的账号",{"2":{"18":1}}],["平台账号是",{"2":{"17":1}}],["平台账号在支持的接入平台会话中发送",{"2":{"4":1}}],["平台账号在初始阶段可以不绑定系统账号",{"2":{"1":1}}],["平台账号",{"2":{"1":1,"7":1,"8":1,"13":1,"15":1,"16":2}}],["使用含糊表述如",{"2":{"17":1}}],["除非明确引用代码符号",{"2":{"17":1}}],["在概念文档中直接使用",{"2":{"17":1}}],["禁用或不推荐写法",{"0":{"17":1}}],["后续可只用中文术语",{"2":{"16":1}}],["首次出现保留技术别名",{"2":{"16":1}}],["描述业务行为时",{"2":{"16":1}}],["优先写",{"2":{"16":2}}],["面向产品语义时",{"2":{"16":1}}],["面向文档贡献者",{"0":{"12":1}}],["推荐写法",{"0":{"16":1}}],["用于账号绑定的一次性代码",{"2":{"15":1}}],["用户在外部接入平台上的账号",{"2":{"7":1,"15":1}}],["用户以自己的系统账号申请",{"2":{"4":1}}],["绑定码",{"2":{"15":1}}],["承载入站消息的外部平台",{"2":{"15":1}}],["内账号",{"2":{"15":1}}],["内部账号",{"2":{"1":1,"17":1}}],["规范术语",{"0":{"15":1}}],["适用对象",{"2":{"14":1}}],["指用户在外部平台上的真实账号",{"2":{"13":1}}],["说明",{"2":{"13":1}}],["说明账号绑定与",{"2":{"13":1}}],["访问控制之间的关系",{"2":{"13":1}}],["访问控制保持独立",{"2":{"3":1}}],["解释为什么账号绑定是账号作用域",{"2":{"13":1}}],["区分系统账号与平台账号",{"2":{"13":1}}],["当前文档先聚焦账号语义与访问控制",{"2":{"13":1}}],["当前维护范围",{"0":{"13":1}}],["当前共识",{"0":{"4":1}}],["术语规范",{"0":{"14":1},"1":{"15":1,"16":1,"17":1,"18":1,"19":1},"2":{"12":1}}],["术语说明",{"2":{"8":1}}],["快速开始",{"2":{"11":1}}],["actor",{"2":{"16":1,"17":1,"18":1}}],["agent",{"2":{"10":1}}],["ai",{"2":{"10":1}}],["容器化的",{"2":{"10":1}}],["长记忆",{"2":{"10":1}}],["文档编写者与维护者",{"2":{"14":1}}],["文档章节",{"0":{"11":1}}],["文档",{"0":{"10":1},"1":{"11":1,"12":1,"13":1}}],["文档中的",{"2":{"8":1}}],["如飞书账号",{"2":{"8":1}}],["统一指用户在对应平台上的真实账号",{"2":{"8":1}}],["授权与账号绑定解耦",{"2":{"8":1}}],["并将",{"2":{"8":1}}],["因此我们明确区分平台账号与系统账号",{"2":{"8":1}}],["需要同时处理外部接入平台消息与系统内权限控制",{"2":{"8":1}}],["为什么重要",{"0":{"8":1}}],["为什么账号绑定是账号作用域",{"0":{"3":1}}],["把平台账号关联到系统账号的过程",{"2":{"7":1,"15":1}}],["例如用户的飞书账号",{"2":{"7":1}}],["例如飞书账号",{"2":{"1":1,"13":1}}],["概念图",{"0":{"7":1}}],["的核心账号与访问概念",{"2":{"6":1}}],["的职责是完成这两类账号的关联",{"2":{"1":1}}],["本页用于统一写作语义",{"2":{"14":1}}],["本章内容",{"0":{"9":1}}],["本章节用于定义",{"2":{"6":1}}],["本文档记录的是产品语义与共识方向",{"2":{"5":1}}],["核心概念",{"0":{"6":1},"1":{"7":1,"8":1,"9":1},"2":{"11":1}}],["部分运行时细节仍可能处于收敛阶段",{"2":{"5":1}}],["注",{"2":{"5":1}}],["owner",{"2":{"5":1}}],["语义上应为单",{"2":{"5":1}}],["personal",{"2":{"5":1}}],["public",{"2":{"5":1}}],["支持成员协作语义",{"2":{"5":1}}],["类型语义",{"0":{"5":1}}],["成员与授权由独立流程处理",{"2":{"4":1}}],["完成平台账号到系统账号的绑定",{"2":{"4":1}}],["code",{"2":{"4":3,"15":1}}],["channel",{"2":{"2":1,"15":1,"16":1,"19":1}}],["channelidentity",{"2":{"1":1,"7":1,"15":1,"16":1}}],["可演进",{"2":{"3":1}}],["让",{"2":{"3":1}}],["不要直接写",{"2":{"16":2}}],["不指本项目内部账号",{"2":{"8":1}}],["不应依赖成员机制",{"2":{"5":1}}],["不把账号绑定与成员管理语义耦合在一起",{"2":{"3":1}}],["不是面向最终用户的功能说明",{"2":{"14":1}}],["不是",{"2":{"1":1,"7":1,"13":1,"15":1,"18":1}}],["它只负责平台账号与系统账号的绑定",{"2":{"3":1}}],["资源权限",{"2":{"3":1}}],["而不是直接发放",{"2":{"3":1}}],["账号绑定用于把平台账号关联到系统账号",{"2":{"18":1}}],["账号绑定",{"2":{"7":1,"15":1,"16":1}}],["账号绑定流程",{"0":{"4":1}}],["账号绑定的目标是建立账号归属关系",{"2":{"3":1}}],["账号模型",{"0":{"1":1}}],["账号模型与绑定",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1},"2":{"9":1}}],["入站消息由平台账号产生",{"2":{"2":1}}],["由系统账号管理的资源与授权边界",{"2":{"15":1}}],["由系统账号管理的资源与访问边界",{"2":{"7":1}}],["由系统账号管理",{"2":{"2":1}}],["接入平台",{"2":{"2":1,"15":1,"16":1}}],["接入平台与",{"0":{"2":1}}],["bot",{"0":{"2":1,"5":1},"2":{"2":2,"3":2,"4":1,"5":2,"7":1,"8":1,"13":1,"15":1}}],["bind",{"2":{"1":1,"4":1,"7":1,"15":2,"16":1}}],["系统",{"2":{"10":1}}],["系统校验",{"2":{"4":1}}],["系统内账号",{"2":{"1":1,"7":2,"15":1}}],["系统账号",{"2":{"1":1,"7":1,"13":1,"15":1,"16":1,"18":1}}],["是否仅在首处保留技术别名",{"2":{"19":1}}],["是否明确区分了系统账号与平台账号",{"2":{"19":1}}],["是一个多成员",{"2":{"10":1}}],["是系统内的授权与资源边界",{"2":{"2":1}}],["是入站消息来源",{"2":{"2":1}}],["是",{"2":{"1":1,"18":1}}],["是用户在外部接入平台上的账号",{"2":{"1":1}}],["user",{"2":{"1":1,"7":1,"15":1,"16":1}}],["将平台账号与系统账号视为两类不同实体",{"2":{"1":1}}],["memoh",{"0":{"10":1},"1":{"11":1,"12":1,"13":1},"2":{"1":3,"6":1,"7":2,"8":1,"10":1,"13":1,"15":2,"17":1,"18":2}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexzh.hHhvpH9g.js b/assets/chunks/@localSearchIndexzh.hHhvpH9g.js deleted file mode 100644 index 9f19ddbc..00000000 --- a/assets/chunks/@localSearchIndexzh.hHhvpH9g.js +++ /dev/null @@ -1 +0,0 @@ -const t='{"documentCount":20,"nextId":20,"documentIds":{"0":"/zh/concepts/identity-and-binding.html#账号模型与绑定","1":"/zh/concepts/identity-and-binding.html#账号模型","2":"/zh/concepts/identity-and-binding.html#接入平台与-bot","3":"/zh/concepts/identity-and-binding.html#为什么账号绑定是账号作用域","4":"/zh/concepts/identity-and-binding.html#账号绑定流程-当前共识","5":"/zh/concepts/identity-and-binding.html#bot-类型语义","6":"/zh/#memoh-文档","7":"/zh/#文档章节","8":"/zh/#面向文档贡献者","9":"/zh/#当前维护范围","10":"/zh/concepts/#核心概念","11":"/zh/concepts/#概念图","12":"/zh/concepts/#为什么重要","13":"/zh/concepts/#本章内容","14":"/zh/style/terminology.html#术语规范","15":"/zh/style/terminology.html#规范术语","16":"/zh/style/terminology.html#推荐写法","17":"/zh/style/terminology.html#禁用或不推荐写法","18":"/zh/style/terminology.html#示例","19":"/zh/style/terminology.html#自检清单"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,1],"1":[1,1,16],"2":[2,1,8],"3":[1,1,10],"4":[3,1,9],"5":[2,1,11],"6":[2,1,8],"7":[1,2,3],"8":[1,2,2],"9":[1,2,14],"10":[1,1,4],"11":[1,1,15],"12":[1,1,13],"13":[1,1,2],"14":[1,1,5],"15":[1,1,22],"16":[1,1,16],"17":[1,1,12],"18":[1,1,11],"19":[1,1,6]},"averageFieldLength":[1.25,1.15,9.400000000000002],"storedFields":{"0":{"title":"账号模型与绑定","titles":[]},"1":{"title":"账号模型","titles":["账号模型与绑定"]},"2":{"title":"接入平台与 Bot","titles":["账号模型与绑定"]},"3":{"title":"为什么账号绑定是账号作用域","titles":["账号模型与绑定"]},"4":{"title":"账号绑定流程(当前共识)","titles":["账号模型与绑定"]},"5":{"title":"Bot 类型语义","titles":["账号模型与绑定"]},"6":{"title":"Memoh 文档","titles":[]},"7":{"title":"文档章节","titles":["Memoh 文档"]},"8":{"title":"面向文档贡献者","titles":["Memoh 文档"]},"9":{"title":"当前维护范围","titles":["Memoh 文档"]},"10":{"title":"核心概念","titles":[]},"11":{"title":"概念图","titles":["核心概念"]},"12":{"title":"为什么重要","titles":["核心概念"]},"13":{"title":"本章内容","titles":["核心概念"]},"14":{"title":"术语规范","titles":[]},"15":{"title":"规范术语","titles":["术语规范"]},"16":{"title":"推荐写法","titles":["术语规范"]},"17":{"title":"禁用或不推荐写法","titles":["术语规范"]},"18":{"title":"示例","titles":["术语规范"]},"19":{"title":"自检清单","titles":["术语规范"]}},"dirtCount":0,"index":[["表述为接入平台",{"2":{"19":1}}],["叙述中是否将",{"2":{"19":1}}],["自检清单",{"0":{"19":1}}],["里的用户",{"2":{"18":1}}],["错误",{"2":{"18":1}}],["正确",{"2":{"18":2}}],["示例",{"0":{"18":1}}],["这类错误语义",{"2":{"17":1}}],["写出",{"2":{"17":1}}],["未区分系统账号与平台账号",{"2":{"17":1}}],["平台用户",{"2":{"17":1}}],["平台账号是用户在飞书上的账号",{"2":{"18":1}}],["平台账号是",{"2":{"17":1}}],["平台账号在支持的接入平台会话中发送",{"2":{"4":1}}],["平台账号在初始阶段可以不绑定系统账号",{"2":{"1":1}}],["平台账号",{"2":{"1":1,"9":1,"11":1,"12":1,"15":1,"16":2}}],["使用含糊表述如",{"2":{"17":1}}],["除非明确引用代码符号",{"2":{"17":1}}],["在概念文档中直接使用",{"2":{"17":1}}],["禁用或不推荐写法",{"0":{"17":1}}],["后续可只用中文术语",{"2":{"16":1}}],["首次出现保留技术别名",{"2":{"16":1}}],["描述业务行为时",{"2":{"16":1}}],["优先写",{"2":{"16":2}}],["面向产品语义时",{"2":{"16":1}}],["面向文档贡献者",{"0":{"8":1}}],["推荐写法",{"0":{"16":1}}],["用于账号绑定的一次性代码",{"2":{"15":1}}],["用户在外部接入平台上的账号",{"2":{"11":1,"15":1}}],["用户以自己的系统账号申请",{"2":{"4":1}}],["绑定码",{"2":{"15":1}}],["承载入站消息的外部平台",{"2":{"15":1}}],["内账号",{"2":{"15":1}}],["内部账号",{"2":{"1":1,"17":1}}],["规范术语",{"0":{"15":1}}],["适用对象",{"2":{"14":1}}],["如飞书账号",{"2":{"12":1}}],["统一指用户在对应平台上的真实账号",{"2":{"12":1}}],["术语说明",{"2":{"12":1}}],["术语规范",{"0":{"14":1},"1":{"15":1,"16":1,"17":1,"18":1,"19":1},"2":{"8":1}}],["授权与账号绑定解耦",{"2":{"12":1}}],["并将",{"2":{"12":1}}],["因此我们明确区分平台账号与系统账号",{"2":{"12":1}}],["需要同时处理外部接入平台消息与系统内权限控制",{"2":{"12":1}}],["为什么重要",{"0":{"12":1}}],["为什么账号绑定是账号作用域",{"0":{"3":1}}],["把平台账号关联到系统账号的过程",{"2":{"11":1,"15":1}}],["例如用户的飞书账号",{"2":{"11":1}}],["例如飞书账号",{"2":{"1":1,"9":1}}],["概念图",{"0":{"11":1}}],["的核心账号与访问概念",{"2":{"10":1}}],["的职责是完成这两类账号的关联",{"2":{"1":1}}],["本页用于统一写作语义",{"2":{"14":1}}],["本章内容",{"0":{"13":1}}],["本章节用于定义",{"2":{"10":1}}],["本文档记录的是产品语义与共识方向",{"2":{"5":1}}],["指用户在外部平台上的真实账号",{"2":{"9":1}}],["说明",{"2":{"9":1}}],["说明账号绑定与",{"2":{"9":1}}],["访问控制之间的关系",{"2":{"9":1}}],["访问控制保持独立",{"2":{"3":1}}],["解释为什么账号绑定是账号作用域",{"2":{"9":1}}],["区分系统账号与平台账号",{"2":{"9":1}}],["当前文档先聚焦账号语义与访问控制",{"2":{"9":1}}],["当前维护范围",{"0":{"9":1}}],["当前共识",{"0":{"4":1}}],["核心概念",{"0":{"10":1},"1":{"11":1,"12":1,"13":1},"2":{"7":1}}],["快速开始",{"2":{"7":1}}],["actor",{"2":{"16":1,"17":1,"18":1}}],["agent",{"2":{"6":1}}],["ai",{"2":{"6":1}}],["容器化的",{"2":{"6":1}}],["长记忆",{"2":{"6":1}}],["文档编写者与维护者",{"2":{"14":1}}],["文档中的",{"2":{"12":1}}],["文档章节",{"0":{"7":1}}],["文档",{"0":{"6":1},"1":{"7":1,"8":1,"9":1}}],["部分运行时细节仍可能处于收敛阶段",{"2":{"5":1}}],["注",{"2":{"5":1}}],["owner",{"2":{"5":1}}],["语义上应为单",{"2":{"5":1}}],["personal",{"2":{"5":1}}],["public",{"2":{"5":1}}],["支持成员协作语义",{"2":{"5":1}}],["类型语义",{"0":{"5":1}}],["成员与授权由独立流程处理",{"2":{"4":1}}],["完成平台账号到系统账号的绑定",{"2":{"4":1}}],["code",{"2":{"4":3,"15":1}}],["channel",{"2":{"2":1,"15":1,"16":1,"19":1}}],["channelidentity",{"2":{"1":1,"11":1,"15":1,"16":1}}],["可演进",{"2":{"3":1}}],["让",{"2":{"3":1}}],["不要直接写",{"2":{"16":2}}],["不指本项目内部账号",{"2":{"12":1}}],["不应依赖成员机制",{"2":{"5":1}}],["不把账号绑定与成员管理语义耦合在一起",{"2":{"3":1}}],["不是面向最终用户的功能说明",{"2":{"14":1}}],["不是",{"2":{"1":1,"9":1,"11":1,"15":1,"18":1}}],["它只负责平台账号与系统账号的绑定",{"2":{"3":1}}],["资源权限",{"2":{"3":1}}],["而不是直接发放",{"2":{"3":1}}],["账号绑定用于把平台账号关联到系统账号",{"2":{"18":1}}],["账号绑定",{"2":{"11":1,"15":1,"16":1}}],["账号绑定流程",{"0":{"4":1}}],["账号绑定的目标是建立账号归属关系",{"2":{"3":1}}],["账号模型",{"0":{"1":1}}],["账号模型与绑定",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1},"2":{"13":1}}],["入站消息由平台账号产生",{"2":{"2":1}}],["由系统账号管理的资源与授权边界",{"2":{"15":1}}],["由系统账号管理的资源与访问边界",{"2":{"11":1}}],["由系统账号管理",{"2":{"2":1}}],["接入平台",{"2":{"2":1,"15":1,"16":1}}],["接入平台与",{"0":{"2":1}}],["bot",{"0":{"2":1,"5":1},"2":{"2":2,"3":2,"4":1,"5":2,"9":1,"11":1,"12":1,"15":1}}],["bind",{"2":{"1":1,"4":1,"11":1,"15":2,"16":1}}],["系统",{"2":{"6":1}}],["系统校验",{"2":{"4":1}}],["系统内账号",{"2":{"1":1,"11":2,"15":1}}],["系统账号",{"2":{"1":1,"9":1,"11":1,"15":1,"16":1,"18":1}}],["是否仅在首处保留技术别名",{"2":{"19":1}}],["是否明确区分了系统账号与平台账号",{"2":{"19":1}}],["是一个多成员",{"2":{"6":1}}],["是系统内的授权与资源边界",{"2":{"2":1}}],["是入站消息来源",{"2":{"2":1}}],["是",{"2":{"1":1,"18":1}}],["是用户在外部接入平台上的账号",{"2":{"1":1}}],["user",{"2":{"1":1,"11":1,"15":1,"16":1}}],["将平台账号与系统账号视为两类不同实体",{"2":{"1":1}}],["memoh",{"0":{"6":1},"1":{"7":1,"8":1,"9":1},"2":{"1":3,"6":1,"9":1,"10":1,"11":2,"12":1,"15":2,"17":1,"18":2}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.DozfLPzs.js b/assets/chunks/VPLocalSearchBox.-52_PJ7s.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.DozfLPzs.js rename to assets/chunks/VPLocalSearchBox.-52_PJ7s.js index 17afc821..f83d8f5b 100644 --- a/assets/chunks/VPLocalSearchBox.DozfLPzs.js +++ b/assets/chunks/VPLocalSearchBox.-52_PJ7s.js @@ -1,4 +1,4 @@ -var At=Object.defineProperty;var Ct=(a,e,t)=>e in a?At(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>Ct(a,typeof e!="symbol"?e+"":e,t);import{V as nt,q as Be,ah as Mt,h as be,ai as rt,aj as Lt,ak as Dt,al as Pt,G as ce,d as zt,am as it,p as he,an as Vt,ao as jt,s as $t,ap as Bt,v as Le,P as ve,O as _e,aq as Wt,ar as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,as as Qt,at as Yt,au as Zt,c as Q,n as st,e as xe,B as at,F as ot,a as pe,t as me,av as Xt,aw as lt,ax as en,a5 as tn,aa as nn,ay as rn,_ as sn}from"./framework.ePeAWSvT.js";import{u as an,c as on}from"./theme.CVaJS-5R.js";const ln={root:()=>nt(()=>import("./@localSearchIndexroot.C8Ng6z1P.js"),[]),zh:()=>nt(()=>import("./@localSearchIndexzh.hHhvpH9g.js"),[])};/*! +var At=Object.defineProperty;var Ct=(a,e,t)=>e in a?At(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>Ct(a,typeof e!="symbol"?e+"":e,t);import{V as nt,q as Be,ah as Mt,h as be,ai as rt,aj as Lt,ak as Dt,al as Pt,G as ce,d as zt,am as it,p as he,an as Vt,ao as jt,s as $t,ap as Bt,v as Le,P as ve,O as _e,aq as Wt,ar as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,as as Qt,at as Yt,au as Zt,c as Q,n as st,e as xe,B as at,F as ot,a as pe,t as me,av as Xt,aw as lt,ax as en,a5 as tn,aa as nn,ay as rn,_ as sn}from"./framework.ePeAWSvT.js";import{u as an,c as on}from"./theme.C3TxVq5K.js";const ln={root:()=>nt(()=>import("./@localSearchIndexroot.B9pKhhFx.js"),[]),zh:()=>nt(()=>import("./@localSearchIndexzh.dDuBvO1t.js"),[])};/*! * tabbable 6.4.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var bt=["input:not([inert]):not([inert] *)","select:not([inert]):not([inert] *)","textarea:not([inert]):not([inert] *)","a[href]:not([inert]):not([inert] *)","button:not([inert]):not([inert] *)","[tabindex]:not(slot):not([inert]):not([inert] *)","audio[controls]:not([inert]):not([inert] *)","video[controls]:not([inert]):not([inert] *)",'[contenteditable]:not([contenteditable="false"]):not([inert]):not([inert] *)',"details>summary:first-of-type:not([inert]):not([inert] *)","details:not([inert]):not([inert] *)"],ke=bt.join(","),yt=typeof Element>"u",ae=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!yt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Fe=function(e,t){var n;t===void 0&&(t=!0);var r=e==null||(n=e.getAttribute)===null||n===void 0?void 0:n.call(e,"inert"),s=r===""||r==="true",i=s||t&&e&&(typeof e.closest=="function"?e.closest("[inert]"):Fe(e.parentNode));return i},cn=function(e){var t,n=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return n===""||n==="true"},wt=function(e,t,n){if(Fe(e))return[];var r=Array.prototype.slice.apply(e.querySelectorAll(ke));return t&&ae.call(e,ke)&&r.unshift(e),r=r.filter(n),r},Re=function(e,t,n){for(var r=[],s=Array.from(e);s.length;){var i=s.shift();if(!Fe(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=Re(l,!0,n);n.flatten?r.push.apply(r,c):r.push({scopeParent:i,candidates:c})}else{var h=ae.call(i,ke);h&&n.filter(i)&&(t||!e.includes(i))&&r.push(i);var m=i.shadowRoot||typeof n.getShadowRoot=="function"&&n.getShadowRoot(i),p=!Fe(m,!1)&&(!n.shadowRootFilter||n.shadowRootFilter(i));if(m&&p){var b=Re(m===!0?i.children:m.children,!0,n);n.flatten?r.push.apply(r,b):r.push({scopeParent:i,candidates:b})}else s.unshift.apply(s,i.children)}}return r},St=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||cn(e))&&!St(e)?0:e.tabIndex},un=function(e,t){var n=se(e);return n<0&&t&&!St(e)?0:n},dn=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},_t=function(e){return e.tagName==="INPUT"},fn=function(e){return _t(e)&&e.type==="hidden"},hn=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(n){return n.tagName==="SUMMARY"});return t},vn=function(e,t){for(var n=0;nsummary:first-of-type"),o=i?e.parentElement:e;if(ae.call(o,"details:not([open]) *"))return!0;if(!n||n==="full"||n==="full-native"||n==="legacy-full"){if(typeof r=="function"){for(var l=e;e;){var c=e.parentElement,h=Ne(e);if(c&&!c.shadowRoot&&r(c)===!0)return ct(e);e.assignedSlot?e=e.assignedSlot:!c&&h!==e.ownerDocument?e=h.host:e=c}e=l}if(bn(e))return!e.getClientRects().length;if(n!=="legacy-full")return!0}else if(n==="non-zero-area")return ct(e);return!1},wn=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var n=0;n=0)},xt=function(e){var t=[],n=[];return e.forEach(function(r,s){var i=!!r.scopeParent,o=i?r.scopeParent:r,l=un(o,i),c=i?xt(r.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):n.push({documentOrder:s,tabIndex:l,item:r,isScope:i,content:c})}),n.sort(dn).reduce(function(r,s){return s.isScope?r.push.apply(r,s.content):r.push(s.content),r},[]).concat(t)},_n=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:Sn}):n=wt(e,t.includeContainer,We.bind(null,t)),xt(n)},xn=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:Oe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):n=wt(e,t.includeContainer,Oe.bind(null,t)),n},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,ke)===!1?!1:We(t,e)},Tn=bt.concat("iframe:not([inert]):not([inert] *)").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Tn)===!1?!1:Oe(t,e)};/*! diff --git a/assets/chunks/theme.CVaJS-5R.js b/assets/chunks/theme.C3TxVq5K.js similarity index 99% rename from assets/chunks/theme.CVaJS-5R.js rename to assets/chunks/theme.C3TxVq5K.js index a6e0972c..cf10453d 100644 --- a/assets/chunks/theme.CVaJS-5R.js +++ b/assets/chunks/theme.C3TxVq5K.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.DozfLPzs.js","assets/chunks/framework.ePeAWSvT.js"])))=>i.map(i=>d[i]); -import{d as p,c as u,r as c,n as N,o as s,a as j,t as M,b as _,w as h,T as ue,e as m,_ as g,u as Ce,i as He,f as Be,g as de,h as y,j as d,k as i,l as z,m as se,p as S,q as F,s as X,v as U,x as ve,y as fe,z as Ee,A as Fe,F as x,B as A,C as W,D as Y,E as k,G as $e,H as B,I as ye,J as Q,K as G,L as Z,M as De,N as Pe,O as ie,P as Le,Q as Ve,R as ee,S as Oe,U as Ge,V as Ue,W as Se,X as Te,Y as je,Z as ze,$ as We,a0 as Ke,a1 as qe}from"./framework.ePeAWSvT.js";const Re=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(s(),u("span",{class:N(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[j(M(e.text),1)])],2))}}),Je={key:0,class:"VPBackdrop"},Xe=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:h(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Ye=g(Xe,[["__scopeId","data-v-eed25a81"]]),L=Ce;function Qe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(He(e)||e.startsWith("#")||!o.startsWith("http")||!Be(t))return e;const{site:r}=L(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function q({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=L(),l=y(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:y(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=q();return(a,o)=>{var r,l,v,f,$;return s(),u("div",et,[d("p",tt,M(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),d("h1",nt,M(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",at,M(((v=i(t).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",ot,[d("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},M((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=g(it,[["__scopeId","data-v-12885eca"]]);function Ne(e,t){if(Array.isArray(e))return R(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?R(a):R(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function R(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=R(a.items,o)),a})}function D(){const{frontmatter:e,page:t,theme:n}=L(),a=se("(min-width: 960px)"),o=S(!1),r=y(()=>{const w=n.value.sidebar,C=t.value.relativePath;return w?Ne(w,C):[]}),l=S(r.value);F(r,(w,C)=>{JSON.stringify(w)!==JSON.stringify(C)&&(l.value=r.value)});const v=y(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=y(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=y(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),V=y(()=>v.value&&a.value),b=y(()=>v.value?lt(l.value):[]);function P(){o.value=!0}function T(){o.value=!1}function I(){o.value?T():P()}return{isOpen:o,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:$,leftAside:f,isSidebarEnabled:V,open:P,close:T,toggle:I}}function ut(e,t){let n;X(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),ve(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=L(),a=S(!1),o=y(()=>e.value.collapsed!=null),r=y(()=>!!e.value.link),l=S(!1),v=()=>{l.value=z(t.value.relativePath,e.value.link)};F([t,e,n],v),U(v);const f=y(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=y(()=>!!(e.value.items&&e.value.items.length));X(()=>{a.value=!!(o.value&&e.value.collapsed)}),fe(()=>{(l.value||f.value)&&(a.value=!1)});function V(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:e}=D(),t=se("(min-width: 960px)"),n=se("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function Me(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Qe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const v=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(v+f-$)<1,b=ce.map(({element:T,link:I})=>({link:I,top:kt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,I)=>T.top-I.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:I}of b){if(I>v+Fe()+4)break;P=T}l(P)}function l(v){o&&o.classList.remove("active"),v==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let v=o[o.length-1];for(;v&&v.level>=l.level;)o.pop(),v=o[o.length-1];if(l.element.classList.contains("ignore-header")||v&&"shouldIgnore"in v){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=W("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(x,null,A(e.headers,({children:r,link:l,title:v})=>(s(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:t,title:v},M(v),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),xe=g(gt,[["__scopeId","data-v-63241767"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=$e([]);Y(()=>{a.value=me(t.value.outline??n.value.outline)});const o=S(),r=S();return pt(o,r),(l,v)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[d("div",$t,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",yt,M(i(Me)(i(n))),1),k(xe,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=g(Pt,[["__scopeId","data-v-83586972"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},Nt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=d("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mt=g(Nt,[["__scopeId","data-v-9cde58be"]]);function xt(){const{theme:e,page:t}=L();return y(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function It(){const{page:e,theme:t,frontmatter:n}=L();return y(()=>{var $,V,b,P,T,I,w,C;const a=Ne(t.value.sidebar,e.value.relativePath),o=ct(a),r=wt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),v=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((V=t.value.docFooter)==null?void 0:V.next)===!1&&!n.value.next||n.value.next===!1;return{prev:v?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((b=r[l-1])==null?void 0:b.docFooterText)??((P=r[l-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((T=r[l-1])==null?void 0:T.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((I=r[l+1])==null?void 0:I.docFooterText)??((w=r[l+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((C=r[l+1])==null?void 0:C.link)}}})}function wt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.tag??(t.href?"a":"span")),a=y(()=>t.href&&ye.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=y(()=>new Date(n.value.lastUpdated)),r=y(()=>o.value.toISOString()),l=S("");return U(()=>{X(()=>{var v,f,$;l.value=new Intl.DateTimeFormat((f=(v=t.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(v,f)=>{var $;return s(),u("p",At,[j(M((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},M(l.value),9,Ct)])}}}),Bt=g(Ht,[["__scopeId","data-v-f701d840"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Wt={class:"pager"},Kt=["innerHTML"],qt=["innerHTML"],Rt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=xt(),r=It(),l=y(()=>t.value.editLink&&a.value.editLink!==!1),v=y(()=>n.value.lastUpdated),f=y(()=>l.value||v.value||r.value.prev||r.value.next);return($,V)=>{var b,P,T,I;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(s(),u("div",Ft,[l.value?(s(),u("div",Dt,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:h(()=>[V[0]||(V[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),j(" "+M(i(o).text),1)]),_:1},8,["href"])])):m("",!0),v.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(b=i(r).prev)!=null&&b.link||(P=i(r).next)!=null&&P.link?(s(),u("nav",Gt,[V[1]||(V[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",Ut,[(T=i(r).prev)!=null&&T.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,jt),d("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),d("div",Wt,[(I=i(r).next)!=null&&I.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.next)||"Next page"},null,8,Kt),d("span",{class:"title",innerHTML:i(r).next.text},null,8,qt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-93d747d2"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=Q(),{hasSidebar:a,hasAside:o,leftAside:r}=D(),l=y(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,f)=>{const $=W("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(v.$slots,"doc-top",{},void 0,!0),d("div",Xt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Yt,[d("div",Qt,[k(Mt,null,{"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),d("div",Zt,[d("div",en,[c(v.$slots,"doc-before",{},void 0,!0),d("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=g(nn,[["__scopeId","data-v-f77eeb9a"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.href&&ye.test(t.href)),a=y(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[j(M(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-253e1106"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(s(),u(x,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(x,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=g(ln,[["__scopeId","data-v-ac1fd50d"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=Z("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[d("div",cn,[d("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[d("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(x,null,A(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[d("div",kn,[a[0]||(a[0]=d("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=g(_n,[["__scopeId","data-v-5b7048c6"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":h(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[d("p",Tn,[j(M(e.linkText)+" ",1),n[0]||(n[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Mn=g(Nn,[["__scopeId","data-v-685b4839"]]),xn={key:0,class:"VPFeatures"},In={class:"container"},wn={class:"items"},An=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=y(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",xn,[d("div",In,[d("div",wn,[(s(!0),u(x,null,A(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Mn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),Cn=g(An,[["__scopeId","data-v-d68608e5"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).features?(s(),_(Cn,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=De({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Pe(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=g(Bn,[["__scopeId","data-v-b105f97c"]]),Fn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const r=W("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":h(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:h(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Dn=g(Fn,[["__scopeId","data-v-79efab4e"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=W("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=g(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Dn,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Wn=g(zn,[["__scopeId","data-v-ffc8ccb8"]]),Kn={class:"container"},qn=["innerHTML"],Rn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[d("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,qn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,Rn)):m("",!0)])],2)):m("",!0)}}),Xn=g(Jn,[["__scopeId","data-v-2d1cad55"]]);function Yn(){const{theme:e,frontmatter:t}=L(),n=$e([]),a=y(()=>n.value.length>0);return Y(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Qn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=S(!1),o=S(0),r=S(),l=S();function v(b){var P;(P=r.value)!=null&&P.contains(b.target)||(a.value=!1)}F(a,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{a.value=!1}),Y(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Le(()=>{a.value=!1}))}function V(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[d("span",Qn,M(i(Me)(i(n))),1),P[0]||(P[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:h(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[d("div",Zn,[d("a",{class:"top-link",href:"#",onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)]),d("div",ea,[k(xe,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=g(ta,[["__scopeId","data-v-45ea4ad6"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D(),{headers:o}=Yn(),{y:r}=Ve(),l=S(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{o.value=me(n.value.outline??t.value.outline)});const v=y(()=>o.value.length===0),f=y(()=>v.value&&!a.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:v.value,fixed:f.value}));return(V,b)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[d("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",sa,M(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=g(ia,[["__scopeId","data-v-931d391e"]]);function la(){const e=S(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Q();return F(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[d("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=g(ca,[["render",fa],["__scopeId","data-v-a9012e77"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=Z("toggle-appearance",()=>{t.value=!t.value}),o=S("");return fe(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:h(()=>[...l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=g(ma,[["__scopeId","data-v-d7c1333c"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=g(ka,[["__scopeId","data-v-ecb2a7bf"]]),ke=S();let Ie=!1,oe=0;function ba(e){const t=S(!1);if(ee){!Ie&&ga(),oe++;const n=F(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});ve(()=>{n(),oe--,oe||$a()})}return Oe(t)}function ga(){document.addEventListener("focusin",we),Ie=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",we)}function we(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=g(La,[["__scopeId","data-v-706a330c"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),u(x,null,["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=g(Ta,[["__scopeId","data-v-0ac812ea"]]),Ma={class:"VPMenu"},xa={key:0,class:"items"},Ia=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Ma,[e.items?(s(),u("div",xa,[(s(!0),u(x,null,A(e.items,a=>(s(),u(x,{key:JSON.stringify(a)},["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(Na,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),wa=g(Ia,[["__scopeId","data-v-18ba6f64"]]),Aa=["aria-expanded","aria-label"],Ca={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Fa=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=S(!1),n=S();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Ca,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Aa),d("div",Ea,[k(wa,{items:e.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=g(Fa,[["__scopeId","data-v-481dc8d3"]]),Da=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=S();U(async()=>{var r;await Le();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=y(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Da))}}),Ga=g(Oa,[["__scopeId","data-v-b46c5524"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(x,null,A(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(ja,[["__scopeId","data-v-6eef0a7a"]]),za={key:0,class:"group translations"},Wa={class:"trans-title"},Ka={key:1,class:"group"},qa={class:"item appearance"},Ra={class:"label"},Ja={class:"appearance-action"},Xa={key:2,class:"group"},Ya={class:"item social-links"},Qa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=q({correspondingLink:!0}),r=y(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,v)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[i(a).length&&i(o).label?(s(),u("div",za,[d("p",Wa,M(i(o).label),1),(s(!0),u(x,null,A(i(a),f=>(s(),_(te,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[d("div",qa,[d("p",Ra,M(i(n).darkModeSwitchLabel||"Appearance"),1),d("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Xa,[d("div",Ya,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=g(Qa,[["__scopeId","data-v-a6bcd95d"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)])],10,eo))}}),no=g(to,[["__scopeId","data-v-4dfe6f20"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=g(oo,[["__scopeId","data-v-5e9e7b62"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=y(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=g(lo,[["__scopeId","data-v-c2ecbb00"]]);function uo(e){const{localeIndex:t,theme:n}=L();function a(o){var I,w,C;const r=o.split("."),l=(I=n.value.search)==null?void 0:I.options,v=l&&typeof l=="object",f=v&&((C=(w=l.locales)==null?void 0:w[t.value])==null?void 0:C.translations)||null,$=v&&l.translations||null;let V=f,b=$,P=e;const T=r.pop();for(const H of r){let O=null;const K=P==null?void 0:P[H];K&&(O=P=K);const ne=b==null?void 0:b[H];ne&&(O=b=ne);const ae=V==null?void 0:V[H];ae&&(O=V=ae),K||(P=O),ne||(b=O),ae||(V=O)}return(V==null?void 0:V[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},ge=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[d("span",fo,[o[0]||(o[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",ho,M(i(n)("button.buttonText")),1)]),o[1]||(o[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=Ge(()=>Ue(()=>import("./VPLocalSearchBox.DozfLPzs.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=S(!1),r=S(!1);U(()=>{});function l(){o.value||(o.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function f(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=S(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),ie("/",b=>{f(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var T;return s(),u("div",mo,[i(V)==="local"?(s(),u(x,{key:0},[$.value?(s(),_(i(t),{key:0,onClose:P[0]||(P[0]=I=>$.value=!1)})):m("",!0),d("div",po,[k(ge,{onClick:P[1]||(P[1]=I=>$.value=!0)})])],64)):i(V)==="algolia"?(s(),u(x,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((T=i(a).search)==null?void 0:T.options)??i(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=I=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k(ge,{onClick:l})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=g(bo,[["__scopeId","data-v-bb564449"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=D(),{currentLang:o}=q(),r=y(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),v=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[d("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:v.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,M(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=g(Lo,[["__scopeId","data-v-c27f2817"]]),So={class:"items"},To={class:"title"},No=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=q({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:h(()=>[d("div",So,[d("p",To,M(i(a).label),1),(s(!0),u(x,null,A(i(n),l=>(s(),_(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Mo=g(No,[["__scopeId","data-v-cc9bbb88"]]),xo={class:"wrapper"},Io={class:"container"},wo={class:"title"},Ao={class:"content"},Co={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Ve(),{hasSidebar:a}=D(),{frontmatter:o}=L(),r=S({});return fe(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,v)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[d("div",xo,[d("div",Io,[d("div",wo,[k(Vo,null,{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ao,[d("div",Co,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(Mo,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:v[0]||(v[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Bo=g(Ho,[["__scopeId","data-v-61b719fd"]]),Eo={key:0,class:"VPNavScreenAppearance"},Fo={class:"text"},Do=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[d("p",Fo,M(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=g(Do,[["__scopeId","data-v-be38e623"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=g(Uo,[["__scopeId","data-v-4bc5308e"]]),zo=["innerHTML"],Wo=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ae=g(Wo,[["__scopeId","data-v-4d091e22"]]),Ko={class:"VPNavScreenMenuGroupSection"},qo={key:0,class:"title"},Ro=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",qo,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),_(Ae,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=g(Ro,[["__scopeId","data-v-a6b26dec"]]),Xo=["aria-controls","aria-expanded"],Yo=["innerHTML"],Qo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=S(!1),a=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[d("span",{class:"button-text",innerHTML:e.text},null,8,Yo),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Xo),d("div",{id:a.value,class:"items"},[(s(!0),u(x,null,A(e.items,v=>(s(),u(x,{key:JSON.stringify(v)},["link"in v?(s(),u("div",Zo,[k(Ae,{item:v},null,8,["item"])])):"component"in v?(s(),u("div",es,[(s(),_(B(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Qo)],2))}}),as=g(ns,[["__scopeId","data-v-f525cb67"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=q({correspondingLink:!0}),a=S(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[d("button",{class:"title",onClick:o},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),j(" "+M(i(n).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",rs,[(s(!0),u(x,null,A(i(t),v=>(s(),u("li",{key:v.link,class:"item"},[k(E,{class:"link",href:v.link},{default:h(()=>[j(M(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=g(ls,[["__scopeId","data-v-47d3cd1d"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=S(null),n=Se(ee?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:h(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=g(ds,[["__scopeId","data-v-70e2ae04"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=L(),r=y(()=>o.value.navbar!==!1);return Te("close-screen",n),X(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,v)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":h(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=g(hs,[["__scopeId","data-v-bb5180c9"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:v,toggle:f}=dt(y(()=>t.item)),$=y(()=>v.value?"section":"div"),V=y(()=>o.value?"a":"div"),b=y(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),T=y(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function I(C){"key"in C&&C.key!=="Enter"||!t.item.link&&f()}function w(){t.item.link&&f()}return(C,H)=>{const O=W("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",T.value])},{default:h(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:P.value},je(e.item.items?{click:I,keydown:I}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=d("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:V.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:h(()=>[(s(),_(B(b.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(b.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:ze(w,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(x,{key:0},A(e.item.items,K=>(s(),_(O,{key:K.text,item:K,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=g(_s,[["__scopeId","data-v-25e96189"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=S(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),We(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(x,null,A(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=g(gs,[["__scopeId","data-v-38c437a9"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=D(),a=e,o=S(null),r=Se(ee?document.body:null);F([a,o],()=>{var v;a.open?(r.value=!0,(v=o.value)==null||v.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=S(0);return F(t,()=>{l.value+=1},{deep:!0}),(v,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=Ke(()=>{},["stop"]))},[f[2]||(f[2]=d("div",{class:"curtain"},null,-1)),d("nav",ys,[f[1]||(f[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=g(Ps,[["__scopeId","data-v-1609ce74"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=Q(),a=S();F(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const v=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",v)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",v),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(x,null,[d("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},M(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=g(Vs,[["__scopeId","data-v-3e188802"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=D(),o=Q();F(()=>o.path,a),ut(t,a);const{frontmatter:r}=L(),l=qe(),v=y(()=>!!l["home-hero-image"]);return Te("hero-image-slot-exists",v),(f,$)=>{const V=W("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Ye,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":h(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":h(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Wn,null,{"page-top":h(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Xn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(V,{key:1}))}}}),Ns=g(Ts,[["__scopeId","data-v-b35b5679"]]),xs={Layout:Ns,enhanceApp:({app:e})=>{e.component("Badge",Re)}};export{uo as c,xs as t,L as u}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.-52_PJ7s.js","assets/chunks/framework.ePeAWSvT.js"])))=>i.map(i=>d[i]); +import{d as p,c as u,r as c,n as N,o as s,a as j,t as M,b as _,w as h,T as ue,e as m,_ as g,u as Ce,i as He,f as Be,g as de,h as y,j as d,k as i,l as z,m as se,p as S,q as F,s as X,v as U,x as ve,y as fe,z as Ee,A as Fe,F as x,B as A,C as W,D as Y,E as k,G as $e,H as B,I as ye,J as Q,K as G,L as Z,M as De,N as Pe,O as ie,P as Le,Q as Ve,R as ee,S as Oe,U as Ge,V as Ue,W as Se,X as Te,Y as je,Z as ze,$ as We,a0 as Ke,a1 as qe}from"./framework.ePeAWSvT.js";const Re=p({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(s(),u("span",{class:N(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[j(M(e.text),1)])],2))}}),Je={key:0,class:"VPBackdrop"},Xe=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:h(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Ye=g(Xe,[["__scopeId","data-v-eed25a81"]]),L=Ce;function Qe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(He(e)||e.startsWith("#")||!o.startsWith("http")||!Be(t))return e;const{site:r}=L(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function q({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=L(),l=y(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:y(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=L(),{currentLang:n}=q();return(a,o)=>{var r,l,v,f,$;return s(),u("div",et,[d("p",tt,M(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),d("h1",nt,M(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=d("div",{class:"divider"},null,-1)),d("blockquote",at,M(((v=i(t).notFound)==null?void 0:v.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",ot,[d("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},M((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=g(it,[["__scopeId","data-v-12885eca"]]);function Ne(e,t){if(Array.isArray(e))return R(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?R(a):R(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function R(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=R(a.items,o)),a})}function D(){const{frontmatter:e,page:t,theme:n}=L(),a=se("(min-width: 960px)"),o=S(!1),r=y(()=>{const w=n.value.sidebar,C=t.value.relativePath;return w?Ne(w,C):[]}),l=S(r.value);F(r,(w,C)=>{JSON.stringify(w)!==JSON.stringify(C)&&(l.value=r.value)});const v=y(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=y(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=y(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),V=y(()=>v.value&&a.value),b=y(()=>v.value?lt(l.value):[]);function P(){o.value=!0}function T(){o.value=!1}function I(){o.value?T():P()}return{isOpen:o,sidebar:l,sidebarGroups:b,hasSidebar:v,hasAside:$,leftAside:f,isSidebarEnabled:V,open:P,close:T,toggle:I}}function ut(e,t){let n;X(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),ve(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=L(),a=S(!1),o=y(()=>e.value.collapsed!=null),r=y(()=>!!e.value.link),l=S(!1),v=()=>{l.value=z(t.value.relativePath,e.value.link)};F([t,e,n],v),U(v);const f=y(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=y(()=>!!(e.value.items&&e.value.items.length));X(()=>{a.value=!!(o.value&&e.value.collapsed)}),fe(()=>{(l.value||f.value)&&(a.value=!1)});function V(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:e}=D(),t=se("(min-width: 960px)"),n=se("(min-width: 1280px)");return{isAsideEnabled:y(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function Me(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Qe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const v=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(v+f-$)<1,b=ce.map(({element:T,link:I})=>({link:I,top:kt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,I)=>T.top-I.top);if(!b.length){l(null);return}if(v<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:I}of b){if(I>v+Fe()+4)break;P=T}l(P)}function l(v){o&&o.classList.remove("active"),v==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let v=o[o.length-1];for(;v&&v.level>=l.level;)o.pop(),v=o[o.length-1];if(l.element.classList.contains("ignore-header")||v&&"shouldIgnore"in v){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=W("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(x,null,A(e.headers,({children:r,link:l,title:v})=>(s(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:t,title:v},M(v),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),xe=g(gt,[["__scopeId","data-v-63241767"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=L(),a=$e([]);Y(()=>{a.value=me(t.value.outline??n.value.outline)});const o=S(),r=S();return pt(o,r),(l,v)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[d("div",$t,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",yt,M(i(Me)(i(n))),1),k(xe,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=g(Pt,[["__scopeId","data-v-83586972"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},Nt=p({__name:"VPDocAside",setup(e){const{theme:t}=L();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=d("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Mt=g(Nt,[["__scopeId","data-v-9cde58be"]]);function xt(){const{theme:e,page:t}=L();return y(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function It(){const{page:e,theme:t,frontmatter:n}=L();return y(()=>{var $,V,b,P,T,I,w,C;const a=Ne(t.value.sidebar,e.value.relativePath),o=ct(a),r=wt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),v=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((V=t.value.docFooter)==null?void 0:V.next)===!1&&!n.value.next||n.value.next===!1;return{prev:v?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((b=r[l-1])==null?void 0:b.docFooterText)??((P=r[l-1])==null?void 0:P.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((T=r[l-1])==null?void 0:T.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((I=r[l+1])==null?void 0:I.docFooterText)??((w=r[l+1])==null?void 0:w.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((C=r[l+1])==null?void 0:C.link)}}})}function wt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.tag??(t.href?"a":"span")),a=y(()=>t.href&&ye.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=L(),o=y(()=>new Date(n.value.lastUpdated)),r=y(()=>o.value.toISOString()),l=S("");return U(()=>{X(()=>{var v,f,$;l.value=new Intl.DateTimeFormat((f=(v=t.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(v,f)=>{var $;return s(),u("p",At,[j(M((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},M(l.value),9,Ct)])}}}),Bt=g(Ht,[["__scopeId","data-v-f701d840"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Wt={class:"pager"},Kt=["innerHTML"],qt=["innerHTML"],Rt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=L(),o=xt(),r=It(),l=y(()=>t.value.editLink&&a.value.editLink!==!1),v=y(()=>n.value.lastUpdated),f=y(()=>l.value||v.value||r.value.prev||r.value.next);return($,V)=>{var b,P,T,I;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||v.value?(s(),u("div",Ft,[l.value?(s(),u("div",Dt,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:h(()=>[V[0]||(V[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),j(" "+M(i(o).text),1)]),_:1},8,["href"])])):m("",!0),v.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(b=i(r).prev)!=null&&b.link||(P=i(r).next)!=null&&P.link?(s(),u("nav",Gt,[V[1]||(V[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",Ut,[(T=i(r).prev)!=null&&T.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,jt),d("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),d("div",Wt,[(I=i(r).next)!=null&&I.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:h(()=>{var w;return[d("span",{class:"desc",innerHTML:((w=i(t).docFooter)==null?void 0:w.next)||"Next page"},null,8,Kt),d("span",{class:"title",innerHTML:i(r).next.text},null,8,qt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-93d747d2"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=L(),n=Q(),{hasSidebar:a,hasAside:o,leftAside:r}=D(),l=y(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,f)=>{const $=W("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(v.$slots,"doc-top",{},void 0,!0),d("div",Xt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Yt,[d("div",Qt,[k(Mt,null,{"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),d("div",Zt,[d("div",en,[c(v.$slots,"doc-before",{},void 0,!0),d("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(v.$slots,"doc-after",{},void 0,!0)])])]),c(v.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=g(nn,[["__scopeId","data-v-f77eeb9a"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=y(()=>t.href&&ye.test(t.href)),a=y(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[j(M(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-253e1106"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=W("VPImage",!0);return e.image?(s(),u(x,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(x,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=g(ln,[["__scopeId","data-v-ac1fd50d"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=Z("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[d("div",cn,[d("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[d("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(x,null,A(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[d("div",kn,[a[0]||(a[0]=d("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=g(_n,[["__scopeId","data-v-5b7048c6"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":h(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},Nn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[d("p",Tn,[j(M(e.linkText)+" ",1),n[0]||(n[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Mn=g(Nn,[["__scopeId","data-v-685b4839"]]),xn={key:0,class:"VPFeatures"},In={class:"container"},wn={class:"items"},An=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=y(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",xn,[d("div",In,[d("div",wn,[(s(!0),u(x,null,A(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Mn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),Cn=g(An,[["__scopeId","data-v-d68608e5"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=L();return(n,a)=>i(t).features?(s(),_(Cn,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=De({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Pe(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=g(Bn,[["__scopeId","data-v-b105f97c"]]),Fn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=L();return(a,o)=>{const r=W("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":h(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:h(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Dn=g(Fn,[["__scopeId","data-v-79efab4e"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=W("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=g(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Dn,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Wn=g(zn,[["__scopeId","data-v-ffc8ccb8"]]),Kn={class:"container"},qn=["innerHTML"],Rn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[d("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,qn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,Rn)):m("",!0)])],2)):m("",!0)}}),Xn=g(Jn,[["__scopeId","data-v-2d1cad55"]]);function Yn(){const{theme:e,frontmatter:t}=L(),n=$e([]),a=y(()=>n.value.length>0);return Y(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Qn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=L(),a=S(!1),o=S(0),r=S(),l=S();function v(b){var P;(P=r.value)!=null&&P.contains(b.target)||(a.value=!1)}F(a,b=>{if(b){document.addEventListener("click",v);return}document.removeEventListener("click",v)}),ie("Escape",()=>{a.value=!1}),Y(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Le(()=>{a.value=!1}))}function V(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[d("span",Qn,M(i(Me)(i(n))),1),P[0]||(P[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:h(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[d("div",Zn,[d("a",{class:"top-link",href:"#",onClick:V},M(i(n).returnToTopLabel||"Return to top"),1)]),d("div",ea,[k(xe,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=g(ta,[["__scopeId","data-v-45ea4ad6"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=L(),{hasSidebar:a}=D(),{headers:o}=Yn(),{y:r}=Ve(),l=S(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{o.value=me(n.value.outline??t.value.outline)});const v=y(()=>o.value.length===0),f=y(()=>v.value&&!a.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:v.value,fixed:f.value}));return(V,b)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[d("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",sa,M(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=g(ia,[["__scopeId","data-v-931d391e"]]);function la(){const e=S(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Q();return F(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[d("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=g(ca,[["render",fa],["__scopeId","data-v-a9012e77"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=L(),a=Z("toggle-appearance",()=>{t.value=!t.value}),o=S("");return fe(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:h(()=>[...l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=g(ma,[["__scopeId","data-v-d7c1333c"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=L();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=g(ka,[["__scopeId","data-v-ecb2a7bf"]]),ke=S();let Ie=!1,oe=0;function ba(e){const t=S(!1);if(ee){!Ie&&ga(),oe++;const n=F(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});ve(()=>{n(),oe--,oe||$a()})}return Oe(t)}function ga(){document.addEventListener("focusin",we),Ie=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",we)}function we(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=g(La,[["__scopeId","data-v-706a330c"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),u(x,null,["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),Na=g(Ta,[["__scopeId","data-v-0ac812ea"]]),Ma={class:"VPMenu"},xa={key:0,class:"items"},Ia=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Ma,[e.items?(s(),u("div",xa,[(s(!0),u(x,null,A(e.items,a=>(s(),u(x,{key:JSON.stringify(a)},["link"in a?(s(),_(te,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(Na,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),wa=g(Ia,[["__scopeId","data-v-18ba6f64"]]),Aa=["aria-expanded","aria-label"],Ca={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Fa=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=S(!1),n=S();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Ca,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Aa),d("div",Ea,[k(wa,{items:e.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=g(Fa,[["__scopeId","data-v-481dc8d3"]]),Da=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=S();U(async()=>{var r;await Le();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=y(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Da))}}),Ga=g(Oa,[["__scopeId","data-v-b46c5524"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(x,null,A(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(ja,[["__scopeId","data-v-6eef0a7a"]]),za={key:0,class:"group translations"},Wa={class:"trans-title"},Ka={key:1,class:"group"},qa={class:"item appearance"},Ra={class:"label"},Ja={class:"appearance-action"},Xa={key:2,class:"group"},Ya={class:"item social-links"},Qa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=L(),{localeLinks:a,currentLang:o}=q({correspondingLink:!0}),r=y(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,v)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[i(a).length&&i(o).label?(s(),u("div",za,[d("p",Wa,M(i(o).label),1),(s(!0),u(x,null,A(i(a),f=>(s(),_(te,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[d("div",qa,[d("p",Ra,M(i(n).darkModeSwitchLabel||"Appearance"),1),d("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Xa,[d("div",Ya,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=g(Qa,[["__scopeId","data-v-a6bcd95d"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)])],10,eo))}}),no=g(to,[["__scopeId","data-v-4dfe6f20"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=L();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=g(oo,[["__scopeId","data-v-5e9e7b62"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=L(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=y(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=g(lo,[["__scopeId","data-v-c2ecbb00"]]);function uo(e){const{localeIndex:t,theme:n}=L();function a(o){var I,w,C;const r=o.split("."),l=(I=n.value.search)==null?void 0:I.options,v=l&&typeof l=="object",f=v&&((C=(w=l.locales)==null?void 0:w[t.value])==null?void 0:C.translations)||null,$=v&&l.translations||null;let V=f,b=$,P=e;const T=r.pop();for(const H of r){let O=null;const K=P==null?void 0:P[H];K&&(O=P=K);const ne=b==null?void 0:b[H];ne&&(O=b=ne);const ae=V==null?void 0:V[H];ae&&(O=V=ae),K||(P=O),ne||(b=O),ae||(V=O)}return(V==null?void 0:V[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},ge=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[d("span",fo,[o[0]||(o[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",ho,M(i(n)("button.buttonText")),1)]),o[1]||(o[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=Ge(()=>Ue(()=>import("./VPLocalSearchBox.-52_PJ7s.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a}=L(),o=S(!1),r=S(!1);U(()=>{});function l(){o.value||(o.value=!0,setTimeout(v,16))}function v(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||v()},16)}function f(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=S(!1);ie("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),ie("/",b=>{f(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var T;return s(),u("div",mo,[i(V)==="local"?(s(),u(x,{key:0},[$.value?(s(),_(i(t),{key:0,onClose:P[0]||(P[0]=I=>$.value=!1)})):m("",!0),d("div",po,[k(ge,{onClick:P[1]||(P[1]=I=>$.value=!0)})])],64)):i(V)==="algolia"?(s(),u(x,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((T=i(a).search)==null?void 0:T.options)??i(a).algolia,onVnodeBeforeMount:P[2]||(P[2]=I=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k(ge,{onClick:l})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=g(bo,[["__scopeId","data-v-bb564449"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=L(),{hasSidebar:a}=D(),{currentLang:o}=q(),r=y(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),v=y(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[d("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:v.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,M(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=g(Lo,[["__scopeId","data-v-c27f2817"]]),So={class:"items"},To={class:"title"},No=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=L(),{localeLinks:n,currentLang:a}=q({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:h(()=>[d("div",So,[d("p",To,M(i(a).label),1),(s(!0),u(x,null,A(i(n),l=>(s(),_(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Mo=g(No,[["__scopeId","data-v-cc9bbb88"]]),xo={class:"wrapper"},Io={class:"container"},wo={class:"title"},Ao={class:"content"},Co={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Ve(),{hasSidebar:a}=D(),{frontmatter:o}=L(),r=S({});return fe(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,v)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[d("div",xo,[d("div",Io,[d("div",wo,[k(Vo,null,{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ao,[d("div",Co,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(Mo,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:v[0]||(v[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),v[1]||(v[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Bo=g(Ho,[["__scopeId","data-v-61b719fd"]]),Eo={key:0,class:"VPNavScreenAppearance"},Fo={class:"text"},Do=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=L();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[d("p",Fo,M(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=g(Do,[["__scopeId","data-v-be38e623"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=g(Uo,[["__scopeId","data-v-4bc5308e"]]),zo=["innerHTML"],Wo=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=Z("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:h(()=>[d("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ae=g(Wo,[["__scopeId","data-v-4d091e22"]]),Ko={class:"VPNavScreenMenuGroupSection"},qo={key:0,class:"title"},Ro=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",qo,M(e.text),1)):m("",!0),(s(!0),u(x,null,A(e.items,a=>(s(),_(Ae,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=g(Ro,[["__scopeId","data-v-a6b26dec"]]),Xo=["aria-controls","aria-expanded"],Yo=["innerHTML"],Qo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=S(!1),a=y(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[d("span",{class:"button-text",innerHTML:e.text},null,8,Yo),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Xo),d("div",{id:a.value,class:"items"},[(s(!0),u(x,null,A(e.items,v=>(s(),u(x,{key:JSON.stringify(v)},["link"in v?(s(),u("div",Zo,[k(Ae,{item:v},null,8,["item"])])):"component"in v?(s(),u("div",es,[(s(),_(B(v.component),G({ref_for:!0},v.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Qo)],2))}}),as=g(ns,[["__scopeId","data-v-f525cb67"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=L();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(x,null,A(i(t).nav,o=>(s(),u(x,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=L();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=q({correspondingLink:!0}),a=S(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[d("button",{class:"title",onClick:o},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),j(" "+M(i(n).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",rs,[(s(!0),u(x,null,A(i(t),v=>(s(),u("li",{key:v.link,class:"item"},[k(E,{class:"link",href:v.link},{default:h(()=>[j(M(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=g(ls,[["__scopeId","data-v-47d3cd1d"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=S(null),n=Se(ee?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:h(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[d("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=g(ds,[["__scopeId","data-v-70e2ae04"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=L(),r=y(()=>o.value.navbar!==!1);return Te("close-screen",n),X(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,v)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":h(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":h(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=g(hs,[["__scopeId","data-v-bb5180c9"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:v,toggle:f}=dt(y(()=>t.item)),$=y(()=>v.value?"section":"div"),V=y(()=>o.value?"a":"div"),b=y(()=>v.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),P=y(()=>o.value?void 0:"button"),T=y(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function I(C){"key"in C&&C.key!=="Enter"||!t.item.link&&f()}function w(){t.item.link&&f()}return(C,H)=>{const O=W("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",T.value])},{default:h(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:P.value},je(e.item.items?{click:I,keydown:I}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=d("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:V.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:h(()=>[(s(),_(B(b.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(b.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:ze(w,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(x,{key:0},A(e.item.items,K=>(s(),_(O,{key:K.text,item:K,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=g(_s,[["__scopeId","data-v-25e96189"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=S(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),We(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(x,null,A(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=g(gs,[["__scopeId","data-v-38c437a9"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=D(),a=e,o=S(null),r=Se(ee?document.body:null);F([a,o],()=>{var v;a.open?(r.value=!0,(v=o.value)==null||v.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=S(0);return F(t,()=>{l.value+=1},{deep:!0}),(v,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=Ke(()=>{},["stop"]))},[f[2]||(f[2]=d("div",{class:"curtain"},null,-1)),d("nav",ys,[f[1]||(f[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(v.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=g(Ps,[["__scopeId","data-v-1609ce74"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=L(),n=Q(),a=S();F(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const v=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",v)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",v),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(x,null,[d("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},M(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=g(Vs,[["__scopeId","data-v-3e188802"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=D(),o=Q();F(()=>o.path,a),ut(t,a);const{frontmatter:r}=L(),l=qe(),v=y(()=>!!l["home-hero-image"]);return Te("hero-image-slot-exists",v),(f,$)=>{const V=W("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Ye,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":h(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":h(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Wn,null,{"page-top":h(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Xn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(V,{key:1}))}}}),Ns=g(Ts,[["__scopeId","data-v-b35b5679"]]),xs={Layout:Ns,enhanceApp:({app:e})=>{e.component("Badge",Re)}};export{uo as c,xs as t,L as u}; diff --git a/assets/cli_auth.md.C8ws3CHD.js b/assets/cli_auth.md.C8ws3CHD.js deleted file mode 100644 index 440f336a..00000000 --- a/assets/cli_auth.md.C8ws3CHD.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as s,c as t,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Auth Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/auth.md","filePath":"cli/auth.md","lastUpdated":1771161622000}'),o={name:"cli/auth.md"};function n(l,a,h,r,d,p){return s(),t("div",null,[...a[0]||(a[0]=[i('

Auth Commands

login

Log in to the Memoh server. Prompts for username and password, then stores the JWT token in ~/.memoh/token.json.

bash
memoh login

Interactive prompts:

  • Username
  • Password

logout

Clear the stored token and log out.

bash
memoh logout

whoami

Show the current logged-in user (username, display name, user ID, role). Falls back to token info if the API call fails.

bash
memoh whoami
',12)])])}const m=e(o,[["render",n]]);export{u as __pageData,m as default}; diff --git a/assets/cli_auth.md.C8ws3CHD.lean.js b/assets/cli_auth.md.C8ws3CHD.lean.js deleted file mode 100644 index 4b920807..00000000 --- a/assets/cli_auth.md.C8ws3CHD.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as s,c as t,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Auth Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/auth.md","filePath":"cli/auth.md","lastUpdated":1771161622000}'),o={name:"cli/auth.md"};function n(l,a,h,r,d,p){return s(),t("div",null,[...a[0]||(a[0]=[i("",12)])])}const m=e(o,[["render",n]]);export{u as __pageData,m as default}; diff --git a/assets/cli_bot.md.BnhEB6FG.js b/assets/cli_bot.md.BnhEB6FG.js deleted file mode 100644 index 2f11c0f5..00000000 --- a/assets/cli_bot.md.BnhEB6FG.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as s,ag as i}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Bot Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/bot.md","filePath":"cli/bot.md","lastUpdated":1771161622000}'),d={name:"cli/bot.md"};function o(h,t,l,n,p,r){return e(),s("div",null,[...t[0]||(t[0]=[i('

Bot Commands

Manage bots and chat with them.

bot list

List all bots. Admins can filter by owner.

bash
memoh bot list [options]
OptionDescription
--owner <user_id>Filter by owner user ID (admin only)

bot create

Create a new bot. Prompts for type and optionally name.

bash
memoh bot create [options]
OptionDescription
--type <type>personal or public
--name <name>Display name
--avatar <url>Avatar URL
--activeSet bot active
--inactiveSet bot inactive

bot update

Update bot info. Bot ID can be passed as argument or selected interactively.

bash
memoh bot update [id] [options]
OptionDescription
--name <name>Display name
--avatar <url>Avatar URL
--activeSet bot active
--inactiveSet bot inactive

bot delete

Delete a bot. Asks for confirmation.

bash
memoh bot delete [id]

bot chat

Start an interactive streaming chat with a bot.

bash
memoh bot chat [id]

Type messages and press Enter. Type exit to quit.

bot set-model

Enable a model for a bot (chat, memory, or embedding).

bash
memoh bot set-model [id] [options]
OptionDescription
--as <usage>chat, memory, or embedding
--model <model_id>Model ID

Example:

bash
memoh bot set-model my-bot-id --as chat --model gpt-4
',27)])])}const k=a(d,[["render",o]]);export{b as __pageData,k as default}; diff --git a/assets/cli_bot.md.BnhEB6FG.lean.js b/assets/cli_bot.md.BnhEB6FG.lean.js deleted file mode 100644 index 886668cd..00000000 --- a/assets/cli_bot.md.BnhEB6FG.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as s,ag as i}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Bot Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/bot.md","filePath":"cli/bot.md","lastUpdated":1771161622000}'),d={name:"cli/bot.md"};function o(h,t,l,n,p,r){return e(),s("div",null,[...t[0]||(t[0]=[i("",27)])])}const k=a(d,[["render",o]]);export{b as __pageData,k as default}; diff --git a/assets/cli_channel.md.BBEJiWrG.js b/assets/cli_channel.md.BBEJiWrG.js deleted file mode 100644 index 73c59d27..00000000 --- a/assets/cli_channel.md.BBEJiWrG.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as i,ag as s}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Channel Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/channel.md","filePath":"cli/channel.md","lastUpdated":1771161622000}'),n={name:"cli/channel.md"};function h(l,t,d,o,p,c){return e(),i("div",null,[...t[0]||(t[0]=[s('

Channel Commands

Manage channels and bot/user channel configuration.

channel list

List available channel types (e.g. telegram, feishu, local).

bash
memoh channel list

channel info

Show channel metadata and schema for a channel type.

bash
memoh channel info [type]

If type is omitted, prompts to select from available channels.

channel config get

Get a bot's channel configuration.

bash
memoh channel config get [bot_id] [options]
OptionDescription
--type <type>Channel type

channel config set

Set a bot's channel configuration. Currently supports Feishu.

bash
memoh channel config set [bot_id] [options]
OptionDescription
--type <type>Channel type (e.g. feishu)
--app_id <id>Feishu App ID
--app_secret <secret>Feishu App Secret
--encrypt_key <key>Encrypt key (optional)
--verification_token <token>Verification token (optional)

channel bind get

Get the current user's channel binding for a platform.

bash
memoh channel bind get [options]
OptionDescription
--type <type>Channel type

channel bind set

Set the current user's channel binding. Currently supports Feishu (open_id or user_id).

bash
memoh channel bind set [options]
OptionDescription
--type <type>Channel type (e.g. feishu)
--open_id <id>Feishu Open ID
--user_id <id>Feishu User ID
',25)])])}const g=a(n,[["render",h]]);export{k as __pageData,g as default}; diff --git a/assets/cli_channel.md.BBEJiWrG.lean.js b/assets/cli_channel.md.BBEJiWrG.lean.js deleted file mode 100644 index b1b54fef..00000000 --- a/assets/cli_channel.md.BBEJiWrG.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as i,ag as s}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Channel Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/channel.md","filePath":"cli/channel.md","lastUpdated":1771161622000}'),n={name:"cli/channel.md"};function h(l,t,d,o,p,c){return e(),i("div",null,[...t[0]||(t[0]=[s("",25)])])}const g=a(n,[["render",h]]);export{k as __pageData,g as default}; diff --git a/assets/cli_chat.md.Cr9VFV7R.js b/assets/cli_chat.md.Cr9VFV7R.js deleted file mode 100644 index 1d80722f..00000000 --- a/assets/cli_chat.md.Cr9VFV7R.js +++ /dev/null @@ -1,3 +0,0 @@ -import{_ as a,o as s,c as i,ag as e}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Chat Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/chat.md","filePath":"cli/chat.md","lastUpdated":1771161622000}'),h={name:"cli/chat.md"};function n(o,t,l,d,p,r){return s(),i("div",null,[...t[0]||(t[0]=[e(`

Chat Commands

Default: Interactive Chat

Running memoh with no subcommand starts an interactive chat. Use --bot <id> to specify which bot to chat with; otherwise you'll be prompted to select one.

bash
memoh [options]
-memoh --bot <bot_id>
OptionDescription
--bot <id>Bot ID to chat with

Type your message and press Enter. Type exit to quit. Responses stream in real time.

tui

Terminal UI chat session. Same behavior as the default chat but explicitly invoked.

bash
memoh tui [options]
-memoh tui --bot <bot_id>
OptionDescription
--bot <id>Bot ID to chat with

version

Show the CLI version.

bash
memoh version
`,13)])])}const b=a(h,[["render",n]]);export{k as __pageData,b as default}; diff --git a/assets/cli_chat.md.Cr9VFV7R.lean.js b/assets/cli_chat.md.Cr9VFV7R.lean.js deleted file mode 100644 index e1e256f6..00000000 --- a/assets/cli_chat.md.Cr9VFV7R.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as s,c as i,ag as e}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Chat Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/chat.md","filePath":"cli/chat.md","lastUpdated":1771161622000}'),h={name:"cli/chat.md"};function n(o,t,l,d,p,r){return s(),i("div",null,[...t[0]||(t[0]=[e("",13)])])}const b=a(h,[["render",n]]);export{k as __pageData,b as default}; diff --git a/assets/cli_config.md.B8bSu8j2.js b/assets/cli_config.md.B8bSu8j2.js deleted file mode 100644 index 5838a590..00000000 --- a/assets/cli_config.md.B8bSu8j2.js +++ /dev/null @@ -1,4 +0,0 @@ -import{_ as a,o as i,c as t,ag as e}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Config Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/config.md","filePath":"cli/config.md","lastUpdated":1771161622000}'),n={name:"cli/config.md"};function o(p,s,h,l,d,c){return i(),t("div",null,[...s[0]||(s[0]=[e(`

Config Commands

The CLI stores its config in ~/.memoh/config.toml. Use these commands to view or update it.

config

Show the current config (host and port).

bash
memoh config

Output example:

host = "127.0.0.1"
-port = 8080

config set

Update the config. Prompts for host and port if not provided via options.

bash
memoh config set [options]
OptionDescription
--host <host>API host (e.g. 127.0.0.1 or api.example.com)
--port <port>API port (default: 8080)

Examples:

bash
memoh config set --host 192.168.1.100 --port 8080
-memoh config set
-# Interactive prompts for host and port
`,13)])])}const k=a(n,[["render",o]]);export{g as __pageData,k as default}; diff --git a/assets/cli_config.md.B8bSu8j2.lean.js b/assets/cli_config.md.B8bSu8j2.lean.js deleted file mode 100644 index bb5a1fb2..00000000 --- a/assets/cli_config.md.B8bSu8j2.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as i,c as t,ag as e}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Config Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/config.md","filePath":"cli/config.md","lastUpdated":1771161622000}'),n={name:"cli/config.md"};function o(p,s,h,l,d,c){return i(),t("div",null,[...s[0]||(s[0]=[e("",13)])])}const k=a(n,[["render",o]]);export{g as __pageData,k as default}; diff --git a/assets/cli_index.md.CZsWbIpX.js b/assets/cli_index.md.CZsWbIpX.js deleted file mode 100644 index e4d3903a..00000000 --- a/assets/cli_index.md.CZsWbIpX.js +++ /dev/null @@ -1,7 +0,0 @@ -import{_ as a,o as e,c as s,ag as i}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Memoh CLI","description":"","frontmatter":{},"headers":[],"relativePath":"cli/index.md","filePath":"cli/index.md","lastUpdated":1771161622000}'),n={name:"cli/index.md"};function h(o,t,l,d,r,p){return e(),s("div",null,[...t[0]||(t[0]=[i(`

Memoh CLI

The Memoh CLI (memoh) is a command-line tool for managing bots, channels, providers, models, schedules, and chatting with bots. It talks to a running Memoh server via its API.

Installation

The CLI is part of the Memoh monorepo. Install from source:

bash
git clone https://github.com/memohai/Memoh.git
-cd Memoh
-pnpm install

Run the CLI:

bash
cd packages/cli
-pnpm start -- --help

To use memoh as a global command:

bash
cd packages/cli
-pnpm build
-pnpm link --global
-memoh --help

Ensure your Memoh server is running (see Docker installation) and the API is reachable at the configured host/port (default: 127.0.0.1:8080).

Configuration

The CLI stores config in ~/.memoh/config.toml and auth token in ~/.memoh/token.json. Use memoh config to view and memoh config set to change host/port.

Commands

CommandDescription
loginLog in to the Memoh server
logoutLog out and clear token
whoamiShow current user
configShow or update CLI config (host, port)
providerList, create, delete LLM providers
modelList, create, delete models
botList, create, update, delete bots; chat; set model
channelList channels; get/set bot channel config; get/set user binding
scheduleList, create, update, toggle, delete bot schedules
chatInteractive chat with a bot (default command)
tuiTerminal UI chat session
versionShow CLI version

Most commands require authentication. Run memoh login first.

`,15)])])}const k=a(n,[["render",h]]);export{m as __pageData,k as default}; diff --git a/assets/cli_index.md.CZsWbIpX.lean.js b/assets/cli_index.md.CZsWbIpX.lean.js deleted file mode 100644 index a30a2772..00000000 --- a/assets/cli_index.md.CZsWbIpX.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as s,ag as i}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Memoh CLI","description":"","frontmatter":{},"headers":[],"relativePath":"cli/index.md","filePath":"cli/index.md","lastUpdated":1771161622000}'),n={name:"cli/index.md"};function h(o,t,l,d,r,p){return e(),s("div",null,[...t[0]||(t[0]=[i("",15)])])}const k=a(n,[["render",h]]);export{m as __pageData,k as default}; diff --git a/assets/cli_model.md.DjdZHTvQ.js b/assets/cli_model.md.DjdZHTvQ.js deleted file mode 100644 index 12eaba26..00000000 --- a/assets/cli_model.md.DjdZHTvQ.js +++ /dev/null @@ -1,4 +0,0 @@ -import{_ as i,o as e,c as a,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Model Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/model.md","filePath":"cli/model.md","lastUpdated":1771410627000}'),d={name:"cli/model.md"};function l(n,s,h,p,o,k){return e(),a("div",null,[...s[0]||(s[0]=[t(`

Model Commands

Manage chat and embedding models.

model list

List all models with their provider, type, client type, and multimodal flag.

bash
memoh model list

model create

Create a new model. Prompts for provider, model ID, type, client type, and (for embedding models) dimensions.

bash
memoh model create [options]
OptionDescription
--model_id <id>Model ID (e.g. gpt-4, text-embedding-3-small)
--name <name>Display name
--provider <provider>Provider name
--client_type <type>Client type: openai-responses, openai-completions, anthropic-messages, google-generative-ai
--type <type>chat or embedding
--dimensions <n>Embedding dimensions (required for embedding models)
--multimodalMark as multimodal

Examples:

bash
memoh model create --model_id gpt-4 --provider my-openai --client_type openai-responses --type chat
-memoh model create --model_id text-embedding-3-small --provider my-openai --client_type openai-completions --type embedding --dimensions 1536
-memoh model create
-# Interactive prompts

model delete

Delete a model by model ID.

bash
memoh model delete --model <model_id>

Example:

bash
memoh model delete --model gpt-4
`,16)])])}const m=i(d,[["render",l]]);export{c as __pageData,m as default}; diff --git a/assets/cli_model.md.DjdZHTvQ.lean.js b/assets/cli_model.md.DjdZHTvQ.lean.js deleted file mode 100644 index bdec4659..00000000 --- a/assets/cli_model.md.DjdZHTvQ.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,o as e,c as a,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Model Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/model.md","filePath":"cli/model.md","lastUpdated":1771410627000}'),d={name:"cli/model.md"};function l(n,s,h,p,o,k){return e(),a("div",null,[...s[0]||(s[0]=[t("",16)])])}const m=i(d,[["render",l]]);export{c as __pageData,m as default}; diff --git a/assets/cli_provider.md.D1oztYQ9.js b/assets/cli_provider.md.D1oztYQ9.js deleted file mode 100644 index 82297f73..00000000 --- a/assets/cli_provider.md.D1oztYQ9.js +++ /dev/null @@ -1,4 +0,0 @@ -import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Provider Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/provider.md","filePath":"cli/provider.md","lastUpdated":1771410627000}'),p={name:"cli/provider.md"};function h(l,s,n,r,d,o){return a(),e("div",null,[...s[0]||(s[0]=[t(`

Provider Commands

Manage LLM providers (API endpoints and credentials).

provider list

List all providers. Optionally filter by provider name.

bash
memoh provider list [options]
OptionDescription
--provider <name>Filter by provider name

Examples:

bash
memoh provider list
-memoh provider list --provider my-openai

provider create

Create a new provider. Prompts for any missing fields.

bash
memoh provider create [options]
OptionDescription
--name <name>Provider name
--base_url <url>Base URL for the API
--api_key <key>API key

Examples:

bash
memoh provider create --name my-ollama --base_url http://localhost:11434/v1
-memoh provider create
-# Interactive prompts

provider delete

Delete a provider by name.

bash
memoh provider delete --provider <name>

Example:

bash
memoh provider delete --provider my-ollama
`,19)])])}const F=i(p,[["render",h]]);export{c as __pageData,F as default}; diff --git a/assets/cli_provider.md.D1oztYQ9.lean.js b/assets/cli_provider.md.D1oztYQ9.lean.js deleted file mode 100644 index f3e31194..00000000 --- a/assets/cli_provider.md.D1oztYQ9.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Provider Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/provider.md","filePath":"cli/provider.md","lastUpdated":1771410627000}'),p={name:"cli/provider.md"};function h(l,s,n,r,d,o){return a(),e("div",null,[...s[0]||(s[0]=[t("",19)])])}const F=i(p,[["render",h]]);export{c as __pageData,F as default}; diff --git a/assets/cli_schedule.md.D2s8Q1KC.js b/assets/cli_schedule.md.D2s8Q1KC.js deleted file mode 100644 index fa68b9ac..00000000 --- a/assets/cli_schedule.md.D2s8Q1KC.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as i,c as a,ag as e}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Schedule Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/schedule.md","filePath":"cli/schedule.md","lastUpdated":1771161622000}'),d={name:"cli/schedule.md"};function h(l,s,n,p,k,r){return i(),a("div",null,[...s[0]||(s[0]=[e('

Schedule Commands

Manage cron-based schedules for bots. All schedule commands require --bot <id> to specify the bot.

schedule list

List all schedules for a bot.

bash
memoh schedule list --bot <bot_id>

schedule get

Get a schedule by ID.

bash
memoh schedule get <id> --bot <bot_id>

schedule create

Create a new schedule. Prompts for name, description, cron pattern, command, and optional max calls.

bash
memoh schedule create [options] --bot <bot_id>
OptionDescription
--name <name>Schedule name
--description <desc>Description
--pattern <pattern>Cron pattern (e.g. 0 9 * * * for daily at 9am)
--command <cmd>Command to run in the bot container
--max_calls <n>Max executions (optional, empty for unlimited)
--enabledCreate as enabled
--disabledCreate as disabled

schedule update

Update a schedule.

bash
memoh schedule update <id> [options] --bot <bot_id>
OptionDescription
--name <name>Schedule name
--description <desc>Description
--pattern <pattern>Cron pattern
--command <cmd>Command
--max_calls <n>Max executions
--enabledEnable
--disabledDisable

schedule toggle

Enable or disable a schedule (flip current state).

bash
memoh schedule toggle <id> --bot <bot_id>

schedule delete

Delete a schedule.

bash
memoh schedule delete <id> --bot <bot_id>
',22)])])}const g=t(d,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/cli_schedule.md.D2s8Q1KC.lean.js b/assets/cli_schedule.md.D2s8Q1KC.lean.js deleted file mode 100644 index ea3b6426..00000000 --- a/assets/cli_schedule.md.D2s8Q1KC.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as i,c as a,ag as e}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Schedule Commands","description":"","frontmatter":{},"headers":[],"relativePath":"cli/schedule.md","filePath":"cli/schedule.md","lastUpdated":1771161622000}'),d={name:"cli/schedule.md"};function h(l,s,n,p,k,r){return i(),a("div",null,[...s[0]||(s[0]=[e("",22)])])}const g=t(d,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/concepts_bot.md.C_C3siLW.js b/assets/concepts_bot.md.C_C3siLW.js deleted file mode 100644 index 7192cd5d..00000000 --- a/assets/concepts_bot.md.C_C3siLW.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Bot","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/bot.md","filePath":"concepts/bot.md","lastUpdated":1771163124000}'),n={name:"concepts/bot.md"};function r(l,e,s,d,c,h){return a(),o("div",null,[...e[0]||(e[0]=[i('

Bot

A bot is the primary runtime entity in Memoh.

Each bot has its own:

  • Configuration
  • Container lifecycle
  • Memory scope
  • Channel bindings
  • Model assignments

Key Settings

  • max-load-time (max_context_load_time): how many minutes of recent conversation context are loaded into prompts
  • language: preferred language for interaction (default is auto)
  • chat model / memory model / embedding model: model IDs used by this bot

Why It Matters

The bot abstraction allows Memoh to isolate behavior and resources per agent, while keeping management centralized in one Web UI.

Web UI Path

  • Bots > Select a bot > Settings
',10)])])}const u=t(n,[["render",r]]);export{p as __pageData,u as default}; diff --git a/assets/concepts_bot.md.C_C3siLW.lean.js b/assets/concepts_bot.md.C_C3siLW.lean.js deleted file mode 100644 index 171bbd35..00000000 --- a/assets/concepts_bot.md.C_C3siLW.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Bot","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/bot.md","filePath":"concepts/bot.md","lastUpdated":1771163124000}'),n={name:"concepts/bot.md"};function r(l,e,s,d,c,h){return a(),o("div",null,[...e[0]||(e[0]=[i("",10)])])}const u=t(n,[["render",r]]);export{p as __pageData,u as default}; diff --git a/assets/concepts_channel.md.DdS-uyu8.js b/assets/concepts_channel.md.DdS-uyu8.js deleted file mode 100644 index 316114a9..00000000 --- a/assets/concepts_channel.md.DdS-uyu8.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as n,ag as l}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Channel","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/channel.md","filePath":"concepts/channel.md","lastUpdated":1771163124000}'),o={name:"concepts/channel.md"};function r(i,a,s,c,h,d){return t(),n("div",null,[...a[0]||(a[0]=[l('

Channel

A channel connects a bot to an external communication platform.

Examples include:

  • Telegram
  • Feishu (Lark)
  • Web chat

What a Channel Configuration Defines

  • Platform type and credentials
  • Message routing from external users to a target bot
  • Reply delivery back to the source platform

Why It Matters

Channels decouple bot logic from transport, so one bot can serve users across multiple platforms.

Web UI Path

  • Bots > Select a bot > Channels
',10)])])}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/concepts_channel.md.DdS-uyu8.lean.js b/assets/concepts_channel.md.DdS-uyu8.lean.js deleted file mode 100644 index e8e02516..00000000 --- a/assets/concepts_channel.md.DdS-uyu8.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as n,ag as l}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Channel","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/channel.md","filePath":"concepts/channel.md","lastUpdated":1771163124000}'),o={name:"concepts/channel.md"};function r(i,a,s,c,h,d){return t(),n("div",null,[...a[0]||(a[0]=[l("",10)])])}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/concepts_container.md.Djausou_.js b/assets/concepts_container.md.Djausou_.js deleted file mode 100644 index 3a583327..00000000 --- a/assets/concepts_container.md.Djausou_.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Container","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/container.md","filePath":"concepts/container.md","lastUpdated":1771163124000}'),i={name:"concepts/container.md"};function r(s,t,l,c,h,d){return a(),o("div",null,[...t[0]||(t[0]=[n('

Container

Each bot runs in its own isolated container.

What Isolation Gives You

  • Separate filesystem per bot
  • Separate runtime process space
  • Controlled lifecycle (create/start/stop/delete)

This prevents one bot from interfering with another bot's execution environment.

Why It Matters

Container isolation is the foundation that allows bots to run tools, commands, and file operations safely in parallel.

Web UI Path

  • Bots > Select a bot > Container
',9)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; diff --git a/assets/concepts_container.md.Djausou_.lean.js b/assets/concepts_container.md.Djausou_.lean.js deleted file mode 100644 index f8b84854..00000000 --- a/assets/concepts_container.md.Djausou_.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Container","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/container.md","filePath":"concepts/container.md","lastUpdated":1771163124000}'),i={name:"concepts/container.md"};function r(s,t,l,c,h,d){return a(),o("div",null,[...t[0]||(t[0]=[n("",9)])])}const m=e(i,[["render",r]]);export{u as __pageData,m as default}; diff --git a/assets/concepts_conversation-and-history.md.BS_PnG4v.js b/assets/concepts_conversation-and-history.md.BS_PnG4v.js deleted file mode 100644 index aac2dbbb..00000000 --- a/assets/concepts_conversation-and-history.md.BS_PnG4v.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Conversation and History","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/conversation-and-history.md","filePath":"concepts/conversation-and-history.md","lastUpdated":1771163124000}'),n={name:"concepts/conversation-and-history.md"};function s(r,t,l,c,h,d){return a(),o("div",null,[...t[0]||(t[0]=[i('

Conversation and History

Memoh organizes interactions as conversations with preserved history.

What This Includes

  • Ongoing chat context between users and bots
  • Message-level timeline and traceability
  • Source context for memory extraction and debugging

Why It Matters

Conversation history powers:

  • Better response continuity
  • Auditing and troubleshooting
  • Post-hoc analysis of bot behavior

Web UI Path

  • Chat > Select conversation
  • Bots > Select a bot > History
',9)])])}const _=e(n,[["render",s]]);export{p as __pageData,_ as default}; diff --git a/assets/concepts_conversation-and-history.md.BS_PnG4v.lean.js b/assets/concepts_conversation-and-history.md.BS_PnG4v.lean.js deleted file mode 100644 index 61d438c9..00000000 --- a/assets/concepts_conversation-and-history.md.BS_PnG4v.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Conversation and History","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/conversation-and-history.md","filePath":"concepts/conversation-and-history.md","lastUpdated":1771163124000}'),n={name:"concepts/conversation-and-history.md"};function s(r,t,l,c,h,d){return a(),o("div",null,[...t[0]||(t[0]=[i("",9)])])}const _=e(n,[["render",s]]);export{p as __pageData,_ as default}; diff --git a/assets/concepts_index.md.Ci6EwNPX.js b/assets/concepts_index.md.Ci6EwNPX.js deleted file mode 100644 index 2e49f8e5..00000000 --- a/assets/concepts_index.md.Ci6EwNPX.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as n,ag as a}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Concepts Overview","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/index.md","filePath":"concepts/index.md","lastUpdated":1771163124000}'),r={name:"concepts/index.md"};function i(l,e,s,c,d,h){return o(),n("div",null,[...e[0]||(e[0]=[a('

Concepts Overview

This section explains the core design concepts behind Memoh.

Use these pages when you want to understand how Memoh is designed, why features exist, and how different parts work together.

Concept Map

  • Bot: the core runtime unit
  • Provider and Model: how LLM capability is plugged in
  • Memory: how long-term knowledge is stored and retrieved
  • Channel: how external platforms connect to bots
  • Schedule: how tasks are triggered automatically
  • Container: isolated execution environment per bot
  • MCP: external tool and service integration protocol
  • Subagents: specialized delegated agents
  • Skills: reusable capability prompts/instructions
  • Conversation and History: chat context and traceability
  1. Bot
  2. Provider and Model
  3. Memory
  4. Channel
  5. Container
  6. Schedule
  7. MCP
  8. Subagents
  9. Skills
  10. Conversation and History
',7)])])}const g=t(r,[["render",i]]);export{m as __pageData,g as default}; diff --git a/assets/concepts_index.md.Ci6EwNPX.lean.js b/assets/concepts_index.md.Ci6EwNPX.lean.js deleted file mode 100644 index 22ad6186..00000000 --- a/assets/concepts_index.md.Ci6EwNPX.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as n,ag as a}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Concepts Overview","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/index.md","filePath":"concepts/index.md","lastUpdated":1771163124000}'),r={name:"concepts/index.md"};function i(l,e,s,c,d,h){return o(),n("div",null,[...e[0]||(e[0]=[a("",7)])])}const g=t(r,[["render",i]]);export{m as __pageData,g as default}; diff --git a/assets/concepts_mcp.md.B9KnE-R7.js b/assets/concepts_mcp.md.B9KnE-R7.js deleted file mode 100644 index cd185d83..00000000 --- a/assets/concepts_mcp.md.B9KnE-R7.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"MCP","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/mcp.md","filePath":"concepts/mcp.md","lastUpdated":1771163124000}'),s={name:"concepts/mcp.md"};function n(r,t,c,l,d,h){return e(),o("div",null,[...t[0]||(t[0]=[i('

MCP

MCP (Model Context Protocol) connects Memoh bots to external tool services.

What MCP Adds

  • Standardized tool discovery and invocation
  • Remote capability extension without changing core bot code
  • Per-bot integration flexibility

Memoh supports MCP connections so bots can access external systems through a unified protocol.

Why It Matters

MCP makes capability extension modular. You can add or swap tool backends with minimal coupling.

Web UI Path

  • Bots > Select a bot > MCP
',9)])])}const u=a(s,[["render",n]]);export{m as __pageData,u as default}; diff --git a/assets/concepts_mcp.md.B9KnE-R7.lean.js b/assets/concepts_mcp.md.B9KnE-R7.lean.js deleted file mode 100644 index af5cb574..00000000 --- a/assets/concepts_mcp.md.B9KnE-R7.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"MCP","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/mcp.md","filePath":"concepts/mcp.md","lastUpdated":1771163124000}'),s={name:"concepts/mcp.md"};function n(r,t,c,l,d,h){return e(),o("div",null,[...t[0]||(t[0]=[i("",9)])])}const u=a(s,[["render",n]]);export{m as __pageData,u as default}; diff --git a/assets/concepts_memory.md.BgBEcLnX.js b/assets/concepts_memory.md.BgBEcLnX.js deleted file mode 100644 index 242fd89e..00000000 --- a/assets/concepts_memory.md.BgBEcLnX.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as a,c as o,ag as r}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Memory","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/memory.md","filePath":"concepts/memory.md","lastUpdated":1771163124000}'),i={name:"concepts/memory.md"};function s(n,e,l,m,c,d){return a(),o("div",null,[...e[0]||(e[0]=[r('

Memory

Memory is Memoh's long-term knowledge system for each bot.

How It Works

  • Important facts are extracted from conversations
  • Memories are stored and indexed
  • Relevant memories are retrieved by semantic similarity when needed

Memoh combines vector retrieval with keyword-style retrieval for better recall and precision.

Why It Matters

Memory enables continuity across long timelines, so bots can maintain context beyond short prompt windows.

Web UI Path

  • Bots > Select a bot > Memory
',9)])])}const y=t(i,[["render",s]]);export{p as __pageData,y as default}; diff --git a/assets/concepts_memory.md.BgBEcLnX.lean.js b/assets/concepts_memory.md.BgBEcLnX.lean.js deleted file mode 100644 index f4477315..00000000 --- a/assets/concepts_memory.md.BgBEcLnX.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as a,c as o,ag as r}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Memory","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/memory.md","filePath":"concepts/memory.md","lastUpdated":1771163124000}'),i={name:"concepts/memory.md"};function s(n,e,l,m,c,d){return a(),o("div",null,[...e[0]||(e[0]=[r("",9)])])}const y=t(i,[["render",s]]);export{p as __pageData,y as default}; diff --git a/assets/concepts_provider-and-model.md.DQq3j0ql.js b/assets/concepts_provider-and-model.md.DQq3j0ql.js deleted file mode 100644 index 3f1fe3a0..00000000 --- a/assets/concepts_provider-and-model.md.DQq3j0ql.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as d,ag as a}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/provider-and-model.md","filePath":"concepts/provider-and-model.md","lastUpdated":1771410627000}'),i={name:"concepts/provider-and-model.md"};function r(n,e,l,s,c,p){return o(),d("div",null,[...e[0]||(e[0]=[a('

Provider and Model

In Memoh, provider and model are separate but connected concepts:

  • A provider is the LLM service configuration (API endpoint and key)
  • A model is the concrete chat or embedding model under that provider, including its client type which determines which API protocol to use

Client Types

Each model has a client_type that determines how Memoh communicates with the LLM service:

Client TypeDescription
openai-responsesOpenAI Responses API
openai-completionsOpenAI Chat Completions API (also works with compatible services like Ollama, Mistral, etc.)
anthropic-messagesAnthropic Messages API
google-generative-aiGoogle Generative AI API

Typical Setup

At minimum, a production-ready bot usually needs:

  • One chat model for dialog generation
  • One embedding model for memory indexing and retrieval

Model Assignment to Bot

Bots reference model IDs in settings:

  • chat_model_id
  • memory_model_id
  • embedding_model_id

This enables per-bot customization (for quality, latency, or cost).

Web UI Path

  • Models > Add Provider > Select Provider > Add Model
  • Bots > Select a bot > Settings > Choose chat/memory/embedding models
',15)])])}const g=t(i,[["render",r]]);export{m as __pageData,g as default}; diff --git a/assets/concepts_provider-and-model.md.DQq3j0ql.lean.js b/assets/concepts_provider-and-model.md.DQq3j0ql.lean.js deleted file mode 100644 index 795f6364..00000000 --- a/assets/concepts_provider-and-model.md.DQq3j0ql.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as d,ag as a}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/provider-and-model.md","filePath":"concepts/provider-and-model.md","lastUpdated":1771410627000}'),i={name:"concepts/provider-and-model.md"};function r(n,e,l,s,c,p){return o(),d("div",null,[...e[0]||(e[0]=[a("",15)])])}const g=t(i,[["render",r]]);export{m as __pageData,g as default}; diff --git a/assets/concepts_schedule.md.COs_2DXO.js b/assets/concepts_schedule.md.COs_2DXO.js deleted file mode 100644 index 85f8b0a3..00000000 --- a/assets/concepts_schedule.md.COs_2DXO.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as o,ag as c}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Schedule","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/schedule.md","filePath":"concepts/schedule.md","lastUpdated":1771163124000}'),r={name:"concepts/schedule.md"};function l(s,e,d,i,n,u){return t(),o("div",null,[...e[0]||(e[0]=[c('

Schedule

A schedule is a cron-based automation rule that runs bot commands at defined times.

Core Fields

  • pattern: cron expression
  • command: command or task to execute
  • enabled: whether the schedule is active
  • max_calls: optional execution cap
  • current_calls: current run count

Why It Matters

Schedules make bots proactive, not only reactive.
You can automate recurring operations like summaries, reminders, checks, and maintenance tasks.

Web UI Path

  • Not available in current Web UI

Schedule is supported by backend and CLI/API, but there is currently no dedicated schedule page in the Web UI.

',9)])])}const m=a(r,[["render",l]]);export{p as __pageData,m as default}; diff --git a/assets/concepts_schedule.md.COs_2DXO.lean.js b/assets/concepts_schedule.md.COs_2DXO.lean.js deleted file mode 100644 index ec1865fc..00000000 --- a/assets/concepts_schedule.md.COs_2DXO.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as o,ag as c}from"./chunks/framework.ePeAWSvT.js";const p=JSON.parse('{"title":"Schedule","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/schedule.md","filePath":"concepts/schedule.md","lastUpdated":1771163124000}'),r={name:"concepts/schedule.md"};function l(s,e,d,i,n,u){return t(),o("div",null,[...e[0]||(e[0]=[c("",9)])])}const m=a(r,[["render",l]]);export{p as __pageData,m as default}; diff --git a/assets/concepts_skills.md.HeUi2diL.js b/assets/concepts_skills.md.HeUi2diL.js deleted file mode 100644 index 588a5166..00000000 --- a/assets/concepts_skills.md.HeUi2diL.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as l,ag as i}from"./chunks/framework.ePeAWSvT.js";const d=JSON.parse('{"title":"Skills","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/skills.md","filePath":"concepts/skills.md","lastUpdated":1771163124000}'),s={name:"concepts/skills.md"};function o(n,t,r,c,p,h){return a(),l("div",null,[...t[0]||(t[0]=[i('

Skills

Skills are reusable capability instructions that guide how a bot (or subagent) solves specific classes of tasks.

Typical Skill Content

  • Scope and purpose
  • Input expectations
  • Execution steps
  • Constraints and output format

Why It Matters

Skills help keep behavior consistent, reduce prompt duplication, and make complex workflows easier to maintain.

Web UI Path

  • Bots > Select a bot > Subagents

Skills are currently primarily managed through agent/workspace configuration and runtime conventions, while subagent-related behavior is visible from the Subagents area.

',9)])])}const k=e(s,[["render",o]]);export{d as __pageData,k as default}; diff --git a/assets/concepts_skills.md.HeUi2diL.lean.js b/assets/concepts_skills.md.HeUi2diL.lean.js deleted file mode 100644 index 37589cfe..00000000 --- a/assets/concepts_skills.md.HeUi2diL.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as l,ag as i}from"./chunks/framework.ePeAWSvT.js";const d=JSON.parse('{"title":"Skills","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/skills.md","filePath":"concepts/skills.md","lastUpdated":1771163124000}'),s={name:"concepts/skills.md"};function o(n,t,r,c,p,h){return a(),l("div",null,[...t[0]||(t[0]=[i("",9)])])}const k=e(s,[["render",o]]);export{d as __pageData,k as default}; diff --git a/assets/concepts_subagents.md.C0_bz0wW.js b/assets/concepts_subagents.md.C0_bz0wW.js deleted file mode 100644 index 6d7bf730..00000000 --- a/assets/concepts_subagents.md.C0_bz0wW.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as s,ag as o}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/subagents.md","filePath":"concepts/subagents.md","lastUpdated":1771163124000}'),r={name:"concepts/subagents.md"};function i(n,e,l,c,u,d){return t(),s("div",null,[...e[0]||(e[0]=[o('

Subagents

Subagents are specialized helper agents that a bot can delegate tasks to.

Core Idea

  • The main bot acts as coordinator
  • Subagents focus on narrower tasks
  • Results are combined back into the main workflow

This supports decomposition of complex requests into smaller, more reliable execution units.

Why It Matters

Subagent architecture improves scalability for multi-step tasks and helps separate responsibilities by role.

Web UI Path

  • Bots > Select a bot > Subagents
',9)])])}const p=a(r,[["render",i]]);export{b as __pageData,p as default}; diff --git a/assets/concepts_subagents.md.C0_bz0wW.lean.js b/assets/concepts_subagents.md.C0_bz0wW.lean.js deleted file mode 100644 index 454c9ae1..00000000 --- a/assets/concepts_subagents.md.C0_bz0wW.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as t,c as s,ag as o}from"./chunks/framework.ePeAWSvT.js";const b=JSON.parse('{"title":"Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"concepts/subagents.md","filePath":"concepts/subagents.md","lastUpdated":1771163124000}'),r={name:"concepts/subagents.md"};function i(n,e,l,c,u,d){return t(),s("div",null,[...e[0]||(e[0]=[o("",9)])])}const p=a(r,[["render",i]]);export{b as __pageData,p as default}; diff --git a/assets/getting-started.md.C9lgqnN0.js b/assets/getting-started.md.C9lgqnN0.js deleted file mode 100644 index bd73babe..00000000 --- a/assets/getting-started.md.C9lgqnN0.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md","lastUpdated":1771410627000}'),n={name:"getting-started.md"};function r(l,e,s,c,d,h){return a(),o("div",null,[...e[0]||(e[0]=[i('

About Memoh

What is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent system platform. You can create your own AI bots and chat with them via Telegram, Lark (Feishu), and more. Every bot has an independent container and memory system, allowing it to edit files, execute commands, and access the network within its own container — like having its own computer.

Key Features

Multi-Bot Management

Create multiple bots. Humans and bots, or bots with each other, can chat privately, in groups, or collaborate. Build bot teams, or set up accounts for family members to manage daily tasks with bots.

Containerized Isolation

Each bot runs in its own isolated container (powered by Containerd) with a separate filesystem and network. Bots can freely read/write files and execute commands within their containers without interfering with each other.

Memory Engineering

A deeply engineered memory layer inspired by Mem0:

  • Automatically extracts key facts from each conversation turn and stores them as structured memories
  • Supports semantic search (via Qdrant vector database) and keyword retrieval (BM25)
  • Loads the last 24 hours of conversation context by default
  • Automatic memory compaction to keep the memory store lean
  • Multi-language auto-detection

Multi-Platform Support

Unified channel adapter architecture for connecting to multiple messaging platforms:

  • Telegram — Full support with streaming, Markdown, attachments, and replies
  • Lark (Feishu) — Full support
  • Web — Built-in web chat interface
  • CLI — Command-line chat

Agent Capabilities

Bots come with a rich set of built-in tools:

  • Web Search — Brave Search integration for real-time information
  • Subagents — Create specialized subagents, assign skills, and delegate complex tasks
  • Skills — Configurable skill system to extend bot capabilities
  • Container Operations — Read/write files, edit code, and execute commands inside the container
  • Memory Management — Search and manage memories
  • Messaging — Send messages and reactions

Multi-LLM Provider Support

Flexibly switch between a wide range of LLM providers via four client types:

  • OpenAI Responses API, OpenAI Chat Completions API (including compatible services)
  • Anthropic Messages API, Google Generative AI API

MCP Protocol Support

Supports Model Context Protocol (MCP) via HTTP and SSE to connect external tool services. Each bot can have its own independent MCP connections.

Scheduled Tasks

Configure scheduled tasks using cron expressions to automatically run commands at specified times. Supports max execution count limits and manual triggers.

Graphical Configuration

Configure bots, channels, providers, models, MCP, skills, and all other settings through a web management UI — no coding required to set up your own AI bot.

CLI Tool

A command-line tool for bot management, channel configuration, model management, streaming chat, and more — designed for developers who prefer the terminal. See CLI documentation.

Installation

To get Memoh running:

  • Docker — Recommended. One-click or manual setup with Docker Compose. Includes all services (PostgreSQL, Qdrant, Containerd, server, agent, web) — no extra dependencies on the host.
  • config.toml — Reference for all configuration fields.
',31)])])}const p=t(n,[["render",r]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started.md.C9lgqnN0.lean.js b/assets/getting-started.md.C9lgqnN0.lean.js deleted file mode 100644 index 0a3050f1..00000000 --- a/assets/getting-started.md.C9lgqnN0.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as a,c as o,ag as i}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"About Memoh","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md","lastUpdated":1771410627000}'),n={name:"getting-started.md"};function r(l,e,s,c,d,h){return a(),o("div",null,[...e[0]||(e[0]=[i("",31)])])}const p=t(n,[["render",r]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started_bot.md.CflRB8ov.js b/assets/getting-started_bot.md.CflRB8ov.js new file mode 100644 index 00000000..d9060fa4 --- /dev/null +++ b/assets/getting-started_bot.md.CflRB8ov.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,ag as n}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1772359263000}'),r={name:"getting-started/bot.md"};function i(s,t,l,d,g,h){return o(),a("div",null,[...t[0]||(t[0]=[n('

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in group chats.
    • Avatar: A URL for the bot's profile picture.
    • Type: Choose personal (private to owner) or public (accessible to guests).
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through several specialized tabs.

Overview Tab

The Overview tab provides a quick health check of the bot's services. It monitors:

  • Container status (running/stopped)
  • Database connectivity
  • Channel configurations
  • Memory system health

If any check shows a warning or error, follow the provided details to troubleshoot.

Configuring the Bot's Brain (Models)

After creating a bot, the most important step is assigning its LLM models. These define how the bot thinks, remembers, and processes information.

  1. Navigate to your bot's Detail Page.
  2. Go to the Settings tab.
  3. In the Model Selection section, you will find three dropdowns:
    • Chat Model: Used for standard conversations with users. Select a high-quality chat model (e.g., GPT-4o).
    • Memory Model: Used for summarizing context and extracting key facts into the bot's long-term memory.
    • Embedding Model: Used to convert text into vector embeddings for semantic search within the memory system. This must be an embedding type model.
  4. Select the models you previously configured in the Models page.
  5. Click Save at the bottom of the form.

Settings Tab Reference

The Settings tab contains all the core parameters that define your bot's behavior and runtime configuration.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Memory ModelThe LLM used for summarizing context and managing memories.
Embedding ModelThe model used to generate vector embeddings for semantic memory search.
Search ProviderThe search engine used for web browsing capabilities.
Max Context Load TimeTime limit (seconds) for loading context before generation.
Max Context TokensToken limit for the loaded conversation history.
LanguageThe bot's primary communication language.
Reasoning EnabledIf the selected model supports reasoning (like OpenAI o1), enable this to use its deep thinking capabilities.
Reasoning EffortSet the level of reasoning effort (low, medium, high).
Allow Guest(Public bots only) If enabled, non-registered users can interact with the bot.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the Settings tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

',23)])])}const b=e(r,[["render",i]]);export{m as __pageData,b as default}; diff --git a/assets/getting-started_bot.md.CflRB8ov.lean.js b/assets/getting-started_bot.md.CflRB8ov.lean.js new file mode 100644 index 00000000..69a787fe --- /dev/null +++ b/assets/getting-started_bot.md.CflRB8ov.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,ag as n}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Bot Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/bot.md","filePath":"getting-started/bot.md","lastUpdated":1772359263000}'),r={name:"getting-started/bot.md"};function i(s,t,l,d,g,h){return o(),a("div",null,[...t[0]||(t[0]=[n("",23)])])}const b=e(r,[["render",i]]);export{m as __pageData,b as default}; diff --git a/assets/getting-started_channels.md.DiSUpicV.js b/assets/getting-started_channels.md.DiSUpicV.js new file mode 100644 index 00000000..146f24ff --- /dev/null +++ b/assets/getting-started_channels.md.DiSUpicV.js @@ -0,0 +1 @@ +import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1772359263000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o('

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

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, and more simultaneously.


Supported Channels

Configure your bot's connections from the Channels tab in the Bot Detail page.

For detailed step-by-step guides on how to create and configure bots for each platform, see:


Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.
',22)])])}const p=a(i,[["render",r]]);export{g as __pageData,p as default}; diff --git a/assets/getting-started_channels.md.DiSUpicV.lean.js b/assets/getting-started_channels.md.DiSUpicV.lean.js new file mode 100644 index 00000000..0773e614 --- /dev/null +++ b/assets/getting-started_channels.md.DiSUpicV.lean.js @@ -0,0 +1 @@ +import{_ as a,o as t,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Bot Channels","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/channels.md","filePath":"getting-started/channels.md","lastUpdated":1772359263000}'),i={name:"getting-started/channels.md"};function r(l,e,s,h,d,c){return t(),n("div",null,[...e[0]||(e[0]=[o("",22)])])}const p=a(i,[["render",r]]);export{g as __pageData,p as default}; diff --git a/assets/getting-started_container.md.CiSK-fMx.js b/assets/getting-started_container.md.CiSK-fMx.js new file mode 100644 index 00000000..bb50f1ed --- /dev/null +++ b/assets/getting-started_container.md.CiSK-fMx.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1772359263000}'),i={name:"getting-started/container.md"};function s(r,t,l,h,c,p){return a(),n("div",null,[...t[0]||(t[0]=[o('

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image).
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance. This will delete the temporary state but preserve the data in persistent volumes.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.
',24)])])}const u=e(i,[["render",s]]);export{g as __pageData,u as default}; diff --git a/assets/getting-started_container.md.CiSK-fMx.lean.js b/assets/getting-started_container.md.CiSK-fMx.lean.js new file mode 100644 index 00000000..b52ae5a6 --- /dev/null +++ b/assets/getting-started_container.md.CiSK-fMx.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"Bot Container Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/container.md","filePath":"getting-started/container.md","lastUpdated":1772359263000}'),i={name:"getting-started/container.md"};function s(r,t,l,h,c,p){return a(),n("div",null,[...t[0]||(t[0]=[o("",24)])])}const u=e(i,[["render",s]]);export{g as __pageData,u as default}; diff --git a/assets/getting-started_create-bot.md.Da6WTI-u.js b/assets/getting-started_create-bot.md.Da6WTI-u.js deleted file mode 100644 index b2e752ef..00000000 --- a/assets/getting-started_create-bot.md.Da6WTI-u.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const n="/getting-started/bots-01-sidebar.png",s="/getting-started/bots-02-create-bot.png",i="/getting-started/bots-03-config.png",c="/getting-started/bots-04-setting.png",d="/getting-started/bots-05-chat.png",_=JSON.parse('{"title":"Create Bot","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/create-bot.md","filePath":"getting-started/create-bot.md","lastUpdated":1771405736000}'),p={name:"getting-started/create-bot.md"};function l(g,t,h,b,u,m){return o(),a("div",null,[...t[0]||(t[0]=[r('

Create Bot

Prerequisites

  • Complete the provider and model configuration.

Step 1: Open the Bot Page

Click Bots in the left sidebar to open the Bots configuration page.

Bots page - sidebar

Step 2: create a Bot

Click the New Bot button (with a plus icon)

Create Bot button

In the dialog, fill in:

FieldDescription
NameA display name for this bot (e.g. my-bot, telegram-public-bot)
Avatar URLThe API base Avatar (e.g.https://gravatar.com/avatar/***)
TypeBots type: person, public, public for channel(e.g. telegram group, qq group, discord channel, person for bind user)

Step 3: Bot Configuration

Click one bot Card in Bots page

Bot Configuration

open settings section

setting

select your available Chat Model, Memory Model, Embedding Model and save for basic Configuration

Step 4: Check Bot

Click Chat in the left sidebar to open chat page. then type your prompt to test the Bot configuration

alt text

Next Steps

',22)])])}const B=e(p,[["render",l]]);export{_ as __pageData,B as default}; diff --git a/assets/getting-started_create-bot.md.Da6WTI-u.lean.js b/assets/getting-started_create-bot.md.Da6WTI-u.lean.js deleted file mode 100644 index 91d99e3e..00000000 --- a/assets/getting-started_create-bot.md.Da6WTI-u.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const n="/getting-started/bots-01-sidebar.png",s="/getting-started/bots-02-create-bot.png",i="/getting-started/bots-03-config.png",c="/getting-started/bots-04-setting.png",d="/getting-started/bots-05-chat.png",_=JSON.parse('{"title":"Create Bot","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/create-bot.md","filePath":"getting-started/create-bot.md","lastUpdated":1771405736000}'),p={name:"getting-started/create-bot.md"};function l(g,t,h,b,u,m){return o(),a("div",null,[...t[0]||(t[0]=[r("",22)])])}const B=e(p,[["render",l]]);export{_ as __pageData,B as default}; diff --git a/assets/getting-started_email.md.CKJOqdzG.js b/assets/getting-started_email.md.CKJOqdzG.js new file mode 100644 index 00000000..81de4be8 --- /dev/null +++ b/assets/getting-started_email.md.CKJOqdzG.js @@ -0,0 +1 @@ +import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t('

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.
',22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/getting-started_email.md.CKJOqdzG.lean.js b/assets/getting-started_email.md.CKJOqdzG.lean.js new file mode 100644 index 00000000..d2ff4e87 --- /dev/null +++ b/assets/getting-started_email.md.CKJOqdzG.lean.js @@ -0,0 +1 @@ +import{_ as i,o as a,c as o,ag as t}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Email Providers and Bindings","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/email.md","filePath":"getting-started/email.md","lastUpdated":1772359263000}'),n={name:"getting-started/email.md"};function r(l,e,s,d,g,c){return a(),o("div",null,[...e[0]||(e[0]=[t("",22)])])}const u=i(n,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/getting-started_files.md.Cl6keVS-.js b/assets/getting-started_files.md.Cl6keVS-.js new file mode 100644 index 00000000..426faf79 --- /dev/null +++ b/assets/getting-started_files.md.Cl6keVS-.js @@ -0,0 +1 @@ +import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o('

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.
',20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/getting-started_files.md.Cl6keVS-.lean.js b/assets/getting-started_files.md.Cl6keVS-.lean.js new file mode 100644 index 00000000..9049980a --- /dev/null +++ b/assets/getting-started_files.md.Cl6keVS-.lean.js @@ -0,0 +1 @@ +import{_ as t,o as i,c as a,ag as o}from"./chunks/framework.ePeAWSvT.js";const m=JSON.parse('{"title":"Bot Files Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/files.md","filePath":"getting-started/files.md","lastUpdated":1772359263000}'),n={name:"getting-started/files.md"};function r(s,e,l,g,d,h){return i(),a("div",null,[...e[0]||(e[0]=[o("",20)])])}const f=t(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/getting-started_heartbeat.md.CgIS9a7z.js b/assets/getting-started_heartbeat.md.CgIS9a7z.js new file mode 100644 index 00000000..f030bfc0 --- /dev/null +++ b/assets/getting-started_heartbeat.md.CgIS9a7z.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r('

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.
',18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; diff --git a/assets/getting-started_heartbeat.md.CgIS9a7z.lean.js b/assets/getting-started_heartbeat.md.CgIS9a7z.lean.js new file mode 100644 index 00000000..7c1de4f0 --- /dev/null +++ b/assets/getting-started_heartbeat.md.CgIS9a7z.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Bot Heartbeat","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/heartbeat.md","filePath":"getting-started/heartbeat.md","lastUpdated":1772359263000}'),n={name:"getting-started/heartbeat.md"};function i(s,t,l,h,d,g){return o(),a("div",null,[...t[0]||(t[0]=[r("",18)])])}const b=e(n,[["render",i]]);export{c as __pageData,b as default}; diff --git a/assets/getting-started_mcp.md.DyRwe04F.js b/assets/getting-started_mcp.md.DyRwe04F.js new file mode 100644 index 00000000..230d19ab --- /dev/null +++ b/assets/getting-started_mcp.md.DyRwe04F.js @@ -0,0 +1 @@ +import{_ as e,o,c as n,ag as r}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1772359263000}'),a={name:"getting-started/mcp.md"};function s(i,t,c,d,l,h){return o(),n("div",null,[...t[0]||(t[0]=[r('

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command on the server and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Export: Export a connection configuration to a JSON file.

Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.
',20)])])}const m=e(a,[["render",s]]);export{g as __pageData,m as default}; diff --git a/assets/getting-started_mcp.md.DyRwe04F.lean.js b/assets/getting-started_mcp.md.DyRwe04F.lean.js new file mode 100644 index 00000000..831f9614 --- /dev/null +++ b/assets/getting-started_mcp.md.DyRwe04F.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as n,ag as r}from"./chunks/framework.ePeAWSvT.js";const g=JSON.parse('{"title":"MCP Connections","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/mcp.md","filePath":"getting-started/mcp.md","lastUpdated":1772359263000}'),a={name:"getting-started/mcp.md"};function s(i,t,c,d,l,h){return o(),n("div",null,[...t[0]||(t[0]=[r("",20)])])}const m=e(a,[["render",s]]);export{g as __pageData,m as default}; diff --git a/assets/getting-started_memory.md.DhIuIiDU.js b/assets/getting-started_memory.md.DhIuIiDU.js new file mode 100644 index 00000000..5c7527a1 --- /dev/null +++ b/assets/getting-started_memory.md.DhIuIiDU.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1772359263000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,c,h){return o(),a("div",null,[...e[0]||(e[0]=[r('

Bot Memory Management

Memoh's structured long-term memory system allows Bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Memories are stored in a Qdrant vector database. When a user asks a question, Memoh performs a semantic search to find the most relevant "memories" and includes them in the bot's system prompt.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to "extract" into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compression (Compact)

Over time, memories can accumulate and become redundant. The Compact feature helps optimize the memory pool.

  • Ratio: Set the compression ratio (e.g., 0.8, 0.5, 0.3) to determine how much information is retained.
  • Decay Days: Optionally specify a time window to only compact memories older than a certain number of days.

Visualization: Vector Manifold

The Memory tab includes advanced visual tools to help you understand how the memory system is performing:

Top-K Bucket Chart

Shows the distribution of relevant memories retrieved for the most recent queries.

CDF Curve (Cumulative Distribution Function)

Visualizes the scoring threshold of retrieved memories, helping you fine-tune how much "relevant" information the bot should consider.


Bot Interaction

  • The bot will automatically search for and retrieve memories during every interaction.
  • The Memory Model configured in the Settings tab is used for extracting and summarizing these memories.
  • Memories provide the "long-term knowledge" that makes each bot unique to its owner.
',25)])])}const g=t(i,[["render",n]]);export{u as __pageData,g as default}; diff --git a/assets/getting-started_memory.md.DhIuIiDU.lean.js b/assets/getting-started_memory.md.DhIuIiDU.lean.js new file mode 100644 index 00000000..51b80d41 --- /dev/null +++ b/assets/getting-started_memory.md.DhIuIiDU.lean.js @@ -0,0 +1 @@ +import{_ as t,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Bot Memory Management","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/memory.md","filePath":"getting-started/memory.md","lastUpdated":1772359263000}'),i={name:"getting-started/memory.md"};function n(s,e,m,l,c,h){return o(),a("div",null,[...e[0]||(e[0]=[r("",25)])])}const g=t(i,[["render",n]]);export{u as __pageData,g as default}; diff --git a/assets/getting-started_platform-telegram.md.BlTohjMj.js b/assets/getting-started_platform-telegram.md.BlTohjMj.js deleted file mode 100644 index ddfd1f9d..00000000 --- a/assets/getting-started_platform-telegram.md.BlTohjMj.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const n="/getting-started/platform-telegram-01-platforms.png",l="/getting-started/platform-telegram-02-bindcode.png",u=JSON.parse('{"title":"Configure Telegram Channel","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/platform-telegram.md","filePath":"getting-started/platform-telegram.md","lastUpdated":1771405736000}'),s={name:"getting-started/platform-telegram.md"};function i(d,e,c,h,p,g){return o(),a("div",null,[...e[0]||(e[0]=[r('

Configure Telegram Channel

This guide walks you through connecting your bot to Telegram, allowing users to chat with your bot via Telegram messages.

Prerequisites

Step 1: Create a Telegram Bot

Open Telegram and search for the official bot @BotFather.

Send the /newbot command to BotFather and follow the prompts:

  1. Enter a name for your bot (display name, e.g., My Memoh Bot)
  2. Enter a username for your bot (must end with bot, e.g., my_memoh_bot)

BotFather will create the bot and provide a Bot Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz).

Save this token securely — you will need it in the next step.

Step 2: Open the Bot Platforms Page

In the Memoh Web UI, click Bots in the left sidebar to open the Bots page.

Select the bot you want to connect to Telegram.

Click the Platforms tab to open the channel configuration page.

Step 3: Add Telegram Channel

Click the Add Channel button.

In the dialog, select Telegram as the channel type.

Fill in the configuration:

FieldDescription
Bot TokenThe token from BotFather (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz)

Click Save to add the channel.

Add Channel button

Step 4: Bind Your Telegram Account

Open the Memoh web ui setting page, find Bind Code section, select telegram platform and necessary TTL(seconds), Generate bind code.

Bind Code

Open the bot dialog in telegram, send Bind Code to chat, you should get Binding successful! Your identity has been linked. message if successful

Click Save to complete the binding.

Step 6: Test the Connection

Send a message to your bot on Telegram:

  • For public bots: Add the bot to a group, have others mention your bot when sending messages.
  • For person bots: Send a direct message (requires binding in Step 5)

The bot should respond according to its configured model and system prompt.

Next Steps

  • Configure Memory to enable long-term memory for your bot
  • Set up Skills to extend your bot's capabilities
  • Add Schedules for automated tasks
',32)])])}const b=t(s,[["render",i]]);export{u as __pageData,b as default}; diff --git a/assets/getting-started_platform-telegram.md.BlTohjMj.lean.js b/assets/getting-started_platform-telegram.md.BlTohjMj.lean.js deleted file mode 100644 index e657156a..00000000 --- a/assets/getting-started_platform-telegram.md.BlTohjMj.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as a,ag as r}from"./chunks/framework.ePeAWSvT.js";const n="/getting-started/platform-telegram-01-platforms.png",l="/getting-started/platform-telegram-02-bindcode.png",u=JSON.parse('{"title":"Configure Telegram Channel","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/platform-telegram.md","filePath":"getting-started/platform-telegram.md","lastUpdated":1771405736000}'),s={name:"getting-started/platform-telegram.md"};function i(d,e,c,h,p,g){return o(),a("div",null,[...e[0]||(e[0]=[r("",32)])])}const b=t(s,[["render",i]]);export{u as __pageData,b as default}; diff --git a/assets/getting-started_provider-and-model.md.BGpLYgEh.js b/assets/getting-started_provider-and-model.md.BGpLYgEh.js new file mode 100644 index 00000000..cbe6fce5 --- /dev/null +++ b/assets/getting-started_provider-and-model.md.BGpLYgEh.js @@ -0,0 +1 @@ +import{_ as t,o,c as r,ag as d}from"./chunks/framework.ePeAWSvT.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":1772359263000}'),a={name:"getting-started/provider-and-model.md"};function i(n,e,l,s,g,h){return o(),r("div",null,[...e[0]||(e[0]=[d('

LLM Provider and Model

To use Memoh, you first need to configure at least one LLM Provider and at least one Model.

LLM Provider

An LLM Provider represents a connection to an AI service (like OpenAI, Anthropic, or a self-hosted compatible API). It stores the base URL and authentication credentials.

Creating a Provider

  1. Navigate to the Models page from the sidebar.
  2. Click the Add Provider button at the bottom of the sidebar.
  3. Fill in the following fields:
    • Name: A display name for this provider (e.g., "OpenAI").
    • Base URL: The root URL of the API (e.g., https://api.openai.com/v1).
    • API Key: Your authentication token for the service.
  4. Click Create.

Managing Providers

  • Edit: Select a provider from the list and use the form on the right to update its name, URL, or API key.
  • Delete: Use the Delete Provider button in the provider settings form.

Model

A Model is a specific AI instance (like gpt-4o or text-embedding-3-small) that belongs to a Provider. Memoh distinguishes between Chat models (for conversation) and Embedding models (for memory search).

Adding a Model

  1. Select a Provider from the list on the Models page.
  2. Click Add Model in the model list section.
  3. Configure the following fields:
FieldRequiredDescription
TypeYeschat for conversation, embedding for vector search.
Model IDYesThe exact identifier used by the provider (e.g., gpt-4o).
NameNoA friendly display name (defaults to Model ID).
Client TypeYes (Chat)The API protocol: openai-responses, openai-completions, anthropic-messages, or google-generative-ai.
Input ModalitiesYes (Chat)Capabilities supported: text (default), image, audio, video, file.
Supports ReasoningNoEnable if the model supports internal reasoning steps (e.g., OpenAI o1).
DimensionsYes (Embed)The vector size for embedding models (e.g., 1536).
  1. Click Create.

Managing Models

  • Edit: Click the edit icon next to a model in the list.
  • Delete: Click the trash icon next to a model to remove it.

Next Steps

Now that you have configured your models, you can proceed to Create and Configure a Bot.

',20)])])}const m=t(a,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/getting-started_provider-and-model.md.BGpLYgEh.lean.js b/assets/getting-started_provider-and-model.md.BGpLYgEh.lean.js new file mode 100644 index 00000000..46e75682 --- /dev/null +++ b/assets/getting-started_provider-and-model.md.BGpLYgEh.lean.js @@ -0,0 +1 @@ +import{_ as t,o,c as r,ag as d}from"./chunks/framework.ePeAWSvT.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":1772359263000}'),a={name:"getting-started/provider-and-model.md"};function i(n,e,l,s,g,h){return o(),r("div",null,[...e[0]||(e[0]=[d("",20)])])}const m=t(a,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/getting-started_provider-and-model.md.hf8EhYPV.js b/assets/getting-started_provider-and-model.md.hf8EhYPV.js deleted file mode 100644 index 9ab9f7df..00000000 --- a/assets/getting-started_provider-and-model.md.hf8EhYPV.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as d,ag as r}from"./chunks/framework.ePeAWSvT.js";const a="/getting-started/provider-model-01-sidebar.png",i="/getting-started/provider-model-02-add-provider.png",l="/getting-started/provider-model-03-provider-dialog.png",n="/getting-started/provider-model-04-provider-selected.png",v=JSON.parse('{"title":"Configure Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1771410627000}'),s={name:"getting-started/provider-and-model.md"};function p(c,e,g,h,m,u){return o(),d("div",null,[...e[0]||(e[0]=[r('

Configure Provider and Model

Before creating bots, you need to configure at least one LLM provider and add chat and embedding models. This guide walks you through the Web UI.

Prerequisites

Step 1: Open the Models Page

Click Models in the left sidebar to open the Provider and Model configuration page.

Models page - sidebar

The page has two panels:

  • Left: Provider list and search
  • Right: Selected provider's details and models (or an empty state if none selected)

Step 2: Add a Provider

Click the Add Provider button (with a plus icon) at the bottom of the left panel.

Add Provider button

In the dialog, fill in:

FieldDescription
NameA display name for this provider (e.g. my-openai, ollama-local)
API KeyYour API key. For local services like Ollama, you can use a placeholder like ollama
Base URLThe API base URL (e.g. https://api.openai.com/v1, http://localhost:11434/v1 for Ollama)

Add Provider dialog

Example — OpenAI:

  • Name: openai
  • API Key: sk-...
  • Base URL: https://api.openai.com/v1

Example — Ollama (local):

  • Name: ollama
  • API Key: ollama
  • Base URL: http://localhost:11434/v1

Click Add to save. The new provider appears in the left sidebar.

Step 3: Add Models

Select a provider from the left panel. The right panel shows the provider form and the model list.

Provider selected - model list

Click Add Model to open the model creation dialog.

Fill in:

FieldDescription
Client TypeAPI protocol: openai-responses, openai-completions, anthropic-messages, or google-generative-ai
Typechat or embedding
ModelModel ID (e.g. gpt-4, llama3.2, text-embedding-3-small)
Display NameOptional display name
DimensionsRequired for embedding models (e.g. 1536 for OpenAI embeddings)
MultimodalFor chat models only — enable if the model supports images

You need at least:

  • One chat model (for conversation)
  • One embedding model (for memory)

Add them under the same or different providers. For example:

  • Chat: gpt-4 with client type openai-responses (OpenAI) or llama3.2 with client type openai-completions (Ollama)
  • Embedding: text-embedding-3-small with client type openai-completions (OpenAI) or nomic-embed-text with client type openai-completions (Ollama)

Step 4: Edit or Delete

  • Provider: After selecting a provider, you can edit Name, API Key, and Base URL in the right panel, or delete the provider.
  • Model: Use the edit or delete actions on each model card in the list.

Next Steps

Once you have at least one chat model and one embedding model, you can create a bot (via Bots in the sidebar) and assign these models in the bot settings.

',34)])])}const f=t(s,[["render",p]]);export{v as __pageData,f as default}; diff --git a/assets/getting-started_provider-and-model.md.hf8EhYPV.lean.js b/assets/getting-started_provider-and-model.md.hf8EhYPV.lean.js deleted file mode 100644 index a8325e4e..00000000 --- a/assets/getting-started_provider-and-model.md.hf8EhYPV.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o,c as d,ag as r}from"./chunks/framework.ePeAWSvT.js";const a="/getting-started/provider-model-01-sidebar.png",i="/getting-started/provider-model-02-add-provider.png",l="/getting-started/provider-model-03-provider-dialog.png",n="/getting-started/provider-model-04-provider-selected.png",v=JSON.parse('{"title":"Configure Provider and Model","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/provider-and-model.md","filePath":"getting-started/provider-and-model.md","lastUpdated":1771410627000}'),s={name:"getting-started/provider-and-model.md"};function p(c,e,g,h,m,u){return o(),d("div",null,[...e[0]||(e[0]=[r("",34)])])}const f=t(s,[["render",p]]);export{v as __pageData,f as default}; diff --git a/assets/getting-started_schedule.md.B0pL41RB.js b/assets/getting-started_schedule.md.B0pL41RB.js new file mode 100644 index 00000000..e7ae0cf8 --- /dev/null +++ b/assets/getting-started_schedule.md.B0pL41RB.js @@ -0,0 +1,14 @@ +import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1772359263000}'),i={name:"getting-started/schedule.md"};function r(o,e,l,d,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n(`

Scheduled Tasks

Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.

Concept: Cron-Based Automation

A Schedule is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.


Schedule Fields

FieldDescription
NameA display name for the task (e.g., "Morning News Summary").
DescriptionA brief explanation of what the task does.
PatternA cron expression that defines when the task runs (e.g., 0 9 * * * for daily at 9:00 AM).
CommandThe natural-language instruction sent to the agent when the schedule triggers (e.g., "Summarize today's top tech news and send it to the Telegram channel").
EnabledWhether the schedule is currently active.
Max CallsOptional limit on the total number of executions. Leave empty for unlimited.
Current CallsThe number of times this schedule has already fired.

Cron Pattern Reference

The pattern field uses standard cron syntax with five fields:

┌───────────── minute (0–59)
+│ ┌───────────── hour (0–23)
+│ │ ┌───────────── day of month (1–31)
+│ │ │ ┌───────────── month (1–12)
+│ │ │ │ ┌───────────── day of week (0–6, Sun=0)
+│ │ │ │ │
+* * * * *

Common examples:

PatternMeaning
0 9 * * *Every day at 9:00 AM
*/30 * * * *Every 30 minutes
0 0 * * 1Every Monday at midnight
0 8,20 * * *Every day at 8:00 AM and 8:00 PM
0 0 1 * *First day of every month at midnight

Viewing Schedules

  1. Navigate to the Bot Detail Page.
  2. Select the Schedule tab.
  3. The list shows all schedules for this bot, including their name, cron pattern, enabled status, and execution counts.
  4. Click Refresh to reload the list.

Creating Schedules

Schedules are primarily created in two ways:

Via the Bot (Conversational)

The bot itself has access to a schedule tool. You can ask the bot to create a schedule in natural language:

"Create a schedule called 'Daily Digest' that runs every day at 8 AM and sends me a summary of my unread emails."

The bot will translate this into a cron expression and register the schedule automatically.

Via the API

You can also create schedules programmatically using the REST API:

POST /api/bots/{bot_id}/schedule
json
{
+  "name": "Daily Digest",
+  "description": "Summarize unread emails every morning",
+  "pattern": "0 8 * * *",
+  "command": "Summarize my unread emails and send the result to Telegram.",
+  "enabled": true,
+  "max_calls": null
+}

Execution Flow

When a schedule fires:

  1. The cron service triggers the schedule.
  2. The current_calls counter is incremented.
  3. If max_calls is set and reached, the schedule is automatically disabled.
  4. The agent receives the command along with the schedule context.
  5. The agent executes the command using its tools (e.g., web search, file read, send message).
  6. Results can be delivered to any connected channel.

Schedule vs. Heartbeat

FeatureScheduleHeartbeat
TriggerCron expression (flexible timing)Fixed interval (minutes)
CommandCustom natural-language instructionGeneric "routine check" prompt
Max CallsOptional execution limitUnlimited
Use CaseSpecific recurring tasksPeriodic autonomous thinking

Both features complement each other: use Heartbeat for general-purpose periodic activity and Schedule for precise, task-oriented automation.

`,35)])])}const g=t(i,[["render",r]]);export{u as __pageData,g as default}; diff --git a/assets/getting-started_schedule.md.B0pL41RB.lean.js b/assets/getting-started_schedule.md.B0pL41RB.lean.js new file mode 100644 index 00000000..c7e44868 --- /dev/null +++ b/assets/getting-started_schedule.md.B0pL41RB.lean.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as s,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Scheduled Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/schedule.md","filePath":"getting-started/schedule.md","lastUpdated":1772359263000}'),i={name:"getting-started/schedule.md"};function r(o,e,l,d,h,c){return a(),s("div",null,[...e[0]||(e[0]=[n("",35)])])}const g=t(i,[["render",r]]);export{u as __pageData,g as default}; diff --git a/assets/getting-started_search-provider.md.CWTVwyy0.js b/assets/getting-started_search-provider.md.CWTVwyy0.js new file mode 100644 index 00000000..f0e8772c --- /dev/null +++ b/assets/getting-started_search-provider.md.CWTVwyy0.js @@ -0,0 +1 @@ +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1772359263000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a('

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the Settings tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.
',20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started_search-provider.md.CWTVwyy0.lean.js b/assets/getting-started_search-provider.md.CWTVwyy0.lean.js new file mode 100644 index 00000000..20d12619 --- /dev/null +++ b/assets/getting-started_search-provider.md.CWTVwyy0.lean.js @@ -0,0 +1 @@ +import{_ as r,o as t,c as o,ag as a}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Search Providers","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/search-provider.md","filePath":"getting-started/search-provider.md","lastUpdated":1772359263000}'),i={name:"getting-started/search-provider.md"};function n(s,e,d,l,c,h){return t(),o("div",null,[...e[0]||(e[0]=[a("",20)])])}const p=r(i,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started_skills.md.EnvAtRea.js b/assets/getting-started_skills.md.EnvAtRea.js new file mode 100644 index 00000000..20a9bb9d --- /dev/null +++ b/assets/getting-started_skills.md.EnvAtRea.js @@ -0,0 +1,8 @@ +import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.ePeAWSvT.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(`

Bot Skills

Skills are the "personality" and "capabilities" of a Memoh Bot. They define how the bot should behave and what tools it can use.

Concept: Skills as Markdown

A Skill is represented as a Markdown document with YAML frontmatter. These files are stored within the bot's container and parsed into tools and personality traits.

Example Skill Structure

yaml
---
+name: coder-skill
+description: Enables advanced coding capabilities and tool use.
+---
+
+# Coder Skill
+As a coder, you always follow best practices and write clean, documented code. 
+You can use the \`edit_file\` and \`run_command\` tools to assist the user.

Managing Skills

Manage your bot's skill set from the Skills tab in the Bot Detail page.

Adding a Skill

  1. Click Add Skill.
  2. A dialog with a basic template will open in the Monaco Editor.
  3. Fill in the name, description, and content.
  4. Click Save.

Editing and Deleting

  • Edit: Click the pencil icon next to a skill card to modify its content or frontmatter.
  • Delete: Click the trash icon to remove a skill from the bot's container.

How Bots Use Skills

  • Skills are injected into the bot's system prompt during conversation.
  • The YAML frontmatter helps the system categorize and manage the skills as tools.
  • Modular skills allow you to easily "swap" behaviors or capabilities without rewriting the entire bot.
`,16)])])}const g=s(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/getting-started_skills.md.EnvAtRea.lean.js b/assets/getting-started_skills.md.EnvAtRea.lean.js new file mode 100644 index 00000000..a6ac10b3 --- /dev/null +++ b/assets/getting-started_skills.md.EnvAtRea.lean.js @@ -0,0 +1 @@ +import{_ as s,o as i,c as t,ag as e}from"./chunks/framework.ePeAWSvT.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}; diff --git a/assets/getting-started_subagents.md.B79V3Ppa.js b/assets/getting-started_subagents.md.B79V3Ppa.js new file mode 100644 index 00000000..29ab1f6f --- /dev/null +++ b/assets/getting-started_subagents.md.B79V3Ppa.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Bot Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/subagents.md","filePath":"getting-started/subagents.md","lastUpdated":1772359263000}'),i={name:"getting-started/subagents.md"};function s(r,t,d,l,c,g){return a(),n("div",null,[...t[0]||(t[0]=[o('

Bot Subagents

Subagents are specialized AI entities with their own independent conversation context. They are managed by the main Bot to delegate complex tasks or focus on specific domains.

Concept: Task Specialization

A Subagent is like a specialized teammate for your Bot. While the main Bot handles general conversation, it can spin up and communicate with a Subagent to perform deep analysis, research, or execution.


Fields

Configure Subagents from the Subagents tab in the Bot Detail page.

FieldDescription
NameThe identifier for the subagent (e.g., "Research Assistant").
DescriptionA brief explanation of the subagent's purpose and role.
SkillsA list of specific Skills assigned from the bot's container.
MessagesThe conversation history and context specific to this subagent.
UsageStatistics on token consumption and activity.

Operations

  • Add Subagent: Create a new entity by providing a name and description.
  • Edit: Update the name or description of an existing subagent.
  • Delete: Permanently remove a subagent and its independent context.
  • View Context: Open a dialog to inspect the subagent's conversation history and usage metrics.

Bot Interaction

  • The main Bot uses the Subagent Tool to create, communicate with, and receive results from subagents.
  • Subagents inherit the main bot's container permissions but operate with their own "mental workspace."
  • This modular approach allows for building multi-agent systems within a single Bot's scope.
',14)])])}const p=e(i,[["render",s]]);export{u as __pageData,p as default}; diff --git a/assets/getting-started_subagents.md.B79V3Ppa.lean.js b/assets/getting-started_subagents.md.B79V3Ppa.lean.js new file mode 100644 index 00000000..a2bfe950 --- /dev/null +++ b/assets/getting-started_subagents.md.B79V3Ppa.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as n,ag as o}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Bot Subagents","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started/subagents.md","filePath":"getting-started/subagents.md","lastUpdated":1772359263000}'),i={name:"getting-started/subagents.md"};function s(r,t,d,l,c,g){return a(),n("div",null,[...t[0]||(t[0]=[o("",14)])])}const p=e(i,[["render",s]]);export{u as __pageData,p as default}; diff --git a/assets/index.md.BXBUN2vU.js b/assets/index.md.7vMrZCVa.js similarity index 52% rename from assets/index.md.BXBUN2vU.js rename to assets/index.md.7vMrZCVa.js index 97323a58..1660ff90 100644 --- a/assets/index.md.BXBUN2vU.js +++ b/assets/index.md.7vMrZCVa.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1772071426000}'),i={name:"index.md"};function r(s,e,l,m,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n('

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Lark (Feishu), Web, or CLI. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.

Documentation

',4)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1772359263000}'),i={name:"index.md"};function r(s,e,l,m,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n('

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Lark (Feishu), Web, or CLI. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.

Documentation

',4)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/index.md.BXBUN2vU.lean.js b/assets/index.md.7vMrZCVa.lean.js similarity index 84% rename from assets/index.md.BXBUN2vU.lean.js rename to assets/index.md.7vMrZCVa.lean.js index 287b3938..447b217f 100644 --- a/assets/index.md.BXBUN2vU.lean.js +++ b/assets/index.md.7vMrZCVa.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1772071426000}'),i={name:"index.md"};function r(s,e,l,m,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n("",4)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default}; +import{_ as t,o as a,c as o,ag as n}from"./chunks/framework.ePeAWSvT.js";const u=JSON.parse('{"title":"Memoh Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1772359263000}'),i={name:"index.md"};function r(s,e,l,m,d,c){return a(),o("div",null,[...e[0]||(e[0]=[n("",4)])])}const f=t(i,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/installation_config-toml.md.BasYU7hp.js b/assets/installation_config-toml.md.BasYU7hp.js deleted file mode 100644 index 339f5fb5..00000000 --- a/assets/installation_config-toml.md.BasYU7hp.js +++ /dev/null @@ -1,48 +0,0 @@ -import{_ as s,o as e,c as a,ag as i}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"config.toml Reference","description":"","frontmatter":{},"headers":[],"relativePath":"installation/config-toml.md","filePath":"installation/config-toml.md","lastUpdated":1772108429000}'),d={name:"installation/config-toml.md"};function n(o,t,r,h,l,c){return e(),a("div",null,[...t[0]||(t[0]=[i(`

config.toml Reference

Memoh uses a TOML configuration file (config.toml) in the project root. For Docker deployments, copy the template first: cp conf/app.docker.toml config.toml. See Docker installation for details.

Full Example

toml
[log]
-level = "info"
-format = "text"
-
-[server]
-addr = ":8080"
-
-[admin]
-username = "admin"
-password = "change-your-password"
-email = "admin@example.com"
-
-[auth]
-jwt_secret = "your-secret-from-openssl-rand-base64-32"
-jwt_expires_in = "168h"
-
-[containerd]
-socket_path = "/run/containerd/containerd.sock"
-namespace = "default"
-
-[mcp]
-# registry = "memoh.cn"  # Uncomment for China mainland mirror
-image = "memohai/mcp:latest"
-snapshotter = "overlayfs"
-data_root = "data"
-
-[postgres]
-host = "127.0.0.1"
-port = 5432
-user = "memoh"
-password = "your-password"
-database = "memoh"
-sslmode = "disable"
-
-[qdrant]
-base_url = "http://127.0.0.1:6334"
-api_key = ""
-collection = "memory"
-timeout_seconds = 10
-
-[agent_gateway]
-host = "127.0.0.1"
-port = 8081
-server_addr = ":8080"
-
-[web]
-host = "127.0.0.1"
-port = 8082

Section Reference

[log]

FieldTypeDefaultDescription
levelstring"info"Log level: debug, info, warn, error
formatstring"text"Log format: text or json

[server]

FieldTypeDefaultDescription
addrstring":8080"HTTP listen address. Use :8080 for all interfaces, or host:port (e.g. server:8080 in Docker).

[admin]

FieldTypeDefaultDescription
usernamestring"admin"Admin login username
passwordstringAdmin login password. Change in production.
emailstringAdmin email (for display)

[auth]

FieldTypeDefaultDescription
jwt_secretstringSecret for signing JWT tokens. Required. Generate with openssl rand -base64 32.
jwt_expires_instring"24h"JWT expiration, e.g. "24h", "168h" (7 days)

[containerd]

FieldTypeDefaultDescription
socket_pathstring"/run/containerd/containerd.sock"Path to containerd socket
namespacestring"default"Containerd namespace for bot containers

[mcp]

MCP (Model Context Protocol) container configuration. Each bot runs in a container built from this image.

FieldTypeDefaultDescription
registrystring""Image registry mirror prefix. Set to "memoh.cn" for China mainland. When set, the final image ref becomes registry/image.
imagestring"memohai/mcp:latest"MCP container image. Short Docker Hub names are auto-normalized for containerd (e.g. memohai/mcp:latestdocker.io/memohai/mcp:latest).
snapshotterstring"overlayfs"Containerd snapshotter
data_rootstring"data"Host path for bot data (Docker: /opt/memoh/data)
cni_bin_dirstring"/opt/cni/bin"CNI plugin binary directory
cni_conf_dirstring"/etc/cni/net.d"CNI configuration directory

[postgres]

FieldTypeDefaultDescription
hoststring"127.0.0.1"PostgreSQL host
portint5432PostgreSQL port
userstring"memoh"Database user
passwordstringDatabase password
databasestring"memoh"Database name
sslmodestring"disable"SSL mode: disable, require, verify-ca, verify-full

[qdrant]

FieldTypeDefaultDescription
base_urlstring"http://127.0.0.1:6334"Qdrant HTTP API URL
api_keystring""Optional API key for Qdrant Cloud
collectionstring"memory"Vector collection name for memories
timeout_secondsint10Request timeout in seconds

[agent_gateway]

FieldTypeDefaultDescription
hoststring"127.0.0.1"Agent gateway bind host. In Docker, use "agent" (service name).
portint8081Agent gateway port
server_addrstring":8080"Address the agent uses to reach the main server. In Docker, use "server:8080".

[web]

FieldTypeDefaultDescription
hoststring"127.0.0.1"Web UI bind host
portint8082Web UI port

Web search providers (Brave, Bing, Google, Tavily, Serper, SearXNG, Jina, Exa, Bocha, DuckDuckGo, Yandex, Sogou) are configured through the web UI under Search Providers, not in config.toml.

`,27)])])}const E=s(d,[["render",n]]);export{k as __pageData,E as default}; diff --git a/assets/installation_config-toml.md.BasYU7hp.lean.js b/assets/installation_config-toml.md.BasYU7hp.lean.js deleted file mode 100644 index 900ecdfa..00000000 --- a/assets/installation_config-toml.md.BasYU7hp.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as e,c as a,ag as i}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"config.toml Reference","description":"","frontmatter":{},"headers":[],"relativePath":"installation/config-toml.md","filePath":"installation/config-toml.md","lastUpdated":1772108429000}'),d={name:"installation/config-toml.md"};function n(o,t,r,h,l,c){return e(),a("div",null,[...t[0]||(t[0]=[i("",27)])])}const E=s(d,[["render",n]]);export{k as __pageData,E as default}; diff --git a/assets/installation_docker.md.BA7jSLuf.js b/assets/installation_docker.md.BA7jSLuf.js new file mode 100644 index 00000000..6bc9f6ba --- /dev/null +++ b/assets/installation_docker.md.BA7jSLuf.js @@ -0,0 +1,16 @@ +import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1772359263000}'),n={name:"installation/docker.md"};function o(l,s,d,r,h,p){return a(),e("div",null,[...s[0]||(s[0]=[t(`

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, Qdrant, the main server (with embedded Containerd), agent gateway, and web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, China mirror)
  3. Clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Write a .env file with POSTGRES_PASSWORD and MEMOH_CONFIG
  6. Pull images and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Manual Install

bash
git clone --depth 1 https://github.com/memohai/Memoh.git
+cd Memoh
+cp conf/app.docker.toml config.toml

Edit config.toml — at minimum change:

  • admin.password — Admin password
  • auth.jwt_secret — Generate with openssl rand -base64 32
  • postgres.password — Database password (must match the POSTGRES_PASSWORD env var)

Then start:

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose up -d

Alternatively, create a .env file in the project root:

env
POSTGRES_PASSWORD=your-db-password
+MEMOH_CONFIG=./config.toml

Then simply run:

bash
sudo docker compose up -d

On macOS or if your user is in the docker group, sudo is not required.

Important: docker-compose.yml mounts \${MEMOH_CONFIG:-./config.toml} into the containers. You must create this file before starting — running without it will fail.

China Mainland Mirror

For users in mainland China who cannot access Docker Hub directly, uncomment the registry line in config.toml:

toml
[mcp]
+registry = "memoh.cn"

And use the China mirror compose overlay:

bash
sudo docker compose -f docker-compose.yml -f docker/docker-compose.cn.yml up -d

The install script handles this automatically when you answer "yes" to the China mirror prompt.

Service Architecture

Docker Compose starts the following services:

ServiceImageDescription
postgrespostgres:18-alpinePostgreSQL database
qdrantqdrant/qdrant:latestQdrant vector database for memory semantic search
migratememohai/server:latestOne-shot service — runs database migrations, then exits
servermemohai/server:latestMain backend with embedded Containerd (privileged)
agentmemohai/agent:latestAgent Gateway (Bun/Elysia) for AI chat, tool execution, and SSE streaming
webmemohai/web:latestWeb UI (Vue 3 + Nginx)

Startup order: postgres and qdrant start first; once healthy, migrate runs database migrations; after migration completes, server starts; finally agent and web come up.

Access Points

After startup:

ServiceURL
Web UIhttp://localhost:8082
APIhttp://localhost:8080
Agent Gatewayhttp://localhost:8081

Default login: admin / admin123 (change this in config.toml).

First startup may take 1–2 minutes while images are pulled and services initialize.

Data Persistence

All persistent data is stored in Docker named volumes:

VolumeDescription
postgres_dataPostgreSQL database files
qdrant_dataQdrant vector storage
containerd_dataContainerd image store and snapshots
memoh_dataBot container data (mounted at /opt/memoh/data inside the server)
server_cni_stateCNI network state for container networking

These volumes survive docker compose down. To fully reset all data, run:

bash
docker compose down -v

Common Commands

Prefix with sudo on Linux if your user is not in the docker group.

bash
docker compose up -d           # Start
+docker compose down            # Stop
+docker compose logs -f         # View logs
+docker compose logs server     # View a specific service's logs
+docker compose ps              # Status
+docker compose pull && docker compose up -d  # Update to latest images

Upgrading

To upgrade to the latest version:

bash
cd /path/to/Memoh
+git pull
+docker compose pull
+docker compose up -d

The migrate service runs automatically on every startup, applying any new database migrations.

Environment Variables

VariableDefaultDescription
POSTGRES_PASSWORDmemoh123PostgreSQL password (must match postgres.password in config.toml)
MEMOH_CONFIG./config.tomlPath to the configuration file

Production Checklist

  1. Passwords — Change all default passwords and secrets in config.toml
  2. HTTPS — Configure SSL (e.g. via docker-compose.override.yml with certs or a reverse proxy)
  3. Firewall — Restrict access to necessary ports
  4. Resource limits — Set memory/CPU limits for containers
  5. Backups — Regular backups of Postgres and Qdrant data volumes

Troubleshooting

bash
docker compose logs server      # View main service logs
+docker compose logs migrate     # Check if migrations succeeded
+docker compose config           # Validate compose configuration
+docker compose down && docker compose up -d  # Full restart

Security Warnings

  • The main service runs with privileged container access (required for embedded Containerd) — only run in trusted environments
  • You must change all default passwords and secrets before production use
  • Use HTTPS in production
`,60)])])}const g=i(n,[["render",o]]);export{k as __pageData,g as default}; diff --git a/assets/installation_docker.md.BA7jSLuf.lean.js b/assets/installation_docker.md.BA7jSLuf.lean.js new file mode 100644 index 00000000..da6715d1 --- /dev/null +++ b/assets/installation_docker.md.BA7jSLuf.lean.js @@ -0,0 +1 @@ +import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1772359263000}'),n={name:"installation/docker.md"};function o(l,s,d,r,h,p){return a(),e("div",null,[...s[0]||(s[0]=[t("",60)])])}const g=i(n,[["render",o]]);export{k as __pageData,g as default}; diff --git a/assets/installation_docker.md.Ce3JA8xc.js b/assets/installation_docker.md.Ce3JA8xc.js deleted file mode 100644 index 2150f683..00000000 --- a/assets/installation_docker.md.Ce3JA8xc.js +++ /dev/null @@ -1,10 +0,0 @@ -import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1772108429000}'),n={name:"installation/docker.md"};function l(o,s,h,r,p,d){return a(),e("div",null,[...s[0]||(s[0]=[t(`

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, Qdrant, the main server (with embedded Containerd), agent gateway, and web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, China mirror)
  3. Clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Pull images and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Manual Install

bash
git clone https://github.com/memohai/Memoh.git
-cd Memoh
-cp conf/app.docker.toml config.toml

Edit config.toml — at minimum change:

  • admin.password — Admin password
  • auth.jwt_secret — Generate with openssl rand -base64 32
  • postgres.password — Database password (also set POSTGRES_PASSWORD env var to match)

Then start:

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose up -d

On macOS or if your user is in the docker group, sudo is not required.

Important: docker-compose.yml mounts ./config.toml by default. You must create this file before starting — running without it will fail.

China Mainland Mirror

For users in mainland China who cannot access Docker Hub directly, uncomment the registry line in config.toml:

toml
[mcp]
-registry = "memoh.cn"

And use the China mirror compose overlay:

bash
sudo docker compose -f docker-compose.yml -f docker/docker-compose.cn.yml up -d

The install script handles this automatically when you answer "yes" to the China mirror prompt.

Access Points

After startup:

ServiceURL
Web UIhttp://localhost:8082
APIhttp://localhost:8080
Agent Gatewayhttp://localhost:8081

Default login: admin / admin123 (change this in config.toml).

First startup may take 1–2 minutes while images are pulled and services initialize.

Common Commands

Prefix with sudo on Linux if your user is not in the docker group.

bash
docker compose up -d           # Start
-docker compose down            # Stop
-docker compose logs -f         # View logs
-docker compose ps              # Status
-docker compose pull && docker compose up -d  # Update to latest images

Production Checklist

  1. Passwords — Change all default passwords and secrets in config.toml
  2. HTTPS — Configure SSL (e.g. via docker-compose.override.yml with certs or a reverse proxy)
  3. Firewall — Restrict access to necessary ports
  4. Resource limits — Set memory/CPU limits for containers
  5. Backups — Regular backups of Postgres and Qdrant data

Troubleshooting

bash
docker compose logs server      # View main service logs
-docker compose config           # Validate configuration
-docker compose build --no-cache && docker compose up -d  # Full rebuild

Security Warnings

  • The main service runs with privileged container access — only run in trusted environments
  • You must change all default passwords and secrets before production use
  • Use HTTPS in production
`,41)])])}const g=i(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/installation_docker.md.Ce3JA8xc.lean.js b/assets/installation_docker.md.Ce3JA8xc.lean.js deleted file mode 100644 index 98c629ad..00000000 --- a/assets/installation_docker.md.Ce3JA8xc.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,o as a,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const c=JSON.parse('{"title":"Docker Installation","description":"","frontmatter":{},"headers":[],"relativePath":"installation/docker.md","filePath":"installation/docker.md","lastUpdated":1772108429000}'),n={name:"installation/docker.md"};function l(o,s,h,r,p,d){return a(),e("div",null,[...s[0]||(s[0]=[t("",41)])])}const g=i(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/troubleshooting.md.rkMlAGoL.js b/assets/troubleshooting.md.rkMlAGoL.js deleted file mode 100644 index 625579d9..00000000 --- a/assets/troubleshooting.md.rkMlAGoL.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as i,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{},"headers":[],"relativePath":"troubleshooting.md","filePath":"troubleshooting.md","lastUpdated":1771431627000}'),n={name:"troubleshooting.md"};function o(l,s,h,r,p,d){return i(),e("div",null,[...s[0]||(s[0]=[t('

Troubleshooting

MCP Container: no running task found: task mcp-xxx not found

Symptom

When a bot tries to use container tools (e.g., execute commands), the server logs show:

level=WARN msg="exec failed" provider=container_tool bot_id=xxx command=date error="no running task found: task mcp-xxx not found"

The containerd container logs may also show:

level=error msg="failed to delete task" error="rpc error: code = NotFound desc = container not created: not found"

Cause

The [mcp] data_root in config.toml is set to a host machine path (e.g., /Users/you/Code/Memoh/data), but the server and containerd containers use a Docker named volume mounted at /opt/memoh/data.

When the server creates an MCP container inside containerd, it uses data_root as the mount source. Since this host path does not exist inside the containerd container, runc fails with:

failed to fulfil mount request: open /Users/you/Code/Memoh/data/bots/xxx: no such file or directory

Solution

  1. Set data_root to the in-container path in your config:
toml
[mcp]\ndata_root = "/opt/memoh/data"
  1. Clean up the stale containerd container (if it exists):
bash
docker exec memoh-containerd ctr -n default containers rm mcp-<bot-id>
  1. Restart the server:
bash
docker compose restart server

Note: If you also run the server locally (outside Docker), keep the Docker config (conf/app.docker.toml) separate from your local config.toml, and update docker-compose.yml to mount the Docker-specific config instead.

MCP Container: Image update not taking effect after rebuild

Symptom

After updating Dockerfile.containerd (e.g., adding Node.js/Python to the MCP image), rebuilding and restarting the containerd container, MCP tools still fail with errors like:

exec: "npx": executable file not found in $PATH

Cause

The containerd entrypoint script (containerd-entrypoint.sh) skips image import if the image already exists in containerd's image store:

sh
if ! ctr -n default images check "name==${MCP_IMAGE}" ...; then\n  # import\nfi

Since containerd_data is a persistent Docker volume, the old MCP image survives across container restarts. The new image embedded in the rebuilt Docker image is never imported.

Solution

  1. Remove the old MCP image from containerd:
bash
docker exec memoh-containerd ctr -n default images rm docker.io/library/memoh-mcp:latest
  1. Restart the containerd container to trigger re-import:
bash
docker compose restart containerd
  1. Verify the new image was imported (size should be significantly larger if Node.js/Python were added):
bash
docker exec memoh-containerd ctr -n default images ls
  1. Delete the bot's MCP container and recreate it from the bot detail page so it uses the new image.
',35)])])}const g=a(n,[["render",o]]);export{k as __pageData,g as default}; diff --git a/assets/troubleshooting.md.rkMlAGoL.lean.js b/assets/troubleshooting.md.rkMlAGoL.lean.js deleted file mode 100644 index 12bfd7ec..00000000 --- a/assets/troubleshooting.md.rkMlAGoL.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as i,c as e,ag as t}from"./chunks/framework.ePeAWSvT.js";const k=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{},"headers":[],"relativePath":"troubleshooting.md","filePath":"troubleshooting.md","lastUpdated":1771431627000}'),n={name:"troubleshooting.md"};function o(l,s,h,r,p,d){return i(),e("div",null,[...s[0]||(s[0]=[t("",35)])])}const g=a(n,[["render",o]]);export{k as __pageData,g as default}; diff --git a/blogs/2026-02-16.html b/blogs/2026-02-16.html index f01c491d..0446147c 100644 --- a/blogs/2026-02-16.html +++ b/blogs/2026-02-16.html @@ -9,9 +9,9 @@ - + - + @@ -20,7 +20,7 @@
Skip to content

Introduction to Memoh - The Case for an Always-On, Containerized Home Agent

Overview

We enter 2026 with a familiar tension: models get smarter every quarter, but the “agent experience” still breaks on context, latency, privacy, and real-world workflows. Over the past year, we kept circling three questions:

  • Where does the capability boundary of agents actually sit?
  • What’s the real value of long context?
  • What hardware form factor makes “always-on, personal AI” feel natural?

Memoh is our attempt to turn those questions into something buildable—not a manifesto, but a system that can survive contact with reality.

Story Time

Time travels fast. Somewhere between “I’ll remember this” and “wait, why did we decide that?”, a year disappears.

That’s the annoying part of building: most progress doesn’t feel like progress while it’s happening. It’s just a stream of small choices, half-finished threads, late-night fixes, and the occasional moment that actually clicks. The kind of moment where you sit back and think: okay—this is real.

Around the same time, I noticed something else: the internet started to feel smoother—and worse.

Text got cleaner, longer, more polite, more… empty. You could smell when something was generated: low information density, too many metaphors, too much agreement, not enough stakes.

I caught myself doing it too.

So I started forcing a constraint: say it plainly. Keep the density. Don’t inflate. Don’t hide behind style. If something mattered, anchor it to a real moment, a real trade-off, a real cost paid.

Because the thing LLMs can’t give you is not “intelligence.” It’s weight. The feeling that a human actually stood somewhere in time and wrote from that position.

That’s when I realized what I wanted wasn’t “an AI that can talk.” I wanted an AI that can live with you—quietly, continuously, accumulating context without turning your life into content sludge.

Phones were our first instinct—it's personal, powerful, always there. But mobile OS is closed: without OEM privileges you can build an app, not ambient infrastructure.

So we looked for the always-on node every home already has: the router (conceptually). Then the economics clash—router-class hardware can’t carry memory, RAG, tools, and multi-user agents. The device evolves: more RAM/storage, a screen, mic/speaker, tiny battery for take out, portable form.

Eventually it stops being a router. It becomes a new category: a home agent base layer.

What

Memoh is a containerized home/studio AI base layer: cloud-grade model capability paired with local-first memory (knowledge base, RAG/search, conversation history) that stays under your control.

Why

Long-context models raise the ceiling for agents—but they also make “fully local” expensive and “fully cloud” uncomfortable. People don’t want to re-brief AI every day, and they don’t want their durable context trapped in someone else’s feed. Containerization makes Memoh portable, reproducible, and safe to run as always-on infrastructure—so continuity becomes cheap, private, and dependable.

How

We run Memoh as a containerized stack: isolated services for storage (files/DB/vector index), retrieval, tool/runtime execution, and the control plane. Inference calls cloud APIs when you need frontier capability; durable memory and indexing stay local. The device acts as an always-on node (router-like, not a router) serving multiple users with strict boundaries: sharing is explicit, private context remains private, and everything is deployable/upgradable as versioned containers.

Features

  • Multi-bot Management: Create multiple bots; humans and bots, or bots with each other, can chat privately, in groups, or collaborate.

    Multi-bot Management

  • Containerized: Each bot runs in its own isolated container. Bots can freely execute commands, edit files, and access the network within their containers—like having their own computer.

    Containerized

  • Memory Engineering: Every chat is stored in the database, with the last 24 hours of context loaded by default. Each conversation turn is stored as memory and can be retrieved by bots through semantic search.

    Memory Engineering

  • Various Platforms: Supports Telegram, Lark (Feishu), and more.

  • Simple and Easy to Use: Configure bots and settings for Provider, Model, Memory, Channel, MCP, and Skills through a graphical interface—no coding required to set up your own AI bot.

  • Scheduled Tasks: Schedule tasks with cron expressions to run commands at specified times.

  • More...

Compare to OpenClaw

We share a core belief: both Memoh and OpenClaw treat the agent as more than a chatbox—we give the LLM a playground: a real environment where it can remember, use tools, and iterate.

Where Memoh differs:

  • Lighter and Faster: built as home/studio infrastructure, can be held in the edge device
  • Containerized by default: each bot gets an isolated container (files/commands/network/jobs)
  • Hybrid split: cloud inference, local-first memory + indexing
  • Multi-user first: explicit sharing and privacy boundaries, support a2a (Agent2Agent)
  • Sustainable: have an experienced team and confidence to push forward and build it

Conclusion

Memoh is built for one thing: always-on continuity—an AI that stays online, and a memory that stays yours.

We keep frontier inference in the cloud, keep durable context local, and run everything as a containerized, always-on stack. If you want an agent that feels less like an app and more like home infrastructure, that’s the bet Memoh is making.

Furthermore, we will continue to operate and permanently open-source Memoh, making it a product with long impact.

Published under AGPLv3

- + \ No newline at end of file diff --git a/blogs/index.html b/blogs/index.html index 18e420ea..e75b2fb1 100644 --- a/blogs/index.html +++ b/blogs/index.html @@ -9,9 +9,9 @@ - + - + @@ -20,7 +20,7 @@
Skip to content

Blogs

This section contains the latest blogs about Memoh.

Published under AGPLv3

- + \ No newline at end of file diff --git a/channels/discord.html b/channels/discord.html new file mode 100644 index 00000000..b7f27d19 --- /dev/null +++ b/channels/discord.html @@ -0,0 +1,26 @@ + + + + + + Discord Channel Configuration | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Discord Channel Configuration

Connecting your Memoh Bot to Discord allows it to join servers and interact with community members.

Step 1: Create a Discord Application

  1. Go to the Discord Developer Portal.
  2. Click New Application and give it a name.
  3. In the left sidebar, go to Bot.
  4. Click Reset Token to generate a Bot Token. Copy this token and store it securely.

Step 2: Configure Bot Settings

  1. Scroll down to the Privileged Gateway Intents section.
  2. Enable Message Content Intent (required for the bot to read user messages).
  3. Save changes.

Step 3: Invite the Bot to Your Server

  1. Go to OAuth2 > URL Generator.
  2. Select scopes: bot, applications.commands.
  3. Select permissions: Send Messages, Read Message History, Embed Links, Attach Files.
  4. Copy the generated URL and open it in your browser.
  5. Select the server you want to add the bot to and authorize it.

Official Guide: Discord Developer Portal - Bots

Step 4: Configure Memoh

  1. Go to your Bot's Channels tab in the Memoh Web UI.
  2. Click Add Channel and select Discord.
  3. Paste your Bot Token.
  4. Click Save and Enable.

Features Supported

  • Message Content: Full access to chat text.
  • Attachments: Support for images and files.
  • Commands: Integration with Discord's slash commands (if configured via MCP).

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/channels/feishu.html b/channels/feishu.html new file mode 100644 index 00000000..3d7be2ee --- /dev/null +++ b/channels/feishu.html @@ -0,0 +1,26 @@ + + + + + + Feishu (Lark) Channel Configuration | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Feishu (Lark) Channel Configuration

Memoh supports integrating with Feishu (Lark) via the Open Platform. This allows your enterprise bots to interact with users in groups or private chats.

Step 1: Create a Feishu App

  1. Go to the Feishu Open Platform and log in.
  2. Click Create Custom App.
  3. Enter a name and description, then click Create.
  4. In the left sidebar, go to App Settings > Credentials & Basic Info.
  5. Copy your App ID and App Secret.

Step 2: Enable Bot Capability

  1. In the Feishu Developer Console, go to Capabilities > Bot.
  2. Click Enable Bot.

Step 3: Configure Permissions

  1. Go to Capabilities > Permissions.
  2. Search for and enable the following permissions (at minimum):
    • im:message (Receive and send messages)
    • im:chat (Access group chat information)
  3. Click Apply for Permissions if required by your organization.

Step 4: Configure Events (Webhook Mode)

  1. In Memoh, go to your Bot's Channels tab and add a Feishu channel.
  2. Choose Inbound Mode: webhook.
  3. Fill in your App ID and App Secret.
  4. Click Save. Memoh will generate a Webhook Callback URL.
  5. Copy this URL.
  6. In the Feishu Console, go to App Settings > Event Subscriptions.
  7. Paste the URL into the Verification URL field and save.
  8. Add events like Receive Message (im.message.receive_v1).

Official Guide: Feishu Custom Bot Guide

Step 5: Publish Your App

  1. In the Feishu Console, go to App Release > Version Management & Release.
  2. Click Create a Version, fill in the details, and submit for approval.
  3. Once approved and published, the bot is ready to use.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/channels/index.html b/channels/index.html new file mode 100644 index 00000000..98e8989f --- /dev/null +++ b/channels/index.html @@ -0,0 +1,26 @@ + + + + + + Channels Overview | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Channels Overview

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.

Memoh currently supports the following channels:

  • Telegram: The most feature-rich integration with streaming and attachment support.
  • Feishu (Lark): Enterprise-ready integration for business workflows.
  • Discord: Community-focused integration for servers and direct messages.
  • Email: Connect via standard SMTP and IMAP (configured through Email Providers).
  • Web: Built-in chat interface for immediate access.

General Setup Flow

  1. Create an external app/bot: Register your bot on the target platform (e.g., via BotFather on Telegram).
  2. Obtain credentials: Fetch API tokens, App IDs, or secrets.
  3. Configure in Memoh: Add the channel to your Bot's settings and paste the credentials.
  4. Enable: Activate the channel to start receiving and sending messages.

Choose a channel from the sidebar to see detailed configuration guides for each platform.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/channels/telegram.html b/channels/telegram.html new file mode 100644 index 00000000..88505cc3 --- /dev/null +++ b/channels/telegram.html @@ -0,0 +1,26 @@ + + + + + + Telegram Channel Configuration | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Telegram Channel Configuration

This guide walks you through connecting your Memoh Bot to Telegram. Telegram is one of the most supported platforms in Memoh, featuring streaming responses, Markdown formatting, and attachment support.

Step 1: Create a Telegram Bot

You need to create a bot on Telegram to get an API token.

  1. Open Telegram and search for the official @BotFather bot.
  2. Send the /newbot command.
  3. Follow the prompts:
    • Name: Choose a display name for your bot (e.g., My Memoh Bot).
    • Username: Choose a unique username ending in bot (e.g., my_memoh_bot).
  4. BotFather will provide you with an API Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz). Keep this token secret.

Official Guide: Telegram Bot Tutorial

Step 2: Configure Memoh

  1. Go to your Bot's Detail Page in the Memoh Web UI.
  2. Select the Channels tab.
  3. Click Add Channel and select Telegram.
  4. Paste your API Token into the credentials field.
  5. Click Save and Enable.

Step 3: Bind Your Identity (Optional)

If your bot is a personal type bot, you need to bind your Telegram identity to your Memoh account to chat with it directly.

  1. In Memoh Web UI, go to Settings > Bind Code.
  2. Select Telegram and click Generate.
  3. Copy the code.
  4. Open a chat with your new bot on Telegram and send the bind code.
  5. The bot should respond that your identity is successfully linked.

Features Supported

  • Streaming: Responses appear as the bot "thinks."
  • Markdown: Support for bold, italic, code blocks, and links.
  • Attachments: Send images or files to the bot; the bot can also send files back.
  • Replies: The bot understands context from message replies.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/cli/auth.html b/cli/auth.html deleted file mode 100644 index db38127e..00000000 --- a/cli/auth.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Auth Commands | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Auth Commands

login

Log in to the Memoh server. Prompts for username and password, then stores the JWT token in ~/.memoh/token.json.

bash
memoh login

Interactive prompts:

  • Username
  • Password

logout

Clear the stored token and log out.

bash
memoh logout

whoami

Show the current logged-in user (username, display name, user ID, role). Falls back to token info if the API call fails.

bash
memoh whoami

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/cli/bot.html b/cli/bot.html deleted file mode 100644 index 87a48a3d..00000000 --- a/cli/bot.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Bot Commands | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Bot Commands

Manage bots and chat with them.

bot list

List all bots. Admins can filter by owner.

bash
memoh bot list [options]
OptionDescription
--owner <user_id>Filter by owner user ID (admin only)

bot create

Create a new bot. Prompts for type and optionally name.

bash
memoh bot create [options]
OptionDescription
--type <type>personal or public
--name <name>Display name
--avatar <url>Avatar URL
--activeSet bot active
--inactiveSet bot inactive

bot update

Update bot info. Bot ID can be passed as argument or selected interactively.

bash
memoh bot update [id] [options]
OptionDescription
--name <name>Display name
--avatar <url>Avatar URL
--activeSet bot active
--inactiveSet bot inactive

bot delete

Delete a bot. Asks for confirmation.

bash
memoh bot delete [id]

bot chat

Start an interactive streaming chat with a bot.

bash
memoh bot chat [id]

Type messages and press Enter. Type exit to quit.

bot set-model

Enable a model for a bot (chat, memory, or embedding).

bash
memoh bot set-model [id] [options]
OptionDescription
--as <usage>chat, memory, or embedding
--model <model_id>Model ID

Example:

bash
memoh bot set-model my-bot-id --as chat --model gpt-4

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/cli/channel.html b/cli/channel.html deleted file mode 100644 index 03b20fb0..00000000 --- a/cli/channel.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Channel Commands | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Channel Commands

Manage channels and bot/user channel configuration.

channel list

List available channel types (e.g. telegram, feishu, local).

bash
memoh channel list

channel info

Show channel metadata and schema for a channel type.

bash
memoh channel info [type]

If type is omitted, prompts to select from available channels.

channel config get

Get a bot's channel configuration.

bash
memoh channel config get [bot_id] [options]
OptionDescription
--type <type>Channel type

channel config set

Set a bot's channel configuration. Currently supports Feishu.

bash
memoh channel config set [bot_id] [options]
OptionDescription
--type <type>Channel type (e.g. feishu)
--app_id <id>Feishu App ID
--app_secret <secret>Feishu App Secret
--encrypt_key <key>Encrypt key (optional)
--verification_token <token>Verification token (optional)

channel bind get

Get the current user's channel binding for a platform.

bash
memoh channel bind get [options]
OptionDescription
--type <type>Channel type

channel bind set

Set the current user's channel binding. Currently supports Feishu (open_id or user_id).

bash
memoh channel bind set [options]
OptionDescription
--type <type>Channel type (e.g. feishu)
--open_id <id>Feishu Open ID
--user_id <id>Feishu User ID

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/cli/chat.html b/cli/chat.html deleted file mode 100644 index e996ce6f..00000000 --- a/cli/chat.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - Chat Commands | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Chat Commands

Default: Interactive Chat

Running memoh with no subcommand starts an interactive chat. Use --bot <id> to specify which bot to chat with; otherwise you'll be prompted to select one.

bash
memoh [options]
-memoh --bot <bot_id>
OptionDescription
--bot <id>Bot ID to chat with

Type your message and press Enter. Type exit to quit. Responses stream in real time.

tui

Terminal UI chat session. Same behavior as the default chat but explicitly invoked.

bash
memoh tui [options]
-memoh tui --bot <bot_id>
OptionDescription
--bot <id>Bot ID to chat with

version

Show the CLI version.

bash
memoh version

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/cli/config.html b/cli/config.html deleted file mode 100644 index e7feec13..00000000 --- a/cli/config.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Config Commands | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Config Commands

The CLI stores its config in ~/.memoh/config.toml. Use these commands to view or update it.

config

Show the current config (host and port).

bash
memoh config

Output example:

host = "127.0.0.1"
-port = 8080

config set

Update the config. Prompts for host and port if not provided via options.

bash
memoh config set [options]
OptionDescription
--host <host>API host (e.g. 127.0.0.1 or api.example.com)
--port <port>API port (default: 8080)

Examples:

bash
memoh config set --host 192.168.1.100 --port 8080
-memoh config set
-# Interactive prompts for host and port

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/cli/index.html b/cli/index.html deleted file mode 100644 index c3515d0e..00000000 --- a/cli/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - Memoh CLI | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Memoh CLI

The Memoh CLI (memoh) is a command-line tool for managing bots, channels, providers, models, schedules, and chatting with bots. It talks to a running Memoh server via its API.

Installation

The CLI is part of the Memoh monorepo. Install from source:

bash
git clone https://github.com/memohai/Memoh.git
-cd Memoh
-pnpm install

Run the CLI:

bash
cd packages/cli
-pnpm start -- --help

To use memoh as a global command:

bash
cd packages/cli
-pnpm build
-pnpm link --global
-memoh --help

Ensure your Memoh server is running (see Docker installation) and the API is reachable at the configured host/port (default: 127.0.0.1:8080).

Configuration

The CLI stores config in ~/.memoh/config.toml and auth token in ~/.memoh/token.json. Use memoh config to view and memoh config set to change host/port.

Commands

CommandDescription
loginLog in to the Memoh server
logoutLog out and clear token
whoamiShow current user
configShow or update CLI config (host, port)
providerList, create, delete LLM providers
modelList, create, delete models
botList, create, update, delete bots; chat; set model
channelList channels; get/set bot channel config; get/set user binding
scheduleList, create, update, toggle, delete bot schedules
chatInteractive chat with a bot (default command)
tuiTerminal UI chat session
versionShow CLI version

Most commands require authentication. Run memoh login first.

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/cli/model.html b/cli/model.html deleted file mode 100644 index 88f04ecf..00000000 --- a/cli/model.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Model Commands | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Model Commands

Manage chat and embedding models.

model list

List all models with their provider, type, client type, and multimodal flag.

bash
memoh model list

model create

Create a new model. Prompts for provider, model ID, type, client type, and (for embedding models) dimensions.

bash
memoh model create [options]
OptionDescription
--model_id <id>Model ID (e.g. gpt-4, text-embedding-3-small)
--name <name>Display name
--provider <provider>Provider name
--client_type <type>Client type: openai-responses, openai-completions, anthropic-messages, google-generative-ai
--type <type>chat or embedding
--dimensions <n>Embedding dimensions (required for embedding models)
--multimodalMark as multimodal

Examples:

bash
memoh model create --model_id gpt-4 --provider my-openai --client_type openai-responses --type chat
-memoh model create --model_id text-embedding-3-small --provider my-openai --client_type openai-completions --type embedding --dimensions 1536
-memoh model create
-# Interactive prompts

model delete

Delete a model by model ID.

bash
memoh model delete --model <model_id>

Example:

bash
memoh model delete --model gpt-4

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/cli/provider.html b/cli/provider.html deleted file mode 100644 index 3bee1e4a..00000000 --- a/cli/provider.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Provider Commands | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Provider Commands

Manage LLM providers (API endpoints and credentials).

provider list

List all providers. Optionally filter by provider name.

bash
memoh provider list [options]
OptionDescription
--provider <name>Filter by provider name

Examples:

bash
memoh provider list
-memoh provider list --provider my-openai

provider create

Create a new provider. Prompts for any missing fields.

bash
memoh provider create [options]
OptionDescription
--name <name>Provider name
--base_url <url>Base URL for the API
--api_key <key>API key

Examples:

bash
memoh provider create --name my-ollama --base_url http://localhost:11434/v1
-memoh provider create
-# Interactive prompts

provider delete

Delete a provider by name.

bash
memoh provider delete --provider <name>

Example:

bash
memoh provider delete --provider my-ollama

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/cli/schedule.html b/cli/schedule.html deleted file mode 100644 index de2c34b4..00000000 --- a/cli/schedule.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Schedule Commands | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Schedule Commands

Manage cron-based schedules for bots. All schedule commands require --bot <id> to specify the bot.

schedule list

List all schedules for a bot.

bash
memoh schedule list --bot <bot_id>

schedule get

Get a schedule by ID.

bash
memoh schedule get <id> --bot <bot_id>

schedule create

Create a new schedule. Prompts for name, description, cron pattern, command, and optional max calls.

bash
memoh schedule create [options] --bot <bot_id>
OptionDescription
--name <name>Schedule name
--description <desc>Description
--pattern <pattern>Cron pattern (e.g. 0 9 * * * for daily at 9am)
--command <cmd>Command to run in the bot container
--max_calls <n>Max executions (optional, empty for unlimited)
--enabledCreate as enabled
--disabledCreate as disabled

schedule update

Update a schedule.

bash
memoh schedule update <id> [options] --bot <bot_id>
OptionDescription
--name <name>Schedule name
--description <desc>Description
--pattern <pattern>Cron pattern
--command <cmd>Command
--max_calls <n>Max executions
--enabledEnable
--disabledDisable

schedule toggle

Enable or disable a schedule (flip current state).

bash
memoh schedule toggle <id> --bot <bot_id>

schedule delete

Delete a schedule.

bash
memoh schedule delete <id> --bot <bot_id>

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/bot.html b/concepts/bot.html deleted file mode 100644 index c52cff32..00000000 --- a/concepts/bot.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Bot | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Bot

A bot is the primary runtime entity in Memoh.

Each bot has its own:

  • Configuration
  • Container lifecycle
  • Memory scope
  • Channel bindings
  • Model assignments

Key Settings

  • max-load-time (max_context_load_time): how many minutes of recent conversation context are loaded into prompts
  • language: preferred language for interaction (default is auto)
  • chat model / memory model / embedding model: model IDs used by this bot

Why It Matters

The bot abstraction allows Memoh to isolate behavior and resources per agent, while keeping management centralized in one Web UI.

Web UI Path

  • Bots > Select a bot > Settings

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/channel.html b/concepts/channel.html deleted file mode 100644 index fd59e795..00000000 --- a/concepts/channel.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Channel | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Channel

A channel connects a bot to an external communication platform.

Examples include:

  • Telegram
  • Feishu (Lark)
  • Web chat

What a Channel Configuration Defines

  • Platform type and credentials
  • Message routing from external users to a target bot
  • Reply delivery back to the source platform

Why It Matters

Channels decouple bot logic from transport, so one bot can serve users across multiple platforms.

Web UI Path

  • Bots > Select a bot > Channels

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/container.html b/concepts/container.html deleted file mode 100644 index 8258d1eb..00000000 --- a/concepts/container.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Container | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Container

Each bot runs in its own isolated container.

What Isolation Gives You

  • Separate filesystem per bot
  • Separate runtime process space
  • Controlled lifecycle (create/start/stop/delete)

This prevents one bot from interfering with another bot's execution environment.

Why It Matters

Container isolation is the foundation that allows bots to run tools, commands, and file operations safely in parallel.

Web UI Path

  • Bots > Select a bot > Container

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/conversation-and-history.html b/concepts/conversation-and-history.html deleted file mode 100644 index 7bc5a852..00000000 --- a/concepts/conversation-and-history.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Conversation and History | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Conversation and History

Memoh organizes interactions as conversations with preserved history.

What This Includes

  • Ongoing chat context between users and bots
  • Message-level timeline and traceability
  • Source context for memory extraction and debugging

Why It Matters

Conversation history powers:

  • Better response continuity
  • Auditing and troubleshooting
  • Post-hoc analysis of bot behavior

Web UI Path

  • Chat > Select conversation
  • Bots > Select a bot > History

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/index.html b/concepts/index.html deleted file mode 100644 index f5ff25a8..00000000 --- a/concepts/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Concepts Overview | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Concepts Overview

This section explains the core design concepts behind Memoh.

Use these pages when you want to understand how Memoh is designed, why features exist, and how different parts work together.

Concept Map

  • Bot: the core runtime unit
  • Provider and Model: how LLM capability is plugged in
  • Memory: how long-term knowledge is stored and retrieved
  • Channel: how external platforms connect to bots
  • Schedule: how tasks are triggered automatically
  • Container: isolated execution environment per bot
  • MCP: external tool and service integration protocol
  • Subagents: specialized delegated agents
  • Skills: reusable capability prompts/instructions
  • Conversation and History: chat context and traceability
  1. Bot
  2. Provider and Model
  3. Memory
  4. Channel
  5. Container
  6. Schedule
  7. MCP
  8. Subagents
  9. Skills
  10. Conversation and History

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/mcp.html b/concepts/mcp.html deleted file mode 100644 index 3d603504..00000000 --- a/concepts/mcp.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - MCP | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

MCP

MCP (Model Context Protocol) connects Memoh bots to external tool services.

What MCP Adds

  • Standardized tool discovery and invocation
  • Remote capability extension without changing core bot code
  • Per-bot integration flexibility

Memoh supports MCP connections so bots can access external systems through a unified protocol.

Why It Matters

MCP makes capability extension modular. You can add or swap tool backends with minimal coupling.

Web UI Path

  • Bots > Select a bot > MCP

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/memory.html b/concepts/memory.html deleted file mode 100644 index c86d7f2f..00000000 --- a/concepts/memory.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Memory | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Memory

Memory is Memoh's long-term knowledge system for each bot.

How It Works

  • Important facts are extracted from conversations
  • Memories are stored and indexed
  • Relevant memories are retrieved by semantic similarity when needed

Memoh combines vector retrieval with keyword-style retrieval for better recall and precision.

Why It Matters

Memory enables continuity across long timelines, so bots can maintain context beyond short prompt windows.

Web UI Path

  • Bots > Select a bot > Memory

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/provider-and-model.html b/concepts/provider-and-model.html deleted file mode 100644 index 12729f50..00000000 --- a/concepts/provider-and-model.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Provider and Model | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Provider and Model

In Memoh, provider and model are separate but connected concepts:

  • A provider is the LLM service configuration (API endpoint and key)
  • A model is the concrete chat or embedding model under that provider, including its client type which determines which API protocol to use

Client Types

Each model has a client_type that determines how Memoh communicates with the LLM service:

Client TypeDescription
openai-responsesOpenAI Responses API
openai-completionsOpenAI Chat Completions API (also works with compatible services like Ollama, Mistral, etc.)
anthropic-messagesAnthropic Messages API
google-generative-aiGoogle Generative AI API

Typical Setup

At minimum, a production-ready bot usually needs:

  • One chat model for dialog generation
  • One embedding model for memory indexing and retrieval

Model Assignment to Bot

Bots reference model IDs in settings:

  • chat_model_id
  • memory_model_id
  • embedding_model_id

This enables per-bot customization (for quality, latency, or cost).

Web UI Path

  • Models > Add Provider > Select Provider > Add Model
  • Bots > Select a bot > Settings > Choose chat/memory/embedding models

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/schedule.html b/concepts/schedule.html deleted file mode 100644 index c81a977c..00000000 --- a/concepts/schedule.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Schedule | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Schedule

A schedule is a cron-based automation rule that runs bot commands at defined times.

Core Fields

  • pattern: cron expression
  • command: command or task to execute
  • enabled: whether the schedule is active
  • max_calls: optional execution cap
  • current_calls: current run count

Why It Matters

Schedules make bots proactive, not only reactive.
You can automate recurring operations like summaries, reminders, checks, and maintenance tasks.

Web UI Path

  • Not available in current Web UI

Schedule is supported by backend and CLI/API, but there is currently no dedicated schedule page in the Web UI.

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/skills.html b/concepts/skills.html deleted file mode 100644 index 680a9fea..00000000 --- a/concepts/skills.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Skills | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Skills

Skills are reusable capability instructions that guide how a bot (or subagent) solves specific classes of tasks.

Typical Skill Content

  • Scope and purpose
  • Input expectations
  • Execution steps
  • Constraints and output format

Why It Matters

Skills help keep behavior consistent, reduce prompt duplication, and make complex workflows easier to maintain.

Web UI Path

  • Bots > Select a bot > Subagents

Skills are currently primarily managed through agent/workspace configuration and runtime conventions, while subagent-related behavior is visible from the Subagents area.

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/concepts/subagents.html b/concepts/subagents.html deleted file mode 100644 index 9e2fb57d..00000000 --- a/concepts/subagents.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Subagents | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Subagents

Subagents are specialized helper agents that a bot can delegate tasks to.

Core Idea

  • The main bot acts as coordinator
  • Subagents focus on narrower tasks
  • Results are combined back into the main workflow

This supports decomposition of complex requests into smaller, more reliable execution units.

Why It Matters

Subagent architecture improves scalability for multi-step tasks and helps separate responsibilities by role.

Web UI Path

  • Bots > Select a bot > Subagents

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/getting-started.html b/getting-started.html deleted file mode 100644 index 1eacad98..00000000 --- a/getting-started.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - About Memoh | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

About Memoh

What is Memoh?

Memoh is a multi-member, structured long-memory, containerized AI agent system platform. You can create your own AI bots and chat with them via Telegram, Lark (Feishu), and more. Every bot has an independent container and memory system, allowing it to edit files, execute commands, and access the network within its own container — like having its own computer.

Key Features

Multi-Bot Management

Create multiple bots. Humans and bots, or bots with each other, can chat privately, in groups, or collaborate. Build bot teams, or set up accounts for family members to manage daily tasks with bots.

Containerized Isolation

Each bot runs in its own isolated container (powered by Containerd) with a separate filesystem and network. Bots can freely read/write files and execute commands within their containers without interfering with each other.

Memory Engineering

A deeply engineered memory layer inspired by Mem0:

  • Automatically extracts key facts from each conversation turn and stores them as structured memories
  • Supports semantic search (via Qdrant vector database) and keyword retrieval (BM25)
  • Loads the last 24 hours of conversation context by default
  • Automatic memory compaction to keep the memory store lean
  • Multi-language auto-detection

Multi-Platform Support

Unified channel adapter architecture for connecting to multiple messaging platforms:

  • Telegram — Full support with streaming, Markdown, attachments, and replies
  • Lark (Feishu) — Full support
  • Web — Built-in web chat interface
  • CLI — Command-line chat

Agent Capabilities

Bots come with a rich set of built-in tools:

  • Web Search — Brave Search integration for real-time information
  • Subagents — Create specialized subagents, assign skills, and delegate complex tasks
  • Skills — Configurable skill system to extend bot capabilities
  • Container Operations — Read/write files, edit code, and execute commands inside the container
  • Memory Management — Search and manage memories
  • Messaging — Send messages and reactions

Multi-LLM Provider Support

Flexibly switch between a wide range of LLM providers via four client types:

  • OpenAI Responses API, OpenAI Chat Completions API (including compatible services)
  • Anthropic Messages API, Google Generative AI API

MCP Protocol Support

Supports Model Context Protocol (MCP) via HTTP and SSE to connect external tool services. Each bot can have its own independent MCP connections.

Scheduled Tasks

Configure scheduled tasks using cron expressions to automatically run commands at specified times. Supports max execution count limits and manual triggers.

Graphical Configuration

Configure bots, channels, providers, models, MCP, skills, and all other settings through a web management UI — no coding required to set up your own AI bot.

CLI Tool

A command-line tool for bot management, channel configuration, model management, streaming chat, and more — designed for developers who prefer the terminal. See CLI documentation.

Installation

To get Memoh running:

  • Docker — Recommended. One-click or manual setup with Docker Compose. Includes all services (PostgreSQL, Qdrant, Containerd, server, agent, web) — no extra dependencies on the host.
  • config.toml — Reference for all configuration fields.

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/getting-started/bot.html b/getting-started/bot.html new file mode 100644 index 00000000..ebe59454 --- /dev/null +++ b/getting-started/bot.html @@ -0,0 +1,26 @@ + + + + + + Bot Management | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Bot Management

A Bot is an independent AI agent that comes with its own isolated container, persistent memory, and configurable personality. Bots can chat via various messaging platforms (Channels) and perform complex tasks using specialized tools.

Creating a Bot

  1. Navigate to the Bots page from the sidebar.
  2. Click the Create Bot button.
  3. Fill in the basic info:
    • Display Name: The name users will see in group chats.
    • Avatar: A URL for the bot's profile picture.
    • Type: Choose personal (private to owner) or public (accessible to guests).
  4. Click Create.

Bot Detail Page

Once created, clicking on a bot card takes you to its Detail Page, where you can manage its entire lifecycle through several specialized tabs.

Overview Tab

The Overview tab provides a quick health check of the bot's services. It monitors:

  • Container status (running/stopped)
  • Database connectivity
  • Channel configurations
  • Memory system health

If any check shows a warning or error, follow the provided details to troubleshoot.

Configuring the Bot's Brain (Models)

After creating a bot, the most important step is assigning its LLM models. These define how the bot thinks, remembers, and processes information.

  1. Navigate to your bot's Detail Page.
  2. Go to the Settings tab.
  3. In the Model Selection section, you will find three dropdowns:
    • Chat Model: Used for standard conversations with users. Select a high-quality chat model (e.g., GPT-4o).
    • Memory Model: Used for summarizing context and extracting key facts into the bot's long-term memory.
    • Embedding Model: Used to convert text into vector embeddings for semantic search within the memory system. This must be an embedding type model.
  4. Select the models you previously configured in the Models page.
  5. Click Save at the bottom of the form.

Settings Tab Reference

The Settings tab contains all the core parameters that define your bot's behavior and runtime configuration.

FieldDescription
Chat ModelThe main LLM used for generating chat responses.
Memory ModelThe LLM used for summarizing context and managing memories.
Embedding ModelThe model used to generate vector embeddings for semantic memory search.
Search ProviderThe search engine used for web browsing capabilities.
Max Context Load TimeTime limit (seconds) for loading context before generation.
Max Context TokensToken limit for the loaded conversation history.
LanguageThe bot's primary communication language.
Reasoning EnabledIf the selected model supports reasoning (like OpenAI o1), enable this to use its deep thinking capabilities.
Reasoning EffortSet the level of reasoning effort (low, medium, high).
Allow Guest(Public bots only) If enabled, non-registered users can interact with the bot.

Deleting a Bot

To permanently remove a bot and all its associated data (including container files and memory):

  1. Navigate to the Settings tab in the Bot Detail page.
  2. Scroll to the Danger Zone at the bottom.
  3. Click Delete Bot and confirm the action.

Warning: This action is irreversible. All persistent data for this bot will be lost.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/channels.html b/getting-started/channels.html new file mode 100644 index 00000000..2dc0ae9f --- /dev/null +++ b/getting-started/channels.html @@ -0,0 +1,26 @@ + + + + + + Bot Channels | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Bot Channels

Channels connect your Bot to various messaging platforms, allowing you to interact with it using your favorite chat applications.

Concept: Unified Communication

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, and more simultaneously.


Supported Channels

Configure your bot's connections from the Channels tab in the Bot Detail page.

For detailed step-by-step guides on how to create and configure bots for each platform, see:


Configuration Flow

1. Adding a Channel

  1. Click Add Channel.
  2. Select the platform from the list.
  3. Fill in the required credentials and configuration. The fields are dynamic and change based on the selected channel.

2. Common Fields

FieldDescription
CredentialsAPI tokens, secrets, or bot keys provided by the platform.
DisabledQuickly enable or disable a channel without removing its configuration.
RoutingConfigure how messages are mapped between the platform and Memoh.

3. Special Case: Feishu Webhook

If using Feishu in webhook inbound mode:

  1. Memoh will generate a Webhook Callback URL.
  2. Copy this URL and paste it into your Feishu App's event configuration.
  3. This allows Feishu to send messages directly to Memoh.

Operations

  • Save: Update the configuration.
  • Save and Enable: Update and immediately activate the channel.
  • Enable/Disable Toggle: Switch the channel's active status.
  • Delete: Permanently remove a channel's configuration.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/container.html b/getting-started/container.html new file mode 100644 index 00000000..4fafb936 --- /dev/null +++ b/getting-started/container.html @@ -0,0 +1,26 @@ + + + + + + Bot Container Management | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Bot Container Management

Every Bot in Memoh operates within its own isolated container environment. This isolation ensures security, provides a dedicated filesystem, and allows the bot to execute code or commands without affecting other bots or the host system.

Concept: The Isolated Workspace

The container acts as the bot's private "computer." Within it, the bot can:

  • Store and modify files
  • Install software via package managers
  • Execute scripts
  • Maintain state across multiple sessions

Operations

Manage the lifecycle of your bot's environment from the Container tab in the Bot Detail page.

Lifecycle Actions

  • Create: Initialize the container if it doesn't exist (using the configured image).
  • Start: Launch the container. The bot must have a running container to perform many operations like file editing or executing tools.
  • Stop: Gracefully shut down the container to save resources.
  • Delete: Remove the container instance. This will delete the temporary state but preserve the data in persistent volumes.

Container Information

The Container tab displays real-time data about the bot's runtime:

  • Container ID: Unique identifier for the instance.
  • Status: Whether it's currently running, stopped, or creating.
  • Image: The Docker/Containerd image used as the base.
  • Paths: Host and container paths for data persistence.
  • Tasks: Number of active background tasks running in the container.

Snapshots

Snapshots allow you to capture the current state of the bot's container and restore it later. This is useful for:

  • Saving a known good configuration
  • Versioning the bot's environment
  • Testing complex changes safely

Creating a Snapshot

  1. Ensure the container is stopped or in a stable state.
  2. Click Create Snapshot.
  3. Provide a name for the snapshot.

Restoring a Snapshot

  • Find the desired snapshot in the list and click Restore. This will reset the container to the captured state.

Managing Snapshots

  • View a list of existing snapshots with their creation timestamps and parent relationships.
  • Use the Delete button next to a snapshot to remove it.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/create-bot.html b/getting-started/create-bot.html deleted file mode 100644 index 32e59c27..00000000 --- a/getting-started/create-bot.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Create Bot | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Create Bot

Prerequisites

  • Complete the provider and model configuration.

Step 1: Open the Bot Page

Click Bots in the left sidebar to open the Bots configuration page.

Bots page - sidebar

Step 2: create a Bot

Click the New Bot button (with a plus icon)

Create Bot button

In the dialog, fill in:

FieldDescription
NameA display name for this bot (e.g. my-bot, telegram-public-bot)
Avatar URLThe API base Avatar (e.g.https://gravatar.com/avatar/***)
TypeBots type: person, public, public for channel(e.g. telegram group, qq group, discord channel, person for bind user)

Step 3: Bot Configuration

Click one bot Card in Bots page

Bot Configuration

open settings section

setting

select your available Chat Model, Memory Model, Embedding Model and save for basic Configuration

Step 4: Check Bot

Click Chat in the left sidebar to open chat page. then type your prompt to test the Bot configuration

alt text

Next Steps

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/getting-started/email.html b/getting-started/email.html new file mode 100644 index 00000000..ea06959e --- /dev/null +++ b/getting-started/email.html @@ -0,0 +1,26 @@ + + + + + + Email Providers and Bindings | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Email Providers and Bindings

Memoh allows your Bot to send and receive emails, providing another powerful channel for communication and task management.

Concept: Email as a Bot Channel

Connecting email to your Bot involves two steps:

  1. Email Provider: Configure a connection to an email service (like Mailgun or a generic SMTP server).
  2. Email Binding: Link a specific email address from a provider to a Bot.

Email Provider

Manage your email service connections from the Email Provider page in the sidebar.

Creating a Provider

  1. Navigate to the Email Provider page from the sidebar.
  2. Click Add Email Provider.
  3. Choose the provider type:
    • Mailgun: For high-volume delivery.
    • Generic SMTP: For traditional email servers.
  4. Fill in the required fields (e.g., domain, api_key, host, port, username, password).
  5. Click Create.

Bot Email Bindings

Configure your bot's email capabilities from the Email tab in the Bot Detail page.

Adding a Binding

  1. Click Add Binding.
  2. Select the Email Provider you created.
  3. Provide the Email Address to be associated with the bot.
  4. Set the bot's permissions:
    • Can Read: If enabled, the bot can check and process incoming emails.
    • Can Write: If enabled, the bot can compose and send outgoing emails.
    • Can Delete: If enabled, the bot can manage its own email inbox.
  5. Click Create.

Outbox and History

The Email tab also provides an Outbox showing an audit log of all emails sent by the bot:

  • To: The recipient's email address.
  • Subject: The email's subject line.
  • Status: Whether the email was sent successfully.
  • Sent At: The timestamp of the email delivery.

Bot Interaction

  • The bot can use its email permissions to send reports, respond to user inquiries, or trigger actions based on incoming mail.
  • Outgoing emails are tracked in the outbox for monitoring and troubleshooting.
  • The bot handles email in a structured way, allowing it to "converse" via email just as it does via chat.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/files.html b/getting-started/files.html new file mode 100644 index 00000000..2208ed26 --- /dev/null +++ b/getting-started/files.html @@ -0,0 +1,26 @@ + + + + + + Bot Files Management | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Bot Files Management

Every Memoh Bot has its own dedicated filesystem inside its isolated container. You can manage this filesystem directly from the Files tab in the Bot Detail page.


Operations

The FileManager component provides a familiar file-browsing experience with a toolbar, directory tree, and integrated editor.

Browsing and Navigation

  • Breadcrumb Navigation: Quickly move between parent directories.
  • Refresh: Reload the file list to see the latest changes (e.g., files created by the bot).
  • New Folder: Create a directory within the current path.

Managing Files

  • Upload: Select files from your local computer to transfer them into the bot's container.
  • Rename: Click on a file or folder and use the rename action to update its identifier.
  • Delete: Remove files or folders (with recursive support for directories).
  • Download: Retrieve a file from the bot's container back to your local machine.

Viewing and Editing

The integrated FileViewer allows you to interact with the bot's files without leaving the web UI.

Text Files

  • Read/Edit: Click a text file (e.g., .md, .js, .py, .toml) to open it in the built-in Monaco Editor.
  • Syntax Highlighting: Supports common programming languages and configuration formats.
  • Save: Modify the file's content and click Save to apply the changes to the bot's filesystem.

Images

  • Preview: Click an image file (e.g., .png, .jpg, .webp) to see a visual preview directly in the file manager.

Bot Interaction with Files

Remember that the bot itself can also perform these operations:

  • Use its Skills or MCP tools to read, write, and manage its own files.
  • The Files tab is your portal to monitor and manually intervene in the bot's workspace.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/heartbeat.html b/getting-started/heartbeat.html new file mode 100644 index 00000000..f3acdeb2 --- /dev/null +++ b/getting-started/heartbeat.html @@ -0,0 +1,26 @@ + + + + + + Bot Heartbeat | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Bot Heartbeat

The Heartbeat feature allows you to schedule periodic tasks for your Bot, enabling it to perform autonomous actions even when you aren't chatting with it.

Concept: Scheduled Autonomy

A Heartbeat is a recurring trigger that prompts the bot to "think" and execute its skills or tools at a set interval. This is useful for:

  • Periodic status checks
  • Automatic data collection
  • Cleaning up the filesystem
  • Sending scheduled notifications

Configuration

Configure the heartbeat from the Heartbeat tab in the Bot Detail page.

FieldDescription
EnabledToggle the heartbeat on or off.
IntervalHow often (in minutes) the heartbeat should trigger. The default is 30 minutes.
ModelThe LLM used to execute the heartbeat task. This can be different from the main chat model.

Logs and Monitoring

The Heartbeat tab provides a detailed audit log of every execution:

  • Status: Whether the heartbeat completed successfully (ok), encountered an issue (alert), or failed (error).
  • Time: When the heartbeat was triggered.
  • Duration: How long the bot took to process the task.
  • Result: A summary of the bot's action or response during that heartbeat.

Managing Logs

  • Filter by Status: Quickly find errors or alerts.
  • Refresh: Load the latest log entries.
  • Clear Logs: Remove old heartbeat records to keep the interface clean.
  • Load More: View older history.

Bot Interaction

  • During a heartbeat, the bot receives a special system prompt that it should perform its "routine" tasks.
  • The bot can use any of its assigned Skills or MCP tools during a heartbeat.
  • Heartbeat logs provide the "memory" of the bot's autonomous activities.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/mcp.html b/getting-started/mcp.html new file mode 100644 index 00000000..ea7ba4c2 --- /dev/null +++ b/getting-started/mcp.html @@ -0,0 +1,26 @@ + + + + + + MCP Connections | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

MCP Connections

Memoh fully supports the Model Context Protocol (MCP), allowing you to connect your Bot to external tool services and context providers.

Concept: Extending Bot Capabilities

MCP provides a standardized way for bots to access external data sources and tools. Each Bot can have its own independent set of MCP connections.


Connection Types

Configure MCP connections from the MCP tab in the Bot Detail page.

1. Stdio (Local Process)

This type of connection executes a local command on the server and communicates via standard input/output.

FieldDescription
CommandThe executable to run (e.g., npx, python3).
ArgumentsA list of command-line arguments (e.g., -y, @modelcontextprotocol/server-filesystem, /opt/memoh/data).
EnvKey-value pairs for environment variables.
CWDWorking directory for the process.

2. Remote (HTTP/SSE)

This type of connection connects to a remote MCP server over the network.

FieldDescription
URLThe endpoint of the remote MCP server.
HeadersCustom HTTP headers (e.g., for authentication).
TransportChoose between http or sse (Server-Sent Events).

Operations

  • Add Connection: Click Add, choose the type, and fill in the configuration.
  • Import JSON: Use the Import button to quickly add multiple connections from a standard mcpServers JSON config file.
  • Toggle Active: Enable or disable specific connections without deleting them.
  • Search: Quickly find a connection by name or ID.
  • Export: Export a connection configuration to a JSON file.

Bot Interaction

Once an MCP connection is active, the bot will automatically:

  • Discover the tools and resources exposed by the MCP server.
  • Use these tools to perform tasks requested by the user.
  • Include the context provided by the MCP server in its reasoning process.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/memory.html b/getting-started/memory.html new file mode 100644 index 00000000..6d4b7261 --- /dev/null +++ b/getting-started/memory.html @@ -0,0 +1,26 @@ + + + + + + Bot Memory Management | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Bot Memory Management

Memoh's structured long-term memory system allows Bots to remember information across multiple conversations, providing contextually relevant and personalized interactions.

Memories are stored in a Qdrant vector database. When a user asks a question, Memoh performs a semantic search to find the most relevant "memories" and includes them in the bot's system prompt.


Operations

Manage your bot's memories from the Memory tab in the Bot Detail page.

1. Creating Memories

  • New Memory: Manually enter a memory's content in the provided textarea.
  • From Conversation: Select specific messages from the bot's conversation history to "extract" into memory.

2. Searching and Managing

  • Search: Filter memories by ID or text content.
  • Edit: Modify existing memory entries directly in the list.
  • Delete: Remove memories that are no longer needed.

Memory Compression (Compact)

Over time, memories can accumulate and become redundant. The Compact feature helps optimize the memory pool.

  • Ratio: Set the compression ratio (e.g., 0.8, 0.5, 0.3) to determine how much information is retained.
  • Decay Days: Optionally specify a time window to only compact memories older than a certain number of days.

Visualization: Vector Manifold

The Memory tab includes advanced visual tools to help you understand how the memory system is performing:

Top-K Bucket Chart

Shows the distribution of relevant memories retrieved for the most recent queries.

CDF Curve (Cumulative Distribution Function)

Visualizes the scoring threshold of retrieved memories, helping you fine-tune how much "relevant" information the bot should consider.


Bot Interaction

  • The bot will automatically search for and retrieve memories during every interaction.
  • The Memory Model configured in the Settings tab is used for extracting and summarizing these memories.
  • Memories provide the "long-term knowledge" that makes each bot unique to its owner.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/platform-telegram.html b/getting-started/platform-telegram.html deleted file mode 100644 index 70cc14c3..00000000 --- a/getting-started/platform-telegram.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - Configure Telegram Channel | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Configure Telegram Channel

This guide walks you through connecting your bot to Telegram, allowing users to chat with your bot via Telegram messages.

Prerequisites

Step 1: Create a Telegram Bot

Open Telegram and search for the official bot @BotFather.

Send the /newbot command to BotFather and follow the prompts:

  1. Enter a name for your bot (display name, e.g., My Memoh Bot)
  2. Enter a username for your bot (must end with bot, e.g., my_memoh_bot)

BotFather will create the bot and provide a Bot Token (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz).

Save this token securely — you will need it in the next step.

Step 2: Open the Bot Platforms Page

In the Memoh Web UI, click Bots in the left sidebar to open the Bots page.

Select the bot you want to connect to Telegram.

Click the Platforms tab to open the channel configuration page.

Step 3: Add Telegram Channel

Click the Add Channel button.

In the dialog, select Telegram as the channel type.

Fill in the configuration:

FieldDescription
Bot TokenThe token from BotFather (e.g., 123456789:ABCdefGHIjklMNOpqrsTUVwxyz)

Click Save to add the channel.

Add Channel button

Step 4: Bind Your Telegram Account

Open the Memoh web ui setting page, find Bind Code section, select telegram platform and necessary TTL(seconds), Generate bind code.

Bind Code

Open the bot dialog in telegram, send Bind Code to chat, you should get Binding successful! Your identity has been linked. message if successful

Click Save to complete the binding.

Step 6: Test the Connection

Send a message to your bot on Telegram:

  • For public bots: Add the bot to a group, have others mention your bot when sending messages.
  • For person bots: Send a direct message (requires binding in Step 5)

The bot should respond according to its configured model and system prompt.

Next Steps

  • Configure Memory to enable long-term memory for your bot
  • Set up Skills to extend your bot's capabilities
  • Add Schedules for automated tasks

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/getting-started/provider-and-model.html b/getting-started/provider-and-model.html index 00b2cf25..bfa8e003 100644 --- a/getting-started/provider-and-model.html +++ b/getting-started/provider-and-model.html @@ -3,24 +3,24 @@ - Configure Provider and Model | Memoh Documentation + LLM Provider and Model | Memoh Documentation - + - + - + -
Skip to content

Configure Provider and Model

Before creating bots, you need to configure at least one LLM provider and add chat and embedding models. This guide walks you through the Web UI.

Prerequisites

Step 1: Open the Models Page

Click Models in the left sidebar to open the Provider and Model configuration page.

Models page - sidebar

The page has two panels:

  • Left: Provider list and search
  • Right: Selected provider's details and models (or an empty state if none selected)

Step 2: Add a Provider

Click the Add Provider button (with a plus icon) at the bottom of the left panel.

Add Provider button

In the dialog, fill in:

FieldDescription
NameA display name for this provider (e.g. my-openai, ollama-local)
API KeyYour API key. For local services like Ollama, you can use a placeholder like ollama
Base URLThe API base URL (e.g. https://api.openai.com/v1, http://localhost:11434/v1 for Ollama)

Add Provider dialog

Example — OpenAI:

  • Name: openai
  • API Key: sk-...
  • Base URL: https://api.openai.com/v1

Example — Ollama (local):

  • Name: ollama
  • API Key: ollama
  • Base URL: http://localhost:11434/v1

Click Add to save. The new provider appears in the left sidebar.

Step 3: Add Models

Select a provider from the left panel. The right panel shows the provider form and the model list.

Provider selected - model list

Click Add Model to open the model creation dialog.

Fill in:

FieldDescription
Client TypeAPI protocol: openai-responses, openai-completions, anthropic-messages, or google-generative-ai
Typechat or embedding
ModelModel ID (e.g. gpt-4, llama3.2, text-embedding-3-small)
Display NameOptional display name
DimensionsRequired for embedding models (e.g. 1536 for OpenAI embeddings)
MultimodalFor chat models only — enable if the model supports images

You need at least:

  • One chat model (for conversation)
  • One embedding model (for memory)

Add them under the same or different providers. For example:

  • Chat: gpt-4 with client type openai-responses (OpenAI) or llama3.2 with client type openai-completions (Ollama)
  • Embedding: text-embedding-3-small with client type openai-completions (OpenAI) or nomic-embed-text with client type openai-completions (Ollama)

Step 4: Edit or Delete

  • Provider: After selecting a provider, you can edit Name, API Key, and Base URL in the right panel, or delete the provider.
  • Model: Use the edit or delete actions on each model card in the list.

Next Steps

Once you have at least one chat model and one embedding model, you can create a bot (via Bots in the sidebar) and assign these models in the bot settings.

Published under AGPLv3

- +
Skip to content

LLM Provider and Model

To use Memoh, you first need to configure at least one LLM Provider and at least one Model.

LLM Provider

An LLM Provider represents a connection to an AI service (like OpenAI, Anthropic, or a self-hosted compatible API). It stores the base URL and authentication credentials.

Creating a Provider

  1. Navigate to the Models page from the sidebar.
  2. Click the Add Provider button at the bottom of the sidebar.
  3. Fill in the following fields:
    • Name: A display name for this provider (e.g., "OpenAI").
    • Base URL: The root URL of the API (e.g., https://api.openai.com/v1).
    • API Key: Your authentication token for the service.
  4. Click Create.

Managing Providers

  • Edit: Select a provider from the list and use the form on the right to update its name, URL, or API key.
  • Delete: Use the Delete Provider button in the provider settings form.

Model

A Model is a specific AI instance (like gpt-4o or text-embedding-3-small) that belongs to a Provider. Memoh distinguishes between Chat models (for conversation) and Embedding models (for memory search).

Adding a Model

  1. Select a Provider from the list on the Models page.
  2. Click Add Model in the model list section.
  3. Configure the following fields:
FieldRequiredDescription
TypeYeschat for conversation, embedding for vector search.
Model IDYesThe exact identifier used by the provider (e.g., gpt-4o).
NameNoA friendly display name (defaults to Model ID).
Client TypeYes (Chat)The API protocol: openai-responses, openai-completions, anthropic-messages, or google-generative-ai.
Input ModalitiesYes (Chat)Capabilities supported: text (default), image, audio, video, file.
Supports ReasoningNoEnable if the model supports internal reasoning steps (e.g., OpenAI o1).
DimensionsYes (Embed)The vector size for embedding models (e.g., 1536).
  1. Click Create.

Managing Models

  • Edit: Click the edit icon next to a model in the list.
  • Delete: Click the trash icon next to a model to remove it.

Next Steps

Now that you have configured your models, you can proceed to Create and Configure a Bot.

Published under AGPLv3

+ \ No newline at end of file diff --git a/getting-started/schedule.html b/getting-started/schedule.html new file mode 100644 index 00000000..32e37b4f --- /dev/null +++ b/getting-started/schedule.html @@ -0,0 +1,39 @@ + + + + + + Scheduled Tasks | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Scheduled Tasks

Scheduled Tasks allow you to automate recurring bot actions using cron expressions. This is useful for sending periodic reports, checking external data, performing maintenance, or triggering any routine task without manual intervention.

Concept: Cron-Based Automation

A Schedule is a cron-triggered rule bound to a specific bot. When a schedule fires, it sends a command to the agent, which executes it using its available tools, skills, and context. The bot can then deliver results to any connected channel.


Schedule Fields

FieldDescription
NameA display name for the task (e.g., "Morning News Summary").
DescriptionA brief explanation of what the task does.
PatternA cron expression that defines when the task runs (e.g., 0 9 * * * for daily at 9:00 AM).
CommandThe natural-language instruction sent to the agent when the schedule triggers (e.g., "Summarize today's top tech news and send it to the Telegram channel").
EnabledWhether the schedule is currently active.
Max CallsOptional limit on the total number of executions. Leave empty for unlimited.
Current CallsThe number of times this schedule has already fired.

Cron Pattern Reference

The pattern field uses standard cron syntax with five fields:

┌───────────── minute (0–59)
+│ ┌───────────── hour (0–23)
+│ │ ┌───────────── day of month (1–31)
+│ │ │ ┌───────────── month (1–12)
+│ │ │ │ ┌───────────── day of week (0–6, Sun=0)
+│ │ │ │ │
+* * * * *

Common examples:

PatternMeaning
0 9 * * *Every day at 9:00 AM
*/30 * * * *Every 30 minutes
0 0 * * 1Every Monday at midnight
0 8,20 * * *Every day at 8:00 AM and 8:00 PM
0 0 1 * *First day of every month at midnight

Viewing Schedules

  1. Navigate to the Bot Detail Page.
  2. Select the Schedule tab.
  3. The list shows all schedules for this bot, including their name, cron pattern, enabled status, and execution counts.
  4. Click Refresh to reload the list.

Creating Schedules

Schedules are primarily created in two ways:

Via the Bot (Conversational)

The bot itself has access to a schedule tool. You can ask the bot to create a schedule in natural language:

"Create a schedule called 'Daily Digest' that runs every day at 8 AM and sends me a summary of my unread emails."

The bot will translate this into a cron expression and register the schedule automatically.

Via the API

You can also create schedules programmatically using the REST API:

POST /api/bots/{bot_id}/schedule
json
{
+  "name": "Daily Digest",
+  "description": "Summarize unread emails every morning",
+  "pattern": "0 8 * * *",
+  "command": "Summarize my unread emails and send the result to Telegram.",
+  "enabled": true,
+  "max_calls": null
+}

Execution Flow

When a schedule fires:

  1. The cron service triggers the schedule.
  2. The current_calls counter is incremented.
  3. If max_calls is set and reached, the schedule is automatically disabled.
  4. The agent receives the command along with the schedule context.
  5. The agent executes the command using its tools (e.g., web search, file read, send message).
  6. Results can be delivered to any connected channel.

Schedule vs. Heartbeat

FeatureScheduleHeartbeat
TriggerCron expression (flexible timing)Fixed interval (minutes)
CommandCustom natural-language instructionGeneric "routine check" prompt
Max CallsOptional execution limitUnlimited
Use CaseSpecific recurring tasksPeriodic autonomous thinking

Both features complement each other: use Heartbeat for general-purpose periodic activity and Schedule for precise, task-oriented automation.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/search-provider.html b/getting-started/search-provider.html new file mode 100644 index 00000000..7c6f5c7c --- /dev/null +++ b/getting-started/search-provider.html @@ -0,0 +1,26 @@ + + + + + + Search Providers | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Search Providers

Memoh allows you to connect your Bot to various search engines, enabling it to browse the web for real-time information and external knowledge.

Concept: Real-Time Knowledge

A Search Provider is a connection to a specific search API (like Brave, Google, or Bing). Once configured, it becomes a tool that your Bot can use during conversation.


Supported Search Engines

Configure your search engines from the Search Provider page in the sidebar.

Supported EnginesNotes
BraveHighly recommended for privacy and performance.
BingPowerful global search capability.
GoogleComprehensive web search.
TavilyDesigned specifically for AI-powered research.
SearxNGConnect to your own self-hosted search aggregator.
DuckDuckGoPrivacy-focused search.
Other ProvidersSogou, Serper, Jina, Exa, Bocha, Yandex.

Configuration Flow

1. Adding a Search Provider

  1. Navigate to the Search Provider page from the sidebar.
  2. Click Add Search Provider.
  3. Fill in the following:
    • Name: A friendly name (e.g., "My Brave Search").
    • API Key: Your credentials for the specific search engine API.
    • Other Parameters: Depending on the engine, you may need to specify additional settings (e.g., base_url for SearxNG).

2. Managing Providers

  • Edit: Select a provider from the sidebar and update its configuration in the form on the right.
  • Delete: Use the Delete Provider button in the provider settings form.

Assigning a Search Provider to a Bot

  1. Navigate to the Bots page and select your bot.
  2. Go to the Settings tab.
  3. Find the Search Provider dropdown and select the provider you created.
  4. Click Save.

Bot Interaction

  • When a user's question requires real-time information, the bot will automatically call its assigned Search Provider.
  • The bot will process the search results to provide a grounded and accurate response.
  • Multiple search results can be synthesized to provide a comprehensive answer.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/skills.html b/getting-started/skills.html new file mode 100644 index 00000000..2288bd3c --- /dev/null +++ b/getting-started/skills.html @@ -0,0 +1,33 @@ + + + + + + Bot Skills | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Bot Skills

Skills are the "personality" and "capabilities" of a Memoh Bot. They define how the bot should behave and what tools it can use.

Concept: Skills as Markdown

A Skill is represented as a Markdown document with YAML frontmatter. These files are stored within the bot's container and parsed into tools and personality traits.

Example Skill Structure

yaml
---
+name: coder-skill
+description: Enables advanced coding capabilities and tool use.
+---
+
+# Coder Skill
+As a coder, you always follow best practices and write clean, documented code. 
+You can use the `edit_file` and `run_command` tools to assist the user.

Managing Skills

Manage your bot's skill set from the Skills tab in the Bot Detail page.

Adding a Skill

  1. Click Add Skill.
  2. A dialog with a basic template will open in the Monaco Editor.
  3. Fill in the name, description, and content.
  4. Click Save.

Editing and Deleting

  • Edit: Click the pencil icon next to a skill card to modify its content or frontmatter.
  • Delete: Click the trash icon to remove a skill from the bot's container.

How Bots Use Skills

  • Skills are injected into the bot's system prompt during conversation.
  • The YAML frontmatter helps the system categorize and manage the skills as tools.
  • Modular skills allow you to easily "swap" behaviors or capabilities without rewriting the entire bot.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/getting-started/subagents.html b/getting-started/subagents.html new file mode 100644 index 00000000..0212c050 --- /dev/null +++ b/getting-started/subagents.html @@ -0,0 +1,26 @@ + + + + + + Bot Subagents | Memoh Documentation + + + + + + + + + + + + + + + +
Skip to content

Bot Subagents

Subagents are specialized AI entities with their own independent conversation context. They are managed by the main Bot to delegate complex tasks or focus on specific domains.

Concept: Task Specialization

A Subagent is like a specialized teammate for your Bot. While the main Bot handles general conversation, it can spin up and communicate with a Subagent to perform deep analysis, research, or execution.


Fields

Configure Subagents from the Subagents tab in the Bot Detail page.

FieldDescription
NameThe identifier for the subagent (e.g., "Research Assistant").
DescriptionA brief explanation of the subagent's purpose and role.
SkillsA list of specific Skills assigned from the bot's container.
MessagesThe conversation history and context specific to this subagent.
UsageStatistics on token consumption and activity.

Operations

  • Add Subagent: Create a new entity by providing a name and description.
  • Edit: Update the name or description of an existing subagent.
  • Delete: Permanently remove a subagent and its independent context.
  • View Context: Open a dialog to inspect the subagent's conversation history and usage metrics.

Bot Interaction

  • The main Bot uses the Subagent Tool to create, communicate with, and receive results from subagents.
  • Subagents inherit the main bot's container permissions but operate with their own "mental workspace."
  • This modular approach allows for building multi-agent systems within a single Bot's scope.

Published under AGPLv3

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index b54a63b8..26b4a200 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"blogs_2026-02-16.md":"CVgn4GCU","blogs_index.md":"DyCOc_Zm","cli_auth.md":"C8ws3CHD","cli_bot.md":"BnhEB6FG","cli_channel.md":"BBEJiWrG","cli_chat.md":"Cr9VFV7R","cli_config.md":"B8bSu8j2","cli_index.md":"CZsWbIpX","cli_model.md":"DjdZHTvQ","cli_provider.md":"D1oztYQ9","cli_schedule.md":"D2s8Q1KC","concepts_bot.md":"C_C3siLW","concepts_channel.md":"DdS-uyu8","concepts_container.md":"Djausou_","concepts_conversation-and-history.md":"BS_PnG4v","concepts_index.md":"Ci6EwNPX","concepts_mcp.md":"B9KnE-R7","concepts_memory.md":"BgBEcLnX","concepts_provider-and-model.md":"DQq3j0ql","concepts_schedule.md":"COs_2DXO","concepts_skills.md":"HeUi2diL","concepts_subagents.md":"C0_bz0wW","getting-started.md":"C9lgqnN0","getting-started_create-bot.md":"Da6WTI-u","getting-started_platform-telegram.md":"BlTohjMj","getting-started_provider-and-model.md":"hf8EhYPV","index.md":"BXBUN2vU","installation_config-toml.md":"BasYU7hp","installation_docker.md":"Ce3JA8xc","troubleshooting.md":"rkMlAGoL","zh_concepts_identity-and-binding.md":"B6I6pSqI","zh_concepts_index.md":"uaZIblvt","zh_index.md":"DbGu2QT1","zh_style_terminology.md":"C89A7q1C"} +{"about.md":"Ce_QDK5Z","blogs_2026-02-16.md":"CVgn4GCU","blogs_index.md":"DyCOc_Zm","channels_discord.md":"DBWQl28b","channels_feishu.md":"-Rc8F8IG","channels_index.md":"Cd1GuQFE","channels_telegram.md":"URjBaQHx","getting-started_bot.md":"CflRB8ov","getting-started_channels.md":"DiSUpicV","getting-started_container.md":"CiSK-fMx","getting-started_email.md":"CKJOqdzG","getting-started_files.md":"Cl6keVS-","getting-started_heartbeat.md":"CgIS9a7z","getting-started_mcp.md":"DyRwe04F","getting-started_memory.md":"DhIuIiDU","getting-started_provider-and-model.md":"BGpLYgEh","getting-started_schedule.md":"B0pL41RB","getting-started_search-provider.md":"CWTVwyy0","getting-started_skills.md":"EnvAtRea","getting-started_subagents.md":"B79V3Ppa","index.md":"7vMrZCVa","installation_docker.md":"BA7jSLuf","zh_concepts_identity-and-binding.md":"B6I6pSqI","zh_concepts_index.md":"uaZIblvt","zh_index.md":"DbGu2QT1","zh_style_terminology.md":"C89A7q1C"} diff --git a/index.html b/index.html index 35fd2bb1..5f2bcbaf 100644 --- a/index.html +++ b/index.html @@ -9,18 +9,18 @@ - + - + - + -
Skip to content

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Lark (Feishu), Web, or CLI. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.

Documentation

Published under AGPLv3

- +
Skip to content

Memoh Documentation

Memoh(/ˈmemoʊ/) is a multi-member, structured long-memory, containerized AI agent system. Create your own AI bots, chat with them via Telegram, Lark (Feishu), Web, or CLI. Each bot runs in an isolated container with its own memory system — able to edit files, run commands, and access the network.

Documentation

Published under AGPLv3

+ \ No newline at end of file diff --git a/installation/config-toml.html b/installation/config-toml.html deleted file mode 100644 index 8256ede8..00000000 --- a/installation/config-toml.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - config.toml Reference | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

config.toml Reference

Memoh uses a TOML configuration file (config.toml) in the project root. For Docker deployments, copy the template first: cp conf/app.docker.toml config.toml. See Docker installation for details.

Full Example

toml
[log]
-level = "info"
-format = "text"
-
-[server]
-addr = ":8080"
-
-[admin]
-username = "admin"
-password = "change-your-password"
-email = "admin@example.com"
-
-[auth]
-jwt_secret = "your-secret-from-openssl-rand-base64-32"
-jwt_expires_in = "168h"
-
-[containerd]
-socket_path = "/run/containerd/containerd.sock"
-namespace = "default"
-
-[mcp]
-# registry = "memoh.cn"  # Uncomment for China mainland mirror
-image = "memohai/mcp:latest"
-snapshotter = "overlayfs"
-data_root = "data"
-
-[postgres]
-host = "127.0.0.1"
-port = 5432
-user = "memoh"
-password = "your-password"
-database = "memoh"
-sslmode = "disable"
-
-[qdrant]
-base_url = "http://127.0.0.1:6334"
-api_key = ""
-collection = "memory"
-timeout_seconds = 10
-
-[agent_gateway]
-host = "127.0.0.1"
-port = 8081
-server_addr = ":8080"
-
-[web]
-host = "127.0.0.1"
-port = 8082

Section Reference

[log]

FieldTypeDefaultDescription
levelstring"info"Log level: debug, info, warn, error
formatstring"text"Log format: text or json

[server]

FieldTypeDefaultDescription
addrstring":8080"HTTP listen address. Use :8080 for all interfaces, or host:port (e.g. server:8080 in Docker).

[admin]

FieldTypeDefaultDescription
usernamestring"admin"Admin login username
passwordstringAdmin login password. Change in production.
emailstringAdmin email (for display)

[auth]

FieldTypeDefaultDescription
jwt_secretstringSecret for signing JWT tokens. Required. Generate with openssl rand -base64 32.
jwt_expires_instring"24h"JWT expiration, e.g. "24h", "168h" (7 days)

[containerd]

FieldTypeDefaultDescription
socket_pathstring"/run/containerd/containerd.sock"Path to containerd socket
namespacestring"default"Containerd namespace for bot containers

[mcp]

MCP (Model Context Protocol) container configuration. Each bot runs in a container built from this image.

FieldTypeDefaultDescription
registrystring""Image registry mirror prefix. Set to "memoh.cn" for China mainland. When set, the final image ref becomes registry/image.
imagestring"memohai/mcp:latest"MCP container image. Short Docker Hub names are auto-normalized for containerd (e.g. memohai/mcp:latestdocker.io/memohai/mcp:latest).
snapshotterstring"overlayfs"Containerd snapshotter
data_rootstring"data"Host path for bot data (Docker: /opt/memoh/data)
cni_bin_dirstring"/opt/cni/bin"CNI plugin binary directory
cni_conf_dirstring"/etc/cni/net.d"CNI configuration directory

[postgres]

FieldTypeDefaultDescription
hoststring"127.0.0.1"PostgreSQL host
portint5432PostgreSQL port
userstring"memoh"Database user
passwordstringDatabase password
databasestring"memoh"Database name
sslmodestring"disable"SSL mode: disable, require, verify-ca, verify-full

[qdrant]

FieldTypeDefaultDescription
base_urlstring"http://127.0.0.1:6334"Qdrant HTTP API URL
api_keystring""Optional API key for Qdrant Cloud
collectionstring"memory"Vector collection name for memories
timeout_secondsint10Request timeout in seconds

[agent_gateway]

FieldTypeDefaultDescription
hoststring"127.0.0.1"Agent gateway bind host. In Docker, use "agent" (service name).
portint8081Agent gateway port
server_addrstring":8080"Address the agent uses to reach the main server. In Docker, use "server:8080".

[web]

FieldTypeDefaultDescription
hoststring"127.0.0.1"Web UI bind host
portint8082Web UI port

Web search providers (Brave, Bing, Google, Tavily, Serper, SearXNG, Jina, Exa, Bocha, DuckDuckGo, Yandex, Sogou) are configured through the web UI under Search Providers, not in config.toml.

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/installation/docker.html b/installation/docker.html index a729e131..e3aefb92 100644 --- a/installation/docker.html +++ b/installation/docker.html @@ -9,27 +9,33 @@ - + - + - + -
Skip to content

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, Qdrant, the main server (with embedded Containerd), agent gateway, and web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, China mirror)
  3. Clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Pull images and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Manual Install

bash
git clone https://github.com/memohai/Memoh.git
+    
Skip to content

Docker Installation

Docker is the recommended way to run Memoh. The stack includes PostgreSQL, Qdrant, the main server (with embedded Containerd), agent gateway, and web UI — all orchestrated via Docker Compose. You do not need to install containerd, nerdctl, or buildkit on your host; everything runs inside containers.

Prerequisites

Run the official install script (requires Docker and Docker Compose):

bash
curl -fsSL https://memoh.sh | sudo sh

The script will:

  1. Check for Docker and Docker Compose
  2. Prompt for configuration (workspace, data directory, admin credentials, JWT secret, Postgres password, China mirror)
  3. Clone the repository
  4. Generate config.toml from the Docker template with your settings
  5. Write a .env file with POSTGRES_PASSWORD and MEMOH_CONFIG
  6. Pull images and start all services

Silent install (use all defaults, no prompts):

bash
curl -fsSL https://memoh.sh | sudo sh -s -- -y

Defaults when running silently:

  • Workspace: ~/memoh
  • Data directory: ~/memoh/data
  • Admin: admin / admin123
  • JWT secret: auto-generated
  • Postgres password: memoh123

Manual Install

bash
git clone --depth 1 https://github.com/memohai/Memoh.git
 cd Memoh
-cp conf/app.docker.toml config.toml

Edit config.toml — at minimum change:

  • admin.password — Admin password
  • auth.jwt_secret — Generate with openssl rand -base64 32
  • postgres.password — Database password (also set POSTGRES_PASSWORD env var to match)

Then start:

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose up -d

On macOS or if your user is in the docker group, sudo is not required.

Important: docker-compose.yml mounts ./config.toml by default. You must create this file before starting — running without it will fail.

China Mainland Mirror

For users in mainland China who cannot access Docker Hub directly, uncomment the registry line in config.toml:

toml
[mcp]
-registry = "memoh.cn"

And use the China mirror compose overlay:

bash
sudo docker compose -f docker-compose.yml -f docker/docker-compose.cn.yml up -d

The install script handles this automatically when you answer "yes" to the China mirror prompt.

Access Points

After startup:

ServiceURL
Web UIhttp://localhost:8082
APIhttp://localhost:8080
Agent Gatewayhttp://localhost:8081

Default login: admin / admin123 (change this in config.toml).

First startup may take 1–2 minutes while images are pulled and services initialize.

Common Commands

Prefix with sudo on Linux if your user is not in the docker group.

bash
docker compose up -d           # Start
+cp conf/app.docker.toml config.toml

Edit config.toml — at minimum change:

  • admin.password — Admin password
  • auth.jwt_secret — Generate with openssl rand -base64 32
  • postgres.password — Database password (must match the POSTGRES_PASSWORD env var)

Then start:

bash
sudo POSTGRES_PASSWORD=your-db-password docker compose up -d

Alternatively, create a .env file in the project root:

env
POSTGRES_PASSWORD=your-db-password
+MEMOH_CONFIG=./config.toml

Then simply run:

bash
sudo docker compose up -d

On macOS or if your user is in the docker group, sudo is not required.

Important: docker-compose.yml mounts ${MEMOH_CONFIG:-./config.toml} into the containers. You must create this file before starting — running without it will fail.

China Mainland Mirror

For users in mainland China who cannot access Docker Hub directly, uncomment the registry line in config.toml:

toml
[mcp]
+registry = "memoh.cn"

And use the China mirror compose overlay:

bash
sudo docker compose -f docker-compose.yml -f docker/docker-compose.cn.yml up -d

The install script handles this automatically when you answer "yes" to the China mirror prompt.

Service Architecture

Docker Compose starts the following services:

ServiceImageDescription
postgrespostgres:18-alpinePostgreSQL database
qdrantqdrant/qdrant:latestQdrant vector database for memory semantic search
migratememohai/server:latestOne-shot service — runs database migrations, then exits
servermemohai/server:latestMain backend with embedded Containerd (privileged)
agentmemohai/agent:latestAgent Gateway (Bun/Elysia) for AI chat, tool execution, and SSE streaming
webmemohai/web:latestWeb UI (Vue 3 + Nginx)

Startup order: postgres and qdrant start first; once healthy, migrate runs database migrations; after migration completes, server starts; finally agent and web come up.

Access Points

After startup:

ServiceURL
Web UIhttp://localhost:8082
APIhttp://localhost:8080
Agent Gatewayhttp://localhost:8081

Default login: admin / admin123 (change this in config.toml).

First startup may take 1–2 minutes while images are pulled and services initialize.

Data Persistence

All persistent data is stored in Docker named volumes:

VolumeDescription
postgres_dataPostgreSQL database files
qdrant_dataQdrant vector storage
containerd_dataContainerd image store and snapshots
memoh_dataBot container data (mounted at /opt/memoh/data inside the server)
server_cni_stateCNI network state for container networking

These volumes survive docker compose down. To fully reset all data, run:

bash
docker compose down -v

Common Commands

Prefix with sudo on Linux if your user is not in the docker group.

bash
docker compose up -d           # Start
 docker compose down            # Stop
 docker compose logs -f         # View logs
+docker compose logs server     # View a specific service's logs
 docker compose ps              # Status
-docker compose pull && docker compose up -d  # Update to latest images

Production Checklist

  1. Passwords — Change all default passwords and secrets in config.toml
  2. HTTPS — Configure SSL (e.g. via docker-compose.override.yml with certs or a reverse proxy)
  3. Firewall — Restrict access to necessary ports
  4. Resource limits — Set memory/CPU limits for containers
  5. Backups — Regular backups of Postgres and Qdrant data

Troubleshooting

bash
docker compose logs server      # View main service logs
-docker compose config           # Validate configuration
-docker compose build --no-cache && docker compose up -d  # Full rebuild

Security Warnings

  • The main service runs with privileged container access — only run in trusted environments
  • You must change all default passwords and secrets before production use
  • Use HTTPS in production

Published under AGPLv3

- +docker compose pull && docker compose up -d # Update to latest images

Upgrading

To upgrade to the latest version:

bash
cd /path/to/Memoh
+git pull
+docker compose pull
+docker compose up -d

The migrate service runs automatically on every startup, applying any new database migrations.

Environment Variables

VariableDefaultDescription
POSTGRES_PASSWORDmemoh123PostgreSQL password (must match postgres.password in config.toml)
MEMOH_CONFIG./config.tomlPath to the configuration file

Production Checklist

  1. Passwords — Change all default passwords and secrets in config.toml
  2. HTTPS — Configure SSL (e.g. via docker-compose.override.yml with certs or a reverse proxy)
  3. Firewall — Restrict access to necessary ports
  4. Resource limits — Set memory/CPU limits for containers
  5. Backups — Regular backups of Postgres and Qdrant data volumes

Troubleshooting

bash
docker compose logs server      # View main service logs
+docker compose logs migrate     # Check if migrations succeeded
+docker compose config           # Validate compose configuration
+docker compose down && docker compose up -d  # Full restart

Security Warnings

  • The main service runs with privileged container access (required for embedded Containerd) — only run in trusted environments
  • You must change all default passwords and secrets before production use
  • Use HTTPS in production

Published under AGPLv3

+ \ No newline at end of file diff --git a/troubleshooting.html b/troubleshooting.html deleted file mode 100644 index 3ff4bddd..00000000 --- a/troubleshooting.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Troubleshooting | Memoh Documentation - - - - - - - - - - - - - - - -
Skip to content

Troubleshooting

MCP Container: no running task found: task mcp-xxx not found

Symptom

When a bot tries to use container tools (e.g., execute commands), the server logs show:

level=WARN msg="exec failed" provider=container_tool bot_id=xxx command=date error="no running task found: task mcp-xxx not found"

The containerd container logs may also show:

level=error msg="failed to delete task" error="rpc error: code = NotFound desc = container not created: not found"

Cause

The [mcp] data_root in config.toml is set to a host machine path (e.g., /Users/you/Code/Memoh/data), but the server and containerd containers use a Docker named volume mounted at /opt/memoh/data.

When the server creates an MCP container inside containerd, it uses data_root as the mount source. Since this host path does not exist inside the containerd container, runc fails with:

failed to fulfil mount request: open /Users/you/Code/Memoh/data/bots/xxx: no such file or directory

Solution

  1. Set data_root to the in-container path in your config:
toml
[mcp]
-data_root = "/opt/memoh/data"
  1. Clean up the stale containerd container (if it exists):
bash
docker exec memoh-containerd ctr -n default containers rm mcp-<bot-id>
  1. Restart the server:
bash
docker compose restart server

Note: If you also run the server locally (outside Docker), keep the Docker config (conf/app.docker.toml) separate from your local config.toml, and update docker-compose.yml to mount the Docker-specific config instead.

MCP Container: Image update not taking effect after rebuild

Symptom

After updating Dockerfile.containerd (e.g., adding Node.js/Python to the MCP image), rebuilding and restarting the containerd container, MCP tools still fail with errors like:

exec: "npx": executable file not found in $PATH

Cause

The containerd entrypoint script (containerd-entrypoint.sh) skips image import if the image already exists in containerd's image store:

sh
if ! ctr -n default images check "name==${MCP_IMAGE}" ...; then
-  # import
-fi

Since containerd_data is a persistent Docker volume, the old MCP image survives across container restarts. The new image embedded in the rebuilt Docker image is never imported.

Solution

  1. Remove the old MCP image from containerd:
bash
docker exec memoh-containerd ctr -n default images rm docker.io/library/memoh-mcp:latest
  1. Restart the containerd container to trigger re-import:
bash
docker compose restart containerd
  1. Verify the new image was imported (size should be significantly larger if Node.js/Python were added):
bash
docker exec memoh-containerd ctr -n default images ls
  1. Delete the bot's MCP container and recreate it from the bot detail page so it uses the new image.

Published under AGPLv3

- - - - \ No newline at end of file diff --git a/zh/concepts/identity-and-binding.html b/zh/concepts/identity-and-binding.html index 6b9f366a..ed31bf75 100644 --- a/zh/concepts/identity-and-binding.html +++ b/zh/concepts/identity-and-binding.html @@ -9,9 +9,9 @@ - + - + @@ -20,7 +20,7 @@
Skip to content

账号模型与绑定

账号模型

Memoh 将平台账号与系统账号视为两类不同实体:

  • 平台账号(ChannelIdentity 是用户在外部接入平台上的账号(例如飞书账号),不是 Memoh 内部账号。
  • 系统账号(User 是 Memoh 系统内账号。

平台账号在初始阶段可以不绑定系统账号。
bind 的职责是完成这两类账号的关联。

接入平台与 Bot

  • 接入平台(channel 是入站消息来源。
  • Bot 是系统内的授权与资源边界。

Bot 由系统账号管理,入站消息由平台账号产生。

为什么账号绑定是账号作用域

账号绑定的目标是建立账号归属关系,而不是直接发放 bot 资源权限:

  • 它只负责平台账号与系统账号的绑定;
  • 不把账号绑定与成员管理语义耦合在一起;
  • 让 bot 访问控制保持独立、可演进。

账号绑定流程(当前共识)

  1. 用户以自己的系统账号申请 bind code;
  2. 平台账号在支持的接入平台会话中发送 code;
  3. 系统校验 code,完成平台账号到系统账号的绑定;
  4. bot 成员与授权由独立流程处理。

Bot 类型语义

  • Public bot:支持成员协作语义。
  • Personal bot:语义上应为单 owner,不应依赖成员机制。

注:本文档记录的是产品语义与共识方向。
部分运行时细节仍可能处于收敛阶段。

Published under AGPLv3

- + \ No newline at end of file diff --git a/zh/concepts/index.html b/zh/concepts/index.html index 42ff0b93..c2f3d7f9 100644 --- a/zh/concepts/index.html +++ b/zh/concepts/index.html @@ -9,9 +9,9 @@ - + - + @@ -20,7 +20,7 @@
Skip to content

核心概念

本章节用于定义 Memoh 的核心账号与访问概念。

概念图

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 系统内账号(例如用户的飞书账号)。
  • Bot:由系统账号管理的资源与访问边界。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。

为什么重要

Memoh 需要同时处理外部接入平台消息与系统内权限控制。
因此我们明确区分平台账号与系统账号,并将 bot 授权与账号绑定解耦。

术语说明:文档中的“平台账号”统一指用户在对应平台上的真实账号(如飞书账号),不指本项目内部账号。

本章内容

Published under AGPLv3

- + \ No newline at end of file diff --git a/zh/index.html b/zh/index.html index a27d439c..eeb97efa 100644 --- a/zh/index.html +++ b/zh/index.html @@ -9,9 +9,9 @@ - + - + @@ -20,7 +20,7 @@
Skip to content

Memoh 文档

Memoh 是一个多成员、长记忆、容器化的 AI Agent 系统。

文档章节

面向文档贡献者

当前维护范围

当前文档先聚焦账号语义与访问控制:

  • 区分系统账号与平台账号
  • 解释为什么账号绑定是账号作用域
  • 说明账号绑定与 bot 访问控制之间的关系

说明:“平台账号”指用户在外部平台上的真实账号(例如飞书账号),不是 Memoh 系统账号。

Published under AGPLv3

- + \ No newline at end of file diff --git a/zh/style/terminology.html b/zh/style/terminology.html index 93b5f912..b67b7712 100644 --- a/zh/style/terminology.html +++ b/zh/style/terminology.html @@ -9,9 +9,9 @@ - + - + @@ -20,7 +20,7 @@
Skip to content

术语规范

适用对象:文档编写者与维护者。 本页用于统一写作语义,不是面向最终用户的功能说明。

规范术语

  • 系统账号(User:Memoh 系统内账号。
  • 平台账号(ChannelIdentity:用户在外部接入平台上的账号,不是 Memoh 内账号。
  • 接入平台(channel:承载入站消息的外部平台。
  • 账号绑定(bind:把平台账号关联到系统账号的过程。
  • 绑定码(Bind Code):用于账号绑定的一次性代码。
  • Bot:由系统账号管理的资源与授权边界。

推荐写法

  • 面向产品语义时,优先写 “平台账号”,不要直接写 actor。
  • 描述业务行为时,优先写 “接入平台”,不要直接写 channel。
  • 首次出现保留技术别名,后续可只用中文术语:
    • 平台账号(ChannelIdentity
    • 系统账号(User
    • 账号绑定(bind

禁用或不推荐写法

  • 在概念文档中直接使用 actor(除非明确引用代码符号)。
  • 使用含糊表述如 “平台用户”(未区分系统账号与平台账号)。
  • 写出“平台账号是 Memoh 内部账号”这类错误语义。

示例

  • 正确:“平台账号是用户在飞书上的账号,不是 Memoh 系统账号。”
  • 正确:“账号绑定用于把平台账号关联到系统账号。”
  • 错误:“Actor 是 Memoh 里的用户。”

自检清单

  • 是否明确区分了系统账号与平台账号?
  • 叙述中是否将 channel 表述为接入平台?
  • 是否仅在首处保留技术别名?

Published under AGPLv3

- + \ No newline at end of file