@mono-agent/agent-app 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +7 -0
  2. package/dist/adapter-send-tools.d.ts +7 -7
  3. package/dist/adapter-send-tools.d.ts.map +1 -1
  4. package/dist/adapter-send-tools.js +59 -50
  5. package/dist/adapter-send-tools.js.map +1 -1
  6. package/dist/app.js +8 -8
  7. package/dist/app.js.map +1 -1
  8. package/dist/channels.js +3 -3
  9. package/dist/channels.js.map +1 -1
  10. package/dist/cli.d.ts +28 -10
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +287 -164
  13. package/dist/cli.js.map +1 -1
  14. package/dist/config-reference.js +4 -4
  15. package/dist/config-reference.js.map +1 -1
  16. package/dist/consumer-contract.d.ts.map +1 -1
  17. package/dist/consumer-contract.js +5 -3
  18. package/dist/consumer-contract.js.map +1 -1
  19. package/dist/doctor.d.ts.map +1 -1
  20. package/dist/doctor.js +131 -7
  21. package/dist/doctor.js.map +1 -1
  22. package/dist/init.d.ts +11 -22
  23. package/dist/init.d.ts.map +1 -1
  24. package/dist/init.js +25 -116
  25. package/dist/init.js.map +1 -1
  26. package/dist/interaction-bridge.d.ts +3 -3
  27. package/dist/interaction-bridge.d.ts.map +1 -1
  28. package/dist/memory-recall.d.ts +2 -2
  29. package/dist/memory-recall.d.ts.map +1 -1
  30. package/dist/memory-recall.js +3 -3
  31. package/dist/memory-recall.js.map +1 -1
  32. package/dist/modules/base.d.ts +25 -0
  33. package/dist/modules/base.d.ts.map +1 -0
  34. package/dist/{recipes → modules}/base.js +17 -11
  35. package/dist/modules/base.js.map +1 -0
  36. package/dist/modules/catalog.d.ts +12 -0
  37. package/dist/modules/catalog.d.ts.map +1 -0
  38. package/dist/modules/catalog.js +412 -0
  39. package/dist/modules/catalog.js.map +1 -0
  40. package/dist/modules/index.d.ts +8 -0
  41. package/dist/modules/index.d.ts.map +1 -0
  42. package/dist/modules/index.js +5 -0
  43. package/dist/modules/index.js.map +1 -0
  44. package/dist/modules/known-tools.d.ts +44 -0
  45. package/dist/modules/known-tools.d.ts.map +1 -0
  46. package/dist/modules/known-tools.js +88 -0
  47. package/dist/modules/known-tools.js.map +1 -0
  48. package/dist/modules/types.d.ts +73 -0
  49. package/dist/modules/types.d.ts.map +1 -0
  50. package/dist/{recipes → modules}/types.js +3 -3
  51. package/dist/{recipes → modules}/types.js.map +1 -1
  52. package/dist/posted-message-index.d.ts +2 -2
  53. package/dist/posted-message-index.js +2 -2
  54. package/dist/provider-setup.d.ts +44 -0
  55. package/dist/provider-setup.d.ts.map +1 -0
  56. package/dist/provider-setup.js +174 -0
  57. package/dist/provider-setup.js.map +1 -0
  58. package/dist/wizard/answers.d.ts +87 -0
  59. package/dist/wizard/answers.d.ts.map +1 -0
  60. package/dist/wizard/answers.js +244 -0
  61. package/dist/wizard/answers.js.map +1 -0
  62. package/dist/wizard/from-flags.d.ts +27 -0
  63. package/dist/wizard/from-flags.d.ts.map +1 -0
  64. package/dist/wizard/from-flags.js +45 -0
  65. package/dist/wizard/from-flags.js.map +1 -0
  66. package/dist/wizard/index.d.ts +11 -0
  67. package/dist/wizard/index.d.ts.map +1 -0
  68. package/dist/wizard/index.js +6 -0
  69. package/dist/wizard/index.js.map +1 -0
  70. package/dist/wizard/model-discovery.d.ts +35 -0
  71. package/dist/wizard/model-discovery.d.ts.map +1 -0
  72. package/dist/wizard/model-discovery.js +239 -0
  73. package/dist/wizard/model-discovery.js.map +1 -0
  74. package/dist/wizard/presets.d.ts +40 -0
  75. package/dist/wizard/presets.d.ts.map +1 -0
  76. package/dist/wizard/presets.js +85 -0
  77. package/dist/wizard/presets.js.map +1 -0
  78. package/dist/wizard/prompts.d.ts +55 -0
  79. package/dist/wizard/prompts.d.ts.map +1 -0
  80. package/dist/wizard/prompts.js +152 -0
  81. package/dist/wizard/prompts.js.map +1 -0
  82. package/dist/wizard/run.d.ts +20 -0
  83. package/dist/wizard/run.d.ts.map +1 -0
  84. package/dist/wizard/run.js +374 -0
  85. package/dist/wizard/run.js.map +1 -0
  86. package/package.json +17 -16
  87. package/schema/mono-agent.config.schema.json +5 -3
  88. package/skills/mono-agent-composer/SKILL.md +8 -8
  89. package/skills/mono-agent-composer/references/config-blueprint.md +7 -7
  90. package/skills/mono-agent-composer/references/discovery-questions.md +13 -10
  91. package/skills/mono-agent-composer/references/feature-coverage.md +12 -10
  92. package/skills/mono-agent-composer/references/package-map.md +7 -6
  93. package/skills/mono-agent-composer/references/playbooks.md +22 -22
  94. package/skills/mono-agent-composer/references/validation.md +3 -3
  95. package/dist/recipes/base.d.ts +0 -15
  96. package/dist/recipes/base.d.ts.map +0 -1
  97. package/dist/recipes/base.js.map +0 -1
  98. package/dist/recipes/catalog.d.ts +0 -4
  99. package/dist/recipes/catalog.d.ts.map +0 -1
  100. package/dist/recipes/catalog.js +0 -525
  101. package/dist/recipes/catalog.js.map +0 -1
  102. package/dist/recipes/index.d.ts +0 -11
  103. package/dist/recipes/index.d.ts.map +0 -1
  104. package/dist/recipes/index.js +0 -14
  105. package/dist/recipes/index.js.map +0 -1
  106. package/dist/recipes/types.d.ts +0 -70
  107. package/dist/recipes/types.d.ts.map +0 -1
  108. package/dist/setup.d.ts +0 -29
  109. package/dist/setup.d.ts.map +0 -1
  110. package/dist/setup.js +0 -97
  111. package/dist/setup.js.map +0 -1
