@mono-agent/agent-app 0.11.3 → 0.11.4

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 (345) hide show
  1. package/README.md +222 -26
  2. package/dist/adapter-send-tools-main.js +7 -1
  3. package/dist/adapter-send-tools-main.js.map +1 -1
  4. package/dist/adapter-send-tools.d.ts +19 -1
  5. package/dist/adapter-send-tools.d.ts.map +1 -1
  6. package/dist/adapter-send-tools.js +127 -13
  7. package/dist/adapter-send-tools.js.map +1 -1
  8. package/dist/app-config.d.ts.map +1 -1
  9. package/dist/app-config.js +15 -2
  10. package/dist/app-config.js.map +1 -1
  11. package/dist/app-controller-channels.d.ts +8 -0
  12. package/dist/app-controller-channels.d.ts.map +1 -0
  13. package/dist/app-controller-channels.js +207 -0
  14. package/dist/app-controller-channels.js.map +1 -0
  15. package/dist/app-controller-continuation.d.ts +26 -0
  16. package/dist/app-controller-continuation.d.ts.map +1 -0
  17. package/dist/app-controller-continuation.js +198 -0
  18. package/dist/app-controller-continuation.js.map +1 -0
  19. package/dist/app-controller-lifecycle.d.ts +6 -0
  20. package/dist/app-controller-lifecycle.d.ts.map +1 -0
  21. package/dist/app-controller-lifecycle.js +81 -0
  22. package/dist/app-controller-lifecycle.js.map +1 -0
  23. package/dist/app-controller-maintenance.d.ts +13 -0
  24. package/dist/app-controller-maintenance.d.ts.map +1 -0
  25. package/dist/app-controller-maintenance.js +180 -0
  26. package/dist/app-controller-maintenance.js.map +1 -0
  27. package/dist/app-controller-memory-health.d.ts +12 -0
  28. package/dist/app-controller-memory-health.d.ts.map +1 -0
  29. package/dist/app-controller-memory-health.js +160 -0
  30. package/dist/app-controller-memory-health.js.map +1 -0
  31. package/dist/app-controller-memory.d.ts +9 -0
  32. package/dist/app-controller-memory.d.ts.map +1 -0
  33. package/dist/app-controller-memory.js +83 -0
  34. package/dist/app-controller-memory.js.map +1 -0
  35. package/dist/app-controller-responder.d.ts +20 -0
  36. package/dist/app-controller-responder.d.ts.map +1 -0
  37. package/dist/app-controller-responder.js +246 -0
  38. package/dist/app-controller-responder.js.map +1 -0
  39. package/dist/app-controller-traceability.d.ts +25 -0
  40. package/dist/app-controller-traceability.d.ts.map +1 -0
  41. package/dist/app-controller-traceability.js +418 -0
  42. package/dist/app-controller-traceability.js.map +1 -0
  43. package/dist/app-controller-utils.d.ts +38 -0
  44. package/dist/app-controller-utils.d.ts.map +1 -0
  45. package/dist/app-controller-utils.js +185 -0
  46. package/dist/app-controller-utils.js.map +1 -0
  47. package/dist/app-controller.d.ts +400 -0
  48. package/dist/app-controller.d.ts.map +1 -0
  49. package/dist/app-controller.js +336 -0
  50. package/dist/app-controller.js.map +1 -0
  51. package/dist/app.d.ts +7 -115
  52. package/dist/app.d.ts.map +1 -1
  53. package/dist/app.js +6 -1912
  54. package/dist/app.js.map +1 -1
  55. package/dist/artifact-retention.d.ts +4 -0
  56. package/dist/artifact-retention.d.ts.map +1 -1
  57. package/dist/artifact-retention.js +38 -0
  58. package/dist/artifact-retention.js.map +1 -1
  59. package/dist/backfill.d.ts +3 -1
  60. package/dist/backfill.d.ts.map +1 -1
  61. package/dist/backfill.js +5 -1
  62. package/dist/backfill.js.map +1 -1
  63. package/dist/background-runtime.d.ts +27 -0
  64. package/dist/background-runtime.d.ts.map +1 -1
  65. package/dist/background-runtime.js +383 -205
  66. package/dist/background-runtime.js.map +1 -1
  67. package/dist/background-worker-lease.d.ts.map +1 -1
  68. package/dist/background-worker-lease.js +41 -241
  69. package/dist/background-worker-lease.js.map +1 -1
  70. package/dist/background.d.ts +31 -9
  71. package/dist/background.d.ts.map +1 -1
  72. package/dist/background.js +543 -272
  73. package/dist/background.js.map +1 -1
  74. package/dist/channel-drivers/cron.d.ts +11 -0
  75. package/dist/channel-drivers/cron.d.ts.map +1 -0
  76. package/dist/channel-drivers/cron.js +168 -0
  77. package/dist/channel-drivers/cron.js.map +1 -0
  78. package/dist/channel-drivers/live.d.ts +11 -0
  79. package/dist/channel-drivers/live.d.ts.map +1 -0
  80. package/dist/channel-drivers/live.js +47 -0
  81. package/dist/channel-drivers/live.js.map +1 -0
  82. package/dist/channel-drivers/native-notify.d.ts +27 -0
  83. package/dist/channel-drivers/native-notify.d.ts.map +1 -0
  84. package/dist/channel-drivers/native-notify.js +94 -0
  85. package/dist/channel-drivers/native-notify.js.map +1 -0
  86. package/dist/channel-drivers/openai-api.d.ts +7 -0
  87. package/dist/channel-drivers/openai-api.d.ts.map +1 -0
  88. package/dist/channel-drivers/openai-api.js +63 -0
  89. package/dist/channel-drivers/openai-api.js.map +1 -0
  90. package/dist/channel-drivers/shared.d.ts +4 -0
  91. package/dist/channel-drivers/shared.d.ts.map +1 -0
  92. package/dist/channel-drivers/shared.js +5 -0
  93. package/dist/channel-drivers/shared.js.map +1 -0
  94. package/dist/channel-drivers/slack.d.ts +14 -0
  95. package/dist/channel-drivers/slack.d.ts.map +1 -0
  96. package/dist/channel-drivers/slack.js +227 -0
  97. package/dist/channel-drivers/slack.js.map +1 -0
  98. package/dist/channel-drivers/telegram.d.ts +11 -0
  99. package/dist/channel-drivers/telegram.d.ts.map +1 -0
  100. package/dist/channel-drivers/telegram.js +244 -0
  101. package/dist/channel-drivers/telegram.js.map +1 -0
  102. package/dist/channel-drivers/tui.d.ts +15 -0
  103. package/dist/channel-drivers/tui.d.ts.map +1 -0
  104. package/dist/channel-drivers/tui.js +108 -0
  105. package/dist/channel-drivers/tui.js.map +1 -0
  106. package/dist/channel-drivers/webhook.d.ts +7 -0
  107. package/dist/channel-drivers/webhook.d.ts.map +1 -0
  108. package/dist/channel-drivers/webhook.js +115 -0
  109. package/dist/channel-drivers/webhook.js.map +1 -0
  110. package/dist/channels.d.ts +21 -81
  111. package/dist/channels.d.ts.map +1 -1
  112. package/dist/channels.js +11 -1174
  113. package/dist/channels.js.map +1 -1
  114. package/dist/cli-args.d.ts +121 -0
  115. package/dist/cli-args.d.ts.map +1 -0
  116. package/dist/cli-args.js +532 -0
  117. package/dist/cli-args.js.map +1 -0
  118. package/dist/cli-background-command.d.ts +59 -0
  119. package/dist/cli-background-command.d.ts.map +1 -0
  120. package/dist/cli-background-command.js +475 -0
  121. package/dist/cli-background-command.js.map +1 -0
  122. package/dist/cli-cancellation.d.ts +6 -0
  123. package/dist/cli-cancellation.d.ts.map +1 -0
  124. package/dist/cli-cancellation.js +23 -0
  125. package/dist/cli-cancellation.js.map +1 -0
  126. package/dist/cli-commands.d.ts +12 -0
  127. package/dist/cli-commands.d.ts.map +1 -0
  128. package/dist/cli-commands.js +306 -0
  129. package/dist/cli-commands.js.map +1 -0
  130. package/dist/cli-help.d.ts +11 -0
  131. package/dist/cli-help.d.ts.map +1 -0
  132. package/dist/cli-help.js +262 -0
  133. package/dist/cli-help.js.map +1 -0
  134. package/dist/cli-init-command.d.ts +60 -0
  135. package/dist/cli-init-command.d.ts.map +1 -0
  136. package/dist/cli-init-command.js +1910 -0
  137. package/dist/cli-init-command.js.map +1 -0
  138. package/dist/cli-install-skill-command.d.ts +3 -0
  139. package/dist/cli-install-skill-command.d.ts.map +1 -0
  140. package/dist/cli-install-skill-command.js +51 -0
  141. package/dist/cli-install-skill-command.js.map +1 -0
  142. package/dist/cli-sandbox-command.d.ts +10 -0
  143. package/dist/cli-sandbox-command.d.ts.map +1 -0
  144. package/dist/cli-sandbox-command.js +100 -0
  145. package/dist/cli-sandbox-command.js.map +1 -0
  146. package/dist/cli-validate-config-command.d.ts +36 -0
  147. package/dist/cli-validate-config-command.d.ts.map +1 -0
  148. package/dist/cli-validate-config-command.js +317 -0
  149. package/dist/cli-validate-config-command.js.map +1 -0
  150. package/dist/cli.d.ts +6 -248
  151. package/dist/cli.d.ts.map +1 -1
  152. package/dist/cli.js +6 -3792
  153. package/dist/cli.js.map +1 -1
  154. package/dist/config-reference.d.ts +2 -1
  155. package/dist/config-reference.d.ts.map +1 -1
  156. package/dist/config-reference.js +14 -3
  157. package/dist/config-reference.js.map +1 -1
  158. package/dist/configured-agent.d.ts +23 -0
  159. package/dist/configured-agent.d.ts.map +1 -1
  160. package/dist/configured-agent.js +89 -12
  161. package/dist/configured-agent.js.map +1 -1
  162. package/dist/continuation-dispatch-worker.d.ts +21 -0
  163. package/dist/continuation-dispatch-worker.d.ts.map +1 -0
  164. package/dist/continuation-dispatch-worker.js +425 -0
  165. package/dist/continuation-dispatch-worker.js.map +1 -0
  166. package/dist/continuation-http-routes.d.ts +15 -0
  167. package/dist/continuation-http-routes.d.ts.map +1 -0
  168. package/dist/continuation-http-routes.js +265 -0
  169. package/dist/continuation-http-routes.js.map +1 -0
  170. package/dist/continuation-operator-api.d.ts +18 -0
  171. package/dist/continuation-operator-api.d.ts.map +1 -0
  172. package/dist/continuation-operator-api.js +164 -0
  173. package/dist/continuation-operator-api.js.map +1 -0
  174. package/dist/continuation-origin-store.d.ts +19 -0
  175. package/dist/continuation-origin-store.d.ts.map +1 -0
  176. package/dist/continuation-origin-store.js +273 -0
  177. package/dist/continuation-origin-store.js.map +1 -0
  178. package/dist/continuation-service-errors.d.ts +18 -0
  179. package/dist/continuation-service-errors.d.ts.map +1 -0
  180. package/dist/continuation-service-errors.js +35 -0
  181. package/dist/continuation-service-errors.js.map +1 -0
  182. package/dist/continuation-service-helpers.d.ts +39 -0
  183. package/dist/continuation-service-helpers.d.ts.map +1 -0
  184. package/dist/continuation-service-helpers.js +308 -0
  185. package/dist/continuation-service-helpers.js.map +1 -0
  186. package/dist/continuation-service-origin.d.ts +55 -0
  187. package/dist/continuation-service-origin.d.ts.map +1 -0
  188. package/dist/continuation-service-origin.js +325 -0
  189. package/dist/continuation-service-origin.js.map +1 -0
  190. package/dist/continuation-service-types.d.ts +110 -0
  191. package/dist/continuation-service-types.d.ts.map +1 -0
  192. package/dist/continuation-service-types.js +11 -0
  193. package/dist/continuation-service-types.js.map +1 -0
  194. package/dist/continuation-service.d.ts +4 -97
  195. package/dist/continuation-service.d.ts.map +1 -1
  196. package/dist/continuation-service.js +9 -1525
  197. package/dist/continuation-service.js.map +1 -1
  198. package/dist/continuation-store-fs.d.ts +15 -0
  199. package/dist/continuation-store-fs.d.ts.map +1 -0
  200. package/dist/continuation-store-fs.js +247 -0
  201. package/dist/continuation-store-fs.js.map +1 -0
  202. package/dist/continuation-store-policy.d.ts +21 -0
  203. package/dist/continuation-store-policy.d.ts.map +1 -0
  204. package/dist/continuation-store-policy.js +278 -0
  205. package/dist/continuation-store-policy.js.map +1 -0
  206. package/dist/continuation-store-records.d.ts +9 -0
  207. package/dist/continuation-store-records.d.ts.map +1 -0
  208. package/dist/continuation-store-records.js +221 -0
  209. package/dist/continuation-store-records.js.map +1 -0
  210. package/dist/continuation-store-types.d.ts +173 -0
  211. package/dist/continuation-store-types.d.ts.map +1 -0
  212. package/dist/continuation-store-types.js +26 -0
  213. package/dist/continuation-store-types.js.map +1 -0
  214. package/dist/continuation-store.d.ts +4 -138
  215. package/dist/continuation-store.d.ts.map +1 -1
  216. package/dist/continuation-store.js +145 -1049
  217. package/dist/continuation-store.js.map +1 -1
  218. package/dist/doctor.d.ts +5 -0
  219. package/dist/doctor.d.ts.map +1 -1
  220. package/dist/doctor.js +575 -38
  221. package/dist/doctor.js.map +1 -1
  222. package/dist/init.d.ts +2 -0
  223. package/dist/init.d.ts.map +1 -1
  224. package/dist/init.js +92 -239
  225. package/dist/init.js.map +1 -1
  226. package/dist/interaction-bridge.d.ts +19 -0
  227. package/dist/interaction-bridge.d.ts.map +1 -1
  228. package/dist/interaction-bridge.js +130 -0
  229. package/dist/interaction-bridge.js.map +1 -1
  230. package/dist/launchd-logs.d.ts +91 -0
  231. package/dist/launchd-logs.d.ts.map +1 -0
  232. package/dist/launchd-logs.js +1499 -0
  233. package/dist/launchd-logs.js.map +1 -0
  234. package/dist/launchd.d.ts +27 -0
  235. package/dist/launchd.d.ts.map +1 -1
  236. package/dist/launchd.js +89 -10
  237. package/dist/launchd.js.map +1 -1
  238. package/dist/memory-command.d.ts +2 -0
  239. package/dist/memory-command.d.ts.map +1 -1
  240. package/dist/memory-command.js +161 -48
  241. package/dist/memory-command.js.map +1 -1
  242. package/dist/memory-recall-settings.d.ts +64 -0
  243. package/dist/memory-recall-settings.d.ts.map +1 -0
  244. package/dist/memory-recall-settings.js +51 -0
  245. package/dist/memory-recall-settings.js.map +1 -0
  246. package/dist/memory-recall.d.ts +7 -95
  247. package/dist/memory-recall.d.ts.map +1 -1
  248. package/dist/memory-recall.js +8 -143
  249. package/dist/memory-recall.js.map +1 -1
  250. package/dist/memory-rituals.d.ts +3 -3
  251. package/dist/memory-rituals.d.ts.map +1 -1
  252. package/dist/memory-rituals.js +16 -111
  253. package/dist/memory-rituals.js.map +1 -1
  254. package/dist/modules/catalog.js +2 -2
  255. package/dist/modules/catalog.js.map +1 -1
  256. package/dist/modules/known-tools.d.ts +8 -6
  257. package/dist/modules/known-tools.d.ts.map +1 -1
  258. package/dist/modules/known-tools.js +8 -6
  259. package/dist/modules/known-tools.js.map +1 -1
  260. package/dist/notify-destinations.d.ts +5 -0
  261. package/dist/notify-destinations.d.ts.map +1 -1
  262. package/dist/notify-destinations.js +7 -1
  263. package/dist/notify-destinations.js.map +1 -1
  264. package/dist/owner-private-lock.d.ts +95 -0
  265. package/dist/owner-private-lock.d.ts.map +1 -0
  266. package/dist/owner-private-lock.js +566 -0
  267. package/dist/owner-private-lock.js.map +1 -0
  268. package/dist/pi-oauth-login.d.ts +2 -0
  269. package/dist/pi-oauth-login.d.ts.map +1 -1
  270. package/dist/pi-oauth-login.js +39 -5
  271. package/dist/pi-oauth-login.js.map +1 -1
  272. package/dist/posted-message-index.d.ts +35 -16
  273. package/dist/posted-message-index.d.ts.map +1 -1
  274. package/dist/posted-message-index.js +1068 -52
  275. package/dist/posted-message-index.js.map +1 -1
  276. package/dist/posted-reply-history.d.ts +17 -0
  277. package/dist/posted-reply-history.d.ts.map +1 -0
  278. package/dist/posted-reply-history.js +169 -0
  279. package/dist/posted-reply-history.js.map +1 -0
  280. package/dist/proactive-notify.d.ts.map +1 -1
  281. package/dist/proactive-notify.js +6 -4
  282. package/dist/proactive-notify.js.map +1 -1
  283. package/dist/project-skills.d.ts +4 -0
  284. package/dist/project-skills.d.ts.map +1 -1
  285. package/dist/project-skills.js +99 -130
  286. package/dist/project-skills.js.map +1 -1
  287. package/dist/provider-setup.d.ts +0 -1
  288. package/dist/provider-setup.d.ts.map +1 -1
  289. package/dist/provider-setup.js +0 -3
  290. package/dist/provider-setup.js.map +1 -1
  291. package/dist/readiness-probe-worker.d.ts +61 -1
  292. package/dist/readiness-probe-worker.d.ts.map +1 -1
  293. package/dist/readiness-probe-worker.js +49 -56
  294. package/dist/readiness-probe-worker.js.map +1 -1
  295. package/dist/readiness-probe.d.ts +6 -9
  296. package/dist/readiness-probe.d.ts.map +1 -1
  297. package/dist/readiness-probe.js +23 -56
  298. package/dist/readiness-probe.js.map +1 -1
  299. package/dist/redact-secrets.d.ts +15 -0
  300. package/dist/redact-secrets.d.ts.map +1 -0
  301. package/dist/redact-secrets.js +65 -0
  302. package/dist/redact-secrets.js.map +1 -0
  303. package/dist/run-history.js +34 -24
  304. package/dist/run-history.js.map +1 -1
  305. package/dist/runtime-provenance.d.ts +8 -0
  306. package/dist/runtime-provenance.d.ts.map +1 -0
  307. package/dist/runtime-provenance.js +225 -0
  308. package/dist/runtime-provenance.js.map +1 -0
  309. package/dist/sandbox-manager.d.ts +4 -1
  310. package/dist/sandbox-manager.d.ts.map +1 -1
  311. package/dist/sandbox-manager.js +114 -273
  312. package/dist/sandbox-manager.js.map +1 -1
  313. package/dist/secure-file-replace.d.ts +49 -0
  314. package/dist/secure-file-replace.d.ts.map +1 -0
  315. package/dist/secure-file-replace.js +270 -0
  316. package/dist/secure-file-replace.js.map +1 -0
  317. package/dist/seen-conversations.d.ts +32 -5
  318. package/dist/seen-conversations.d.ts.map +1 -1
  319. package/dist/seen-conversations.js +145 -15
  320. package/dist/seen-conversations.js.map +1 -1
  321. package/dist/sessions.d.ts +20 -0
  322. package/dist/sessions.d.ts.map +1 -1
  323. package/dist/sessions.js +41 -6
  324. package/dist/sessions.js.map +1 -1
  325. package/dist/wizard/index.d.ts +2 -2
  326. package/dist/wizard/index.d.ts.map +1 -1
  327. package/dist/wizard/index.js +1 -1
  328. package/dist/wizard/index.js.map +1 -1
  329. package/dist/wizard/presets.d.ts +2 -1
  330. package/dist/wizard/presets.d.ts.map +1 -1
  331. package/dist/wizard/presets.js +2 -1
  332. package/dist/wizard/presets.js.map +1 -1
  333. package/dist/wizard/run.d.ts +0 -26
  334. package/dist/wizard/run.d.ts.map +1 -1
  335. package/dist/wizard/run.js +0 -53
  336. package/dist/wizard/run.js.map +1 -1
  337. package/package.json +21 -16
  338. package/schema/mono-agent.config.schema.json +17 -6
  339. package/skills/mono-agent-composer/SKILL.md +3 -3
  340. package/skills/mono-agent-composer/references/config-blueprint.md +41 -22
  341. package/skills/mono-agent-composer/references/discovery-questions.md +4 -4
  342. package/skills/mono-agent-composer/references/feature-coverage.md +14 -14
  343. package/skills/mono-agent-composer/references/package-map.md +3 -3
  344. package/skills/mono-agent-composer/references/playbooks.md +38 -20
  345. package/skills/mono-agent-composer/references/validation.md +16 -3
