A dropped proposal or a stale reservation stayed proposed forever: there was no way to say the operator decided against it. knowledge-base.withdraw takes a reserved or proposed record to withdrawn as a new version naming why, ends a waiting operator's ask and clears a pending review in the same version, and refuses an already accepted, superseded or withdrawn record. The number stays spent either way. The old Withdraw (the background job for reservations never proposed) is renamed WithdrawStale to make room for the new, caller-driven WithdrawRecord.
219 lines
4.8 KiB
JSON
219 lines
4.8 KiB
JSON
{
|
|
"module": "mesh-knowledge",
|
|
"version": "1",
|
|
"slug": "knowledge",
|
|
"requires": [
|
|
"postgres-database"
|
|
],
|
|
"contributes": {
|
|
"postgres-database": {
|
|
"name": "knowledge"
|
|
}
|
|
},
|
|
"binds": {
|
|
"postgres-database": "${dir:state}/database.json"
|
|
},
|
|
"secrets": {
|
|
"postgres-database": "${dir:state}/database.secret"
|
|
},
|
|
"seats": [
|
|
{
|
|
"name": "knowledge-base",
|
|
"scope": "mesh",
|
|
"serves": [
|
|
"ask",
|
|
"get",
|
|
"list",
|
|
"findings",
|
|
"holds",
|
|
"links",
|
|
"history",
|
|
"reserve",
|
|
"propose",
|
|
"import",
|
|
"return",
|
|
"withdraw"
|
|
]
|
|
}
|
|
],
|
|
"claims": [
|
|
{
|
|
"name": "knowledge-base",
|
|
"scope": "mesh",
|
|
"serves": [
|
|
"ask",
|
|
"get",
|
|
"list",
|
|
"findings",
|
|
"holds",
|
|
"links",
|
|
"history",
|
|
"reserve",
|
|
"propose",
|
|
"import",
|
|
"return",
|
|
"withdraw"
|
|
]
|
|
}
|
|
],
|
|
"tools": [
|
|
"knowledge_health",
|
|
"knowledge_highest"
|
|
],
|
|
"emits": [
|
|
"reserved",
|
|
"proposed",
|
|
"reviewed",
|
|
"accepted",
|
|
"changed",
|
|
"imported",
|
|
"drafted",
|
|
"confirmed",
|
|
"returned"
|
|
],
|
|
"uses": [
|
|
"operator-channel"
|
|
],
|
|
"invokes": [
|
|
"seat:issue-tracker.reserve",
|
|
"claude-code.claude_code_judge",
|
|
"claude-code.claude_code_judged",
|
|
"records.records_status",
|
|
"records.records_list",
|
|
"records.records_read",
|
|
"seat:operator-channel.notify"
|
|
],
|
|
"config": {
|
|
"judge-model": {
|
|
"type": "string",
|
|
"description": "The model the knowledge base's drafting and confirming judgements ask, by the agent's name for it, such as sonnet; empty is sonnet.",
|
|
"default": "sonnet"
|
|
},
|
|
"drafting": {
|
|
"type": "string",
|
|
"description": "Whether the knowledge base drafts and confirms clauses itself: off stops it, anything else is on.",
|
|
"default": "on"
|
|
},
|
|
"reserved-for": {
|
|
"type": "string",
|
|
"description": "How long a reserved number waits for its proposal before it is withdrawn, as a duration such as 168h; empty is the knowledge base's own default.",
|
|
"pattern": "|[0-9]+(\\.[0-9]+)?(ns|us|µs|ms|s|m|h)([0-9]+(\\.[0-9]+)?(ns|us|µs|ms|s|m|h))*",
|
|
"default": "168h"
|
|
}
|
|
},
|
|
"resources": [
|
|
{
|
|
"id": "state",
|
|
"type": "directory",
|
|
"mode": "0700",
|
|
"place": ".",
|
|
"unknown": "program"
|
|
},
|
|
{
|
|
"id": "database-url",
|
|
"type": "file",
|
|
"path": "${dir:state}/database.url",
|
|
"mode": "0600",
|
|
"template": "files/database.url"
|
|
},
|
|
{
|
|
"id": "settings",
|
|
"trusted": false,
|
|
"type": "file",
|
|
"path": "${dir:state}/settings.json",
|
|
"mode": "0600",
|
|
"takes-config": ["judge-model", "drafting", "reserved-for"],
|
|
"merge": "json",
|
|
"template": "files/settings.json"
|
|
},
|
|
{
|
|
"id": "prepare",
|
|
"type": "process",
|
|
"name": "mesh-knowledge-prepare",
|
|
"artifact": "tools",
|
|
"run": [
|
|
"./mesh-knowledge",
|
|
"prepare"
|
|
],
|
|
"run-once": true,
|
|
"env": {
|
|
"DATABASE_URL_FILE": "${dir:state}/database.url"
|
|
},
|
|
"restart-on": [
|
|
"database-url"
|
|
]
|
|
},
|
|
{
|
|
"id": "keep",
|
|
"type": "process",
|
|
"name": "mesh-knowledge-keep",
|
|
"artifact": "tools",
|
|
"run": [
|
|
"./mesh-knowledge",
|
|
"keep"
|
|
],
|
|
"env": {
|
|
"DATABASE_URL_FILE": "${dir:state}/database.url"
|
|
},
|
|
"restart-on": [
|
|
"database-url"
|
|
],
|
|
"health": {
|
|
"kind": "unit"
|
|
}
|
|
},
|
|
{
|
|
"id": "watch",
|
|
"type": "process",
|
|
"name": "mesh-knowledge-watch",
|
|
"artifact": "tools",
|
|
"run": [
|
|
"./mesh-knowledge",
|
|
"watch"
|
|
],
|
|
"user": "${machine:account}",
|
|
"env": {
|
|
"DATABASE_URL_FILE": "${dir:state}/database.url",
|
|
"MESH_KNOWLEDGE_STATUS": "${dir:state}/health.json"
|
|
},
|
|
"restart-on": [
|
|
"database-url"
|
|
],
|
|
"health": {
|
|
"kind": "tool",
|
|
"tool": "knowledge_health",
|
|
"needs": "postgres-database",
|
|
"interval": "60s",
|
|
"timeout": "10s",
|
|
"looks": 2,
|
|
"grace": "180s"
|
|
}
|
|
}
|
|
],
|
|
"build": {
|
|
"artifacts": [
|
|
{
|
|
"name": "tools",
|
|
"kind": "bundle",
|
|
"language": "go",
|
|
"system": "arch",
|
|
"from": "cmd/mesh-knowledge",
|
|
"binary": "mesh-knowledge",
|
|
"loads": [
|
|
"mesh-knowledge"
|
|
],
|
|
"env": {
|
|
"DATABASE_URL_FILE": "${dir:state}/database.url",
|
|
"MESH_KNOWLEDGE_SETTINGS": "${dir:state}/settings.json",
|
|
"MESH_KNOWLEDGE_STATUS": "${dir:state}/health.json"
|
|
}
|
|
},
|
|
{
|
|
"name": "files",
|
|
"kind": "archive",
|
|
"from": "files"
|
|
}
|
|
]
|
|
}
|
|
}
|