- Rust 98.3%
- Shell 1.5%
- Python 0.2%
| docker | ||
| docs | ||
| nyatipaw-web | ||
| scripts | ||
| src | ||
| .gitignore | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| Dockerfile.nyatipaw | ||
| README.md | ||
nyatipaw
nyatipaw is the Nyatif social-agent product. It uses the verified
nyaticode/nyatibara direction as its contract and treats OpenClaw as a
reference, not a compatibility target.
Current surfaces:
nyatipaw doctorlocal readiness report for config, memory, channel/provider setup, runtime, and teamsnyatipaw doctor --strictlive-readiness gate that exits nonzero when Mattermost, provider, memory, or channel isolation requirements are not readynyatipaw live-smoke --include-disabled --require-allintegrated credentialed verifier for configured Mattermost, Telegram, Discord, provider, and optional outbound send checksnyatipaw tui/nyatipaw configureratatui settings UI for workspace, model providers, channel credentials, pending pairing approvals, and private/channel isolation policies- Non-interactive provider/model subcommands for setup automation
nyatipaw configure provider add-codex --model gpt-5.5nyatipaw configure provider add-ollama --base-url http://127.0.0.1:11434/v1 --model llama3.2nyatipaw configure provider add-open-ai-compatible <name> --base-url <url> --model <id>nyatipaw configure model set-default <provider/model>andnyatipaw modelsnyatipaw gateway install/status/start/stop/restartfor user-level systemd gateway service managementnyatipaw automation schedule/heartbeat/tasks/runs/wakesfor OpenClaw-style resident automationnyatipaw weblocal web control UInyatipaw pairing list/request/approvefor DM pairing approval, with optional requester notificationnyatipaw memory write/searchnyatipaw mattermost sendnyatipaw mattermost monitorfor Mattermost WebSocket event ingressnyatipaw mattermost verifyfor read-only live Mattermost bot verificationnyatipaw telegram send --chat <id> "text"for Telegram outbound messagesnyatipaw telegram verifyfor read-only live Telegram bot verificationnyatipaw telegram discoverto summarize recent Telegram updates and find chat/thread ids after sending a message to the botnyatipaw discord send --channel <id> "text"for Discord outbound messagesnyatipaw discord verifyfor read-only live Discord bot verificationnyatipaw misskey send/react/verifyfor Misskey note send, reaction, and token verificationPOST /channels/mattermost/inboundfor Mattermost webhook ingressPOST /channels/telegram/inboundfor Telegram update webhook ingressPOST /channels/discord/inboundfor Discord message webhook ingressPOST /hooks/wakeandPOST /hooks/agentfor authenticated automation hooksnyatipaw channel ingest --kind telegram|discord|mattermost|webfor adapter-path smoke testingnyatipaw team create/status/mate-spawn/mate-message/task-create/task-update/dispatch/reconcile/listandnyatipaw subagentnyatipaw runtime list/pending/events/transcript/checkpoint/drain-onceto inspect and process queued runtime commandsnyatipaw runtime send/resume/cancel/close --session <key>for explicit session controlnyatipaw runtime delivery list|get|clearto inspect stuck outbound channel delivery records and intentionally clear retry/dead-letter stateGET /api/doctor,GET /api/runtime/snapshot,GET /api/runtime/session?session=<key>, andGET /runtime/events/streamfor web timeline/session refresh- Web runtime session cards with transcript previews and an in-page transcript/command/event detail pane
- Runtime session policy ledger persisted at
workspace/runtime/session_policies.json, surfaced through Web session snapshots - Web team forms for create, mate spawn/message, task create, and task status updates
- Web subagent form for creating isolated child sessions from a parent session
- Web settings form for editing first-agent private/channel isolation policies
- Web pairing approval controls for pending DM access requests
The default config is created at .nyatipaw/config.toml; agent workspace files
are created under .nyatipaw/workspace.
See docs/AUTOMATION.md for scheduler, heartbeat,
background task, hook, and standing-order conventions.
Misskey channel
Misskey is a channel gateway for SNS-style notes rather than editable chat
messages. Configure it through nyatipaw tui or .nyatipaw/config.toml:
[misskey]
enabled = true
base_url = "https://example.invalid"
account = "danabot"
token = "..."
default_visibility = "home"
local_only = true
reaction_ack = ""
reaction_processing = "⏳"
default_visibility = "home" is the Misskey API value for unlisted-style
timeline delivery. Keep local_only = true unless federation is intentional.
The gateway connects to Misskey streaming and can use reactions as status
indicators. reaction_ack marks that nyatipaw accepted the note into its
runtime queue, but defaults to off because Misskey reaction deletion is commonly
rate-limited. When the actual model turn starts, nyatipaw removes that reaction
if configured and applies reaction_processing. After the final reply note is
sent, all configured status reactions are removed. Configure these through
nyatipaw configure misskey set --reaction-ack 👀 --reaction-processing ⏳ or
disable them with --no-reaction-ack / --no-reaction-processing.
Misskey replies are posted as new notes; nyatipaw does not edit progress/status
notes on Misskey because note edits are a poor fit for federation.
Misskey image attachments are parsed from note files. The gateway downloads a
small bounded set of non-sensitive image/* files and passes them as
ModelContentBlock::Image to the shared runtime, so vision-capable
OpenAI-compatible/Ollama routes can inspect them directly. Sensitive,
unsupported, oversized, or failed downloads are preserved as text omissions in
the model-visible turn context rather than silently disappearing.
Outbound delivery is tracked separately from the runtime transcript. Successful events are marked sent, rate-limited events are retried after the channel reset hint or a bounded backoff, and permanent 4xx channel failures are dead-lettered instead of being resent every gateway tick. Reaction failures are logged and cleared independently so they do not block final reply delivery. Operators can inspect the state with:
nyatipaw runtime delivery list
nyatipaw runtime delivery get EVENT_ID
nyatipaw runtime delivery clear EVENT_ID
Misskey thread sessions are rooted by the root note id, not by each individual mention note. Each inbound turn carries a Misskey context block with the sender id, username/name, bot flag, role, visibility, note id, reply id, and root id so the model can distinguish a public/home/unlisted thread from a direct exchange. Owner/admin identity grants authority, but public/home/unlisted thread turns still use the restricted channel policy; private workspace memory and host tools are only available by default in direct/specified owner/admin sessions.
By default, the final assistant message is posted as a Misskey thread reply.
Misskey exception tools are only for replacing that default behavior:
misskey_no_reply ignores low-value or bot-like interactions,
misskey_private_reply sends privately to paired owner/admin users,
misskey_react_only acknowledges with a reaction and no text, and
misskey_escalate routes the turn to owner/admin handling. If an exception is
recorded for the turn, later plain final assistant messages for that turn are not
posted publicly to Misskey.
If a turn reads or executes against sensitive paths such as .nyatipaw/config.toml,
auth files, tokens, or secret-looking config output, the tool result marks the
turn as private. Misskey then sends the final reply as a specified note visible
only to paired owner/admin user ids for that account, and refuses to send if no
paired private recipient is available.
Replies are never sent with broader visibility than the note being replied to.
For example, a home/unlisted default is clamped down when replying into a
followers-only or specified note. If nyatipaw cannot determine a safe specified
audience, the delivery is dead-lettered rather than retried forever.
Owner/admin Misskey sessions expose guarded Misskey API tools for note creation
and reaction management. General channel sessions do not see those tools. Public
or otherwise restricted users can use web_search and web_fetch for general
research. web_fetch refuses private, loopback, link-local, and otherwise
internal IP hosts unless a stricter deployment-level egress policy overrides the
container. Restricted users may also write durable notes through memory_write,
but those writes are scoped to the current channel/session under memory/scoped/
and do not modify USER.md or MEMORY.md.
Restricted channel users may create bounded one-shot reminders with wake_after
and reminder_create. These timers are limited to the current session/channel,
must deliver back to the current channel, cannot create cron or repeating
schedules, and are capped to short-term reminders. Owner/admin sessions keep the
full scheduler surface.
Scheduled jobs support delivery_mode = auto | thread | new-message. The
default keeps one-shot thread reminders best-effort but sends recurring reports
as new channel messages, so daily automation does not keep replying under the
note or post that originally created it.
The first Misskey channel admin must be paired before the channel performs any
general action. Before a misskey:<account>:<user-id> owner/admin exists,
public timeline notes are ignored even if public activation is configured as
Always. A direct note, reply, or mention can create a pairing request:
nyatipaw pairing list
nyatipaw pairing approve CODE --role admin
TUI pairing approval also shows the recommended role and allows an explicit role override. After admin pairing, that admin can decide whether later users should be ignored, handled as public/limited users, or added to another access role through the normal access-policy commands.
Credentialed completion gates are documented in docs/LIVE_VERIFICATION.md
and runnable with scripts/live-gates.sh.
Use docs/examples/live-gates.env.example as the non-secret env template.
Local repeatable gates are runnable with scripts/local-gates.sh.
nyatiagents also exposes the optional nyatibara-agent-compat feature for
type-checked conversion into nyatibara-agent command/event payloads.
Build nyatipaw with --features nyatibara-agent-runtime to expose
nyatipaw runtime drain-agent-once, which mirrors pending commands into a
nyatibara-agent supervisor and wakes the actor with a deterministic local turn
runner. This proves the actor/checkpoint path can persist both inbound user
messages and assistant turns before a real provider runner is wired in. Agent
and provider drain paths emit runtime turn-started/turn-completed status
events, which the Web UI surfaces as the session's latest status.
Build with --features nyatibara-provider-runtime to expose
nyatipaw runtime drain-provider-once and
nyatipaw runtime verify-provider. The drain command uses
nyatibara-core::ToolLoop and nyatibara-providers::ProviderRegistry for real
model turns; the verify command performs a read-only provider/model-list check.
Configure with nyatipaw configure provider ...; env-only fallback still accepts
NYATIPAW_MODEL, such as openai/gpt-5.4 or
openai-compatible/local-model, plus matching provider env vars.