@mono-agent/agent-app 0.3.0 → 0.4.0

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 (68) hide show
  1. package/README.md +9 -5
  2. package/dist/adapter-send-tools-main.d.ts +3 -0
  3. package/dist/adapter-send-tools-main.d.ts.map +1 -0
  4. package/dist/adapter-send-tools-main.js +20 -0
  5. package/dist/adapter-send-tools-main.js.map +1 -0
  6. package/dist/adapter-send-tools.d.ts +59 -0
  7. package/dist/adapter-send-tools.d.ts.map +1 -0
  8. package/dist/adapter-send-tools.js +254 -0
  9. package/dist/adapter-send-tools.js.map +1 -0
  10. package/dist/app-config.d.ts +40 -17
  11. package/dist/app-config.d.ts.map +1 -1
  12. package/dist/app-config.js +188 -68
  13. package/dist/app-config.js.map +1 -1
  14. package/dist/app.d.ts +41 -20
  15. package/dist/app.d.ts.map +1 -1
  16. package/dist/app.js +250 -91
  17. package/dist/app.js.map +1 -1
  18. package/dist/backfill.d.ts +79 -0
  19. package/dist/backfill.d.ts.map +1 -0
  20. package/dist/backfill.js +246 -0
  21. package/dist/backfill.js.map +1 -0
  22. package/dist/background.d.ts +0 -4
  23. package/dist/background.d.ts.map +1 -1
  24. package/dist/background.js +78 -50
  25. package/dist/background.js.map +1 -1
  26. package/dist/channels.d.ts +7 -0
  27. package/dist/channels.d.ts.map +1 -1
  28. package/dist/channels.js +26 -3
  29. package/dist/channels.js.map +1 -1
  30. package/dist/cli.d.ts +52 -3
  31. package/dist/cli.d.ts.map +1 -1
  32. package/dist/cli.js +315 -111
  33. package/dist/cli.js.map +1 -1
  34. package/dist/doctor.d.ts +8 -0
  35. package/dist/doctor.d.ts.map +1 -1
  36. package/dist/doctor.js +148 -48
  37. package/dist/doctor.js.map +1 -1
  38. package/dist/index.d.ts +6 -4
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/launchd.d.ts +0 -2
  43. package/dist/launchd.d.ts.map +1 -1
  44. package/dist/launchd.js +0 -2
  45. package/dist/launchd.js.map +1 -1
  46. package/dist/memory-recall-main.d.ts +3 -0
  47. package/dist/memory-recall-main.d.ts.map +1 -0
  48. package/dist/memory-recall-main.js +30 -0
  49. package/dist/memory-recall-main.js.map +1 -0
  50. package/dist/memory-recall.d.ts +111 -0
  51. package/dist/memory-recall.d.ts.map +1 -0
  52. package/dist/memory-recall.js +275 -0
  53. package/dist/memory-recall.js.map +1 -0
  54. package/dist/sessions.d.ts +21 -0
  55. package/dist/sessions.d.ts.map +1 -0
  56. package/dist/sessions.js +45 -0
  57. package/dist/sessions.js.map +1 -0
  58. package/dist/ui.d.ts +54 -0
  59. package/dist/ui.d.ts.map +1 -0
  60. package/dist/ui.js +153 -0
  61. package/dist/ui.js.map +1 -0
  62. package/package.json +22 -17
  63. package/skills/mono-agent-composer/SKILL.md +6 -5
  64. package/skills/mono-agent-composer/references/config-blueprint.md +37 -18
  65. package/skills/mono-agent-composer/references/discovery-questions.md +38 -23
  66. package/skills/mono-agent-composer/references/feature-coverage.md +12 -9
  67. package/skills/mono-agent-composer/references/package-map.md +5 -5
  68. package/skills/mono-agent-composer/references/validation.md +5 -4