@@ -7,9 +7,9 @@ Every framework capability and how a composed agent reaches it. This table is th
7
7
  | Capability | Coverage | Where | Registry config ids |
8
8
  | --- | --- | --- | --- |
9
9
  | Model backends: claude (sdk/cli), codex (cli direct fallback), pi sdk providers (OpenAI, OpenAI-Codex preferred when Pi auth exists, Copilot, OpenRouter, OpenCode-through-Pi, Ollama, LM Studio, ...), plus hand-authored opencode runtime refs (cli, `opencode:<provider>:<model>` via the OpenCode server) | config | `runtime.model` | `runtime.multi-backend` |
10
- | Backup models on retryable provider failure | config | `runtime.fallbackModels` | `runtime.fallback-models` |
10
+ | Backup models on retryable provider failure | config | New configs use `runtime.fallbacks[]` with optional per-route effort. Legacy `runtime.fallbackModels` / `MONO_AGENT_FALLBACK_MODELS` remain compatibility inputs with no removal deadline; do not emit them for new agents | `runtime.fallback-models` |
11
11
  | Route-safety contract for primary and fallback models | config | `runtime.routeSafety`: `uniform` (default) or `per-route-native` | `runtime.route-safety` |
12
- | Execution mode (sdk/cli), effort, max turns, workspace | config + cli | `runtime.executionMode`, `runtime.effort` (`none` / `minimal` / `low` / `medium` / `high` / `xhigh` / `max` / `ultra`; `mono-agent init --effort <level>`; unsupported for direct OpenCode SDK 1.x), `runtime.maxTurns`, `runtime.workspace` | `runtime.execution-modes`, `runtime.effort`, `runtime.max-turns`, `runtime.workspace` |
12
+ | Execution mode (sdk/cli), effort, max turns, workspace | config + cli | `runtime.executionMode`, `runtime.effort` (`none` / `minimal` / `low` / `medium` / `high` / `xhigh` / `max` / `ultra`; `mono-agent init --effort <level>`). Reasoning-capable `pi:*` maps `ultra` to LOW; Pi without reasoning uses OFF. Direct `codex:*` forwards `ultra` unchanged. Mono-agent rejects `ultra` on its Claude SDK route because the pinned SDK public contract ends at `max` (the SDK JavaScript itself forwards the value). The Claude CLI route passes `--effort ultra`, but both tested Claude Code binaries (SDK-bundled 2.1.206 and local 2.1.210) warn that it is unknown, ignore it, and use default effort. Direct OpenCode rejects explicit effort. Ranking above `max` only prevents keyword downgrade. `runtime.maxTurns`, `runtime.workspace` | `runtime.execution-modes`, `runtime.effort`, `runtime.max-turns`, `runtime.workspace` |
13
13
  | Tool-permission posture for CLI backends (direct OpenCode asks/rejects unanswered by default; configure explicitly) | config | `runtime.permissionMode` | `runtime.permission-mode` |
