@ouro.bot/cli 0.1.0-alpha.190 → 0.1.0-alpha.191
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/changelog.json +7 -87
- package/dist/repertoire/mcp-manager.js +54 -1
- package/package.json +1 -1
package/changelog.json
CHANGED
|
@@ -2,105 +2,25 @@
|
|
|
2
2
|
"_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
|
|
3
3
|
"versions": [
|
|
4
4
|
{
|
|
5
|
-
"version": "0.1.0-alpha.
|
|
5
|
+
"version": "0.1.0-alpha.191",
|
|
6
6
|
"changes": [
|
|
7
|
-
"feat(
|
|
8
|
-
"feat(prompt): self-fix workflow contract",
|
|
9
|
-
"feat(coding): verification truthfulness"
|
|
7
|
+
"feat(mcp): dynamic server add/remove \u2014 agents can manage MCP servers without daemon restart"
|
|
10
8
|
]
|
|
11
9
|
},
|
|
12
10
|
{
|
|
13
|
-
"version": "0.1.0-alpha.
|
|
14
|
-
"changes": [
|
|
15
|
-
"feat(heart): ResumeHandle type, primary obligation selection, status priority",
|
|
16
|
-
"feat(heart): lane/obligation precedence rules",
|
|
17
|
-
"feat(heart): cross-session change detection (snapshot, diff, format)",
|
|
18
|
-
"feat(cli): TUI edge-case hardening (44 new tests)",
|
|
19
|
-
"feat(mind): memory judgement heuristics in system prompt",
|
|
20
|
-
"feat(mind): memory feedback loop (noise prevention)",
|
|
21
|
-
"fix(cli): blockquote wrap width for narrow terminals"
|
|
22
|
-
]
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"version": "0.1.0-alpha.187",
|
|
26
|
-
"changes": [
|
|
27
|
-
"refactor: collapse AgentRelationship into FriendRecord \u2014 one identity system for humans and agents",
|
|
28
|
-
"refactor: rename AdoptionSpecialist to SerpentGuide",
|
|
29
|
-
"feat(hatch): detect API keys from environment variables (ANTHROPIC_API_KEY, OPENAI_API_KEY, AZURE_OPENAI_API_KEY, MINIMAX_API_KEY, GITHUB_TOKEN)",
|
|
30
|
-
"fix(cli): React unmount warning suppression covers SerpentGuide exit path"
|
|
31
|
-
]
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"version": "0.1.0-alpha.185",
|
|
35
|
-
"changes": [
|
|
36
|
-
"fix(hatch): pass model name to adoption specialist from discovered credentials",
|
|
37
|
-
"feat(continuity): wake packets, episodes, cares, intentions, peer presence, and temporal self",
|
|
38
|
-
"fix(continuity): deduplicate obligations in prompt, keep session summary, pass preloaded data",
|
|
39
|
-
"feat(continuity): 9 new modules \u2014 episodes, cares, agent-relationships, intentions, presence, tempo, temporal-view, wake-packet, obligation enrichment",
|
|
40
|
-
"feat(continuity): 8 new tools \u2014 query_episodes, capture_episode, query_presence, query_cares, care_manage, query_relationships, intention_capture, intention_manage",
|
|
41
|
-
"feat(continuity): 3-layer architecture \u2014 durable state, derived views, surfaces",
|
|
42
|
-
"feat(pipeline): continuity threading \u2014 tempo derivation, wake packet assembly, presence update, episode emission on every turn",
|
|
43
|
-
"feat(prompt): wake packet prompt section with token budget and truncation priority",
|
|
44
|
-
"feat(coding): coding context receives compact wake packet, coding completion emits episodes",
|
|
45
|
-
"feat(outlook): expose continuity data (presence, cares, episodes) to outlook surfaces"
|
|
46
|
-
]
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"version": "0.1.0-alpha.183",
|
|
50
|
-
"changes": [
|
|
51
|
-
"fix(cli): status/hints moved BELOW input box (between bottom separator and end)",
|
|
52
|
-
"fix(cli): Ctrl-C double-press requires 2s window (not any two presses ever)",
|
|
53
|
-
"feat(cli): /help command with all keyboard shortcuts",
|
|
54
|
-
"docs: CLI keyboard shortcuts documentation"
|
|
55
|
-
]
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"version": "0.1.0-alpha.182",
|
|
59
|
-
"changes": [
|
|
60
|
-
"fix(cli): remove persistent status bar from input box (header already shows info)",
|
|
61
|
-
"fix(cli): Meta+B/F word movement (Option+Arrow on macOS)",
|
|
62
|
-
"fix(cli): Meta+D delete word forward"
|
|
63
|
-
]
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"version": "0.1.0-alpha.181",
|
|
67
|
-
"changes": [
|
|
68
|
-
"feat(cli): Option+Arrow word jumping, Ctrl+A/E home/end, cursor positioning",
|
|
69
|
-
"feat(cli): never suppress input \u2014 type while agent responds (TTFA)",
|
|
70
|
-
"fix(cli): blockquote continuation lines keep \u2502 prefix on wrap",
|
|
71
|
-
"feat(cli): Option+Backspace to delete word"
|
|
72
|
-
]
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"version": "0.1.0-alpha.180",
|
|
76
|
-
"changes": [
|
|
77
|
-
"fix(cli): suppress React unmount warning on TUI exit"
|
|
78
|
-
]
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"version": "0.1.0-alpha.179",
|
|
82
|
-
"changes": [
|
|
83
|
-
"feat(cli): generous vertical whitespace between TUI sections",
|
|
84
|
-
"feat(cli): image placeholder rendering (\ud83d\uddbc) for markdown images",
|
|
85
|
-
"feat(cli): Alt+Enter multi-line input with continuation prefix",
|
|
86
|
-
"feat(cli): terminal width safety (cap at 200, subtract margin)",
|
|
87
|
-
"fix(cli): settle/ponder/observe/rest fully hidden from imperative tool display"
|
|
88
|
-
]
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
"version": "0.1.0-alpha.178",
|
|
11
|
+
"version": "0.1.0-alpha.177",
|
|
92
12
|
"changes": [
|
|
93
|
-
"
|
|
13
|
+
"feat(mcp): dynamic server add/remove without restart"
|
|
94
14
|
]
|
|
95
15
|
},
|
|
96
16
|
{
|
|
97
|
-
"version": "0.1.0-alpha.
|
|
17
|
+
"version": "0.1.0-alpha.176",
|
|
98
18
|
"changes": [
|
|
99
|
-
"
|
|
19
|
+
"feat(mcp): dynamic MCP server add/remove \u2014 agents can add/remove MCP servers in agent.json without daemon restart"
|
|
100
20
|
]
|
|
101
21
|
},
|
|
102
22
|
{
|
|
103
|
-
"version": "0.1.0-alpha.
|
|
23
|
+
"version": "0.1.0-alpha.175",
|
|
104
24
|
"changes": [
|
|
105
25
|
"fix(daemon): launchd KeepAlive for crash recovery \u2014 auto-restarts on crash",
|
|
106
26
|
"fix(daemon): orphan killer excludes MCP server processes",
|
|
@@ -41,6 +41,53 @@ class McpManager {
|
|
|
41
41
|
}
|
|
42
42
|
return entry.client.callTool(tool, args);
|
|
43
43
|
}
|
|
44
|
+
/* v8 ignore start — reconcile: dynamic MCP server management, tested via integration @preserve */
|
|
45
|
+
/** Re-read agent config and connect new servers / disconnect removed ones. */
|
|
46
|
+
async reconcile() {
|
|
47
|
+
try {
|
|
48
|
+
const config = (0, identity_1.loadAgentConfig)();
|
|
49
|
+
const servers = config.mcpServers ?? {};
|
|
50
|
+
const currentNames = new Set(this.servers.keys());
|
|
51
|
+
const desiredNames = new Set(Object.keys(servers));
|
|
52
|
+
// Connect new servers
|
|
53
|
+
for (const [name, cfg] of Object.entries(servers)) {
|
|
54
|
+
if (!currentNames.has(name)) {
|
|
55
|
+
(0, runtime_1.emitNervesEvent)({
|
|
56
|
+
event: "mcp.server_added",
|
|
57
|
+
component: "repertoire",
|
|
58
|
+
message: `connecting new MCP server: ${name}`,
|
|
59
|
+
meta: { server: name, command: cfg.command },
|
|
60
|
+
});
|
|
61
|
+
await this.connectServer(name, cfg);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Disconnect removed servers
|
|
65
|
+
for (const name of currentNames) {
|
|
66
|
+
if (!desiredNames.has(name)) {
|
|
67
|
+
(0, runtime_1.emitNervesEvent)({
|
|
68
|
+
event: "mcp.server_removed",
|
|
69
|
+
component: "repertoire",
|
|
70
|
+
message: `disconnecting removed MCP server: ${name}`,
|
|
71
|
+
meta: { server: name },
|
|
72
|
+
});
|
|
73
|
+
const entry = this.servers.get(name);
|
|
74
|
+
if (entry)
|
|
75
|
+
entry.client.shutdown();
|
|
76
|
+
this.servers.delete(name);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
(0, runtime_1.emitNervesEvent)({
|
|
82
|
+
level: "warn",
|
|
83
|
+
event: "mcp.reconcile_error",
|
|
84
|
+
component: "repertoire",
|
|
85
|
+
message: "failed to reconcile MCP servers",
|
|
86
|
+
meta: { reason: error instanceof Error ? error.message : String(error) },
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/* v8 ignore stop */
|
|
44
91
|
shutdown() {
|
|
45
92
|
this.shuttingDown = true;
|
|
46
93
|
(0, runtime_1.emitNervesEvent)({
|
|
@@ -148,11 +195,17 @@ let _sharedManagerPromise = null;
|
|
|
148
195
|
* Safe to call from multiple senses — will only create one instance.
|
|
149
196
|
*/
|
|
150
197
|
async function getSharedMcpManager() {
|
|
151
|
-
|
|
198
|
+
// If manager exists, reconcile to pick up config changes (new/removed servers)
|
|
199
|
+
/* v8 ignore start — reconcile on existing manager @preserve */
|
|
200
|
+
if (_sharedManager) {
|
|
201
|
+
await _sharedManager.reconcile();
|
|
152
202
|
return _sharedManager;
|
|
203
|
+
}
|
|
204
|
+
/* v8 ignore stop */
|
|
153
205
|
/* v8 ignore next -- race guard: deduplicates concurrent initialization calls @preserve */
|
|
154
206
|
if (_sharedManagerPromise)
|
|
155
207
|
return _sharedManagerPromise;
|
|
208
|
+
// Always re-check config — agent may have added servers since last call
|
|
156
209
|
_sharedManagerPromise = (async () => {
|
|
157
210
|
try {
|
|
158
211
|
const config = (0, identity_1.loadAgentConfig)();
|