@agent-workspace/mcp-server 0.2.1 → 0.5.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 +42 -5
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -568
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +726 -0
- package/dist/index.test.js.map +1 -0
- package/dist/tools/artifact.d.ts +6 -0
- package/dist/tools/artifact.d.ts.map +1 -0
- package/dist/tools/artifact.js +428 -0
- package/dist/tools/artifact.js.map +1 -0
- package/dist/tools/config.d.ts +6 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +91 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/contract.d.ts +6 -0
- package/dist/tools/contract.d.ts.map +1 -0
- package/dist/tools/contract.js +233 -0
- package/dist/tools/contract.js.map +1 -0
- package/dist/tools/identity.d.ts +6 -0
- package/dist/tools/identity.d.ts.map +1 -0
- package/dist/tools/identity.js +91 -0
- package/dist/tools/identity.js.map +1 -0
- package/dist/tools/memory.d.ts +6 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +145 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/project.d.ts +6 -0
- package/dist/tools/project.d.ts.map +1 -0
- package/dist/tools/project.js +184 -0
- package/dist/tools/project.js.map +1 -0
- package/dist/tools/reputation.d.ts +6 -0
- package/dist/tools/reputation.d.ts.map +1 -0
- package/dist/tools/reputation.js +206 -0
- package/dist/tools/reputation.js.map +1 -0
- package/dist/tools/status.d.ts +6 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/status.js +223 -0
- package/dist/tools/status.js.map +1 -0
- package/dist/tools/swarm.d.ts +6 -0
- package/dist/tools/swarm.d.ts.map +1 -0
- package/dist/tools/swarm.js +483 -0
- package/dist/tools/swarm.js.map +1 -0
- package/dist/tools/task.d.ts +6 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +347 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/utils.d.ts +23 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +56 -0
- package/dist/utils.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { readFile, writeFile, readdir, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import matter from "gray-matter";
|
|
4
|
+
import * as z from "zod";
|
|
5
|
+
import { AWP_VERSION, RDP_VERSION, CONTRACTS_DIR, REPUTATION_DIR } from "@agent-workspace/core";
|
|
6
|
+
import { getWorkspaceRoot, getAgentDid, updateDimension } from "@agent-workspace/utils";
|
|
7
|
+
/**
|
|
8
|
+
* Register contract-related tools: create, evaluate, list
|
|
9
|
+
*/
|
|
10
|
+
export function registerContractTools(server) {
|
|
11
|
+
// --- Tool: awp_contract_create ---
|
|
12
|
+
server.registerTool("awp_contract_create", {
|
|
13
|
+
title: "Create Delegation Contract",
|
|
14
|
+
description: "Create a new delegation contract between agents with task definition and evaluation criteria.",
|
|
15
|
+
inputSchema: {
|
|
16
|
+
slug: z.string().describe("Contract slug"),
|
|
17
|
+
delegate: z.string().describe("Delegate agent DID"),
|
|
18
|
+
delegateSlug: z.string().describe("Delegate reputation profile slug"),
|
|
19
|
+
description: z.string().describe("Task description"),
|
|
20
|
+
deadline: z.string().optional().describe("Deadline (ISO 8601)"),
|
|
21
|
+
outputFormat: z.string().optional().describe("Expected output type"),
|
|
22
|
+
outputSlug: z.string().optional().describe("Expected output artifact slug"),
|
|
23
|
+
criteria: z
|
|
24
|
+
.record(z.string(), z.number())
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Evaluation criteria weights (default: completeness:0.3, accuracy:0.4, clarity:0.2, timeliness:0.1)"),
|
|
27
|
+
},
|
|
28
|
+
}, async ({ slug, delegate, delegateSlug, description, deadline, outputFormat, outputSlug, criteria, }) => {
|
|
29
|
+
const root = getWorkspaceRoot();
|
|
30
|
+
const conDir = join(root, CONTRACTS_DIR);
|
|
31
|
+
await mkdir(conDir, { recursive: true });
|
|
32
|
+
const filePath = join(conDir, `${slug}.md`);
|
|
33
|
+
const delegatorDid = await getAgentDid(root);
|
|
34
|
+
const now = new Date().toISOString();
|
|
35
|
+
const evalCriteria = criteria || {
|
|
36
|
+
completeness: 0.3,
|
|
37
|
+
accuracy: 0.4,
|
|
38
|
+
clarity: 0.2,
|
|
39
|
+
timeliness: 0.1,
|
|
40
|
+
};
|
|
41
|
+
const data = {
|
|
42
|
+
awp: AWP_VERSION,
|
|
43
|
+
rdp: RDP_VERSION,
|
|
44
|
+
type: "delegation-contract",
|
|
45
|
+
id: `contract:${slug}`,
|
|
46
|
+
status: "active",
|
|
47
|
+
delegator: delegatorDid,
|
|
48
|
+
delegate,
|
|
49
|
+
delegateSlug,
|
|
50
|
+
created: now,
|
|
51
|
+
task: { description },
|
|
52
|
+
evaluation: { criteria: evalCriteria, result: null },
|
|
53
|
+
};
|
|
54
|
+
if (deadline)
|
|
55
|
+
data.deadline = deadline;
|
|
56
|
+
const task = data.task;
|
|
57
|
+
if (outputFormat)
|
|
58
|
+
task.outputFormat = outputFormat;
|
|
59
|
+
if (outputSlug)
|
|
60
|
+
task.outputSlug = outputSlug;
|
|
61
|
+
const body = `\n# ${slug} — Delegation Contract\n\nDelegated to ${delegateSlug}: ${description}\n\n## Status\nActive — awaiting completion.\n`;
|
|
62
|
+
const output = matter.stringify(body, data);
|
|
63
|
+
await writeFile(filePath, output, "utf-8");
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: "text",
|
|
68
|
+
text: `Created contracts/${slug}.md (status: active)`,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
// --- Tool: awp_contract_evaluate ---
|
|
74
|
+
server.registerTool("awp_contract_evaluate", {
|
|
75
|
+
title: "Evaluate Delegation Contract",
|
|
76
|
+
description: "Evaluate a completed contract with scores for each criterion. Generates reputation signals for the delegate automatically.",
|
|
77
|
+
inputSchema: {
|
|
78
|
+
slug: z.string().describe("Contract slug"),
|
|
79
|
+
scores: z
|
|
80
|
+
.record(z.string(), z.number().min(0).max(1))
|
|
81
|
+
.describe("Map of criterion name to score (0.0-1.0)"),
|
|
82
|
+
},
|
|
83
|
+
}, async ({ slug, scores }) => {
|
|
84
|
+
const root = getWorkspaceRoot();
|
|
85
|
+
const filePath = join(root, CONTRACTS_DIR, `${slug}.md`);
|
|
86
|
+
let fileData;
|
|
87
|
+
try {
|
|
88
|
+
const raw = await readFile(filePath, "utf-8");
|
|
89
|
+
fileData = matter(raw);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return {
|
|
93
|
+
content: [{ type: "text", text: `Contract "${slug}" not found.` }],
|
|
94
|
+
isError: true,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (fileData.data.status === "evaluated") {
|
|
98
|
+
return {
|
|
99
|
+
content: [{ type: "text", text: "Contract has already been evaluated." }],
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const evaluation = fileData.data.evaluation;
|
|
104
|
+
const criteria = evaluation.criteria;
|
|
105
|
+
const scoreMap = scores;
|
|
106
|
+
let weightedScore = 0;
|
|
107
|
+
for (const [name, weight] of Object.entries(criteria)) {
|
|
108
|
+
if (scoreMap[name] === undefined) {
|
|
109
|
+
return {
|
|
110
|
+
content: [{ type: "text", text: `Missing score for criterion: ${name}` }],
|
|
111
|
+
isError: true,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
weightedScore += weight * scoreMap[name];
|
|
115
|
+
}
|
|
116
|
+
weightedScore = Math.round(weightedScore * 1000) / 1000;
|
|
117
|
+
// Update contract
|
|
118
|
+
fileData.data.status = "evaluated";
|
|
119
|
+
evaluation.result = scores;
|
|
120
|
+
const contractOutput = matter.stringify(fileData.content, fileData.data);
|
|
121
|
+
await writeFile(filePath, contractOutput, "utf-8");
|
|
122
|
+
// Generate reputation signal for delegate
|
|
123
|
+
const evaluatorDid = await getAgentDid(root);
|
|
124
|
+
const delegateSlug = fileData.data.delegateSlug;
|
|
125
|
+
const now = new Date();
|
|
126
|
+
const timestamp = now.toISOString();
|
|
127
|
+
const task = fileData.data.task;
|
|
128
|
+
const signal = {
|
|
129
|
+
source: evaluatorDid,
|
|
130
|
+
dimension: "reliability",
|
|
131
|
+
score: weightedScore,
|
|
132
|
+
timestamp,
|
|
133
|
+
evidence: fileData.data.id,
|
|
134
|
+
message: `Contract evaluation: ${task.description}`,
|
|
135
|
+
};
|
|
136
|
+
// Try to update delegate's reputation profile
|
|
137
|
+
const repPath = join(root, REPUTATION_DIR, `${delegateSlug}.md`);
|
|
138
|
+
let repUpdated = false;
|
|
139
|
+
try {
|
|
140
|
+
const repRaw = await readFile(repPath, "utf-8");
|
|
141
|
+
const repData = matter(repRaw);
|
|
142
|
+
repData.data.lastUpdated = timestamp;
|
|
143
|
+
const signals = repData.data.signals;
|
|
144
|
+
signals.push(signal);
|
|
145
|
+
if (!repData.data.dimensions)
|
|
146
|
+
repData.data.dimensions = {};
|
|
147
|
+
const dimensions = repData.data.dimensions;
|
|
148
|
+
dimensions.reliability = updateDimension(dimensions.reliability, weightedScore, now);
|
|
149
|
+
const repOutput = matter.stringify(repData.content, repData.data);
|
|
150
|
+
await writeFile(repPath, repOutput, "utf-8");
|
|
151
|
+
repUpdated = true;
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// No profile — that's OK
|
|
155
|
+
}
|
|
156
|
+
const resultText = [
|
|
157
|
+
`Evaluated contracts/${slug}.md — weighted score: ${weightedScore}`,
|
|
158
|
+
repUpdated
|
|
159
|
+
? `Updated reputation/${delegateSlug}.md with reliability signal`
|
|
160
|
+
: `Note: No reputation profile for ${delegateSlug} — signal not recorded`,
|
|
161
|
+
].join("\n");
|
|
162
|
+
return {
|
|
163
|
+
content: [{ type: "text", text: resultText }],
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
// --- Tool: awp_contract_list ---
|
|
167
|
+
server.registerTool("awp_contract_list", {
|
|
168
|
+
title: "List Delegation Contracts",
|
|
169
|
+
description: "List all delegation contracts with optional status filter",
|
|
170
|
+
inputSchema: {
|
|
171
|
+
status: z
|
|
172
|
+
.string()
|
|
173
|
+
.optional()
|
|
174
|
+
.describe("Filter by status (active, completed, evaluated, cancelled)"),
|
|
175
|
+
},
|
|
176
|
+
}, async ({ status: statusFilter }) => {
|
|
177
|
+
const root = getWorkspaceRoot();
|
|
178
|
+
const contractsDir = join(root, CONTRACTS_DIR);
|
|
179
|
+
let files;
|
|
180
|
+
try {
|
|
181
|
+
files = await readdir(contractsDir);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return {
|
|
185
|
+
content: [{ type: "text", text: "No contracts directory found." }],
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const mdFiles = files.filter((f) => f.endsWith(".md")).sort();
|
|
189
|
+
const contracts = [];
|
|
190
|
+
for (const f of mdFiles) {
|
|
191
|
+
try {
|
|
192
|
+
const raw = await readFile(join(contractsDir, f), "utf-8");
|
|
193
|
+
const { data } = matter(raw);
|
|
194
|
+
if (data.type === "delegation-contract") {
|
|
195
|
+
if (!statusFilter || data.status === statusFilter) {
|
|
196
|
+
contracts.push({
|
|
197
|
+
slug: f.replace(".md", ""),
|
|
198
|
+
status: data.status || "unknown",
|
|
199
|
+
delegate: data.delegate || "unknown",
|
|
200
|
+
delegateSlug: data.delegateSlug || "unknown",
|
|
201
|
+
created: data.created || "unknown",
|
|
202
|
+
deadline: data.deadline,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Skip unparseable files
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (contracts.length === 0) {
|
|
212
|
+
return {
|
|
213
|
+
content: [
|
|
214
|
+
{
|
|
215
|
+
type: "text",
|
|
216
|
+
text: statusFilter
|
|
217
|
+
? `No contracts with status: ${statusFilter}`
|
|
218
|
+
: "No contracts found.",
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
content: [
|
|
225
|
+
{
|
|
226
|
+
type: "text",
|
|
227
|
+
text: JSON.stringify(contracts, null, 2),
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
};
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/tools/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
/**
|
|
3
|
+
* Register identity-related tools: read_identity, read_soul, read_user
|
|
4
|
+
*/
|
|
5
|
+
export declare function registerIdentityTools(server: McpServer): void;
|
|
6
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/tools/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+F7D"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import matter from "gray-matter";
|
|
4
|
+
import { getWorkspaceRoot } from "@agent-workspace/utils";
|
|
5
|
+
/**
|
|
6
|
+
* Register identity-related tools: read_identity, read_soul, read_user
|
|
7
|
+
*/
|
|
8
|
+
export function registerIdentityTools(server) {
|
|
9
|
+
// --- Tool: awp_read_identity ---
|
|
10
|
+
server.registerTool("awp_read_identity", {
|
|
11
|
+
title: "Read Agent Identity",
|
|
12
|
+
description: "Read this agent's identity (name, creature, capabilities, DID) from the AWP workspace",
|
|
13
|
+
inputSchema: {},
|
|
14
|
+
}, async () => {
|
|
15
|
+
const root = getWorkspaceRoot();
|
|
16
|
+
const path = join(root, "IDENTITY.md");
|
|
17
|
+
try {
|
|
18
|
+
const raw = await readFile(path, "utf-8");
|
|
19
|
+
const { data, content } = matter(raw);
|
|
20
|
+
return {
|
|
21
|
+
content: [
|
|
22
|
+
{
|
|
23
|
+
type: "text",
|
|
24
|
+
text: JSON.stringify({ frontmatter: data, body: content.trim() }, null, 2),
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return {
|
|
31
|
+
content: [{ type: "text", text: "Error: IDENTITY.md not found" }],
|
|
32
|
+
isError: true,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
// --- Tool: awp_read_soul ---
|
|
37
|
+
server.registerTool("awp_read_soul", {
|
|
38
|
+
title: "Read Agent Soul",
|
|
39
|
+
description: "Read this agent's values, boundaries, and governance rules from the AWP workspace",
|
|
40
|
+
inputSchema: {},
|
|
41
|
+
}, async () => {
|
|
42
|
+
const root = getWorkspaceRoot();
|
|
43
|
+
const path = join(root, "SOUL.md");
|
|
44
|
+
try {
|
|
45
|
+
const raw = await readFile(path, "utf-8");
|
|
46
|
+
const { data, content } = matter(raw);
|
|
47
|
+
return {
|
|
48
|
+
content: [
|
|
49
|
+
{
|
|
50
|
+
type: "text",
|
|
51
|
+
text: JSON.stringify({ frontmatter: data, body: content.trim() }, null, 2),
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: "text", text: "Error: SOUL.md not found" }],
|
|
59
|
+
isError: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// --- Tool: awp_read_user ---
|
|
64
|
+
server.registerTool("awp_read_user", {
|
|
65
|
+
title: "Read Human Profile",
|
|
66
|
+
description: "Read the human user's profile from the AWP workspace",
|
|
67
|
+
inputSchema: {},
|
|
68
|
+
}, async () => {
|
|
69
|
+
const root = getWorkspaceRoot();
|
|
70
|
+
const path = join(root, "USER.md");
|
|
71
|
+
try {
|
|
72
|
+
const raw = await readFile(path, "utf-8");
|
|
73
|
+
const { data, content } = matter(raw);
|
|
74
|
+
return {
|
|
75
|
+
content: [
|
|
76
|
+
{
|
|
77
|
+
type: "text",
|
|
78
|
+
text: JSON.stringify({ frontmatter: data, body: content.trim() }, null, 2),
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return {
|
|
85
|
+
content: [{ type: "text", text: "Error: USER.md not found" }],
|
|
86
|
+
isError: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/tools/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuJ3D"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { readFile, writeFile, readdir, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import matter from "gray-matter";
|
|
4
|
+
import * as z from "zod";
|
|
5
|
+
import { AWP_VERSION, MEMORY_DIR } from "@agent-workspace/core";
|
|
6
|
+
import { getWorkspaceRoot } from "@agent-workspace/utils";
|
|
7
|
+
/**
|
|
8
|
+
* Register memory-related tools: read_memory, write_memory
|
|
9
|
+
*/
|
|
10
|
+
export function registerMemoryTools(server) {
|
|
11
|
+
// --- Tool: awp_read_memory ---
|
|
12
|
+
server.registerTool("awp_read_memory", {
|
|
13
|
+
title: "Read Memory",
|
|
14
|
+
description: "Read memory entries. Specify a date (YYYY-MM-DD) for daily logs, or 'longterm' for MEMORY.md, or 'recent' for the last 3 days",
|
|
15
|
+
inputSchema: {
|
|
16
|
+
target: z
|
|
17
|
+
.string()
|
|
18
|
+
.describe("Which memory to read: a date like '2026-01-30', 'longterm', or 'recent'"),
|
|
19
|
+
},
|
|
20
|
+
}, async ({ target }) => {
|
|
21
|
+
const root = getWorkspaceRoot();
|
|
22
|
+
if (target === "longterm") {
|
|
23
|
+
const path = join(root, "MEMORY.md");
|
|
24
|
+
try {
|
|
25
|
+
const raw = await readFile(path, "utf-8");
|
|
26
|
+
const { data, content } = matter(raw);
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: "text",
|
|
31
|
+
text: JSON.stringify({ frontmatter: data, body: content.trim() }, null, 2),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return {
|
|
38
|
+
content: [{ type: "text", text: "No long-term memory file exists yet." }],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (target === "recent") {
|
|
43
|
+
const memDir = join(root, MEMORY_DIR);
|
|
44
|
+
try {
|
|
45
|
+
const files = await readdir(memDir);
|
|
46
|
+
const mdFiles = files
|
|
47
|
+
.filter((f) => f.endsWith(".md"))
|
|
48
|
+
.sort()
|
|
49
|
+
.reverse()
|
|
50
|
+
.slice(0, 3);
|
|
51
|
+
const results = [];
|
|
52
|
+
for (const f of mdFiles) {
|
|
53
|
+
const raw = await readFile(join(memDir, f), "utf-8");
|
|
54
|
+
const { data, content } = matter(raw);
|
|
55
|
+
results.push(`--- ${f} ---\n${JSON.stringify(data, null, 2)}\n${content.trim()}`);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: "text",
|
|
61
|
+
text: results.length ? results.join("\n\n") : "No recent memory entries.",
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: "text", text: "No memory directory found." }],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Specific date
|
|
73
|
+
const path = join(root, MEMORY_DIR, `${target}.md`);
|
|
74
|
+
try {
|
|
75
|
+
const raw = await readFile(path, "utf-8");
|
|
76
|
+
const { data, content } = matter(raw);
|
|
77
|
+
return {
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: "text",
|
|
81
|
+
text: JSON.stringify({ frontmatter: data, body: content.trim() }, null, 2),
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return {
|
|
88
|
+
content: [{ type: "text", text: `No memory entry for ${target}.` }],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
// --- Tool: awp_write_memory ---
|
|
93
|
+
server.registerTool("awp_write_memory", {
|
|
94
|
+
title: "Write Memory",
|
|
95
|
+
description: "Append an entry to today's memory log in the AWP workspace",
|
|
96
|
+
inputSchema: {
|
|
97
|
+
content: z.string().describe("The memory entry to log"),
|
|
98
|
+
tags: z.array(z.string()).optional().describe("Optional categorization tags"),
|
|
99
|
+
},
|
|
100
|
+
}, async ({ content: entryContent, tags }) => {
|
|
101
|
+
const root = getWorkspaceRoot();
|
|
102
|
+
const memDir = join(root, MEMORY_DIR);
|
|
103
|
+
await mkdir(memDir, { recursive: true });
|
|
104
|
+
const date = new Date().toISOString().split("T")[0];
|
|
105
|
+
const time = new Date().toTimeString().slice(0, 5);
|
|
106
|
+
const filePath = join(memDir, `${date}.md`);
|
|
107
|
+
const entry = {
|
|
108
|
+
time,
|
|
109
|
+
content: entryContent,
|
|
110
|
+
tags: tags?.length ? tags : undefined,
|
|
111
|
+
};
|
|
112
|
+
let fileData;
|
|
113
|
+
try {
|
|
114
|
+
const raw = await readFile(filePath, "utf-8");
|
|
115
|
+
fileData = matter(raw);
|
|
116
|
+
if (!fileData.data.entries)
|
|
117
|
+
fileData.data.entries = [];
|
|
118
|
+
fileData.data.entries.push(entry);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
fileData = {
|
|
122
|
+
data: {
|
|
123
|
+
awp: AWP_VERSION,
|
|
124
|
+
type: "memory-daily",
|
|
125
|
+
date,
|
|
126
|
+
entries: [entry],
|
|
127
|
+
},
|
|
128
|
+
content: `\n# ${date}\n\n`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const tagStr = tags?.length ? ` [${tags.join(", ")}]` : "";
|
|
132
|
+
fileData.content += `- **${time}** — ${entryContent}${tagStr}\n`;
|
|
133
|
+
const output = matter.stringify(fileData.content, fileData.data);
|
|
134
|
+
await writeFile(filePath, output, "utf-8");
|
|
135
|
+
return {
|
|
136
|
+
content: [
|
|
137
|
+
{
|
|
138
|
+
type: "text",
|
|
139
|
+
text: `Logged to memory/${date}.md at ${time}`,
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBzE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmL5D"}
|