14
14
  | Continuous provider sessions with idle eviction and optional daily rollover | config | `runtime.session.{mode,idleTimeoutMs,rollover,rolloverTimezone,rolloverNotice}` | `runtime.provider-sessions` |
15
15
  | Per-channel run admission/execution bounds | config | `concurrency.maxConcurrentRuns`, `concurrency.maxPendingRuns` | `runtime.concurrency` |
@@ -36,9 +36,9 @@ Every framework capability and how a composed agent reaches it. This table is th
36
36
  | Journal memory (hybrid recall BM25+vector + static canonical salience; needs configured embeddings) | config | `memory.mode: "journal"`, `path`, `memory.embeddings.{provider,endpoint,model,dim,apiKeyEnv}` (`provider: "ollama" \| "lmstudio" \| "openai"`; exclusive, no cross-provider fallback) | `memory.journal` |
37
37
  | BuJo memory (journal + LLM capture/reconcile ADD/UPDATE/SUPERSEDE/NOOP + entity graph + auto-scheduled consolidation; needs embeddings + an app-level `memory.llm`) | config | `memory.mode: "bujo"`, `path`; selected Ollama/LM Studio/OpenAI embeddings are independent from explicit `memory.llm` with `provider: "ollama"` (`model`, optional `endpoint`) or `provider: "agent-host"` (`model` is an SDK runtime model ref, optional `executionMode: "sdk"`) — see `docs/memory/index.md` | `memory.bujo` |