@@ -6,9 +6,9 @@ Every framework capability and how a composed agent reaches it. This table is th
6
6
 
7
7
  | Capability | Coverage | Where |
8
8
  | --- | --- | --- |
9
- | Model backends: claude (sdk/cli), codex (cli), pi sdk providers (OpenAI, Copilot, OpenRouter, Ollama, ...), opencode (cli, `opencode:<provider>:<model>` via the OpenCode server) | config | `runtime.model` |
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` |
10
10
  | Backup models on retryable provider failure | config | `runtime.fallbackModels` |
11
- | Execution mode (sdk/cli), effort, max turns, workspace | config | `runtime.executionMode`, `runtime.effort`, `runtime.maxTurns`, `runtime.workspace` |
11
+ | Execution mode (sdk/cli), effort, max turns, workspace | config + cli | `runtime.executionMode`, `runtime.effort` (`mono-agent init --effort <level>`), `runtime.maxTurns`, `runtime.workspace` |
12
12
  | Tool-permission posture for CLI backends | config | `runtime.permissionMode` |
13
13
  | Continuous provider sessions with idle eviction | config | `runtime.session.{mode,idleTimeoutMs}` |
14
14
  | Local providers (Ollama / LM Studio / OpenAI-compatible) | config | `providers.local[]` |
@@ -35,16 +35,16 @@ Every framework capability and how a composed agent reaches it. This table is th
35
35
  | Config-aware memory preview CLI (stats/today/show/search/top for the configured backend; local search warns and falls back to FTS-only when embeddings are down) | cli | `mono-agent memory stats\|today\|show <date>\|search <query>\|top [--limit <n>] [--json]` |
36
36
  | Memory liveness check (root writable; provider-specific Ollama checks only when embeddings/chat use Ollama; BuJo LLM config + consolidation cadence — loud warn, no silent fallback) | cli | `mono-agent validate` |
37
37
  | Host summaries appended after runs | config | `memory.writeMode: "append-host-summary"` |
38
- | 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
+ | Auto-provisioned read-only `MemoryRecall` 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) |
39
39
 
40
40
  ## Tools, MCP, sandbox
41
41
 
42
42
  | Capability | Coverage | Where |
43
43
  | --- | --- | --- |
44
- | Fail-closed tool policy (empty allowlist = no tools) | auto | default |
45
- | Tool allow/deny lists (deny wins) | config | `tools.allowedTools`, `tools.disallowedTools` |
44
+ | Allow-all tool policy (omitted / `["*"]` = all tools; `[]` = none) | config | default `tools.allowedTools`; the harness no-policy safety net is `failClosedToolPolicy()` |
45
+ | Tool allow/deny lists (deny wins, even under allow-all; pi doesn't deny external MCP tools) | config | `tools.allowedTools`, `tools.disallowedTools` |
46
46
  | MCP servers (stdio/sse/http) from a JSON file | config | `tools.mcpConfigPath` |
47
- | 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 |
47
+ | 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 |
48
48
  | Sandbox on/off + srt engine | config | `sandbox.mode` |
49
49
  | Network policy (none/localhost/allowlist/all) | config | `sandbox.network.{mode,allowlist}` |
50
50
  | Filesystem scopes (readable/writable roots, deny-write globs) | config | `sandbox.readableRoots`, `sandbox.writableRoots`, `sandbox.denyWrite` |
@@ -78,11 +78,13 @@ Every framework capability and how a composed agent reaches it. This table is th
78
78
  | Phoenix trace viewer (OTLP exporter; local JSONL artifacts are the fallback) | config | `observability.exporters` (phoenix entry) |
79
79
  | 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) |
80
80
  | Session Recorder web PWA (read-only run browser) | cli | `mono-agent web [--host] [--port] [--no-open] [--allow-non-loopback] [--include-memory]`; consumes the default-on `live` relay and local artifacts; memory runs are opt-in |
81
- | Executable config blueprints (generate config + `.env.example` + checklist) | cli | `mono-agent recipes list\|show <id>`, `mono-agent init --recipe <id>` |
81
+ | 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) |
82
+ | Interactive setup wizard (preset/custom; walks model→channels→memory→tools→sandbox→observability) | cli | `mono-agent init` (no flags, on a TTY; `setup` alias) |
83
+ | 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 |
82
84
  | Resolved config view (every field tagged env/json/default) | cli | `mono-agent config` |
83
- | Scaffold / validate / start / install-skill | cli | `mono-agent init\|validate [--consumer <path>]\|config\|recipes\|start\|install-skill` |
84
- | Recipe capability check (selected recipe live?) | cli | `mono-agent validate --recipe <id>` |
85
+ | 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` |
86
+ | Preset capability check (selected preset live?) | cli | `mono-agent validate --preset <id>` |
85
87
  | `.env` auto-loading | cli | automatic; `--env-file <path>` |
