@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.
@@ -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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"}
@@ -1,2 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1
2
  export declare function resolveServerVersion(): Promise<string>;
3
+ export declare function createMcpServer(): Promise<McpServer>;
2
4
  export declare function startMcpServer(): Promise<void>;
@@ -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
- export async function startMcpServer() {
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) {
@@ -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;