@mono-agent/agent-app 0.20.14 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +227 -80
  2. package/dist/adapter-send-tools.d.ts +3 -2
  3. package/dist/adapter-send-tools.d.ts.map +1 -1
  4. package/dist/adapter-send-tools.js +15 -5
  5. package/dist/adapter-send-tools.js.map +1 -1
  6. package/dist/app-controller-channels.d.ts +2 -0
  7. package/dist/app-controller-channels.d.ts.map +1 -1
  8. package/dist/app-controller-channels.js +10 -1
  9. package/dist/app-controller-channels.js.map +1 -1
  10. package/dist/app-controller-maintenance.d.ts +3 -1
  11. package/dist/app-controller-maintenance.d.ts.map +1 -1
  12. package/dist/app-controller-maintenance.js +3 -0
  13. package/dist/app-controller-maintenance.js.map +1 -1
  14. package/dist/app-controller-responder.d.ts +2 -0
  15. package/dist/app-controller-responder.d.ts.map +1 -1
  16. package/dist/app-controller-responder.js +21 -17
  17. package/dist/app-controller-responder.js.map +1 -1
  18. package/dist/app-controller-traceability.d.ts.map +1 -1
  19. package/dist/app-controller-traceability.js +3 -0
  20. package/dist/app-controller-traceability.js.map +1 -1
  21. package/dist/app-controller-types.d.ts +1 -0
  22. package/dist/app-controller-types.d.ts.map +1 -1
  23. package/dist/app-controller.d.ts +2 -0
  24. package/dist/app-controller.d.ts.map +1 -1
  25. package/dist/app-controller.js +3 -0
  26. package/dist/app-controller.js.map +1 -1
  27. package/dist/artifact-retention.js +11 -0
  28. package/dist/artifact-retention.js.map +1 -1
  29. package/dist/background.d.ts +0 -6
  30. package/dist/background.d.ts.map +1 -1
  31. package/dist/background.js +5 -58
  32. package/dist/background.js.map +1 -1
  33. package/dist/channel-drivers/tui.d.ts +2 -2
  34. package/dist/channel-drivers/tui.d.ts.map +1 -1
  35. package/dist/channel-drivers/tui.js +27 -8
  36. package/dist/channel-drivers/tui.js.map +1 -1
  37. package/dist/cli-args.d.ts +4 -5
  38. package/dist/cli-args.d.ts.map +1 -1
  39. package/dist/cli-args.js +20 -19
  40. package/dist/cli-args.js.map +1 -1
  41. package/dist/cli-background-command.d.ts.map +1 -1
  42. package/dist/cli-background-command.js +4 -0
  43. package/dist/cli-background-command.js.map +1 -1
  44. package/dist/cli-commands.d.ts.map +1 -1
  45. package/dist/cli-commands.js +13 -2
  46. package/dist/cli-commands.js.map +1 -1
  47. package/dist/cli-help.d.ts.map +1 -1
  48. package/dist/cli-help.js +33 -19
  49. package/dist/cli-help.js.map +1 -1
  50. package/dist/cli-init-command.d.ts.map +1 -1
  51. package/dist/cli-init-command.js +26 -22
  52. package/dist/cli-init-command.js.map +1 -1
  53. package/dist/cli-install-skill-command.d.ts.map +1 -1
  54. package/dist/cli-install-skill-command.js +12 -3
  55. package/dist/cli-install-skill-command.js.map +1 -1
  56. package/dist/config-reference.d.ts +1 -0
  57. package/dist/config-reference.d.ts.map +1 -1
  58. package/dist/config-reference.js +66 -10
  59. package/dist/config-reference.js.map +1 -1
  60. package/dist/configured-agent.d.ts +9 -1
  61. package/dist/configured-agent.d.ts.map +1 -1
  62. package/dist/configured-agent.js +95 -29
  63. package/dist/configured-agent.js.map +1 -1
  64. package/dist/cron-control-store.d.ts.map +1 -1
  65. package/dist/cron-control-store.js +4 -2
  66. package/dist/cron-control-store.js.map +1 -1
  67. package/dist/doctor.d.ts.map +1 -1
  68. package/dist/doctor.js +215 -45
  69. package/dist/doctor.js.map +1 -1
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +1 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/interaction-bridge.d.ts +3 -3
  75. package/dist/interaction-bridge.d.ts.map +1 -1
  76. package/dist/interaction-bridge.js +27 -10
  77. package/dist/interaction-bridge.js.map +1 -1
  78. package/dist/launchd.d.ts +2 -0
  79. package/dist/launchd.d.ts.map +1 -1
  80. package/dist/launchd.js +3 -0
  81. package/dist/launchd.js.map +1 -1
  82. package/dist/local-tui-session.d.ts +14 -0
  83. package/dist/local-tui-session.d.ts.map +1 -0
  84. package/dist/local-tui-session.js +100 -0
  85. package/dist/local-tui-session.js.map +1 -0
  86. package/dist/mcp-apps.d.ts.map +1 -1
  87. package/dist/mcp-apps.js +3 -0
  88. package/dist/mcp-apps.js.map +1 -1
  89. package/dist/memory-journal.d.ts +53 -0
  90. package/dist/memory-journal.d.ts.map +1 -0
  91. package/dist/memory-journal.js +586 -0
  92. package/dist/memory-journal.js.map +1 -0
  93. package/dist/memory-recall.d.ts.map +1 -1
  94. package/dist/memory-recall.js +16 -2
  95. package/dist/memory-recall.js.map +1 -1
  96. package/dist/memory-retrieval.d.ts +9 -0
  97. package/dist/memory-retrieval.d.ts.map +1 -1
  98. package/dist/memory-retrieval.js +20 -0
  99. package/dist/memory-retrieval.js.map +1 -1
  100. package/dist/modules/base.js +1 -1
  101. package/dist/modules/base.js.map +1 -1
  102. package/dist/modules/known-tools.d.ts +1 -1
  103. package/dist/modules/known-tools.d.ts.map +1 -1
  104. package/dist/modules/known-tools.js +1 -0
  105. package/dist/modules/known-tools.js.map +1 -1
  106. package/dist/monitors-command.js +12 -2
  107. package/dist/monitors-command.js.map +1 -1
  108. package/dist/monitors-config.d.ts +4 -1
  109. package/dist/monitors-config.d.ts.map +1 -1
  110. package/dist/monitors-config.js +5 -1
  111. package/dist/monitors-config.js.map +1 -1
  112. package/dist/monitors-context.d.ts.map +1 -1
  113. package/dist/monitors-context.js +14 -2
  114. package/dist/monitors-context.js.map +1 -1
  115. package/dist/monitors-service.d.ts +2 -2
  116. package/dist/monitors-service.d.ts.map +1 -1
  117. package/dist/monitors-service.js +227 -96
  118. package/dist/monitors-service.js.map +1 -1
  119. package/dist/monitors-store.d.ts +11 -1
  120. package/dist/monitors-store.d.ts.map +1 -1
  121. package/dist/monitors-store.js +36 -6
  122. package/dist/monitors-store.js.map +1 -1
  123. package/dist/notify-destinations.d.ts +3 -2
  124. package/dist/notify-destinations.d.ts.map +1 -1
  125. package/dist/notify-destinations.js +6 -7
  126. package/dist/notify-destinations.js.map +1 -1
  127. package/dist/posted-reply-history.d.ts.map +1 -1
  128. package/dist/posted-reply-history.js +40 -3
  129. package/dist/posted-reply-history.js.map +1 -1
  130. package/dist/proactive-notify.d.ts +20 -1
  131. package/dist/proactive-notify.d.ts.map +1 -1
  132. package/dist/proactive-notify.js +56 -3
  133. package/dist/proactive-notify.js.map +1 -1
  134. package/dist/process-job-channel-routing.js +2 -1
  135. package/dist/process-job-channel-routing.js.map +1 -1
  136. package/dist/process-job-output-tail.d.ts +53 -0
  137. package/dist/process-job-output-tail.d.ts.map +1 -0
  138. package/dist/process-job-output-tail.js +257 -0
  139. package/dist/process-job-output-tail.js.map +1 -0
  140. package/dist/process-jobs-config.d.ts +1 -1
  141. package/dist/process-jobs-config.js +1 -1
  142. package/dist/process-jobs-config.js.map +1 -1
  143. package/dist/process-jobs-context.d.ts +3 -1
  144. package/dist/process-jobs-context.d.ts.map +1 -1
  145. package/dist/process-jobs-context.js +44 -11
  146. package/dist/process-jobs-context.js.map +1 -1
  147. package/dist/process-jobs-runtime.d.ts.map +1 -1
  148. package/dist/process-jobs-runtime.js +14 -0
  149. package/dist/process-jobs-runtime.js.map +1 -1
  150. package/dist/process-jobs-service.d.ts.map +1 -1
  151. package/dist/process-jobs-service.js +115 -23
  152. package/dist/process-jobs-service.js.map +1 -1
  153. package/dist/process-jobs-store.d.ts +3 -1
  154. package/dist/process-jobs-store.d.ts.map +1 -1
  155. package/dist/process-jobs-store.js +4 -1
  156. package/dist/process-jobs-store.js.map +1 -1
  157. package/dist/process-output-redaction.d.ts +26 -1
  158. package/dist/process-output-redaction.d.ts.map +1 -1
  159. package/dist/process-output-redaction.js +164 -2
  160. package/dist/process-output-redaction.js.map +1 -1
  161. package/dist/project-skills.d.ts +11 -5
  162. package/dist/project-skills.d.ts.map +1 -1
  163. package/dist/project-skills.js +88 -39
  164. package/dist/project-skills.js.map +1 -1
  165. package/dist/provider-auth-checks.d.ts +27 -0
  166. package/dist/provider-auth-checks.d.ts.map +1 -0
  167. package/dist/provider-auth-checks.js +349 -0
  168. package/dist/provider-auth-checks.js.map +1 -0
  169. package/dist/provider-auth-observations.d.ts +22 -0
  170. package/dist/provider-auth-observations.d.ts.map +1 -0
  171. package/dist/provider-auth-observations.js +139 -0
  172. package/dist/provider-auth-observations.js.map +1 -0
  173. package/dist/provider-auth-operator.d.ts +19 -0
  174. package/dist/provider-auth-operator.d.ts.map +1 -0
  175. package/dist/provider-auth-operator.js +560 -0
  176. package/dist/provider-auth-operator.js.map +1 -0
  177. package/dist/provider-auth-status.d.ts +20 -0
  178. package/dist/provider-auth-status.d.ts.map +1 -0
  179. package/dist/provider-auth-status.js +235 -0
  180. package/dist/provider-auth-status.js.map +1 -0
  181. package/dist/provider-model-catalog.d.ts +17 -0
  182. package/dist/provider-model-catalog.d.ts.map +1 -1
  183. package/dist/provider-model-catalog.js +113 -2
  184. package/dist/provider-model-catalog.js.map +1 -1
  185. package/dist/provider-setup.d.ts +22 -0
  186. package/dist/provider-setup.d.ts.map +1 -1
  187. package/dist/provider-setup.js +101 -15
  188. package/dist/provider-setup.js.map +1 -1
  189. package/dist/reply-artifacts.d.ts +3 -1
  190. package/dist/reply-artifacts.d.ts.map +1 -1
  191. package/dist/reply-artifacts.js +45 -10
  192. package/dist/reply-artifacts.js.map +1 -1
  193. package/dist/request-model-override.d.ts +11 -2
  194. package/dist/request-model-override.d.ts.map +1 -1
  195. package/dist/request-model-override.js +51 -1
  196. package/dist/request-model-override.js.map +1 -1
  197. package/dist/request-scoped-mcp.d.ts +3 -0
  198. package/dist/request-scoped-mcp.d.ts.map +1 -1
  199. package/dist/request-scoped-mcp.js +1 -1
  200. package/dist/request-scoped-mcp.js.map +1 -1
  201. package/dist/run-history.d.ts.map +1 -1
  202. package/dist/run-history.js +56 -13
  203. package/dist/run-history.js.map +1 -1
  204. package/dist/seen-conversations.d.ts +4 -3
  205. package/dist/seen-conversations.d.ts.map +1 -1
  206. package/dist/seen-conversations.js +6 -5
  207. package/dist/seen-conversations.js.map +1 -1
  208. package/dist/session-history.d.ts +14 -0
  209. package/dist/session-history.d.ts.map +1 -1
  210. package/dist/session-history.js +120 -5
  211. package/dist/session-history.js.map +1 -1
  212. package/dist/systemd-command.d.ts +8 -0
  213. package/dist/systemd-command.d.ts.map +1 -0
  214. package/dist/systemd-command.js +206 -0
  215. package/dist/systemd-command.js.map +1 -0
  216. package/dist/systemd.d.ts +51 -0
  217. package/dist/systemd.d.ts.map +1 -0
  218. package/dist/systemd.js +299 -0
  219. package/dist/systemd.js.map +1 -0
  220. package/dist/tool-output-artifacts.d.ts +4 -0
  221. package/dist/tool-output-artifacts.d.ts.map +1 -0
  222. package/dist/tool-output-artifacts.js +17 -0
  223. package/dist/tool-output-artifacts.js.map +1 -0
  224. package/dist/tui-command.d.ts +0 -45
  225. package/dist/tui-command.d.ts.map +1 -1
  226. package/dist/tui-command.js +27 -264
  227. package/dist/tui-command.js.map +1 -1
  228. package/dist/untrusted-text.js +2 -2
  229. package/dist/web-command.d.ts +3 -0
  230. package/dist/web-command.d.ts.map +1 -1
  231. package/dist/web-command.js +112 -7
  232. package/dist/web-command.js.map +1 -1
  233. package/dist/web-request-coordinator.d.ts +19 -0
  234. package/dist/web-request-coordinator.d.ts.map +1 -0
  235. package/dist/web-request-coordinator.js +242 -0
  236. package/dist/web-request-coordinator.js.map +1 -0
  237. package/dist/wizard/prompts.d.ts.map +1 -1
  238. package/dist/wizard/prompts.js +1 -0
  239. package/dist/wizard/prompts.js.map +1 -1
  240. package/dist/wizard/run.js +1 -1
  241. package/dist/wizard/run.js.map +1 -1
  242. package/package.json +18 -18
  243. package/schema/mono-agent.config.schema.json +120 -8
  244. package/skills/mono-agent-composer/SKILL.md +4 -4
  245. package/skills/mono-agent-composer/references/config-blueprint.md +18 -7
  246. package/skills/mono-agent-composer/references/discovery-questions.md +10 -5
  247. package/skills/mono-agent-composer/references/feature-coverage.md +30 -14
  248. package/skills/mono-agent-composer/references/package-map.md +6 -3
  249. package/skills/mono-agent-composer/references/playbooks.md +20 -5
  250. package/skills/mono-agent-composer/references/validation.md +4 -3
  251. package/dist/configuration-proposal-main.d.ts +0 -3
  252. package/dist/configuration-proposal-main.d.ts.map +0 -1
  253. package/dist/configuration-proposal-main.js +0 -13
  254. package/dist/configuration-proposal-main.js.map +0 -1
  255. package/dist/configuration-proposal-tool.d.ts +0 -33
  256. package/dist/configuration-proposal-tool.d.ts.map +0 -1
  257. package/dist/configuration-proposal-tool.js +0 -180
  258. package/dist/configuration-proposal-tool.js.map +0 -1
  259. package/dist/local-configuration.d.ts +0 -99
  260. package/dist/local-configuration.d.ts.map +0 -1
  261. package/dist/local-configuration.js +0 -1302
  262. package/dist/local-configuration.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mono-agent/agent-app",
