hippo-memory 0.36.0 → 0.37.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 +16 -0
- package/dist/api.d.ts +20 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +23 -3
- package/dist/api.js.map +1 -1
- package/dist/benchmarks/e1.3/incident-recall-eval.js +74 -0
- package/dist/benchmarks/e1.3/incident-recall-eval.js.map +1 -0
- package/dist/benchmarks/e1.3/scenarios.json +2587 -0
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js +102 -0
- package/dist/benchmarks/e1.3/slack-1000-event-smoke.js.map +1 -0
- package/dist/cli.js +82 -0
- package/dist/cli.js.map +1 -1
- package/dist/connectors/slack/backfill.d.ts +42 -0
- package/dist/connectors/slack/backfill.d.ts.map +1 -0
- package/dist/connectors/slack/backfill.js +76 -0
- package/dist/connectors/slack/backfill.js.map +1 -0
- package/dist/connectors/slack/deletion.d.ts +14 -0
- package/dist/connectors/slack/deletion.d.ts.map +1 -0
- package/dist/connectors/slack/deletion.js +46 -0
- package/dist/connectors/slack/deletion.js.map +1 -0
- package/dist/connectors/slack/dlq.d.ts +21 -0
- package/dist/connectors/slack/dlq.d.ts.map +1 -0
- package/dist/connectors/slack/dlq.js +23 -0
- package/dist/connectors/slack/dlq.js.map +1 -0
- package/dist/connectors/slack/idempotency.d.ts +5 -0
- package/dist/connectors/slack/idempotency.d.ts.map +1 -0
- package/dist/connectors/slack/idempotency.js +13 -0
- package/dist/connectors/slack/idempotency.js.map +1 -0
- package/dist/connectors/slack/ingest.d.ts +27 -0
- package/dist/connectors/slack/ingest.d.ts.map +1 -0
- package/dist/connectors/slack/ingest.js +48 -0
- package/dist/connectors/slack/ingest.js.map +1 -0
- package/dist/connectors/slack/ratelimit.d.ts +9 -0
- package/dist/connectors/slack/ratelimit.d.ts.map +1 -0
- package/dist/connectors/slack/ratelimit.js +18 -0
- package/dist/connectors/slack/ratelimit.js.map +1 -0
- package/dist/connectors/slack/scope.d.ts +16 -0
- package/dist/connectors/slack/scope.d.ts.map +1 -0
- package/dist/connectors/slack/scope.js +13 -0
- package/dist/connectors/slack/scope.js.map +1 -0
- package/dist/connectors/slack/signature.d.ts +12 -0
- package/dist/connectors/slack/signature.d.ts.map +1 -0
- package/dist/connectors/slack/signature.js +20 -0
- package/dist/connectors/slack/signature.js.map +1 -0
- package/dist/connectors/slack/tenant-routing.d.ts +13 -0
- package/dist/connectors/slack/tenant-routing.d.ts.map +1 -0
- package/dist/connectors/slack/tenant-routing.js +17 -0
- package/dist/connectors/slack/tenant-routing.js.map +1 -0
- package/dist/connectors/slack/transform.d.ts +20 -0
- package/dist/connectors/slack/transform.d.ts.map +1 -0
- package/dist/connectors/slack/transform.js +31 -0
- package/dist/connectors/slack/transform.js.map +1 -0
- package/dist/connectors/slack/types.d.ts +35 -0
- package/dist/connectors/slack/types.d.ts.map +1 -0
- package/dist/connectors/slack/types.js +23 -0
- package/dist/connectors/slack/types.js.map +1 -0
- package/dist/connectors/slack/web-client.d.ts +12 -0
- package/dist/connectors/slack/web-client.d.ts.map +1 -0
- package/dist/connectors/slack/web-client.js +43 -0
- package/dist/connectors/slack/web-client.js.map +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +46 -1
- package/dist/db.js.map +1 -1
- package/dist/importers.js +3 -3
- package/dist/importers.js.map +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +174 -2
- package/dist/server.js.map +1 -1
- package/dist/src/ambient.js +147 -0
- package/dist/src/ambient.js.map +1 -0
- package/dist/src/api.js +343 -0
- package/dist/src/api.js.map +1 -0
- package/dist/src/audit.js +152 -0
- package/dist/src/audit.js.map +1 -0
- package/dist/src/auth.js +65 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/autolearn.js +143 -0
- package/dist/src/autolearn.js.map +1 -0
- package/dist/src/capture.js +512 -0
- package/dist/src/capture.js.map +1 -0
- package/dist/src/cli.js +4971 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/client.js +181 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/config.js +108 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/connectors/slack/backfill.js +76 -0
- package/dist/src/connectors/slack/backfill.js.map +1 -0
- package/dist/src/connectors/slack/deletion.js +46 -0
- package/dist/src/connectors/slack/deletion.js.map +1 -0
- package/dist/src/connectors/slack/dlq.js +23 -0
- package/dist/src/connectors/slack/dlq.js.map +1 -0
- package/dist/src/connectors/slack/idempotency.js +13 -0
- package/dist/src/connectors/slack/idempotency.js.map +1 -0
- package/dist/src/connectors/slack/ingest.js +48 -0
- package/dist/src/connectors/slack/ingest.js.map +1 -0
- package/dist/src/connectors/slack/ratelimit.js +18 -0
- package/dist/src/connectors/slack/ratelimit.js.map +1 -0
- package/dist/src/connectors/slack/scope.js +13 -0
- package/dist/src/connectors/slack/scope.js.map +1 -0
- package/dist/src/connectors/slack/signature.js +20 -0
- package/dist/src/connectors/slack/signature.js.map +1 -0
- package/dist/src/connectors/slack/tenant-routing.js +17 -0
- package/dist/src/connectors/slack/tenant-routing.js.map +1 -0
- package/dist/src/connectors/slack/transform.js +31 -0
- package/dist/src/connectors/slack/transform.js.map +1 -0
- package/dist/src/connectors/slack/types.js +23 -0
- package/dist/src/connectors/slack/types.js.map +1 -0
- package/dist/src/connectors/slack/web-client.js +43 -0
- package/dist/src/connectors/slack/web-client.js.map +1 -0
- package/dist/src/consolidate.js +517 -0
- package/dist/src/consolidate.js.map +1 -0
- package/dist/src/dag.js +104 -0
- package/dist/src/dag.js.map +1 -0
- package/dist/src/dashboard.js +409 -0
- package/dist/src/dashboard.js.map +1 -0
- package/dist/src/db.js +584 -0
- package/dist/src/db.js.map +1 -0
- package/dist/src/embeddings.js +344 -0
- package/dist/src/embeddings.js.map +1 -0
- package/dist/src/eval-suite.js +289 -0
- package/dist/src/eval-suite.js.map +1 -0
- package/dist/src/eval.js +187 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/extract.js +87 -0
- package/dist/src/extract.js.map +1 -0
- package/dist/src/handoff.js +30 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/hooks.js +582 -0
- package/dist/src/hooks.js.map +1 -0
- package/dist/src/importers.js +399 -0
- package/dist/src/importers.js.map +1 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/invalidation.js +94 -0
- package/dist/src/invalidation.js.map +1 -0
- package/dist/src/mcp/framing.js +45 -0
- package/dist/src/mcp/framing.js.map +1 -0
- package/dist/src/mcp/server.js +510 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/memory.js +280 -0
- package/dist/src/memory.js.map +1 -0
- package/dist/src/multihop.js +32 -0
- package/dist/src/multihop.js.map +1 -0
- package/dist/src/path-context.js +32 -0
- package/dist/src/path-context.js.map +1 -0
- package/dist/src/physics-config.js +26 -0
- package/dist/src/physics-config.js.map +1 -0
- package/dist/src/physics-state.js +163 -0
- package/dist/src/physics-state.js.map +1 -0
- package/dist/src/physics.js +361 -0
- package/dist/src/physics.js.map +1 -0
- package/dist/src/postinstall.js +68 -0
- package/dist/src/postinstall.js.map +1 -0
- package/dist/src/raw-archive.js +72 -0
- package/dist/src/raw-archive.js.map +1 -0
- package/dist/src/refine-llm.js +147 -0
- package/dist/src/refine-llm.js.map +1 -0
- package/dist/src/replay.js +117 -0
- package/dist/src/replay.js.map +1 -0
- package/dist/src/salience.js +74 -0
- package/dist/src/salience.js.map +1 -0
- package/dist/src/scheduler.js +67 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/scope.js +35 -0
- package/dist/src/scope.js.map +1 -0
- package/dist/src/search.js +801 -0
- package/dist/src/search.js.map +1 -0
- package/dist/src/server-detect.js +70 -0
- package/dist/src/server-detect.js.map +1 -0
- package/dist/src/server.js +784 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/shared.js +309 -0
- package/dist/src/shared.js.map +1 -0
- package/dist/src/sso.js +22 -0
- package/dist/src/sso.js.map +1 -0
- package/dist/src/store.js +1390 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/tenant.js +17 -0
- package/dist/src/tenant.js.map +1 -0
- package/dist/src/trace.js +64 -0
- package/dist/src/trace.js.map +1 -0
- package/dist/src/working-memory.js +149 -0
- package/dist/src/working-memory.js.map +1 -0
- package/dist/src/yaml.js +98 -0
- package/dist/src/yaml.js.map +1 -0
- package/dist/store.d.ts +9 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +30 -2
- package/dist/store.js.map +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/import.d.ts +0 -31
- package/dist/import.d.ts.map +0 -1
- package/dist/import.js +0 -307
- package/dist/import.js.map +0 -1
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hippo Memory MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Exposes hippo memory as MCP tools over stdio transport.
|
|
6
|
+
* Uses the programmatic API directly (no child process spawning).
|
|
7
|
+
*
|
|
8
|
+
* Usage: hippo mcp (or npx hippo-memory mcp)
|
|
9
|
+
*/
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import { createMemory, computeSchemaFit, Layer, applyOutcome, calculateStrength, } from '../memory.js';
|
|
13
|
+
import { hybridSearch, physicsSearch, markRetrieved } from '../search.js';
|
|
14
|
+
import { loadAllEntries, writeEntry, readEntry, loadActiveTaskSnapshot, listMemoryConflicts, resolveConflict } from '../store.js';
|
|
15
|
+
import { shareMemory, listPeers, getGlobalRoot } from '../shared.js';
|
|
16
|
+
import { consolidate } from '../consolidate.js';
|
|
17
|
+
import { execSync } from 'child_process';
|
|
18
|
+
import { fetchGitLog, extractLessons, deduplicateLesson, isGitRepo } from '../autolearn.js';
|
|
19
|
+
import { loadConfig } from '../config.js';
|
|
20
|
+
import { resolveConfidence } from '../memory.js';
|
|
21
|
+
import { resolveTenantId } from '../tenant.js';
|
|
22
|
+
// ── Find hippo root ──
|
|
23
|
+
function findHippoRoot() {
|
|
24
|
+
// Walk up from cwd
|
|
25
|
+
let dir = process.cwd();
|
|
26
|
+
while (true) {
|
|
27
|
+
const candidate = path.join(dir, '.hippo');
|
|
28
|
+
if (fs.existsSync(candidate))
|
|
29
|
+
return candidate;
|
|
30
|
+
const parent = path.dirname(dir);
|
|
31
|
+
if (parent === dir)
|
|
32
|
+
break;
|
|
33
|
+
dir = parent;
|
|
34
|
+
}
|
|
35
|
+
// Global fallback (respects $HIPPO_HOME / $XDG_DATA_HOME)
|
|
36
|
+
const global = getGlobalRoot();
|
|
37
|
+
if (fs.existsSync(global))
|
|
38
|
+
return global;
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
// MCP stdio transport spec: messages are newline-delimited JSON-RPC, no embedded newlines.
|
|
42
|
+
// https://modelcontextprotocol.io/specification/.../basic/transports#stdio
|
|
43
|
+
function send(msg) {
|
|
44
|
+
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
45
|
+
}
|
|
46
|
+
// ── Format helpers ──
|
|
47
|
+
function formatMemories(results, hippoRoot) {
|
|
48
|
+
if (results.length === 0)
|
|
49
|
+
return 'No relevant memories found.';
|
|
50
|
+
const config = loadConfig(hippoRoot);
|
|
51
|
+
const lines = [`Found ${results.length} memories:\n`];
|
|
52
|
+
for (const r of results) {
|
|
53
|
+
const conf = resolveConfidence(r.entry);
|
|
54
|
+
const tags = r.entry.tags.length > 0 ? ` tags: ${r.entry.tags.join(', ')}` : '';
|
|
55
|
+
lines.push(`[${conf}]${tags} (strength=${r.entry.strength.toFixed(2)})`);
|
|
56
|
+
lines.push(r.entry.content);
|
|
57
|
+
lines.push('');
|
|
58
|
+
}
|
|
59
|
+
return lines.join('\n');
|
|
60
|
+
}
|
|
61
|
+
// ── Tool definitions ──
|
|
62
|
+
const TOOLS = [
|
|
63
|
+
{
|
|
64
|
+
name: 'hippo_recall',
|
|
65
|
+
description: 'Retrieve relevant memories from the project memory store. Returns memories ranked by relevance, strength, and recency within the token budget. Use at session start or when you need context about a topic.',
|
|
66
|
+
inputSchema: {
|
|
67
|
+
type: 'object',
|
|
68
|
+
properties: {
|
|
69
|
+
query: { type: 'string', description: 'What to search for in memory (natural language)' },
|
|
70
|
+
budget: { type: 'number', description: 'Max tokens to return (default: 1500)' },
|
|
71
|
+
},
|
|
72
|
+
required: ['query'],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'hippo_remember',
|
|
77
|
+
description: 'Store a new memory. Use when you learn something non-obvious, hit an error, or discover a useful pattern. Memories decay over time unless retrieved. Errors get 2x half-life.',
|
|
78
|
+
inputSchema: {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: {
|
|
81
|
+
text: {
|
|
82
|
+
type: 'string',
|
|
83
|
+
description: 'The memory to store (1-2 sentences, specific and concrete)',
|
|
84
|
+
},
|
|
85
|
+
error: { type: 'boolean', description: 'Mark as error memory (doubles half-life)' },
|
|
86
|
+
pin: { type: 'boolean', description: 'Pin memory (never decays)' },
|
|
87
|
+
tag: { type: 'string', description: 'Optional tag for categorization' },
|
|
88
|
+
},
|
|
89
|
+
required: ['text'],
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'hippo_outcome',
|
|
94
|
+
description: 'Report whether recalled memories were useful. Strengthens good memories (+5 days half-life) and weakens bad ones (-3 days). Call after completing work.',
|
|
95
|
+
inputSchema: {
|
|
96
|
+
type: 'object',
|
|
97
|
+
properties: {
|
|
98
|
+
good: {
|
|
99
|
+
type: 'boolean',
|
|
100
|
+
description: 'true = memories helped, false = memories were irrelevant',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
required: ['good'],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'hippo_context',
|
|
108
|
+
description: 'Smart context injection: auto-detects current task from git state and returns relevant memories. Use at the start of any session.',
|
|
109
|
+
inputSchema: {
|
|
110
|
+
type: 'object',
|
|
111
|
+
properties: {
|
|
112
|
+
budget: { type: 'number', description: 'Max tokens (default: 1500)' },
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: 'hippo_status',
|
|
118
|
+
description: 'Check memory health: counts, strengths, at-risk memories, last consolidation time.',
|
|
119
|
+
inputSchema: {
|
|
120
|
+
type: 'object',
|
|
121
|
+
properties: {},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'hippo_learn',
|
|
126
|
+
description: 'Scan recent git commits for lessons from fix/revert/bug/refactor/perf patterns. Run after coding sessions.',
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: 'object',
|
|
129
|
+
properties: {
|
|
130
|
+
days: { type: 'number', description: 'Days to scan back (default: 7)' },
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: 'hippo_conflicts',
|
|
136
|
+
description: 'List open memory conflicts — contradictory memories that need resolution.',
|
|
137
|
+
inputSchema: {
|
|
138
|
+
type: 'object',
|
|
139
|
+
properties: {},
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: 'hippo_resolve',
|
|
144
|
+
description: 'Resolve a memory conflict by keeping one memory and weakening or deleting the other.',
|
|
145
|
+
inputSchema: {
|
|
146
|
+
type: 'object',
|
|
147
|
+
properties: {
|
|
148
|
+
conflict_id: { type: 'number', description: 'The conflict ID to resolve' },
|
|
149
|
+
keep: { type: 'string', description: 'ID of the memory to keep' },
|
|
150
|
+
forget: { type: 'boolean', description: 'Delete the loser instead of weakening (default: false)' },
|
|
151
|
+
},
|
|
152
|
+
required: ['conflict_id', 'keep'],
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: 'hippo_share',
|
|
157
|
+
description: 'Share a memory to the global store for cross-project use with transfer scoring.',
|
|
158
|
+
inputSchema: {
|
|
159
|
+
type: 'object',
|
|
160
|
+
properties: {
|
|
161
|
+
id: { type: 'string', description: 'Memory ID to share' },
|
|
162
|
+
force: { type: 'boolean', description: 'Share even if transfer score is low' },
|
|
163
|
+
},
|
|
164
|
+
required: ['id'],
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'hippo_peers',
|
|
169
|
+
description: 'List all projects that have contributed memories to the global shared store.',
|
|
170
|
+
inputSchema: {
|
|
171
|
+
type: 'object',
|
|
172
|
+
properties: {},
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
];
|
|
176
|
+
// ── Track last recalled IDs for outcome feedback ──
|
|
177
|
+
let lastRecalledIds = [];
|
|
178
|
+
// ── Tool execution ──
|
|
179
|
+
async function executeTool(name, args, ctx) {
|
|
180
|
+
// When a transport hands us a context (HTTP path), trust it: the HTTP
|
|
181
|
+
// server already resolved hippoRoot from its bound opts and tenantId
|
|
182
|
+
// from the Bearer token (or the loopback fallback). The stdio path
|
|
183
|
+
// continues to walk from cwd / fall back to the global root, and to
|
|
184
|
+
// resolve tenant from HIPPO_TENANT.
|
|
185
|
+
const hippoRoot = ctx?.hippoRoot ?? findHippoRoot();
|
|
186
|
+
if (!hippoRoot)
|
|
187
|
+
return 'No .hippo/ store found. Run: hippo init';
|
|
188
|
+
const config = loadConfig(hippoRoot);
|
|
189
|
+
// A5: every loadAllEntries() in this server returns to the caller and is
|
|
190
|
+
// tenant-isolated. Resolved once per tool call: prefer the transport's
|
|
191
|
+
// ctx.tenantId so an HTTP Bearer for tenant B doesn't drop to HIPPO_TENANT.
|
|
192
|
+
const tenantId = ctx?.tenantId ?? resolveTenantId({});
|
|
193
|
+
switch (name) {
|
|
194
|
+
case 'hippo_recall': {
|
|
195
|
+
const query = String(args.query || '');
|
|
196
|
+
const budget = Number(args.budget) || config.defaultBudget;
|
|
197
|
+
const entries = loadAllEntries(hippoRoot, tenantId);
|
|
198
|
+
const usePhysics = config.physics?.enabled !== false;
|
|
199
|
+
const results = usePhysics
|
|
200
|
+
? await physicsSearch(query, entries, { budget, hippoRoot, physicsConfig: config.physics })
|
|
201
|
+
: await hybridSearch(query, entries, { budget, hippoRoot });
|
|
202
|
+
// Mark retrieved and persist
|
|
203
|
+
const retrieved = markRetrieved(results.map((r) => r.entry));
|
|
204
|
+
for (const entry of retrieved)
|
|
205
|
+
writeEntry(hippoRoot, entry);
|
|
206
|
+
lastRecalledIds = retrieved.map((e) => e.id);
|
|
207
|
+
return formatMemories(results, hippoRoot);
|
|
208
|
+
}
|
|
209
|
+
case 'hippo_remember': {
|
|
210
|
+
const text = String(args.text || '');
|
|
211
|
+
if (!text)
|
|
212
|
+
return 'No text provided.';
|
|
213
|
+
const tags = [];
|
|
214
|
+
if (args.error)
|
|
215
|
+
tags.push('error');
|
|
216
|
+
if (args.tag)
|
|
217
|
+
tags.push(String(args.tag));
|
|
218
|
+
const existing = loadAllEntries(hippoRoot, tenantId);
|
|
219
|
+
const schemaFit = computeSchemaFit(text, tags, existing);
|
|
220
|
+
const entry = createMemory(text, {
|
|
221
|
+
layer: Layer.Episodic,
|
|
222
|
+
tags,
|
|
223
|
+
pinned: Boolean(args.pin),
|
|
224
|
+
source: 'mcp',
|
|
225
|
+
confidence: 'verified',
|
|
226
|
+
baseHalfLifeDays: config.defaultHalfLifeDays,
|
|
227
|
+
schema_fit: schemaFit,
|
|
228
|
+
tenantId,
|
|
229
|
+
});
|
|
230
|
+
writeEntry(hippoRoot, entry);
|
|
231
|
+
// Auto-sleep check
|
|
232
|
+
if (config.autoSleep.enabled) {
|
|
233
|
+
const allEntries = loadAllEntries(hippoRoot, tenantId);
|
|
234
|
+
const recentCount = allEntries.filter((e) => {
|
|
235
|
+
const age = (Date.now() - new Date(e.created).getTime()) / (1000 * 60 * 60);
|
|
236
|
+
return age < 24; // created in last 24 hours
|
|
237
|
+
}).length;
|
|
238
|
+
if (recentCount >= config.autoSleep.threshold) {
|
|
239
|
+
consolidate(hippoRoot);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return `Remembered [${entry.id}] (half-life: ${entry.half_life_days}d, tags: ${entry.tags.join(', ') || 'none'})`;
|
|
243
|
+
}
|
|
244
|
+
case 'hippo_outcome': {
|
|
245
|
+
const good = Boolean(args.good);
|
|
246
|
+
if (lastRecalledIds.length === 0)
|
|
247
|
+
return 'No recent recalls to apply outcome to.';
|
|
248
|
+
let count = 0;
|
|
249
|
+
for (const id of lastRecalledIds) {
|
|
250
|
+
const entry = readEntry(hippoRoot, id);
|
|
251
|
+
if (entry) {
|
|
252
|
+
const updated = applyOutcome(entry, good);
|
|
253
|
+
writeEntry(hippoRoot, updated);
|
|
254
|
+
count++;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return `Applied ${good ? 'positive' : 'negative'} outcome to ${count} memories`;
|
|
258
|
+
}
|
|
259
|
+
case 'hippo_context': {
|
|
260
|
+
const budget = Number(args.budget) || config.defaultContextBudget;
|
|
261
|
+
// Auto-detect query from git
|
|
262
|
+
let query = '';
|
|
263
|
+
try {
|
|
264
|
+
const branch = execSync('git rev-parse --abbrev-ref HEAD 2>/dev/null', { encoding: 'utf-8' }).trim();
|
|
265
|
+
const diff = execSync('git diff --cached --stat 2>/dev/null', { encoding: 'utf-8' }).trim();
|
|
266
|
+
const log = execSync('git log -1 --pretty=format:"%s" 2>/dev/null', { encoding: 'utf-8' }).trim();
|
|
267
|
+
query = [branch, log, diff].filter(Boolean).join(' ');
|
|
268
|
+
}
|
|
269
|
+
catch { /* not a git repo */ }
|
|
270
|
+
if (!query)
|
|
271
|
+
query = 'project context general';
|
|
272
|
+
const entries = loadAllEntries(hippoRoot, tenantId);
|
|
273
|
+
const usePhysicsCtx = config.physics?.enabled !== false;
|
|
274
|
+
const results = usePhysicsCtx
|
|
275
|
+
? await physicsSearch(query, entries, { budget, hippoRoot, physicsConfig: config.physics })
|
|
276
|
+
: await hybridSearch(query, entries, { budget, hippoRoot });
|
|
277
|
+
const retrieved = markRetrieved(results.map((r) => r.entry));
|
|
278
|
+
for (const entry of retrieved)
|
|
279
|
+
writeEntry(hippoRoot, entry);
|
|
280
|
+
lastRecalledIds = retrieved.map((e) => e.id);
|
|
281
|
+
const snapshot = loadActiveTaskSnapshot(hippoRoot);
|
|
282
|
+
const snapshotText = snapshot
|
|
283
|
+
? [
|
|
284
|
+
'## Active Task Snapshot',
|
|
285
|
+
`- Task: ${snapshot.task}`,
|
|
286
|
+
`- Status: ${snapshot.status}`,
|
|
287
|
+
`- Updated: ${snapshot.updated_at}`,
|
|
288
|
+
'',
|
|
289
|
+
'### Summary',
|
|
290
|
+
snapshot.summary,
|
|
291
|
+
'',
|
|
292
|
+
'### Next step',
|
|
293
|
+
snapshot.next_step,
|
|
294
|
+
'',
|
|
295
|
+
].join('\n')
|
|
296
|
+
: '';
|
|
297
|
+
const memoryText = formatMemories(results, hippoRoot);
|
|
298
|
+
return snapshotText ? `${snapshotText}\n${memoryText}` : memoryText;
|
|
299
|
+
}
|
|
300
|
+
case 'hippo_status': {
|
|
301
|
+
const entries = loadAllEntries(hippoRoot, tenantId);
|
|
302
|
+
const now = new Date();
|
|
303
|
+
let atRisk = 0;
|
|
304
|
+
let totalStrength = 0;
|
|
305
|
+
for (const e of entries) {
|
|
306
|
+
const s = calculateStrength(e, now);
|
|
307
|
+
totalStrength += s;
|
|
308
|
+
if (s < 0.1 && !e.pinned)
|
|
309
|
+
atRisk++;
|
|
310
|
+
}
|
|
311
|
+
const avgStrength = entries.length > 0 ? (totalStrength / entries.length).toFixed(2) : '0';
|
|
312
|
+
const pinned = entries.filter((e) => e.pinned).length;
|
|
313
|
+
const errors = entries.filter((e) => e.tags.includes('error')).length;
|
|
314
|
+
const conflicts = listMemoryConflicts(hippoRoot).length;
|
|
315
|
+
return [
|
|
316
|
+
`Memories: ${entries.length} (${pinned} pinned, ${errors} errors)`,
|
|
317
|
+
`Avg strength: ${avgStrength}`,
|
|
318
|
+
`At risk (<0.1): ${atRisk}`,
|
|
319
|
+
`Open conflicts: ${conflicts}`,
|
|
320
|
+
`Half-life default: ${config.defaultHalfLifeDays}d`,
|
|
321
|
+
].join('\n');
|
|
322
|
+
}
|
|
323
|
+
case 'hippo_learn': {
|
|
324
|
+
const days = Number(args.days) || 7;
|
|
325
|
+
if (!isGitRepo(process.cwd()))
|
|
326
|
+
return 'No git history found.';
|
|
327
|
+
const gitLog = fetchGitLog(process.cwd(), days);
|
|
328
|
+
if (!gitLog.trim())
|
|
329
|
+
return 'No fix/revert/bug commits found in the specified period.';
|
|
330
|
+
const lessons = extractLessons(gitLog, config.gitLearnPatterns);
|
|
331
|
+
let added = 0;
|
|
332
|
+
let skipped = 0;
|
|
333
|
+
for (const lesson of lessons) {
|
|
334
|
+
if (deduplicateLesson(hippoRoot, lesson)) {
|
|
335
|
+
skipped++;
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
const entry = createMemory(lesson, {
|
|
339
|
+
layer: Layer.Episodic,
|
|
340
|
+
tags: ['git-learned'],
|
|
341
|
+
source: 'git',
|
|
342
|
+
confidence: 'observed',
|
|
343
|
+
baseHalfLifeDays: config.defaultHalfLifeDays,
|
|
344
|
+
tenantId,
|
|
345
|
+
});
|
|
346
|
+
writeEntry(hippoRoot, entry);
|
|
347
|
+
added++;
|
|
348
|
+
}
|
|
349
|
+
return `Git learn: ${added} new, ${skipped} duplicates skipped (scanned ${days} days)`;
|
|
350
|
+
}
|
|
351
|
+
case 'hippo_conflicts': {
|
|
352
|
+
const conflicts = listMemoryConflicts(hippoRoot, 'open');
|
|
353
|
+
if (conflicts.length === 0)
|
|
354
|
+
return 'No open conflicts.';
|
|
355
|
+
return conflicts.map((c) => `conflict_${c.id}: ${c.memory_a_id} <-> ${c.memory_b_id} (score=${c.score.toFixed(2)}) — ${c.reason}`).join('\n');
|
|
356
|
+
}
|
|
357
|
+
case 'hippo_resolve': {
|
|
358
|
+
const conflictId = Number(args.conflict_id);
|
|
359
|
+
const keepId = String(args.keep || '');
|
|
360
|
+
const forget = Boolean(args.forget);
|
|
361
|
+
if (isNaN(conflictId) || !keepId)
|
|
362
|
+
return 'Required: conflict_id and keep.';
|
|
363
|
+
const result = resolveConflict(hippoRoot, conflictId, keepId, forget);
|
|
364
|
+
if (!result)
|
|
365
|
+
return 'Could not resolve. Check the conflict ID and --keep value.';
|
|
366
|
+
const action = forget ? 'deleted' : 'weakened';
|
|
367
|
+
return `Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`;
|
|
368
|
+
}
|
|
369
|
+
case 'hippo_share': {
|
|
370
|
+
const shareId = String(args.id || '');
|
|
371
|
+
if (!shareId)
|
|
372
|
+
return 'Required: id (memory ID to share).';
|
|
373
|
+
const force = Boolean(args.force);
|
|
374
|
+
const shared = shareMemory(hippoRoot, shareId, { force });
|
|
375
|
+
if (!shared)
|
|
376
|
+
return 'Transfer score too low. Use force=true to override.';
|
|
377
|
+
return `Shared [${shared.id}] to global store. Source: ${shared.source}`;
|
|
378
|
+
}
|
|
379
|
+
case 'hippo_peers': {
|
|
380
|
+
const peers = listPeers();
|
|
381
|
+
if (peers.length === 0)
|
|
382
|
+
return 'No peers found.';
|
|
383
|
+
return peers.map((p) => `${p.project}: ${p.count} memories (latest: ${p.latest.slice(0, 10)})`).join('\n');
|
|
384
|
+
}
|
|
385
|
+
default:
|
|
386
|
+
return `Unknown tool: ${name}`;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// ── Request handling ──
|
|
390
|
+
/**
|
|
391
|
+
* Transport-agnostic MCP dispatcher. Both the stdio loop (below) and the
|
|
392
|
+
* HTTP/SSE transport in src/server.ts route every incoming JSON-RPC message
|
|
393
|
+
* through this single function. Returns null for notifications (no response
|
|
394
|
+
* expected) and a McpResponse otherwise. Errors thrown by `executeTool` are
|
|
395
|
+
* the caller's problem — wrap with try/catch on the transport side.
|
|
396
|
+
*/
|
|
397
|
+
export async function handleMcpRequest(req, ctx) {
|
|
398
|
+
const { id, method, params } = req;
|
|
399
|
+
switch (method) {
|
|
400
|
+
case 'initialize':
|
|
401
|
+
return {
|
|
402
|
+
jsonrpc: '2.0',
|
|
403
|
+
id,
|
|
404
|
+
result: {
|
|
405
|
+
protocolVersion: '2024-11-05',
|
|
406
|
+
capabilities: { tools: {} },
|
|
407
|
+
serverInfo: { name: 'hippo-memory', version: '0.37.0' },
|
|
408
|
+
},
|
|
409
|
+
};
|
|
410
|
+
case 'notifications/initialized':
|
|
411
|
+
return null;
|
|
412
|
+
case 'tools/list':
|
|
413
|
+
return { jsonrpc: '2.0', id, result: { tools: TOOLS } };
|
|
414
|
+
case 'tools/call': {
|
|
415
|
+
const toolName = params?.name;
|
|
416
|
+
const toolArgs = params?.arguments ?? {};
|
|
417
|
+
const output = await executeTool(toolName, toolArgs, ctx);
|
|
418
|
+
return {
|
|
419
|
+
jsonrpc: '2.0',
|
|
420
|
+
id,
|
|
421
|
+
result: {
|
|
422
|
+
content: [{ type: 'text', text: output || 'Done.' }],
|
|
423
|
+
},
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
default:
|
|
427
|
+
// Notifications (no id) must not receive a response
|
|
428
|
+
if (method.startsWith('notifications/'))
|
|
429
|
+
return null;
|
|
430
|
+
return {
|
|
431
|
+
jsonrpc: '2.0',
|
|
432
|
+
id,
|
|
433
|
+
error: { code: -32601, message: `Method not found: ${method}` },
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// ── Stdio transport ──
|
|
438
|
+
import { parseFrame } from './framing.js';
|
|
439
|
+
let buffer = Buffer.alloc(0);
|
|
440
|
+
function dispatch(body) {
|
|
441
|
+
let req;
|
|
442
|
+
try {
|
|
443
|
+
req = JSON.parse(body);
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
return; // skip malformed
|
|
447
|
+
}
|
|
448
|
+
if (!req.method)
|
|
449
|
+
return;
|
|
450
|
+
if (req.method.startsWith('notifications/')) {
|
|
451
|
+
handleMcpRequest(req).catch(() => { });
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
handleMcpRequest(req).then((resp) => { if (resp)
|
|
455
|
+
send(resp); }).catch((err) => {
|
|
456
|
+
send({ jsonrpc: '2.0', id: req.id, error: { code: -32603, message: err?.message ?? 'Internal error' } });
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Wire stdin/stdout to the dispatcher. Idempotent — only the entrypoint
|
|
461
|
+
* (cli.ts `hippo mcp`, or running this file directly) should call this.
|
|
462
|
+
* src/server.ts imports `handleMcpRequest` without invoking this, so the
|
|
463
|
+
* HTTP daemon does not steal stdin or exit when its parent closes a pipe.
|
|
464
|
+
*/
|
|
465
|
+
export function startStdioLoop() {
|
|
466
|
+
process.stdin.on('data', (chunk) => {
|
|
467
|
+
buffer = Buffer.concat([buffer, chunk]);
|
|
468
|
+
while (true) {
|
|
469
|
+
const result = parseFrame(buffer);
|
|
470
|
+
if (result.kind === 'incomplete')
|
|
471
|
+
break;
|
|
472
|
+
buffer = result.rest;
|
|
473
|
+
if (result.kind === 'message')
|
|
474
|
+
dispatch(result.body);
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
process.stdin.on('end', () => process.exit(0));
|
|
478
|
+
process.on('uncaughtException', (err) => {
|
|
479
|
+
process.stderr.write(`hippo-mcp uncaught: ${err?.message ?? err}\n`);
|
|
480
|
+
});
|
|
481
|
+
process.on('unhandledRejection', (err) => {
|
|
482
|
+
process.stderr.write(`hippo-mcp unhandled: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
// Auto-start when invoked as the main module (node dist/mcp/server.js or via
|
|
486
|
+
// the cli's `import('./mcp/server.js')`). Importing this file from another
|
|
487
|
+
// module (e.g. src/server.ts wiring up the HTTP/SSE transport) will NOT
|
|
488
|
+
// trigger the stdio loop. The cli imports this file specifically to start
|
|
489
|
+
// stdio; that import is also `import.meta.url === main`-equivalent because
|
|
490
|
+
// it's executed as the program, so we keep a fallback: if HIPPO_MCP_STDIO=1
|
|
491
|
+
// or argv1 ends in /mcp/server.js we start.
|
|
492
|
+
const isMainModule = (() => {
|
|
493
|
+
try {
|
|
494
|
+
const argv1 = process.argv[1] ?? '';
|
|
495
|
+
if (argv1.endsWith('mcp/server.js') || argv1.endsWith('mcp\\server.js'))
|
|
496
|
+
return true;
|
|
497
|
+
if (process.env.HIPPO_MCP_STDIO === '1')
|
|
498
|
+
return true;
|
|
499
|
+
// ESM main-module check
|
|
500
|
+
const mainUrl = `file://${argv1.replace(/\\/g, '/')}`;
|
|
501
|
+
return import.meta.url === mainUrl || import.meta.url === `file:///${argv1.replace(/\\/g, '/')}`;
|
|
502
|
+
}
|
|
503
|
+
catch {
|
|
504
|
+
return false;
|
|
505
|
+
}
|
|
506
|
+
})();
|
|
507
|
+
if (isMainModule) {
|
|
508
|
+
startStdioLoop();
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|