Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Mayfly terminal UI bundle for DeepSeek Harness
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Mayfly is an interactive terminal UI for
DeepSeek Harness (dsh) —
an out-of-tree Cordis bundle over dsh-base, built against Harness
0.2.0-rc.2. Mayfly 0.1.3-rc.2 deliberately uses the same plugin model
as dsh Web: plugins are ordinary Cordis siblings and consume native dsh
services directly.README 전문 보기 ↗English | 中文
Mayfly is an interactive terminal UI for
DeepSeek Harness (dsh) —
an out-of-tree Cordis bundle over dsh-base, built against Harness
0.2.1-rc.2. Mayfly 0.1.4-rc.2 deliberately uses the same plugin model
as dsh Web: plugins are ordinary Cordis siblings and consume native dsh
services directly.
/btw and the /agents subagent tree share the
transcript pane; F7 returns to the previous conversation and F8
closes the displayed one.ctx.commands,
ctx.sessionProjections, ctx.tools, and other documented dsh services
directly; UI contributions go through mayflyPanes, mayflyStatus,
mayflyOverlays, and mayflyEditorExtensions.The activity block above the editor is the one place for live status: a glyph
that moves with the phase (blooming while the model thinks, filling while it
writes, a still ● beside a running tool, breathing while it waits for you),
the current step (Thinking, Running commands), the turn's elapsed time, and
the estimated token count and output rate. Its second line holds a tip, or the
arguments of the calls in flight. The notification row under it shows the
notice to read now, such as a rate-limit retry or a nearly full context. The
transcript records only what has happened, so streaming reasoning shows as a
captionless ✻ tail that settles to one ✻ Thinking · 6s row, and file
changes stay visible as diff cards next to the final answer.
Rates use four characters per token, exclude first-chunk latency, and disappear
after two seconds without output. Narrow terminals omit tips and rates first.
A plugin declares the services it needs with inject, then uses them from its
Cordis context:
ctx.commands, ctx.sessionProjections, ctx.tools, and the rest of
the documented dsh services are used directly.ctx.mayflyPanes, ctx.mayflyStatus, ctx.mayflyOverlays, and
ctx.mayflyEditorExtensions are the only Mayfly-specific UI contribution
services.ctx.mayflyCurrentAgent.current() returns the exact Agent selected by this
Mayfly frontend when an Agent-scoped native service needs it.There is no Mayfly plugin manifest, capability negotiation, adapter facade, private plugin realm, or separate plugin-author CLI. Mayfly's own features and external plugins register through the same services.
Plugins always return ordinary renderer-neutral nodes. Mayfly automatically
windows large list nodes and delays hidden responsive branches, so plugins
do not manage viewport ranges, overscan, renderer caches, or scroll
controllers. Plugins still own database and network fetching.
Interactive panes and overlays declare onEvent: { observe, action }. Mayfly's
frontend owner retains form drafts, selections, tabs, document anchors,
confirmation, operation state, and feedback across renderer reloads. Plugins
perform native reads and writes in action, then return a structured settlement
such as accepted, invalid, conflict, or failed; external data refreshes
use set(node, { reason: 'data', source }).
import type { Context } from '@deepseek-ai/cordis'
import type {} from '@deepseek-ai/dsh-commands'
import type {} from '@ephemeral-ai/mayfly-ui'
import { ui } from '@ephemeral-ai/mayfly-ui'
export const name = '@acme/build-health'
export const inject = ['commands', 'mayflyPanes']
export function apply(ctx: Context): void {
ctx.commands.register({
name: 'health',
description: 'Show build health',
handler: () => ({ kind: 'success', text: 'healthy' }),
})
ctx.mayflyPanes.register({
id: 'acme.build-health',
placement: 'right',
narrow: 'bottom',
}, ui.text('healthy'))
}
Publish-shaped plugin packages live in examples/; the developer manual covers the full contribution lifecycle.
Prerequisites are Node ^22.19 || >=24 and pnpm 11.
npm i -g @deepseek-ai/dsh
dsh plugin --profile mayfly add @ephemeral-ai/mayfly
dsh --profile mayfly
Or install the standalone launcher, which includes the tested dsh runtime:
npm -g install @ephemeral-ai/mayfly-cli
mayfly
Set DEEPSEEK_API_KEY before first run.
/help lists the active commands and key bindings. /agents browses the current session's subagent tree; Enter opens a child and
/agents stop <id> stops a live continuable leaf child; a parent with live
descendants is refused so teardown cannot silently remove a whole subtree.
/btw <question> opens a
temporary side Agent. Side conversations (BTW and subagents, several at once)
render in the same transcript pane with the complete Mayfly layout and editor:
press F7 to return to the previous conversation and F8 to close the
displayed one. Interrupting the selected conversation also
interrupts every running continuable descendant without closing those Agents.
The public npm surface is deliberately limited to three packages:
@ephemeral-ai/mayfly-ui: renderer-neutral contracts, builders, and the four UI services/provider.@ephemeral-ai/mayfly: all runtime areas, public runtime subpaths, composition, and presets.@ephemeral-ai/mayfly-cli: the dependency-free global launcher.Frontend, conversation, app, core, transcript, and interaction remain internal
ownership areas and Cordis rows inside @ephemeral-ai/mayfly; they are not
independently published packages.
flowchart TB
ROOT["one dsh process · one Cordis service graph"]
DSH["native dsh services<br/>commands · sessionProjections · tools · agents"]
PLUGIN["ordinary Cordis plugins<br/>official Mayfly rows and external siblings"]
AGENT["mayflyConversations · mayflyCurrentAgent<br/>primary + side conversations<br/>exact displayed Agent"]
UI["direct Mayfly UI services<br/>mayflyPanes · mayflyStatus<br/>mayflyOverlays · mayflyEditorExtensions"]
CORE["@ephemeral-ai/mayfly core area<br/>only pi-tui and raw-terminal owner"]
TERM["terminal"]
ROOT --> DSH
ROOT --> PLUGIN
DSH --> PLUGIN
AGENT --> PLUGIN
PLUGIN --> UI
UI --> CORE
CORE --> TERM
Only packages/mayfly/src/core/ imports pi-tui or owns raw terminal behavior.
@ephemeral-ai/mayfly-ui defines renderer-neutral nodes and direct registries.
The app area selects the current Agent and coordinates startup, while the
transcript and interaction areas consume native dsh services and publish UI
contributions.
See the architecture, the service seams, and the developer manual.
Questions, feedback, or feature ideas? Join the official Mayfly group on Feishu (primarily Chinese). Invite links expire every 7 days — grab the current one from the latest comment of the pinned group issue. Bug reports still belong in issues.
MIT.