86
88
  | Explicit failure objects (no fake success) | auto | harness |
87
89
  | Per-request runtime options, custom memory/history stores | code | `createConfiguredAgentResponder` options |
88
- | Multi-agent delegation (`ask_collaborator` loopback MCP tool) | code | `@mono-agent/agent-orchestrator` |
90
+ | Multi-agent delegation (`AskCollaborator` loopback MCP tool) | code | `@mono-agent/agent-orchestrator` |
@@ -51,7 +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; re-exports `MemoryStore`/`MemoryBlock`/`MemoryWriteResult` from `@mono-agent/agent-contracts` |
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 + scheduled consolidation (bujo) |
53
53
  | Embedding providers | `@mono-agent/memory/search` | Ollama/OpenAI embedding providers used by the store subpath 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
+ | Recall tool surface | `@mono-agent/agent-app` (bundled) | Auto-provisions a read-only `MemoryRecall` 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 |
55
55
 
56
56
  Mono-agent selected skills are not auto-selected by description. The host chooses `context.selectedSkills`, and the harness loads those exact bodies.
57
57
 
@@ -72,21 +72,21 @@ Use `@mono-agent/agent-harness` directly when a host needs custom prompt/runtime
72
72
 
73
73
  ## Tools And MCP Join
74
74
 