3
- "version": "0.20.14",
3
+ "version": "0.21.1",
4
4
  "description": "Config-first mono-agent host: builds a responder and starts every configured communication channel and traceability from one mono-agent.config.json.",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0-only",
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "private": false,
13
13
  "engines": {
14
- "node": ">=22.19.0"
14
+ "node": ">=24.15.0"
15
15
  },
16
16
  "main": "./dist/index.js",
17
17
  "types": "./dist/index.d.ts",
@@ -36,23 +36,23 @@
36
36
  "dependencies": {
37
37
  "@agentclientprotocol/sdk": "1.3.0",
38
38
  "@clack/prompts": "^1.7.0",
39
- "@earendil-works/pi-ai": "0.85.0",
39
+ "@earendil-works/pi-ai": "0.85.1",
40
40
  "@modelcontextprotocol/sdk": "^1.29.0",
41
- "@mono-agent/agent-contracts": "0.20.14",
42
- "@mono-agent/agent-harness": "0.20.14",
43
- "@mono-agent/agent-runtime": "0.20.14",
44
- "@mono-agent/config": "0.20.14",
45
- "@mono-agent/cron-adapter": "0.20.14",
46
- "@mono-agent/operator-adapter": "0.20.14",
47
- "@mono-agent/memory": "0.20.14",
48
- "@mono-agent/observability": "0.20.14",
49
- "@mono-agent/openai-api-adapter": "0.20.14",
50
- "@mono-agent/runtime-adapter": "0.20.14",
51
- "@mono-agent/slack-adapter": "0.20.14",
52
- "@mono-agent/telegram-adapter": "0.20.14",
53
- "@mono-agent/tui": "0.20.14",
54
- "@mono-agent/web": "0.20.14",
55
- "@mono-agent/webhook-adapter": "0.20.14",
41
+ "@mono-agent/agent-contracts": "0.21.1",
42
+ "@mono-agent/agent-harness": "0.21.1",
43
+ "@mono-agent/agent-runtime": "0.21.1",
44
+ "@mono-agent/config": "0.21.1",
45
+ "@mono-agent/cron-adapter": "0.21.1",
46
+ "@mono-agent/operator-adapter": "0.21.1",
47
+ "@mono-agent/memory": "0.21.1",
48
+ "@mono-agent/observability": "0.21.1",
49
+ "@mono-agent/openai-api-adapter": "0.21.1",
50
+ "@mono-agent/runtime-adapter": "0.21.1",
51
+ "@mono-agent/slack-adapter": "0.21.1",
52
+ "@mono-agent/telegram-adapter": "0.21.1",
53
+ "@mono-agent/tui": "0.21.1",
54
+ "@mono-agent/web": "0.21.1",
55
+ "@mono-agent/webhook-adapter": "0.21.1",
56
56
  "undici": "8.9.0",
57
57
  "zod": "^4.4.3"
58
58
  },
@@ -752,7 +752,7 @@
752
752
  "additionalProperties": false,
753
753
  "properties": {
754
754
  "enabled": {
755
- "description": "Enables the memory capability.",
755
+ "description": "Enables explicit memory reads: targeted MemoryRecall for every backend and chronological MemoryJournal when a local store supports it. Automatic recall is unchanged.",
756
756
  "examples": [
757
757
  true
758
758
  ],
@@ -1016,6 +1016,36 @@
1016
1016
  },
1017
1017
  "default": []
1018
1018
  },