package/dist/ui.js ADDED
@@ -0,0 +1,153 @@
1
+ import process from "node:process";
2
+ /**
3
+ * Tiny zero-dependency terminal styling layer for the CLI. Every helper returns
4
+ * a plain string, so callers can keep writing through `process.stdout.write` or
5
+ * the injected `deps.stdout`/`deps.stderr` sinks in background.ts. Color is a
6
+ * single global decision keyed on the REAL process stdout (see
7
+ * {@link computeColorEnabled}); when it is off — piped output, `NO_COLOR`, or a
8
+ * non-TTY test harness — every styling helper degrades to plain ASCII so logs
9
+ * and test assertions stay greppable.
10
+ */
11
+ const ANSI = {
12
+ reset: "",
13
+ bold: "",
14
+ dim: "",
15
+ red: "",
16
+ green: "",
17
+ yellow: "",
18
+ cyan: "",
19
+ gray: "",
20
+ };
21
+ /**
22
+ * Decide whether ANSI color should be emitted. `NO_COLOR` (any value) always
23
+ * wins per the no-color.org convention; `FORCE_COLOR` forces the decision when
24
+ * set to a recognized truthy/falsy value; otherwise color follows the TTY-ness
25
+ * of the stream. Pure and env-injected so it is trivially testable.
26
+ */
27
+ export function computeColorEnabled(env, isTty) {
28
+ if (env.NO_COLOR !== undefined) {
29
+ return false;
30
+ }
31
+ const force = env.FORCE_COLOR;
32
+ if (force === "1" || force === "true") {
33
+ return true;
34
+ }
35
+ if (force === "0" || force === "false") {
36
+ return false;
37
+ }
38
+ return Boolean(isTty);
39
+ }
40
+ const colorEnabled = computeColorEnabled(process.env, process.stdout.isTTY);
41
+ export function isColorEnabled() {
42
+ return colorEnabled;
43
+ }
44
+ function paint(code, text) {
45
+ return colorEnabled ? `${code}${text}${ANSI.reset}` : text;
46
+ }
47
+ /** Color/weight helpers. Each is the identity function when color is disabled. */
48
+ export const style = {
49
+ bold: (text) => paint(ANSI.bold, text),
50
+ dim: (text) => paint(ANSI.dim, text),
51
+ red: (text) => paint(ANSI.red, text),
52
+ green: (text) => paint(ANSI.green, text),
53
+ yellow: (text) => paint(ANSI.yellow, text),
54
+ cyan: (text) => paint(ANSI.cyan, text),
55
+ gray: (text) => paint(ANSI.gray, text),
56
+ };
57
+ const BADGES = {
58
+ ok: { glyph: "✓", paint: style.green, plain: "[ok] " },
59
+ waiting: { glyph: "⚠", paint: style.yellow, plain: "[wait] " },
60
+ disabled: { glyph: "○", paint: style.dim, plain: "[off] " },
61
+ error: { glyph: "✗", paint: style.red, plain: "[error]" },
62
+ };
63
+ /**
64
+ * Render a status badge as a fixed-width prefix (badge + trailing space). With
65
+ * color on it is a green/yellow/dim/red glyph; with color off it falls back to
66
+ * an equal-width ASCII tag so columns still line up in plain output.
67
+ */
68
+ export function badge(status) {
69
+ const spec = BADGES[status];
70
+ return colorEnabled ? `${spec.paint(spec.glyph)} ` : `${spec.plain} `;
71
+ }
72
+ /**
73
+ * Render aligned `label value` rows: labels are padded to the widest label so
74
+ * values line up, replacing the hand-tuned `padEnd` blocks. `indent` prefixes
75
+ * every row with that many spaces (used to nest rows under a section rule).
76
+ * Returns one string with a trailing newline per row (empty when there are no
77
+ * rows).
78
+ */
79
+ export function keyValue(rows, indent = 0) {
80
+ if (rows.length === 0) {
81
+ return "";
82
+ }
83
+ const pad = " ".repeat(indent);
84
+ const width = rows.reduce((max, [label]) => Math.max(max, label.length), 0);
85
+ return rows
86
+ .map(([label, value]) => `${pad}${style.gray(label.padEnd(width))} ${value}\n`)
87
+ .join("");
88
+ }
89
+ const RULE_FALLBACK_WIDTH = 44;
90
+ const RULE_MAX_WIDTH = 72;
91
+ /**
92
+ * A horizontal section divider, optionally labeled — `── instance ────────`.
93
+ * Width tracks the terminal (read at call time so resizes are honored), capped
94
+ * for readability and falling back to a fixed width when stdout is not a TTY.
95
+ * Rendered dim/gray (identity when color is off); the label appears verbatim so
96
+ * it stays greppable. Always ends with a newline.
97
+ */
98
+ export function rule(label) {
99
+ const width = Math.min(process.stdout.columns ?? RULE_FALLBACK_WIDTH, RULE_MAX_WIDTH);
100
+ if (label === undefined) {
101
+ return `${style.gray("─".repeat(width))}\n`;
102
+ }
103
+ const prefix = `── ${label} `;
104
+ const fill = Math.max(0, width - prefix.length);
105
+ return `${style.gray(`${prefix}${"─".repeat(fill)}`)}\n`;
106
+ }
107
+ /** Badge for a channel status *kind* string (running/waiting…/disabled/error). */
108
+ export function channelBadge(kind) {
109
+ if (kind === "running") {
110
+ return badge("ok");
111
+ }
112
+ if (kind.startsWith("waiting")) {
113
+ return badge("waiting");
114
+ }
115
+ if (kind === "disabled") {
116
+ return badge("disabled");
117
+ }
118
+ if (/error|fail|crash/u.test(kind)) {
119
+ return badge("error");
120
+ }
121
+ return badge("waiting");
122
+ }
123
+ /** Badge for a trace-source health word (running/stale/stopped/…). */
124
+ export function healthBadge(health) {
125
+ switch (health) {
126
+ case "running":
127
+ return badge("ok");
128
+ case "stale":
129
+ return badge("waiting");
130
+ case "stopped":
131
+ return badge("disabled");
132
+ default:
133
+ return badge("error");
134
+ }
135
+ }
136
+ /** A bold/cyan section heading with a trailing newline. */
137
+ export function heading(text) {
138
+ return `${style.bold(style.cyan(text))}\n`;
139
+ }
140
+ /** The CLI title block: bold title plus an optional dim subtitle. */
141
+ export function banner(title, subtitle) {
142
+ const head = style.bold(style.cyan(title));
143
+ return subtitle === undefined ? `${head}\n` : `${head} ${style.dim(`— ${subtitle}`)}\n`;
144
+ }
145
+ /** A red error line (✗ prefix) with a trailing newline — write to stderr. */
146
+ export function errorLine(message) {
147
+ return `${style.red(`✗ ${message}`)}\n`;
148
+ }
149
+ /** A dim hint line (→ prefix) with a trailing newline. */
150
+ export function hint(message) {
151
+ return `${style.dim(`→ ${message}`)}\n`;
152
+ }
153
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mono-agent/agent-app",
3
- "version": "0.3.0",
4
- "description": "Config-first mono-agent host: builds a responder and starts every configured communication channel, operator console, and traceability from one mono-agent.config.json.",
3
+ "version": "0.4.0",
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": "UNLICENSED",
7
7
  "private": false,
@@ -14,7 +14,8 @@
14
14
  }
15
15
  },
16
16
  "bin": {
17
- "mono-agent": "./dist/cli.js"
17
+ "mono-agent": "./dist/cli.js",
18
+ "mono-agent-memory-recall": "./dist/memory-recall-main.js"
18
19
  },
19
20
  "files": [
20
21
  "dist",
@@ -22,20 +23,24 @@
22
23
  "README.md"
23
24
  ],