75
- Use `@mono-agent/agent-harness` for fail-closed tool/MCP policy normalization:
75
+ Use `@mono-agent/agent-harness` for tool/MCP policy normalization. The **config** default is allow-all (`["*"]`); `createToolPolicy` itself does no defaulting, and the harness's no-policy safety net is `failClosedToolPolicy()` (an empty, fail-closed policy):
76
76
 
77
77
  ```ts
78
78
  import { createToolPolicy, toolPolicyToRuntimeOptions } from "@mono-agent/agent-harness";
79
79
 
80
80
  const policy = createToolPolicy({
81
- allowedTools: ["Read", "Grep"],
82
- disallowedTools: ["WebFetch"],
81
+ allowedTools: ["*"], // ["*"] = all; ["Read","Grep"] = specific; [] = none
82
+ disallowedTools: ["WebFetch"], // deny wins, even under allow-all
83
83
  mcpConfigPath: "./mcp.json",
84
84
  });
85
85
 
86
86
  const runtimeOptions = toolPolicyToRuntimeOptions(policy);
87
87
  ```
88
88
 
89
- Do not grant broad tool access as a fallback. If the requested task needs tools, ask for the narrow allowlist or MCP config path.
89
+ Match the user's intent: allow-all is the recommended default. Prefer subtracting with `disallowedTools` over hand-curating an allowlist, and only narrow to a specific list when the user asks for it.
90
90
 
91
91
  ## Adapter Join
92
92
 
@@ -127,6 +127,7 @@ Supported model reference families:
127
127
 
128
128
  - `codex:<model>` with CLI execution
129
129
  - `claude:<model>` with SDK or CLI execution
130
- - `pi:<provider>:<model>` with SDK execution, including local providers such as Ollama
130
+ - `pi:<provider>:<model>` with SDK execution, including Pi OpenAI-Codex, OpenCode-through-Pi (`pi:opencode-go:*`), and local providers such as Ollama and LM Studio
131
+ - `opencode:<provider>:<model>` with CLI execution for hand-authored OpenCode backend config
131
132
 
132
133
  Provider credentials belong in the provider/runtime environment, not in committed config.
@@ -29,23 +29,23 @@ Flow, check whether one of these fits and adapt it. Verify every key against
29
29
  }
30
30
  ```
31
31
  **Steps:** `ollama pull nomic-embed-text:v1.5 && ollama pull qwen3.6:latest` → `mono-agent init --model claude:claude-sonnet-4-6 --memory bujo` → add telegram + fill embeddings/llm + `writeMode: capture` → `mono-agent validate` (confirm memory liveness + consolidation cadence) → `mono-agent start`.
32
- **Smoke:** send a fact from the allowed chat, then ask a paraphrased question later; confirm `memory_recall` in the run JSONL and that the answer uses it.
32
+ **Smoke:** send a fact from the allowed chat, then ask a paraphrased question later; confirm `MemoryRecall` in the run JSONL and that the answer uses it.
33
33
 
34
34
  ## 2. Slack team bot with MCP tools
35
35
  **For:** a DevOps engineer running a shared team bot.
36
- **Goal:** a mention-triggered Slack Socket Mode bot with a custom MCP tool, Read/Grep, and `slack_send_message` for proactive posts.
36
+ **Goal:** a mention-triggered Slack Socket Mode bot with a custom MCP tool, Read/Grep, and `SlackSendMessage` for proactive posts.
37
37
  **Features:** `slack.socket-mode`, `tool-policy.allowlist`, `tool-policy.mcp-servers`, `agent-app.adapter-send-tools`, `runtime.concurrency`.
38
38
 
39
39
  ```json
40
40
  {
41
41
  "runtime": { "model": "claude:claude-sonnet-4-6" },
42
42
  "slack": { "enabled": true, "botToken": "xoxb-...", "appToken": "xapp-...", "allowedChannelIds": ["C012345"], "botUserIds": ["U012345"], "mentionTextAliases": ["@agent"] },
43
- "tools": { "allowedTools": ["Read", "Grep", "slack_send_message", "deployTool"], "mcpConfigPath": "./mcp.json" },
43
+ "tools": { "allowedTools": ["Read", "Grep", "SlackSendMessage", "deployTool"], "mcpConfigPath": "./mcp.json" },
44
44
  "concurrency": { "maxConcurrentRuns": 4, "maxPendingRuns": 8 }
45
45
  }
