@orbit360.lk/bugtracker-mcp 0.1.1 → 0.1.2
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/dist/bridge.js +37 -5
- package/dist/bridge.js.map +1 -1
- package/dist/index.js +59 -26
- package/dist/index.js.map +1 -1
- package/dist/log-cascade.js +124 -0
- package/dist/log-cascade.js.map +1 -0
- package/dist/log-time.js +71 -0
- package/dist/log-time.js.map +1 -0
- package/dist/logs.js +103 -40
- package/dist/logs.js.map +1 -1
- package/package.json +1 -1
package/dist/bridge.js
CHANGED
|
@@ -17,6 +17,27 @@ function authorised(request, token) {
|
|
|
17
17
|
return false;
|
|
18
18
|
return timingSafeEqual(Buffer.from(supplied), Buffer.from(token));
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Only the extension may talk to this.
|
|
22
|
+
*
|
|
23
|
+
* A page the developer visits can issue cross-origin requests to loopback, so
|
|
24
|
+
* without this check any website could fingerprint that the tool is running.
|
|
25
|
+
* A request with no Origin at all is a local CLI (curl, the smoke test), which
|
|
26
|
+
* is fine — it still has to present the token.
|
|
27
|
+
*/
|
|
28
|
+
function originAllowed(origin) {
|
|
29
|
+
return origin === undefined || origin.startsWith('chrome-extension://');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Rejects DNS rebinding: an attacker-controlled name resolving to 127.0.0.1
|
|
33
|
+
* arrives with their hostname in the Host header, not ours.
|
|
34
|
+
*/
|
|
35
|
+
function hostAllowed(host) {
|
|
36
|
+
if (!host)
|
|
37
|
+
return false;
|
|
38
|
+
const name = host.replace(/:\d+$/, '').toLowerCase();
|
|
39
|
+
return name === '127.0.0.1' || name === 'localhost' || name === '[::1]' || name === '::1';
|
|
40
|
+
}
|
|
20
41
|
function readBody(request) {
|
|
21
42
|
return new Promise((resolve, reject) => {
|
|
22
43
|
let size = 0;
|
|
@@ -46,16 +67,21 @@ export function startBridge(options) {
|
|
|
46
67
|
const { port, token, store } = options;
|
|
47
68
|
const log = options.onLog ?? (() => { });
|
|
48
69
|
const server = createServer((request, response) => {
|
|
70
|
+
const origin = request.headers.origin;
|
|
71
|
+
if (!hostAllowed(request.headers.host) || !originAllowed(origin)) {
|
|
72
|
+
json(response, 403, { error: 'Forbidden.' });
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
49
75
|
/*
|
|
50
76
|
* The caller is an extension service worker, so every request is
|
|
51
|
-
* cross-origin and preflighted. Reflecting
|
|
52
|
-
*
|
|
77
|
+
* cross-origin and preflighted. Reflecting is safe now that the origin has
|
|
78
|
+
* been checked, and the socket only listens on loopback.
|
|
53
79
|
*/
|
|
54
|
-
const origin = request.headers.origin;
|
|
55
80
|
if (origin) {
|
|
56
81
|
response.setHeader('access-control-allow-origin', origin);
|
|
57
82
|
response.setHeader('access-control-allow-headers', 'authorization, content-type');
|
|
58
83
|
response.setHeader('access-control-allow-methods', 'GET, POST, OPTIONS');
|
|
84
|
+
response.setHeader('access-control-allow-credentials', 'true');
|
|
59
85
|
response.setHeader('vary', 'origin');
|
|
60
86
|
}
|
|
61
87
|
if (request.method === 'OPTIONS') {
|
|
@@ -64,11 +90,17 @@ export function startBridge(options) {
|
|
|
64
90
|
return;
|
|
65
91
|
}
|
|
66
92
|
const url = new URL(request.url ?? '/', 'http://127.0.0.1');
|
|
93
|
+
const authed = authorised(request, token);
|
|
94
|
+
/*
|
|
95
|
+
* Reachable without a token so the settings screen can tell "not running"
|
|
96
|
+
* from "wrong token" — but it reports nothing beyond liveness unless the
|
|
97
|
+
* caller proves itself.
|
|
98
|
+
*/
|
|
67
99
|
if (url.pathname === '/health' && request.method === 'GET') {
|
|
68
|
-
json(response, 200, { ok: true, records: store.size });
|
|
100
|
+
json(response, 200, authed ? { ok: true, records: store.size } : { ok: true });
|
|
69
101
|
return;
|
|
70
102
|
}
|
|
71
|
-
if (!
|
|
103
|
+
if (!authed) {
|
|
72
104
|
json(response, 401, { error: 'Bad or missing bearer token.' });
|
|
73
105
|
return;
|
|
74
106
|
}
|
package/dist/bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,4EAA4E;AAC5E,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,SAAS,UAAU,CAAC,OAAwB,EAAE,KAAa;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,QAAQ,CAAC,OAAwB;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACnC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC;YACrB,IAAI,IAAI,GAAG,cAAc,EAAE,CAAC;gBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACvC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,IAAI,CAAC,QAAwB,EAAE,MAAc,EAAE,IAAa;IACnE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE;QACzB,cAAc,EAAE,kBAAkB;QAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;KAC7C,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAUD,MAAM,UAAU,WAAW,CAAC,OAAsB;IAChD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAChD
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,7 @@ import { loadConfig, requireToken } from './config.js';
|
|
|
19
19
|
import { Store } from './store.js';
|
|
20
20
|
import { startBridge } from './bridge.js';
|
|
21
21
|
import { findInLogs } from './logs.js';
|
|
22
|
+
import { findLogsForRecord } from './log-cascade.js';
|
|
22
23
|
// Resolved at runtime so the reported version cannot drift from the package.
|
|
23
24
|
const { version: VERSION } = createRequire(import.meta.url)('../package.json');
|
|
24
25
|
const HELP = `bugtracker-mcp ${VERSION}
|
|
@@ -67,6 +68,15 @@ function summarise(record) {
|
|
|
67
68
|
` ${record.url}`,
|
|
68
69
|
].join('\n');
|
|
69
70
|
}
|
|
71
|
+
/** Renders hits with their surrounding lines, so a stack trace survives intact. */
|
|
72
|
+
function formatMatches(matches) {
|
|
73
|
+
return matches
|
|
74
|
+
.map((match) => {
|
|
75
|
+
const body = [...(match.before ?? []), match.text, ...(match.after ?? [])].join('\n');
|
|
76
|
+
return `\`${match.file}:${match.line}\`\n\n\`\`\`\n${body}\n\`\`\``;
|
|
77
|
+
})
|
|
78
|
+
.join('\n\n');
|
|
79
|
+
}
|
|
70
80
|
const server = new McpServer({
|
|
71
81
|
name: 'bugtracker',
|
|
72
82
|
version: VERSION,
|
|
@@ -172,7 +182,7 @@ server.registerTool('get_module_backlog', {
|
|
|
172
182
|
/* -------------------------------------------------------------- local logs */
|
|
173
183
|
server.registerTool('find_logs', {
|
|
174
184
|
title: 'Search local server logs',
|
|
175
|
-
description: 'Searches log files on this machine for a literal string — normally the correlation id from a failed request in a bug report. This reads the developer’s own disk; the application under test exposes nothing.',
|
|
185
|
+
description: 'Searches log files on this machine for a literal string — normally the correlation id from a failed request in a bug report. This reads the developer’s own disk; the application under test exposes nothing. Returns surrounding lines so multi-line stack traces stay intact.',
|
|
176
186
|
inputSchema: {
|
|
177
187
|
query: z
|
|
178
188
|
.string()
|
|
@@ -181,50 +191,73 @@ server.registerTool('find_logs', {
|
|
|
181
191
|
.array(z.string())
|
|
182
192
|
.optional()
|
|
183
193
|
.describe('Restrict to specific files inside the configured log paths'),
|
|
194
|
+
contextAfter: z
|
|
195
|
+
.number()
|
|
196
|
+
.int()
|
|
197
|
+
.min(0)
|
|
198
|
+
.max(200)
|
|
199
|
+
.optional()
|
|
200
|
+
.describe('Trailing lines to include. Default 20 — enough for a Laravel trace.'),
|
|
201
|
+
since: z.number().optional().describe('Epoch ms; ignore lines logged before this'),
|
|
202
|
+
until: z.number().optional().describe('Epoch ms; ignore lines logged after this'),
|
|
184
203
|
},
|
|
185
|
-
}, async ({ query, paths }) => {
|
|
186
|
-
const result = await findInLogs(query, config.logPaths,
|
|
204
|
+
}, async ({ query, paths, contextAfter, since, until }) => {
|
|
205
|
+
const result = await findInLogs(query, config.logPaths, {
|
|
206
|
+
...(paths ? { paths } : {}),
|
|
207
|
+
...(contextAfter !== undefined ? { contextAfter } : {}),
|
|
208
|
+
...(since !== undefined ? { since } : {}),
|
|
209
|
+
...(until !== undefined ? { until } : {}),
|
|
210
|
+
});
|
|
187
211
|
if (!result.matches.length) {
|
|
188
212
|
const why = result.skipped.length
|
|
189
213
|
? `\n\nSkipped:\n${result.skipped.map((s) => `- ${s.file}: ${s.reason}`).join('\n')}`
|
|
190
214
|
: '';
|
|
191
215
|
return text(`No log lines contain "${query}".${why}\n\n` +
|
|
192
216
|
(config.logPaths.length
|
|
193
|
-
? `
|
|
217
|
+
? `Scanned ${result.linesScanned} line(s) across: ${result.filesSearched.join(', ') || 'nothing readable'}`
|
|
194
218
|
: 'Set BUGTRACKER_LOG_PATHS to the log files this server may read.'));
|
|
195
219
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
.join('\n\n');
|
|
199
|
-
return text(`${result.matches.length} matching line(s)${result.truncated ? ' (truncated)' : ''}:\n\n` +
|
|
200
|
-
'```\n' +
|
|
201
|
-
body +
|
|
202
|
-
'\n```');
|
|
220
|
+
return text(`${result.matches.length} match(es)${result.truncated ? ' (newest kept)' : ''} ` +
|
|
221
|
+
`from ${result.linesScanned} line(s) scanned:\n\n${formatMatches(result.matches)}`);
|
|
203
222
|
});
|
|
204
223
|
server.registerTool('find_logs_for_bug', {
|
|
205
224
|
title: 'Find the server logs behind a bug',
|
|
206
|
-
description: 'Takes a record id
|
|
225
|
+
description: 'Takes a record id and works down a cascade to locate the matching server logs: correlation id first, then exception class, failing request path, implicated source file, and finally everything logged around the capture. Works even when the application emits no correlation id at all.',
|
|
207
226
|
inputSchema: { id: z.string() },
|
|
208
227
|
}, async ({ id }) => {
|
|
209
228
|
const record = store.get(id);
|
|
210
229
|
if (!record)
|
|
211
230
|
return text(`No record with id \`${id}\`.`);
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
'The extension reads X-Request-Id, traceparent, CF-Ray, X-Amzn-Trace-Id, ' +
|
|
216
|
-
'X-Vercel-Id and similar. If none of those reaches the browser, the server ' +
|
|
217
|
-
'is not emitting one.');
|
|
231
|
+
if (!config.logPaths.length) {
|
|
232
|
+
return text('BUGTRACKER_LOG_PATHS is not set, so there are no logs to search. Point it at the ' +
|
|
233
|
+
'application’s log directory in your MCP config and restart.');
|
|
218
234
|
}
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
235
|
+
const { results, attempted, filesSearched, notes } = await findLogsForRecord(record, config.logPaths);
|
|
236
|
+
if (!results.length) {
|
|
237
|
+
return text([
|
|
238
|
+
`No log lines could be tied to “${record.title}”.`,
|
|
239
|
+
'',
|
|
240
|
+
'Tried:',
|
|
241
|
+
...attempted.map((a) => `- ${a}`),
|
|
242
|
+
'',
|
|
243
|
+
`Searched: ${filesSearched.join(', ') || 'nothing readable'}`,
|
|
244
|
+
...(notes.length ? ['', ...notes] : []),
|
|
245
|
+
].join('\n'));
|
|
227
246
|
}
|
|
247
|
+
const sections = results.map((result) => {
|
|
248
|
+
const caveat = result.confidence === 'exact'
|
|
249
|
+
? 'Matched on the correlation id the browser captured — this is the same request.'
|
|
250
|
+
: result.confidence === 'strong'
|
|
251
|
+
? 'Matched near the capture time. Very likely the same request; confirm the detail agrees.'
|
|
252
|
+
: 'Circumstantial — matched on timing or a filename only. Verify before relying on it.';
|
|
253
|
+
return [
|
|
254
|
+
`## ${result.kind} — \`${result.query}\``,
|
|
255
|
+
'',
|
|
256
|
+
`_${caveat}_`,
|
|
257
|
+
'',
|
|
258
|
+
formatMatches(result.matches),
|
|
259
|
+
].join('\n');
|
|
260
|
+
});
|
|
228
261
|
return text(sections.join('\n\n'));
|
|
229
262
|
});
|
|
230
263
|
/* ------------------------------------------------------------- write back */
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strategies for finding the server-side log lines behind a capture.
|
|
3
|
+
*
|
|
4
|
+
* A correlation id is the precise join, but most applications emit none — and
|
|
5
|
+
* a tool whose only strategy is "search by id" returns nothing for exactly the
|
|
6
|
+
* users who most need help. So it degrades: id, then the capture's time window,
|
|
7
|
+
* then the exception class, the failing path, and finally the file the trace
|
|
8
|
+
* pointed at.
|
|
9
|
+
*
|
|
10
|
+
* Every result says which strategy produced it, because a time-window hit is
|
|
11
|
+
* corroborating evidence while an id match is proof, and the agent has to be
|
|
12
|
+
* able to tell them apart.
|
|
13
|
+
*/
|
|
14
|
+
import { findInLogs } from './logs.js';
|
|
15
|
+
/** How far either side of the capture to look when joining on time alone. */
|
|
16
|
+
const TIME_WINDOW_MS = 120_000;
|
|
17
|
+
/** Pathname of the first failing request, which appears in most access logs. */
|
|
18
|
+
function failingPaths(record) {
|
|
19
|
+
const evidence = record.evidence;
|
|
20
|
+
const paths = new Set();
|
|
21
|
+
for (const entry of evidence?.network ?? []) {
|
|
22
|
+
if (!entry.url || (entry.ok && !entry.failed))
|
|
23
|
+
continue;
|
|
24
|
+
try {
|
|
25
|
+
const { pathname } = new URL(entry.url);
|
|
26
|
+
if (pathname && pathname !== '/')
|
|
27
|
+
paths.add(pathname);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* the url was already redacted into something unparseable */
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return [...paths].slice(0, 3);
|
|
34
|
+
}
|
|
35
|
+
function exceptionTypes(record) {
|
|
36
|
+
const evidence = record.evidence;
|
|
37
|
+
const types = new Set();
|
|
38
|
+
for (const error of evidence?.serverErrors ?? []) {
|
|
39
|
+
if (error.type)
|
|
40
|
+
types.add(error.type);
|
|
41
|
+
}
|
|
42
|
+
return [...types].slice(0, 3);
|
|
43
|
+
}
|
|
44
|
+
/** Basenames of application files the trace implicated. */
|
|
45
|
+
function sourceFiles(record) {
|
|
46
|
+
const evidence = record.evidence;
|
|
47
|
+
const names = new Set();
|
|
48
|
+
for (const error of evidence?.serverErrors ?? []) {
|
|
49
|
+
const base = error.file?.split(/[/\\]/).pop();
|
|
50
|
+
if (base)
|
|
51
|
+
names.add(base);
|
|
52
|
+
}
|
|
53
|
+
return [...names].slice(0, 3);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Runs each strategy until one produces hits.
|
|
57
|
+
*
|
|
58
|
+
* Stops at the first success rather than running everything: a correlation-id
|
|
59
|
+
* match is definitive, and piling circumstantial matches on top of it only
|
|
60
|
+
* dilutes what the agent reads.
|
|
61
|
+
*/
|
|
62
|
+
export async function findLogsForRecord(record, logPaths) {
|
|
63
|
+
const results = [];
|
|
64
|
+
const attempted = [];
|
|
65
|
+
const filesSearched = new Set();
|
|
66
|
+
const notes = [];
|
|
67
|
+
const window = {
|
|
68
|
+
since: record.createdAt - TIME_WINDOW_MS,
|
|
69
|
+
until: record.createdAt + TIME_WINDOW_MS,
|
|
70
|
+
};
|
|
71
|
+
const run = async (kind, query, confidence, scoped) => {
|
|
72
|
+
attempted.push(`${kind}: ${query}`);
|
|
73
|
+
const found = await findInLogs(query, logPaths, scoped ? window : {});
|
|
74
|
+
found.filesSearched.forEach((f) => filesSearched.add(f));
|
|
75
|
+
if (!found.matches.length)
|
|
76
|
+
return false;
|
|
77
|
+
results.push({ kind, query, confidence, matches: found.matches });
|
|
78
|
+
return true;
|
|
79
|
+
};
|
|
80
|
+
// 1 — the precise join.
|
|
81
|
+
for (const id of (record.requestIds ?? []).slice(0, 5)) {
|
|
82
|
+
if (await run('correlation-id', id, 'exact', false))
|
|
83
|
+
return done();
|
|
84
|
+
}
|
|
85
|
+
// 2 — same machine, same minute. Recovers most single-developer setups.
|
|
86
|
+
for (const type of exceptionTypes(record)) {
|
|
87
|
+
if (await run('exception-class', type, 'strong', true))
|
|
88
|
+
return done();
|
|
89
|
+
}
|
|
90
|
+
for (const path of failingPaths(record)) {
|
|
91
|
+
if (await run('request-path', path, 'strong', true))
|
|
92
|
+
return done();
|
|
93
|
+
}
|
|
94
|
+
for (const file of sourceFiles(record)) {
|
|
95
|
+
if (await run('source-file', file, 'circumstantial', true))
|
|
96
|
+
return done();
|
|
97
|
+
}
|
|
98
|
+
// 3 — last resort: everything logged around the capture, error lines first.
|
|
99
|
+
attempted.push(`time-window: ±${TIME_WINDOW_MS / 1000}s around the capture`);
|
|
100
|
+
for (const marker of ['ERROR', 'error', 'Exception']) {
|
|
101
|
+
const found = await findInLogs(marker, logPaths, { ...window, contextAfter: 25 });
|
|
102
|
+
found.filesSearched.forEach((f) => filesSearched.add(f));
|
|
103
|
+
if (found.matches.length) {
|
|
104
|
+
results.push({
|
|
105
|
+
kind: 'time-window',
|
|
106
|
+
query: `"${marker}" within ±${TIME_WINDOW_MS / 1000}s of the capture`,
|
|
107
|
+
confidence: 'circumstantial',
|
|
108
|
+
matches: found.matches,
|
|
109
|
+
});
|
|
110
|
+
return done();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!record.requestIds?.length) {
|
|
114
|
+
notes.push('This capture carries no correlation id, so nothing could be matched precisely. ' +
|
|
115
|
+
'The extension reads X-Request-Id, traceparent, Server-Timing, CF-Ray, ' +
|
|
116
|
+
'X-Amzn-Trace-Id and similar — if none reaches the browser, the server is not ' +
|
|
117
|
+
'emitting one, or the response was cross-origin and the header was not exposed.');
|
|
118
|
+
}
|
|
119
|
+
return done();
|
|
120
|
+
function done() {
|
|
121
|
+
return { results, attempted, filesSearched: [...filesSearched], notes };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=log-cascade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-cascade.js","sourceRoot":"","sources":["../src/log-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAGtD,6EAA6E;AAC7E,MAAM,cAAc,GAAG,OAAO,CAAC;AA8B/B,gFAAgF;AAChF,SAAS,YAAY,CAAC,MAAsB;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAgC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,SAAS;QACxD,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,QAAQ,IAAI,QAAQ,KAAK,GAAG;gBAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,6DAA6D;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,MAAsB;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAgC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,YAAY,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,2DAA2D;AAC3D,SAAS,WAAW,CAAC,MAAsB;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAgC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,YAAY,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9C,IAAI,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAsB,EACtB,QAAkB;IAElB,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,MAAM,CAAC,SAAS,GAAG,cAAc;QACxC,KAAK,EAAE,MAAM,CAAC,SAAS,GAAG,cAAc;KACzC,CAAC;IAEF,MAAM,GAAG,GAAG,KAAK,EACf,IAAkB,EAClB,KAAa,EACb,UAAwC,EACxC,MAAe,EACG,EAAE;QACpB,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,wBAAwB;IACxB,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,MAAM,GAAG,CAAC,gBAAgB,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,wEAAwE;IACxE,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,MAAM,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;IACxE,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,MAAM,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,MAAM,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;IAC5E,CAAC;IAED,4EAA4E;IAC5E,SAAS,CAAC,IAAI,CAAC,iBAAiB,cAAc,GAAG,IAAI,sBAAsB,CAAC,CAAC;IAC7E,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,IAAI,MAAM,aAAa,cAAc,GAAG,IAAI,kBAAkB;gBACrE,UAAU,EAAE,gBAAgB;gBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CACR,iFAAiF;YAC/E,wEAAwE;YACxE,+EAA+E;YAC/E,gFAAgF,CACnF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,EAAE,CAAC;IAEd,SAAS,IAAI;QACX,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,GAAG,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;IAC1E,CAAC;AACH,CAAC"}
|
package/dist/log-time.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log timestamp parsing.
|
|
3
|
+
*
|
|
4
|
+
* Time is the fallback join between a capture and its server logs: when an
|
|
5
|
+
* application emits no correlation id at all — the common case — "what was
|
|
6
|
+
* logged within two minutes of this capture" is what recovers the stack trace.
|
|
7
|
+
*
|
|
8
|
+
* Formats are tried in order of how specific they are, so a line that matches
|
|
9
|
+
* several is read by its most precise interpretation.
|
|
10
|
+
*/
|
|
11
|
+
/** `[2026-09-11 10:33:02]` — Laravel's default, and the most common by far. */
|
|
12
|
+
const BRACKETED = /^\[(\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?)/;
|
|
13
|
+
/** Bare ISO-8601 at the start of a line, with or without a zone. */
|
|
14
|
+
const ISO = /^(\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?)/;
|
|
15
|
+
/** nginx/Apache combined: `[11/Sep/2026:10:33:02 +0000]`. */
|
|
16
|
+
const CLF = /\[(\d{2})\/([A-Za-z]{3})\/(\d{4}):(\d{2}):(\d{2}):(\d{2})\s*([+-]\d{4})?\]/;
|
|
17
|
+
/** JSON lines from Docker, Pino, Winston and friends. */
|
|
18
|
+
const JSON_TIME = /"(?:@?time(?:stamp)?|ts)"\s*:\s*"([^"]+)"/;
|
|
19
|
+
/** Same, but numeric epoch seconds or milliseconds. */
|
|
20
|
+
const JSON_EPOCH = /"(?:@?time(?:stamp)?|ts)"\s*:\s*(\d{10,13})/;
|
|
21
|
+
const MONTHS = {
|
|
22
|
+
jan: 0, feb: 1, mar: 2, apr: 3, may: 4, jun: 5,
|
|
23
|
+
jul: 6, aug: 7, sep: 8, oct: 9, nov: 10, dec: 11,
|
|
24
|
+
};
|
|
25
|
+
function fromClf(match) {
|
|
26
|
+
const month = MONTHS[(match[2] ?? '').toLowerCase()];
|
|
27
|
+
if (month === undefined)
|
|
28
|
+
return null;
|
|
29
|
+
const iso = `${match[3]}-${String(month + 1).padStart(2, '0')}-${match[1]}` +
|
|
30
|
+
`T${match[4]}:${match[5]}:${match[6]}${formatZone(match[7])}`;
|
|
31
|
+
const parsed = Date.parse(iso);
|
|
32
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
33
|
+
}
|
|
34
|
+
/** `+0530` → `+05:30`; absent means local time, which Date.parse assumes. */
|
|
35
|
+
function formatZone(zone) {
|
|
36
|
+
if (!zone)
|
|
37
|
+
return '';
|
|
38
|
+
return `${zone.slice(0, 3)}:${zone.slice(3)}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Milliseconds since the epoch for a log line, or null when it carries no
|
|
42
|
+
* recognisable timestamp (a stack-trace continuation line, for instance).
|
|
43
|
+
*/
|
|
44
|
+
export function parseLogTimestamp(line) {
|
|
45
|
+
const bracketed = BRACKETED.exec(line);
|
|
46
|
+
if (bracketed?.[1])
|
|
47
|
+
return toMillis(bracketed[1]);
|
|
48
|
+
const iso = ISO.exec(line);
|
|
49
|
+
if (iso?.[1])
|
|
50
|
+
return toMillis(iso[1]);
|
|
51
|
+
const clf = CLF.exec(line);
|
|
52
|
+
if (clf)
|
|
53
|
+
return fromClf(clf);
|
|
54
|
+
const jsonTime = JSON_TIME.exec(line);
|
|
55
|
+
if (jsonTime?.[1])
|
|
56
|
+
return toMillis(jsonTime[1]);
|
|
57
|
+
const epoch = JSON_EPOCH.exec(line);
|
|
58
|
+
if (epoch?.[1]) {
|
|
59
|
+
const value = Number(epoch[1]);
|
|
60
|
+
// Ten digits is seconds; thirteen is milliseconds.
|
|
61
|
+
return epoch[1].length <= 10 ? value * 1000 : value;
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
function toMillis(value) {
|
|
66
|
+
// Laravel writes `2026-09-11 10:33:02`, which Date.parse treats as local —
|
|
67
|
+
// correct here, since the log and the browser are on the same machine.
|
|
68
|
+
const parsed = Date.parse(value.includes('T') ? value : value.replace(' ', 'T'));
|
|
69
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=log-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-time.js","sourceRoot":"","sources":["../src/log-time.ts"],"names":[],"mappings":"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"}
|
package/dist/logs.js
CHANGED
|
@@ -12,35 +12,42 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { createReadStream } from 'node:fs';
|
|
14
14
|
import { stat, readdir } from 'node:fs/promises';
|
|
15
|
+
import { createGunzip } from 'node:zlib';
|
|
15
16
|
import { createInterface } from 'node:readline';
|
|
16
17
|
import { isAbsolute, join, resolve, sep } from 'node:path';
|
|
18
|
+
import { parseLogTimestamp } from './log-time.js';
|
|
17
19
|
/** Reading a multi-gigabyte rotated log would hang the agent. */
|
|
18
20
|
const MAX_FILE_BYTES = 256 * 1024 * 1024;
|
|
19
|
-
const MAX_MATCHES =
|
|
21
|
+
const MAX_MATCHES = 60;
|
|
20
22
|
const MAX_LINE_CHARS = 4000;
|
|
23
|
+
/** Rotated logs nest a level or two; anything deeper is not a log directory. */
|
|
24
|
+
const MAX_DIR_DEPTH = 3;
|
|
25
|
+
const LOG_FILE_RE = /\.(log|txt|out|ndjson|jsonl)(\.\d+)?(\.gz)?$/i;
|
|
21
26
|
/** True when `candidate` is inside one of the allowed roots. */
|
|
22
|
-
function isAllowed(candidate, roots) {
|
|
27
|
+
export function isAllowed(candidate, roots) {
|
|
23
28
|
const target = resolve(candidate);
|
|
24
29
|
return roots.some((root) => {
|
|
25
30
|
const allowed = resolve(root);
|
|
26
31
|
return target === allowed || target.startsWith(allowed + sep);
|
|
27
32
|
});
|
|
28
33
|
}
|
|
29
|
-
/** Expands configured paths into concrete files,
|
|
30
|
-
async function collectFiles(paths) {
|
|
34
|
+
/** Expands configured paths into concrete files, recursing into directories. */
|
|
35
|
+
async function collectFiles(paths, depth = 0) {
|
|
31
36
|
const files = [];
|
|
32
37
|
const skipped = [];
|
|
33
38
|
for (const path of paths) {
|
|
34
39
|
try {
|
|
35
40
|
const info = await stat(path);
|
|
36
41
|
if (info.isDirectory()) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
if (depth >= MAX_DIR_DEPTH)
|
|
43
|
+
continue;
|
|
44
|
+
const entries = await readdir(path, { withFileTypes: true });
|
|
45
|
+
const nested = entries
|
|
46
|
+
.filter((e) => e.isDirectory() || (e.isFile() && LOG_FILE_RE.test(e.name)))
|
|
47
|
+
.map((e) => join(path, e.name));
|
|
48
|
+
const inner = await collectFiles(nested, depth + 1);
|
|
49
|
+
files.push(...inner.files);
|
|
50
|
+
skipped.push(...inner.skipped);
|
|
44
51
|
continue;
|
|
45
52
|
}
|
|
46
53
|
if (info.size > MAX_FILE_BYTES) {
|
|
@@ -55,48 +62,91 @@ async function collectFiles(paths) {
|
|
|
55
62
|
}
|
|
56
63
|
return { files, skipped };
|
|
57
64
|
}
|
|
58
|
-
|
|
59
|
-
|
|
65
|
+
function clip(line) {
|
|
66
|
+
return line.length > MAX_LINE_CHARS ? `${line.slice(0, MAX_LINE_CHARS)}…` : line;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Scans one file, keeping the **last** N matches.
|
|
70
|
+
*
|
|
71
|
+
* Logs are append-only, so the interesting hits are at the end. Stopping at the
|
|
72
|
+
* first N would return the oldest occurrences of a recurring error — almost
|
|
73
|
+
* always the wrong ones.
|
|
74
|
+
*/
|
|
75
|
+
async function searchFile(file, needle, options) {
|
|
76
|
+
const source = createReadStream(file);
|
|
77
|
+
const stream = file.endsWith('.gz') ? source.pipe(createGunzip()) : source;
|
|
60
78
|
const lines = createInterface({ input: stream, crlfDelay: Infinity });
|
|
79
|
+
const matches = [];
|
|
80
|
+
const before = [];
|
|
81
|
+
// Matches still collecting their trailing context.
|
|
82
|
+
let pending = [];
|
|
61
83
|
let lineNumber = 0;
|
|
84
|
+
let lastTimestamp = null;
|
|
62
85
|
try {
|
|
63
|
-
for await (const
|
|
86
|
+
for await (const raw of lines) {
|
|
64
87
|
lineNumber++;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (
|
|
73
|
-
|
|
88
|
+
for (const item of pending) {
|
|
89
|
+
item.match.after?.push(clip(raw));
|
|
90
|
+
item.remaining--;
|
|
91
|
+
}
|
|
92
|
+
pending = pending.filter((item) => item.remaining > 0);
|
|
93
|
+
// Continuation lines inherit the timestamp of the entry they belong to.
|
|
94
|
+
const stamp = parseLogTimestamp(raw);
|
|
95
|
+
if (stamp !== null)
|
|
96
|
+
lastTimestamp = stamp;
|
|
97
|
+
const effective = stamp ?? lastTimestamp;
|
|
98
|
+
const inWindow = (options.since === undefined || (effective ?? 0) >= options.since) &&
|
|
99
|
+
(options.until === undefined || (effective ?? Number.MAX_SAFE_INTEGER) <= options.until);
|
|
100
|
+
if (raw.includes(needle) && inWindow) {
|
|
101
|
+
const match = {
|
|
102
|
+
file,
|
|
103
|
+
line: lineNumber,
|
|
104
|
+
text: clip(raw),
|
|
105
|
+
before: before.slice(-options.contextBefore),
|
|
106
|
+
after: [],
|
|
107
|
+
...(effective !== null ? { timestamp: effective } : {}),
|
|
108
|
+
};
|
|
109
|
+
matches.push(match);
|
|
110
|
+
if (options.contextAfter > 0) {
|
|
111
|
+
pending.push({ match, remaining: options.contextAfter });
|
|
112
|
+
}
|
|
113
|
+
// Drop the oldest rather than stopping, so the newest always survive.
|
|
114
|
+
if (matches.length > options.limit)
|
|
115
|
+
matches.shift();
|
|
116
|
+
}
|
|
117
|
+
before.push(clip(raw));
|
|
118
|
+
if (before.length > options.contextBefore)
|
|
119
|
+
before.shift();
|
|
74
120
|
}
|
|
75
121
|
}
|
|
76
122
|
finally {
|
|
77
123
|
lines.close();
|
|
78
|
-
|
|
124
|
+
source.destroy();
|
|
79
125
|
}
|
|
126
|
+
return { matches, linesScanned: lineNumber };
|
|
80
127
|
}
|
|
81
128
|
/**
|
|
82
|
-
* Searches the configured logs for a literal string
|
|
129
|
+
* Searches the configured logs for a literal string.
|
|
83
130
|
*
|
|
84
|
-
* @param
|
|
85
|
-
* configured allowlist.
|
|
131
|
+
* @param configuredPaths The allowlist from BUGTRACKER_LOG_PATHS.
|
|
86
132
|
*/
|
|
87
|
-
export async function findInLogs(needle, configuredPaths,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
133
|
+
export async function findInLogs(needle, configuredPaths, options = {}) {
|
|
134
|
+
const empty = {
|
|
135
|
+
matches: [],
|
|
136
|
+
filesSearched: [],
|
|
137
|
+
skipped: [],
|
|
138
|
+
truncated: false,
|
|
139
|
+
linesScanned: 0,
|
|
140
|
+
};
|
|
141
|
+
if (!needle.trim())
|
|
142
|
+
return empty;
|
|
91
143
|
if (configuredPaths.length === 0) {
|
|
92
144
|
return {
|
|
93
|
-
|
|
94
|
-
filesSearched: [],
|
|
145
|
+
...empty,
|
|
95
146
|
skipped: [{ file: '(none configured)', reason: 'BUGTRACKER_LOG_PATHS is not set' }],
|
|
96
|
-
truncated: false,
|
|
97
147
|
};
|
|
98
148
|
}
|
|
99
|
-
const requested =
|
|
149
|
+
const requested = options.paths?.length ? options.paths : configuredPaths;
|
|
100
150
|
const allowed = [];
|
|
101
151
|
const skipped = [];
|
|
102
152
|
for (const path of requested) {
|
|
@@ -106,25 +156,38 @@ export async function findInLogs(needle, configuredPaths, extraPaths = []) {
|
|
|
106
156
|
else
|
|
107
157
|
skipped.push({ file: path, reason: 'outside BUGTRACKER_LOG_PATHS' });
|
|
108
158
|
}
|
|
159
|
+
const limit = options.limit ?? MAX_MATCHES;
|
|
160
|
+
const scan = {
|
|
161
|
+
contextAfter: options.contextAfter ?? 20,
|
|
162
|
+
contextBefore: options.contextBefore ?? 2,
|
|
163
|
+
limit,
|
|
164
|
+
...(options.since !== undefined ? { since: options.since } : {}),
|
|
165
|
+
...(options.until !== undefined ? { until: options.until } : {}),
|
|
166
|
+
};
|
|
109
167
|
const { files, skipped: unreadable } = await collectFiles(allowed);
|
|
110
168
|
const matches = [];
|
|
111
169
|
const searched = [];
|
|
170
|
+
let linesScanned = 0;
|
|
112
171
|
for (const file of files) {
|
|
113
|
-
if (matches.length >= MAX_MATCHES)
|
|
114
|
-
break;
|
|
115
172
|
try {
|
|
116
|
-
await searchFile(file, needle,
|
|
173
|
+
const result = await searchFile(file, needle, scan);
|
|
174
|
+
matches.push(...result.matches);
|
|
175
|
+
linesScanned += result.linesScanned;
|
|
117
176
|
searched.push(file);
|
|
118
177
|
}
|
|
119
178
|
catch (error) {
|
|
120
179
|
unreadable.push({ file, reason: error instanceof Error ? error.message : 'read failed' });
|
|
121
180
|
}
|
|
122
181
|
}
|
|
182
|
+
// Newest first across every file, then capped.
|
|
183
|
+
matches.sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0) || b.line - a.line);
|
|
184
|
+
const truncated = matches.length > limit;
|
|
123
185
|
return {
|
|
124
|
-
matches,
|
|
186
|
+
matches: matches.slice(0, limit),
|
|
125
187
|
filesSearched: searched,
|
|
126
188
|
skipped: [...skipped, ...unreadable],
|
|
127
|
-
truncated
|
|
189
|
+
truncated,
|
|
190
|
+
linesScanned,
|
|
128
191
|
};
|
|
129
192
|
}
|
|
130
193
|
//# sourceMappingURL=logs.js.map
|
package/dist/logs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../src/logs.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orbit360.lk/bugtracker-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Local MCP server exposing captured bug reports and local server logs to an AI coding agent.",
|
|
5
5
|
"author": "Orbit Pvt Ltd <orbit.to.us@gmail.com> (https://orbit360.lk/)",
|
|
6
6
|
"license": "MIT",
|