24
25
  "dependencies": {
25
- "@mono-agent/a2a-adapter": "0.3.0",
26
- "@mono-agent/agent-contracts": "0.3.0",
27
- "@mono-agent/agent-host": "0.3.0",
28
- "@mono-agent/config": "0.3.0",
29
- "@mono-agent/cron-adapter": "0.3.0",
30
- "@mono-agent/observability": "0.3.0",
31
- "@mono-agent/openai-api-adapter": "0.3.0",
32
- "@mono-agent/operator-console": "0.3.0",
33
- "@mono-agent/runtime-adapter": "0.3.0",
34
- "@mono-agent/settings": "0.3.0",
35
- "@mono-agent/slack-adapter": "0.3.0",
36
- "@mono-agent/telegram-adapter": "0.3.0",
37
- "@mono-agent/webhook-adapter": "0.3.0",
38
- "@mono-agent/whatsapp-adapter": "0.3.0"
26
+ "@modelcontextprotocol/sdk": "^1.29.0",
27
+ "@mono-agent/a2a-adapter": "0.4.0",
28
+ "@mono-agent/agent-contracts": "0.4.0",
29
+ "@mono-agent/agent-host": "0.4.0",
30
+ "@mono-agent/config": "0.4.0",
31
+ "@mono-agent/cron-adapter": "0.4.0",
32
+ "@mono-agent/memory-bujo": "0.4.0",
33
+ "@mono-agent/memory-search": "0.4.0",
34
+ "@mono-agent/observability": "0.4.0",
35
+ "@mono-agent/observability-otel": "0.4.0",
36
+ "@mono-agent/openai-api-adapter": "0.4.0",
37
+ "@mono-agent/runtime-adapter": "0.4.0",
38
+ "@mono-agent/settings": "0.4.0",
39
+ "@mono-agent/slack-adapter": "0.4.0",
40
+ "@mono-agent/telegram-adapter": "0.4.0",
41
+ "@mono-agent/webhook-adapter": "0.4.0",
42
+ "@mono-agent/whatsapp-adapter": "0.4.0",
43
+ "zod": "^4.4.3"
39
44
  },
