Plugins & extensions
Furoshiki separates three ideas: the Brain (scheduler + managed services),
runtime plugins (PLUGIN.md under $FUROSHIKI_DATA/plugins/),
and the extensions hub (delegations, repairs, skill proposals in extension_work_items).
This page orients humans; LLMs authoring plugins should follow docs/PLUGIN-SPEC.md as the contract.
docs/PLUGIN-SPEC.md (v1.1+): hook arguments, env vars, CLI, permissions, and caller map.
Delegation and packaged install rules: docs/DELEGATION-AND-SKILLS.md. Unified queue: docs/EXTENSIONS-UNIFIED-PIPELINE.md.
Brain — scheduler, not OS crontab
scripts/brain.py runs scripts/scheduler.py against $FUROSHIKI_DATA/memory/schedules.json. Periodic jobs (soul engine, post-conversation, reflection loops, etc.) are rows in that file. The legacy cron/crontab in the repo is reference-only; Furoshiki does not require installing it for Brain-driven work.
Runtime plugins (PLUGIN.md)
Each plugin is a directory with a YAML manifest and Python entrypoints. Core discovers plugins via scripts/plugin_loader.py. Hooks run as subprocesses with a stable contract — they do not import Telegram or daemon modules directly.
| Hook | Purpose |
|---|---|
cron (Brain) |
Scheduled work. furoshiki plugins reload merges tasks (id prefix plugin__) into schedules.json; Brain runs run_plugin_scheduled.py → your script. Uses UTC five-field cron. |
pre_conversation |
Inject JSON context into session assembly (refresh_session_context.py). |
post_conversation |
After a session, optional side effects (run_post_conversation.py). |
pre_reflection / post_reflection |
Before/after reflection LLM runs (target: deep, inner_monologue, morning, afternoon, all). |
callable |
Named tools for the model (get_callable_manifest / OpenRouter tools / skill_orchestrator). |
post_inbound_signals |
After inbound conversation_mode classification — optional mode tweak + prompt addendum; merged with operator JSON and strict chat_recall clamp (plugin_loader.run_post_inbound_signals). |
Scheduled plugin flow
flowchart LR
subgraph data [Instance data]
PM[plugins/name/PLUGIN.md]
SJ[memory/schedules.json]
end
subgraph brain [Brain]
SCH[scheduler.py tick]
RPS[run_plugin_scheduled.py]
end
PM -->|furoshiki plugins reload| SJ
SCH -->|fires due task| RPS
RPS -->|subprocess + env| ENT[Plugin entry script]
Extensions hub (operator queue)
extension_work_items is the single SQLite view for delegation jobs, repair jobs, and skill/self-modification proposals. It powers the dashboard Extensions page and furoshiki extensions …. Installing a plugin from a proposal is related but not the same table: apply moves files into plugins/; the queue tracks work items and phases.
flowchart TD
subgraph tracks [Work tracks]
DJ[delegation_jobs]
RJ[repair_jobs]
SM[self_modification / skill proposals]
end
EWI[extension_work_items]
DJ --> EWI
RJ --> EWI
SM --> EWI
EWI --> DASH[Dashboard Extensions]
EWI --> CLI[furoshiki extensions]
CLI (essentials)
- furoshiki plugins list | show | apply | enable | disable | delete | reload
- furoshiki extensions … — unified queue, jobs, skills, plugins subcommands
- furoshiki start — Brain + Doctor (scheduler live)
See also
- Architecture — system diagram including plugin hooks
- Delegation & Skills — agentic delegation and proposals
docs/PLUGIN-SPEC.md— full hook contracts for implementersexamples/plugins/— sample plugin tree in the repo