46
46
  ```
47
- **Steps:** create a Slack app (Socket Mode app token + bot token) → `mono-agent init` → write `mcp.json` and add the MCP tool's exact name to `allowedTools` → add slack + `slack_send_message` → `validate` → `start`.
48
- **Smoke:** mention the bot in an allowed channel; confirm the 👀 reaction, final answer, the MCP tool firing in the artifact, and that `slack_send_message` posts only to allowed channels.
47
+ **Steps:** create a Slack app (Socket Mode app token + bot token) → `mono-agent init` (allow-all by default) → write `mcp.json` (the MCP tool becomes available from the server declaration — MCP tools aren't gated by `allowedTools`) → add slack; `SlackSendMessage` is auto-available under allow-all, or name it if you narrow to a specific allowlist → `validate` → `start`.
48
+ **Smoke:** mention the bot in an allowed channel; confirm the 👀 reaction, final answer, the MCP tool firing in the artifact, and that `SlackSendMessage` posts only to allowed channels.
49
49
 
50
50
  ## 3. Fully local Ollama agent (no cloud)
51
51
  **For:** a privacy-focused user with no cloud budget.
@@ -107,12 +107,12 @@ Flow, check whether one of these fits and adapt it. Verify every key against
107
107
  {
108
108
  "runtime": { "model": "claude:claude-sonnet-4-6" },
109
109
  "slack": { "enabled": true, "botToken": "xoxb-...", "appToken": "xapp-...", "allowedChannelIds": ["C012345"] },
110
- "tools": { "allowedTools": ["slack_send_message", "WebSearch"] },
111
- "cron": { "jobs": [{ "id": "morning-digest", "enabled": true, "expression": "0 9 * * *", "timezone": "America/New_York", "prompt": "Build the morning digest and post it to #team via slack_send_message.", "conversationId": "daily-digest" }] }
110
+ "tools": { "allowedTools": ["SlackSendMessage", "WebSearch"] },
111
+ "cron": { "jobs": [{ "id": "morning-digest", "enabled": true, "expression": "0 9 * * *", "timezone": "America/New_York", "prompt": "Build the morning digest and post it to #team via SlackSendMessage.", "conversationId": "daily-digest" }] }
112
112
  }
113
113
  ```
114
- **Steps:** `mono-agent init` → add slack + `slack_send_message` → add the cron job (or `cron/morning-digest.md`) with `conversationId` + IANA timezone → `validate` → `start`.
115
- **Smoke:** trigger a one-off tick; confirm `slack_send_message` posts the digest to the allowed channel and `conversationId` shares context across ticks.
114
+ **Steps:** `mono-agent init` → add slack + `SlackSendMessage` → add the cron job (or `cron/morning-digest.md`) with `conversationId` + IANA timezone → `validate` → `start`.
115
+ **Smoke:** trigger a one-off tick; confirm `SlackSendMessage` posts the digest to the allowed channel and `conversationId` shares context across ticks.
116
116
 
117
117
  ## 7. A2A provider + consumer pair
118
118
  **For:** a platform integrator connecting two agents over A2A.
@@ -139,9 +139,9 @@ Flow, check whether one of these fits and adapt it. Verify every key against
139
139
  **Steps:** provider — `init`, add the `@mono-agent/a2a-adapter` plugin entry with `provider`/`agent`/`skill` + bearer, `validate`, `start`, confirm the Agent Card is reachable. Consumer — set plugin `config.consumer` (or compose `createA2AConsumerResponder`), send text to the provider's Agent Card URL with the bearer.
140
140
  **Smoke:** send a message to the provider's Agent Card URL with the bearer; confirm a real response.
141
141
 
142
- ## 8. Multi-agent orchestration (`ask_collaborator`) — code
142
+ ## 8. Multi-agent orchestration (`AskCollaborator`) — code
143
143
  **For:** a workflow designer composing specialist agents.
144
- **Goal:** one orchestrator delegates to named collaborator responders via the loopback `ask_collaborator` MCP tool.
144
+ **Goal:** one orchestrator delegates to named collaborator responders via the loopback `AskCollaborator` MCP tool.
145
145
  **Features:** `orchestrator.ask-collaborator`, `harness.request-runtime-options`, `runtime.custom`.