38
38
  | Supermemory external backend (server-side extraction/consolidation; async ingestion; explicitly installed plugin) | config | `memory.backend: "supermemory"`, `memory.writeMode`, `memory.supermemory.{baseUrl,apiKey,apiKeyEnv,container,timeoutMs,exposeMcpServer}`; install the exact matching `@mono-agent/memory-supermemory` version | `memory.backend-supermemory` |
39
- | BuJo consolidation auto-scheduler (projection-only `index.md` refresh + empty `future-log.md` stub + duplicate-group reporting; in-app, no external cron needed) | config | `memory.consolidation.{enabled,cron}` (default `0 */2 * * *`); env `MONO_AGENT_MEMORY_CONSOLIDATION_CRON`, `MONO_AGENT_MEMORY_CONSOLIDATION_ENABLED` | `memory.bujo-consolidation` |
39
+ | BuJo consolidation auto-scheduler (projection-only `index.md` refresh + empty `future-log.md` stub + duplicate-group reporting; in-app, no external cron needed) | config | `memory.consolidation.{enabled,cron}` (five-field UTC, default `0 */2 * * *`, no hashed `H`); env `MONO_AGENT_MEMORY_CONSOLIDATION_CRON`, `MONO_AGENT_MEMORY_CONSOLIDATION_ENABLED` | `memory.bujo-consolidation` |
40
40
  | Memory out-of-band maintenance CLI (rebuild/recall/index/legacy reflect/migrate) | cli | `memory-bujo <subcommand> <root>`; opt-in `MONO_AGENT_MEMORY_EMBEDDINGS_PROVIDER` (`ollama`/`lmstudio`/`openai`), `_MODEL`, and `_DIM` for semantic recall; advanced `migrate` remains Ollama-only, outside guided init, and requires `MONO_AGENT_MEMORY_LLM_MODEL` (optional `_ENDPOINT`) | — |
41
- | Config-aware memory preview CLI (stats/today/show/search/top plus metadata-only audit; 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]` | — |
41
+ | 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]` | — |
42
42
  | 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` | — |
43
43
  | 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` |
44
44
  | 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` |
@@ -52,8 +52,8 @@ Every framework capability and how a composed agent reaches it. This table is th
52
52
  | Built-in tool allow/deny lists (deny wins, even under allow-all; pi doesn't deny external MCP tools) | config | `tools.allowedTools`, `tools.disallowedTools`; built-ins are Read/Write/Edit/Glob/Grep/Bash/WebFetch/WebSearch | `tool-policy.allowlist`, `tool-policy.denylist`, `runtime.builtin-tools` |
53
53
  | MCP servers (stdio/sse/http) from a JSON file | config | `tools.mcpConfigPath` | `tool-policy.mcp-servers` |
54
54
  | 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` |
55
- | 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 | `agent-app.adapter-send-tools` |
56
- | Human-in-the-loop interaction bridge for 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 when `AskUser` or `TelegramAskButtons` 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. | `interaction.bridge` |
55
+ | 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` |
56
+ | Interaction bridge for adapter-send history, 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` or `TelegramAskButtons` 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. | `interaction.bridge` |
57
57
  | Sandbox on/off + srt engine (Pi-owned tools; direct Codex has its own sandbox, Claude/direct OpenCode reject native mono policy) | config | `sandbox.mode` | `sandbox.mode` |
