@fingerskier/augment 0.2.0 → 0.3.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 +22 -2
- package/dist/config.d.ts +5 -0
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -1
- package/dist/daemon/client.d.ts +1 -0
- package/dist/daemon/client.js +31 -2
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/http.d.ts +5 -0
- package/dist/daemon/http.js +30 -7
- package/dist/daemon/http.js.map +1 -1
- package/dist/daemon/single-instance.d.ts +1 -1
- package/dist/daemon/single-instance.js +2 -2
- package/dist/daemon/single-instance.js.map +1 -1
- package/dist/db.d.ts +6 -0
- package/dist/db.js +21 -1
- package/dist/db.js.map +1 -1
- package/dist/install.js +9 -1
- package/dist/install.js.map +1 -1
- package/dist/mcp/apps.d.ts +44 -0
- package/dist/mcp/apps.js +578 -0
- package/dist/mcp/apps.js.map +1 -0
- package/dist/mcp/insights.d.ts +91 -0
- package/dist/mcp/insights.js +175 -0
- package/dist/mcp/insights.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +166 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/memory/git.d.ts +31 -0
- package/dist/memory/git.js +125 -0
- package/dist/memory/git.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/docs/FEATURES.md +93 -0
- package/integrations/codex/SKILL.md +8 -0
- package/integrations/examples/claude-mcp-config.json +17 -20
- package/integrations/examples/codex-mcp-config.json +17 -20
- package/package.json +2 -2
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { LINK_TYPES, MEMORY_KINDS } from "../constants.js";
|
|
2
|
+
/**
|
|
3
|
+
* Pure aggregation over a project's memory graph (plus the optional tally
|
|
4
|
+
* summary) into the payload the dashboard snippets render. Kept free of I/O so
|
|
5
|
+
* the numbers the MCP Apps iframe shows are unit-testable without a daemon.
|
|
6
|
+
*/
|
|
7
|
+
export const ACTIVITY_WEEKS = 12;
|
|
8
|
+
export const TOP_TAG_LIMIT = 12;
|
|
9
|
+
export const TOP_CONNECTED_LIMIT = 5;
|
|
10
|
+
/** Node cap for the graph snippet payload — keeps structuredContent bounded. */
|
|
11
|
+
export const GRAPH_NODE_LIMIT = 300;
|
|
12
|
+
const WEEK_MS = 7 * 24 * 60 * 60 * 1_000;
|
|
13
|
+
export function computeInsights(graph, tally, now) {
|
|
14
|
+
const { project, memories, links } = graph;
|
|
15
|
+
const byKind = new Map(MEMORY_KINDS.map((kind) => [kind, 0]));
|
|
16
|
+
const tagCounts = new Map();
|
|
17
|
+
let totalChars = 0;
|
|
18
|
+
for (const memory of memories) {
|
|
19
|
+
byKind.set(memory.kind, (byKind.get(memory.kind) ?? 0) + 1);
|
|
20
|
+
totalChars += memory.size;
|
|
21
|
+
for (const tag of memory.tags) {
|
|
22
|
+
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const linksByType = new Map(LINK_TYPES.map((type) => [type, 0]));
|
|
26
|
+
for (const link of links) {
|
|
27
|
+
linksByType.set(link.type, (linksByType.get(link.type) ?? 0) + 1);
|
|
28
|
+
}
|
|
29
|
+
const degrees = degreeByMemory(links);
|
|
30
|
+
const topConnected = [...memories]
|
|
31
|
+
.map((memory) => ({ memory, degree: degrees.get(memory.id) ?? 0 }))
|
|
32
|
+
.filter((entry) => entry.degree > 0)
|
|
33
|
+
.sort((a, b) => b.degree - a.degree || a.memory.name.localeCompare(b.memory.name))
|
|
34
|
+
.slice(0, TOP_CONNECTED_LIMIT)
|
|
35
|
+
.map(({ memory, degree }) => ({ id: memory.id, name: memory.name, kind: memory.kind, degree }));
|
|
36
|
+
const freshest = [...memories].sort((a, b) => b.updated_at.localeCompare(a.updated_at))[0];
|
|
37
|
+
return {
|
|
38
|
+
project: { id: project.id, name: project.name },
|
|
39
|
+
generated_at: now.toISOString(),
|
|
40
|
+
totals: {
|
|
41
|
+
memories: memories.length,
|
|
42
|
+
links: links.length,
|
|
43
|
+
distinct_tags: tagCounts.size,
|
|
44
|
+
total_chars: totalChars,
|
|
45
|
+
},
|
|
46
|
+
by_kind: MEMORY_KINDS.map((kind) => ({ kind, count: byKind.get(kind) ?? 0 })),
|
|
47
|
+
links_by_type: LINK_TYPES.map((type) => ({ type, count: linksByType.get(type) ?? 0 })).filter((entry) => entry.count > 0),
|
|
48
|
+
top_tags: [...tagCounts.entries()]
|
|
49
|
+
.sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
|
|
50
|
+
.slice(0, TOP_TAG_LIMIT)
|
|
51
|
+
.map(([tag, count]) => ({ tag, count })),
|
|
52
|
+
activity: activityWeeks(memories, now),
|
|
53
|
+
top_connected: topConnected,
|
|
54
|
+
orphan_count: memories.filter((memory) => (degrees.get(memory.id) ?? 0) === 0).length,
|
|
55
|
+
...(freshest
|
|
56
|
+
? { freshest: { id: freshest.id, name: freshest.name, kind: freshest.kind, updated_at: freshest.updated_at } }
|
|
57
|
+
: {}),
|
|
58
|
+
...(tally ? { tally } : {}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function degreeByMemory(links) {
|
|
62
|
+
const degrees = new Map();
|
|
63
|
+
for (const link of links) {
|
|
64
|
+
degrees.set(link.from_memory_id, (degrees.get(link.from_memory_id) ?? 0) + 1);
|
|
65
|
+
degrees.set(link.to_memory_id, (degrees.get(link.to_memory_id) ?? 0) + 1);
|
|
66
|
+
}
|
|
67
|
+
return degrees;
|
|
68
|
+
}
|
|
69
|
+
function activityWeeks(memories, now) {
|
|
70
|
+
// Bucket boundaries snap to UTC midnight (the window ends at the first UTC
|
|
71
|
+
// midnight after `now`) so each bucket's `start` label names its true first
|
|
72
|
+
// day instead of drifting by now's time-of-day.
|
|
73
|
+
const DAY_MS = 24 * 60 * 60 * 1_000;
|
|
74
|
+
const end = Math.floor(now.getTime() / DAY_MS) * DAY_MS + DAY_MS;
|
|
75
|
+
const weeks = [];
|
|
76
|
+
for (let index = ACTIVITY_WEEKS - 1; index >= 0; index -= 1) {
|
|
77
|
+
const start = new Date(end - (index + 1) * WEEK_MS);
|
|
78
|
+
weeks.push({ start: start.toISOString().slice(0, 10), created: 0, updated: 0 });
|
|
79
|
+
}
|
|
80
|
+
const bucketFor = (iso) => {
|
|
81
|
+
const time = Date.parse(iso);
|
|
82
|
+
if (Number.isNaN(time) || time >= end) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
const age = Math.floor((end - 1 - time) / WEEK_MS);
|
|
86
|
+
return age >= 0 && age < ACTIVITY_WEEKS ? weeks[ACTIVITY_WEEKS - 1 - age] : undefined;
|
|
87
|
+
};
|
|
88
|
+
for (const memory of memories) {
|
|
89
|
+
const created = bucketFor(memory.created_at);
|
|
90
|
+
if (created) {
|
|
91
|
+
created.created += 1;
|
|
92
|
+
}
|
|
93
|
+
// Skip the update count when the timestamps are byte-identical (a memory
|
|
94
|
+
// that was never touched after creation); any real later update counts,
|
|
95
|
+
// even within the creation week.
|
|
96
|
+
const updated = bucketFor(memory.updated_at);
|
|
97
|
+
if (updated && (memory.updated_at !== memory.created_at || !created)) {
|
|
98
|
+
updated.updated += 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return weeks;
|
|
102
|
+
}
|
|
103
|
+
export function toGraphPayload(graph, nodeLimit = GRAPH_NODE_LIMIT) {
|
|
104
|
+
const degrees = degreeByMemory(graph.links);
|
|
105
|
+
const kept = [...graph.memories].sort((a, b) => b.updated_at.localeCompare(a.updated_at)).slice(0, nodeLimit);
|
|
106
|
+
const keptIds = new Set(kept.map((memory) => memory.id));
|
|
107
|
+
return {
|
|
108
|
+
project: { id: graph.project.id, name: graph.project.name },
|
|
109
|
+
nodes: kept.map((memory) => ({
|
|
110
|
+
id: memory.id,
|
|
111
|
+
name: memory.name,
|
|
112
|
+
kind: memory.kind,
|
|
113
|
+
tags: memory.tags,
|
|
114
|
+
degree: degrees.get(memory.id) ?? 0,
|
|
115
|
+
})),
|
|
116
|
+
edges: graph.links
|
|
117
|
+
.filter((link) => keptIds.has(link.from_memory_id) && keptIds.has(link.to_memory_id))
|
|
118
|
+
.map((link) => ({ id: link.id, source: link.from_memory_id, target: link.to_memory_id, type: link.type })),
|
|
119
|
+
total_memories: graph.memories.length,
|
|
120
|
+
total_links: graph.links.length,
|
|
121
|
+
truncated: kept.length < graph.memories.length,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/** Text fallback: what the model (and any non-UI host) sees for memory_insights. */
|
|
125
|
+
export function renderInsightsText(insights) {
|
|
126
|
+
const lines = [];
|
|
127
|
+
const { totals } = insights;
|
|
128
|
+
lines.push(`Memory insights for ${insights.project.name}`);
|
|
129
|
+
lines.push(`${totals.memories} memories, ${totals.links} links, ${totals.distinct_tags} distinct tags, ${totals.total_chars} chars total`);
|
|
130
|
+
const kinds = insights.by_kind
|
|
131
|
+
.filter((entry) => entry.count > 0)
|
|
132
|
+
.map((entry) => `${entry.kind} ${entry.count}`)
|
|
133
|
+
.join(", ");
|
|
134
|
+
lines.push(`By kind: ${kinds || "none"}`);
|
|
135
|
+
if (insights.links_by_type.length > 0) {
|
|
136
|
+
lines.push(`Links: ${insights.links_by_type.map((entry) => `${entry.type} ${entry.count}`).join(", ")}`);
|
|
137
|
+
}
|
|
138
|
+
if (insights.top_tags.length > 0) {
|
|
139
|
+
lines.push(`Top tags: ${insights.top_tags.map((entry) => `${entry.tag} (${entry.count})`).join(", ")}`);
|
|
140
|
+
}
|
|
141
|
+
const recent = insights.activity.slice(-4);
|
|
142
|
+
lines.push(`Activity (last 4 weeks): ${recent.map((week) => `${week.start} +${week.created}/${week.updated}u`).join(", ")}`);
|
|
143
|
+
if (insights.top_connected.length > 0) {
|
|
144
|
+
lines.push(`Most connected: ${insights.top_connected.map((entry) => `${entry.name} [${entry.kind}] ×${entry.degree}`).join(", ")}`);
|
|
145
|
+
}
|
|
146
|
+
lines.push(`Orphans (no links): ${insights.orphan_count}`);
|
|
147
|
+
if (insights.freshest) {
|
|
148
|
+
lines.push(`Freshest: ${insights.freshest.name} [${insights.freshest.kind}] at ${insights.freshest.updated_at}`);
|
|
149
|
+
}
|
|
150
|
+
if (insights.tally) {
|
|
151
|
+
const verdicts = Object.entries(insights.tally.by_verdict)
|
|
152
|
+
.map(([verdict, count]) => `${verdict} ${count}`)
|
|
153
|
+
.join(", ");
|
|
154
|
+
lines.push(`Recall tally: ${insights.tally.total}/${insights.tally.target} rated — ${verdicts}`);
|
|
155
|
+
}
|
|
156
|
+
return lines.join("\n");
|
|
157
|
+
}
|
|
158
|
+
/** Text fallback for memory_graph — a summary, never the full node/edge dump. */
|
|
159
|
+
export function renderGraphText(payload) {
|
|
160
|
+
const lines = [];
|
|
161
|
+
lines.push(`Memory graph for ${payload.project.name}: ${payload.total_memories} memories, ${payload.total_links} links.`);
|
|
162
|
+
const hubs = [...payload.nodes]
|
|
163
|
+
.filter((node) => node.degree > 0)
|
|
164
|
+
.sort((a, b) => b.degree - a.degree || a.name.localeCompare(b.name))
|
|
165
|
+
.slice(0, TOP_CONNECTED_LIMIT);
|
|
166
|
+
if (hubs.length > 0) {
|
|
167
|
+
lines.push(`Hubs: ${hubs.map((node) => `${node.name} [${node.kind}] ×${node.degree}`).join(", ")}`);
|
|
168
|
+
}
|
|
169
|
+
if (payload.truncated) {
|
|
170
|
+
lines.push(`Snippet shows the ${payload.nodes.length} most recently updated memories.`);
|
|
171
|
+
}
|
|
172
|
+
lines.push("Run `augment dashboard` for the full interactive graph.");
|
|
173
|
+
return lines.join("\n");
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=insights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/mcp/insights.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
package/dist/mcp/server.js
CHANGED
|
@@ -6,15 +6,82 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
6
6
|
import * as z from "zod/v4";
|
|
7
7
|
import { LINK_TYPES, MEMORY_KINDS } from "../constants.js";
|
|
8
8
|
import { connectOrStartDaemon } from "../daemon/client.js";
|
|
9
|
+
import { cytoscapeBundleJs } from "../dashboard/assets.js";
|
|
9
10
|
import { inferProjectName } from "../memory/project.js";
|
|
10
11
|
import { TALLY_VERDICTS } from "../tally.js";
|
|
12
|
+
import { GRAPH_RESOURCE_URI, graphSnippetHtml, INSIGHTS_RESOURCE_URI, insightsSnippetHtml, UI_EXTENSION_ID, UI_MIME_TYPE, } from "./apps.js";
|
|
13
|
+
import { computeInsights, renderGraphText, renderInsightsText, toGraphPayload } from "./insights.js";
|
|
11
14
|
// server.ts lives at src/mcp/ (dist/mcp/ once built), so package.json is two levels up.
|
|
12
15
|
export async function resolveServerVersion() {
|
|
13
16
|
const packageJsonPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
|
|
14
17
|
const raw = await readFile(packageJsonPath, "utf8");
|
|
15
18
|
return JSON.parse(raw).version;
|
|
16
19
|
}
|
|
17
|
-
|
|
20
|
+
/** True when the connected client negotiated the MCP Apps extension (SEP-1865). */
|
|
21
|
+
function clientSupportsUi(server) {
|
|
22
|
+
const capabilities = server.server.getClientCapabilities();
|
|
23
|
+
return Boolean(capabilities?.extensions?.[UI_EXTENSION_ID]);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Classic MCP-UI escape hatch: hosts that render embedded UIResource blocks but
|
|
27
|
+
* never negotiated the SEP-1865 extension (older Goose/Postman/LibreChat) can opt
|
|
28
|
+
* in to inline snippet HTML in tool results. Off by default because in text-only
|
|
29
|
+
* hosts the embedded block would land in model context as dead weight.
|
|
30
|
+
*/
|
|
31
|
+
function embedClassicUi() {
|
|
32
|
+
return process.env.AUGMENT_MCP_UI_EMBED === "1";
|
|
33
|
+
}
|
|
34
|
+
let embedSequence = 0;
|
|
35
|
+
function embeddedSnippet(uriPrefix, html) {
|
|
36
|
+
// Unique per result — classic MCP-UI hosts key rendered frames by URI, and
|
|
37
|
+
// Date.now() alone can collide for two calls in the same millisecond.
|
|
38
|
+
embedSequence += 1;
|
|
39
|
+
return {
|
|
40
|
+
type: "resource",
|
|
41
|
+
resource: {
|
|
42
|
+
uri: `${uriPrefix}/${Date.now().toString(36)}-${embedSequence.toString(36)}`,
|
|
43
|
+
mimeType: "text/html",
|
|
44
|
+
text: html,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve a project strictly — the daemon's name filter is a LIKE substring
|
|
50
|
+
* match, so require an exact hit (or a single unambiguous match) rather than
|
|
51
|
+
* upserting the way init_project does: insight tools must never create state.
|
|
52
|
+
*/
|
|
53
|
+
async function findProject(client, name) {
|
|
54
|
+
// A blank filter lists every project, and the single-hit guard below
|
|
55
|
+
// (`.includes("")` is always true) would then trust an arbitrary lone
|
|
56
|
+
// project. Treat empty/whitespace as no match rather than silently
|
|
57
|
+
// resolving one — callers surface missingProjectResult instead.
|
|
58
|
+
if (!name.trim()) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const projects = (await client.listProjects(name));
|
|
62
|
+
const exact = projects.find((project) => project.name === name);
|
|
63
|
+
if (exact) {
|
|
64
|
+
return exact;
|
|
65
|
+
}
|
|
66
|
+
// The daemon filter is SQL LIKE with unescaped wildcards, so a lone hit is
|
|
67
|
+
// only trusted when it's a genuine substring match — otherwise
|
|
68
|
+
// "acme_widget" would silently resolve to "acme/widget" via `_`.
|
|
69
|
+
if (projects.length === 1 && projects[0].name.toLowerCase().includes(name.toLowerCase())) {
|
|
70
|
+
return projects[0];
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
function missingProjectResult(name) {
|
|
75
|
+
return {
|
|
76
|
+
content: [
|
|
77
|
+
{
|
|
78
|
+
type: "text",
|
|
79
|
+
text: `No Augment project matches "${name}". Call init_project (or list_projects) first.`,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export async function createMcpServer() {
|
|
18
85
|
const server = new McpServer({
|
|
19
86
|
name: "augment",
|
|
20
87
|
version: await resolveServerVersion(),
|
|
@@ -121,6 +188,104 @@ export async function startMcpServer() {
|
|
|
121
188
|
const project_name = input.project_name ?? (await inferProjectName());
|
|
122
189
|
return textResult(await client.sleepCandidates({ ...input, project_name }));
|
|
123
190
|
});
|
|
191
|
+
// --- MCP Apps dashboard snippets (SEP-1865) ------------------------------
|
|
192
|
+
// Templates are predeclared ui:// resources; the tools below reference them
|
|
193
|
+
// via _meta.ui.resourceUri. Non-UI hosts ignore the metadata and get the
|
|
194
|
+
// text fallback, so the tools stay useful everywhere.
|
|
195
|
+
const snippetResourceMeta = { ui: { prefersBorder: true } };
|
|
196
|
+
server.registerResource("memory-insights-snippet", INSIGHTS_RESOURCE_URI, {
|
|
197
|
+
title: "Augment memory insights snippet",
|
|
198
|
+
description: "Interactive dashboard snippet rendering memory_insights results (kind distribution, links, tags, activity, recall tally).",
|
|
199
|
+
mimeType: UI_MIME_TYPE,
|
|
200
|
+
_meta: snippetResourceMeta,
|
|
201
|
+
}, async () => ({
|
|
202
|
+
contents: [
|
|
203
|
+
{ uri: INSIGHTS_RESOURCE_URI, mimeType: UI_MIME_TYPE, text: insightsSnippetHtml(), _meta: snippetResourceMeta },
|
|
204
|
+
],
|
|
205
|
+
}));
|
|
206
|
+
server.registerResource("memory-graph-snippet", GRAPH_RESOURCE_URI, {
|
|
207
|
+
title: "Augment memory graph snippet",
|
|
208
|
+
description: "Interactive Cytoscape view of a project's memory graph, rendering memory_graph results.",
|
|
209
|
+
mimeType: UI_MIME_TYPE,
|
|
210
|
+
_meta: snippetResourceMeta,
|
|
211
|
+
}, async () => ({
|
|
212
|
+
contents: [
|
|
213
|
+
{
|
|
214
|
+
uri: GRAPH_RESOURCE_URI,
|
|
215
|
+
mimeType: UI_MIME_TYPE,
|
|
216
|
+
text: graphSnippetHtml(await cytoscapeBundleJs()),
|
|
217
|
+
_meta: snippetResourceMeta,
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
}));
|
|
221
|
+
server.registerTool("memory_insights", {
|
|
222
|
+
description: "Aggregate a project's memory graph into dashboard insights: counts by kind, links by type, top tags, " +
|
|
223
|
+
"12-week activity, most-connected memories, and the recall-quality tally. Use when the user asks for " +
|
|
224
|
+
"memory insights, stats, health, or an overview. In MCP Apps hosts this renders an interactive " +
|
|
225
|
+
"dashboard snippet; elsewhere it returns the text summary.",
|
|
226
|
+
inputSchema: {
|
|
227
|
+
project_name: z.string().optional(),
|
|
228
|
+
},
|
|
229
|
+
_meta: { ui: { resourceUri: INSIGHTS_RESOURCE_URI } },
|
|
230
|
+
}, async ({ project_name }) => {
|
|
231
|
+
const client = await connectOrStartDaemon();
|
|
232
|
+
const resolved = project_name ?? (await inferProjectName());
|
|
233
|
+
const project = await findProject(client, resolved);
|
|
234
|
+
if (!project) {
|
|
235
|
+
return missingProjectResult(resolved);
|
|
236
|
+
}
|
|
237
|
+
const graph = (await client.projectGraph(project.id));
|
|
238
|
+
let tally;
|
|
239
|
+
try {
|
|
240
|
+
tally = (await client.tallySummary());
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// Insights degrade gracefully without the tally section.
|
|
244
|
+
}
|
|
245
|
+
const insights = computeInsights(graph, tally, new Date());
|
|
246
|
+
const content = [{ type: "text", text: renderInsightsText(insights) }];
|
|
247
|
+
if (embedClassicUi() && !clientSupportsUi(server)) {
|
|
248
|
+
content.push(embeddedSnippet(`ui://augment/insights/${project.id}`, insightsSnippetHtml(insights)));
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
content,
|
|
252
|
+
structuredContent: insights,
|
|
253
|
+
};
|
|
254
|
+
});
|
|
255
|
+
server.registerTool("memory_graph", {
|
|
256
|
+
description: "Return a project's memory graph (nodes + typed links) for visualization. In MCP Apps hosts this " +
|
|
257
|
+
"renders an interactive graph snippet; in text-only hosts it returns a summary and points at " +
|
|
258
|
+
"`augment dashboard`. Use when the user wants to see how memories connect.",
|
|
259
|
+
inputSchema: {
|
|
260
|
+
project_name: z.string().optional(),
|
|
261
|
+
},
|
|
262
|
+
_meta: { ui: { resourceUri: GRAPH_RESOURCE_URI } },
|
|
263
|
+
}, async ({ project_name }) => {
|
|
264
|
+
const client = await connectOrStartDaemon();
|
|
265
|
+
const resolved = project_name ?? (await inferProjectName());
|
|
266
|
+
const project = await findProject(client, resolved);
|
|
267
|
+
if (!project) {
|
|
268
|
+
return missingProjectResult(resolved);
|
|
269
|
+
}
|
|
270
|
+
const graph = (await client.projectGraph(project.id));
|
|
271
|
+
const payload = toGraphPayload(graph);
|
|
272
|
+
const uiCapable = clientSupportsUi(server);
|
|
273
|
+
const embed = embedClassicUi() && !uiCapable;
|
|
274
|
+
const content = [{ type: "text", text: renderGraphText(payload) }];
|
|
275
|
+
if (embed) {
|
|
276
|
+
content.push(embeddedSnippet(`ui://augment/graph/${project.id}`, graphSnippetHtml(await cytoscapeBundleJs(), payload)));
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
content,
|
|
280
|
+
// The full node/edge dump only helps a renderer; keep it out of
|
|
281
|
+
// text-only hosts where structuredContent would just burn context.
|
|
282
|
+
...(uiCapable || embed ? { structuredContent: payload } : {}),
|
|
283
|
+
};
|
|
284
|
+
});
|
|
285
|
+
return server;
|
|
286
|
+
}
|
|
287
|
+
export async function startMcpServer() {
|
|
288
|
+
const server = await createMcpServer();
|
|
124
289
|
await server.connect(new StdioServerTransport());
|
|
125
290
|
}
|
|
126
291
|
function textResult(value) {
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Outcome of an auto-commit attempt. `skipped` means a swallowed git failure. */
|
|
2
|
+
export type CommitOutcome = "committed" | "nothing" | "skipped";
|
|
3
|
+
/**
|
|
4
|
+
* True only when `dir` is itself the root of a git worktree — not merely a
|
|
5
|
+
* subdirectory of some larger repo. Keying on the worktree root keeps augment
|
|
6
|
+
* from injecting snapshot commits into an unrelated parent project. Any error
|
|
7
|
+
* (not a repo, git missing) is a definitive "no".
|
|
8
|
+
*/
|
|
9
|
+
export declare function isMemoryRootGitRoot(dir: string): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Stage and commit the memory root's markdown changes as one snapshot. Never
|
|
12
|
+
* throws and never pushes: any git failure is logged once and swallowed so an
|
|
13
|
+
* auto-commit can never break the write that triggered it. Returns `nothing`
|
|
14
|
+
* when there is nothing to snapshot (no empty commits) and `skipped` on failure.
|
|
15
|
+
*/
|
|
16
|
+
export declare function commitMemoryChanges(dir: string): Promise<CommitOutcome>;
|
|
17
|
+
/** A debounced, single-flight committer for one memory root. */
|
|
18
|
+
export interface GitCommitter {
|
|
19
|
+
/** Request a snapshot; bursts coalesce into one commit after the debounce. */
|
|
20
|
+
notify(): void;
|
|
21
|
+
/** Resolves once no commit is pending or in flight (for deterministic tests). */
|
|
22
|
+
idle(): Promise<void>;
|
|
23
|
+
/** Flush any pending commit and stop. */
|
|
24
|
+
close(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Wrap {@link commitMemoryChanges} in the shared debounced, single-flight
|
|
28
|
+
* scheduler so a session-finish burst of writes yields exactly one snapshot and
|
|
29
|
+
* two commits never run concurrently.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createGitCommitter(memoryRoot: string, debounceMs?: number): GitCommitter;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { realpath } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { createIndexScheduler } from "../daemon/scheduler.js";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
// Detection is a couple of cheap plumbing calls; a commit may run user-configured
|
|
8
|
+
// pre-commit hooks, so it gets a longer leash. Both are bounded so a slow or
|
|
9
|
+
// prompting hook can never wedge the daemon.
|
|
10
|
+
const DETECT_TIMEOUT_MS = 3_000;
|
|
11
|
+
const COMMIT_TIMEOUT_MS = 15_000;
|
|
12
|
+
// Only augment's own writes are markdown, so a markdown-only pathspec captures
|
|
13
|
+
// every mutation (including deletes and link scrubs) without ever sweeping in an
|
|
14
|
+
// unrelated file — or a nested state dir / index.db a user may have placed under
|
|
15
|
+
// the memory root. execFile passes this to git verbatim (no shell), so git does
|
|
16
|
+
// its own recursive pathspec match rather than the shell globbing it.
|
|
17
|
+
const MARKDOWN_PATHSPEC = "*.md";
|
|
18
|
+
async function execGit(cwd, args, timeoutMs) {
|
|
19
|
+
const { stdout } = await execFileAsync("git", args, { cwd, timeout: timeoutMs });
|
|
20
|
+
return stdout.trim();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* True only when `dir` is itself the root of a git worktree — not merely a
|
|
24
|
+
* subdirectory of some larger repo. Keying on the worktree root keeps augment
|
|
25
|
+
* from injecting snapshot commits into an unrelated parent project. Any error
|
|
26
|
+
* (not a repo, git missing) is a definitive "no".
|
|
27
|
+
*/
|
|
28
|
+
export async function isMemoryRootGitRoot(dir) {
|
|
29
|
+
try {
|
|
30
|
+
const toplevel = await execGit(dir, ["rev-parse", "--show-toplevel"], DETECT_TIMEOUT_MS);
|
|
31
|
+
// git reports the toplevel with forward slashes; normalize both sides through
|
|
32
|
+
// realpath + resolve so a symlinked temp dir or separator mismatch still matches.
|
|
33
|
+
const [resolvedTop, resolvedDir] = await Promise.all([realpath(toplevel), realpath(dir)]);
|
|
34
|
+
return path.resolve(resolvedTop) === path.resolve(resolvedDir);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** The configured commit identity, or "" when git has none (fresh init, no config). */
|
|
41
|
+
async function configuredEmail(dir) {
|
|
42
|
+
try {
|
|
43
|
+
return await execGit(dir, ["config", "user.email"], DETECT_TIMEOUT_MS);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// `git config` exits non-zero when the key is unset.
|
|
47
|
+
return "";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function commitMessage(files) {
|
|
51
|
+
const subject = `augment: snapshot ${files.length} memory file(s)`;
|
|
52
|
+
const shown = files.slice(0, 20).map((file) => `- ${file}`);
|
|
53
|
+
if (files.length > shown.length) {
|
|
54
|
+
shown.push(`- …and ${files.length - shown.length} more`);
|
|
55
|
+
}
|
|
56
|
+
return `${subject}\n\n${shown.join("\n")}`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Stage and commit the memory root's markdown changes as one snapshot. Never
|
|
60
|
+
* throws and never pushes: any git failure is logged once and swallowed so an
|
|
61
|
+
* auto-commit can never break the write that triggered it. Returns `nothing`
|
|
62
|
+
* when there is nothing to snapshot (no empty commits) and `skipped` on failure.
|
|
63
|
+
*/
|
|
64
|
+
export async function commitMemoryChanges(dir) {
|
|
65
|
+
try {
|
|
66
|
+
await execGit(dir, ["add", "-A", "--", MARKDOWN_PATHSPEC], COMMIT_TIMEOUT_MS);
|
|
67
|
+
// --quiet exits 0 when nothing is staged, 1 when there are staged changes.
|
|
68
|
+
let staged = false;
|
|
69
|
+
try {
|
|
70
|
+
await execGit(dir, ["diff", "--cached", "--quiet", "--", MARKDOWN_PATHSPEC], DETECT_TIMEOUT_MS);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error.code === 1) {
|
|
74
|
+
staged = true;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (!staged) {
|
|
81
|
+
return "nothing";
|
|
82
|
+
}
|
|
83
|
+
const files = (await execGit(dir, ["diff", "--cached", "--name-only", "--", MARKDOWN_PATHSPEC], DETECT_TIMEOUT_MS))
|
|
84
|
+
.split("\n")
|
|
85
|
+
.filter(Boolean);
|
|
86
|
+
// Supply a fallback identity only when the repo/user has none, so a fresh
|
|
87
|
+
// `git init` can still commit while a configured identity always wins. `-c`
|
|
88
|
+
// flags must precede the subcommand.
|
|
89
|
+
const identityArgs = (await configuredEmail(dir))
|
|
90
|
+
? []
|
|
91
|
+
: ["-c", "user.email=augment@localhost", "-c", "user.name=Augment"];
|
|
92
|
+
const message = commitMessage(files);
|
|
93
|
+
await execGit(dir, [...identityArgs, "commit", "-m", message, "--", MARKDOWN_PATHSPEC], COMMIT_TIMEOUT_MS);
|
|
94
|
+
return "committed";
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.warn("augment: git auto-commit skipped:", error instanceof Error ? error.message : error);
|
|
98
|
+
return "skipped";
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// The scheduler dedupes on a key, so a burst of writes collapses to one snapshot;
|
|
102
|
+
// the key itself is irrelevant since the runner always commits the whole root.
|
|
103
|
+
const COMMIT_KEY = "memory";
|
|
104
|
+
/**
|
|
105
|
+
* Wrap {@link commitMemoryChanges} in the shared debounced, single-flight
|
|
106
|
+
* scheduler so a session-finish burst of writes yields exactly one snapshot and
|
|
107
|
+
* two commits never run concurrently.
|
|
108
|
+
*/
|
|
109
|
+
export function createGitCommitter(memoryRoot, debounceMs = 1_000) {
|
|
110
|
+
const scheduler = createIndexScheduler(async () => {
|
|
111
|
+
await commitMemoryChanges(memoryRoot);
|
|
112
|
+
}, debounceMs);
|
|
113
|
+
return {
|
|
114
|
+
notify() {
|
|
115
|
+
scheduler.schedule(COMMIT_KEY);
|
|
116
|
+
},
|
|
117
|
+
idle() {
|
|
118
|
+
return scheduler.idle();
|
|
119
|
+
},
|
|
120
|
+
close() {
|
|
121
|
+
return scheduler.close();
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/memory/git.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -105,6 +105,12 @@ export interface UpsertInput {
|
|
|
105
105
|
export interface DaemonInfo {
|
|
106
106
|
pid: number;
|
|
107
107
|
endpoint: string;
|
|
108
|
+
/**
|
|
109
|
+
* The stateDir this daemon owns. Single-instance ownership is authoritative on
|
|
110
|
+
* stateDir (the index.db lives there), not memoryRoot — one global store per
|
|
111
|
+
* stateDir, projects partitioned by name.
|
|
112
|
+
*/
|
|
113
|
+
stateDir: string;
|
|
108
114
|
memoryRoot: string;
|
|
109
115
|
model: string;
|
|
110
116
|
startedAt: string;
|