146
146
 
147
147
  ```ts
@@ -155,21 +155,21 @@ const ext = createCollaboratorToolRuntimeExtension({
155
155
  // pass ext.runtimeOptions via createConfiguredAgentResponder({ runtimeOptionsForRequest })
156
156
  // call ext.cleanup() on disposal to close the ephemeral MCP server
157
157
  ```
158
- **Smoke:** give a compound task ("research X then write a summary"); confirm the artifact shows `ask_collaborator` delegating to both, and `cleanup()` closes the MCP port.
158
+ **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.
159
159
 
160
160
  ## 9. Sandboxed code agent (loopback only, deny .env)
161
161
  **For:** a security team deploying an internal code assistant.
162
162
  **Goal:** read repos + run Bash inside the native srt sandbox with loopback-only network access and protected secrets.
163
- **Features:** `sandbox.mode`, `sandbox.network-policy`, `sandbox.filesystem-scopes`, `sandbox.fallback`, `tool-policy.allowlist`, `memory.journal`.
163
+ **Features:** `sandbox.mode`, `sandbox.network-policy`, `sandbox.filesystem-scopes`, `sandbox.fallback`, `tool-policy.allow-all`, `memory.journal`.
164
164
 
165
165
  ```json
166
166
  {
167
167
  "runtime": { "model": "claude:claude-sonnet-4-6" },
168
- "tools": { "allowedTools": ["Read", "Write", "Edit", "Glob", "Grep", "Bash"] },
168
+ "tools": { "allowedTools": ["*"] },
169
169
  "sandbox": { "mode": "native", "network": { "mode": "localhost" }, "readableRoots": ["."], "writableRoots": ["."], "denyWrite": [".env", ".env.*", ".git/config", ".git/hooks/**"], "fallback": "fail-closed" }
170
170
  }
171
171
  ```
172
- **Steps:** `mono-agent init --memory journal` → allow Read/Write/Edit/Glob/Grep/Bash → `sandbox.mode native` + `network localhost` + deny-write defaults → keep `fallback: fail-closed` (do NOT set `unsafe-host-process`) → `validate` → `start`.
172
+ **Steps:** `mono-agent init --memory journal` → leave tools at the allow-all default (`["*"]`); the **sandbox**, not an allowlist, is what constrains the code tools → `sandbox.mode native` + `network localhost` + deny-write defaults → keep `fallback: fail-closed` (do NOT set `unsafe-host-process`) → `validate` → `start`.
173
173
  **Smoke:** ask it to read a file + run Bash (works), then fetch an external URL or write `.env` (both blocked in the artifact). Note: provider CLI bridges run their own tool loops and may not be srt-wrapped — pair with provider sandboxing.
174
174
 
175
175
  ## 10. Phoenix-observed agent with the TUI