1019
+ "filesystem": {
1020
+ "type": "object",
1021
+ "additionalProperties": false,
1022
+ "properties": {
1023
+ "readableRoots": {
1024
+ "description": "Extra roots for managed Read, Glob, and Grep while sandbox.mode is off. Access requires lexical and realpath containment; native sandbox roots remain authoritative when sandboxing is enabled.",
1025
+ "examples": [
1026
+ [
1027
+ "/srv/shared/reference"
1028
+ ]
1029
+ ],
1030
+ "type": "array",
1031
+ "items": {
1032
+ "type": "string"
1033
+ }
1034
+ },
1035
+ "writableRoots": {
1036
+ "description": "Extra roots for managed Write and Edit while sandbox.mode is off; writable roots are also readable. Access requires lexical and realpath containment; native sandbox roots remain authoritative when sandboxing is enabled.",
1037
+ "examples": [
1038
+ [
1039
+ "/srv/shared/output"
1040
+ ]
1041
+ ],
1042
+ "type": "array",
1043
+ "items": {
1044
+ "type": "string"
1045
+ }
1046
+ }
1047
+ }
1048
+ },
1019
1049
  "mcpConfigPath": {
1020
1050
  "description": "Configures mcpConfigPath for the tools section.",
1021
1051
  "examples": [
@@ -1070,12 +1100,24 @@
1070
1100
  "type": "object",
1071
1101
  "additionalProperties": false,
1072
1102
  "properties": {
1103
+ "coordination": {
1104
+ "description": "Host mode shares web request budgets and cooldowns across participating local mono-agent processes; process preserves isolated coordination.",
1105
+ "examples": [
1106
+ "process"
1107
+ ],
1108
+ "type": "string",
1109
+ "default": "process",
1110
+ "enum": [
1111
+ "process",
1112
+ "host"
1113
+ ]
1114
+ },
1073
1115
  "search": {
1074
1116
  "type": "object",
1075
1117
  "additionalProperties": false,
1076
1118
  "properties": {
1077
1119
  "backend": {
1078
- "description": "WebSearch backend: auto tries configured local SearXNG, then ChatGPT-subscription Codex search, then keyless fallbacks; searxng, codex, and keyless are strict.",
1120
+ "description": "WebSearch backend: auto uses explicitly configured Ollama, configured local SearXNG, ChatGPT-subscription Codex search, then keyless fallbacks. searxng, ollama, codex, and keyless are strict.",
1079
1121
  "examples": [
1080
1122
  "auto"
1081
1123
  ],
@@ -1084,17 +1126,70 @@
1084
1126
  "enum": [
1085
1127
  "auto",
1086
1128
  "searxng",
1129
+ "ollama",
1087
1130
  "codex",
1088
1131
  "keyless"
1089
1132
  ]
1090
1133
  },
1134
+ "maxRequestsPerRun": {
1135
+ "description": "Hard ceiling from 1 to 20 on actual provider search requests in one logical runtime run; cache hits, coalesced followers, cooldown skips, and quota skips consume no request. Default 4.",
1136
+ "examples": [
1137
+ 4
1138
+ ],
1139
+ "type": "integer",
1140
+ "default": 4,
1141
+ "minimum": 1,
1142
+ "maximum": 20
1143
+ },
1091
1144
  "endpoint": {
1092
- "description": "Optional unauthenticated loopback HTTP SearXNG base URL. Remote HTTPS, credentials, query strings, and fragments are rejected.",
1145
+ "description": "Compatibility alias for tools.web.search.searxng.endpoint and MONO_AGENT_WEB_SEARCH_SEARXNG_ENDPOINT. Existing configurations remain valid; new configurations should use the provider-specific block.",
1093
1146
  "examples": [
1094
- "http://127.0.0.1:8088"
1147
+ "example"
1095
1148
  ],
1096
1149
  "type": "string"
1097
1150
  },
1151
+ "searxng": {
1152
+ "type": "object",
1153
+ "additionalProperties": false,
1154
+ "properties": {
1155
+ "endpoint": {
1156
+ "description": "Optional unauthenticated loopback HTTP SearXNG base URL. Remote HTTPS, credentials, query strings, and fragments are rejected.",
1157
+ "examples": [
1158
+ "http://127.0.0.1:8088"
1159
+ ],
1160
+ "type": "string"
1161
+ }
1162
+ }
1163
+ },
1164
+ "ollama": {
1165
+ "type": "object",
1166
+ "additionalProperties": false,
1167
+ "properties": {
1168
+ "baseUrl": {
1169
+ "description": "Ollama origin. Defaults to local http://127.0.0.1:11434 in strict Ollama mode. Hosted search is exactly https://ollama.com; custom public origins require HTTPS and trustPublicUrl=true.",
1170
+ "examples": [
1171
+ "https://ollama.com"
1172
+ ],
1173
+ "type": "string",
1174
+ "default": "http://127.0.0.1:11434"
1175
+ },
1176
+ "apiKeyEnv": {
1177
+ "description": "Environment variable containing the hosted Ollama API key. Required only for exact https://ollama.com and rejected for every other origin; the key value is never stored in JSON.",
1178
+ "examples": [
1179
+ "OLLAMA_API_KEY"
1180
+ ],
1181
+ "type": "string"
1182
+ },
1183
+ "trustPublicUrl": {
1184
+ "description": "Explicit acknowledgement for an HTTPS custom public Ollama origin. It never permits sending hosted credentials to that origin.",
1185
+ "examples": [
1186
+ true
1187
+ ],
1188
+ "type": "boolean",
1189
+ "default": false
1190
+ }
1191
+ }
1192
+ },
1098
1193
  "codex": {
1099
1194
  "type": "object",
1100
1195
  "additionalProperties": false,
@@ -1512,6 +1607,14 @@
1512
1607
  "websocket-cached"
1513
1608
  ]
1514
1609
  },
1610
+ "promptCacheDiagnostics": {
1611
+ "description": "Emit metadata-only prompt-cache request fingerprints into run artifacts; never prompt text, tool arguments, cache keys, endpoints or credentials.",
1612
+ "examples": [
1613
+ true
1614
+ ],
1615
+ "type": "boolean",
1616
+ "default": false
1617
+ },
1515
1618
  "piMaxRetries": {
1516
1619
  "description": "Configures piNative.piMaxRetries for the providers section.",
1517
1620
  "examples": [
@@ -1681,7 +1784,7 @@
1681
1784
  "maxChainDepth": {
1682
1785
  "type": "integer",
1683
1786
  "minimum": 1,
1684
- "maximum": 8,
1787
+ "maximum": 64,
1685
1788
  "default": 4
1686
1789
  },
1687
1790
  "retention": {
@@ -1766,10 +1869,16 @@
1766
1869
  "maximum": 65536,
1767
1870
  "default": 4096
1768
1871
  },
1872
+ "maxWakeIntervalMs": {
1873
+ "type": "integer",
1874
+ "minimum": 1,
1875
+ "maximum": 300000,
1876
+ "default": 300000
1877
+ },
1769
1878
  "maxChainDepth": {
1770
1879
  "type": "integer",
1771
1880
  "minimum": 1,
1772
- "maximum": 8,
1881
+ "maximum": 64,
1773
1882
  "default": 4
1774
1883
  },
1775
1884
  "rateLimit": {
@@ -1829,11 +1938,14 @@
1829
1938
  "additionalProperties": false,
1830
1939
  "properties": {
1831
1940
  "timeoutMs": {
1832
- "description": "Maximum wait for one AskUser interaction (one to five questions).",
1941
+ "description": "Maximum wait for one AskUser interaction (one to five questions); set null to disable automatic expiry.",
1833
1942
  "examples": [
1834
1943
  600000
1835
1944
  ],
1836
- "type": "integer",
1945
+ "type": [
1946
+ "integer",
1947
+ "null"
1948
+ ],
1837
1949
  "default": 600000
1838
1950
  }
1839
1951
  }
@@ -54,7 +54,7 @@ The install command pairs every available Codex/Claude target by default and
54
54
  prints an exact later command for a missing target. Use `--no-docs-mcp` only
55
55
  when a file-only skill install is intentional.
56
56
 
57
- To run an unreleased build instead, use a clone of the mono-agent workspace with Node 22.19.0+ and pnpm 10 or newer already installed:
57
+ To run an unreleased build instead, use a clone of the mono-agent workspace with Node 24.15.0+ and pnpm 10 or newer already installed:
58
58
 
59
59
  ```bash
60
60
  git clone <mono-agent-repo> ~/mono-agent && cd ~/mono-agent
@@ -75,8 +75,8 @@ Everything below runs in the user's agent folder, not the workspace.
75
75
  mono-agent init --model <ref> [--fallback <ref> [--fallback-effort <provider-default|level>]]... [--effort <level>] [--auth] [--memory lite|journal|bujo] # bare scaffold
76
76
  ```
77
77
 
78
- Either writes a `mono-agent.config.json` (with `tools.allowedTools` pre-filled from the selected capabilities' recommended tools), an `IDENTITY.md` whose `## Role` body is the one Role destination and which references any knowledge files already present, the managed project-local `mono-agent-configure` and `mono-agent-memory` skills, and `.mono-agent/` working directories (presets also emit a `.env.example` and any extra files). `--effort` writes `runtime.effort`, which is narrowed per model for display and still accepted at turn time; `--auth` opts in to provider setup before writing files; `--dry-run` previews without writing or launching auth/preflight commands. Existing scaffold/config files are never overwritten; reviewed secret setup is the deliberate exception that can transactionally replace `.env` and update `.gitignore`.
79
- 3. **Configure.** Edit `mono-agent.config.json` to match the discovery answers. For a newly created identity, put the agreed text under `IDENTITY.md` → `## Role`; if it existed before init, preserve it and report that the new answer was not stored. Preserve the generated `mono-agent-configure` and `mono-agent-memory` selections when appending other skills, and do not auto-select this full authoring-oriented composer inside the generated agent. Read `references/config-blueprint.md` for the full annotated config shape: every channel section, skills, MCP, memory, sandbox, and fallback models. Run `mono-agent config` to see the resolved configuration field-by-field with each value tagged `env` / `json` / `default` — the fastest way to confirm a value came from where you intended.
78
+ Either writes a `mono-agent.config.json` (with `tools.allowedTools` pre-filled from the selected capabilities' recommended tools), an `IDENTITY.md` whose `## Role` body is the one Role destination and which references any knowledge files already present, the managed project-local `mono-agent-memory` skill, and `.mono-agent/` working directories (presets also emit a `.env.example` and any extra files). `--effort` writes `runtime.effort`, which is narrowed per model for display and still accepted at turn time; `--auth` opts in to provider setup before writing files; `--dry-run` previews without writing or launching auth/preflight commands. Existing scaffold/config files are never overwritten; reviewed secret setup is the deliberate exception that can transactionally replace `.env` and update `.gitignore`.
79
+ 3. **Configure.** Edit `mono-agent.config.json` to match the discovery answers. For a newly created identity, put the agreed text under `IDENTITY.md` → `## Role`; if it existed before init, preserve it and report that the new answer was not stored. Preserve the generated `mono-agent-memory` selection when appending other skills, and do not auto-select this full authoring-oriented composer inside the generated agent. Read `references/config-blueprint.md` for the full annotated config shape: every channel section, skills, MCP, memory, sandbox, and fallback models. Run `mono-agent config` to see the resolved configuration field-by-field with each value tagged `env` / `json` / `default` — the fastest way to confirm a value came from where you intended.
80
80
  4. **Validate.**
81
81
 
82
82
  ```bash
@@ -90,7 +90,7 @@ Everything below runs in the user's agent folder, not the workspace.
90
90
  mono-agent start
91
91
  ```
92
92
 
93
- Then run the acceptance smoke test matching the chosen channel (see `references/validation.md`). To change anything, edit `mono-agent.config.json` or `IDENTITY.md` directly and run `mono-agent restart`; there is no live browser re-apply. On macOS, `mono-agent tui --configure` opens a persistent, visibly marked proposal-only SELF-CONFIG conversation against the already-running background agent. It maps the available capabilities, helps build a workflow conversationally, never accepts secrets, requires an out-of-band approval, and restarts or rolls back through the managed lifecycle. Approval, rejection, and no-change turns continue SELF-CONFIG; only quitting exits. Off macOS, use manual edits plus `validate`, foreground `start`, and ordinary `tui`; conversational configuration is unavailable.
93
+ Then run the acceptance smoke test matching the chosen channel (see `references/validation.md`). To change anything, edit `mono-agent.config.json` or `IDENTITY.md` directly, run `mono-agent validate`, and run `mono-agent restart`; there is no live browser or conversational re-apply. Open ordinary `mono-agent tui` after the restarted agent is ready.
94
94
 
95
95
  ## When Config Is Not Enough
96
96
 
@@ -75,6 +75,7 @@ effort. `runtime.fallbackModels` and `MONO_AGENT_FALLBACK_MODELS` were retired i
75
75
  // Pi-native bridge tuning (all optional).
76
76
  "piNative": {
77
77
  "transport": "auto", // auto | sse | websocket | websocket-cached
78
+ "promptCacheDiagnostics": false, // metadata-only request fingerprints in run artifacts
78
79
  "piMaxRetries": 2, // 0-8; transient provider-transport retries
79
80
  "maxRetryDelayMs": 60000, // backoff cap between retries (ms)
80
81
  "piSessionsRoot": ".mono-agent/sessions" // durable JSONL sessions → resume across restarts (unset = in-memory)
@@ -159,12 +160,13 @@ effort. `runtime.fallbackModels` and `MONO_AGENT_FALLBACK_MODELS` were retired i
159
160
  "mcpConfigPath": "./mcp.json", // stdio/sse/http servers; inlined for SDK runtimes
160
161
  "web": {
161
162
  "search": {
162
- "backend": "auto", // auto | searxng | codex | keyless
163
+ "backend": "auto", // auto | searxng | ollama | codex | keyless
163
164
  "codex": { "model": "gpt-5.6-luna" },
164
- "endpoint": "http://127.0.0.1:8088" // optional unauthenticated loopback HTTP SearXNG base URL
165
+ "searxng": { "endpoint": "http://127.0.0.1:8088" }, // optional unauthenticated loopback HTTP
166
+ "ollama": { "baseUrl": "http://127.0.0.1:11434" } // used only when backend is ollama
165
167
  },
166
168
  "fetch": {
167
- "render": "never", // never disables browser capability; auto is static-first
169
+ "render": "never", // never disables browser capability; auto is static-first; always permits browser-first calls
168
170
  "browserCommand": "agent-browser" // direct executable name/path
169
171
  }
170
172
  }
@@ -188,7 +190,7 @@ effort. `runtime.fallbackModels` and `MONO_AGENT_FALLBACK_MODELS` were retired i
188
190
  "maxQueueAgeMs": 300000, // 5 min; cap 1 h
189
191
  "maxOutputBytes": 1048576, // 1 MiB; cap 8 MiB
190
192
  "previewChars": 2000, // cap 8000
191
- "maxChainDepth": 4, // host-owned; cap 8
193
+ "maxChainDepth": 4, // host-owned; cap 64
192
194
  "retention": {
193
195
  "maxRecords": 1000, // cap 10000
194
196
  "maxAgeMs": 604800000, // 7 d; cap 30 d
@@ -196,6 +198,15 @@ effort. `runtime.fallbackModels` and `MONO_AGENT_FALLBACK_MODELS` were retired i
196
198
  }
197
199
  },
198
200
 
201
+ // Monitor watches reuse processJobs state and require processJobs.enabled.
202
+ // Tool policy defaults: wake_on batch, dedupe none, min_wake_interval_ms 0.
203
+ // Exit-only rejects nondefault dedupe/interval; terminal wakes always bypass both.
204
+ "monitors": {
205
+ "enabled": false,
206
+ "maxWakeIntervalMs": 300000, // host interval ceiling; cap 300000
207
+ "maxChainDepth": 4 // host-owned; cap 64
208
+ },
209
+
199
210
  // Human-in-the-loop bridge: structured blocking AskUser plus
200
211
  // run-scoped project-MCP progress. It auto-starts when either ask tool is
201
212
  // allowed, this block or an interaction env override is configured, or
@@ -203,7 +214,7 @@ effort. `runtime.fallbackModels` and `MONO_AGENT_FALLBACK_MODELS` were retired i
203
214
  // tools.mcpRequestContextServers names at least one opted project MCP server.
204
215
  "interaction": {
205
216
  "bridge": { "host": "127.0.0.1", "port": 0 },
206
- "askUser": { "timeoutMs": 600000 },
217
+ "askUser": { "timeoutMs": 600000 }, // set null to disable automatic expiry
207
218
  "progress": { "enabled": true }
208
219
  },
209
220
 
@@ -408,7 +419,7 @@ effort. `runtime.fallbackModels` and `MONO_AGENT_FALLBACK_MODELS` were retired i
408
419
 
409
420
  "cron": {
410
421
  "dir": "cron", // optional: folder of *.md jobs (frontmatter + prompt body), default "cron"
411
- "operatorActions": { "enabled": false }, // opt-in web run-now/runtime enable controls; requires tui.apiKey
422
+ "operatorActions": { "enabled": false }, // opt-in operator API run-now/runtime enable controls; requires tui.apiKey
412
423
  "jobs": [
413
424
  {
414
425
  "id": "daily",
@@ -452,7 +463,7 @@ A `.env` file in the folder is loaded automatically (exported shell variables wi
452
463
 
453
464
  For BuJo capture and the effective `bujo` tier that runs scheduled consolidation, configure `memory.llm`. Use `provider: "ollama"` with a local Ollama chat model string and optional `endpoint`, or `provider: "agent-host"` with `model` as a canonical `<provider>:<model>` runtime reference such as `openai-codex:gpt-5.6-sol`. Every route is Pi-native, so there is no SDK-versus-CLI distinction and no reference family is singled out for rejection: any reference the runtime accepts is valid here, including `openai-codex:*`. `endpoint` is Ollama-only and invalid for `agent-host`; `agent-host` additionally accepts `trace` (record each `complete()` as a `mem-*` run; default `true`) and `timeoutMs` (per-`complete()` abort, default 60000, range 1000-600000). The same values can be supplied via `MONO_AGENT_MEMORY_LLM_PROVIDER`, `MONO_AGENT_MEMORY_LLM_MODEL`, `MONO_AGENT_MEMORY_LLM_ENDPOINT`, `MONO_AGENT_MEMORY_LLM_TRACE`, and `MONO_AGENT_MEMORY_LLM_TIMEOUT_MS`. `memory.llm.executionMode` and `MONO_AGENT_MEMORY_LLM_EXECUTION_MODE` were retired in 0.21.0 and now fail config load — delete them, never emit them. Routine BuJo consolidation runs via the in-app scheduler; the standalone `memory-bujo` maintenance CLI was removed (use `mono-agent memory <subcommand>` from the agent folder). `agent-host` LLM capture is an in-app composition path that injects the `LlmComplete` implementation into the BuJo store.
454
465
 
455
- For operator views, run `mono-agent tui` or `mono-agent web` from any directory once the agent is started. Both discover running agents via the trace-source registry. The TUI and assistant-ui web console chat over the default-on `tui` stream endpoint (`"tui": {"enabled": false}` opts out); on macOS, `mono-agent tui --configure` opens a persistent, visibly marked proposal-only SELF-CONFIG conversation against the managed background agent and must not be combined with `--local`. Approval, rejection, and no-change turns continue that session; only quitting exits it. `mono-agent web` is an always-on service namespace, binds `0.0.0.0:5050` by default, and has no app login; use `--loopback` to narrow it. Capable agents expose stable read-only cron channels there. Run-now and runtime enable controls remain hidden unless `tui.apiKey` is configured and `cron.operatorActions.enabled` is explicitly true; every mutation still requires confirmation, is agent-audited, and does not rewrite job config. The former read-only recorder command, package, and relay were removed; use `mono-agent tui` (recorded-run replay) or `mono-agent web` (live console). The low-level `mono-agent-tui` bin also supports `--responder <file>` (embedded, an ESM module default-exporting an `AgentResponderLike` or exporting `createResponder(env, cwd, configJson)`) and `--url <baseUrl>` (direct connect).
466
+ For operator views, run `mono-agent tui` or `mono-agent web` from any directory once the agent is started. Both discover running agents via the trace-source registry. The TUI and assistant-ui web console chat over the default-on `tui` stream endpoint (`"tui": {"enabled": false}` opts out). Edit `mono-agent.config.json` or `IDENTITY.md`, validate, and restart to apply configuration changes. `mono-agent web` is an always-on service namespace, binds `0.0.0.0:5050` by default, and has no app login; use `--loopback` to narrow it. On `web start`, `restart`, or `run`, `--theme` selects the shell and `--name <label>` replaces the hostname-derived PWA, browser-tab, and rail label; `--name -` restores the hostname default; managed starts persist both selections. Capable agents expose stable read-only cron channels there. Their quiet headers show only cadence and agent-authored next run (viewer-local absolute time), or disabled/removed/unavailable state. Retained web proxy and operator API run-now/runtime enable controls require `tui.apiKey` and explicit `cron.operatorActions.enabled`; every mutation still requires confirmation, is agent-audited, and does not rewrite job config. The former read-only recorder command, package, and relay were removed; use `mono-agent tui` (recorded-run replay) or `mono-agent web` (live console). The low-level `mono-agent-tui` bin also supports `--responder <file>` (embedded, an ESM module default-exporting an `AgentResponderLike` or exporting `createResponder(env, cwd, configJson)`) and `--url <baseUrl>` (direct connect).
456
467
 
457
468
  ## Programmatic Escape Hatch
458
469
 
@@ -83,14 +83,19 @@ the user wants run-scoped JavaScript evaluation. All three execute with the same
83
83
  sandbox authority.
84
84
 
85
85
  If the agent needs public-web research, ask whether it should use automatic
86
- local SearXNG → ChatGPT-subscription Codex → keyless fallback, strict Codex,
87
- strict keyless, or strict SearXNG-only discovery. Fill
88
- `tools.web.search.backend`, optional `tools.web.search.endpoint`, and optional
86
+ local SearXNG → ChatGPT-subscription Codex → keyless fallback, explicit local or
87
+ hosted Ollama, strict Codex, strict keyless, or strict SearXNG-only discovery.
88
+ Fill `tools.web.search.backend`, optional `tools.web.search.searxng.endpoint`,
89
+ optional `tools.web.search.ollama.*`, and optional
89
90
  `tools.web.search.codex.model` (default `gpt-5.6-luna`). Keep
90
91
  `tools.web.fetch.render: "never"` unless the user explicitly needs
91
92
  JavaScript-heavy pages and has `agent-browser` 0.33.1 or newer; then select
92
- `"auto"` plus the direct `browserCommand`. Explain that SearXNG is local
93
- infrastructure but both search and fetch still generate public network traffic.
93
+ config-level `"auto"` plus the direct `browserCommand`. Explain that the agent
94
+ can request per-call `WebFetch` `render: "always"` when a known page must be
95
+ browser-first; `"always"` is not a config value. Explain that local
96
+ SearXNG/Ollama are infrastructure, not offline indexes, both search and fetch
97
+ still generate public network traffic, hosted Ollama credentials are accepted
98
+ only at the exact official origin, and rendering does not bypass access controls.
94
99
 
95
100
  ## 6. Memory Strategy
96
101
 
@@ -2,6 +2,13 @@
2
2
 
3
3
  Every framework capability and how a composed agent reaches it. This table is the **authoritative, exhaustive** answer to "can the config do X?" — answer from it, do not grep the `@mono-agent` package source to confirm. `config` = declarable in `mono-agent.config.json`; config fields may be JSON-only. Environment-variable overrides are optional: only fields with a documented `MONO_AGENT_*` mapping accept one, so consult the generated config reference's `Env override` column (`--` means none, as for `channels.plugins`) instead of inferring one. `cli` = a `mono-agent` CLI flag/command, `auto` = always on when the app runs, `code` = programmatic escape hatch only, `dev` = development/test tooling. A capability that is absent here, or marked `code`, is not reachable through config — that is the answer, not a cue to read source. The final column maps config-bearing rows back to the repo's canonical registry; multiple ids in one row are an intentional aggregation. The repo's `docs/reference/feature-registry.md` (framework checkout only) and the documentation site at <https://mono-agent-docs.vercel.app/> are longer-form human-facing mirrors of this same table.
4
4
 
5
+ The default configured agent may also advertise the operator-only v1
6
+ `contextImport` capability. It is not a config toggle and must be detected from
7
+ `GET /v1/info`; `historyAppend`/`deliverVerbatim` is a separate legacy surface
8
+ and is not evidence of import support. Import performs no cron or model turn and
9
+ accepts at most 32 KiB of decoded UTF-8 text with a source-qualified 512-byte
10
+ idempotency key and a 4096-byte conversation id.
11
+
5
12
  ## Runtime
6
13
 
7
14
  | Capability | Coverage | Where | Registry config ids |
@@ -16,12 +23,13 @@ Every framework capability and how a composed agent reaches it. This table is th
16
23
  | Per-channel run admission/execution bounds | config | `concurrency.maxConcurrentRuns`, `concurrency.maxPendingRuns` | `runtime.concurrency` |
17
24
  | Local providers (Ollama / LM Studio / OpenAI-compatible) | config | `providers.<id>.{type,baseUrl,enabled,trustPublicUrl,apiKeyEnv,models,maxAdvertisedModels}`; the legacy `providers.local[]` array is still accepted and migrated on load | `runtime.local-providers` |
18
25
  | Provider catalog (declares supported providers, widening model selection to each provider's full catalog) | config | the `providers` map, keyed by provider id — `providers.piAuthPath`, `providers.piNative`, and `providers.local` are reserved keys, never provider ids, and `providers.entries` is the resolved in-memory shape, not a JSON key. `ollama` and `lmstudio` are zero-config autodiscovered via localhost; a route naming any other provider that is not a Pi builtin fails config load until the map declares it with a `baseUrl` | `runtime.providers` |
19
- | Pi OAuth credentials | config | `providers.piAuthPath` | `runtime.pi-credentials` |
26
+ | Pi OAuth/API-key credentials and web-console re-authentication | config + cli + auto | `providers.piAuthPath`; `mono-agent auth login`; Agent settings lists only effective used providers and, when the protected operator capability is present, offers Pi-native GitHub/OpenAI device code, Anthropic redirect/code paste-back, or masked provider prompts through the same owner-only locked/no-clobber Pi-store transaction. Detection and successful live-request verification are separate; no `--device-auth` flag exists and Codex CLI `~/.codex/auth.json` is not covered | `runtime.pi-credentials` |
20
27
  | Pi-native transport, retry, and durable provider-session tuning | config | `providers.piNative.{transport,piMaxRetries,maxRetryDelayMs,piSessionsRoot}` | `runtime.pi-native-tuning` |
28
+ | Prompt-cache diagnostics (metadata-only request fingerprints in run artifacts, offline token-weighted cache summary) | config | `providers.piNative.promptCacheDiagnostics` (`MONO_AGENT_PI_PROMPT_CACHE_DIAGNOSTICS`), default `false`; summarize with `scripts/summarize-prompt-cache.mjs` | `runtime.prompt-cache-diagnostics` |
21
29
  | Tool-output bloat guard, cost tracking | auto | built into every run | — |
22
30
  | Context handling / auto-compaction | config + provider | `runtime.compaction.*` (matching `MONO_AGENT_COMPACTION_*`) controls adaptive Pi compaction. Omitted budgets derive from the active model window; reactive recovery re-prompts exactly once only after a verified reduction, and persistent `context_limit` advances to a configured fallback | `runtime.context-compaction` |
23
31
  | Structured output (JSON schema) | code | harness `runtimeOptions.outputSchema` | — |
24
- | Live input steering | auto + code | built into ordinary Slack, Telegram, and web-console turns, including completed safe-preview `Steered` activity after provider acknowledgement; custom hosts use `runtimeOptions.liveInput` | — |
32
+ | Live input steering | auto + code | built into ordinary Slack and Telegram turns and the web console's single server-authoritative Send path, with exact host-operation ownership, separate native acceptance, exact transcript consumption, uncertainty/no automatic retry, durable UUID receipts, and confirmed safe-preview `Steered` activity; custom hosts use `runtimeOptions.liveInput` | — |
25
33
  | Tool approval gates (risk tiers, timeouts, always-allow) | code | `createMonoRuntime({ onToolApprovalRequest, ... })` — needs a host UI | — |
26
34
  | Fully custom runtime | code | `startMonoAgentApp({ runtime })` | — |
27
35
 
@@ -31,7 +39,7 @@ Every framework capability and how a composed agent reaches it. This table is th
31
39
  | --- | --- | --- | --- |
32
40
  | Public name plus identity and optional soul documents; wizard Role has one explicit destination and created/preserved outcome | config + cli | `agent.name`, `context.identityPath`, `context.soulPath`; guided Role is `IDENTITY.md` → `## Role`, and an existing identity is never overwritten | `agent.public-name`, `context.identity`, `context.soul` |
33
41
  | Selected skills from a skills root | config | `context.skillsRoot`, `context.selectedSkills` | `skills.selected-activation` |
34
- | Generated project configuration skills with progressive disclosure | config + cli | init selects `mono-agent-configure` + `mono-agent-memory` under `./skills` with `context.skillDisclosure: "index"`; drift: `mono-agent install-skill --project --check\|--update` | `app.managed-project-skills` |
42
+ | Generated project memory skill with progressive disclosure | config + cli | init selects `mono-agent-memory` under `./skills` with `context.skillDisclosure: "index"`; drift and retired-skill migration: `mono-agent install-skill --project --check\|--update` | `app.managed-project-skills` |
35
43
  | Version-matched semantic documentation companion for the global composer skill | cli + tool | `mono-agent install-skill` pairs `mono-agent-docs` with every available Codex/Claude target by default; `--no-docs-mcp` opts out; `mono_agent_docs` uses `action: "search"` for ranked 2–3k excerpts and `action: "read"` for anchored windows up to 10k, internal-link targets, and exact continuation actions | — |
36
44
  | Per-skill byte cap | config | `context.skillMaxBytes` | `skills.byte-capping` |
37
45
  | Conversation history (owner-only durable store) | auto | 64 messages per exact conversation id independent of `runtime.maxTurns`; aggregate defaults 256 MiB / 10,000 conversations / 365 inactive days; staged atomic publication and post-commit pruning; custom store via code | — |
@@ -45,7 +53,8 @@ Every framework capability and how a composed agent reaches it. This table is th
45
53
  | Config-aware memory preview CLI (stats/today/show/search/top plus metadata-only audit; remains available when the live recall tool is disabled; local search warns and falls back to FTS-only when embeddings are down) | cli | `mono-agent memory stats\|today\|show <date>\|search <query>\|top\|audit [--limit <n>] [--json]` | — |
46
54
  | Memory liveness check (managed tier/provider/model/dimension identity; provider-native typed discovery plus real finite-vector/dimension probe for Ollama or LM Studio; declared auth env; BuJo LLM config + consolidation cadence; no cross-provider fallback) | cli | `mono-agent validate` | — |
47
55
  | Memory write modes and per-turn BuJo capture | config | `memory.writeMode`: `disabled`, `append-host-summary`, or `capture`; capture requires `memory.mode: "bujo"` | `memory.write-mode`, `memory.per-turn-capture` |
48
- | Auto-provisioned read-only `MemoryRecall` tool exposed for every configured memory tier; no chat LLM | config | `config.memory.recallTool.enabled` (`MONO_AGENT_MEMORY_RECALL_TOOL_ENABLED`, default on; explicit false opts out) | `memory.recall-tool` |
56
+ | Auto-provisioned targeted read-only `MemoryRecall` tool exposed for every configured memory backend; no chat LLM | config | `config.memory.recallTool.enabled` (`MONO_AGENT_MEMORY_RECALL_TOOL_ENABLED`, default on; explicit false opts out of both explicit memory-read tools) | `memory.recall-tool` |
57
+ | Bounded `MemoryJournal` broad chronological retrieval over curated canonical local memory; Lite/Journal/BuJo only, Supermemory unsupported; no embedding/chat call | config + auto | Shares `memory.recallTool.enabled`; restrictive `tools.allowedTools` must name `MemoryJournal` (or its canonical MCP name/server wildcard), deny wins | `memory.journal-browse` |
49
58
  | Agent-callable `Remember` tool that durably stores one explicitly stated fact; deterministic, append-only, no chat LLM; bujo backend and writable stores only; allowlist-gated and rejects credential-bearing text | config | `config.memory.rememberTool.enabled` (`MONO_AGENT_MEMORY_REMEMBER_TOOL_ENABLED`, default on for the bujo backend; explicit false opts out); a restrictive `tools.allowedTools` must name `Remember` | `memory.remember-tool` |
50
59
  | In-app memory LLM call timeout | config | `memory.llm.timeoutMs` (`MONO_AGENT_MEMORY_LLM_TIMEOUT_MS`, default 60000) | `memory.llm-timeout` |
51
60
 
@@ -55,14 +64,15 @@ Every framework capability and how a composed agent reaches it. This table is th
55
64
  | --- | --- | --- | --- |
56
65
  | Allow-all tool policy (omitted / `["*"]` = all tools; `[]` = none) | config | default `tools.allowedTools`; the harness no-policy safety net is `failClosedToolPolicy()` | `tool-policy.allow-all` |
57
66
  | Built-in tool allow/deny lists (deny wins, even under allow-all; pi doesn't deny external MCP tools) | config | `tools.allowedTools`, `tools.disallowedTools`; managed built-ins are Read/Write/Edit/Glob/Grep/Exec/Bash/NodeRepl/WebFetch/WebSearch | `tool-policy.allowlist`, `tool-policy.denylist`, `runtime.builtin-tools` |
58
- | Pi-native Exec/Bash background process jobs with exact-thread wake | config + cli + auto | `processJobs.*` opts in (default off; unsupported on Windows). Only controller-ready exact Slack, Telegram, and web-console turns gain optional `background`; foreground schemas/behavior stay unchanged otherwise. Host-owned queue/runtime/output/depth/retention caps, owner-private records, inherited POSIX process groups, restart interruption, unforgeable-depth normal-tool wakes, Slack/Telegram same-message lifecycle updates, fail-closed live store health, `mono-agent jobs list\|get\|cancel`, and durable web cards are built in. Busy pre-turn wake admission remains pending without consuming its retry budget. JSON-only `unsafeAllowUnprotectedState` is an explicit sandbox-off/all-Pi trusted-host posture: it suppresses ProcessJobs and clear-sessions SRT while retaining registry, lease, private-root, and provider-zero route invariants, and warns that ProcessJobs state plus the operator secret are model-accessible. Commands that daemonize into another group or session are unsupported | `agent-app.process-jobs` |
59
- | Pi-native `Monitor`/`MonitorStop` streaming watches with per-batch conversation wakes | config + cli | `monitors.*` opts in (default off; additionally requires `processJobs.enabled`, whose protected private-state root, registration proof and origin binding it reuses; unsupported on Windows). A monitor keeps a command alive after the turn returns, treats each stdout line as one event, coalesces within `coalesceMs`, and wakes the exact originating conversation per batch plus once at the end, steering an in-flight run or queuing its own turn and holding no provider slot. Command preparation, workdir rules, environment cleaning, sandbox seam and output redaction are shared with `Bash`, so there is no separate command allowlist. Capacity is counted independently of `processJobs.*`; one wake per monitor is in flight at a time, pending batches are bounded in lines and bytes with oldest-drop accounting reported to the model, and a sustained firehose stops the watch with `rate_limited` plus one terminal wake. A pre-dispatch refusal is re-offered with the same batch and sequence; every other delivery failure is never replayed. Restart marks live monitors `interrupted`, terminates the incarnation-matched group, and owes exactly one recovery wake without re-running a model-authored command. The fenced envelope declares the turn host-raised and its content untrusted, and a `NOTHING_TO_REPORT` reply is suppressed. Availability is Telegram and Slack only — cron, webhook, TUI-direct and the web console never receive the tools. `mono-agent monitors list\|get\|cancel` is the operator surface | `agent-app.monitors` |
60
- | Local-first public-web research | config + auto | `tools.web.search.{backend,endpoint,codex.model}` selects strict/first-choice loopback SearXNG, structured ChatGPT-subscription Codex search, or public no-credentials fallbacks; `auto` uses that order and rejects irrelevant/domain-mismatched results before stopping. `tools.web.fetch.{render,browserCommand}` keeps static extraction as the default and optionally enables isolated agent-browser rendering; transient-fetch retry behavior is automatic rather than config-bearing | `runtime.web-research` |
67
+ | Additional managed file-tool roots while process sandboxing is off | config | `tools.filesystem.readableRoots` adds roots for Read/Glob/Grep; `tools.filesystem.writableRoots` adds roots for Write/Edit and also makes them readable. Lexical and realpath containment reject traversal and symlink escapes. Native sandbox roots remain authoritative when enabled; these fields do not constrain shell command contents | `tool-policy.filesystem-roots` |
68
+ | Pi-native Exec/Bash background process jobs with exact-thread wake | config + cli + auto | `processJobs.*` opts in (default off; unsupported on Windows). Only controller-ready exact Slack, Telegram, and web-console turns gain optional `background`; request lineage diagnostics remain visible at exhaustion (default depth 4, cap 64). Background-only `wake_on_completion` defaults true; explicit false keeps terminal card updates without a wake. Exact sentinel-only replies suppress delivery; narration and rich content stay visible. Ambiguous wake receipts are unknown and never auto-replayed. Host-owned queue/runtime/output/depth/retention caps, owner-private records, inherited POSIX process groups, restart interruption, unforgeable-depth normal-tool wakes, Slack/Telegram same-message lifecycle updates, fail-closed live store health, `mono-agent jobs list\|get\|cancel`, and durable web cards are built in. Busy pre-turn wake admission remains pending without consuming its retry budget. JSON-only `unsafeAllowUnprotectedState` is an explicit sandbox-off/all-Pi trusted-host posture: it suppresses ProcessJobs and clear-sessions SRT while retaining registry, lease, private-root, and provider-zero route invariants, and warns that ProcessJobs state plus the operator secret are model-accessible. Commands that daemonize into another group or session are unsupported | `agent-app.process-jobs` |
69
+ | Pi-native `Monitor`/`MonitorStop` streaming watches with per-batch conversation wakes | config + cli | `monitors.*` opts in (default off; additionally requires `processJobs.enabled`, whose protected private-state root, registration proof and origin binding it reuses; unsupported on Windows). A monitor keeps a command alive after the turn returns, treats each stdout line as one event, coalesces within `coalesceMs`, and wakes the exact originating conversation per batch plus once at the end, steering an in-flight run or queuing its own turn and holding no provider slot. Command preparation, workdir rules, environment cleaning, sandbox seam and output redaction are shared with `Bash`, so there is no separate command allowlist. Tool fields default to `wake_on: batch`, `dedupe: none`, `min_wake_interval_ms: 0`. Opt-in consecutive batch dedupe ignores ANSI redraw controls only; meaningful whitespace and timestamps remain significant. The host clamps the interval to `monitors.maxWakeIntervalMs` (default/cap 300000) and reports the effective policy. Exit-only permits only default dedupe/interval and sends one terminal wake with a bounded tail. First and terminal wakes bypass the interval; cancellation must never automatically recreate a watch. CLI/web expose durable suppression and follow-up/steered/unknown wake counters, not invented model costs. `monitors.maxChainDepth` defaults to4, cap64. Capacity is counted independently of `processJobs.*`; one wake per monitor is in flight at a time, pending batches are bounded in lines and bytes with oldest-drop accounting reported to the model, and a sustained firehose stops the watch with `rate_limited` plus one terminal wake. A pre-dispatch refusal is re-offered with the same batch under a fresh sequence; every other delivery failure is never replayed. Restart marks live monitors `interrupted`, terminates the incarnation-matched group, and owes exactly one recovery wake without re-running a model-authored command. The fenced envelope declares the turn host-raised and its content untrusted, and a `NOTHING_TO_REPORT` reply is suppressed. Availability is Telegram, Slack, and existing user-created web conversations; cron, webhook, web:new, TUI-direct and A2A never receive the tools. `mono-agent monitors list\|get\|cancel` is the operator surface | `agent-app.monitors` |
70
+ | Local-first public-web research | config + auto | `tools.web.coordination: "host"` shares private admission/cooldown/quota state across agents under one OS user (default `process`); `mono-agent web-control status` inspects it. Broad primary queries and WebFetch `start_line`/`max_lines` avoid repeated work; Codex keeps a 10% quota reserve. `tools.web.search.maxRequestsPerRun` defaults to four actual provider requests per logical run, with cache/coalescing/cooldown/quota skips free. `tools.web.search.backend`, provider-scoped `searxng.endpoint` / `ollama.*`, and `codex.model` select strict providers or public no-credentials fallbacks; `auto` tries explicitly configured Ollama → configured SearXNG → Codex → keyless. Cooldowns advance immediately and tell the model not to sleep or retry. `tools.web.fetch.{render,browserCommand}` keeps deterministic static extraction as the default and optionally enables isolated agent-browser rendering; `render: "always"` is an explicit browser-first tool call under an `auto` config ceiling, and transient-fetch retry behavior is automatic rather than config-bearing | `runtime.web-research` |
61
71
  | MCP servers (stdio/sse/http) from a JSON file | config | `tools.mcpConfigPath` | `tool-policy.mcp-servers` |
62
72
  | Generated reply files and Pi-native MCP Apps | config + auto | `PublishReplyFile` is included under allow-all or must be named in a restrictive `tools.allowedTools`; it publishes confined files through owner-private integrity storage for native Slack/Telegram upload and web download. MCP Apps appear only when every configured runtime route supports the Pi-owned bridge, and render only in the hardened web console. Files and Apps share a 20-part run cap; retention follows `artifacts.retention.maxAgeDays` | `agent-app.rich-replies` |
63
73
  | Durable origin-bound continuations for trusted stdio/loopback-HTTP MCP services | config + auto | `tools.continuationServers` + `continuations.*`; interactive claims pin a bounded immutable origin snapshot before commit, exact rollover buckets are preserved, v3 state is restart-safe, and unavailable/legacy snapshots use a fixed zero-model fallback | `agent-app.durable-continuations` |
64
74
  | Adapter-derived send tools for enabled Slack/Telegram adapters | config | auto-available under allow-all once the channel is enabled; a **specific** `tools.allowedTools` must include `SlackSendMessage` / `TelegramSendMessage`; valid `slack.*` / `telegram.*` config and existing adapter allowlists provide credentials and destination bounds; confirmed message posts are idempotently recorded in destination history | `agent-app.adapter-send-tools` |
65
- | Interaction bridge for adapter-send history, structured blocking asks, and MCP progress | config + auto | `interaction.bridge.{host,port}`, `interaction.askUser.timeoutMs`, `interaction.progress.enabled`; env `MONO_AGENT_INTERACTION_BRIDGE_HOST`, `MONO_AGENT_INTERACTION_BRIDGE_PORT`, `MONO_AGENT_ASK_USER_TIMEOUT_MS`, `MONO_AGENT_PROGRESS_ENABLED`. It auto-starts for configured Slack/Telegram send tools, when `AskUser` is allowed, when an `interaction` block or interaction env override is configured, or when `interaction.progress.enabled` resolves true and `tools.mcpRequestContextServers` names at least one opted project stdio MCP server. AskUser presents all questions together on web and sequential native controls on Slack/Telegram. | `interaction.bridge` |
75
+ | Interaction bridge for adapter-send history, structured blocking asks, and MCP progress | config + auto | `interaction.bridge.{host,port}`, `interaction.askUser.timeoutMs` (default 600000; `null` disables automatic expiry), `interaction.progress.enabled`; env `MONO_AGENT_INTERACTION_BRIDGE_HOST`, `MONO_AGENT_INTERACTION_BRIDGE_PORT`, `MONO_AGENT_ASK_USER_TIMEOUT_MS` (`none` disables automatic expiry), `MONO_AGENT_PROGRESS_ENABLED`. It auto-starts for configured Slack/Telegram send tools, when `AskUser` is allowed, when an `interaction` block or interaction env override is configured, or when `interaction.progress.enabled` resolves true and `tools.mcpRequestContextServers` names at least one opted project stdio MCP server. AskUser presents all questions together on web and sequential native controls on Slack/Telegram. | `interaction.bridge` |
66
76
  | Sandbox on/off + srt engine (Pi-owned tools) | config | `sandbox.mode` | `sandbox.mode` |
67
77
  | Network policy (none/localhost/allowlist/all) | config | `sandbox.network.{mode,allowlist}` | `sandbox.network-policy` |
68
78
  | Filesystem scopes (readable/writable roots, deny-write globs) | config | `sandbox.readableRoots`, `sandbox.writableRoots`, `sandbox.denyWrite` | `sandbox.filesystem-scopes` |
@@ -80,19 +90,20 @@ Every framework capability and how a composed agent reaches it. This table is th
80
90
  | Telegram inbound audio transcription | config | `telegram.transcription.{endpoint,model,language,timeoutMs}`; opt-in OpenAI-compatible transcription endpoint for voice notes, audio files, and round-video attachments | `telegram.transcription` |
81
91
  | Slack (Socket Mode, channel allowlist, mention handling, native runtime controls) | config + code | `slack` section; optional `slack.unfurlLinks` / `slack.unfurlMedia` control native agent message previews while omission preserves Slack defaults; built-in Block Kit controls use configured primary/fallback choices through DM-wide/thread-local `@agent /model` and `@agent /effort`, plus channel-wide workspace commands `/<bot>-model` and `/<bot>-effort` derived from `auth.test.user` (Slack app registration + `commands` scope; no mono-agent config key) | `slack.socket-mode` |
82
92
  | Slack speaker names (who sent each turn) | config | `slack.resolveUserNames` (default `true`) resolves the sender's display name and handle via `users.info`; requires the `users:read` bot scope; best-effort, so a missing scope leaves turns unnamed instead of failing them; the resolved name is durable (stored turn + memory label) | `slack.speaker-names` |
83
- | Surface awareness (which channel/DM the turn is in) | config | Always on for Slack and Telegram: the Session block states the surface kind, its id, and the per-message character budget. `slack.resolveChannelNames` (default `true`) adds the Slack channel NAME via `conversations.info` and requires `channels:read`/`groups:read`; best-effort, so a missing scope leaves the surface named by kind and id. Surface ids are model-visible by design — pair with an explicit `slack.allowedChannelIds` allowlist if `SlackSendMessage` is enabled | `channels.surface-awareness` |
93
+ | Surface awareness (which channel/DM the turn is in) | config | Always on for Slack and Telegram: the Session block states the surface kind, its id, and the per-message character budget. `slack.resolveChannelNames` (default `true`) adds the Slack channel NAME via `conversations.info` and requires `channels:read`/`groups:read`; best-effort, so a missing scope leaves the surface named by kind and id. Surface ids are model-visible by design — pair with an explicit `slack.allowedChannelIds` allowlist if `SlackSendMessage` is enabled. Interactive console turns (web console thread, terminal TUI) are told which console they are on and given the thread's own conversation id verbatim (`web:<threadId>`), so an agent can quote it to host-side tools and operator commands that bind background work (Monitor, process jobs, task records) to that exact thread; cron/webhook/API turns still disclose nothing | `channels.surface-awareness` |
84
94
  | Slack thread/channel turn context (what was said before the agent was triggered) | config | `slack.threadContext.{enabled,maxMessages,requestLimit,timeoutMs,includeBotMessages}`, defaults `true`/`15`/`15`/`4000`/`true`; reads `conversations.replies` in a thread and `conversations.history` otherwise; requires `channels:history` / `groups:history` / `im:history` / `mpim:history`; one request per turn with a per-channel rate-limit breaker; best-effort, so a missing scope or rate limit sends no transcript instead of failing the turn | `slack.thread-context` |
85
95
  | Slack global/message shortcuts | config | `slack.shortcuts[]: {callbackId, prompt, channelId?, ackText?, threadReply?}`; JSON-only | `slack.shortcuts` |
86
96
  | Slack App Home actions | config | `slack.homeTab: {enabled?, headerText?, buttons?:[{actionId, label, prompt, channelId?, ackText?, threadReply?}]}`; `enabled` defaults to `false`, `buttons` defaults to `[]`; JSON-only | `slack.app-home` |
87
97
  | External channel plugins | config | `channels.plugins[]: { package, id?, label?, config? }`; package must export `createChannelDriver(options)` or a default driver factory | `channel.plugins` |
88
98
  | WhatsApp (Baileys, QR login, group mention/any triggers) | config | `channels.plugins[].package: "@mono-agent/whatsapp-adapter"` plus plugin `config.{enabled,allowedChatJids,allowAllChats,groupMode,botJids,mentionTextAliases,stripMentionText}` | `whatsapp.baileys` |
99
+ | Facebook Messenger (signed Meta webhook + Send API, PSID allowlist) | config | `channels.plugins[].package: "@mono-agent/messenger-adapter"` plus plugin `config.{enabled,allowedUserIds,allowAllUsers,host,port,webhookPath,apiVersion,allowNonLoopback,proactiveMessagingType,proactiveTag}`; the three credentials are environment-only and rejected in JSON — `MONO_AGENT_MESSENGER_PAGE_ACCESS_TOKEN`, `MONO_AGENT_MESSENGER_APP_SECRET`, `MONO_AGENT_MESSENGER_VERIFY_TOKEN` | `messenger.graph` |
89
100
  | A2A provider (Agent Card, JSON-RPC + REST, streaming, bearer, configurable request-body limit, opt-in durable dispatch identity) | config | `channels.plugins[].package: "@mono-agent/a2a-adapter"` plus plugin `config.provider` (including `maxRequestBytes` and `idempotency.{namespace,stateDir,retentionMs,maxRecords}`), `config.agent`, `config.skill`; `config.enabled` is canonical | `a2a.provider` |
90
101
  | A2A consumer settings (remote agent URLs, timeouts) and calls | config + code | same A2A plugin entry's `config.consumer`; calls via `sendA2AMessage({ idempotencyKey })` or `createA2AConsumerResponder({ idempotencyKeyForRequest })` | `a2a.consumer` |
91
102
  | TUI stream endpoint (operator console transport) | config | `tui.{enabled,host,port,basePath,allowNonLoopback,apiKey}`; default on, loopback; `/v1/info` capability-gates exact AskUser and agent-owned cron routes without changing wire schema 1 | `tui.stream-endpoint` |
92
103
  | Cron jobs (five-field expressions, timezones, stable job-id-seeded `H`; agent-app pins overlap to skip) | config + code | `cron.jobs[]`, including per-job `model` / `effort`; single-job `MONO_AGENT_CRON_*`, or one markdown file per job in `cron.dir` / `MONO_AGENT_CRON_DIR` (default `cron/`); `cron.operatorActions.enabled` / `MONO_AGENT_CRON_OPERATOR_ACTIONS_ENABLED` opt in to authenticated, confirmed, idempotent run-now and runtime enable controls (default off; never rewrites config); queue/replace controls are programmatic-only `startCronAdapter` options | `cron.scheduled-prompts` |
93
104
  | Cron per-run watchdog | config + code | `cron.jobs[].maxRunMs` or `maxRunMs` frontmatter; programmatic adapter fallback via `startCronAdapter({ maxRunMs })` | `cron.run-watchdog` |
94
- | Per-request runtime model and effort overrides | config + code | `cron.jobs[].{model,effort}`; `webhook.endpoints[].{model,effort}` plus request body `{model,effort}` (request wins); Telegram `/model` and `/effort`; Slack Block Kit selectors through thread-local `@agent /model` / `@agent /effort` and channel-wide `/<bot>-model` / `/<bot>-effort`, all over configured primary/fallback models | `runtime.per-trigger-model` |
95
- | Native final-answer notification for cron/webhook | config | Per job/endpoint `notify`; explicit `notifyConversationId` wins, otherwise inference occurs only with exactly one notify-capable Telegram/Slack candidate. With 0 or 2+ candidates delivery is skipped with a warning. Artifact-derived candidates use a 30-second post-scan cache. Telegram/Slack artifact commits invalidate it immediately; runs using default synthetic `cron:`/`webhook:` ids do not. Other artifact changes appear after expiry and the next scan. Cron model-exhaustion notices require an explicit `notifyConversationId` and never infer; `notifyFailureCooldownHours` rate-limits them. | `channel.native-notify` |
105
+ | Per-request runtime model and effort overrides | config + code | `cron.jobs[].{model,effort}`; `webhook.endpoints[].{model,effort}` plus request body `{model,effort}` (request wins); Telegram `/model` and `/effort`; Slack Block Kit selectors through thread-local `@agent /model` / `@agent /effort` and channel-wide `/<bot>-model` / `/<bot>-effort`, all over configured primary/fallback models. Model-only turns inherit effort per route: primary = `runtime.effort`, configured fallback = its pinned effort or provider default, other advertised model = `runtime.effort` only when admitted | `runtime.per-trigger-model` |
106
+ | Native final-answer notification for cron/webhook | config | Per job/endpoint `notify`; explicit `notifyConversationId` wins, otherwise inference occurs only with exactly one notify-capable Telegram/Slack/Messenger candidate. With 0 or 2+ candidates delivery is skipped with a warning. Artifact-derived candidates use a 30-second post-scan cache. Telegram/Slack/Messenger artifact commits invalidate it immediately; runs using default synthetic `cron:`/`webhook:` ids do not. Other artifact changes appear after expiry and the next scan. Cron model-exhaustion notices require an explicit `notifyConversationId` and never infer; `notifyFailureCooldownHours` rate-limits them. | `channel.native-notify` |
96
107
  | Channel message texts / stream tuning (welcome, debounce, ...) | code | channel driver overrides | — |
97
108
  | Custom transports | config + code | implement `ChannelDriver` and expose it through `channels.plugins[]`, or pass it via `startMonoAgentApp({ drivers })` | `channel.custom` |
98
109
 
@@ -104,10 +115,9 @@ Every framework capability and how a composed agent reaches it. This table is th
104
115
  | Trace-source registry (heartbeat manifests `mono-agent status` reads) | config | `traceability.{registryDir,sourceId,sourceLabel,heartbeatMs,staleAfterMs,globalDiscovery}` | `observability.trace-registry` |
105
116
  | Phoenix trace viewer (best-effort terminal-batched OTLP exporter; independent local JSONL has bounded terminal snapshots and can lose RAM-buffered events on crash) | config | `observability.exporters` (phoenix entry) | `observability.phoenix-exporter` |
106
117
  | Operator console (live chat with thinking/tool/telemetry insight, run replay, config view, and owner-authenticated process-job routes when enabled) | cli | `mono-agent tui [--agent <label>]`; agents serve the `tui` stream endpoint by default (`tui.enabled`, loopback); `mono-agent jobs` uses a separate owner capability | — |
107
- | Always-on multi-agent web console (persistent conversations and same-thread quotes, agent-maintained semantic titles with permanent manual-rename precedence, durable process-job cards, live active-agent skill discovery with canonical `$skill-name` insertion, fixed compact/expanded rail, offline-agent filtering that always preserves pinned/selected agents, durable Web Push, exact structured AskUser reconciliation, stable read-only per-cron channels with bounded keyset history, attachments, model/effort selection, reasoning/tools, hidden telemetry-backed cumulative context usage, cancellation) | cli | `mono-agent web start\|stop\|restart\|status\|logs\|run`; stable cron routes are `/agents/:sourceId/cron/:jobId`, read next-run only from capable agents, and expose confirmed mutations only when the agent has an operator key and `cron.operatorActions.enabled`; process-job cards are source/thread-bound and update through the owner-authenticated operator proxy without a live browser; skill autocomplete/browse reads the running agent's bounded registry and never sends on selection; bare `mono-agent web` is read-only status/help; default `0.0.0.0:5050`, `--loopback` narrows to `127.0.0.1`; package `@mono-agent/web`; no app authentication, so LAN/Tailnet reachability is the access boundary | — |
108
- | Managed proposal-only SELF-CONFIG conversation | cli + tool | macOS `mono-agent tui --configure` attaches to the authoritative background agent; persistent marker and capability map; stable configuration conversation with a fresh proposal capability after each checkpoint; host-gated `ProposeAgentConfiguration`; approval restarts and waits for readiness, failed start rolls files/agent back; only quitting exits. `--local` is ordinary chat only; off macOS configuration is manual | — |
118
+ | Always-on multi-agent web console (persistent conversations and same-thread quotes, one server-authoritative UUID-bearing Send path with durable read-only receipt recovery, agent-maintained semantic titles with permanent manual-rename precedence, durable process-job cards, live active-agent skill discovery with canonical `$skill-name` insertion, fixed compact/expanded rail, offline-agent filtering that always preserves pinned/selected agents, durable Web Push, exact structured AskUser reconciliation, stable read-only per-cron channels with bounded keyset history, attachments, per-conversation model/effort selection, SQLite-persisted per-agent defaults for new web conversations with one-click config revert, per-run requested/attempted/executed route and effective-effort attribution including nested subagents, remembered process-job/Monitor revival selection, reasoning/tools, hidden telemetry-backed cumulative context usage, cancellation) | cli | `mono-agent web start\|stop\|restart\|status\|logs\|run`; stable cron routes are `/agents/:sourceId/cron/:jobId`, read next-run only from capable agents, and expose confirmed mutations only when the agent has an operator key and `cron.operatorActions.enabled`; process-job cards are source/thread-bound and update through the owner-authenticated operator proxy without a live browser; standalone process-job/Monitor wake turns re-read the thread snapshot while an active Web Send targets the exact owned run or visibly queues on an older operator; fallback reasons and retries are bounded/sanitized before browser projection; skill autocomplete/browse reads the running agent's bounded registry and never sends on selection; bare `mono-agent web` is read-only status/help; default `0.0.0.0:5050`, `--loopback` narrows to `127.0.0.1`; `--theme` selects the shell and `--name <label>` replaces the hostname-derived PWA/tab/rail label on start/restart/run, `--name -` restores the hostname default, and managed selections are persisted; package `@mono-agent/web`; no app authentication, so LAN/Tailnet reachability is the access boundary | — |
109
119
  | Setup presets (saved answer-sets: generate config + `.env.example` + checklist) | cli | `mono-agent presets list\|show <id>`, `mono-agent init --preset <id> --yes` (the `recipes` command and `--recipe` alias were removed) | — |
110
- | Interactive setup wizard (preset/custom; exact `IDENTITY.md` → `## Role` prompt/outcome; walks model→channels→memory→tools→sandbox→observability; Journal/BuJo explicitly choose Ollama or LM Studio service root/model/dimension/optional auth env using typed discovery and a real probe; macOS starts the background agent before persistent SELF-CONFIG) | cli | `mono-agent init` (no flags, on a TTY; `setup` alias); manual embedding entry still requires readiness probe; flags/non-TTY stay scaffold-only; unsupported platforms use manual configuration/foreground start/ordinary TUI | — |
120
+ | Interactive setup wizard (preset/custom; exact `IDENTITY.md` → `## Role` prompt/outcome; walks model→channels→memory→tools→sandbox→observability; Journal/BuJo explicitly choose Ollama or LM Studio service root/model/dimension/optional auth env using typed discovery and a real probe; macOS starts the background agent and prints manual edit/validate/restart/TUI steps) | cli | `mono-agent init` (no flags, on a TTY; `setup` alias); manual embedding entry still requires readiness probe; flags/non-TTY stay scaffold-only; unsupported platforms use manual configuration/foreground start/ordinary TUI | — |
111
121
  | Tools reporting + no-tools guardrail (allow-all → `All tools allowed`; explicit empty `allowedTools: []` → `waiting`; unknown-tool "did you mean"; send-tool/channel cross-checks) | cli | part of `mono-agent validate`/`doctor`; the wizard's tools step | — |
112
122
  | Resolved config view (every field tagged env/json/default) | cli | `mono-agent config` | — |
113
123
  | Scaffold / validate / start / install-skill | cli | `mono-agent init [--model <ref>] [--fallback <ref> [--fallback-effort <provider-default\|level>]]... [--effort <level>] [--auth]\|validate [--consumer <path>]\|config\|presets\|start\|install-skill [--target claude\|codex\|both] [--force] [--no-docs-mcp]`; the legacy CLI `--fallback-models <csv>` flag was removed (JSON/env compat inputs remain) | — |
@@ -116,3 +126,9 @@ Every framework capability and how a composed agent reaches it. This table is th
116
126
  | Explicit failure objects (no fake success) | auto | harness | — |
117
127
  | Per-request runtime options, custom memory/history stores | code | `createConfiguredAgentResponder` options | — |
118
128
  | Multi-agent delegation (`AskCollaborator` loopback MCP tool) | code | `@mono-agent/agent-orchestrator` | — |
129
+
130
+ Prompt-cache diagnostics: set `providers.piNative.promptCacheDiagnostics` (default
131
+ `false`) or `MONO_AGENT_PI_PROMPT_CACHE_DIAGNOSTICS` to retain metadata-only request
132
+ fingerprints in existing run artifacts. Use the framework script
133
+ `scripts/summarize-prompt-cache.mjs` for token-weighted cache ratios and fingerprint
134
+ changes; see [measurement](https://mono-agent-docs.vercel.app/runtime/prompt-cache-measurement/).