@opencodehub/mcp 0.1.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 +62 -0
- package/dist/analysis-bridge.d.ts +23 -0
- package/dist/analysis-bridge.d.ts.map +1 -0
- package/dist/analysis-bridge.js +83 -0
- package/dist/analysis-bridge.js.map +1 -0
- package/dist/connection-pool.d.ts +76 -0
- package/dist/connection-pool.d.ts.map +1 -0
- package/dist/connection-pool.js +179 -0
- package/dist/connection-pool.js.map +1 -0
- package/dist/error-envelope.d.ts +97 -0
- package/dist/error-envelope.d.ts.map +1 -0
- package/dist/error-envelope.js +75 -0
- package/dist/error-envelope.js.map +1 -0
- package/dist/group-resolver.d.ts +29 -0
- package/dist/group-resolver.d.ts.map +1 -0
- package/dist/group-resolver.js +100 -0
- package/dist/group-resolver.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/next-step-hints.d.ts +24 -0
- package/dist/next-step-hints.d.ts.map +1 -0
- package/dist/next-step-hints.js +41 -0
- package/dist/next-step-hints.js.map +1 -0
- package/dist/repo-resolver.d.ts +88 -0
- package/dist/repo-resolver.d.ts.map +1 -0
- package/dist/repo-resolver.js +211 -0
- package/dist/repo-resolver.js.map +1 -0
- package/dist/repo-uri-for-entry.d.ts +25 -0
- package/dist/repo-uri-for-entry.d.ts.map +1 -0
- package/dist/repo-uri-for-entry.js +64 -0
- package/dist/repo-uri-for-entry.js.map +1 -0
- package/dist/resources/repo-cluster.d.ts +19 -0
- package/dist/resources/repo-cluster.d.ts.map +1 -0
- package/dist/resources/repo-cluster.js +203 -0
- package/dist/resources/repo-cluster.js.map +1 -0
- package/dist/resources/repo-clusters.d.ts +14 -0
- package/dist/resources/repo-clusters.d.ts.map +1 -0
- package/dist/resources/repo-clusters.js +97 -0
- package/dist/resources/repo-clusters.js.map +1 -0
- package/dist/resources/repo-context.d.ts +12 -0
- package/dist/resources/repo-context.d.ts.map +1 -0
- package/dist/resources/repo-context.js +84 -0
- package/dist/resources/repo-context.js.map +1 -0
- package/dist/resources/repo-process.d.ts +19 -0
- package/dist/resources/repo-process.d.ts.map +1 -0
- package/dist/resources/repo-process.js +220 -0
- package/dist/resources/repo-process.js.map +1 -0
- package/dist/resources/repo-processes.d.ts +13 -0
- package/dist/resources/repo-processes.d.ts.map +1 -0
- package/dist/resources/repo-processes.js +99 -0
- package/dist/resources/repo-processes.js.map +1 -0
- package/dist/resources/repo-schema.d.ts +13 -0
- package/dist/resources/repo-schema.d.ts.map +1 -0
- package/dist/resources/repo-schema.js +99 -0
- package/dist/resources/repo-schema.js.map +1 -0
- package/dist/resources/repos.d.ts +20 -0
- package/dist/resources/repos.d.ts.map +1 -0
- package/dist/resources/repos.js +58 -0
- package/dist/resources/repos.js.map +1 -0
- package/dist/resources/store-helper.d.ts +28 -0
- package/dist/resources/store-helper.d.ts.map +1 -0
- package/dist/resources/store-helper.js +58 -0
- package/dist/resources/store-helper.js.map +1 -0
- package/dist/resources/yaml.d.ts +10 -0
- package/dist/resources/yaml.d.ts.map +1 -0
- package/dist/resources/yaml.js +16 -0
- package/dist/resources/yaml.js.map +1 -0
- package/dist/server.d.ts +46 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +194 -0
- package/dist/server.js.map +1 -0
- package/dist/staleness.d.ts +19 -0
- package/dist/staleness.d.ts.map +1 -0
- package/dist/staleness.js +40 -0
- package/dist/staleness.js.map +1 -0
- package/dist/test-utils.d.ts +170 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +473 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/tools/api-impact.d.ts +47 -0
- package/dist/tools/api-impact.d.ts.map +1 -0
- package/dist/tools/api-impact.js +199 -0
- package/dist/tools/api-impact.js.map +1 -0
- package/dist/tools/confidence.d.ts +39 -0
- package/dist/tools/confidence.d.ts.map +1 -0
- package/dist/tools/confidence.js +58 -0
- package/dist/tools/confidence.js.map +1 -0
- package/dist/tools/context.d.ts +47 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +577 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/dependencies.d.ts +29 -0
- package/dist/tools/dependencies.d.ts.map +1 -0
- package/dist/tools/dependencies.js +110 -0
- package/dist/tools/dependencies.js.map +1 -0
- package/dist/tools/detect-changes.d.ts +15 -0
- package/dist/tools/detect-changes.d.ts.map +1 -0
- package/dist/tools/detect-changes.js +78 -0
- package/dist/tools/detect-changes.js.map +1 -0
- package/dist/tools/group-contracts.d.ts +26 -0
- package/dist/tools/group-contracts.d.ts.map +1 -0
- package/dist/tools/group-contracts.js +251 -0
- package/dist/tools/group-contracts.js.map +1 -0
- package/dist/tools/group-cross-repo-links.d.ts +28 -0
- package/dist/tools/group-cross-repo-links.d.ts.map +1 -0
- package/dist/tools/group-cross-repo-links.js +128 -0
- package/dist/tools/group-cross-repo-links.js.map +1 -0
- package/dist/tools/group-list.d.ts +10 -0
- package/dist/tools/group-list.d.ts.map +1 -0
- package/dist/tools/group-list.js +74 -0
- package/dist/tools/group-list.js.map +1 -0
- package/dist/tools/group-query.d.ts +40 -0
- package/dist/tools/group-query.d.ts.map +1 -0
- package/dist/tools/group-query.js +209 -0
- package/dist/tools/group-query.js.map +1 -0
- package/dist/tools/group-status.d.ts +21 -0
- package/dist/tools/group-status.d.ts.map +1 -0
- package/dist/tools/group-status.js +121 -0
- package/dist/tools/group-status.js.map +1 -0
- package/dist/tools/group-sync.d.ts +23 -0
- package/dist/tools/group-sync.d.ts.map +1 -0
- package/dist/tools/group-sync.js +112 -0
- package/dist/tools/group-sync.js.map +1 -0
- package/dist/tools/impact.d.ts +36 -0
- package/dist/tools/impact.d.ts.map +1 -0
- package/dist/tools/impact.js +232 -0
- package/dist/tools/impact.js.map +1 -0
- package/dist/tools/license-audit.d.ts +34 -0
- package/dist/tools/license-audit.d.ts.map +1 -0
- package/dist/tools/license-audit.js +108 -0
- package/dist/tools/license-audit.js.map +1 -0
- package/dist/tools/list-dead-code.d.ts +26 -0
- package/dist/tools/list-dead-code.d.ts.map +1 -0
- package/dist/tools/list-dead-code.js +110 -0
- package/dist/tools/list-dead-code.js.map +1 -0
- package/dist/tools/list-findings-delta.d.ts +36 -0
- package/dist/tools/list-findings-delta.d.ts.map +1 -0
- package/dist/tools/list-findings-delta.js +274 -0
- package/dist/tools/list-findings-delta.js.map +1 -0
- package/dist/tools/list-findings.d.ts +30 -0
- package/dist/tools/list-findings.d.ts.map +1 -0
- package/dist/tools/list-findings.js +129 -0
- package/dist/tools/list-findings.js.map +1 -0
- package/dist/tools/list-repos.d.ts +17 -0
- package/dist/tools/list-repos.d.ts.map +1 -0
- package/dist/tools/list-repos.js +63 -0
- package/dist/tools/list-repos.js.map +1 -0
- package/dist/tools/owners.d.ts +23 -0
- package/dist/tools/owners.d.ts.map +1 -0
- package/dist/tools/owners.js +103 -0
- package/dist/tools/owners.js.map +1 -0
- package/dist/tools/pack-codebase.d.ts +76 -0
- package/dist/tools/pack-codebase.d.ts.map +1 -0
- package/dist/tools/pack-codebase.js +289 -0
- package/dist/tools/pack-codebase.js.map +1 -0
- package/dist/tools/project-profile.d.ts +28 -0
- package/dist/tools/project-profile.d.ts.map +1 -0
- package/dist/tools/project-profile.js +109 -0
- package/dist/tools/project-profile.js.map +1 -0
- package/dist/tools/query.d.ts +63 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +662 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/tools/remove-dead-code.d.ts +47 -0
- package/dist/tools/remove-dead-code.d.ts.map +1 -0
- package/dist/tools/remove-dead-code.js +258 -0
- package/dist/tools/remove-dead-code.js.map +1 -0
- package/dist/tools/rename.d.ts +21 -0
- package/dist/tools/rename.d.ts.map +1 -0
- package/dist/tools/rename.js +116 -0
- package/dist/tools/rename.js.map +1 -0
- package/dist/tools/risk-trends.d.ts +19 -0
- package/dist/tools/risk-trends.d.ts.map +1 -0
- package/dist/tools/risk-trends.js +73 -0
- package/dist/tools/risk-trends.js.map +1 -0
- package/dist/tools/route-map.d.ts +27 -0
- package/dist/tools/route-map.d.ts.map +1 -0
- package/dist/tools/route-map.js +119 -0
- package/dist/tools/route-map.js.map +1 -0
- package/dist/tools/scan.d.ts +27 -0
- package/dist/tools/scan.d.ts.map +1 -0
- package/dist/tools/scan.js +136 -0
- package/dist/tools/scan.js.map +1 -0
- package/dist/tools/shape-check.d.ts +53 -0
- package/dist/tools/shape-check.d.ts.map +1 -0
- package/dist/tools/shape-check.js +161 -0
- package/dist/tools/shape-check.js.map +1 -0
- package/dist/tools/shared.d.ts +101 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +114 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/tools/signature.d.ts +38 -0
- package/dist/tools/signature.d.ts.map +1 -0
- package/dist/tools/signature.js +332 -0
- package/dist/tools/signature.js.map +1 -0
- package/dist/tools/sql.d.ts +34 -0
- package/dist/tools/sql.d.ts.map +1 -0
- package/dist/tools/sql.js +222 -0
- package/dist/tools/sql.js.map +1 -0
- package/dist/tools/tool-map.d.ts +24 -0
- package/dist/tools/tool-map.d.ts.map +1 -0
- package/dist/tools/tool-map.js +97 -0
- package/dist/tools/tool-map.js.map +1 -0
- package/dist/tools/verdict.d.ts +33 -0
- package/dist/tools/verdict.d.ts.map +1 -0
- package/dist/tools/verdict.js +102 -0
- package/dist/tools/verdict.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource template `codehub://repo/{name}/process/{processName}` — process trace.
|
|
3
|
+
*
|
|
4
|
+
* Resolves `processName` against the Process node's `name` first (the
|
|
5
|
+
* synthesised `<entry>-flow` token), then its `inferredLabel` as a
|
|
6
|
+
* fallback. The ordered trace walks PROCESS_STEP edges starting from
|
|
7
|
+
* the entry point (step 0) through every BFS-reached symbol. Unknown
|
|
8
|
+
* names produce a `{error, candidates}` envelope listing up to 5 close
|
|
9
|
+
* matches.
|
|
10
|
+
*
|
|
11
|
+
* PROCESS_STEP edges live between callable symbols (not between the
|
|
12
|
+
* Process node and its members). The entry point itself is the
|
|
13
|
+
* `from_id` of the first step emitted by the phase; we surface it as
|
|
14
|
+
* step 0 with its own row so the trace is usable standalone.
|
|
15
|
+
*/
|
|
16
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
17
|
+
import { readRegistry } from "../repo-resolver.js";
|
|
18
|
+
import { rankCandidates } from "./repo-cluster.js";
|
|
19
|
+
import { withResourceStore } from "./store-helper.js";
|
|
20
|
+
import { yamlScalar } from "./yaml.js";
|
|
21
|
+
const PATTERN = "codehub://repo/{name}/process/{processName}";
|
|
22
|
+
const CANDIDATES_CAP = 5;
|
|
23
|
+
export function registerRepoProcessResource(server, ctx) {
|
|
24
|
+
const template = new ResourceTemplate(PATTERN, {
|
|
25
|
+
list: async () => {
|
|
26
|
+
const opts = ctx.home !== undefined ? { home: ctx.home } : {};
|
|
27
|
+
const reg = await readRegistry(opts);
|
|
28
|
+
return {
|
|
29
|
+
resources: Object.keys(reg)
|
|
30
|
+
.sort()
|
|
31
|
+
.map((name) => ({
|
|
32
|
+
name: `${name}/process/{processName}`,
|
|
33
|
+
uri: `codehub://repo/${encodeURIComponent(name)}/process/{processName}`,
|
|
34
|
+
mimeType: "text/yaml",
|
|
35
|
+
description: `Ordered PROCESS_STEP trace for a named process in repo ${name}`,
|
|
36
|
+
})),
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
server.registerResource("repo-process", template, {
|
|
41
|
+
title: "Repo process trace",
|
|
42
|
+
description: "YAML ordered PROCESS_STEP trace for a named process (entry point first; step ASC).",
|
|
43
|
+
mimeType: "text/yaml",
|
|
44
|
+
}, async (uri, variables) => {
|
|
45
|
+
const nameRaw = variables["name"];
|
|
46
|
+
const processRaw = variables["processName"];
|
|
47
|
+
const nameVar = Array.isArray(nameRaw) ? nameRaw[0] : nameRaw;
|
|
48
|
+
const processVar = Array.isArray(processRaw) ? processRaw[0] : processRaw;
|
|
49
|
+
const repoName = nameVar ? decodeURIComponent(String(nameVar)) : undefined;
|
|
50
|
+
const processName = processVar ? decodeURIComponent(String(processVar)) : "";
|
|
51
|
+
const resourceOpts = {};
|
|
52
|
+
if (ctx.home !== undefined)
|
|
53
|
+
resourceOpts.home = ctx.home;
|
|
54
|
+
if (ctx.pool !== undefined)
|
|
55
|
+
resourceOpts.pool = ctx.pool;
|
|
56
|
+
return withResourceStore(uri.href, repoName, resourceOpts, async (store, resolvedRepo) => {
|
|
57
|
+
const graph = store.graph;
|
|
58
|
+
const processes = (await graph.listNodesByKind("Process"));
|
|
59
|
+
const hit = processes.find((p) => p.name === processName || p.inferredLabel === processName);
|
|
60
|
+
if (hit === undefined) {
|
|
61
|
+
return buildNotFound(uri.href, resolvedRepo, processName, processes);
|
|
62
|
+
}
|
|
63
|
+
const processId = hit.id;
|
|
64
|
+
const processRowName = hit.name;
|
|
65
|
+
const processLabel = typeof hit.inferredLabel === "string" && hit.inferredLabel.length > 0
|
|
66
|
+
? hit.inferredLabel
|
|
67
|
+
: null;
|
|
68
|
+
const entryPointId = typeof hit.entryPointId === "string" && hit.entryPointId.length > 0
|
|
69
|
+
? hit.entryPointId
|
|
70
|
+
: null;
|
|
71
|
+
const processFilePath = hit.filePath;
|
|
72
|
+
const traceRows = entryPointId ? await walkProcessTrace(graph, entryPointId) : [];
|
|
73
|
+
const lines = [];
|
|
74
|
+
lines.push(`repo: ${yamlScalar(resolvedRepo)}`);
|
|
75
|
+
lines.push("process:");
|
|
76
|
+
lines.push(` id: ${yamlScalar(processId)}`);
|
|
77
|
+
lines.push(` name: ${yamlScalar(processRowName)}`);
|
|
78
|
+
if (processLabel) {
|
|
79
|
+
lines.push(` label: ${yamlScalar(processLabel)}`);
|
|
80
|
+
}
|
|
81
|
+
lines.push(` processType: flow`);
|
|
82
|
+
if (entryPointId) {
|
|
83
|
+
lines.push(` entryPointId: ${yamlScalar(entryPointId)}`);
|
|
84
|
+
}
|
|
85
|
+
if (processFilePath) {
|
|
86
|
+
lines.push(` filePath: ${yamlScalar(processFilePath)}`);
|
|
87
|
+
}
|
|
88
|
+
lines.push("trace:");
|
|
89
|
+
if (traceRows.length === 0) {
|
|
90
|
+
lines.push(" []");
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
for (const row of traceRows) {
|
|
94
|
+
lines.push(` - step: ${row.step}`);
|
|
95
|
+
lines.push(` id: ${yamlScalar(row.id)}`);
|
|
96
|
+
lines.push(` name: ${yamlScalar(row.name)}`);
|
|
97
|
+
lines.push(` kind: ${yamlScalar(row.kind)}`);
|
|
98
|
+
lines.push(` filePath: ${yamlScalar(row.filePath)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
contents: [
|
|
103
|
+
{
|
|
104
|
+
uri: uri.href,
|
|
105
|
+
mimeType: "text/yaml",
|
|
106
|
+
text: `${lines.join("\n")}\n`,
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Walk PROCESS_STEP edges rooted at `entryPointId` and return an ordered
|
|
115
|
+
* (step ASC) list of participating symbols. The entry point itself is
|
|
116
|
+
* surfaced as step 0; PROCESS_STEP rows populate the subsequent steps.
|
|
117
|
+
*/
|
|
118
|
+
async function walkProcessTrace(graph, entryPointId) {
|
|
119
|
+
// Snapshot all nodes once for partner metadata lookup.
|
|
120
|
+
const allNodes = await graph.listNodes();
|
|
121
|
+
const byId = new Map();
|
|
122
|
+
for (const n of allNodes)
|
|
123
|
+
byId.set(n.id, n);
|
|
124
|
+
const allEdges = await graph.listEdgesByType("PROCESS_STEP");
|
|
125
|
+
const adj = new Map();
|
|
126
|
+
for (const e of allEdges) {
|
|
127
|
+
const list = adj.get(e.from) ?? [];
|
|
128
|
+
list.push({ toId: e.to, step: e.step ?? 0 });
|
|
129
|
+
adj.set(e.from, list);
|
|
130
|
+
}
|
|
131
|
+
for (const list of adj.values()) {
|
|
132
|
+
list.sort((a, b) => {
|
|
133
|
+
if (a.step !== b.step)
|
|
134
|
+
return a.step - b.step;
|
|
135
|
+
return a.toId < b.toId ? -1 : a.toId > b.toId ? 1 : 0;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const out = [];
|
|
139
|
+
const seen = new Set();
|
|
140
|
+
const entryNode = byId.get(entryPointId);
|
|
141
|
+
if (entryNode !== undefined) {
|
|
142
|
+
out.push({
|
|
143
|
+
step: 0,
|
|
144
|
+
id: entryNode.id,
|
|
145
|
+
name: entryNode.name,
|
|
146
|
+
kind: entryNode.kind,
|
|
147
|
+
filePath: entryNode.filePath,
|
|
148
|
+
});
|
|
149
|
+
seen.add(entryNode.id);
|
|
150
|
+
}
|
|
151
|
+
const queue = [entryPointId];
|
|
152
|
+
let guard = 0;
|
|
153
|
+
while (queue.length > 0 && guard < 100) {
|
|
154
|
+
guard += 1;
|
|
155
|
+
const current = queue.shift();
|
|
156
|
+
const outgoing = adj.get(current) ?? [];
|
|
157
|
+
for (const e of outgoing) {
|
|
158
|
+
if (seen.has(e.toId))
|
|
159
|
+
continue;
|
|
160
|
+
seen.add(e.toId);
|
|
161
|
+
const partner = byId.get(e.toId);
|
|
162
|
+
out.push({
|
|
163
|
+
step: e.step,
|
|
164
|
+
id: e.toId,
|
|
165
|
+
name: partner?.name ?? "",
|
|
166
|
+
kind: partner?.kind ?? "",
|
|
167
|
+
filePath: partner?.filePath ?? "",
|
|
168
|
+
});
|
|
169
|
+
queue.push(e.toId);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
out.sort((a, b) => {
|
|
173
|
+
if (a.step !== b.step)
|
|
174
|
+
return a.step - b.step;
|
|
175
|
+
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
176
|
+
});
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
async function buildNotFound(uri, repoName, processName, processes) {
|
|
180
|
+
const ordered = [...processes].sort((a, b) => {
|
|
181
|
+
const ac = a.stepCount ?? 0;
|
|
182
|
+
const bc = b.stepCount ?? 0;
|
|
183
|
+
if (ac !== bc)
|
|
184
|
+
return bc - ac;
|
|
185
|
+
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
186
|
+
});
|
|
187
|
+
const candidates = rankCandidates(processName, ordered.flatMap((p) => {
|
|
188
|
+
const out = [];
|
|
189
|
+
const n = typeof p.name === "string" ? p.name : null;
|
|
190
|
+
const l = typeof p.inferredLabel === "string" ? p.inferredLabel : null;
|
|
191
|
+
if (n)
|
|
192
|
+
out.push(n);
|
|
193
|
+
if (l && l !== n)
|
|
194
|
+
out.push(l);
|
|
195
|
+
return out;
|
|
196
|
+
})).slice(0, CANDIDATES_CAP);
|
|
197
|
+
const lines = [];
|
|
198
|
+
lines.push(`repo: ${yamlScalar(repoName)}`);
|
|
199
|
+
lines.push(`process: ${yamlScalar(processName)}`);
|
|
200
|
+
lines.push('error: "not found"');
|
|
201
|
+
lines.push("candidates:");
|
|
202
|
+
if (candidates.length === 0) {
|
|
203
|
+
lines.push(" []");
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
for (const c of candidates) {
|
|
207
|
+
lines.push(` - ${yamlScalar(c)}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
contents: [
|
|
212
|
+
{
|
|
213
|
+
uri,
|
|
214
|
+
mimeType: "text/yaml",
|
|
215
|
+
text: `${lines.join("\n")}\n`,
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=repo-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-process.js","sourceRoot":"","sources":["../../src/resources/repo-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource template `codehub://repo/{name}/processes` — list process flows.
|
|
3
|
+
*
|
|
4
|
+
* Each row is a `Process` node emitted by the processes phase (BFS from
|
|
5
|
+
* scored entry points). Ranked by `stepCount DESC` so the longest /
|
|
6
|
+
* most consequential flows surface first; capped at 20. `processType`
|
|
7
|
+
* is always `"flow"` today; the field is kept shape-stable so future
|
|
8
|
+
* process flavours (route flows, tool flows) don't force a rev.
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
import type { ResourceContext } from "./repos.js";
|
|
12
|
+
export declare function registerRepoProcessesResource(server: McpServer, ctx: ResourceContext): void;
|
|
13
|
+
//# sourceMappingURL=repo-processes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-processes.d.ts","sourceRoot":"","sources":["../../src/resources/repo-processes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOlD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI,CAuF3F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource template `codehub://repo/{name}/processes` — list process flows.
|
|
3
|
+
*
|
|
4
|
+
* Each row is a `Process` node emitted by the processes phase (BFS from
|
|
5
|
+
* scored entry points). Ranked by `stepCount DESC` so the longest /
|
|
6
|
+
* most consequential flows surface first; capped at 20. `processType`
|
|
7
|
+
* is always `"flow"` today; the field is kept shape-stable so future
|
|
8
|
+
* process flavours (route flows, tool flows) don't force a rev.
|
|
9
|
+
*/
|
|
10
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
import { readRegistry } from "../repo-resolver.js";
|
|
12
|
+
import { withResourceStore } from "./store-helper.js";
|
|
13
|
+
import { yamlScalar } from "./yaml.js";
|
|
14
|
+
const PATTERN = "codehub://repo/{name}/processes";
|
|
15
|
+
const RESULT_CAP = 20;
|
|
16
|
+
export function registerRepoProcessesResource(server, ctx) {
|
|
17
|
+
const template = new ResourceTemplate(PATTERN, {
|
|
18
|
+
list: async () => {
|
|
19
|
+
const opts = ctx.home !== undefined ? { home: ctx.home } : {};
|
|
20
|
+
const reg = await readRegistry(opts);
|
|
21
|
+
return {
|
|
22
|
+
resources: Object.keys(reg)
|
|
23
|
+
.sort()
|
|
24
|
+
.map((name) => ({
|
|
25
|
+
name: `${name}/processes`,
|
|
26
|
+
uri: `codehub://repo/${encodeURIComponent(name)}/processes`,
|
|
27
|
+
mimeType: "text/yaml",
|
|
28
|
+
description: `Process flows for repo ${name}`,
|
|
29
|
+
})),
|
|
30
|
+
};
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
server.registerResource("repo-processes", template, {
|
|
34
|
+
title: "Repo processes",
|
|
35
|
+
description: "YAML list of Process nodes (BFS flows) ranked by stepCount. Cap 20.",
|
|
36
|
+
mimeType: "text/yaml",
|
|
37
|
+
}, async (uri, variables) => {
|
|
38
|
+
const raw = variables["name"];
|
|
39
|
+
const nameVar = Array.isArray(raw) ? raw[0] : raw;
|
|
40
|
+
const decoded = nameVar ? decodeURIComponent(String(nameVar)) : undefined;
|
|
41
|
+
const resourceOpts = {};
|
|
42
|
+
if (ctx.home !== undefined)
|
|
43
|
+
resourceOpts.home = ctx.home;
|
|
44
|
+
if (ctx.pool !== undefined)
|
|
45
|
+
resourceOpts.pool = ctx.pool;
|
|
46
|
+
return withResourceStore(uri.href, decoded, resourceOpts, async (store, repoName) => {
|
|
47
|
+
const processes = (await store.graph.listNodesByKind("Process"));
|
|
48
|
+
const rows = [...processes]
|
|
49
|
+
.sort((a, b) => {
|
|
50
|
+
const ac = a.stepCount ?? 0;
|
|
51
|
+
const bc = b.stepCount ?? 0;
|
|
52
|
+
if (ac !== bc)
|
|
53
|
+
return bc - ac;
|
|
54
|
+
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
55
|
+
})
|
|
56
|
+
.slice(0, RESULT_CAP);
|
|
57
|
+
const lines = [];
|
|
58
|
+
lines.push(`repo: ${yamlScalar(repoName)}`);
|
|
59
|
+
lines.push("processes:");
|
|
60
|
+
if (rows.length === 0) {
|
|
61
|
+
lines.push(" []");
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
for (const p of rows) {
|
|
65
|
+
const label = typeof p.inferredLabel === "string" && p.inferredLabel.length > 0
|
|
66
|
+
? p.inferredLabel
|
|
67
|
+
: null;
|
|
68
|
+
const stepCount = p.stepCount ?? 0;
|
|
69
|
+
const entryPointId = typeof p.entryPointId === "string" && p.entryPointId.length > 0
|
|
70
|
+
? p.entryPointId
|
|
71
|
+
: null;
|
|
72
|
+
lines.push(` - id: ${yamlScalar(p.id)}`);
|
|
73
|
+
lines.push(` name: ${yamlScalar(p.name)}`);
|
|
74
|
+
if (label) {
|
|
75
|
+
lines.push(` label: ${yamlScalar(label)}`);
|
|
76
|
+
}
|
|
77
|
+
lines.push(` processType: flow`);
|
|
78
|
+
lines.push(` stepCount: ${stepCount}`);
|
|
79
|
+
if (entryPointId) {
|
|
80
|
+
lines.push(` entryPointId: ${yamlScalar(entryPointId)}`);
|
|
81
|
+
}
|
|
82
|
+
if (p.filePath && p.filePath.length > 0) {
|
|
83
|
+
lines.push(` filePath: ${yamlScalar(p.filePath)}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
contents: [
|
|
89
|
+
{
|
|
90
|
+
uri: uri.href,
|
|
91
|
+
mimeType: "text/yaml",
|
|
92
|
+
text: `${lines.join("\n")}\n`,
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=repo-processes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-processes.js","sourceRoot":"","sources":["../../src/resources/repo-processes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource template `codehub://repo/{name}/schema` — node/edge vocabulary.
|
|
3
|
+
*
|
|
4
|
+
* Exposed as YAML so agents can author SQL (or reason about graph
|
|
5
|
+
* structure) without having to call `sql` with introspective queries.
|
|
6
|
+
* The payload is static — it reflects the compile-time vocabulary, not
|
|
7
|
+
* anything runtime-discovered — which is fine because every indexed
|
|
8
|
+
* repo shares the same schema version at MVP.
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
import type { ResourceContext } from "./repos.js";
|
|
12
|
+
export declare function registerRepoSchemaResource(server: McpServer, ctx: ResourceContext): void;
|
|
13
|
+
//# sourceMappingURL=repo-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-schema.d.ts","sourceRoot":"","sources":["../../src/resources/repo-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA2ClD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI,CAiDxF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource template `codehub://repo/{name}/schema` — node/edge vocabulary.
|
|
3
|
+
*
|
|
4
|
+
* Exposed as YAML so agents can author SQL (or reason about graph
|
|
5
|
+
* structure) without having to call `sql` with introspective queries.
|
|
6
|
+
* The payload is static — it reflects the compile-time vocabulary, not
|
|
7
|
+
* anything runtime-discovered — which is fine because every indexed
|
|
8
|
+
* repo shares the same schema version at MVP.
|
|
9
|
+
*/
|
|
10
|
+
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
11
|
+
import { NODE_KINDS, RELATION_TYPES, SCHEMA_VERSION } from "@opencodehub/core-types";
|
|
12
|
+
import { readRegistry } from "../repo-resolver.js";
|
|
13
|
+
const PATTERN = "codehub://repo/{name}/schema";
|
|
14
|
+
const NODE_COLUMNS = [
|
|
15
|
+
"id",
|
|
16
|
+
"kind",
|
|
17
|
+
"name",
|
|
18
|
+
"file_path",
|
|
19
|
+
"start_line",
|
|
20
|
+
"end_line",
|
|
21
|
+
"is_exported",
|
|
22
|
+
"signature",
|
|
23
|
+
"parameter_count",
|
|
24
|
+
"return_type",
|
|
25
|
+
"declared_type",
|
|
26
|
+
"owner",
|
|
27
|
+
"url",
|
|
28
|
+
"method",
|
|
29
|
+
"tool_name",
|
|
30
|
+
"content",
|
|
31
|
+
"content_hash",
|
|
32
|
+
"inferred_label",
|
|
33
|
+
"symbol_count",
|
|
34
|
+
"cohesion",
|
|
35
|
+
"keywords",
|
|
36
|
+
"entry_point_id",
|
|
37
|
+
"step_count",
|
|
38
|
+
"level",
|
|
39
|
+
"response_keys",
|
|
40
|
+
"description",
|
|
41
|
+
];
|
|
42
|
+
const RELATION_COLUMNS = [
|
|
43
|
+
"id",
|
|
44
|
+
"from_id",
|
|
45
|
+
"to_id",
|
|
46
|
+
"type",
|
|
47
|
+
"confidence",
|
|
48
|
+
"reason",
|
|
49
|
+
"step",
|
|
50
|
+
];
|
|
51
|
+
export function registerRepoSchemaResource(server, ctx) {
|
|
52
|
+
const template = new ResourceTemplate(PATTERN, {
|
|
53
|
+
list: async () => {
|
|
54
|
+
const opts = ctx.home !== undefined ? { home: ctx.home } : {};
|
|
55
|
+
const reg = await readRegistry(opts);
|
|
56
|
+
return {
|
|
57
|
+
resources: Object.keys(reg)
|
|
58
|
+
.sort()
|
|
59
|
+
.map((name) => ({
|
|
60
|
+
name: `${name}/schema`,
|
|
61
|
+
uri: `codehub://repo/${encodeURIComponent(name)}/schema`,
|
|
62
|
+
mimeType: "text/yaml",
|
|
63
|
+
description: `Graph schema for repo ${name}`,
|
|
64
|
+
})),
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
server.registerResource("repo-schema", template, {
|
|
69
|
+
title: "Graph schema",
|
|
70
|
+
description: "YAML listing every NodeKind and RelationType with the table columns agents can filter on when authoring `sql` queries.",
|
|
71
|
+
mimeType: "text/yaml",
|
|
72
|
+
}, async (uri) => {
|
|
73
|
+
const lines = [];
|
|
74
|
+
lines.push(`schemaVersion: ${SCHEMA_VERSION}`);
|
|
75
|
+
lines.push("tables:");
|
|
76
|
+
lines.push(" nodes:");
|
|
77
|
+
for (const c of NODE_COLUMNS)
|
|
78
|
+
lines.push(` - ${c}`);
|
|
79
|
+
lines.push(" relations:");
|
|
80
|
+
for (const c of RELATION_COLUMNS)
|
|
81
|
+
lines.push(` - ${c}`);
|
|
82
|
+
lines.push("nodeKinds:");
|
|
83
|
+
for (const k of NODE_KINDS)
|
|
84
|
+
lines.push(` - ${k}`);
|
|
85
|
+
lines.push("relationTypes:");
|
|
86
|
+
for (const t of RELATION_TYPES)
|
|
87
|
+
lines.push(` - ${t}`);
|
|
88
|
+
return {
|
|
89
|
+
contents: [
|
|
90
|
+
{
|
|
91
|
+
uri: uri.href,
|
|
92
|
+
mimeType: "text/yaml",
|
|
93
|
+
text: `${lines.join("\n")}\n`,
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=repo-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-schema.js","sourceRoot":"","sources":["../../src/resources/repo-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource `codehub://repos` — lists every registered repo with stats.
|
|
3
|
+
*
|
|
4
|
+
* The payload is YAML for readability (agents tend to handle YAML well in
|
|
5
|
+
* resources that they render in their own context) and because it is
|
|
6
|
+
* what the `codehub://repo/{name}/context` resource also emits.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
|
+
import type { ConnectionPool } from "../connection-pool.js";
|
|
10
|
+
export interface ResourceContext {
|
|
11
|
+
readonly home?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Connection pool used by data-reading resource handlers (clusters,
|
|
14
|
+
* processes). `repos`, `repo-context`, and `repo-schema` don't need it
|
|
15
|
+
* because they only read the registry and static schema vocabulary.
|
|
16
|
+
*/
|
|
17
|
+
readonly pool?: ConnectionPool;
|
|
18
|
+
}
|
|
19
|
+
export declare function registerReposResource(server: McpServer, ctx: ResourceContext): void;
|
|
20
|
+
//# sourceMappingURL=repos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repos.d.ts","sourceRoot":"","sources":["../../src/resources/repos.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;CAChC;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI,CAwCnF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource `codehub://repos` — lists every registered repo with stats.
|
|
3
|
+
*
|
|
4
|
+
* The payload is YAML for readability (agents tend to handle YAML well in
|
|
5
|
+
* resources that they render in their own context) and because it is
|
|
6
|
+
* what the `codehub://repo/{name}/context` resource also emits.
|
|
7
|
+
*/
|
|
8
|
+
import { readRegistry } from "../repo-resolver.js";
|
|
9
|
+
const URI = "codehub://repos";
|
|
10
|
+
export function registerReposResource(server, ctx) {
|
|
11
|
+
server.registerResource("repos", URI, {
|
|
12
|
+
title: "Indexed repos",
|
|
13
|
+
description: "YAML listing of every repo registered under ~/.codehub/registry.json with name, path, and stats.",
|
|
14
|
+
mimeType: "text/yaml",
|
|
15
|
+
}, async (uri) => {
|
|
16
|
+
const opts = ctx.home !== undefined ? { home: ctx.home } : {};
|
|
17
|
+
const reg = await readRegistry(opts);
|
|
18
|
+
const names = Object.keys(reg).sort();
|
|
19
|
+
const lines = ["repos:"];
|
|
20
|
+
if (names.length === 0) {
|
|
21
|
+
lines.push(" []");
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
for (const name of names) {
|
|
25
|
+
const e = reg[name];
|
|
26
|
+
if (!e)
|
|
27
|
+
continue;
|
|
28
|
+
lines.push(` - name: ${yaml(name)}`);
|
|
29
|
+
lines.push(` path: ${yaml(e.path)}`);
|
|
30
|
+
lines.push(` indexedAt: ${yaml(e.indexedAt)}`);
|
|
31
|
+
if (e.lastCommit)
|
|
32
|
+
lines.push(` lastCommit: ${yaml(e.lastCommit)}`);
|
|
33
|
+
lines.push(` nodeCount: ${e.nodeCount}`);
|
|
34
|
+
lines.push(` edgeCount: ${e.edgeCount}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
contents: [
|
|
39
|
+
{
|
|
40
|
+
uri: uri.href,
|
|
41
|
+
mimeType: "text/yaml",
|
|
42
|
+
text: `${lines.join("\n")}\n`,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function yaml(value) {
|
|
49
|
+
// Very small YAML scalar quoter: wrap in double quotes if the value
|
|
50
|
+
// contains characters that would confuse a loose YAML parser.
|
|
51
|
+
if (/^[A-Za-z0-9._\-/]+$/.test(value))
|
|
52
|
+
return value;
|
|
53
|
+
// Escape `\` first so a literal `\` in the value cannot pair with the
|
|
54
|
+
// following `"` to form an unintended `\"` escape sequence in the
|
|
55
|
+
// emitted YAML scalar (js/incomplete-sanitization).
|
|
56
|
+
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=repos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repos.js","sourceRoot":"","sources":["../../src/resources/repos.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAYnD,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAE9B,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,GAAoB;IAC3E,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,GAAG,EACH;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,kGAAkG;QACpG,QAAQ,EAAE,WAAW;KACtB,EACD,KAAK,EAAE,GAAG,EAA+B,EAAE;QACzC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAa,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpB,IAAI,CAAC,CAAC;oBAAE,SAAS;gBACjB,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBAClD,IAAI,CAAC,CAAC,UAAU;oBAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACtE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,WAAW;oBACrB,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;iBAC9B;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,oEAAoE;IACpE,8DAA8D;IAC9D,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,sEAAsE;IACtE,kEAAkE;IAClE,oDAAoD;IACpD,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared repo-resolution + store-checkout helper for resource handlers.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the tool-side `withStore` but returns shape appropriate for
|
|
5
|
+
* resources: instead of `CallToolResult`, resource callbacks return
|
|
6
|
+
* `ReadResourceResult`, which carries a plain text body. Errors
|
|
7
|
+
* (missing pool, repo not found, DuckDB open failure) are surfaced as a
|
|
8
|
+
* YAML error envelope inside the resource body so the agent sees the
|
|
9
|
+
* problem inline rather than receiving a transport-level fault.
|
|
10
|
+
*/
|
|
11
|
+
import type { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js";
|
|
12
|
+
import type { Store } from "@opencodehub/storage";
|
|
13
|
+
import type { ConnectionPool } from "../connection-pool.js";
|
|
14
|
+
export interface ResourceStoreOptions {
|
|
15
|
+
readonly home?: string;
|
|
16
|
+
readonly pool?: ConnectionPool;
|
|
17
|
+
}
|
|
18
|
+
export interface ResourceStoreError {
|
|
19
|
+
readonly result: ReadResourceResult;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Acquire a read-only store handle for `repoName`, invoke `fn`, and
|
|
23
|
+
* release. When resolution fails, return a YAML error envelope the
|
|
24
|
+
* caller should pass straight through. The callback is responsible for
|
|
25
|
+
* building the happy-path result.
|
|
26
|
+
*/
|
|
27
|
+
export declare function withResourceStore(uriHref: string, repoName: string | undefined, opts: ResourceStoreOptions, fn: (store: Store, repoName: string) => Promise<ReadResourceResult>): Promise<ReadResourceResult>;
|
|
28
|
+
//# sourceMappingURL=store-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-helper.d.ts","sourceRoot":"","sources":["../../src/resources/store-helper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,oBAAoB,EAC1B,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,GAClE,OAAO,CAAC,kBAAkB,CAAC,CAoB7B"}
|