twining-mcp 1.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/LICENSE +21 -0
- package/README.md +165 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +78 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/api-routes.d.ts +21 -0
- package/dist/dashboard/api-routes.d.ts.map +1 -0
- package/dist/dashboard/api-routes.js +516 -0
- package/dist/dashboard/api-routes.js.map +1 -0
- package/dist/dashboard/dashboard-config.d.ts +19 -0
- package/dist/dashboard/dashboard-config.d.ts.map +1 -0
- package/dist/dashboard/dashboard-config.js +17 -0
- package/dist/dashboard/dashboard-config.js.map +1 -0
- package/dist/dashboard/http-server.d.ts +29 -0
- package/dist/dashboard/http-server.d.ts.map +1 -0
- package/dist/dashboard/http-server.js +177 -0
- package/dist/dashboard/http-server.js.map +1 -0
- package/dist/dashboard/public/app.js +2396 -0
- package/dist/dashboard/public/assets/favicon.svg +44 -0
- package/dist/dashboard/public/assets/icon-512.png +0 -0
- package/dist/dashboard/public/assets/logo.svg +45 -0
- package/dist/dashboard/public/favicon.ico +0 -0
- package/dist/dashboard/public/index.html +338 -0
- package/dist/dashboard/public/style.css +858 -0
- package/dist/dashboard/public/vendor/cytoscape.min.js +1 -0
- package/dist/dashboard/public/vendor/vis-timeline-graph2d.min.css +2 -0
- package/dist/dashboard/public/vendor/vis-timeline-graph2d.min.js +48 -0
- package/dist/embeddings/embedder.d.ts +24 -0
- package/dist/embeddings/embedder.d.ts.map +1 -0
- package/dist/embeddings/embedder.js +109 -0
- package/dist/embeddings/embedder.js.map +1 -0
- package/dist/embeddings/index-manager.d.ts +27 -0
- package/dist/embeddings/index-manager.d.ts.map +1 -0
- package/dist/embeddings/index-manager.js +115 -0
- package/dist/embeddings/index-manager.js.map +1 -0
- package/dist/embeddings/search.d.ts +52 -0
- package/dist/embeddings/search.d.ts.map +1 -0
- package/dist/embeddings/search.js +170 -0
- package/dist/embeddings/search.js.map +1 -0
- package/dist/engine/archiver.d.ts +28 -0
- package/dist/engine/archiver.d.ts.map +1 -0
- package/dist/engine/archiver.js +153 -0
- package/dist/engine/archiver.js.map +1 -0
- package/dist/engine/blackboard.d.ts +55 -0
- package/dist/engine/blackboard.d.ts.map +1 -0
- package/dist/engine/blackboard.js +90 -0
- package/dist/engine/blackboard.js.map +1 -0
- package/dist/engine/context-assembler.d.ts +50 -0
- package/dist/engine/context-assembler.d.ts.map +1 -0
- package/dist/engine/context-assembler.js +483 -0
- package/dist/engine/context-assembler.js.map +1 -0
- package/dist/engine/coordination.d.ts +53 -0
- package/dist/engine/coordination.d.ts.map +1 -0
- package/dist/engine/coordination.js +239 -0
- package/dist/engine/coordination.js.map +1 -0
- package/dist/engine/decisions.d.ts +147 -0
- package/dist/engine/decisions.d.ts.map +1 -0
- package/dist/engine/decisions.js +540 -0
- package/dist/engine/decisions.js.map +1 -0
- package/dist/engine/exporter.d.ts +30 -0
- package/dist/engine/exporter.d.ts.map +1 -0
- package/dist/engine/exporter.js +192 -0
- package/dist/engine/exporter.js.map +1 -0
- package/dist/engine/graph.d.ts +55 -0
- package/dist/engine/graph.d.ts.map +1 -0
- package/dist/engine/graph.js +119 -0
- package/dist/engine/graph.js.map +1 -0
- package/dist/engine/planning-bridge.d.ts +53 -0
- package/dist/engine/planning-bridge.d.ts.map +1 -0
- package/dist/engine/planning-bridge.js +170 -0
- package/dist/engine/planning-bridge.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +82 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/agent-store.d.ts +36 -0
- package/dist/storage/agent-store.d.ts.map +1 -0
- package/dist/storage/agent-store.js +119 -0
- package/dist/storage/agent-store.js.map +1 -0
- package/dist/storage/blackboard-store.d.ts +21 -0
- package/dist/storage/blackboard-store.d.ts.map +1 -0
- package/dist/storage/blackboard-store.js +56 -0
- package/dist/storage/blackboard-store.js.map +1 -0
- package/dist/storage/decision-store.d.ts +23 -0
- package/dist/storage/decision-store.d.ts.map +1 -0
- package/dist/storage/decision-store.js +179 -0
- package/dist/storage/decision-store.js.map +1 -0
- package/dist/storage/file-store.d.ts +20 -0
- package/dist/storage/file-store.d.ts.map +1 -0
- package/dist/storage/file-store.js +108 -0
- package/dist/storage/file-store.js.map +1 -0
- package/dist/storage/graph-store.d.ts +39 -0
- package/dist/storage/graph-store.d.ts.map +1 -0
- package/dist/storage/graph-store.js +143 -0
- package/dist/storage/graph-store.js.map +1 -0
- package/dist/storage/handoff-store.d.ts +44 -0
- package/dist/storage/handoff-store.d.ts.map +1 -0
- package/dist/storage/handoff-store.js +136 -0
- package/dist/storage/handoff-store.js.map +1 -0
- package/dist/storage/init.d.ts +10 -0
- package/dist/storage/init.d.ts.map +1 -0
- package/dist/storage/init.js +48 -0
- package/dist/storage/init.js.map +1 -0
- package/dist/tools/blackboard-tools.d.ts +4 -0
- package/dist/tools/blackboard-tools.d.ts.map +1 -0
- package/dist/tools/blackboard-tools.js +131 -0
- package/dist/tools/blackboard-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +4 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +76 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/coordination-tools.d.ts +6 -0
- package/dist/tools/coordination-tools.d.ts.map +1 -0
- package/dist/tools/coordination-tools.js +220 -0
- package/dist/tools/coordination-tools.js.map +1 -0
- package/dist/tools/decision-tools.d.ts +4 -0
- package/dist/tools/decision-tools.d.ts.map +1 -0
- package/dist/tools/decision-tools.js +265 -0
- package/dist/tools/decision-tools.js.map +1 -0
- package/dist/tools/export-tools.d.ts +4 -0
- package/dist/tools/export-tools.d.ts.map +1 -0
- package/dist/tools/export-tools.js +30 -0
- package/dist/tools/export-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +4 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +127 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/lifecycle-tools.d.ts +9 -0
- package/dist/tools/lifecycle-tools.d.ts.map +1 -0
- package/dist/tools/lifecycle-tools.js +142 -0
- package/dist/tools/lifecycle-tools.js.map +1 -0
- package/dist/utils/errors.d.ts +24 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +31 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/ids.d.ts +2 -0
- package/dist/utils/ids.d.ts.map +1 -0
- package/dist/utils/ids.js +10 -0
- package/dist/utils/ids.js.map +1 -0
- package/dist/utils/liveness.d.ts +14 -0
- package/dist/utils/liveness.d.ts.map +1 -0
- package/dist/utils/liveness.js +19 -0
- package/dist/utils/liveness.js.map +1 -0
- package/dist/utils/tags.d.ts +9 -0
- package/dist/utils/tags.d.ts.map +1 -0
- package/dist/utils/tags.js +12 -0
- package/dist/utils/tags.js.map +1 -0
- package/dist/utils/tokens.d.ts +6 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +8 -0
- package/dist/utils/tokens.js.map +1 -0
- package/dist/utils/types.d.ts +308 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +18 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +60 -0
- package/src/dashboard/public/app.js +2396 -0
- package/src/dashboard/public/assets/favicon.svg +44 -0
- package/src/dashboard/public/assets/icon-512.png +0 -0
- package/src/dashboard/public/assets/logo.svg +45 -0
- package/src/dashboard/public/favicon.ico +0 -0
- package/src/dashboard/public/index.html +338 -0
- package/src/dashboard/public/style.css +858 -0
- package/src/dashboard/public/vendor/cytoscape.min.js +1 -0
- package/src/dashboard/public/vendor/vis-timeline-graph2d.min.css +2 -0
- package/src/dashboard/public/vendor/vis-timeline-graph2d.min.js +48 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool handlers for decision operations.
|
|
3
|
+
* Registers twining_decide, twining_why, twining_commits, twining_trace, twining_reconsider, twining_override.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { toolResult, toolError, TwiningError } from "../utils/errors.js";
|
|
7
|
+
export function registerDecisionTools(server, engine) {
|
|
8
|
+
// twining_decide — Record a decision with full rationale
|
|
9
|
+
server.registerTool("twining_decide", {
|
|
10
|
+
description: "Record a decision with full rationale, alternatives considered, and traceability. Creates a decision record and cross-posts to the blackboard.",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
domain: z
|
|
13
|
+
.string()
|
|
14
|
+
.describe('Decision domain (e.g., "architecture", "implementation", "testing")'),
|
|
15
|
+
scope: z
|
|
16
|
+
.string()
|
|
17
|
+
.describe("What part of the codebase this affects"),
|
|
18
|
+
summary: z.string().describe("One-line decision statement"),
|
|
19
|
+
context: z.string().describe("Situation that prompted this decision"),
|
|
20
|
+
rationale: z.string().describe("Reasoning for the choice"),
|
|
21
|
+
constraints: z
|
|
22
|
+
.array(z.string())
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("What limited the options"),
|
|
25
|
+
alternatives: z
|
|
26
|
+
.array(z.object({
|
|
27
|
+
option: z.string().describe("Alternative option considered"),
|
|
28
|
+
pros: z
|
|
29
|
+
.array(z.string())
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Advantages of this alternative"),
|
|
32
|
+
cons: z
|
|
33
|
+
.array(z.string())
|
|
34
|
+
.optional()
|
|
35
|
+
.describe("Disadvantages of this alternative"),
|
|
36
|
+
reason_rejected: z
|
|
37
|
+
.string()
|
|
38
|
+
.describe("Why this alternative was rejected"),
|
|
39
|
+
}))
|
|
40
|
+
.optional()
|
|
41
|
+
.describe("Alternatives that were considered"),
|
|
42
|
+
depends_on: z
|
|
43
|
+
.array(z.string())
|
|
44
|
+
.optional()
|
|
45
|
+
.describe("IDs of prerequisite decisions"),
|
|
46
|
+
supersedes: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe("ID of decision this replaces"),
|
|
50
|
+
confidence: z
|
|
51
|
+
.enum(["high", "medium", "low"])
|
|
52
|
+
.optional()
|
|
53
|
+
.describe('Confidence level (default: "medium")'),
|
|
54
|
+
reversible: z
|
|
55
|
+
.boolean()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe("Whether this decision is easily reversible (default: true)"),
|
|
58
|
+
affected_files: z
|
|
59
|
+
.array(z.string())
|
|
60
|
+
.optional()
|
|
61
|
+
.describe("File paths affected by this decision"),
|
|
62
|
+
affected_symbols: z
|
|
63
|
+
.array(z.string())
|
|
64
|
+
.optional()
|
|
65
|
+
.describe("Function/class names affected"),
|
|
66
|
+
agent_id: z
|
|
67
|
+
.string()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe('Identifier for the deciding agent (default: "main")'),
|
|
70
|
+
commit_hash: z
|
|
71
|
+
.string()
|
|
72
|
+
.optional()
|
|
73
|
+
.describe("Git commit hash to associate with this decision"),
|
|
74
|
+
},
|
|
75
|
+
}, async (args) => {
|
|
76
|
+
try {
|
|
77
|
+
const result = await engine.decide(args);
|
|
78
|
+
return toolResult(result);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
if (e instanceof TwiningError) {
|
|
82
|
+
return toolError(e.message, e.code);
|
|
83
|
+
}
|
|
84
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
// twining_why — Retrieve decision chain for a scope or file
|
|
88
|
+
server.registerTool("twining_why", {
|
|
89
|
+
description: 'Retrieve all decisions affecting a given scope or file. Shows the decision chain with rationale, confidence, and alternatives count. Essential for understanding "why was it done this way?"',
|
|
90
|
+
inputSchema: {
|
|
91
|
+
scope: z
|
|
92
|
+
.string()
|
|
93
|
+
.describe("File path, module name, or symbol to query"),
|
|
94
|
+
},
|
|
95
|
+
}, async (args) => {
|
|
96
|
+
try {
|
|
97
|
+
const result = await engine.why(args.scope);
|
|
98
|
+
return toolResult(result);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// twining_trace — Trace a decision's dependency chain
|
|
105
|
+
server.registerTool("twining_trace", {
|
|
106
|
+
description: "Trace a decision's dependency chain upstream (what it depends on) and/or downstream (what depends on it). Uses BFS with cycle protection.",
|
|
107
|
+
inputSchema: {
|
|
108
|
+
decision_id: z.string().describe("ID of the decision to trace"),
|
|
109
|
+
direction: z
|
|
110
|
+
.enum(["upstream", "downstream", "both"])
|
|
111
|
+
.optional()
|
|
112
|
+
.describe('Direction to trace (default: "both")'),
|
|
113
|
+
},
|
|
114
|
+
}, async (args) => {
|
|
115
|
+
try {
|
|
116
|
+
const result = await engine.trace(args.decision_id, args.direction);
|
|
117
|
+
return toolResult(result);
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
if (e instanceof TwiningError) {
|
|
121
|
+
return toolError(e.message, e.code);
|
|
122
|
+
}
|
|
123
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// twining_reconsider — Flag a decision for reconsideration
|
|
127
|
+
server.registerTool("twining_reconsider", {
|
|
128
|
+
description: "Flag a decision for reconsideration. Sets active decisions to provisional status and posts a warning to the blackboard with downstream impact analysis.",
|
|
129
|
+
inputSchema: {
|
|
130
|
+
decision_id: z.string().describe("ID of the decision to reconsider"),
|
|
131
|
+
new_context: z
|
|
132
|
+
.string()
|
|
133
|
+
.describe("New context or reason for reconsideration"),
|
|
134
|
+
agent_id: z
|
|
135
|
+
.string()
|
|
136
|
+
.optional()
|
|
137
|
+
.describe("ID of the agent requesting reconsideration"),
|
|
138
|
+
},
|
|
139
|
+
}, async (args) => {
|
|
140
|
+
try {
|
|
141
|
+
const result = await engine.reconsider(args.decision_id, args.new_context, args.agent_id);
|
|
142
|
+
return toolResult(result);
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
if (e instanceof TwiningError) {
|
|
146
|
+
return toolError(e.message, e.code);
|
|
147
|
+
}
|
|
148
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
// twining_override — Override a decision with a reason
|
|
152
|
+
server.registerTool("twining_override", {
|
|
153
|
+
description: "Override a decision with a reason. Sets the decision to overridden status, records who overrode it and why, and optionally creates a replacement decision automatically.",
|
|
154
|
+
inputSchema: {
|
|
155
|
+
decision_id: z.string().describe("ID of the decision to override"),
|
|
156
|
+
reason: z.string().describe("Reason for the override"),
|
|
157
|
+
new_decision: z
|
|
158
|
+
.string()
|
|
159
|
+
.optional()
|
|
160
|
+
.describe("Summary of the replacement decision to auto-create"),
|
|
161
|
+
overridden_by: z
|
|
162
|
+
.string()
|
|
163
|
+
.optional()
|
|
164
|
+
.describe('Who is overriding (default: "human")'),
|
|
165
|
+
},
|
|
166
|
+
}, async (args) => {
|
|
167
|
+
try {
|
|
168
|
+
const result = await engine.override(args.decision_id, args.reason, args.new_decision, args.overridden_by);
|
|
169
|
+
return toolResult(result);
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
if (e instanceof TwiningError) {
|
|
173
|
+
return toolError(e.message, e.code);
|
|
174
|
+
}
|
|
175
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
// twining_commits — Query decisions by commit hash
|
|
179
|
+
server.registerTool("twining_commits", {
|
|
180
|
+
description: "Query decisions by commit hash. Returns all decisions that were linked to a given commit, enabling traceability from code changes back to decision rationale.",
|
|
181
|
+
inputSchema: {
|
|
182
|
+
commit_hash: z
|
|
183
|
+
.string()
|
|
184
|
+
.describe("Git commit hash to look up"),
|
|
185
|
+
},
|
|
186
|
+
}, async (args) => {
|
|
187
|
+
try {
|
|
188
|
+
const result = await engine.getByCommitHash(args.commit_hash);
|
|
189
|
+
return toolResult(result);
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
if (e instanceof TwiningError) {
|
|
193
|
+
return toolError(e.message, e.code);
|
|
194
|
+
}
|
|
195
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
// twining_search_decisions — Search decisions across all scopes
|
|
199
|
+
server.registerTool("twining_search_decisions", {
|
|
200
|
+
description: "Search decisions across all scopes by keyword or semantic similarity. Returns ranked results without requiring a specific scope. Supports filtering by domain, status, and confidence level.",
|
|
201
|
+
inputSchema: {
|
|
202
|
+
query: z
|
|
203
|
+
.string()
|
|
204
|
+
.describe("Search query — keywords or natural language description of what you're looking for"),
|
|
205
|
+
domain: z
|
|
206
|
+
.string()
|
|
207
|
+
.optional()
|
|
208
|
+
.describe("Filter by decision domain (e.g., 'architecture', 'implementation')"),
|
|
209
|
+
status: z
|
|
210
|
+
.enum(["active", "provisional", "superseded", "overridden"])
|
|
211
|
+
.optional()
|
|
212
|
+
.describe("Filter by decision status"),
|
|
213
|
+
confidence: z
|
|
214
|
+
.enum(["high", "medium", "low"])
|
|
215
|
+
.optional()
|
|
216
|
+
.describe("Filter by confidence level"),
|
|
217
|
+
limit: z
|
|
218
|
+
.number()
|
|
219
|
+
.optional()
|
|
220
|
+
.describe("Maximum results to return (default: 20)"),
|
|
221
|
+
},
|
|
222
|
+
}, async (args) => {
|
|
223
|
+
try {
|
|
224
|
+
const filters = {};
|
|
225
|
+
if (args.domain)
|
|
226
|
+
filters.domain = args.domain;
|
|
227
|
+
if (args.status)
|
|
228
|
+
filters.status = args.status;
|
|
229
|
+
if (args.confidence)
|
|
230
|
+
filters.confidence = args.confidence;
|
|
231
|
+
const result = await engine.searchDecisions(args.query, Object.keys(filters).length > 0 ? filters : undefined, args.limit);
|
|
232
|
+
return toolResult(result);
|
|
233
|
+
}
|
|
234
|
+
catch (e) {
|
|
235
|
+
if (e instanceof TwiningError) {
|
|
236
|
+
return toolError(e.message, e.code);
|
|
237
|
+
}
|
|
238
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
// twining_link_commit — Link a git commit hash to an existing decision
|
|
242
|
+
server.registerTool("twining_link_commit", {
|
|
243
|
+
description: "Link a git commit hash to an existing decision. Enables bidirectional traceability between decisions and commits.",
|
|
244
|
+
inputSchema: {
|
|
245
|
+
decision_id: z.string().describe("ID of the decision to link"),
|
|
246
|
+
commit_hash: z.string().describe("Git commit hash to link"),
|
|
247
|
+
agent_id: z
|
|
248
|
+
.string()
|
|
249
|
+
.optional()
|
|
250
|
+
.describe("ID of the agent performing the link"),
|
|
251
|
+
},
|
|
252
|
+
}, async (args) => {
|
|
253
|
+
try {
|
|
254
|
+
const result = await engine.linkCommit(args.decision_id, args.commit_hash, args.agent_id);
|
|
255
|
+
return toolResult(result);
|
|
256
|
+
}
|
|
257
|
+
catch (e) {
|
|
258
|
+
if (e instanceof TwiningError) {
|
|
259
|
+
return toolError(e.message, e.code);
|
|
260
|
+
}
|
|
261
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=decision-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-tools.js","sourceRoot":"","sources":["../../src/tools/decision-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-tools.d.ts","sourceRoot":"","sources":["../../src/tools/export-tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,GACjB,IAAI,CA+BN"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool handlers for export operations.
|
|
3
|
+
* Registers twining_export for full state snapshot as markdown.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { toolResult, toolError, TwiningError } from "../utils/errors.js";
|
|
7
|
+
export function registerExportTools(server, exporter) {
|
|
8
|
+
// twining_export — Export full Twining state as markdown
|
|
9
|
+
server.registerTool("twining_export", {
|
|
10
|
+
description: "Export full Twining state as a single markdown document. Includes blackboard entries, decisions with full rationale, and knowledge graph entities/relations. Use for handoff between context windows, documentation, or debugging.",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
scope: z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Optional scope filter to export only a subset of state (e.g., 'src/auth/'). If omitted, exports everything."),
|
|
16
|
+
},
|
|
17
|
+
}, async (args) => {
|
|
18
|
+
try {
|
|
19
|
+
const result = await exporter.exportMarkdown(args.scope);
|
|
20
|
+
return toolResult(result);
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
if (e instanceof TwiningError) {
|
|
24
|
+
return toolError(e.message, e.code);
|
|
25
|
+
}
|
|
26
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=export-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-tools.js","sourceRoot":"","sources":["../../src/tools/export-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,QAAkB;IAElB,yDAAyD;IACzD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,oOAAoO;QACtO,WAAW,EAAE;YACX,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,6GAA6G,CAC9G;SACJ;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,YAAY,EAAE,CAAC;gBAC9B,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,SAAS,CACd,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAChD,gBAAgB,CACjB,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-tools.d.ts","sourceRoot":"","sources":["../../src/tools/graph-tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,GAClB,IAAI,CAkKN"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool handlers for knowledge graph operations.
|
|
3
|
+
* Registers twining_add_entity, twining_add_relation, twining_neighbors, twining_graph_query.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { toolResult, toolError, TwiningError } from "../utils/errors.js";
|
|
7
|
+
export function registerGraphTools(server, engine) {
|
|
8
|
+
// twining_add_entity — Add or update a knowledge graph entity
|
|
9
|
+
server.registerTool("twining_add_entity", {
|
|
10
|
+
description: "Add or update a knowledge graph entity. Uses upsert semantics: if an entity with the same name and type exists, its properties are merged and updated. Returns the entity ID.",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
name: z.string().describe("Entity name (e.g., class name, file path, concept)"),
|
|
13
|
+
type: z
|
|
14
|
+
.string()
|
|
15
|
+
.describe('Entity type: "module", "function", "class", "file", "concept", "pattern", "dependency", "api_endpoint"'),
|
|
16
|
+
properties: z
|
|
17
|
+
.record(z.string())
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Key-value properties for this entity"),
|
|
20
|
+
},
|
|
21
|
+
}, async (args) => {
|
|
22
|
+
try {
|
|
23
|
+
const entity = await engine.addEntity({
|
|
24
|
+
name: args.name,
|
|
25
|
+
type: args.type,
|
|
26
|
+
properties: args.properties,
|
|
27
|
+
});
|
|
28
|
+
return toolResult({ id: entity.id });
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
if (e instanceof TwiningError) {
|
|
32
|
+
return toolError(e.message, e.code);
|
|
33
|
+
}
|
|
34
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
// twining_add_relation — Add a relation between two entities
|
|
38
|
+
server.registerTool("twining_add_relation", {
|
|
39
|
+
description: "Add a relation between two knowledge graph entities. Source and target can be entity IDs or names. Returns an error for ambiguous name matches.",
|
|
40
|
+
inputSchema: {
|
|
41
|
+
source: z
|
|
42
|
+
.string()
|
|
43
|
+
.describe("Source entity ID or name"),
|
|
44
|
+
target: z
|
|
45
|
+
.string()
|
|
46
|
+
.describe("Target entity ID or name"),
|
|
47
|
+
type: z
|
|
48
|
+
.string()
|
|
49
|
+
.describe('Relation type: "depends_on", "implements", "decided_by", "affects", "tested_by", "calls", "imports", "related_to"'),
|
|
50
|
+
properties: z
|
|
51
|
+
.record(z.string())
|
|
52
|
+
.optional()
|
|
53
|
+
.describe("Key-value properties for this relation"),
|
|
54
|
+
},
|
|
55
|
+
}, async (args) => {
|
|
56
|
+
try {
|
|
57
|
+
const relation = await engine.addRelation({
|
|
58
|
+
source: args.source,
|
|
59
|
+
target: args.target,
|
|
60
|
+
type: args.type,
|
|
61
|
+
properties: args.properties,
|
|
62
|
+
});
|
|
63
|
+
return toolResult({ id: relation.id });
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
if (e instanceof TwiningError) {
|
|
67
|
+
return toolError(e.message, e.code);
|
|
68
|
+
}
|
|
69
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
// twining_neighbors — Traverse neighbors from an entity
|
|
73
|
+
server.registerTool("twining_neighbors", {
|
|
74
|
+
description: "Traverse the knowledge graph from an entity, returning neighbors up to a given depth (max 3). Supports filtering by relation type. Useful for understanding how entities connect.",
|
|
75
|
+
inputSchema: {
|
|
76
|
+
entity: z
|
|
77
|
+
.string()
|
|
78
|
+
.describe("Entity ID or name to start traversal from"),
|
|
79
|
+
depth: z
|
|
80
|
+
.number()
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("Traversal depth (1-3, default: 1)"),
|
|
83
|
+
relation_types: z
|
|
84
|
+
.array(z.string())
|
|
85
|
+
.optional()
|
|
86
|
+
.describe("Filter to only these relation types"),
|
|
87
|
+
},
|
|
88
|
+
}, async (args) => {
|
|
89
|
+
try {
|
|
90
|
+
const result = await engine.neighbors(args.entity, args.depth, args.relation_types);
|
|
91
|
+
return toolResult(result);
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
if (e instanceof TwiningError) {
|
|
95
|
+
return toolError(e.message, e.code);
|
|
96
|
+
}
|
|
97
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
// twining_graph_query — Search entities by substring
|
|
101
|
+
server.registerTool("twining_graph_query", {
|
|
102
|
+
description: "Search the knowledge graph for entities by name or property substring match. Case-insensitive. Returns matching entities with their properties.",
|
|
103
|
+
inputSchema: {
|
|
104
|
+
query: z.string().describe("Substring to search for in entity names and properties"),
|
|
105
|
+
entity_types: z
|
|
106
|
+
.array(z.string())
|
|
107
|
+
.optional()
|
|
108
|
+
.describe("Filter to only these entity types"),
|
|
109
|
+
limit: z
|
|
110
|
+
.number()
|
|
111
|
+
.optional()
|
|
112
|
+
.describe("Maximum results to return (default: 10)"),
|
|
113
|
+
},
|
|
114
|
+
}, async (args) => {
|
|
115
|
+
try {
|
|
116
|
+
const result = await engine.query(args.query, args.entity_types, args.limit);
|
|
117
|
+
return toolResult(result);
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
if (e instanceof TwiningError) {
|
|
121
|
+
return toolError(e.message, e.code);
|
|
122
|
+
}
|
|
123
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=graph-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-tools.js","sourceRoot":"","sources":["../../src/tools/graph-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { BlackboardStore } from "../storage/blackboard-store.js";
|
|
3
|
+
import { DecisionStore } from "../storage/decision-store.js";
|
|
4
|
+
import type { GraphStore } from "../storage/graph-store.js";
|
|
5
|
+
import type { AgentStore } from "../storage/agent-store.js";
|
|
6
|
+
import type { Archiver } from "../engine/archiver.js";
|
|
7
|
+
import type { TwiningConfig } from "../utils/types.js";
|
|
8
|
+
export declare function registerLifecycleTools(server: McpServer, twiningDir: string, blackboardStore: BlackboardStore, decisionStore: DecisionStore, graphStore: GraphStore, archiver: Archiver, config: TwiningConfig, agentStore?: AgentStore | null): void;
|
|
9
|
+
//# sourceMappingURL=lifecycle-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-tools.d.ts","sourceRoot":"","sources":["../../src/tools/lifecycle-tools.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOvD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,aAAa,EACrB,UAAU,GAAE,UAAU,GAAG,IAAW,GACnC,IAAI,CAyLN"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool handlers for lifecycle operations.
|
|
3
|
+
* Registers twining_status (enhanced with graph counts and warnings) and twining_archive.
|
|
4
|
+
*/
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { BlackboardStore } from "../storage/blackboard-store.js";
|
|
8
|
+
import { DecisionStore } from "../storage/decision-store.js";
|
|
9
|
+
import { computeLiveness, DEFAULT_LIVENESS_THRESHOLDS, } from "../utils/liveness.js";
|
|
10
|
+
import { toolResult, toolError, TwiningError } from "../utils/errors.js";
|
|
11
|
+
export function registerLifecycleTools(server, twiningDir, blackboardStore, decisionStore, graphStore, archiver, config, agentStore = null) {
|
|
12
|
+
// twining_status — Overall health check of the Twining state
|
|
13
|
+
server.registerTool("twining_status", {
|
|
14
|
+
description: "Overall health check of the Twining state. Shows blackboard entry count, decision counts, graph entity/relation counts, actionable warnings, and a human-readable summary.",
|
|
15
|
+
}, async () => {
|
|
16
|
+
try {
|
|
17
|
+
// Get project name from parent directory
|
|
18
|
+
const projectRoot = path.dirname(twiningDir);
|
|
19
|
+
const project = path.basename(projectRoot);
|
|
20
|
+
// Count blackboard entries
|
|
21
|
+
const { total_count: blackboard_entries } = await blackboardStore.read();
|
|
22
|
+
// Count decisions by status
|
|
23
|
+
const index = await decisionStore.getIndex();
|
|
24
|
+
const active_decisions = index.filter((e) => e.status === "active").length;
|
|
25
|
+
const provisional_decisions = index.filter((e) => e.status === "provisional").length;
|
|
26
|
+
// Graph counts
|
|
27
|
+
const entities = await graphStore.getEntities();
|
|
28
|
+
const relations = await graphStore.getRelations();
|
|
29
|
+
const graph_entities = entities.length;
|
|
30
|
+
const graph_relations = relations.length;
|
|
31
|
+
// Find last activity timestamp
|
|
32
|
+
const recentEntries = await blackboardStore.recent(1);
|
|
33
|
+
const lastBBActivity = recentEntries.length > 0 ? recentEntries[0].timestamp : null;
|
|
34
|
+
const lastDecisionActivity = index.length > 0
|
|
35
|
+
? index.reduce((latest, e) => e.timestamp > latest ? e.timestamp : latest, index[0].timestamp)
|
|
36
|
+
: null;
|
|
37
|
+
let last_activity = "none";
|
|
38
|
+
if (lastBBActivity && lastDecisionActivity) {
|
|
39
|
+
last_activity =
|
|
40
|
+
lastBBActivity > lastDecisionActivity
|
|
41
|
+
? lastBBActivity
|
|
42
|
+
: lastDecisionActivity;
|
|
43
|
+
}
|
|
44
|
+
else if (lastBBActivity) {
|
|
45
|
+
last_activity = lastBBActivity;
|
|
46
|
+
}
|
|
47
|
+
else if (lastDecisionActivity) {
|
|
48
|
+
last_activity = lastDecisionActivity;
|
|
49
|
+
}
|
|
50
|
+
// Archiving threshold
|
|
51
|
+
const archiveThreshold = config.archive.max_blackboard_entries_before_archive;
|
|
52
|
+
const needs_archiving = blackboard_entries >= archiveThreshold;
|
|
53
|
+
// Actionable warnings
|
|
54
|
+
const warnings = [];
|
|
55
|
+
// Stale provisionals: older than 7 days
|
|
56
|
+
const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString();
|
|
57
|
+
const staleProvisionals = index.filter((e) => e.status === "provisional" && e.timestamp < sevenDaysAgo);
|
|
58
|
+
if (staleProvisionals.length > 0) {
|
|
59
|
+
warnings.push(`${staleProvisionals.length} provisional decisions older than 7 days need resolution`);
|
|
60
|
+
}
|
|
61
|
+
// Archive needed
|
|
62
|
+
if (needs_archiving) {
|
|
63
|
+
warnings.push(`Blackboard has ${blackboard_entries} entries, archive recommended (threshold: ${archiveThreshold})`);
|
|
64
|
+
}
|
|
65
|
+
// Orphan entities: entities with zero relations
|
|
66
|
+
if (graph_entities > 0) {
|
|
67
|
+
const entityIds = new Set(entities.map((e) => e.id));
|
|
68
|
+
const connectedIds = new Set();
|
|
69
|
+
for (const r of relations) {
|
|
70
|
+
connectedIds.add(r.source);
|
|
71
|
+
connectedIds.add(r.target);
|
|
72
|
+
}
|
|
73
|
+
const orphanCount = [...entityIds].filter((id) => !connectedIds.has(id)).length;
|
|
74
|
+
if (orphanCount > 0) {
|
|
75
|
+
warnings.push(`${orphanCount} graph entities have no relations`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Agent counts
|
|
79
|
+
let registered_agents = 0;
|
|
80
|
+
let active_agents = 0;
|
|
81
|
+
if (agentStore) {
|
|
82
|
+
const agents = await agentStore.getAll();
|
|
83
|
+
registered_agents = agents.length;
|
|
84
|
+
const thresholds = config.agents?.liveness ?? DEFAULT_LIVENESS_THRESHOLDS;
|
|
85
|
+
const now = new Date();
|
|
86
|
+
active_agents = agents.filter((a) => computeLiveness(a.last_active, now, thresholds) === "active").length;
|
|
87
|
+
}
|
|
88
|
+
// Build summary string
|
|
89
|
+
const healthStatus = warnings.length === 0 ? "Healthy" : "Needs attention";
|
|
90
|
+
const warningsSummary = warnings.length > 0 ? ` ${warnings.join(". ")}.` : "";
|
|
91
|
+
const agentSummary = ` ${registered_agents} registered agents (${active_agents} active).`;
|
|
92
|
+
const summary = `${healthStatus}. ${blackboard_entries} blackboard entries, ${active_decisions} active decisions, ${graph_entities} graph entities.${agentSummary}${warningsSummary}`;
|
|
93
|
+
return toolResult({
|
|
94
|
+
project,
|
|
95
|
+
blackboard_entries,
|
|
96
|
+
active_decisions,
|
|
97
|
+
provisional_decisions,
|
|
98
|
+
graph_entities,
|
|
99
|
+
graph_relations,
|
|
100
|
+
registered_agents,
|
|
101
|
+
active_agents,
|
|
102
|
+
last_activity,
|
|
103
|
+
needs_archiving,
|
|
104
|
+
warnings,
|
|
105
|
+
summary,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
// twining_archive — Archive old blackboard entries
|
|
113
|
+
server.registerTool("twining_archive", {
|
|
114
|
+
description: "Archive old blackboard entries. Moves entries older than a cutoff timestamp to an archive file, preserving decision entries. Optionally posts a summary finding.",
|
|
115
|
+
inputSchema: {
|
|
116
|
+
before: z
|
|
117
|
+
.string()
|
|
118
|
+
.optional()
|
|
119
|
+
.describe("ISO timestamp cutoff — archive entries before this time (default: now)"),
|
|
120
|
+
keep_decisions: z
|
|
121
|
+
.boolean()
|
|
122
|
+
.optional()
|
|
123
|
+
.describe("Whether to keep decision entries in the blackboard (default: true)"),
|
|
124
|
+
summarize: z
|
|
125
|
+
.boolean()
|
|
126
|
+
.optional()
|
|
127
|
+
.describe("Whether to post a summary finding after archiving (default: true)"),
|
|
128
|
+
},
|
|
129
|
+
}, async (args) => {
|
|
130
|
+
try {
|
|
131
|
+
const result = await archiver.archive(args);
|
|
132
|
+
return toolResult(result);
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
if (e instanceof TwiningError) {
|
|
136
|
+
return toolError(e.message, e.code);
|
|
137
|
+
}
|
|
138
|
+
return toolError(e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR");
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=lifecycle-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-tools.js","sourceRoot":"","sources":["../../src/tools/lifecycle-tools.ts"],"names":[],"mappings":"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"}
|