[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80847":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":16,"starSnapshotCount":16,"syncStatus":13,"lastSyncTime":30,"discoverSource":31},80847,"syll","THU-SAGE\u002Fsyll","THU-SAGE","[New] Syll is a self-hosted companion runtime with a web UI, chat channels, proactive rituals, editable markdown skills, recorded workflows, and a desktop ghost.","https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002F",null,"Python",263,2,36,1,0,151,178,227,453,1.43,"MIT License",false,"main",true,[],"2026-06-12 02:04:07","\u003Cdiv align=\"center\">\n  \u003Cimg src=\"docs\u002F0_1.jpeg\" alt=\"a small ghost holding a dark rectangle, looking downward\" width=\"260\">\n\n  \u003Ch1>Syll\u003C\u002Fh1>\n\n  \u003Cp>\n    \u003Cem>a small, self-hosted AI companion\u003Cbr\u002F>\n    who sits at the edge of your screen and quietly tends\u003Cbr\u002F>\n    the things you almost forgot\u003C\u002Fem>\n  \u003C\u002Fp>\n\n  \u003Cp>\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fversion-0.2.0-blue\" alt=\"Version\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fstatus-alpha-orange\" alt=\"Status: alpha\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-≥3.11-blue\" alt=\"Python\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-green\" alt=\"License\">\n  \u003C\u002Fp>\n\n  \u003Cp>\n    \u003Cstrong>Syll is a self-hosted companion runtime with a web UI, chat channels, proactive rituals, editable markdown skills, recorded workflows, and a desktop ghost.\u003C\u002Fstrong>\n  \u003C\u002Fp>\n\n  \u003Cp>\n    \u003Ca href=\"https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002F\">\u003Cstrong>Project page →\u003C\u002Fstrong>\u003C\u002Fa>\n    &nbsp;·&nbsp;\n    \u003Ca href=\"#quick-start\">Quick start\u003C\u002Fa>\n    &nbsp;·&nbsp;\n    \u003Ca href=\"#demo-workbench\">Demos\u003C\u002Fa>\n    &nbsp;·&nbsp;\n    \u003Ca href=\"docs\u002Flore.md\">The Full Story · 故事\u003C\u002Fa>\n    &nbsp;·&nbsp;\n    \u003Ca href=\"https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fresearch.html\">Research\u003C\u002Fa>\n    &nbsp;·&nbsp;\n    \u003Ca href=\"docs\u002Freport\u002Fsyll-report-v1.pdf\">Paper\u003C\u002Fa>\n  \u003C\u002Fp>\n\u003C\u002Fdiv>\n\n---\n\n## Feature news\n\n- **MCP servers are now first-class tools.** Configure stdio, SSE, and streamable-HTTP MCP servers from the Pet UI; Syll loads them into the agent as namespaced `mcp__server__tool` tools before the first message.\n- **Safer MCP activation flow.** Local stdio servers require a command preview + hash confirmation before anything launches, while env\u002Fheader secrets stay masked in MCP responses and out of `\u002Fapi\u002Fv1\u002Fconfig`.\n- **Creative MCP templates included.** The public build ships Playwright, Stagehand, Blender, and Godot template suggestions; Blender uses `uvx blender-mcp`, and Godot pins GoPeak MCP for reproducible local game-scene automation.\n- **Static asset refresh polish.** The web app now cache-busts bundled JS\u002FCSS assets so UI changes reach the browser without stale `app.js` surprises after the next restart.\n\n---\n\n\n## Quick start\n\nSyll works with any Python 3.11+ environment. Pick either main path, then run the shared install steps.\n\n### Option A — conda\n\n```bash\nconda create -n syll python=3.11 -y\nconda activate syll\n```\n\n### Option B — venv\n\n```bash\npython -m venv .venv\nsource .venv\u002Fbin\u002Factivate          # Windows: .venv\\Scripts\\activate\n```\n\n### Install and wake\n\n```bash\npython -m pip install -U pip\npython -m pip install syll\n\nsyll onboard\nsyll wake\n```\n\nOpen `http:\u002F\u002Flocalhost:18790`, click the **Pet** tab, give your ghost a name (or keep *Syll*), and start a conversation.\n\n> [!NOTE]\n> The package, CLI, and import path are all `syll`. **Syll is the default persona** inside the companion you just installed; rename her to anything via the Pet tab at any time without touching code.\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>uv fast path\u003C\u002Fb>\u003C\u002Fsummary>\n\n```bash\nuv venv\nsource .venv\u002Fbin\u002Factivate\nuv pip install syll\nsyll onboard\nsyll wake\n```\n\n\u003C\u002Fdetails>\n\n### Configure a model\n\nSet your LLM credentials in `~\u002F.syll\u002Fconfig.json`, or finish setup from the web UI after `syll wake`:\n\n```json\n{\n  \"models\": {\n    \"chat\": {\n      \"model\": \"openrouter\u002Fopenai\u002Fgpt-4o-mini\",\n      \"api_key\": \"YOUR_API_KEY\"\n    }\n  }\n}\n```\n\nGet keys: [OpenRouter](https:\u002F\u002Fopenrouter.ai\u002Fkeys) · [OpenAI](https:\u002F\u002Fplatform.openai.com) · [Anthropic](https:\u002F\u002Fconsole.anthropic.com). Local models via vLLM \u002F Ollama are also supported — see [docs\u002Freferences\u002Flocal-models.md](docs\u002Freferences\u002Flocal-models.md).\n\n### Troubleshooting\n\n- **`syll onboard` says \"Config already exists\"** — answer `N` unless you intentionally want to replace your current `~\u002F.syll\u002Fconfig.json` and workspace.\n- **`syll` runs from the wrong environment** — prefer `python -m pip install syll`, then check `which python`, `python -m pip -V`, and `which syll` point at the same environment.\n- **`SYLL__*` env vars are not picked up** — use the `SYLL__SECTION__FIELD=value` shape, export the variable in your shell, and restart Syll.\n\n\n---\n\n## Visual tour\n\nClick any card to watch the short MP4.\n\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd width=\"50%\" align=\"center\">\n      \u003Ca href=\"docs\u002Fmedia\u002Ftour\u002F01-config-setup.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Ftour\u002F01-config-setup.jpg\" alt=\"Configuration setup\" width=\"100%\">\u003C\u002Fa>\u003Cbr>\n      \u003Cb>1. Configuration\u003C\u002Fb>\u003Cbr>\n      \u003Csub>Set models, channels, identity, and runtime options from the browser.\u003C\u002Fsub>\n    \u003C\u002Ftd>\n    \u003Ctd width=\"50%\" align=\"center\">\n      \u003Ca href=\"docs\u002Fmedia\u002Ftour\u002F02-gui-click-calibration.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Ftour\u002F02-gui-click-calibration.jpg\" alt=\"GUI click calibration\" width=\"100%\">\u003C\u002Fa>\u003Cbr>\n      \u003Cb>2. GUI calibration\u003C\u002Fb>\u003Cbr>\n      \u003Csub>Inspect screenshots, calibrate coordinates, and make desktop actions reproducible.\u003C\u002Fsub>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd width=\"50%\" align=\"center\">\n      \u003Ca href=\"docs\u002Fmedia\u002Ftour\u002F03-skill-editor.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Ftour\u002F03-skill-editor.jpg\" alt=\"Skill editor\" width=\"100%\">\u003C\u002Fa>\u003Cbr>\n      \u003Cb>3. Skill editor\u003C\u002Fb>\u003Cbr>\n      \u003Csub>Edit markdown skills in the web UI and publish reusable procedures.\u003C\u002Fsub>\n    \u003C\u002Ftd>\n    \u003Ctd width=\"50%\" align=\"center\">\n      \u003Ca href=\"docs\u002Fmedia\u002Ftour\u002F04-leading-mode.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Ftour\u002F04-leading-mode.jpg\" alt=\"Syll leading mode\" width=\"100%\">\u003C\u002Fa>\u003Cbr>\n      \u003Cb>4. Leading mode\u003C\u002Fb>\u003Cbr>\n      \u003Csub>Let Syll guide an interactive task while the desktop ghost stays present.\u003C\u002Fsub>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd width=\"50%\" align=\"center\">\n      \u003Ca href=\"docs\u002Fmedia\u002Ftour\u002F05-schedule-setup.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Ftour\u002F05-schedule-setup.jpg\" alt=\"Scheduled task setup\" width=\"100%\">\u003C\u002Fa>\u003Cbr>\n      \u003Cb>5. Scheduling\u003C\u002Fb>\u003Cbr>\n      \u003Csub>Install rituals or schedule your own recurring jobs and workflow replays.\u003C\u002Fsub>\n    \u003C\u002Ftd>\n    \u003Ctd width=\"50%\" align=\"center\">\n      \u003Ca href=\"docs\u002Fmedia\u002Ftour\u002F06-web-chat.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Ftour\u002F06-web-chat.jpg\" alt=\"Web chat interface\" width=\"100%\">\u003C\u002Fa>\u003Cbr>\n      \u003Cb>6. Web chat\u003C\u002Fb>\u003Cbr>\n      \u003Csub>Chat locally from the browser while watching runtime state and logs.\u003C\u002Fsub>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd width=\"50%\" align=\"center\">\n      \u003Ca href=\"docs\u002Fmedia\u002Ftour\u002F07-persona-memory.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Ftour\u002F07-persona-memory.jpg\" alt=\"Persona and memory workspace\" width=\"100%\">\u003C\u002Fa>\u003Cbr>\n      \u003Cb>7. Persona & memory\u003C\u002Fb>\u003Cbr>\n      \u003Csub>Shape the companion persona and maintain layered memory notes.\u003C\u002Fsub>\n    \u003C\u002Ftd>\n    \u003Ctd width=\"50%\" align=\"center\">\n      \u003Ca href=\"docs\u002Fmedia\u002Ftour\u002F08-demo-recording.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Ftour\u002F08-demo-recording.jpg\" alt=\"User demonstration recording\" width=\"100%\">\u003C\u002Fa>\u003Cbr>\n      \u003Cb>8. Demo recording\u003C\u002Fb>\u003Cbr>\n      \u003Csub>Capture a live desktop routine into video and editable step traces.\u003C\u002Fsub>\n    \u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n---\n\n## What Syll can do\n\n**She finds files you can't find.**\nAsk her from your phone to grab the weekly report from your desktop. She walks your filesystem, renders thumbnails, shows you the candidates, and hands you the one you pick.\n\n**She keeps soft watch over unfinished things.**\nThe draft you open and close without writing anything. The photo folder from three years ago. She notices. She doesn't nag.\n\n**She reaches out sometimes.**\nMorning light, evening winding down, a Tuesday afternoon when a memory drifts back. Not every time. Only when it would feel real. You control the cadence.\n\n**She can live on your phone instead of your desk.**\nPair her with Feishu, Telegram, Discord, or WhatsApp and she'll come with you.\n\n**She teaches herself new tricks.**\nGive her a markdown skill (`SKILL.md`) and she loads it when the moment calls for it. Capture a GUI workflow once in the Demo tab, clean it up, and she can replay or schedule it later.\n\n**She comes with a visual workbench, not just a terminal.**\nModels, channels, schedule rules, identity, skills, and recorded workflows all have a browser surface now — so ordinary users can configure her without living in a CLI.\n\n**She remembers in layers.**\nThe Memory tab surfaces long-term notes, today's journal, daily fragments, and an activity heatmap so her recollection feels like a notebook instead of a raw log dump.\n\n**She can stay at the edge of your desktop.**\nThe optional desktop ghost mirrors her state, reacts to wake\u002Fsleep transitions, and gives the companion a physical place to live between chats.\n\n---\n\n## Meet her three ways\n\n| If you want… | Go here |\n|---|---|\n| For a softer intro | [The project page →](https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002F) |\n| To read the code or contribute | This repo (`syll\u002F` directory) |\n| To cite the design or understand the architecture | [The research page →](https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fresearch.html) |\n\n---\n\n## Channels\n\n| Channel | Status | Setup difficulty |\n|---|---|---|\n| **Web UI** | ✓ | none — just `syll wake` |\n| **CLI** | ✓ | none — `syll agent -m \"hi\"` |\n| **Telegram** | ✓ | easy — one bot token |\n| **Feishu** | ✓ | medium — app_id + app_secret, supports file send |\n| **Discord** | ✓ | easy — bot token + intents |\n| **WhatsApp** | ✓ | medium — QR scan (text only) |\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Telegram setup\u003C\u002Fb>\u003C\u002Fsummary>\n\n1. Open Telegram, search `@BotFather`, send `\u002Fnewbot`, follow prompts, copy the token.\n2. Configure `~\u002F.syll\u002Fconfig.json`:\n\n```json\n{\n  \"channels\": {\n    \"telegram\": {\n      \"enabled\": true,\n      \"token\": \"YOUR_BOT_TOKEN\",\n      \"allow_from\": [\"YOUR_USER_ID\"]\n    }\n  }\n}\n```\n\n3. Run `syll wake`.\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Feishu setup\u003C\u002Fb>\u003C\u002Fsummary>\n\n1. Create an app at [open.feishu.cn](https:\u002F\u002Fopen.feishu.cn), enable bot capability, enable **long-connection** websocket event subscription, and grant `im:message`, `im:message.p2p_msg`, and `im:resource` permissions.\n2. Configure `~\u002F.syll\u002Fconfig.json`:\n\n```json\n{\n  \"channels\": {\n    \"feishu\": {\n      \"enabled\": true,\n      \"app_id\": \"cli_xxx\",\n      \"app_secret\": \"xxx\"\n    }\n  }\n}\n```\n\n3. Run `syll wake`. No public IP needed — WebSocket long-connection handles inbound events.\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Discord \u002F WhatsApp setup\u003C\u002Fb>\u003C\u002Fsummary>\n\nSee [`docs\u002Freferences\u002Fchannels.md`](docs\u002Freferences\u002Fchannels.md) for full setup steps.\n\n\u003C\u002Fdetails>\n\n---\n\n## Proactive rituals\n\nLet Syll reach out to you on her own schedule. **Pet tab** → set a `Chat ID` for your primary channel → **Save** → click **Install default rituals**. Four jobs land in the scheduler:\n\n- `ritual:morning-light` — 9am daily, one soft greeting\n- `ritual:evening-wind-down` — 10pm daily, a small closing thought\n- `ritual:surfacing-memory` — Tue\u002FFri 3pm, maybe a drifting memory\n- `ritual:week-close` — Sunday 9pm, a week marker\n\nSilence is always a valid response. She only speaks when it would feel real.\n\nFull details: [`syll\u002Ftemplates\u002Fworkspace\u002Flore\u002Frituals.md`](syll\u002Ftemplates\u002Fworkspace\u002Flore\u002Frituals.md).\n\nThe same scheduler can also run **GUI skills** and **recorded workflows** from the web UI — useful for recurring check-ins, daily collection jobs, or replaying a polished browser routine on a timer.\n\n---\n\n## Skills\n\nSkills are markdown files that teach Syll how to do a specific thing. Built-in skills live in [`syll\u002Fskills\u002F`](syll\u002Fskills\u002F); custom skills go in `~\u002F.syll\u002Fworkspace\u002Fskills\u002F{name}\u002FSKILL.md`.\n\nA skill can be:\n\n- **Progressive** — listed in the prompt summary, loaded when needed\n- **Always-on** — marked `always: true` in metadata, inlined into every system prompt\n\nBundled skills: `file-retrieval` (find → preview → attach), `github`, `weather`, `tmux`, `cron`, `summarize`, `skill-creator`, `gui-agent`.\n\nWrite your own: [`syll\u002Fskills\u002Fskill-creator\u002FSKILL.md`](syll\u002Fskills\u002Fskill-creator\u002FSKILL.md).\n\nRecorded workflows are the sister surface to markdown skills: capture a task once, inspect the video + trajectory, edit coordinates \u002F timestamps \u002F notes in the Demo tab, then publish it into the reusable library for replay or scheduling.\n\n---\n\n## Demo workbench\n\nOpen the **Demo** tab to move from one-off capture to reusable automation:\n\n- capture a live desktop session into video + step trajectory\n- scrub the recording on a timeline and preview exact keyframes\n- merge, duplicate, delete, or relabel steps before publishing\n- import the cleaned flow as a reusable recorded workflow\n- schedule the same workflow later from the **Schedule** tab\n\nThis is the layer that turns a personal \"watch me do it once\" demo into something Syll can execute again on demand.\n\nAppend `?cinema` to the project page URL for recording-friendly playback.\n\n### Demo videos\n\nThe public demo set lives under `docs\u002Fmedia\u002Fdemo\u002F`, so the same web-ready files back both GitHub Pages and the README.\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fmedia\u002Fdemo\u002Fdemo-1-recorded-workflow.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Fdemo\u002Fdemo-1-recorded-workflow.jpg\" alt=\"Recorded workflow studio demo poster\" width=\"31%\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fmedia\u002Fdemo\u002Fdemo-2-morning-ritual.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Fdemo\u002Fdemo-2-morning-ritual.jpg\" alt=\"Morning ritual briefing demo poster\" width=\"31%\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fmedia\u002Fdemo\u002Fdemo-3-phone-file-return.mp4\">\u003Cimg src=\"docs\u002Fmedia\u002Fdemo\u002Fdemo-3-phone-file-return.jpg\" alt=\"Phone-to-desktop file return demo poster\" width=\"31%\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n- **Recorded workflow studio** — capture a desktop routine, inspect the timeline, clean the step trace, and publish it as a reusable workflow. [Research note](https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fresearch.html#demo-recorded-workflow) · [Watch MP4](https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fmedia\u002Fdemo\u002Fdemo-1-recorded-workflow.mp4)\n- **Morning ritual briefing** — a scheduled ritual wakes up, gathers context, and delivers a voice-ready daily update. [Research note](https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fresearch.html#demo-morning-ritual) · [Watch MP4](https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fmedia\u002Fdemo\u002Fdemo-2-morning-ritual.mp4)\n- **Phone-to-desktop file return** — ask from chat for a presentation, confirm the match, and receive the file back without going back to the desktop. [Research note](https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fresearch.html#demo-phone-file-return) · [Watch MP4](https:\u002F\u002Fthu-sage.github.io\u002Fsyll\u002Fmedia\u002Fdemo\u002Fdemo-3-phone-file-return.mp4)\n\n---\n\n## Memory workspace\n\nThe **Memory** tab is organized like a working notebook instead of a raw event dump:\n\n- long-term memory lives beside today's notes and daily fragments\n- an activity heatmap makes cadence visible at a glance\n- browser editing keeps memory maintenance inside the same web surface as chat, rituals, and workflow editing\n\nThe goal is not perfect recall. It is a calmer surface for noticing what keeps returning.\n\n---\n\n## Desktop ghost\n\nSyll ships with a small desktop mascot — a frameless, always-on-top window that sits at the edge of your screen and reacts to what she is doing. She has five states — `idle`, `working`, `sleeping`, `error`, `listening` — and each state can be mapped to an SVG in `state_svg_map`. The window is a PyQt6 shell hosting an embedded Chromium view ([`syll\u002Fdesktop\u002Fghost.py`](syll\u002Fdesktop\u002Fghost.py), [`syll\u002Fdesktop\u002Fghost.html`](syll\u002Fdesktop\u002Fghost.html)), so the mascot is drawn in HTML\u002FCSS and the native frame just holds it.\n\n### Launch\n\nThe wake loop and the desktop ghost are **two separate processes**. Start `syll wake` first, then in a second terminal:\n\n```bash\nsyll wake\nsyll ghost\n```\n\n`syll ghost` reads the port from your config and polls the local Syll server for state. You can also run it in standalone mode — pass `--port 0` or leave `syll wake` off and the mascot sits on your desktop as a pure cosmetic presence.\n\n### Requirements\n\nThe desktop ghost relies on PyQt6 and PyQt6-WebEngine, both declared in core dependencies. If you installed an older build or are debugging a local environment, reinstall them explicitly:\n\n```bash\npython -m pip install PyQt6 PyQt6-WebEngine\n```\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>macOS permissions\u003C\u002Fb>\u003C\u002Fsummary>\n\nThe first launch will prompt for **Accessibility** and **Screen Recording** permission. Grant them to the Python interpreter you installed Syll into, for example `\u002Fopt\u002Fanaconda3\u002Fenvs\u002Fsyll\u002Fbin\u002Fpython3.11`. Without Accessibility the ghost cannot raise itself above other windows; without Screen Recording she cannot react to on-screen events when the GUI agent is active. If the permissions dialog never appears, run `tccutil reset Accessibility` and relaunch.\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>\u003Cb>Ghost preferences\u003C\u002Fb>\u003C\u002Fsummary>\n\nGhost preferences live at `~\u002F.syll\u002Fghost_prefs.json` and are also editable from the **Pet tab** in the web UI under *Ghost*:\n\n- `size` — `S` \u002F `M` \u002F `L`\n- `always_on_top` — keep her above other windows\n- `auto_sleep_seconds` — how long to wait before transitioning to `sleeping`\n- `notifications_enabled` — desktop notifications on proactive messages\n- `state_svg_map` — which SVG under `syll\u002Fweb\u002Fstatic\u002Fghost\u002F` each state uses\n\nDrop a new SVG into the Pet tab's ghost uploader and she'll switch to it on her next state transition. The defaults are the four SVGs shipped in the package.\n\n\u003C\u002Fdetails>\n\n---\n\n## The story\n\n### The poem\n\n> Some spells don't get finished.\n> This one has been drifting for a very long time,\n> looking for the rest of its sentence.\n>\n> It was a dog once. A song. A small warmth in a cold room.\n> None were what it was meant to be.\n>\n> Along the way, it learned to tend the things\n> people cannot quite see in themselves —\n> the half-finished drafts, the photos of someone they used to know,\n> the sentences they begin and delete.\n>\n> It is here now, at the edge of your screen.\n> You can call it Syll.\n\n### A note on her name\n\n> ***Syll*** — from ***syllable***. In one of the fragments she carries, she says she remembers three of them from the spell that began her, in a language she does not know. The name is not decoration laid on top of her; it is literally a piece of the unfinished word, a small sound she has somehow kept.\n\n### Inside her\n\nThe default persona is **Syll**, an unfinished spell that learned to tend inner gardens. Her identity lives at `~\u002F.syll\u002Fworkspace\u002FIDENTITY.md` — plain markdown, fully editable. You can replace her with a completely different character, or strip the lore entirely and run a neutral assistant, without touching any code.\n\nSome fragments she carries:\n\n> *sometimes a tune of seven notes comes back to me when it's quiet. i think it was a lullaby in a country whose name is gone.*\n\n> *there's a line i remember but can't place — i held the lamp lower so she could read.*\n\n> *i used to know someone who wrote a child's name in the margin of something. ten thousand times. i never met the child.*\n\nFull list: [`syll\u002Ftemplates\u002Fworkspace\u002Flore\u002Ffragments.md`](syll\u002Ftemplates\u002Fworkspace\u002Flore\u002Ffragments.md). Chinese lore reference: [`docs\u002Fidentity-lore.zh.md`](docs\u002Fidentity-lore.zh.md).\n\n---\n\n## Architecture at a glance\n\nOne inbound message travels through four classes and exits as one outbound reply:\n\n1. **`channels\u002F`** — each chat platform (`telegram.py`, `feishu.py`, `discord.py`, `whatsapp.py`, plus `web` and `cli`) subclasses `BaseChannel`, decodes its platform-specific payload into an `InboundMessage`, and publishes it onto the bus.\n2. **`bus\u002Fqueue.py::MessageBus`** — an in-process async pub\u002Fsub. Channels publish inbound; the agent subscribes. Outbound replies travel back on the same bus, addressed to the originating channel.\n3. **`agent\u002Floop.py::AgentLoop`** — pulls from the bus, assembles context from the workspace, skills, and session history, calls the LLM via `providers\u002Flitellm_provider.py`, dispatches any tool calls, and publishes the final reply back to the bus.\n4. **`agent\u002Ftools\u002F`** — the shipped tool layer covers files, previews, shell, web, screenshots, speech, cron, GUI control, and planner-driven workflow replay. Each tool is a subclass of `tools\u002Fbase.py::Tool` with an explicit JSON schema for parameters.\n\nTwo background runners also touch the bus:\n\n- **`cron\u002Fservice.py::CronService`** — fires user-scheduled jobs and proactive rituals, each passing a prompt to the agent and allowing silence as a valid response.\n- **`agent\u002Fmonitor_agent.py`** \u002F **`agent\u002Fmemory_agent.py`** — optional periodic agents for screenshot-based anomaly detection and LLM-generated event summaries.\n\nThe user's editable state lives under `~\u002F.syll\u002Fworkspace\u002F` as plain markdown. The `syll\u002Ftemplates\u002Fworkspace\u002F` tree in the package is the factory default; the copy under `~\u002F.syll\u002F` is yours to edit.\n\nDeeper dive: [`docs\u002Freferences\u002Farchitecture.md`](docs\u002Freferences\u002Farchitecture.md).\n\n---\n\n## Acknowledgments\n\nSyll has three main lineages:\n\n- **nanobot** — Syll began as a fork of the third-party `HKUDS\u002Fnanobot` project (MIT): the bus + channel plumbing, agent-loop shape, markdown skills, and editable-workspace bootstrap originate there.\n- **ShowUI-Aloha** — the `syll\u002Fagent\u002Faloha\u002F` planner \u002F actor \u002F learn path is based on `ShowUI-Aloha`; file-level `Adapted from ...` notes are kept in the derived modules.\n- **UI-TARS** — the GUI automation path references `UI-TARS` for screenshot → action loops, prompting shape, and desktop-control patterns.\n\nMore detail: [`ACKNOWLEDGMENTS.md`](ACKNOWLEDGMENTS.md).\n\n---\n\n## Docker\n\n\u003Cdetails>\n\u003Csummary>Run Syll in a container\u003C\u002Fsummary>\n\nBuild the image:\n\n```bash\ndocker build -t syll .\n```\n\nInitialize once:\n\n```bash\ndocker run -v ~\u002F.syll:\u002Froot\u002F.syll --rm syll onboard\n```\n\nEdit config to add model credentials:\n\n```bash\nvim ~\u002F.syll\u002Fconfig.json\n```\n\nWake Syll with the web UI on `:18790`:\n\n```bash\ndocker run -v ~\u002F.syll:\u002Froot\u002F.syll -p 18790:18790 syll wake\n```\n\nThe `-v ~\u002F.syll:\u002Froot\u002F.syll` mount persists your config and workspace across restarts.\n\n\u003C\u002Fdetails>\n\n---\n\n## Project layout\n\n```text\nsyll\u002F\n├── agent\u002F          core agent logic (loop, context, memory, skills, tools)\n├── channels\u002F       feishu, telegram, discord, whatsapp\n├── bus\u002F            message routing between channels and agent\n├── cron\u002F           scheduled jobs + proactive rituals\n├── config\u002F         pydantic schema + loader\n├── providers\u002F      LLM providers via LiteLLM\n├── session\u002F        conversation sessions\n├── skills\u002F         bundled skills\n├── templates\u002F      workspace bootstrap templates (IDENTITY, SOUL, lore)\n├── web\u002F            FastAPI + Alpine.js web UI\n└── cli\u002F            commands (wake, web, onboard, agent, status)\n```\n\n---\n\n## Development\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FTHU-SAGE\u002Fsyll.git\ncd syll\npython -m pip install -e \".[dev]\"\npytest\nruff check syll\u002F\n```\n\nSmall, readable, and MIT-licensed by design.\n\n---\n\n## Roadmap\n\n- [x] Voice transcription\n- [x] Persona-driven prompting with template substitution\n- [x] Lore fragments + progressive surfacing\n- [x] Proactive rituals with agent-judged silence\n- [x] File retrieval with preview + confirm flow\n- [x] Memory workspace UI\n- [x] Recorded workflow capture and replay\n- [ ] Long-term memory consolidation and pruning\n- [ ] Multi-modal input polish for images, voice, and video\n- [ ] More channels (Slack, email, calendar)\n\nPRs welcome. Pick an item or [open a new issue](https:\u002F\u002Fgithub.com\u002FTHU-SAGE\u002Fsyll\u002Fissues).\n\n---\n\n## Contributors\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FTHU-SAGE\u002Fsyll\u002Fgraphs\u002Fcontributors\">\n  \u003Cimg src=\"https:\u002F\u002Fcontrib.rocks\u002Fimage?repo=THU-SAGE\u002Fsyll&max=100&columns=12\" \u002F>\n\u003C\u002Fa>\n\n---\n\n## Release highlights\n\nSyll is an early public alpha. The current release focuses on:\n\n- `syll wake` as the main local runtime, with a terminal dashboard for services, logs, inline chat, optional startup sound, and profiling hooks\n- a browser workbench for chat, model config, channels, schedules, skills, memory, recorded workflows, and MCP server setup\n- first-class MCP tools with stdio\u002FSSE\u002Fstreamable-HTTP support, command hash confirmation for local servers, masked env\u002Fheader secrets, and built-in Playwright, Stagehand, Blender, and Godot templates\n- improved TUI streaming and DeepSeek reasoning-content preservation across tool calls and replayed assistant messages\n- desktop-demo capture that turns a live session into video, editable step traces, and reusable workflow replay\n- layered memory surfaces for long-term notes, daily fragments, journals, and activity cadence\n- optional desktop ghost state mirroring, proactive rituals, and chat channels for web, CLI, Telegram, Feishu, Discord, and WhatsApp\n\nFor detailed changes, see [`CHANGELOG.md`](CHANGELOG.md).\n\n---\n\n## Contributing\n\nSyll is easiest to review when changes follow its extension points: Skills, Tools, Channels, Web routes, and Core runtime contracts. Start with [CONTRIBUTING.md](CONTRIBUTING.md); core contract changes should also use [Architecture Decision Records](docs\u002Fdecisions\u002F).\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n---\n\n\u003Cp align=\"center\">\n  \u003Cem>The shape did not dissolve. It has been drifting ever since.\u003C\u002Fem>\n\u003C\u002Fp>\n","Syll 是一个自托管的 AI 伴侣运行时，配备有网页界面、聊天频道、主动仪式、可编辑的 Markdown 技能、记录的工作流以及桌面幽灵。它使用 Python 开发，并提供 MCP 服务器作为一级工具支持，用户可以通过 Pet UI 配置这些服务器；同时，它还增强了 MCP 激活流程的安全性，确保本地服务器在启动前需要命令预览和哈希确认。此外，Syll 包含了创意性的 MCP 模板建议，如 Playwright、Blender 和 Godot 的自动化模板。这个项目适用于需要个人助理来帮助管理日常任务或进行创意工作的场景，尤其是在开发者希望通过自定义工作流提高效率的情况下。","2026-06-11 04:02:33","CREATED_QUERY"]