@@ -216,7 +216,7 @@ const ext = createCollaboratorToolRuntimeExtension({
216
216
 
217
217
  ## 13. Personal Telegram assistant with Supermemory
218
218
  **For:** a power user trying an external memory layer while keeping the agent local.
219
- **Goal:** a Telegram bot captures turns into a local or hosted Supermemory instance and recalls through the same `memory_recall` tool.
219
+ **Goal:** a Telegram bot captures turns into a local or hosted Supermemory instance and recalls through the same `MemoryRecall` tool.
220
220
  **Features:** `telegram.long-polling`, `memory.backend-supermemory`, `memory.per-turn-capture`, `memory.recall-tool`.
221
221
 
222
222
  ```json
@@ -231,8 +231,8 @@ const ext = createCollaboratorToolRuntimeExtension({
231
231
  }
232
232
  }
233
233
  ```
234
- **Steps:** run `supermemory-server`, save its `sm_...` key in `.env`, `mono-agent init --recipe personal-telegram-supermemory`, add Telegram token/chat id, `validate`, `start`.
235
- **Smoke:** send a fact, wait for ingestion, then ask a paraphrased question; confirm the run shows `memory_recall` returning Supermemory hits.
234
+ **Steps:** run `supermemory-server`, save its `sm_...` key in `.env`, `mono-agent init --preset telegram-supermemory --yes`, add Telegram token/chat id, `validate`, `start`.
235
+ **Smoke:** send a fact, wait for ingestion, then ask a paraphrased question; confirm the run shows `MemoryRecall` returning Supermemory hits.
236
236
 
237
237
  ## 14. Fully local LM Studio agent
238
238
  **For:** a privacy-focused user who prefers LM Studio's GUI local server.
@@ -247,21 +247,21 @@ const ext = createCollaboratorToolRuntimeExtension({
247
247
  "webhook": { "enabled": true }
248
248
  }
249
249
  ```
250
- **Steps:** start LM Studio's local server with the chosen model loaded → `mono-agent init --recipe local-lmstudio-private` → adjust `runtime.model` if the displayed model id differs → `validate` → `start`.
250
+ **Steps:** start LM Studio's local server with the chosen model loaded → `mono-agent init --model pi:lmstudio:qwen3.6-32b --memory lite` (the `pi:lmstudio:*` model auto-adds the LM Studio provider block; there is no LM Studio preset — `local-private` is Ollama-based) → adjust `runtime.model` if the displayed model id differs → `validate` → `start`.
251
251
  **Smoke:** `curl` the webhook invoke URL and confirm the response comes from the local LM Studio model.
252
252
 
253
253
  ## 15. Interactive agent with long jobs and large media
254
254
  **For:** a builder whose Telegram agent needs to ask before acting, run multi-minute tools, and exchange large files.
255
- **Goal:** one Telegram agent uses `ask_user`, long-running MCP tool progress, a self-hosted Bot API server, and `telegram_send_document`.
255
+ **Goal:** one Telegram agent uses `AskUser`, long-running MCP tool progress, a self-hosted Bot API server, and `TelegramSendFile`.
256
256
  **Features:** `telegram.long-polling`, `agent-app.adapter-send-tools`, `interaction.ask-user`, `interaction.progress`, `tool-policy.mcp-servers`.
257
257
 
258
258
  ```json
259
259
  {
260
260
  "runtime": { "model": "pi:openai-codex:gpt-5.5", "executionMode": "sdk" },
261
- "tools": { "allowedTools": ["Read", "ask_user", "telegram_send_document"], "mcpConfigPath": "./.mcp.json", "mcpCallMaxTotalTimeoutMs": 2700000 },
261
+ "tools": { "allowedTools": ["Read", "AskUser", "TelegramSendFile"], "mcpConfigPath": "./.mcp.json", "mcpCallMaxTotalTimeoutMs": 2700000 },
262
262
  "interaction": { "bridge": { "host": "127.0.0.1", "port": 4471 }, "askUser": { "timeoutMs": 600000 }, "progress": { "enabled": true } },
263
263
  "telegram": { "enabled": true, "allowedChatIds": ["123456789"], "apiRoot": "http://127.0.0.1:8081", "attachments": { "maxBytes": 268435456, "maxUploadBytes": 268435456 } }
264
264
  }
265
265
  ```
266
266
  **Steps:** run a loopback self-hosted Bot API server if files exceed 20 MB, wire a long-running MCP tool in `.mcp.json`, `validate`, `start`.
267
- **Smoke:** send media with no caption, answer the `ask_user` question, watch progress update during the long job, and receive the generated file via `telegram_send_document`.
267
+ **Smoke:** send media with no caption, answer the `AskUser` question, watch progress update during the long job, and receive the generated file via `TelegramSendFile`.
@@ -83,15 +83,15 @@ pnpm run test:demo
83
83
  | TUI | Start the host and complete one local prompt. |
84
84
  | Telegram | Send one allowed chat message and verify the reply. |
85
85
  | Slack | Send one allowed DM or channel message and verify formatting. |
86
- | Adapter send tools | When `tools.allowedTools` includes `slack_send_message` / `telegram_send_message`, call them from a non-Slack/Telegram surface such as TUI, cron, or OpenAI API to an allowed destination and verify delivery. |
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. |
87
87
  | WhatsApp | Send one allowed sender/group trigger and verify the reply. |
88
88
  | OpenAI API | `curl /v1/models` and `/v1/chat/completions`. |
89
89
  | A2A | Send text to the Agent Card URL with `sendA2AMessage()`. |
90
90
  | Webhook | `curl` the invocation path and inspect the response body/status. |
91
91
  | Cron | Run a one-off scheduled invocation or wait for one tick. |
92
92
  | Observability | Confirm a run writes a redacted JSONL artifact; if an `observability.exporters` Phoenix entry is set, confirm the trace appears in Phoenix. |
93
- | Memory recall tool | With `memory.recallTool.enabled` (default on for journal/bujo with embeddings), ask the agent to recall an old note and confirm `memory_recall` appears in the run artifact and returns it. |
94
- | Semantic memory search | With `memory.embeddings` set (Ollama: `ollama pull nomic-embed-text:v1.5` first), ask a paraphrased question about an old note and confirm `memory_recall` (hybrid keyword + semantic) returns it. |
93
+ | Memory recall tool | With `memory.recallTool.enabled` (default on for journal/bujo with embeddings), ask the agent to recall an old note and confirm `MemoryRecall` appears in the run artifact and returns it. |
94
+ | Semantic memory search | With `memory.embeddings` set (Ollama: `ollama pull nomic-embed-text:v1.5` first), ask a paraphrased question about an old note and confirm `MemoryRecall` (hybrid keyword + semantic) returns it. |
95
95
 
96
96
  ## Failure Handling
97
97
 
@@ -1,15 +0,0 @@
1
- import type { MonoAgentConfigJson } from "@mono-agent/config";
2
- import type { RecipeInput, RecipeInputValues } from "./types.js";
3
- export declare const DEFAULT_MODEL = "claude:claude-sonnet-4-6";
4
- /** The model input every recipe shares; overridable from `--model`. */
5
- export declare const MODEL_INPUT: RecipeInput;
6
- /**
7
- * The adapter-neutral skeleton every recipe extends: runtime model, identity,
8
- * empty tool policy, local artifacts, and the trace registry. Recipes spread
9
- * this and add their channel / memory / sandbox / observability blocks. Mirrors
10
- * `init.ts`'s scaffold so a recipe-built folder matches a hand-init'd one.
11
- */
12
- export declare function baseConfig(input: RecipeInputValues): MonoAgentConfigJson;
13
- /** A `memory` block for the given tier, rooted at the standard memory path. */
14
- export declare function memoryBlock(mode: "lite" | "journal" | "bujo"): NonNullable<MonoAgentConfigJson["memory"]>;
15
- //# sourceMappingURL=base.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/recipes/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEjE,eAAO,MAAM,aAAa,6BAA6B,CAAC;AAExD,uEAAuE;AACvE,eAAO,MAAM,WAAW,EAAE,WAKzB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,mBAAmB,CA0BxE;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAChC,WAAW,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAM5C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/recipes/base.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,MAAM,CAAC,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAExD,uEAAuE;AACvE,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,EAAE,EAAE,OAAO;IACX,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,sGAAsG;IACnH,OAAO,EAAE,aAAa;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAwB;IACjD,OAAO,yBAAyB,CAAC;QAC/B,OAAO,EAAE;YACP,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,aAAa;YACnC,SAAS,EAAE,GAAG;SACf;QACD,OAAO,EAAE;YACP,YAAY,EAAE,eAAe;YAC7B,cAAc,EAAE,EAAE;SACnB;QACD,KAAK,EAAE;YACL,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,EAAE;SACpB;QACD,SAAS,EAAE;YACT,GAAG,EAAE,yBAAyB;YAC9B,SAAS,EAAE;gBACT,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,KAAK;aACd;SACF;QACD,YAAY,EAAE;YACZ,WAAW,EAAE,6BAA6B;SAC3C;KACqB,CAAC,CAAC;AAC5B,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CACzB,IAAiC;IAEjC,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,sBAAsB;QAC5B,SAAS,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB;KAC/D,CAAC;AACJ,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { AgentRecipe } from "./types.js";
2
- /** Ordered catalog — starter recipes first, then the two full blueprints. */
3
- export declare const RECIPE_CATALOG: readonly AgentRecipe[];
4
- //# sourceMappingURL=catalog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/recipes/catalog.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAqhBjE,6EAA6E;AAC7E,eAAO,MAAM,cAAc,EAAE,SAAS,WAAW,EAchD,CAAC"}