58
58
  | Network policy (none/localhost/allowlist/all) | config | `sandbox.network.{mode,allowlist}` | `sandbox.network-policy` |
59
59
  | Filesystem scopes (readable/writable roots, deny-write globs) | config | `sandbox.readableRoots`, `sandbox.writableRoots`, `sandbox.denyWrite` | `sandbox.filesystem-scopes` |
@@ -64,8 +64,8 @@ Every framework capability and how a composed agent reaches it. This table is th
64
64
 
65
65
  | Capability | Coverage | Where | Registry config ids |
66
66
  | --- | --- | --- | --- |
67
- | Webhook (sync/async HTTP invoke + status polling) | config | `webhook` section; endpoint overrides at `webhook.endpoints[].{model,effort}`; `webhook.maxRunMs` bounds each run | `webhook.http-invoke`, `webhook.run-watchdog` |
68
- | OpenAI-compatible API (/v1/models, /v1/chat/completions, SSE, bearer) | config | `openaiApi` section | `openai-api.chat-completions` |
67
+ | Webhook (sync/async HTTP invoke + status polling + optional bearer) | config | `webhook` section; `apiKey` protects invoke/status and is required with non-loopback opt-in; endpoint overrides at `webhook.endpoints[].{model,effort,maxRunMs}`; endpoint `maxRunMs` wins over the `webhook.maxRunMs` fallback and `0` disables that endpoint watchdog | `webhook.http-invoke`, `webhook.run-watchdog` |
68
+ | OpenAI-compatible API (/v1/models, /v1/chat/completions, SSE, bearer) | config | `openaiApi` section; sampling fields remain request metadata, while non-default values are ignored with a `runtime_warning` and runtime config stays authoritative | `openai-api.chat-completions` |
69
69
  | Telegram long polling and chat allowlist | config | `telegram` section | `telegram.long-polling` |
70
70
  | Telegram command/reaction/button/file interactivity | config | `telegram.commands[]`, `telegram.reactions`, `telegram.quietHours`; `TelegramAskButtons` / `TelegramSendFile` through `tools.allowedTools` | `telegram.interactive` |
71
71
  | 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` |
@@ -78,10 +78,10 @@ Every framework capability and how a composed agent reaches it. This table is th
78
78
  | 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` |
79
79
  | TUI stream endpoint (operator console transport) | config | `tui.{enabled,host,port,basePath,allowNonLoopback,apiKey}`; default on, loopback | `tui.stream-endpoint` |
80
80
  | Live event relay (read-only run-event SSE for web) | config | `live.{enabled,host,port,basePath,allowNonLoopback,apiKey}`; default on, loopback | `live.event-relay` |
81
- | Cron jobs (five-field expressions, timezones, overlap skip) | config | `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.scheduled-prompts` |
81
+ | 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/`); queue/replace controls are programmatic-only `startCronAdapter` options | `cron.scheduled-prompts` |
82
82
  | Cron per-run watchdog | config + code | `cron.jobs[].maxRunMs` or `maxRunMs` frontmatter; programmatic adapter fallback via `startCronAdapter({ maxRunMs })` | `cron.run-watchdog` |
83
83
  | Per-trigger runtime model and effort overrides | config + code | `cron.jobs[].{model,effort}`; `webhook.endpoints[].{model,effort}` plus request body `{model,effort}` (request wins) | `runtime.per-trigger-model` |
84
- | 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. Cron model-exhaustion notices require an explicit `notifyConversationId` and never infer; `notifyFailureCooldownHours` rate-limits them. | `channel.native-notify` |
84
+ | 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` |
85
85
  | Channel message texts / stream tuning (welcome, debounce, ...) | code | channel driver overrides | — |
86
86
  | Custom transports | config + code | implement `ChannelDriver` and expose it through `channels.plugins[]`, or pass it via `startMonoAgentApp({ drivers })` | `channel.custom` |
87
87
 
@@ -89,17 +89,17 @@ Every framework capability and how a composed agent reaches it. This table is th
89
89
 
90
90
  | Capability | Coverage | Where | Registry config ids |
91
91
  | --- | --- | --- | --- |
92
- | JSONL run artifacts (events + summaries, secrets redacted) | config | `artifacts.dir`, `artifacts.retention`, `artifacts.memoryRetention` | `observability.jsonl-artifacts` |
92
+ | JSONL run artifacts (events + summaries; strings capped; non-numeric values under sensitive-looking object keys are redacted; numeric values under matched keys are retained; free text is not content-scanned) | config | `artifacts.dir`, `artifacts.retention`, `artifacts.memoryRetention` | `observability.jsonl-artifacts` |
93
93
  | Trace-source registry (heartbeat manifests `mono-agent status` reads) | config | `traceability.{registryDir,sourceId,sourceLabel,heartbeatMs,staleAfterMs,globalDiscovery}` | `observability.trace-registry` |
94
- | Phoenix trace viewer (OTLP exporter; local JSONL artifacts are the fallback) | config | `observability.exporters` (phoenix entry) | `observability.phoenix-exporter` |
94
+ | 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` |
95
95
  | Operator console (live chat with thinking/tool/telemetry insight, run replay, config view) | cli | `mono-agent tui [--agent <label>]`; agents serve the `tui` stream endpoint by default (`tui.enabled`, loopback) | — |
96
96
  | Managed proposal-only configuration conversation | cli + tool | macOS `mono-agent tui --configure` attaches to the authoritative background agent; `/configure`; separate configuration/ordinary conversation ids; host-gated `ProposeAgentConfiguration`; approval restarts and waits for readiness, failed start rolls files/agent back. `--local` is ordinary chat only; off macOS configuration is manual | — |
97
97
  | Session Recorder web PWA (read-only run browser) | cli | `mono-agent web [--host <addr>] [--port <n>] [--no-open] [--allow-non-loopback] [--show-auth-url] [--include-memory] [--max-runs <n>] [--config <path>] [--env-file <path>]`; package `@mono-agent/session-web`; non-loopback/non-interactive auth uses `MONO_AGENT_WEB_AUTH_TOKEN` | — |
98
- | Setup presets (saved answer-sets: generate config + `.env.example` + checklist) | cli | `mono-agent presets list\|show <id>`, `mono-agent init --preset <id> --yes` (`recipes`/`--recipe` deprecated aliases) | — |
98
+ | Setup presets (saved answer-sets: generate config + `.env.example` + checklist) | cli | `mono-agent presets list\|show <id>`, `mono-agent init --preset <id> --yes` (`recipes`/`--recipe` deprecated aliases removed in v2.0.0) | — |
99
99
  | 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 temporary configuration) | 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 | — |
100
100
  | 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 | — |
101
101
  | Resolved config view (every field tagged env/json/default) | cli | `mono-agent config` | — |
102
- | Scaffold / validate / start / install-skill | cli | `mono-agent init [--model <ref>] [--fallback-models <csv>] [--effort <level>] [--auth]\|validate [--consumer <path>]\|config\|presets\|start\|install-skill` | — |
102
+ | 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`; legacy CLI `--fallback-models <csv>` is removed in v2.0.0 | — |
103
103
  | Preset capability check (selected preset live?) | cli | `mono-agent validate --preset <id>` | — |
