Overview
| Artifact ID: | 59de82bb2a3352f1911378c9f56f86060975f12dc634e0a396bda3eafb249f83 |
|---|---|
| Page Name: | Leaf Agent |
| Date: | 2026-10-13 02:27:53 |
| Original User: | dmestas |
| Mimetype: | text/x-markdown |
Content
Leaf Agent
A Go daemon that sits next to a Fossil repo and keeps it synced over NATS.
Data Flow
right
R: cylinder "repo.fossil" color white fill 0x3a3a3a width 1.2 height 0.5 rad 3px
move 0.2
arrow color white thick <->
move 0.1
A: box "Leaf Agent" color white fill 0x2a6b3a width 1.5 height 0.5 rad 5px
move 0.2
arrow color white thick "sync request" above
move 0.1
N: cylinder "NATS" color white fill 0x2a4a6b width 1.0 height 0.5 rad 5px
move 0.2
arrow color white thick
move 0.1
B: box "Bridge" color white fill 0x6b5a2a width 1.2 height 0.5 rad 5px
move 0.2
arrow color white thick "HTTP" above
move 0.1
F: box "Fossil" color white fill 0x6b2a2a width 1.2 height 0.5 rad 5px
→ /pikchrshowHow It Works
- Opens a
.fossilrepo — reads project/server codes from SQLite - Connects to NATS
- Polls every 5s (configurable):
- Checks
unsent/unclusteredtables - If new artifacts found, calls
sync.Sync()via NATS transport
- Checks
SIGUSR1triggers immediate syncSIGINT/SIGTERMgraceful shutdown
Usage
leaf-agent --repo /path/to/repo.fossil \
--nats nats://localhost:4222 \
--poll 5s \
--push --pull
| Flag | Env Var | Default | Description |
|---|---|---|---|
--repo |
LEAF_REPO |
(required) | Path to .fossil file |
--nats |
LEAF_NATS_URL |
nats://localhost:4222 |
NATS server URL |
--poll |
— | 5s |
Poll interval |
--user |
LEAF_USER |
anonymous |
Sync user |
--password |
LEAF_PASSWORD |
— | Sync password |
--push |
— | true |
Push local artifacts |
--pull |
— | true |
Pull remote artifacts |
--prefix |
— | fossil |
NATS subject prefix |
Concurrency
The poll goroutine is the sole executor of sync. SyncNow() sends on a buffered channel — it never calls sync directly. This avoids concurrent SQLite access.