@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.
- package/README.md +9 -5
- package/dist/adapter-send-tools-main.d.ts +3 -0
- package/dist/adapter-send-tools-main.d.ts.map +1 -0
- package/dist/adapter-send-tools-main.js +20 -0
- package/dist/adapter-send-tools-main.js.map +1 -0
- package/dist/adapter-send-tools.d.ts +59 -0
- package/dist/adapter-send-tools.d.ts.map +1 -0
- package/dist/adapter-send-tools.js +254 -0
- package/dist/adapter-send-tools.js.map +1 -0
- package/dist/app-config.d.ts +40 -17
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +188 -68
- package/dist/app-config.js.map +1 -1
- package/dist/app.d.ts +41 -20
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +250 -91
- package/dist/app.js.map +1 -1
- package/dist/backfill.d.ts +79 -0
- package/dist/backfill.d.ts.map +1 -0
- package/dist/backfill.js +246 -0
- package/dist/backfill.js.map +1 -0
- package/dist/background.d.ts +0 -4
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +78 -50
- package/dist/background.js.map +1 -1
- package/dist/channels.d.ts +7 -0
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +26 -3
- package/dist/channels.js.map +1 -1
- package/dist/cli.d.ts +52 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +315 -111
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts +8 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +148 -48
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/launchd.d.ts +0 -2
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +0 -2
- package/dist/launchd.js.map +1 -1
- package/dist/memory-recall-main.d.ts +3 -0
- package/dist/memory-recall-main.d.ts.map +1 -0
- package/dist/memory-recall-main.js +30 -0
- package/dist/memory-recall-main.js.map +1 -0
- package/dist/memory-recall.d.ts +111 -0
- package/dist/memory-recall.d.ts.map +1 -0
- package/dist/memory-recall.js +275 -0
- package/dist/memory-recall.js.map +1 -0
- package/dist/sessions.d.ts +21 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +45 -0
- package/dist/sessions.js.map +1 -0
- package/dist/ui.d.ts +54 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +153 -0
- package/dist/ui.js.map +1 -0
- package/package.json +22 -17
- package/skills/mono-agent-composer/SKILL.md +6 -5
- package/skills/mono-agent-composer/references/config-blueprint.md +37 -18
- package/skills/mono-agent-composer/references/discovery-questions.md +38 -23
- package/skills/mono-agent-composer/references/feature-coverage.md +12 -9
- package/skills/mono-agent-composer/references/package-map.md +5 -5
- 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: "[0m",
|
|
13
|
+
bold: "[1m",
|
|
14
|
+
dim: "[2m",
|
|
15
|
+
red: "[31m",
|
|
16
|
+
green: "[32m",
|
|
17
|
+
yellow: "[33m",
|
|
18
|
+
cyan: "[36m",
|
|
19
|
+
gray: "[90m",
|
|
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.
|
|
4
|
-
"description": "Config-first mono-agent host: builds a responder and starts every configured communication channel
|
|
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
|
-
"@
|
|
26
|
-
"@mono-agent/
|
|
27
|
-
"@mono-agent/agent-
|
|
28
|
-
"@mono-agent/
|
|
29
|
-
"@mono-agent/
|
|
30
|
-
"@mono-agent/
|
|
31
|
-
"@mono-agent/
|
|
32
|
-
"@mono-agent/
|
|
33
|
-
"@mono-agent/
|
|
34
|
-
"@mono-agent/
|
|
35
|
-
"@mono-agent/
|
|
36
|
-
"@mono-agent/
|
|
37
|
-
"@mono-agent/
|
|
38
|
-
"@mono-agent/
|
|
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,
|
|
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
|
-
|
|
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`).
|
|
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
|
|
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
|
|
75
|
+
// journal — + hybrid recall (BM25+vector) + decay; needs embeddings.
|
|
69
76
|
// bujo — + LLM capture/reconcile + entity graph + auto-scheduled
|
|
70
|
-
// reflection/migration; needs
|
|
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": "
|
|
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": { //
|
|
84
|
-
|
|
85
|
-
"
|
|
86
|
-
"
|
|
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
|
|
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
|
-
//
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
"
|
|
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,
|
|
227
|
-
mono-agent start #
|
|
228
|
-
mono-agent
|
|
229
|
-
mono-agent
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
114
|
-
|
|
115
|
-
|
|
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
|
|
133
|
-
|
|
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
|
|
144
|
-
|
|
145
|
-
-
|
|
146
|
-
|
|
147
|
-
|
|
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": "
|
|
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 #
|
|
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
|
|
186
|
-
|
|
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
|
|
226
|
+
Do you need a browsable trace viewer or just local artifacts?
|
|
211
227
|
|
|
212
|
-
1. JSONL artifacts
|
|
213
|
-
2. JSONL artifacts
|
|
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
|
|
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
|
-
|
|
|
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
|
-
|
|
|
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
|
|
32
|
-
| BuJo memory (journal + LLM capture/reconcile ADD/UPDATE/SUPERSEDE/NOOP + entity graph + auto-scheduled reflection/migration; needs
|
|
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
|
|
36
|
-
| Memory liveness check (root writable; Ollama
|
|
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
|
|
73
|
-
|
|
|
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
|
|
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
|
-
##
|
|
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
|
|
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
|
|