104
104
  | `.env` auto-loading | cli | automatic; `--env-file <path>` | — |
105
105
  | Explicit failure objects (no fake success) | auto | harness | — |
@@ -101,7 +101,7 @@ Communication adapters are edge packages. They accept an `AgentResponder` and ow
101
101
  | OpenAI-compatible API | `@mono-agent/openai-api-adapter` | `curl /v1/models` and `/v1/chat/completions` |
102
102
  | Operator endpoints | `@mono-agent/operator-adapter` | `mono-agent tui` connects; `mono-agent web` observes live runs |
103
103
  | A2A provider/consumer | `@mono-agent/a2a-adapter` (external channel plugin) | Send text to the Agent Card URL |
104
- | Webhook | `@mono-agent/webhook-adapter` | `curl` the configured invocation path |
104
+ | Webhook | `@mono-agent/webhook-adapter` | `curl` the configured invocation path (with `Authorization: Bearer ...` when `apiKey` is set) |
105
105
  | Cron | `@mono-agent/cron-adapter` | One scheduled or manually triggered invocation |
106
106
 
107
107
  Adapters must not import the harness, runtime adapter, memory package (`@mono-agent/memory` subpaths), or other adapters. `@mono-agent/agent-app` composes them from config; custom hosts and demos may compose them directly.
