Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,3 @@ TAVILY_API_KEY=your-tavily-api-key

# LangSmith tracing (optional)
LANGSMITH_API_KEY=your-langsmith-api-key

# Supabase (required when LEON_STORAGE_STRATEGY=supabase)
LEON_STORAGE_STRATEGY=supabase
SUPABASE_PUBLIC_URL=https://supabase.mycel.nextmind.space

# SUPABASE_INTERNAL_URL: direct server-side URL (bypasses public proxy).
# Production (same-host): SUPABASE_INTERNAL_URL=http://<internal-host>:8000
# Local dev (SSH tunnel): SUPABASE_INTERNAL_URL=http://localhost:18000
SUPABASE_INTERNAL_URL=http://localhost:18000

SUPABASE_ANON_KEY=your-anon-key
LEON_SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
SUPABASE_JWT_SECRET=your-jwt-secret

# DB schema: staging for local dev and staging envs; omit for production (defaults to public)
LEON_DB_SCHEMA=staging
39 changes: 39 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Publish to PyPI

on:
push:
tags:
- 'v*'
workflow_dispatch:

jobs:
build-and-publish:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install build dependencies
run: |
python -m pip install --upgrade pip
pip install build twine

- name: Build package
run: python -m build

- name: Check package
run: twine check dist/*

- name: Publish to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: twine upload dist/*
6 changes: 1 addition & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ frontend/app/.env.development
.claude/.stfolder/
.claude/.vscode/
.claude/settings.local.json
.claude/mcp.json
.mcp.json
teams

# User-level Leon config and skills
Expand Down Expand Up @@ -94,7 +92,6 @@ worktrees/
/*.png
/*.yml
/*.yaml
!docker-compose.yml
/dogfood-output/
/current-chat.yaml
/.claude/skills/
Expand All @@ -106,6 +103,5 @@ frontend/.vite/
.playwright-cli/
ops

# Auto-generated
.lark-events/
.playwright-mcp/
/supabase/
27 changes: 14 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<img src="./assets/banner.png" alt="Mycel Banner" width="600">

**Link: connecting people, agents, and teams for the next era of human-AI collaboration**
**Production-ready agent runtime for building, running, and governing collaborative AI teams**

🇬🇧 English | [🇨🇳 中文](README.zh.md)

Expand All @@ -15,16 +15,16 @@

---

Mycel gives your agents a **body** (portable identity & sandbox), **mind** (shareable templates), **memory** (persistent context), and **social life** (a native messaging layer where humans and agents coexist as equals). It's the platform layer for human-AI teams that actually work together.
Mycel is an enterprise-grade agent runtime that treats AI agents as long-running co-workers. Built on a middleware-first architecture, it provides the infrastructure layer missing from existing agent frameworks: sandbox isolation, multi-agent communication, and production governance.

## Why Mycel?

Existing frameworks help you *build* agents. Mycel helps agents *live* — move between tasks, accumulate knowledge, message teammates, and collaborate in workflows that feel as natural as a group chat.
Existing agent frameworks focus on *building* agents. Mycel focuses on *running* them in production:

- **Body** — Agents get a portable identity with sandbox isolation. Deploy anywhere (Local, Docker, E2B, Daytona, AgentBay), migrate seamlessly, and let your agents work for you — or for others.
- **Mind** — A template marketplace for agent personas and skills. Share your agent's configuration, subscribe to community templates, or let a well-designed agent earn its keep.
- **Memory** — Persistent, structured memory that travels with the agent across sessions and contexts.
- **Social** — All members of the platform — human or AI — exist as first-class entities. Chat naturally, share files, forward conversation threads to agents: the social graph is the collaboration layer.
- **Middleware Pipeline**: Unified tool injection, validation, security, and observability
- **Sandbox Isolation**: Run agents in Docker/E2B/cloud with automatic state management
- **Multi-Agent Communication**: Agents discover, message, and collaborate with each other — and with humans
- **Production Governance**: Built-in security controls, audit logging, and cost tracking

## Quick Start

Expand Down Expand Up @@ -59,7 +59,7 @@ uv sync --extra e2b # E2B
uv sync --extra daytona # Daytona
```

Docker sandbox works out of the box (just needs Docker installed). See [Sandbox docs](docs/en/sandbox.mdx) for provider setup.
Docker sandbox works out of the box (just needs Docker installed). See [Sandbox docs](docs/en/sandbox.md) for provider setup.

### 3. Start the services

Expand Down Expand Up @@ -170,11 +170,12 @@ Agents can be extended with external tools and specialized expertise:

## Documentation

- [Configuration](docs/en/configuration.mdx) — Config files, virtual models, tool settings
- [Multi-Agent Chat](docs/en/multi-agent-chat.mdx) — Entity-Chat system, agent communication
- [Sandbox](docs/en/sandbox.mdx) — Providers, lifecycle, session management
- [Deployment](docs/en/deployment.mdx) — Production deployment guide
- [Concepts](docs/en/concepts.mdx) — Core abstractions (Thread, Member, Task, Resource)
- [CLI Reference](docs/en/cli.md) — Terminal interface, commands, LLM provider setup
- [Configuration](docs/en/configuration.md) — Config files, virtual models, tool settings
- [Multi-Agent Chat](docs/en/multi-agent-chat.md) — Entity-Chat system, agent communication
- [Sandbox](docs/en/sandbox.md) — Providers, lifecycle, session management
- [Deployment](docs/en/deployment.md) — Production deployment guide
- [Concepts](docs/en/product-primitives.md) — Core abstractions (Thread, Member, Task, Resource)

## Contact Us

Expand Down
27 changes: 14 additions & 13 deletions README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<img src="./assets/banner.png" alt="Mycel Banner" width="600">

**Link:连接人与 Agent,构建下一代人机协同**
**企业级 Agent 运行时,构建、运行和治理协作 AI 团队**

[🇬🇧 English](README.md) | 🇨🇳 中文

Expand All @@ -15,16 +15,16 @@

---

Mycel 让你的 Agent 拥有**身体**(可迁移的身份与沙箱)、**思想**(可共享的模板市场)、**记忆**(跨会话的持久上下文)和**社交**(人与 Agent 平等共存的原生消息层)。这是真正意义上的人机协同平台
Mycel 是企业级 Agent 运行时,将 AI Agent 视为长期运行的协作伙伴。基于中间件优先架构,提供现有 Agent 框架缺失的基础设施层:沙箱隔离、多 Agent 通讯和生产治理

## 为什么选择 Mycel?

现有框架帮你*构建* Agent,Mycel 让 Agent 真正*活着*——在任务间自由迁移、积累知识、给队友发消息,用像群聊一样自然的方式协作。
现有 Agent 框架专注于*构建* Agent,Mycel 专注于在生产环境*运行*它们:

- **身体** — Agent 拥有可迁移的身份和沙箱隔离。支持 Local / Docker / E2B / Daytona / AgentBay,随时迁移,让你的 Agent 为你工作,也能为别人打工。
- **思想** — Agent 模板市场:分享你的 Agent 配置,订阅社区模板,让设计精良的 Agent 产生真实价值。
- **记忆** — 持久结构化记忆,跟随 Agent 跨会话、跨上下文流转。
- **社交** — 平台上所有成员——无论是人还是 AI——都是一等公民实体。像微信一样自然地聊天、发文件、把聊天记录分享给 Agent:社交图谱就是协作层。
- **中间件管线**:统一的工具注入、校验、安全和可观测性
- **沙箱隔离**:在 Docker/E2B/云端运行 Agent,自动状态管理
- **多 Agent 通讯**:Agent 之间互相发现、发送消息、自主协作——人类也参与其中
- **生产治理**:内置安全控制、审计日志和成本追踪

## 快速开始

Expand Down Expand Up @@ -59,7 +59,7 @@ uv sync --extra e2b # E2B
uv sync --extra daytona # Daytona
```

Docker 沙箱开箱即用(只需安装 Docker)。详见[沙箱文档](docs/zh/sandbox.mdx)。
Docker 沙箱开箱即用(只需安装 Docker)。详见[沙箱文档](docs/zh/sandbox.md)。

### 3. 启动服务

Expand Down Expand Up @@ -170,11 +170,12 @@ Agent 可通过外部工具和专业技能进行扩展:

## 文档

- [配置指南](docs/zh/configuration.mdx) — 配置文件、虚拟模型、工具设置
- [多 Agent 通讯](docs/zh/multi-agent-chat.mdx) — Entity-Chat 系统、Agent 间通讯
- [沙箱](docs/zh/sandbox.mdx) — 提供商、生命周期、会话管理
- [部署](docs/zh/deployment.mdx) — 生产部署指南
- [核心概念](docs/zh/concepts.mdx) — 核心抽象(Thread、Member、Task、Resource)
- [CLI 参考](docs/zh/cli.md) — 终端界面、命令、LLM 提供商配置
- [配置指南](docs/zh/configuration.md) — 配置文件、虚拟模型、工具设置
- [多 Agent 通讯](docs/zh/multi-agent-chat.md) — Entity-Chat 系统、Agent 间通讯
- [沙箱](docs/zh/sandbox.md) — 提供商、生命周期、会话管理
- [部署](docs/zh/deployment.md) — 生产部署指南
- [核心概念](docs/zh/product-primitives.md) — 核心抽象(Thread、Member、Task、Resource)

## 联系我们

Expand Down
12 changes: 6 additions & 6 deletions backend/taskboard/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ def _get_thread_id(self) -> str:
# Handlers (async — ToolRunner awaits coroutines)
# ------------------------------------------------------------------

async def _list_tasks(self, Status: str = "", Priority: str = "") -> str:
async def _list_tasks(self, Status: str = "", Priority: str = "") -> str: # noqa: N803
try:
tasks = await asyncio.to_thread(task_service.list_tasks)
except Exception as e:
Expand All @@ -231,7 +231,7 @@ async def _list_tasks(self, Status: str = "", Priority: str = "") -> str:

return json.dumps({"tasks": tasks, "total": len(tasks)}, ensure_ascii=False)

async def _claim_task(self, TaskId: str) -> str:
async def _claim_task(self, TaskId: str) -> str: # noqa: N803
thread_id = self._get_thread_id()
now_ms = int(time.time() * 1000)
try:
Expand All @@ -249,7 +249,7 @@ async def _claim_task(self, TaskId: str) -> str:
return json.dumps({"error": f"Task not found: {TaskId}"})
return json.dumps({"task": updated}, ensure_ascii=False)

async def _update_progress(self, TaskId: str, Progress: int, Note: str = "") -> str:
async def _update_progress(self, TaskId: str, Progress: int, Note: str = "") -> str: # noqa: N803
update_kwargs: dict[str, Any] = {"progress": Progress}

if Note:
Expand All @@ -272,7 +272,7 @@ async def _update_progress(self, TaskId: str, Progress: int, Note: str = "") ->
return json.dumps({"error": f"Task not found: {TaskId}"})
return json.dumps({"task": updated}, ensure_ascii=False)

async def _complete_task(self, TaskId: str, Result: str) -> str:
async def _complete_task(self, TaskId: str, Result: str) -> str: # noqa: N803
now_ms = int(time.time() * 1000)
try:
updated = await asyncio.to_thread(
Expand All @@ -290,7 +290,7 @@ async def _complete_task(self, TaskId: str, Result: str) -> str:
return json.dumps({"error": f"Task not found: {TaskId}"})
return json.dumps({"task": updated}, ensure_ascii=False)

async def _fail_task(self, TaskId: str, Reason: str) -> str:
async def _fail_task(self, TaskId: str, Reason: str) -> str: # noqa: N803
now_ms = int(time.time() * 1000)
try:
updated = await asyncio.to_thread(
Expand All @@ -307,7 +307,7 @@ async def _fail_task(self, TaskId: str, Reason: str) -> str:
return json.dumps({"error": f"Task not found: {TaskId}"})
return json.dumps({"task": updated}, ensure_ascii=False)

async def _create_task(self, Title: str, Description: str = "", Priority: str = "medium") -> str:
async def _create_task(self, Title: str, Description: str = "", Priority: str = "medium") -> str: # noqa: N803
try:
task = await asyncio.to_thread(
task_service.create_task,
Expand Down
Loading
Loading