codestrate 0.2.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,343 @@
1
+ import { registerCiTool } from "./register.js";
2
+ import { DeepExploreSchema, DeepExploreOutputSchema, ResponseFormat, } from "../schemas/index.js";
3
+ import { findSymbols } from "../store/index.js";
4
+ import { getStore } from "../store/sqlite.js";
5
+ import { asStructured } from "../types.js";
6
+ import { loadConfig, MAX_RESPONSE_CHARS } from "../constants.js";
7
+ import { readFileSync, existsSync } from "fs";
8
+ import { resolve } from "path";
9
+ // ─── Source code reader ──────────────────────────────────
10
+ /**
11
+ * Read source code around a symbol's location.
12
+ * Returns N lines context around the symbol (+/- contextLines).
13
+ */
14
+ function readSourceLines(file, line, contextLines = 40) {
15
+ const config = loadConfig();
16
+ if (!config.repoPath)
17
+ return null;
18
+ const fullPath = resolve(config.repoPath, file);
19
+ if (!existsSync(fullPath))
20
+ return null;
21
+ try {
22
+ const content = readFileSync(fullPath, "utf-8");
23
+ const lines = content.split("\n");
24
+ // Normalize line (1-indexed → 0-indexed)
25
+ const zeroIdx = Math.max(0, line - 1);
26
+ const start = Math.max(0, zeroIdx - contextLines);
27
+ const end = Math.min(lines.length, zeroIdx + contextLines);
28
+ const slice = lines.slice(start, end);
29
+ const header = `--- ${file}:${start + 1}-${end} (showing ${slice.length} lines around line ${line}) ---`;
30
+ // Add line numbers
31
+ const numbered = slice.map((l, i) => {
32
+ const lineNum = start + i + 1;
33
+ const marker = lineNum === line ? ">" : " ";
34
+ return `${marker}${String(lineNum).padStart(4, " ")}| ${l}`;
35
+ });
36
+ return header + "\n" + numbered.join("\n");
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ /**
43
+ * BFS forward from a node to find all callee paths up to depth.
44
+ */
45
+ function bfsCallPaths(store, fromNode, depth) {
46
+ const visited = new Set();
47
+ const calleeNames = new Set();
48
+ const paths = [];
49
+ const queue = [
50
+ { nodeId: fromNode.id, trail: [fromNode.name], d: 0 },
51
+ ];
52
+ visited.add(fromNode.id);
53
+ while (queue.length > 0) {
54
+ const { nodeId, trail, d } = queue.shift();
55
+ if (d >= depth)
56
+ continue;
57
+ const edges = store.getGraphEdges(nodeId, "outgoing");
58
+ for (const edge of edges) {
59
+ const targetNode = store.getGraphNode(edge.targetNodeId);
60
+ if (!targetNode)
61
+ continue;
62
+ calleeNames.add(targetNode.name);
63
+ const newTrail = [...trail, targetNode.name];
64
+ if (newTrail.length > 1) {
65
+ paths.push({
66
+ from: fromNode.name,
67
+ to: targetNode.name,
68
+ path: newTrail,
69
+ kind: edge.kind,
70
+ });
71
+ }
72
+ if (!visited.has(targetNode.id)) {
73
+ visited.add(targetNode.id);
74
+ if (d + 1 < depth) {
75
+ queue.push({ nodeId: targetNode.id, trail: newTrail, d: d + 1 });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ return { callees: [...calleeNames], paths };
81
+ }
82
+ /**
83
+ * BFS backward from a node to find all callers (blast radius).
84
+ */
85
+ function bfsBlastRadius(store, fromNode, depth) {
86
+ const visited = new Set();
87
+ const directDependents = new Set();
88
+ const transitiveDependents = new Set();
89
+ const affectedFiles = new Set();
90
+ const queue = [
91
+ { nodeId: fromNode.id, d: 0 },
92
+ ];
93
+ visited.add(fromNode.id);
94
+ while (queue.length > 0) {
95
+ const { nodeId, d } = queue.shift();
96
+ const edges = store.getGraphEdges(nodeId, "incoming");
97
+ for (const edge of edges) {
98
+ const sourceNode = store.getGraphNode(edge.sourceNodeId);
99
+ if (!sourceNode)
100
+ continue;
101
+ if (sourceNode.file)
102
+ affectedFiles.add(sourceNode.file);
103
+ if (d === 0) {
104
+ directDependents.add(sourceNode.name);
105
+ }
106
+ else {
107
+ transitiveDependents.add(sourceNode.name);
108
+ }
109
+ if (!visited.has(sourceNode.id)) {
110
+ visited.add(sourceNode.id);
111
+ if (d + 1 < depth) {
112
+ queue.push({ nodeId: sourceNode.id, d: d + 1 });
113
+ }
114
+ }
115
+ }
116
+ }
117
+ return {
118
+ symbol: fromNode.name,
119
+ directDependents: [...directDependents],
120
+ transitiveDependents: [...transitiveDependents],
121
+ totalAffectedFiles: affectedFiles.size,
122
+ affectedFiles: [...affectedFiles],
123
+ };
124
+ }
125
+ // ─── Tool registration ───────────────────────────────────
126
+ export function registerDeepExplore(server) {
127
+ registerCiTool(server, "ci_deep_explore", {
128
+ title: "Deep Explore Codebase",
129
+ description: "One-call code understanding: search symbols by natural language or name, then return full source code, BFS call paths, and blast radius. Replaces 2-3 separate tool calls with one comprehensive response.",
130
+ inputSchema: DeepExploreSchema.shape,
131
+ annotations: { readOnlyHint: true, idempotentHint: true },
132
+ outputSchema: DeepExploreOutputSchema,
133
+ }, async (args) => {
134
+ try {
135
+ const input = args;
136
+ const query = input.query;
137
+ const maxSymbols = input.maxSymbols ?? 10;
138
+ const depth = input.depth ?? 2;
139
+ const includeSource = input.includeSource !== false;
140
+ const includeCallPaths = input.includeCallPaths !== false;
141
+ const includeBlastRadius = input.includeBlastRadius !== false;
142
+ // 1. Tìm symbols từ query
143
+ const rawSymbols = findSymbols(query).slice(0, maxSymbols);
144
+ let symbols = rawSymbols;
145
+ // Fallback: thử search qua SQLite graph nếu JSON store không có kết quả
146
+ if (symbols.length === 0) {
147
+ try {
148
+ const sqlStore = getStore();
149
+ const graphNodes = sqlStore.searchGraphNodesFTS(query, maxSymbols);
150
+ if (graphNodes.length > 0) {
151
+ symbols = graphNodes.map((n) => ({
152
+ name: n.name,
153
+ kind: n.kind,
154
+ file: n.file,
155
+ line: n.line ?? 0,
156
+ column: n.column ?? 0,
157
+ signature: n.signature,
158
+ summary: "",
159
+ imports: [],
160
+ calls: [],
161
+ calledBy: [],
162
+ relatedTests: [],
163
+ commitSha: undefined,
164
+ repoFingerprint: undefined,
165
+ }));
166
+ }
167
+ }
168
+ catch {
169
+ // silently skip — no SQLite store available
170
+ }
171
+ }
172
+ if (symbols.length === 0) {
173
+ return {
174
+ content: [{ type: "text", text: `No symbols found for query "${query}". Try a different query or check ci_status to verify the index is populated.` }],
175
+ structuredContent: asStructured({
176
+ query,
177
+ symbols: [],
178
+ totalSymbols: 0,
179
+ totalFiles: 0,
180
+ }),
181
+ };
182
+ }
183
+ // 2. Xây dựng kết quả
184
+ const uniqueFiles = new Set();
185
+ const resultSymbols = [];
186
+ let allCallPaths = [];
187
+ let allBlastRadius = [];
188
+ const store = (() => { try {
189
+ return getStore();
190
+ }
191
+ catch {
192
+ return null;
193
+ } })();
194
+ for (const sym of symbols.slice(0, maxSymbols)) {
195
+ if (sym.file)
196
+ uniqueFiles.add(sym.file);
197
+ let sourceCode;
198
+ if (includeSource && sym.line) {
199
+ sourceCode = readSourceLines(sym.file, sym.line) ?? undefined;
200
+ }
201
+ let callers = [];
202
+ let callees = [];
203
+ let symCallPaths = [];
204
+ let symBlastRadius = null;
205
+ if (store) {
206
+ // Graph node lookup
207
+ const graphNodes = store.searchGraphNodes(sym.name, 1);
208
+ if (graphNodes.length > 0) {
209
+ const node = graphNodes[0];
210
+ // Edges
211
+ if (includeCallPaths) {
212
+ const edges = store.getGraphEdges(node.id, "both");
213
+ callers = edges
214
+ .filter((e) => e.targetNodeId === node.id)
215
+ .map((e) => {
216
+ const src = store.getGraphNode(e.sourceNodeId);
217
+ return src?.name ?? `#${e.sourceNodeId}`;
218
+ });
219
+ callees = edges
220
+ .filter((e) => e.sourceNodeId === node.id)
221
+ .map((e) => {
222
+ const tgt = store.getGraphNode(e.targetNodeId);
223
+ return tgt?.name ?? `#${e.targetNodeId}`;
224
+ });
225
+ // BFS call paths
226
+ const bfsResult = bfsCallPaths(store, node, depth);
227
+ symCallPaths = bfsResult.paths;
228
+ }
229
+ // Blast radius
230
+ if (includeBlastRadius) {
231
+ symBlastRadius = bfsBlastRadius(store, node, depth);
232
+ }
233
+ }
234
+ }
235
+ resultSymbols.push({
236
+ name: sym.name,
237
+ file: sym.file,
238
+ line: sym.line,
239
+ kind: sym.kind,
240
+ signature: sym.signature,
241
+ sourceCode,
242
+ callers: [...new Set(callers)],
243
+ callees: [...new Set(callees)],
244
+ });
245
+ if (symCallPaths.length > 0)
246
+ allCallPaths.push(...symCallPaths);
247
+ if (symBlastRadius)
248
+ allBlastRadius.push(symBlastRadius);
249
+ }
250
+ // Deduplicate call paths and blast radius
251
+ allCallPaths = allCallPaths.filter((p, i, arr) => arr.findIndex((x) => x.from === p.from && x.to === p.to) === i);
252
+ allBlastRadius = allBlastRadius.filter((b, i, arr) => arr.findIndex((x) => x.symbol === b.symbol) === i);
253
+ // 3. Build structured content
254
+ const structured = {
255
+ query,
256
+ symbols: resultSymbols,
257
+ totalSymbols: symbols.length,
258
+ totalFiles: uniqueFiles.size,
259
+ };
260
+ const structuredExtended = { ...structured };
261
+ if (includeCallPaths)
262
+ structuredExtended.callPaths = allCallPaths;
263
+ if (includeBlastRadius)
264
+ structuredExtended.blastRadius = allBlastRadius;
265
+ // 4. Build Markdown
266
+ if (input.responseFormat === ResponseFormat.JSON) {
267
+ return {
268
+ content: [{ type: "text", text: JSON.stringify(structuredExtended, null, 2) }],
269
+ structuredContent: asStructured(structuredExtended),
270
+ };
271
+ }
272
+ const lines = [];
273
+ lines.push(`# Deep Explore: \`${query}\``);
274
+ lines.push(`**Found:** ${symbols.length} symbols in ${uniqueFiles.size} files`);
275
+ if (depth > 1)
276
+ lines.push(`**Trace depth:** ${depth}`);
277
+ lines.push("");
278
+ for (const sym of resultSymbols) {
279
+ lines.push(`## ${sym.name} \`${sym.kind}\``);
280
+ lines.push(`- **File:** \`${sym.file}:${sym.line}\``);
281
+ lines.push(`- **Signature:** \`${sym.signature}\``);
282
+ if (sym.callers.length > 0) {
283
+ lines.push(`- **Called by:** ${sym.callers.join(", ")}`);
284
+ }
285
+ if (sym.callees.length > 0) {
286
+ lines.push(`- **Calls:** ${sym.callees.join(", ")}`);
287
+ }
288
+ if (sym.sourceCode) {
289
+ lines.push("");
290
+ lines.push("```typescript");
291
+ lines.push(sym.sourceCode);
292
+ lines.push("```");
293
+ }
294
+ lines.push("");
295
+ }
296
+ // Call paths section
297
+ if (includeCallPaths && allCallPaths.length > 0) {
298
+ lines.push("---");
299
+ lines.push("## Call Paths");
300
+ lines.push("");
301
+ for (const cp of allCallPaths) {
302
+ lines.push(`- **${cp.from}** → ${cp.path.slice(1).join(" → ")} (${cp.kind})`);
303
+ }
304
+ lines.push("");
305
+ }
306
+ // Blast radius section
307
+ if (includeBlastRadius && allBlastRadius.length > 0) {
308
+ lines.push("---");
309
+ lines.push("## Blast Radius");
310
+ lines.push("");
311
+ for (const br of allBlastRadius) {
312
+ lines.push(`### ${br.symbol}`);
313
+ lines.push(`- **Direct dependents:** ${br.directDependents.length}`);
314
+ lines.push(`- **Transitive dependents:** ${br.transitiveDependents.length}`);
315
+ lines.push(`- **Affected files:** ${br.totalAffectedFiles}`);
316
+ if (br.directDependents.length > 0) {
317
+ lines.push(`- **Direct:** ${br.directDependents.join(", ")}`);
318
+ }
319
+ if (br.transitiveDependents.length > 0) {
320
+ lines.push(`- **Transitive:** ${br.transitiveDependents.join(", ")}`);
321
+ }
322
+ if (br.affectedFiles.length > 0) {
323
+ lines.push(`- **Files:** ${br.affectedFiles.join(", ")}`);
324
+ }
325
+ lines.push("");
326
+ }
327
+ }
328
+ const text = lines.join("\n");
329
+ return {
330
+ content: [{ type: "text", text: text.slice(0, MAX_RESPONSE_CHARS) }],
331
+ structuredContent: asStructured(structuredExtended),
332
+ };
333
+ }
334
+ catch (error) {
335
+ const message = error instanceof Error ? error.message : String(error);
336
+ return {
337
+ content: [{ type: "text", text: `Error in deep explore: ${message}` }],
338
+ isError: true,
339
+ };
340
+ }
341
+ });
342
+ }
343
+ //# sourceMappingURL=deep-explore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-explore.js","sourceRoot":"","sources":["../../src/tools/deep-explore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * ci_session_heartbeat — Register or update this session's status.
3
+ *
4
+ * Each OMP tab / Claude Code session calls this periodically to announce
5
+ * what it's working on. Other sessions can discover it via ci_session_status.
6
+ */
7
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ export declare function registerSessionHeartbeat(server: McpServer): void;
9
+ //# sourceMappingURL=session-heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-heartbeat.d.ts","sourceRoot":"","sources":["../../src/tools/session-heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoDhE"}
@@ -0,0 +1,55 @@
1
+ import { registerCiTool } from "./register.js";
2
+ import { SessionHeartbeatSchema, SessionHeartbeatOutputSchema, } from "../schemas/index.js";
3
+ import { addOrUpdateSession, getSessions, saveMemoryStore } from "../store/memory.js";
4
+ import { asStructured } from "../types.js";
5
+ import { loadConfig } from "../constants.js";
6
+ export function registerSessionHeartbeat(server) {
7
+ registerCiTool(server, "ci_session_heartbeat", {
8
+ title: "Session Heartbeat",
9
+ description: "Register or update this session's status so other tabs/sessions know what you're working on. Call this when starting a new task or periodically during long tasks.",
10
+ inputSchema: SessionHeartbeatSchema,
11
+ outputSchema: SessionHeartbeatOutputSchema,
12
+ annotations: { readOnlyHint: false, idempotentHint: true },
13
+ }, async (params) => {
14
+ try {
15
+ const config = loadConfig();
16
+ const configRepo = config.repoPath || "";
17
+ const repoFingerprint = configRepo ? `${configRepo}@${Date.now()}` : "unknown";
18
+ addOrUpdateSession({
19
+ sessionId: params.sessionId,
20
+ label: params.label,
21
+ goal: params.goal,
22
+ status: params.status ?? "active",
23
+ currentTask: params.currentTask,
24
+ repo: params.repo ?? configRepo,
25
+ repoFingerprint,
26
+ tags: params.tags,
27
+ });
28
+ saveMemoryStore();
29
+ const active = getSessions({ status: "active" });
30
+ const record = getSessions({ sessionId: params.sessionId })[0];
31
+ return {
32
+ content: [{
33
+ type: "text",
34
+ text: `Heartbeat recorded for "${params.sessionId}". Active sessions: ${active.length}`,
35
+ }],
36
+ structuredContent: asStructured({
37
+ sessionId: params.sessionId,
38
+ isNew: record
39
+ ? record.startedAt === record.lastHeartbeatAt
40
+ : false,
41
+ activeCount: active.length,
42
+ lastHeartbeatAt: record?.lastHeartbeatAt ?? new Date().toISOString(),
43
+ }),
44
+ };
45
+ }
46
+ catch (error) {
47
+ const msg = error instanceof Error ? error.message : String(error);
48
+ return {
49
+ content: [{ type: "text", text: `Error recording heartbeat: ${msg}` }],
50
+ isError: true,
51
+ };
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=session-heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-heartbeat.js","sourceRoot":"","sources":["../../src/tools/session-heartbeat.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAE7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,cAAc,CAAC,MAAM,EAAE,sBAAsB,EAC7C;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,oKAAoK;QACjL,WAAW,EAAE,sBAAsB;QACnC,YAAY,EAAE,4BAA4B;QAC1C,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE;KAC3D,EACD,KAAK,EAAE,MAA6B,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACzC,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAE/E,kBAAkB,CAAC;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ;gBACjC,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,UAAU;gBAC/B,eAAe;gBACf,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC;YACH,eAAe,EAAE,CAAC;YAElB,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/D,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,MAAM,CAAC,SAAS,uBAAuB,MAAM,CAAC,MAAM,EAAE;qBACxF,CAAC;gBACF,iBAAiB,EAAE,YAAY,CAAC;oBAC9B,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,KAAK,EAAE,MAAM;wBACX,CAAC,CAAC,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,eAAe;wBAC7C,CAAC,CAAC,KAAK;oBACT,WAAW,EAAE,MAAM,CAAC,MAAM;oBAC1B,eAAe,EAAE,MAAM,EAAE,eAAe,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACrE,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,GAAG,EAAE,EAAE,CAAC;gBAC/E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAE,CAAC;AACN,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * ci_session_status — List active sessions and what they're working on.
3
+ *
4
+ * Shows all registered sessions (default: active ones) so you can see
5
+ * what other tabs are doing.
6
+ */
7
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ export declare function registerSessionStatus(server: McpServer): void;
9
+ //# sourceMappingURL=session-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-status.d.ts","sourceRoot":"","sources":["../../src/tools/session-status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqE7D"}
@@ -0,0 +1,84 @@
1
+ import { registerCiTool } from "./register.js";
2
+ import { SessionStatusQuerySchema, SessionStatusOutputSchema, } from "../schemas/index.js";
3
+ import { getSessions } from "../store/memory.js";
4
+ import { asStructured } from "../types.js";
5
+ export function registerSessionStatus(server) {
6
+ registerCiTool(server, "ci_session_status", {
7
+ title: "Session Status",
8
+ description: "List sessions and what they're working on. Useful to check if another tab is already working on something before starting.",
9
+ inputSchema: SessionStatusQuerySchema,
10
+ outputSchema: SessionStatusOutputSchema,
11
+ annotations: { readOnlyHint: true, idempotentHint: true },
12
+ }, async (params) => {
13
+ try {
14
+ const sessions = getSessions({
15
+ status: params.status ?? "active",
16
+ repo: params.repo,
17
+ sessionId: params.sessionId,
18
+ since: params.since,
19
+ });
20
+ const activeCount = getSessions({ status: "active" }).length;
21
+ const total = sessions.length;
22
+ let text;
23
+ if (sessions.length === 0) {
24
+ text = "No sessions found matching the filter.";
25
+ }
26
+ else {
27
+ const lines = [`# Active Sessions (${activeCount} active, ${total} shown)`, ""];
28
+ for (const s of sessions) {
29
+ const age = formatAge(s.lastHeartbeatAt);
30
+ lines.push(`## ${s.label}`);
31
+ lines.push(`- **ID**: \`${s.sessionId}\``);
32
+ lines.push(`- **Status**: ${s.status}`);
33
+ lines.push(`- **Goal**: ${s.goal || "(none)"}`);
34
+ lines.push(`- **Current Task**: ${s.currentTask || "(none)"}`);
35
+ lines.push(`- **Last seen**: ${age} ago`);
36
+ if (s.repo)
37
+ lines.push(`- **Repo**: \`${s.repo}\``);
38
+ if (s.tags.length > 0)
39
+ lines.push(`- **Tags**: ${s.tags.join(", ")}`);
40
+ lines.push("");
41
+ }
42
+ text = lines.join("\n");
43
+ }
44
+ return {
45
+ content: [{ type: "text", text }],
46
+ structuredContent: asStructured({
47
+ sessions: sessions.map((s) => ({
48
+ sessionId: s.sessionId,
49
+ label: s.label,
50
+ goal: s.goal,
51
+ status: s.status,
52
+ startedAt: s.startedAt,
53
+ lastHeartbeatAt: s.lastHeartbeatAt,
54
+ currentTask: s.currentTask,
55
+ repo: s.repo,
56
+ repoFingerprint: s.repoFingerprint,
57
+ tags: s.tags,
58
+ metadata: s.metadata,
59
+ })),
60
+ total,
61
+ activeCount,
62
+ }),
63
+ };
64
+ }
65
+ catch (error) {
66
+ const msg = error instanceof Error ? error.message : String(error);
67
+ return {
68
+ content: [{ type: "text", text: `Error fetching sessions: ${msg}` }],
69
+ isError: true,
70
+ };
71
+ }
72
+ });
73
+ }
74
+ function formatAge(iso) {
75
+ const ms = Date.now() - new Date(iso).getTime();
76
+ if (ms < 60_000)
77
+ return "<1m";
78
+ if (ms < 3_600_000)
79
+ return `${Math.floor(ms / 60_000)}m`;
80
+ if (ms < 86_400_000)
81
+ return `${Math.floor(ms / 3_600_000)}h`;
82
+ return `${Math.floor(ms / 86_400_000)}d`;
83
+ }
84
+ //# sourceMappingURL=session-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-status.js","sourceRoot":"","sources":["../../src/tools/session-status.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -118,6 +118,20 @@ export interface Memory {
118
118
  repo: string;
119
119
  source: "manual" | "auto" | "derived";
120
120
  }
121
+ export type SessionStatus = "active" | "paused" | "completed" | "abandoned";
122
+ export interface SessionRecord {
123
+ sessionId: string;
124
+ label: string;
125
+ goal: string;
126
+ status: SessionStatus;
127
+ startedAt: string;
128
+ lastHeartbeatAt: string;
129
+ currentTask: string;
130
+ repo: string;
131
+ repoFingerprint: string;
132
+ tags: string[];
133
+ metadata: Record<string, string>;
134
+ }
121
135
  export type ValidationTarget = "build" | "test" | "lint";
122
136
  export interface ValidationResult {
123
137
  type: ValidationTarget;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmOH,2DAA2D;AAC3D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAI,IAAO;IACrC,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqPH,2DAA2D;AAC3D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAI,IAAO;IACrC,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codestrate",
3
- "version": "0.2.3",
3
+ "version": "0.4.0",
4
4
  "description": "Code understanding via tree-sitter AST parsing, graph-based symbol navigation, and MCP integration for coding agents.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -19,6 +19,9 @@
19
19
  "build": "tsc",
20
20
  "clean": "rm -rf dist",
21
21
  "test": "npm run build && npx tsx --test tests/**/*.test.ts",
22
+ "bench": "npx tsx benchmarks/run.ts",
23
+ "bench:json": "npx tsx benchmarks/run.ts --json",
24
+ "bench:symbol": "npx tsx benchmarks/run.ts --suite core-understanding",
22
25
  "prepublishOnly": "npm run build"
23
26
  },
24
27
  "engines": {