@@ -110,12 +110,12 @@ Adapters must not import the harness, runtime adapter, memory package (`@mono-ag
110
110
 
111
111
  Use:
112
112
 
113
- - `@mono-agent/tui` for the pi-tui operator console (`mono-agent tui`): live chat with full stream-event insight, recorded-run replay, config view.
113
+ - `@mono-agent/tui` for the pi-tui operator console (`mono-agent tui`): live chat with structured stream-event insight, recorded-run replay, and config view. Remote event frames have a strict 256 KiB UTF-8 NDJSON cap: assistant-thought/tool-call payload fields are reduced and remeasured, while another oversized variant or a reducible event whose minimal form still does not fit becomes a bounded `oversized_event` marker. Other frame kinds are unaffected, and replay contains only key-redacted, capped events that reached terminal JSONL persistence.
114
114
  - `@mono-agent/session-web` for the read-only Session Recorder web PWA served by `mono-agent web`, including local artifact paging and live relay aggregation.
115
115
  - `@mono-agent/operator-adapter` for the loopback NDJSON stream endpoint the console connects to (`tui` config section, on by default) and the live SSE endpoint `mono-agent web` observes (`live` config section, on by default).
116
116
  - `@mono-agent/observability` for JSONL event artifacts, summaries, trace-source registration, and the `@mono-agent/observability/otel` Phoenix OTLP exporter configured via `observability.exporters`.
117
117
 
118
- Traceability is local-first. A running host registers a source manifest; `mono-agent status` reads the trace-source registry to report live sources, and artifacts are keyed by `(sourceId, runId)` so duplicate run ids do not collide. Phoenix is the recommended trace viewer when an `observability.exporters` (phoenix) entry is configured; local JSONL artifacts are the fallback otherwise.
118
+ Traceability is local-first. A running host registers a source manifest; `mono-agent status` reads the trace-source registry to report live sources, and artifacts are keyed by `(sourceId, runId)` so duplicate run ids do not collide. Phoenix is the recommended trace viewer when an `observability.exporters` (phoenix) entry is configured; its terminal-batched export is best-effort. Independently, the local recorder writes empty events plus a `running` summary at start and a key-redacted, capped snapshot at finish/fail. Events stay in RAM between those boundaries, so a crash can lose them. Without Phoenix, those bounded terminal JSONL snapshots are the only local run record.
119
119
 
120
120
  ## Multi-Agent Join
121
121
 
@@ -16,10 +16,12 @@ Flow, check whether one of these fits and adapt it. Verify every key against
16
16
  **Goal:** a Telegram bot (long polling) that captures every turn into BuJo memory with scheduled consolidation and recalls past notes semantically.
17
17
  **Features:** `telegram.long-polling`, `channel.final-only-delivery`, `memory.bujo`, `memory.per-turn-capture`, `memory.bujo-consolidation`, `memory.recall-tool`, `memory.embeddings`.
18
18
 
19
+ Put `MONO_AGENT_TELEGRAM_BOT_TOKEN=...` in `.env`; the source config omits the credential.
20
+
19
21
  ```json
20
22
  {
21
23
  "runtime": { "model": "pi:openai-codex:gpt-5.6-terra" },
22
- "telegram": { "enabled": true, "botToken": "...", "allowedChatIds": ["123456789"] },
24
+ "telegram": { "enabled": true, "allowedChatIds": ["123456789"] },
23
25
  "memory": {
24
26
  "mode": "bujo", "path": "./.mono-agent/memory", "writeMode": "capture",
25
27
  "embeddings": { "provider": "ollama", "model": "nomic-embed-text:v1.5", "endpoint": "http://localhost:11434", "dim": 768 },
@@ -36,10 +38,12 @@ Flow, check whether one of these fits and adapt it. Verify every key against
36
38
  **Goal:** a mention-triggered Slack Socket Mode bot with a custom MCP tool, Read/Grep, and `SlackSendMessage` for proactive posts.
37
39
  **Features:** `slack.socket-mode`, `tool-policy.allowlist`, `tool-policy.mcp-servers`, `agent-app.adapter-send-tools`, `runtime.concurrency`.
38
40
 
41
+ Put `MONO_AGENT_SLACK_BOT_TOKEN` and `MONO_AGENT_SLACK_APP_TOKEN` in `.env`; the source config omits credentials.
42
+
39
43
  ```json
40
44
  {
41
45
  "runtime": { "model": "pi:openai-codex:gpt-5.6-terra" },
42
- "slack": { "enabled": true, "botToken": "xoxb-...", "appToken": "xapp-...", "allowedChannelIds": ["C012345"], "botUserIds": ["U012345"], "mentionTextAliases": ["@agent"] },
46
+ "slack": { "enabled": true, "allowedChannelIds": ["C012345"], "botUserIds": ["U012345"], "mentionTextAliases": ["@agent"] },
43
47
  "tools": { "allowedTools": ["Read", "Grep", "SlackSendMessage", "deployTool"], "mcpConfigPath": "./mcp.json" },
44
48
  "concurrency": { "maxConcurrentRuns": 4, "maxPendingRuns": 8 }
45
49
  }
@@ -103,12 +107,14 @@ Flow, check whether one of these fits and adapt it. Verify every key against
103
107
  **Goal:** a timezone-aware cron job that builds a daily digest with shared history and delivers its final answer verbatim through native notification.
104
108
  **Features:** `cron.scheduled-prompts`, `channel.native-notify`, `slack.socket-mode`, `memory.journal`.
105
109
 
106
- **Destination resolution:** an explicit `notifyConversationId` wins; otherwise mono-agent infers only when exactly one notify-capable Telegram/Slack candidate exists. With 0 or 2+ candidates delivery is skipped with a warning. Cron model-exhaustion notices require an explicit `notifyConversationId` and never infer a destination.
110
+ **Destination resolution:** an explicit `notifyConversationId` wins; otherwise mono-agent infers only when exactly one notify-capable Telegram/Slack candidate exists. With 0 or 2+ candidates delivery is skipped with a warning. Artifact-derived candidates are cached for 30 seconds after each scan completes. An artifact committed under a Telegram/Slack conversation id invalidates the cache immediately; runs using the default synthetic `cron:`/`webhook:` ids do not. Other artifact changes are picked up after cache expiry and the next scan completes. Cron model-exhaustion notices require an explicit `notifyConversationId` and never infer a destination.
111
+
112
+ Put `MONO_AGENT_SLACK_BOT_TOKEN` and `MONO_AGENT_SLACK_APP_TOKEN` in `.env`; the source config omits credentials.
107
113
 
108
114
  ```json
109
115
  {
110
116
  "runtime": { "model": "claude:claude-sonnet-4-6" },
111
- "slack": { "enabled": true, "botToken": "xoxb-...", "appToken": "xapp-...", "allowedChannelIds": ["C012345"] },
117
+ "slack": { "enabled": true, "allowedChannelIds": ["C012345"] },
112
118
  "cron": { "jobs": [{ "id": "morning-digest", "enabled": true, "expression": "0 9 * * *", "timezone": "America/New_York", "prompt": "Build the morning digest. Your final answer is the digest to notify.", "conversationId": "daily-digest", "notify": true, "notifyConversationId": "slack:C012345" }] }
113
119
  }
114
120
  ```
@@ -128,16 +134,17 @@ Flow, check whether one of these fits and adapt it. Verify every key against
128
134
  "id": "a2a",
129
135
  "config": {
130
136
  "enabled": true,
131
- "provider": { "host": "127.0.0.1", "port": 4201, "requireBearer": true, "bearerToken": "...", "idempotency": { "namespace": "research-production", "retentionMs": 2592000000, "maxRecords": 10000 } },
137
+ "provider": { "host": "127.0.0.1", "port": 4201, "requireBearer": true, "idempotency": { "namespace": "research-production", "retentionMs": 2592000000, "maxRecords": 10000 } },
132
138
  "agent": { "name": "Research Agent", "description": "Does research.", "version": "0.1.0" },
133
139
  "skill": { "id": "research", "name": "Research", "description": "Web research", "tags": ["research"] },
134
- "consumer": { "remoteAgentUrls": ["http://127.0.0.1:4201"], "defaultRemoteAgentUrl": "http://127.0.0.1:4201", "bearerToken": "...", "timeoutMs": 30000 }
140
+ "consumer": { "remoteAgentUrls": ["http://127.0.0.1:4201"], "defaultRemoteAgentUrl": "http://127.0.0.1:4201", "timeoutMs": 30000 }
135
141
  }
136
142
  }]
137
143
  }
138
144
  }
139
145
  ```
140
- **Steps:** provider `init`, add the `@mono-agent/a2a-adapter` plugin entry with `provider`/`agent`/`skill` + bearer; for paid/non-repeatable calls choose a reviewed stable `provider.idempotency.namespace`; `validate`, `start`, confirm the Agent Card is reachable. Consumer — set plugin `config.consumer` (or compose `createA2AConsumerResponder`), then pass the existing logical dispatch id through `idempotencyKey` / `idempotencyKeyForRequest` rather than generating one per attempt.
146
+ **Credentials:** put `MONO_AGENT_A2A_BEARER_TOKEN` in the provider's `.env` and `MONO_AGENT_A2A_CONSUMER_BEARER_TOKEN` in the consumer's `.env`; source config omits both tokens.
147
+ **Steps:** provider — `init`, add the `@mono-agent/a2a-adapter` plugin entry with `provider`/`agent`/`skill` + env-backed bearer; for paid/non-repeatable calls choose a reviewed stable `provider.idempotency.namespace`; `validate`, `start`, confirm the Agent Card is reachable. Consumer — set plugin `config.consumer` (or compose `createA2AConsumerResponder`), then pass the existing logical dispatch id through `idempotencyKey` / `idempotencyKeyForRequest` rather than generating one per attempt.
141
148
  **Smoke:** repeat one keyed message to the provider's Agent Card URL with the bearer; confirm the same task/result is returned and the responder runs once.
142
149
 
143
150
  ## 8. Multi-agent orchestration (`AskCollaborator`) — code
@@ -146,15 +153,23 @@ Flow, check whether one of these fits and adapt it. Verify every key against
146
153
  **Features:** `orchestrator.ask-collaborator`, `harness.request-runtime-options`, `runtime.custom`.
147
154
 
148
155
  ```ts
149
- const ext = createCollaboratorToolRuntimeExtension({
150
- collaborators: [
151
- { id: "researcher", label: "Research", responder: researcher },
152
- { id: "writer", label: "Writer", responder: writer },
153
- ],
154
- conversationId, maxCalls: 10,
156
+ const orchestrator = await createConfiguredAgentResponder({
157
+ config,
158
+ runtimeOptionsForRequest: async (input) => {
159
+ const extension = await createCollaboratorToolRuntimeExtension({
160
+ collaborators: [
161
+ { id: "researcher", label: "Research", responder: researcher },
162
+ { id: "writer", label: "Writer", responder: writer },
163
+ ],
164
+ conversationId: input.request.conversationId,
165
+ originalUserMessage: input.request.userMessage,
166
+ abortSignal: input.request.abortSignal,
167
+ maxCalls: 10,
168
+ });
169
+ // The harness invokes cleanup after success, failure, or request abort.
170
+ return { runtimeOptions: extension.runtimeOptions, cleanup: extension.cleanup };
171
+ },
155
172
  });
156
- // pass ext.runtimeOptions via createConfiguredAgentResponder({ runtimeOptionsForRequest })
157
- // call ext.cleanup() on disposal to close the ephemeral MCP server
158
173
  ```
159
174
  **Smoke:** give a compound task ("research X then write a summary"); confirm the artifact shows `AskCollaborator` delegating to both, and `cleanup()` closes the MCP port.
160
175
 
@@ -175,7 +190,7 @@ const ext = createCollaboratorToolRuntimeExtension({
175
190
 
176
191
  ## 10. Phoenix-observed agent with the TUI
177
192
  **For:** an agent builder evaluating runs in a tracing dashboard.
178
- **Goal:** run locally with the TUI and stream every run to Phoenix as OpenInference spans; local JSONL is the fallback.
193
+ **Goal:** run locally with the TUI, attempt a best-effort terminal-batched Phoenix export, and retain a key-redacted, capped local JSONL snapshot after terminal persistence. A pre-terminal crash can omit the Phoenix batch and lose RAM-buffered JSONL events.
179
194
  **Features:** `observability.phoenix-exporter`, `observability.jsonl-artifacts`, `observability.trace-registry`, `tui.chat`.
180
195
 
181
196
  ```json
@@ -183,11 +198,11 @@ const ext = createCollaboratorToolRuntimeExtension({
183
198
  "runtime": { "model": "claude:claude-sonnet-4-6" },
184
199
  "artifacts": { "dir": ".mono-agent/artifacts" },
185
200
  "traceability": { "registryDir": ".mono-agent/trace-sources", "sourceId": "my-agent", "heartbeatMs": 10000 },
186
- "observability": { "exporters": [{ "type": "phoenix", "endpoint": "http://127.0.0.1:6006/v1/traces", "projectName": "my-project", "includeSensitiveData": false, "timeoutMs": 5000 }] }
201
+ "observability": { "exporters": [{ "type": "phoenix", "endpoint": "http://127.0.0.1:6006/v1/traces", "projectName": "my-project", "includeSensitiveData": false, "contentPatternRedaction": false, "timeoutMs": 5000 }] }
187
202
  }
188
203
  ```
189
204
  **Steps:** start Phoenix (6006) → `init` → add artifacts/traceability/exporter → `validate` (POSTs an empty protobuf) → `start` (prints the Phoenix endpoint) → `mono-agent tui`.
190
- **Smoke:** complete a TUI prompt; confirm a redacted JSONL artifact AND a Phoenix trace with merged tool spans under the project.
205
+ **Smoke:** complete a TUI prompt; confirm a JSONL artifact AND a Phoenix trace with merged tool spans under the project. Artifact/export strings are capped; non-numeric values under sensitive-looking object keys are redacted; numeric values under matched keys are retained; free text is not content-scanned or scrubbed.
191
206
 
192
207
  ## 11. Backfill historical runs to Phoenix
193
208
  **For:** an ops engineer onboarding observability after the fact.
@@ -208,11 +223,14 @@ const ext = createCollaboratorToolRuntimeExtension({
208
223
 
209
224
  ```json
210
225
  {
211
- "runtime": { "model": "claude:claude-sonnet-4-6", "fallbackModels": ["pi:openai-codex:gpt-5.5", "pi:ollama:gemma4:31b"], "session": { "mode": "continuous" } },
226
+ "runtime": { "model": "claude:claude-sonnet-4-6", "fallbacks": [{ "model": "pi:openai-codex:gpt-5.5" }, { "model": "pi:ollama:gemma4:31b" }], "session": { "mode": "continuous" } },
212
227
  "providers": { "local": [{ "id": "ollama", "type": "ollama", "baseUrl": "http://localhost:11434", "enabled": true }], "piNative": { "transport": "auto", "piMaxRetries": 2, "maxRetryDelayMs": 60000, "piSessionsRoot": ".mono-agent/sessions" } }
213
228
  }
214
229
  ```
215
- **Steps:** `ollama pull gemma4:31b` → `mono-agent init --model claude:claude-sonnet-4-6 --fallback-models pi:openai-codex:gpt-5.5,pi:ollama:gemma4:31b` add `providers.local` + `piNative.piSessionsRoot` → `validate` → `start`.
230
+ Legacy `runtime.fallbackModels` and `MONO_AGENT_FALLBACK_MODELS` remain supported
231
+ with no removal deadline, but this playbook intentionally emits the canonical
232
+ per-route form for a new agent.
233
+ **Steps:** `ollama pull gemma4:31b` → `mono-agent init --model claude:claude-sonnet-4-6 --fallback pi:openai-codex:gpt-5.5 --fallback pi:ollama:gemma4:31b` → add `providers.local` + `piNative.piSessionsRoot` → `validate` → `start`.
216
234
  **Boundary:** this mixed Pi/Claude chain intentionally omits the native mono-agent sandbox. Keep direct Codex chains all-direct; keep every route on Pi (including `pi:opencode-go:*`, not direct `opencode:*`) when `sandbox.mode` is `native`.
217
235
  **Smoke:** force a retryable primary failure; confirm the run result reports failover to the next model (not silent) and the conversation resumes from the transcript tail.
218
236
 
@@ -10,7 +10,20 @@ In the user's agent folder:
10
10
  mono-agent validate
11
11
  ```
12
12
 
13
- The report covers core config, runtime support for the primary and every fallback model, identity/skills/memory/MCP paths, the sandbox policy, the observability section (artifacts, traceability, and any configured exporters), and every channel (`ok` / `waiting` / `off` / `error`). Exit 0 means the folder is ready to start. Fix every `[error]`; `[waiting]` channels are simply unconfigured.
13
+ The report covers core config, runtime support for the primary and every
14
+ fallback model, identity/skills/memory/MCP paths, the sandbox policy,
15
+ observability (artifacts, traceability, and configured exporters), runs health,
16
+ managed launchd logs, secret placement, and every channel (`ok` / `waiting` /
17
+ `disabled` / `error`). Its Runtime provenance section identifies the CLI
18
+ producing the report by a full managed closure id only after validating its
19
+ private marker, freshly recomputed installed closure, and coherent current
20
+ closure manifest, or reports `dev (unmanaged)`; under `--consumer`, that is
21
+ still the validator CLI rather than a separately running daemon. The launchd-log
22
+ section reports active, retained, and total bytes for safely inspected streams,
23
+ marks unsafe or unreadable byte inventory unavailable, and never rotates or
24
+ changes permissions. Exit 0 means the folder is structurally valid; fix every
25
+ `[error]`, and treat `[waiting]` as an unresolved selected dependency rather
26
+ than a readiness claim.
14
27
 
15
28
  From a separate orchestration folder, validate a downstream consumer without changing cwd:
16
29
 
@@ -83,13 +96,13 @@ pnpm run test:demo
83
96
  | TUI | Start the host, connect with ordinary `mono-agent tui`, and complete one real prompt against the running responder. |
84
97
  | Telegram | Send one allowed chat message and verify the reply. |
85
98
  | Slack | Send one allowed DM or channel message and verify formatting. |
86
- | Adapter send tools | When `SlackSendMessage` / `TelegramSendMessage` are available (allow-all, or an explicit `tools.allowedTools` entry) with the channel enabled, call them from a non-Slack/Telegram surface such as TUI, cron, or OpenAI API to an allowed destination and verify delivery. |
99
+ | Adapter send tools | When `SlackSendMessage` / `TelegramSendMessage` are available (allow-all, or an explicit `tools.allowedTools` entry) with the channel enabled, call them from a non-Slack/Telegram surface such as TUI, cron, or OpenAI API to an allowed destination; verify delivery, then reply at the destination and verify the exact sent text appears in replayed history. |
87
100
  | WhatsApp | Send one allowed sender/group trigger and verify the reply. |
88
101
  | OpenAI API | `curl /v1/models` and `/v1/chat/completions`. |
89
102
  | A2A | Send text to the Agent Card URL with `sendA2AMessage()`. |
90
103
  | Webhook | `curl` the invocation path and inspect the response body/status. |
91
104
  | Cron | Run a one-off scheduled invocation or wait for one tick. |
92
- | Observability | Confirm a run writes a redacted JSONL artifact; if an `observability.exporters` Phoenix entry is set, confirm the trace appears in Phoenix. |
105
+ | Observability | Confirm a run writes a JSONL artifact with strings capped: non-numeric values under sensitive-looking object keys are redacted; numeric values under matched keys are retained; free text is not content-scanned. If an `observability.exporters` Phoenix entry is set, confirm the trace appears in Phoenix. |
93
106
  | Memory recall tool | With any memory tier configured (`memory.recallTool.enabled` defaults on), ask the agent to recall an old note and confirm `MemoryRecall` appears separately from action-tool allowlists and returns it. |
94
107
  | Semantic memory search | With `memory.embeddings` set, first prove the configured provider only: Ollama model advertises `embedding` through `/api/show` and answers `/api/embed`, or LM Studio model has exact `type: "embedding"` in `/api/v1/models` and answers `/v1/embeddings`. Verify the finite vector dimension matches config, then ask a paraphrased question about an old note and confirm `MemoryRecall` returns it. Never accept a cross-provider fallback as proof. |
95
108