@engram-cli/engram 0.1.0 → 0.1.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.
- package/README.md +52 -18
- package/bundled-backend/app.js +41 -0
- package/bundled-backend/capsule-assembler.js +238 -0
- package/bundled-backend/capsule-store.js +108 -0
- package/bundled-backend/config.js +31 -0
- package/bundled-backend/env-files.js +96 -0
- package/bundled-backend/index.js +22 -0
- package/bundled-backend/intent-filter.js +21 -0
- package/bundled-backend/package.json +7 -0
- package/bundled-backend/project-index.js +74 -0
- package/bundled-backend/project-slug.js +18 -0
- package/bundled-backend/routes/capsule.js +77 -0
- package/bundled-backend/routes/context.js +23 -0
- package/bundled-backend/routes/event.js +70 -0
- package/bundled-backend/routes/global-settings.js +125 -0
- package/bundled-backend/routes/health.js +24 -0
- package/bundled-backend/routes/projects.js +100 -0
- package/bundled-backend/routes/search.js +69 -0
- package/bundled-backend/routes/settings.js +82 -0
- package/bundled-backend/routes/shares.js +92 -0
- package/bundled-backend/supabase.js +47 -0
- package/bundled-backend/supermemory.js +46 -0
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +54 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +25 -0
- package/dist/client.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +143 -31
- package/dist/mcp.js.map +1 -1
- package/dist/share.d.ts +14 -0
- package/dist/share.d.ts.map +1 -0
- package/dist/share.js +90 -0
- package/dist/share.js.map +1 -0
- package/dist/start.d.ts.map +1 -1
- package/dist/start.js +116 -36
- package/dist/start.js.map +1 -1
- package/package.json +10 -4
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { CapsuleSchema, SharePreviewRequestSchema, ShareImportRequestSchema, sanitizeCapsule, } from "@engram-cli/contracts";
|
|
3
|
+
import { assembleCapsule } from "../capsule-assembler.js";
|
|
4
|
+
import { loadCapsule, saveCapsule, } from "../capsule-store.js";
|
|
5
|
+
import { assertSafeProjectSlug } from "../project-slug.js";
|
|
6
|
+
export const sharesRoutes = new Hono();
|
|
7
|
+
const PreviewBody = SharePreviewRequestSchema.extend({
|
|
8
|
+
capsule: CapsuleSchema.optional(),
|
|
9
|
+
});
|
|
10
|
+
sharesRoutes.post("/shares/preview", async (c) => {
|
|
11
|
+
let body;
|
|
12
|
+
try {
|
|
13
|
+
body = await c.req.json();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return c.json({ error: "invalid_json" }, 400);
|
|
17
|
+
}
|
|
18
|
+
const parsed = PreviewBody.safeParse(body);
|
|
19
|
+
if (!parsed.success) {
|
|
20
|
+
return c.json({ error: "invalid_body", details: parsed.error.flatten() }, 400);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const project = assertSafeProjectSlug(parsed.data.project);
|
|
24
|
+
const capsule = parsed.data.capsule ??
|
|
25
|
+
(await assembleCapsule({
|
|
26
|
+
project,
|
|
27
|
+
sourceIde: parsed.data.ide,
|
|
28
|
+
}));
|
|
29
|
+
const result = sanitizeCapsule(capsule);
|
|
30
|
+
return c.json({
|
|
31
|
+
capsule: result.capsule,
|
|
32
|
+
findings: result.findings,
|
|
33
|
+
blocked: result.blocked,
|
|
34
|
+
block_reason: result.blockReason,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error("[engram] shares preview failed:", err);
|
|
39
|
+
return c.json({
|
|
40
|
+
error: "share_preview_failed",
|
|
41
|
+
message: err instanceof Error ? err.message : String(err),
|
|
42
|
+
}, 502);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
sharesRoutes.post("/capsule/import", async (c) => {
|
|
46
|
+
let body;
|
|
47
|
+
try {
|
|
48
|
+
body = await c.req.json();
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return c.json({ error: "invalid_json" }, 400);
|
|
52
|
+
}
|
|
53
|
+
const parsed = ShareImportRequestSchema.safeParse(body);
|
|
54
|
+
if (!parsed.success) {
|
|
55
|
+
return c.json({ error: "invalid_body", details: parsed.error.flatten() }, 400);
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const project = assertSafeProjectSlug(parsed.data.project);
|
|
59
|
+
const sanitized = sanitizeCapsule(parsed.data.capsule);
|
|
60
|
+
if (sanitized.blocked) {
|
|
61
|
+
return c.json({
|
|
62
|
+
error: "import_blocked",
|
|
63
|
+
block_reason: sanitized.blockReason,
|
|
64
|
+
findings: sanitized.findings,
|
|
65
|
+
}, 422);
|
|
66
|
+
}
|
|
67
|
+
const existing = await loadCapsule(project);
|
|
68
|
+
if (existing && !parsed.data.overwrite) {
|
|
69
|
+
return c.json({
|
|
70
|
+
error: "overwrite_required",
|
|
71
|
+
message: "A capsule already exists for this project",
|
|
72
|
+
}, 409);
|
|
73
|
+
}
|
|
74
|
+
const imported = CapsuleSchema.parse({
|
|
75
|
+
...sanitized.capsule,
|
|
76
|
+
capsule_id: crypto.randomUUID(),
|
|
77
|
+
project,
|
|
78
|
+
created_at: new Date().toISOString(),
|
|
79
|
+
});
|
|
80
|
+
const saved = await saveCapsule(imported, {
|
|
81
|
+
projectRoot: parsed.data.project_root,
|
|
82
|
+
});
|
|
83
|
+
return c.json(saved, existing ? 200 : 201);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.error("[engram] capsule import failed:", err);
|
|
87
|
+
return c.json({
|
|
88
|
+
error: "import_failed",
|
|
89
|
+
message: err instanceof Error ? err.message : String(err),
|
|
90
|
+
}, 502);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import pg from "pg";
|
|
2
|
+
import { config } from "./config.js";
|
|
3
|
+
const { Pool } = pg;
|
|
4
|
+
let pool = null;
|
|
5
|
+
export function isSupabaseConfigured() {
|
|
6
|
+
return Boolean(config.databaseUrl);
|
|
7
|
+
}
|
|
8
|
+
function getPool() {
|
|
9
|
+
if (!config.databaseUrl) {
|
|
10
|
+
throw new Error("DATABASE_URL is not configured");
|
|
11
|
+
}
|
|
12
|
+
if (!pool) {
|
|
13
|
+
pool = new Pool({
|
|
14
|
+
connectionString: config.databaseUrl,
|
|
15
|
+
max: 3,
|
|
16
|
+
ssl: config.databaseUrl.includes("supabase.com")
|
|
17
|
+
? { rejectUnauthorized: false }
|
|
18
|
+
: undefined,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return pool;
|
|
22
|
+
}
|
|
23
|
+
/** Lightweight Postgres probe — does not expose secrets. */
|
|
24
|
+
export async function probeSupabase() {
|
|
25
|
+
if (!isSupabaseConfigured())
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
const client = await getPool().connect();
|
|
29
|
+
try {
|
|
30
|
+
await client.query("select 1 as ok");
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
client.release();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.warn("[engram] supabase probe failed:", err instanceof Error ? err.message : err);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function closeSupabasePool() {
|
|
43
|
+
if (pool) {
|
|
44
|
+
await pool.end();
|
|
45
|
+
pool = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import Supermemory from "supermemory";
|
|
2
|
+
import { config } from "./config.js";
|
|
3
|
+
export const ENGRAM_FILTER_PROMPT = `You are Engram's intent filter for a developer context hub.
|
|
4
|
+
KEEP: file opens/saves, IDE errors with path/line, failed shell commands with stderr, git branch switches and commit subjects, explicit code selections, clipboard saves, and chat summaries.
|
|
5
|
+
DROP: noisy successful shell noise (ls, cd, pwd, echo, clear), full file contents, always-on chat transcripts, secrets/tokens, and low-signal chatter.
|
|
6
|
+
Prefer short factual memories that help a developer resume work across IDEs.`;
|
|
7
|
+
let client = null;
|
|
8
|
+
export function resetSupermemoryClient() {
|
|
9
|
+
client = null;
|
|
10
|
+
}
|
|
11
|
+
export function getSupermemory() {
|
|
12
|
+
if (!client) {
|
|
13
|
+
client = new Supermemory({
|
|
14
|
+
apiKey: config.supermemoryApiKey,
|
|
15
|
+
baseURL: config.supermemoryBaseUrl,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return client;
|
|
19
|
+
}
|
|
20
|
+
export async function bootSupermemorySettings() {
|
|
21
|
+
const sm = getSupermemory();
|
|
22
|
+
try {
|
|
23
|
+
await sm.settings.update({
|
|
24
|
+
shouldLLMFilter: true,
|
|
25
|
+
filterPrompt: ENGRAM_FILTER_PROMPT,
|
|
26
|
+
});
|
|
27
|
+
console.log("[engram] supermemory settings: shouldLLMFilter=true");
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
console.warn("[engram] could not update supermemory settings (continuing):", err instanceof Error ? err.message : err);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function probeSupermemory() {
|
|
34
|
+
try {
|
|
35
|
+
const base = config.supermemoryBaseUrl.replace(/\/$/, "");
|
|
36
|
+
const res = await fetch(`${base}/`, {
|
|
37
|
+
headers: { Authorization: `Bearer ${config.supermemoryApiKey}` },
|
|
38
|
+
signal: AbortSignal.timeout(3000),
|
|
39
|
+
});
|
|
40
|
+
// Any HTTP response means the process is up; 401 still counts as reachable.
|
|
41
|
+
return res.status > 0;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,7 @@ import { statusCommand } from "./status.js";
|
|
|
5
5
|
import { runMcp } from "./mcp.js";
|
|
6
6
|
import { initCommand } from "./init.js";
|
|
7
7
|
import { emitCommand } from "./emit.js";
|
|
8
|
+
import { importShareCommand, shareCommand } from "./share.js";
|
|
8
9
|
import { readFileSync } from "node:fs";
|
|
9
10
|
import { fileURLToPath } from "node:url";
|
|
10
11
|
import path from "node:path";
|
|
@@ -71,6 +72,30 @@ program
|
|
|
71
72
|
process.exitCode = 0;
|
|
72
73
|
}
|
|
73
74
|
});
|
|
75
|
+
program
|
|
76
|
+
.command("share")
|
|
77
|
+
.description("Preview, sanitize, and create a hosted share link for current context")
|
|
78
|
+
.option("--project <project>", "project slug override")
|
|
79
|
+
.option("--ide <ide>", "source IDE label")
|
|
80
|
+
.option("--token <token>", "Supabase access token for share auth")
|
|
81
|
+
.action(async (opts) => {
|
|
82
|
+
const record = await shareCommand(opts);
|
|
83
|
+
console.log(record.share_url);
|
|
84
|
+
});
|
|
85
|
+
program
|
|
86
|
+
.command("import")
|
|
87
|
+
.description("Import a shared capsule from a public share URL")
|
|
88
|
+
.argument("<url>", "share URL or token")
|
|
89
|
+
.option("--project <project>", "target project slug")
|
|
90
|
+
.option("--overwrite", "overwrite existing local capsule", false)
|
|
91
|
+
.action(async (url, opts) => {
|
|
92
|
+
const capsule = await importShareCommand({
|
|
93
|
+
url,
|
|
94
|
+
project: opts.project,
|
|
95
|
+
overwrite: opts.overwrite,
|
|
96
|
+
});
|
|
97
|
+
console.log(JSON.stringify({ imported: capsule.capsule_id, project: capsule.project }, null, 2));
|
|
98
|
+
});
|
|
74
99
|
program.parseAsync(process.argv).catch((err) => {
|
|
75
100
|
console.error(err instanceof Error ? err.message : String(err));
|
|
76
101
|
process.exit(1);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -3,6 +3,30 @@ export interface HealthResponse {
|
|
|
3
3
|
ok: boolean;
|
|
4
4
|
supermemory?: boolean;
|
|
5
5
|
supabase?: boolean | null;
|
|
6
|
+
keys?: {
|
|
7
|
+
supermemory: {
|
|
8
|
+
configured: boolean;
|
|
9
|
+
prefix?: string;
|
|
10
|
+
};
|
|
11
|
+
llm: {
|
|
12
|
+
provider: string | null;
|
|
13
|
+
configured: boolean;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface GlobalSettings {
|
|
18
|
+
supermemory: {
|
|
19
|
+
configured: boolean;
|
|
20
|
+
prefix?: string;
|
|
21
|
+
};
|
|
22
|
+
llm: {
|
|
23
|
+
provider: string | null;
|
|
24
|
+
configured: boolean;
|
|
25
|
+
};
|
|
26
|
+
supermemory_url: string;
|
|
27
|
+
backend_url: string;
|
|
28
|
+
env_path: string;
|
|
29
|
+
restart_recommended: boolean;
|
|
6
30
|
}
|
|
7
31
|
export interface EventResponse {
|
|
8
32
|
accepted: boolean;
|
|
@@ -23,16 +47,46 @@ export interface SearchResponse {
|
|
|
23
47
|
total: number;
|
|
24
48
|
results: SearchResult[];
|
|
25
49
|
}
|
|
50
|
+
export interface CapsuleListItem {
|
|
51
|
+
capsule_id: string;
|
|
52
|
+
created_at: string;
|
|
53
|
+
summary: string;
|
|
54
|
+
}
|
|
26
55
|
export declare class EngramClient {
|
|
27
56
|
private baseUrl;
|
|
28
57
|
constructor(baseUrl: string);
|
|
29
58
|
private url;
|
|
30
59
|
private request;
|
|
31
60
|
health(): Promise<HealthResponse>;
|
|
61
|
+
getGlobalSettings(): Promise<GlobalSettings>;
|
|
32
62
|
postEvent(event: MemoryEvent): Promise<EventResponse>;
|
|
33
63
|
getContext(project: string, ide?: string): Promise<unknown>;
|
|
64
|
+
saveCapsule(opts: {
|
|
65
|
+
project: string;
|
|
66
|
+
ide?: string;
|
|
67
|
+
project_root?: string;
|
|
68
|
+
}): Promise<unknown>;
|
|
34
69
|
loadCapsule(project: string): Promise<unknown>;
|
|
70
|
+
listCapsules(project: string): Promise<{
|
|
71
|
+
project: string;
|
|
72
|
+
capsules: CapsuleListItem[];
|
|
73
|
+
}>;
|
|
35
74
|
search(project: string, q: string, limit?: number): Promise<SearchResponse>;
|
|
75
|
+
previewShare(opts: {
|
|
76
|
+
project: string;
|
|
77
|
+
ide?: string;
|
|
78
|
+
}): Promise<{
|
|
79
|
+
capsule: import("@engram-cli/contracts").Capsule;
|
|
80
|
+
findings: import("@engram-cli/contracts").RedactionFinding[];
|
|
81
|
+
blocked: boolean;
|
|
82
|
+
block_reason?: string;
|
|
83
|
+
}>;
|
|
84
|
+
importCapsule(opts: {
|
|
85
|
+
project: string;
|
|
86
|
+
capsule: import("@engram-cli/contracts").Capsule;
|
|
87
|
+
overwrite?: boolean;
|
|
88
|
+
project_root?: string;
|
|
89
|
+
}): Promise<import("@engram-cli/contracts").Capsule>;
|
|
36
90
|
/** Fire-and-forget event ingest. Never throws. */
|
|
37
91
|
postEventSilent(event: MemoryEvent): void;
|
|
38
92
|
}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -35,6 +35,9 @@ export class EngramClient {
|
|
|
35
35
|
async health() {
|
|
36
36
|
return this.request("/health");
|
|
37
37
|
}
|
|
38
|
+
async getGlobalSettings() {
|
|
39
|
+
return this.request("/settings/global");
|
|
40
|
+
}
|
|
38
41
|
async postEvent(event) {
|
|
39
42
|
return this.request("/event", {
|
|
40
43
|
method: "POST",
|
|
@@ -47,18 +50,40 @@ export class EngramClient {
|
|
|
47
50
|
q.set("ide", ide);
|
|
48
51
|
return this.request(`/context?${q}`);
|
|
49
52
|
}
|
|
53
|
+
async saveCapsule(opts) {
|
|
54
|
+
return this.request("/capsule/save", {
|
|
55
|
+
method: "POST",
|
|
56
|
+
body: JSON.stringify(opts),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
50
59
|
async loadCapsule(project) {
|
|
51
60
|
return this.request("/capsule/load", {
|
|
52
61
|
method: "POST",
|
|
53
62
|
body: JSON.stringify({ project }),
|
|
54
63
|
});
|
|
55
64
|
}
|
|
65
|
+
async listCapsules(project) {
|
|
66
|
+
const q = new URLSearchParams({ project });
|
|
67
|
+
return this.request(`/capsule/list?${q}`);
|
|
68
|
+
}
|
|
56
69
|
async search(project, q, limit = 10) {
|
|
57
70
|
return this.request("/search", {
|
|
58
71
|
method: "POST",
|
|
59
72
|
body: JSON.stringify({ project, q, limit }),
|
|
60
73
|
});
|
|
61
74
|
}
|
|
75
|
+
async previewShare(opts) {
|
|
76
|
+
return this.request("/shares/preview", {
|
|
77
|
+
method: "POST",
|
|
78
|
+
body: JSON.stringify(opts),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async importCapsule(opts) {
|
|
82
|
+
return this.request("/capsule/import", {
|
|
83
|
+
method: "POST",
|
|
84
|
+
body: JSON.stringify(opts),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
62
87
|
/** Fire-and-forget event ingest. Never throws. */
|
|
63
88
|
postEventSilent(event) {
|
|
64
89
|
void this.postEvent(event).catch(() => {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAoDA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAwN5C"}
|
package/dist/mcp.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
2
2
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
-
import { CallToolRequestSchema, ListToolsRequestSchema, McpError, ErrorCode, } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, McpError, ErrorCode, } from "@modelcontextprotocol/sdk/types.js";
|
|
4
|
+
import { MemoryEventSchema } from "@engram-cli/contracts";
|
|
4
5
|
import { EngramClient } from "./client.js";
|
|
5
6
|
import { getBackendUrl } from "./config.js";
|
|
6
7
|
import { resolveProjectSlug } from "./project.js";
|
|
8
|
+
import { shareCommand, importShareCommand } from "./share.js";
|
|
7
9
|
function makeTool(name, description, args) {
|
|
8
10
|
const properties = {};
|
|
9
11
|
const required = [];
|
|
@@ -18,56 +20,166 @@ function makeTool(name, description, args) {
|
|
|
18
20
|
inputSchema: { type: "object", properties, required },
|
|
19
21
|
};
|
|
20
22
|
}
|
|
23
|
+
function textResult(data) {
|
|
24
|
+
return {
|
|
25
|
+
content: [
|
|
26
|
+
{ type: "text", text: JSON.stringify(data, null, 2) },
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function parseResourceUri(uri) {
|
|
31
|
+
// engram://{project}/context | engram://{project}/capsule
|
|
32
|
+
const m = uri.match(/^engram:\/\/([^/]+)\/(context|capsule)$/);
|
|
33
|
+
if (!m)
|
|
34
|
+
return null;
|
|
35
|
+
return { project: decodeURIComponent(m[1]), kind: m[2] };
|
|
36
|
+
}
|
|
21
37
|
export async function runMcp() {
|
|
22
38
|
const backendUrl = getBackendUrl();
|
|
23
39
|
const client = new EngramClient(backendUrl);
|
|
24
|
-
const server = new Server({ name: "engram", version: "0.1.
|
|
40
|
+
const server = new Server({ name: "engram", version: "0.1.1" }, { capabilities: { tools: {}, resources: {} } });
|
|
25
41
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
26
42
|
tools: [
|
|
43
|
+
makeTool("engram_status", "Check Engram backend health and whether Supermemory / LLM API keys are configured (masked).", []),
|
|
27
44
|
makeTool("engram_load_capsule", "Load the saved project capsule for a given Engram project. Returns the frozen snapshot including recent files, errors, failed commands, git state, and notes.", [{ name: "project", type: "string", description: "Engram project slug", required: true }]),
|
|
45
|
+
makeTool("engram_save_capsule", "Assemble and save (freeze) the current Context as the project's capsule snapshot. Optionally writes ENGRAM_CONTEXT.md when project_root is set.", [
|
|
46
|
+
{ name: "project", type: "string", description: "Engram project slug", required: true },
|
|
47
|
+
{ name: "ide", type: "string", description: "Source IDE label (e.g. cursor)", required: false },
|
|
48
|
+
{ name: "project_root", type: "string", description: "Absolute project root for ENGRAM_CONTEXT.md", required: false },
|
|
49
|
+
]),
|
|
50
|
+
makeTool("engram_list_capsules", "List saved capsule snapshots for a project.", [{ name: "project", type: "string", description: "Engram project slug", required: true }]),
|
|
28
51
|
makeTool("engram_context", "Assemble the current live Context capsule for a project from Supermemory. This is read-only and reflects the latest captured intent.", [{ name: "project", type: "string", description: "Engram project slug", required: true }]),
|
|
29
52
|
makeTool("engram_search", "Search the Supermemory graph for a project using a natural-language query.", [
|
|
30
53
|
{ name: "project", type: "string", description: "Engram project slug", required: true },
|
|
31
54
|
{ name: "q", type: "string", description: "Natural language query", required: true },
|
|
32
55
|
{ name: "limit", type: "number", description: "Max results (default 10)", required: false },
|
|
33
56
|
]),
|
|
57
|
+
makeTool("engram_emit", "Ingest a MemoryEvent into Engram (capture path). Use for agent-emitted intent such as chat_summary or manual notes.", [
|
|
58
|
+
{ name: "event", type: "object", description: "MemoryEvent JSON (source, event_type, content, project, session_id, timestamp, …)", required: true },
|
|
59
|
+
]),
|
|
60
|
+
makeTool("engram_share_capsule", "Create a hosted share link from the current assembled Context (sanitized). Requires ENGRAM_SHARE_TOKEN or ~/.engram/share-auth.json.", [
|
|
61
|
+
{ name: "project", type: "string", description: "Engram project slug", required: true },
|
|
62
|
+
{ name: "ide", type: "string", description: "Source IDE label", required: false },
|
|
63
|
+
]),
|
|
64
|
+
makeTool("engram_import_share", "Import a shared capsule from a public share URL into the local project capsule.", [
|
|
65
|
+
{ name: "url", type: "string", description: "Share URL or token", required: true },
|
|
66
|
+
{ name: "project", type: "string", description: "Target project slug", required: false },
|
|
67
|
+
]),
|
|
34
68
|
],
|
|
35
69
|
}));
|
|
36
|
-
server.setRequestHandler(
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
70
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
71
|
+
const project = resolveProjectSlug(undefined, process.env.ENGRAM_PROJECT ?? "");
|
|
72
|
+
const resources = project
|
|
73
|
+
? [
|
|
74
|
+
{
|
|
75
|
+
uri: `engram://${encodeURIComponent(project)}/context`,
|
|
76
|
+
name: `${project} live context`,
|
|
77
|
+
description: "Live assembled Context capsule",
|
|
78
|
+
mimeType: "application/json",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
uri: `engram://${encodeURIComponent(project)}/capsule`,
|
|
82
|
+
name: `${project} saved capsule`,
|
|
83
|
+
description: "Frozen saved capsule snapshot",
|
|
84
|
+
mimeType: "application/json",
|
|
85
|
+
},
|
|
86
|
+
]
|
|
87
|
+
: [];
|
|
88
|
+
return { resources };
|
|
89
|
+
});
|
|
90
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
91
|
+
const parsed = parseResourceUri(request.params.uri);
|
|
92
|
+
if (!parsed) {
|
|
93
|
+
throw new McpError(ErrorCode.InvalidParams, `Unknown resource URI: ${request.params.uri}. Use engram://{project}/context or engram://{project}/capsule`);
|
|
47
94
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
95
|
+
const project = resolveProjectSlug(undefined, parsed.project);
|
|
96
|
+
try {
|
|
97
|
+
const data = parsed.kind === "context"
|
|
98
|
+
? await client.getContext(project, "cursor")
|
|
99
|
+
: await client.loadCapsule(project);
|
|
51
100
|
return {
|
|
52
|
-
|
|
53
|
-
{
|
|
101
|
+
contents: [
|
|
102
|
+
{
|
|
103
|
+
uri: request.params.uri,
|
|
104
|
+
mimeType: "application/json",
|
|
105
|
+
text: JSON.stringify(data, null, 2),
|
|
106
|
+
},
|
|
54
107
|
],
|
|
55
108
|
};
|
|
56
109
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
110
|
+
catch (err) {
|
|
111
|
+
throw new McpError(ErrorCode.InternalError, err instanceof Error ? err.message : String(err));
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
115
|
+
const { name, arguments: rawArgs } = request.params;
|
|
116
|
+
const args = rawArgs ?? {};
|
|
117
|
+
try {
|
|
118
|
+
if (name === "engram_status") {
|
|
119
|
+
const [health, global] = await Promise.all([
|
|
120
|
+
client.health(),
|
|
121
|
+
client.getGlobalSettings().catch(() => null),
|
|
122
|
+
]);
|
|
123
|
+
return textResult({ health, global, backend_url: backendUrl });
|
|
124
|
+
}
|
|
125
|
+
if (name === "engram_load_capsule") {
|
|
126
|
+
const project = resolveProjectSlug(undefined, String(args.project ?? ""));
|
|
127
|
+
return textResult(await client.loadCapsule(project));
|
|
128
|
+
}
|
|
129
|
+
if (name === "engram_save_capsule") {
|
|
130
|
+
const project = resolveProjectSlug(undefined, String(args.project ?? ""));
|
|
131
|
+
const ide = args.ide != null ? String(args.ide) : "cursor";
|
|
132
|
+
const project_root = args.project_root != null ? String(args.project_root) : undefined;
|
|
133
|
+
return textResult(await client.saveCapsule({ project, ide, project_root }));
|
|
134
|
+
}
|
|
135
|
+
if (name === "engram_list_capsules") {
|
|
136
|
+
const project = resolveProjectSlug(undefined, String(args.project ?? ""));
|
|
137
|
+
return textResult(await client.listCapsules(project));
|
|
138
|
+
}
|
|
139
|
+
if (name === "engram_context") {
|
|
140
|
+
const project = resolveProjectSlug(undefined, String(args.project ?? ""));
|
|
141
|
+
return textResult(await client.getContext(project, "cursor"));
|
|
142
|
+
}
|
|
143
|
+
if (name === "engram_search") {
|
|
144
|
+
const project = resolveProjectSlug(undefined, String(args.project ?? ""));
|
|
145
|
+
const q = String(args.q ?? "");
|
|
146
|
+
const limit = typeof args.limit === "number" ? args.limit : 10;
|
|
147
|
+
if (!q)
|
|
148
|
+
throw new McpError(ErrorCode.InvalidParams, "Missing query parameter q");
|
|
149
|
+
return textResult(await client.search(project, q, limit));
|
|
150
|
+
}
|
|
151
|
+
if (name === "engram_emit") {
|
|
152
|
+
const eventRaw = args.event;
|
|
153
|
+
if (!eventRaw || typeof eventRaw !== "object") {
|
|
154
|
+
throw new McpError(ErrorCode.InvalidParams, "Missing event object");
|
|
155
|
+
}
|
|
156
|
+
const parsed = MemoryEventSchema.safeParse(eventRaw);
|
|
157
|
+
if (!parsed.success) {
|
|
158
|
+
throw new McpError(ErrorCode.InvalidParams, `Invalid MemoryEvent: ${parsed.error.message}`);
|
|
159
|
+
}
|
|
160
|
+
return textResult(await client.postEvent(parsed.data));
|
|
161
|
+
}
|
|
162
|
+
if (name === "engram_share_capsule") {
|
|
163
|
+
const project = resolveProjectSlug(undefined, String(args.project ?? ""));
|
|
164
|
+
const ide = args.ide != null ? String(args.ide) : "cursor";
|
|
165
|
+
return textResult(await shareCommand({ project, ide }));
|
|
166
|
+
}
|
|
167
|
+
if (name === "engram_import_share") {
|
|
168
|
+
const url = String(args.url ?? "");
|
|
169
|
+
if (!url)
|
|
170
|
+
throw new McpError(ErrorCode.InvalidParams, "Missing url");
|
|
171
|
+
const project = args.project != null
|
|
172
|
+
? resolveProjectSlug(undefined, String(args.project))
|
|
173
|
+
: undefined;
|
|
174
|
+
return textResult(await importShareCommand({ url, project, overwrite: true }));
|
|
175
|
+
}
|
|
176
|
+
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
if (err instanceof McpError)
|
|
180
|
+
throw err;
|
|
181
|
+
throw new McpError(ErrorCode.InternalError, err instanceof Error ? err.message : String(err));
|
|
69
182
|
}
|
|
70
|
-
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
71
183
|
});
|
|
72
184
|
const transport = new StdioServerTransport();
|
|
73
185
|
await server.connect(transport);
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EACR,SAAS,GACV,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|