40
45
  "publishConfig": {
41
46
  "access": "public"
@@ -5,7 +5,7 @@ description: Construct a working mono-agent in the current folder from one mono-
5
5
 
6
6
  # Mono Agent Composer
7
7
 
8
- Construct a working mono-agent in the user's current folder — empty or already holding knowledge — from one `mono-agent.config.json`. Discover what the user wants (runtime with backup models, communication channels incl. crons and webhooks, skills, MCP servers, memory strategy incl. semantic search, sandbox, operator console, observability), write the config, then make it run with the `mono-agent` CLI. No hand-written host code unless the user genuinely needs programmatic composition. `references/feature-coverage.md` maps every framework feature to a config key, CLI flag, or the programmatic escape hatch — consult it before declaring anything impossible or inventing keys.
8
+ Construct a working mono-agent in the user's current folder — empty or already holding knowledge — from one `mono-agent.config.json`. Discover what the user wants (runtime with backup models, communication channels incl. crons and webhooks, skills, MCP servers, memory strategy incl. semantic search, sandbox, observability), write the config, then make it run with the `mono-agent` CLI. The config is JSON-first: edit `mono-agent.config.json` directly (agents can edit it too); changes apply on the next `mono-agent restart`. No hand-written host code unless the user genuinely needs programmatic composition. `references/feature-coverage.md` maps every framework feature to a config key, CLI flag, or the programmatic escape hatch — consult it before declaring anything impossible or inventing keys.
9
9
 
10
10
  ## Operating Rules
11
11
 
@@ -25,11 +25,12 @@ The `mono-agent` CLI ships with `@mono-agent/agent-app` on npm:
25
25
  npm install -g @mono-agent/agent-app # or: npx @mono-agent/agent-app …
26
26
  ```
27
27
 
28
- To run an unreleased build instead, use a clone of the mono-agent workspace:
28
+ To run an unreleased build instead, use a clone of the mono-agent workspace with Node 20+ and pnpm 10 or newer already installed:
29
29
 
30
30
  ```bash
31
31
  git clone <mono-agent-repo> ~/mono-agent && cd ~/mono-agent
32
- corepack enable && pnpm install --frozen-lockfile && pnpm run build
32
+ pnpm install --frozen-lockfile
33
+ pnpm run build
33
34
  alias mono-agent="node ~/mono-agent/packages/agent-app/dist/cli.js"
34
35
  ```
35
36
 
@@ -59,11 +60,11 @@ Everything below runs in the user's agent folder, not the workspace.
59
60
  mono-agent start
60
61
  ```
61
62
 
62
- Then run the acceptance smoke test matching the chosen channel (see `references/validation.md`). The operator console URL printed at start lets the user edit config in the browser; saves re-apply live.
63
+ Then run the acceptance smoke test matching the chosen channel (see `references/validation.md`). To change anything, edit `mono-agent.config.json` directly and run `mono-agent restart`; there is no live browser re-apply.
63
64
 
64
65
  ## When Config Is Not Enough
65
66
 
66
- Config-first covers one responder served over any combination of the seven channels (webhook, OpenAI-compatible API, Telegram, Slack, WhatsApp, A2A, cron) plus the operator console, sandbox, memory (lite with FTS-only recall, journal with hybrid BM25+vector recall + Ollama embeddings, or bujo with SQLite-indexed hybrid recall + LLM capture/reconcile + entity graph + auto-scheduled reflection/migration), and traceability. Drop to programmatic composition only for: custom runtimes (`MonoRuntimeLike`, incl. the OpenAI Agents SDK), request-scoped runtime extensions, tool approval gates, structured output schemas, multi-agent orchestration (`@mono-agent/agent-orchestrator`), custom channel message texts, or bespoke transports — `references/feature-coverage.md` lists which features are config keys and which are code-only. Read `references/package-map.md` for the package boundaries, and start from `startMonoAgentApp({ drivers, runtime, ... })` or `@mono-agent/agent-host` rather than re-writing lifecycle glue. For eval suites over the composed agent, use `@mono-agent/agent-evals`.
67
+ Config-first covers one responder served over any combination of the seven channels (webhook, OpenAI-compatible API, Telegram, Slack, WhatsApp, A2A, cron) plus sandbox, memory (lite with FTS-only recall, journal with hybrid BM25+vector recall + configured embeddings, or bujo with SQLite-indexed hybrid recall + LLM capture/reconcile + entity graph + auto-scheduled reflection/migration), and traceability. Drop to programmatic composition only for: custom `MonoRuntimeLike` implementations, request-scoped runtime extensions, tool approval gates, structured output schemas, multi-agent orchestration (`@mono-agent/agent-orchestrator`), custom channel message texts, or bespoke transports — `references/feature-coverage.md` lists which features are config keys and which are code-only. Read `references/package-map.md` for the package boundaries, and start from `startMonoAgentApp({ drivers, runtime, ... })` or `@mono-agent/agent-host` rather than re-writing lifecycle glue. For eval suites over the composed agent, use `@mono-agent/agent-evals`.
67
68
 
68
69
  ## Implementation References
69
70
 
@@ -9,6 +9,7 @@ my-agent/
9
9
  mono-agent.config.json # the single declaration below
10
10
  IDENTITY.md # role, boundaries, references to existing knowledge
11
11
  skills/ # optional: <skill-name>/SKILL.md per selected skill
12
+ cron/ # optional: <job-id>.md scheduled prompts
12
13
  mcp.json # optional: MCP server definitions
13
14
  .env # optional: secrets; auto-loaded by the CLI, never committed
14
15
  .mono-agent/
@@ -40,6 +41,12 @@ my-agent/
40
41
  // Local/self-hosted providers for pi:<provider>:<model> references.
41
42
  "providers": {
42
43
  "piAuthPath": "~/.pi/agent/auth.json", // Pi OAuth credentials (openai-codex, ...)
44
+ // Pi-native bridge tuning (all optional).
45
+ "piNative": {
46
+ "piMaxRetries": 2, // 0-8; transient provider-transport retries
47
+ "maxRetryDelayMs": 60000, // backoff cap between retries (ms)
48
+ "piSessionsRoot": ".mono-agent/sessions" // durable JSONL sessions → resume across restarts (unset = in-memory)
49
+ },
43
50
  "local": [
44
51
  {
45
52
  "id": "ollama",
@@ -65,13 +72,13 @@ my-agent/
65
72
  // Memory strategy. Omit the section for no memory.
66
73
  // Three tiers over one substrate (memory-store + memory-bujo):
67
74
  // lite — FTS keyword recall + rapid-log; no external deps.
68
- // journal — + hybrid recall (BM25+vector) + decay; needs Ollama embeddings.
75
+ // journal — + hybrid recall (BM25+vector) + decay; needs embeddings.
69
76
  // bujo — + LLM capture/reconcile + entity graph + auto-scheduled
70
- // reflection/migration; needs Ollama embeddings + chat model.
77
+ // reflection/migration; needs embeddings + an app-level memory.llm.
71
78
  "memory": {
72
79
  "mode": "bujo", // lite | journal | bujo
73
80
  "path": "./.mono-agent/memory", // root directory for all tiers
74
- "writeMode": "append-host-summary", // disabled | append-host-summary
81
+ "writeMode": "capture", // disabled | append-host-summary | capture (bujo only)
75
82
  "maxBytes": 64000,
76
83
  "embeddings": { // required for journal and bujo
77
84
  "provider": "ollama", // ollama | openai
@@ -80,10 +87,12 @@ my-agent/
80
87
  "apiKeyEnv": "OPENAI_API_KEY", // or inline "apiKey"; required for openai
81
88
  "dim": 768 // nomic-embed-text:v1.5 output dimension
82
89
  },
83
- "llm": { // required for bujo; omit for lite/journal
84
- "provider": "ollama",
85
- "model": "qwen3.6:latest", // any local Ollama chat model; also set MONO_AGENT_MEMORY_LLM_MODEL for CLI
86
- "endpoint": "http://localhost:11434" // optional; defaults to http://localhost:11434
90
+ "llm": { // enables bujo capture/rituals; omit for lite/journal
91
+ // Env: MONO_AGENT_MEMORY_LLM_PROVIDER / _MODEL / _EXECUTION_MODE / _ENDPOINT.
92
+ "provider": "ollama", // ollama | agent-host
93
+ "model": "qwen3.6:latest", // ollama: model string; agent-host: runtime ref, e.g. pi:openai-codex:gpt-5.5
94
+ "endpoint": "http://localhost:11434" // ollama only; invalid for agent-host
95
+ // For agent-host, use: "model": "pi:openai-codex:gpt-5.5", "executionMode": "sdk"; omit endpoint.
87
96
  },
88
97
  // Bujo auto-scheduler — override defaults or disable per-ritual.
89
98
  // Rituals run in-app; no external cron or launchd needed.
@@ -109,7 +118,8 @@ my-agent/
109
118
  "unsafeAllowHostProcess": false // explicit opt-in required for the unsafe fallback
110
119
  },
111
120
 
112
- // Observability: JSONL artifacts + the trace-source registry dashboards read.
121
+ // Observability: JSONL artifacts (always written; the local fallback) + the
122
+ // trace-source registry that `mono-agent status` reads.
113
123
  "artifacts": { "dir": "./.mono-agent/artifacts" },
114
124
  "traceability": {
115
125
  "registryDir": "./.mono-agent/trace-sources",
@@ -119,10 +129,12 @@ my-agent/
119
129
  "staleAfterMs": 30000
120
130
  },
121
131
 
122
- // Local operator console (browser settings + traceability). On by default.
123
- "console": {
124
- "enabled": true,
125
- "port": 0 // 0 or omitted picks a free loopback port
132
+ // Optional trace viewer: add a Phoenix (OTLP) exporter to browse traces in
133
+ // Phoenix. Omit this entry to keep only the local JSONL artifacts.
134
+ "observability": {
135
+ "exporters": [
136
+ { "type": "phoenix", "endpoint": "http://127.0.0.1:6006/v1/traces" }
137
+ ]
126
138
  },
127
139
 
128
140
  // ----- Channels: one section per channel; all independent. An unconfigured
@@ -149,6 +161,11 @@ my-agent/
149
161
  "apiKey": "..." // optional bearer required from clients
150
162
  },
151
163
 
164
+ // Telegram & Slack deliver only the FINAL answer by default (no streamed
165
+ // interim edits) while showing a working indicator — Telegram a "typing…"
166
+ // action, Slack a 👀 "seen" reaction. This is built-in behavior (not a JSON
167
+ // field); restoring live interim streaming needs a custom channel driver with
168
+ // stream.finalOnly=false. The OpenAI-compatible endpoint still streams tokens.
152
169
  "telegram": {
153
170
  "enabled": true, // opt-in; defaults to false (off → "disabled")
154
171
  "botToken": "...",
@@ -223,13 +240,15 @@ my-agent/
223
240
 
224
241
  ```bash
225
242
  mono-agent init --model claude:claude-sonnet-4-6 --fallback-models pi:ollama:gemma4:31b [--memory lite|journal|bujo]
226
- mono-agent validate # per-section report incl. sandbox, console, every channel; exit 0 means ready
227
- mono-agent start # console + traceability + every configured channel
228
- mono-agent start --no-console # headless (or "console": { "enabled": false })
229
- mono-agent start --port 4400 # fixed console port (or "console": { "port": 4400 })
243
+ mono-agent validate # per-section report incl. sandbox, observability, every channel; exit 0 means ready
244
+ mono-agent start # traceability + every configured channel
245
+ mono-agent restart # apply config edits (config is JSON-first; restart to re-apply)
246
+ mono-agent restart --force # restart AND purge persisted pi sessions (fresh start; durable memory kept)
230
247
  ```
231
248
 
232
- A `.env` file in the folder is loaded automatically (exported shell variables win); use `--env-file <path>` for an alternate file. `start` prints the operator console URL (config editing in the browser; saves re-apply live without restarting), the traceability source, and one status line per channel: `running` with its endpoint facts, `waiting_for_config` with the exact missing setting, `disabled`, or `failed` with the reason.
249
+ A `.env` file in the folder is loaded automatically (exported shell variables win); use `--env-file <path>` for an alternate file. `start` prints the traceability source (Phoenix when an `observability.exporters` Phoenix entry is configured, otherwise the local JSONL artifacts) and one status line per channel: `running` with its endpoint facts, `waiting_for_config` with the exact missing setting, `disabled`, or `failed` with the reason. Config is JSON-first: edit `mono-agent.config.json` directly (agents can edit it) and run `mono-agent restart` to apply — there is no live browser re-apply.
250
+
251
+ For BuJo capture and rituals, configure `memory.llm`. Use `provider: "ollama"` with a local Ollama chat model string and optional `endpoint`, or `provider: "agent-host"` with `model` as a normal SDK runtime model reference such as `pi:openai-codex:gpt-5.5` and `executionMode: "sdk"`. `endpoint` is Ollama-only, and CLI-backed refs such as `codex:gpt-5.5` are rejected for memory LLMs until runtimes can enforce no external actions. The same values can be supplied via `MONO_AGENT_MEMORY_LLM_PROVIDER`, `MONO_AGENT_MEMORY_LLM_MODEL`, `MONO_AGENT_MEMORY_LLM_EXECUTION_MODE`, and `MONO_AGENT_MEMORY_LLM_ENDPOINT`. The standalone `memory-bujo` maintenance CLI remains Ollama-only; `agent-host` LLM capture is an in-app composition path that injects the `LlmComplete` implementation into the BuJo store.
233
252
 
234
253
  For a local terminal chat against the same config, `@mono-agent/tui` ships a `mono-agent-tui` bin: `mono-agent-tui --config ./mono-agent.config.json`.
235
254
 
@@ -242,7 +261,7 @@ import { startMonoAgentApp, defaultChannelDrivers } from "@mono-agent/agent-app"
242
261
 
243
262
  const app = await startMonoAgentApp({
244
263
  cwd: process.cwd(),
245
- runtime: myCustomRuntime, // any MonoRuntimeLike (incl. createOpenAIAgentsRuntime)
264
+ runtime: myCustomRuntime, // any MonoRuntimeLike
246
265
  drivers: [...defaultChannelDrivers(), myCustomDriver],
247
266
  });
248
267
  ```
@@ -74,7 +74,7 @@ What tools or MCP servers does the agent actually need?
74
74
  4. Both
75
75
  ```
76
76
 
77
- Fills: `tools.allowedTools`, `tools.disallowedTools` (denylist wins), `tools.mcpConfigPath`. Record exact tool names; do not broaden access as a convenience.
77
+ Fills: `tools.allowedTools`, `tools.disallowedTools` (denylist wins), `tools.mcpConfigPath`. Record exact tool names; do not broaden access as a convenience. To expose adapter-derived send tools, include `slack_send_message` / `telegram_send_message`; valid enabled Slack/Telegram adapter config and destination allowlists are still required.
78
78
 
79
79
  ## 6. Memory Strategy
80
80
 
@@ -85,14 +85,14 @@ Should the agent remember anything between conversations?
85
85
 
86
86
  1. No durable memory yet (recommended for first integration)
87
87
  2. Lite memory — FTS keyword recall + rapid-log capture; zero external deps
88
- 3. Journal memory — hybrid recall (BM25+vector) + salience decay; requires local Ollama embeddings
88
+ 3. Journal memory — hybrid recall (BM25+vector) + salience decay; requires embeddings
89
89
  4. BuJo memory — full tier: journal + LLM capture/reconcile + entity graph + auto-scheduled
90
- reflection/migration; requires Ollama embeddings AND a local chat model
90
+ reflection/migration; requires embeddings AND a chat model
91
91
  ```
92
92
 
93
93
  All tiers share the same `@mono-agent/memory-bujo` substrate. Fills: `memory.mode`
94
94
  (`lite`/`journal`/`bujo`), `memory.path`, `memory.writeMode`
95
- (`disabled`/`append-host-summary`), and tier-specific blocks below.
95
+ (`disabled`/`append-host-summary`/`capture`), and tier-specific blocks below.
96
96
 
97
97
  **Tier 2 — lite (no external deps):**
98
98
 
@@ -110,9 +110,11 @@ No prerequisites. No Ollama. SQLite is bundled.
110
110
 
111
111
  **Tier 3 — journal (embeddings required):**
112
112
 
113
- - Ask: which local Ollama embeddings model? (default `nomic-embed-text:v1.5` — use the
114
- exact `:v1.5` tag; pull first with `ollama pull nomic-embed-text:v1.5`).
115
- - Default `memory.embeddings.dim` to `768` for `nomic-embed-text:v1.5`.
113
+ - Ask: which embeddings provider/model?
114
+ - Ollama default: `provider: "ollama"`, model `nomic-embed-text:v1.5`, dim `768`
115
+ (use the exact `:v1.5` tag; pull first with `ollama pull nomic-embed-text:v1.5`).
116
+ - OpenAI option: `provider: "openai"`, model `text-embedding-3-small`, API key via
117
+ `apiKeyEnv`, dim matching the model.
116
118
 
117
119
  Write:
118
120
 
@@ -129,8 +131,8 @@ Write:
129
131
  }
130
132
  ```
131
133
 
132
- After writing, remind the user to run `mono-agent validate` (checks Ollama reachability
133
- and that the model is pulled warns loudly on any failure, never silently falls back).
134
+ After writing, remind the user to run `mono-agent validate` (checks root writability and
135
+ provider-specific liveness; Ollama model pulls are checked only when using Ollama).
134
136
 
135
137
  **Tier 4 — bujo (embeddings + chat model + auto-rituals):**
136
138
 
@@ -140,11 +142,15 @@ migration (promote/reschedule/cluster/forget), living `index.md` + `future-log.m
140
142
  The reflection and migration rituals are **auto-scheduled in-app** — no external cron or
141
143
  launchd setup needed.
142
144
 
143
- - Ask: which local Ollama embeddings model? (default `nomic-embed-text:v1.5` exact
144
- `:v1.5` tag; `ollama pull nomic-embed-text:v1.5`).
145
- - Ask: which local chat model for LLM pipelines? (e.g. `qwen3.6:latest`;
146
- `ollama pull qwen3.6:latest`). A chat model is required — without it the `bujo` tier
147
- cannot run capture/reflect/migrate.
145
+ - Ask: which embeddings provider/model? Use the same choices as journal.
146
+ - Ask: which chat LLM provider/model for LLM pipelines?
147
+ - Ollama: local model string such as `qwen3.6:latest`; pull it first with
148
+ `ollama pull qwen3.6:latest`.
149
+ - agent-host: SDK runtime model reference such as `pi:openai-codex:gpt-5.5` with
150
+ `executionMode: "sdk"`. Do not use CLI-backed refs such as `codex:gpt-5.5`; they are
151
+ rejected for memory LLMs until runtimes can enforce no external actions.
152
+ - Ask: should per-turn intelligent capture be enabled (`writeMode: "capture"`), or only
153
+ deterministic rapid-log summaries (`append-host-summary`) plus scheduled rituals?
148
154
  - Ask: should we keep the default reflection/migration schedule (nightly `0 3 * * *` /
149
155
  monthly `0 4 1 * *`), or customise the cron expressions?
150
156
 
@@ -154,7 +160,7 @@ Write (embeddings + chat model):
154
160
  "memory": {
155
161
  "mode": "bujo",
156
162
  "path": "./.mono-agent/memory",
157
- "writeMode": "append-host-summary",
163
+ "writeMode": "capture",
158
164
  "embeddings": {
159
165
  "provider": "ollama",
160
166
  "model": "nomic-embed-text:v1.5",
@@ -167,6 +173,16 @@ Write (embeddings + chat model):
167
173
  }
168
174
  ```
169
175
 
176
+ For an agent-host memory LLM, write the `llm` block as:
177
+
178
+ ```jsonc
179
+ "llm": {
180
+ "provider": "agent-host",
181
+ "model": "pi:openai-codex:gpt-5.5",
182
+ "executionMode": "sdk"
183
+ }
184
+ ```
185
+
170
186
  If the user customises the ritual schedule, add the `reflection`/`migration` blocks:
171
187
 
172
188
  ```jsonc
@@ -179,11 +195,11 @@ After writing, append a prerequisite note:
179
195
  ```
180
196
  Before running mono-agent validate, pull the required models:
181
197
  ollama pull nomic-embed-text:v1.5
182
- ollama pull qwen3.6:latest # (or whichever chat model you chose)
198
+ ollama pull qwen3.6:latest # only if using llm.provider: "ollama"
183
199
  ```
184
200
 
185
- Then run `mono-agent validate` — the Memory section confirms Ollama reachability, both
186
- models are present, the root is writable, and the ritual cadence (with next-run times).
201
+ Then run `mono-agent validate` — the Memory section confirms the root is writable,
202
+ provider-specific liveness, and the ritual cadence (with next-run times).
187
203
  See `docs/memory.md` for the full tier table, config shapes, and CLI subcommands
188
204
  (`memory-bujo rebuild|recall|index|reflect|migrate`).
189
205
 
@@ -207,14 +223,13 @@ Fills: the `sandbox` section — `mode`, `network.mode` (`none`/`localhost`/`all
207
223
  Question:
208
224
 
209
225
  ```text
210
- Do you need browsable traceability or just local artifacts?
226
+ Do you need a browsable trace viewer or just local artifacts?
211
227
 
212
- 1. JSONL artifacts and the operator console (recommended; console is on by default)
213
- 2. JSONL artifacts and the console on a fixed port
214
- 3. JSONL artifacts only (headless)
228
+ 1. JSONL artifacts plus Phoenix as the trace viewer (recommended; add an `observability.exporters` Phoenix entry)
229
+ 2. JSONL artifacts only (the local fallback; no external viewer)
215
230
  ```
216
231
 
217
- Fills: `artifacts.dir`, `traceability.registryDir` / `sourceId` / `sourceLabel`, and the `console` section — `console.port` for a fixed loopback port, `console.enabled: false` (or `start --no-console`) for headless. Artifacts record runtime/tool/message events and summaries, not private chain-of-thought. For a local terminal chat instead of (or alongside) the browser console, mention `mono-agent-tui --config ./mono-agent.config.json`.
232
+ Fills: `artifacts.dir`, `traceability.registryDir` / `sourceId` / `sourceLabel`, and when Phoenix is wanted an `observability.exporters` (phoenix) OTLP entry. Local JSONL artifacts are always written and are the fallback when no exporter is configured. Artifacts record runtime/tool/message events and summaries, not private chain-of-thought. For a local terminal chat, mention `mono-agent-tui --config ./mono-agent.config.json`. Config is JSON-first — edit `mono-agent.config.json` directly and run `mono-agent restart` to apply changes.
218
233
 
219
234
  ## 9. Acceptance Smoke Test
220
235
 
@@ -14,10 +14,11 @@ Every framework capability and how a composed agent reaches it. Use this to answ
14
14
  | Continuous provider sessions with idle eviction | config | `runtime.session.{mode,idleTimeoutMs}` |
15
15
  | Local providers (Ollama / LM Studio / OpenAI-compatible) | config | `providers.local[]` |
16
16
  | Pi OAuth credentials | config | `providers.piAuthPath` |
17
- | Context compaction, tool-output bloat guard, cost tracking | auto | built into every run |
17
+ | Tool-output bloat guard, cost tracking | auto | built into every run |
18
+ | Context handling | provider | delegated to the provider; the pi bridge (pi-agent-core AgentHarness) runs no automatic in-loop summarization, so runs report `context_compaction_applied: null` |
18
19
  | Structured output (JSON schema), live input steering | code | harness `runtimeOptions` |
19
20
  | Tool approval gates (risk tiers, timeouts, always-allow) | code | `createMonoRuntime({ onToolApprovalRequest, ... })` — needs a host UI |
20
- | OpenAI Agents SDK backend / fully custom runtime | code | `startMonoAgentApp({ runtime })` |
21
+ | Fully custom runtime | code | `startMonoAgentApp({ runtime })` |
21
22
 
22
23
  ## Context, skills, memory
23
24
 
@@ -28,13 +29,14 @@ Every framework capability and how a composed agent reaches it. Use this to answ
28
29
  | Per-skill byte cap | config | `context.skillMaxBytes` |
29
30
  | Conversation history (in-memory; unlimited unless turns are capped) | auto | sized from `runtime.maxTurns`; custom store via code |
30
31
  | Lite memory (FTS keyword recall + rapid-log capture; no external deps) | config | `memory.mode: "lite"`, `path`, `maxBytes`, `writeMode` |
31
- | Journal memory (hybrid recall BM25+vector + salience decay; needs Ollama embeddings) | config | `memory.mode: "journal"`, `path`, `memory.embeddings.{provider,model,dim}` |
32
- | BuJo memory (journal + LLM capture/reconcile ADD/UPDATE/SUPERSEDE/NOOP + entity graph + auto-scheduled reflection/migration; needs Ollama embeddings + chat model) | config | `memory.mode: "bujo"`, `path`, `memory.embeddings.{provider,model,dim}`, `memory.llm.{provider,model,endpoint}` — see `docs/memory.md` |
32
+ | Journal memory (hybrid recall BM25+vector + salience decay; needs configured embeddings) | config | `memory.mode: "journal"`, `path`, `memory.embeddings.{provider,model,dim}` (`provider: "ollama" | "openai"`) |
33
+ | BuJo memory (journal + LLM capture/reconcile ADD/UPDATE/SUPERSEDE/NOOP + entity graph + auto-scheduled reflection/migration; needs embeddings + an app-level `memory.llm`) | config | `memory.mode: "bujo"`, `path`, `memory.embeddings.{provider,model,dim}`, `memory.llm` with `provider: "ollama"` (`model`, optional `endpoint`) or `provider: "agent-host"` (`model` is an SDK runtime model ref, e.g. `pi:openai-codex:gpt-5.5`, optional `executionMode: "sdk"`) — see `docs/memory.md` |
33
34
  | BuJo reflection auto-scheduler (nightly decay + insight synthesis; in-app, no external cron needed) | config | `memory.reflection.{enabled,cron}` (default `0 3 * * *`); env `MONO_AGENT_MEMORY_REFLECTION_CRON`, `MONO_AGENT_MEMORY_REFLECTION_ENABLED` |
34
35
  | BuJo migration auto-scheduler (monthly promote/reschedule/cluster/forget; in-app) | config | `memory.migration.{enabled,cron}` (default `0 4 1 * *`); env `MONO_AGENT_MEMORY_MIGRATION_CRON`, `MONO_AGENT_MEMORY_MIGRATION_ENABLED` |
35
- | Memory out-of-band maintenance CLI (rebuild/recall/index/reflect/migrate) | cli | `memory-bujo <subcommand> <root>`; opt-in `MONO_AGENT_MEMORY_EMBEDDINGS_PROVIDER`/`_MODEL`/`_DIM` for semantic recall; `MONO_AGENT_MEMORY_LLM_MODEL`, `MONO_AGENT_MEMORY_LLM_ENDPOINT` required for reflect/migrate |
36
- | Memory liveness check (root writable; Ollama + models for journal/bujo; ritual cadence for bujo — loud warn, no silent fallback) | cli | `mono-agent validate` |
36
+ | Memory out-of-band maintenance CLI (rebuild/recall/index/reflect/migrate) | cli | `memory-bujo <subcommand> <root>`; opt-in `MONO_AGENT_MEMORY_EMBEDDINGS_PROVIDER`/`_MODEL`/`_DIM` for semantic recall; reflect/migrate are Ollama-only and require `MONO_AGENT_MEMORY_LLM_MODEL` (optional `MONO_AGENT_MEMORY_LLM_ENDPOINT`) |
37
+ | Memory liveness check (root writable; provider-specific Ollama checks only when embeddings/chat use Ollama; BuJo LLM config + ritual cadence — loud warn, no silent fallback) | cli | `mono-agent validate` |
37
38
  | Host summaries appended after runs | config | `memory.writeMode: "append-host-summary"` |
39
+ | Auto-provisioned read-only `memory_recall` tool (hybrid keyword+semantic search) exposed to the agent from the single memory config; no chat LLM | config | `config.memory.recallTool.enabled` (`MONO_AGENT_MEMORY_RECALL_TOOL_ENABLED`, default on for journal/bujo with embeddings) |
38
40
 
39
41
  ## Tools, MCP, sandbox
40
42
 
@@ -43,6 +45,7 @@ Every framework capability and how a composed agent reaches it. Use this to answ
43
45
  | Fail-closed tool policy (empty allowlist = no tools) | auto | default |
44
46
  | Tool allow/deny lists (deny wins) | config | `tools.allowedTools`, `tools.disallowedTools` |
45
47
  | MCP servers (stdio/sse/http) from a JSON file | config | `tools.mcpConfigPath` |
48
+ | Adapter-derived send tools for enabled Slack/Telegram adapters | config | `tools.allowedTools` must include `slack_send_message` / `telegram_send_message`; valid `slack.*` / `telegram.*` config and existing adapter allowlists provide credentials and destination bounds |
46
49
  | Sandbox on/off + srt engine | config | `sandbox.mode` |
47
50
  | Network policy (none/localhost/allowlist/all) | config | `sandbox.network.{mode,allowlist}` |
48
51
  | Filesystem scopes (readable/writable roots, deny-write globs) | config | `sandbox.readableRoots`, `sandbox.writableRoots`, `sandbox.denyWrite` |
@@ -60,7 +63,7 @@ Every framework capability and how a composed agent reaches it. Use this to answ
60
63
  | WhatsApp (Baileys, QR login, group mention/any triggers) | config | `whatsapp` section |
61
64
  | A2A provider (Agent Card, JSON-RPC + REST, streaming, bearer) | config | `a2a.provider` + `a2a.agent` + `a2a.skill` |
62
65
  | A2A consumer settings (remote agent URLs, timeouts) | config + code | `a2a.consumer` holds settings; calls via `createA2AConsumerResponder` |
63
- | Cron jobs (five-field expressions, timezones, overlap skip) | config | `cron.jobs[]` |
66
+ | Cron jobs (five-field expressions, timezones, overlap skip) | config | `cron.jobs[]`, single-job `MONO_AGENT_CRON_*`, or one markdown file per job in `cron.dir` / `MONO_AGENT_CRON_DIR` (default `cron/`) |
64
67
  | Channel message texts / stream tuning (welcome, debounce, ...) | code | channel driver overrides |
65
68
  | Custom transports | code | implement `ChannelDriver`, pass via `startMonoAgentApp({ drivers })` |
66
69
 
@@ -69,8 +72,8 @@ Every framework capability and how a composed agent reaches it. Use this to answ
69
72
  | Capability | Coverage | Where |
70
73
  | --- | --- | --- |
71
74
  | JSONL run artifacts (events + summaries, secrets redacted) | config | `artifacts.dir` |
72
- | Trace-source registry (heartbeat manifests for dashboards) | config | `traceability.{registryDir,sourceId,sourceLabel,heartbeatMs,staleAfterMs}` |
73
- | Operator console (browser settings editor, traceability views, live config re-apply, bearer token) | config + cli | `console.{enabled,port}`; `--port`, `--no-console` |
75
+ | Trace-source registry (heartbeat manifests `mono-agent status` reads) | config | `traceability.{registryDir,sourceId,sourceLabel,heartbeatMs,staleAfterMs}` |
76
+ | Phoenix trace viewer (OTLP exporter; local JSONL artifacts are the fallback) | config | `observability.exporters` (phoenix entry) |
74
77
  | Terminal chat (TUI with transcript + redacted config pane) | cli | `mono-agent-tui --config ./mono-agent.config.json` |
75
78
  | Scaffold / validate / start / install-skill | cli | `mono-agent init|validate|start|install-skill` |
76
79
  | `.env` auto-loading | cli | automatic; `--env-file <path>` |
@@ -4,7 +4,7 @@ Use this map to select the smallest mono-agent package set for a host. Package c
4
4
 
5
5
  ## App Join (default)
6
6
 
7
- `@mono-agent/agent-app` is the config-first host: it loads `mono-agent.config.json`, builds the responder through `agent-host`, and drives every configured channel plus the operator console and traceability. It ships the `mono-agent` CLI (`init`, `validate`, `start`) and is the only publishable package allowed to compose communication adapters.
7
+ `@mono-agent/agent-app` is the config-first host: it loads `mono-agent.config.json`, builds the responder through `agent-host`, and drives every configured channel plus traceability and any configured observability exporters. It ships the `mono-agent` CLI (`init`, `validate`, `start`) and is the only publishable package allowed to compose communication adapters.
8
8
 
9
9
  ```ts
10
10
  import { startMonoAgentApp } from "@mono-agent/agent-app";
@@ -51,6 +51,7 @@ Use this path when the agent needs identity, selected skills, history, and optio
51
51
  | Memory substrate (schema, migrations, FTS+vector db, RRF) | `@mono-agent/memory-store` | SQLite storage, BM25 FTS, optional vector index, hybrid recall; `MemoryStore`/`MemoryBlock`/`MemoryWriteResult` contract |
52
52
  | Memory engine (all tiers: lite/journal/bujo) | `@mono-agent/memory-bujo` | `BujoMemoryStore` — tier-aware: FTS recall (lite), hybrid recall + decay (journal), LLM capture/reconcile + entity graph + reflection/migration + auto-scheduler (bujo) |
53
53
  | Embedding providers | `@mono-agent/memory-search` | Ollama/OpenAI embedding providers used by memory-store for vector recall |
54
+ | Recall tool surface | `@mono-agent/agent-app` (bundled) | Auto-provisions a read-only `memory_recall` tool (hybrid keyword+semantic search) from `config.memory.recallTool.enabled`; spawns the bundled `mono-agent-memory` stdio child using the same memory root + embeddings as the in-app memory |
54
55
 
55
56
  Mono-agent selected skills are not auto-selected by description. The host chooses `context.selectedSkills`, and the harness loads those exact bodies.
56
57
 
@@ -103,15 +104,14 @@ Communication adapters are edge packages. They accept an `AgentResponder` and ow
103
104
 
104
105
  Adapters must not import the harness, runtime adapter, memory packages (`memory-store`, `memory-bujo`, `memory-search`), or other adapters. `@mono-agent/agent-app` composes them from config; custom hosts and demos may compose them directly.
105
106
 
106
- ## Operator And Observability Join
107
+ ## Observability Join
107
108
 
108
109
  Use:
109
110
 
110
- - `@mono-agent/operator-console` for local browser settings and traceability (`console` config section; per-boot bearer token; saves re-apply live).
111
111
  - `@mono-agent/tui` for local terminal chat and redacted read-only config (`mono-agent-tui --config ./mono-agent.config.json`).
112
- - `@mono-agent/observability` for JSONL event artifacts, summaries, and trace-source registration.
112
+ - `@mono-agent/observability` for JSONL event artifacts, summaries, and trace-source registration; add `@mono-agent/observability-otel` for the Phoenix OTLP exporter configured via `observability.exporters`.
113
113
 
114
- Traceability is local-first. A running host registers a source manifest; the operator console reads artifacts by `(sourceId, runId)` so duplicate run ids do not collide.
114
+ 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.
115
115
 
116
116
  ## Evaluation Join
117
117