offered once when an ask is offered, closed once for each of the five ends (answered, expired, cancelled by its asker, replaced, ended by the router), with the key, asker and headline and never an option, ticket or proof; on a stream of the events kept seven days, 64 MiB, granted by the trusted value readers, which names the knowledge base alone. Issue 725's runtime change is delivered (resolved 2026-10-26). Issue 1968. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
230 lines
5.5 KiB
JSON
230 lines
5.5 KiB
JSON
{
|
|
"module": "messenger",
|
|
"version": "1",
|
|
"slug": "msgr",
|
|
"runs-as": "messenger",
|
|
"seats": [
|
|
{
|
|
"name": "operator-channel",
|
|
"scope": "mesh",
|
|
"serves": [
|
|
"open",
|
|
"history",
|
|
"notify",
|
|
"tell",
|
|
"asks"
|
|
],
|
|
"accepts": [
|
|
"ask",
|
|
"cancel",
|
|
"condition"
|
|
],
|
|
"emits": [
|
|
"decided"
|
|
],
|
|
"by-caller": [
|
|
"ask",
|
|
"cancel",
|
|
"condition",
|
|
"decided"
|
|
],
|
|
"records": [
|
|
"asks"
|
|
]
|
|
},
|
|
{
|
|
"name": "channel",
|
|
"scope": "mesh",
|
|
"kinded": true,
|
|
"accepts": [
|
|
"show",
|
|
"edit",
|
|
"send"
|
|
]
|
|
},
|
|
{
|
|
"name": "intake",
|
|
"scope": "mesh",
|
|
"kinded": true,
|
|
"emits": [
|
|
"choice",
|
|
"link",
|
|
"failed",
|
|
"standing"
|
|
],
|
|
"proofs": [
|
|
"code"
|
|
]
|
|
}
|
|
],
|
|
"claims": [
|
|
{
|
|
"name": "operator-channel",
|
|
"scope": "mesh",
|
|
"serves": [
|
|
"open",
|
|
"history",
|
|
"notify",
|
|
"tell",
|
|
"asks"
|
|
]
|
|
}
|
|
],
|
|
"uses": [
|
|
"channel"
|
|
],
|
|
"consumes": [
|
|
"mesh-conditions.condition-raised",
|
|
"mesh-conditions.condition-changed",
|
|
"mesh-conditions.condition-cleared",
|
|
"mesh-delivery-view.moving",
|
|
"mesh-delivery-view.settled",
|
|
"mesh-delivery-view.stuck",
|
|
"intake.choice",
|
|
"intake.link",
|
|
"intake.failed",
|
|
"intake.standing"
|
|
],
|
|
"emits": [
|
|
"refused",
|
|
"offered",
|
|
"closed"
|
|
],
|
|
"streams": [
|
|
{
|
|
"name": "asks",
|
|
"events": [
|
|
"offered",
|
|
"closed"
|
|
],
|
|
"max-age-days": 7,
|
|
"max-mib": 64,
|
|
"grant": {
|
|
"config": "readers",
|
|
"events": "{key}"
|
|
}
|
|
}
|
|
],
|
|
"invokes": [
|
|
"seat:mesh-conditions.conditions",
|
|
"seat:node-engine.root-free",
|
|
"seat:issue-tracker.tracking"
|
|
],
|
|
"state": [
|
|
"open",
|
|
"sent",
|
|
{
|
|
"name": "asks",
|
|
"ttl-seconds": 2592000
|
|
},
|
|
"identities",
|
|
"walks"
|
|
],
|
|
"own-secrets": {
|
|
"broker": "${dir:state}/broker"
|
|
},
|
|
"secrets-owner": "messenger",
|
|
"tools": [
|
|
"messenger_status",
|
|
"messenger_recent",
|
|
"messenger_test",
|
|
"messenger_preview",
|
|
"messenger_check",
|
|
"messenger_identities",
|
|
"messenger_unlink"
|
|
],
|
|
"config": {
|
|
"readers": {
|
|
"type": "object",
|
|
"description": "Who may hear an ask offered or closed (the stream of the asks, kept seven days), per event: offered and closed, each a list of module names, on every machine. The knowledge base alone by default, for its overview page; an asker's own answers (decided) are never on it (ADR 0616 §7).",
|
|
"trusted": true,
|
|
"default": {"offered": ["mesh-knowledge"], "closed": ["mesh-knowledge"]}
|
|
},
|
|
"time-zone": {
|
|
"type": "string",
|
|
"description": "The time zone every time a message says is said in, an IANA name such as Europe/Brussels; empty is this machine's own zone.",
|
|
"trusted": true,
|
|
"default": ""
|
|
},
|
|
"desktop-machines": {
|
|
"type": "list",
|
|
"description": "The machines whose desktop showed the operator's messages, by node name. Nothing in this module reads it since the desk channel took the desktop over; it is taken so the file stays as a layer that still sets it makes it, until that layer drops it.",
|
|
"trusted": true,
|
|
"default": []
|
|
},
|
|
"only-what-needs-me": {
|
|
"type": "list",
|
|
"description": "The kinds of channel set to say only what needs the operator: a walk that delivered with nothing held and nothing open is not told there (ADR 0308 §4); empty is none.",
|
|
"trusted": true,
|
|
"default": []
|
|
},
|
|
"messages-per-hour": {
|
|
"type": "number",
|
|
"description": "messages per channel per hour before the rest are held as one; 0 turns the pause off. The tell verb has its own cap of 10 and is not counted here.",
|
|
"minimum": 0,
|
|
"maximum": 1000,
|
|
"trusted": false,
|
|
"default": 100
|
|
},
|
|
"settle-seconds": {
|
|
"type": "number",
|
|
"description": "seconds a delivery that ended well still holds the messages about what it changed, so a problem that passes as the delivery settles is not sent (ADR 0505 §3); 0 holds nothing after the end.",
|
|
"minimum": 0,
|
|
"maximum": 3600,
|
|
"trusted": false,
|
|
"default": 120
|
|
}
|
|
},
|
|
"resources": [
|
|
{
|
|
"id": "account",
|
|
"type": "user",
|
|
"name": "messenger",
|
|
"shell": "/usr/bin/nologin",
|
|
"home": "/var/lib/messenger"
|
|
},
|
|
{
|
|
"id": "state",
|
|
"type": "directory",
|
|
"mode": "0700",
|
|
"place": ".",
|
|
"owner": "messenger",
|
|
"unknown": "program"
|
|
},
|
|
{
|
|
"id": "settings",
|
|
"type": "file",
|
|
"path": "${dir:state}/settings.json",
|
|
"mode": "0600",
|
|
"takes-config": ["time-zone", "desktop-machines", "only-what-needs-me", "messages-per-hour", "settle-seconds", "readers"],
|
|
"merge": "json",
|
|
"template": "files/settings.json",
|
|
"owner": "messenger"
|
|
}
|
|
],
|
|
"build": {
|
|
"artifacts": [
|
|
{
|
|
"name": "tools",
|
|
"kind": "bundle",
|
|
"language": "go",
|
|
"system": "arch",
|
|
"from": "cmd/messenger",
|
|
"binary": "messenger",
|
|
"loads": [
|
|
"messenger"
|
|
],
|
|
"env": {
|
|
"MESH_MESSENGER_SETTINGS": "${dir:state}/settings.json",
|
|
"MESH_MESSENGER_STATE": "${dir:state}"
|
|
}
|
|
},
|
|
{
|
|
"name": "files",
|
|
"kind": "archive",
|
|
"from": "files"
|
|
}
|
|
]
|
|
}
|
|
}
|