@orbit360.lk/bugtracker-mcp 0.1.0 → 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/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # BugTracker MCP server
2
2
 
3
+ [`@orbit360.lk/bugtracker-mcp`](https://www.npmjs.com/package/@orbit360.lk/bugtracker-mcp)
4
+
3
5
  Gives an AI coding agent direct access to captured bug reports **and to your
4
6
  local server logs** — without your application exposing anything.
5
7
 
@@ -30,12 +32,36 @@ review, nothing to accidentally leave enabled in production.
30
32
 
31
33
  ## Install
32
34
 
35
+ Nothing to install. Your MCP client runs it on demand:
36
+
37
+ ```bash
38
+ npx -y @orbit360.lk/bugtracker-mcp
39
+ ```
40
+
41
+ Check it resolves:
42
+
43
+ ```bash
44
+ npx -y @orbit360.lk/bugtracker-mcp --help
45
+ ```
46
+
47
+ Requires Node 20 or newer.
48
+
49
+ <details>
50
+ <summary>Building from source instead</summary>
51
+
52
+ Use this when you want to modify the server, or when the machine cannot reach
53
+ the npm registry.
54
+
33
55
  ```bash
34
56
  cd mcp-server
35
57
  npm install
36
58
  npm run build
37
59
  ```
38
60
 
61
+ Your agent then runs `node /absolute/path/to/mcp-server/dist/index.js`.
62
+
63
+ </details>
64
+
39
65
  ## Configure
40
66
 
41
67
  Everything comes from the environment. Nothing is hardcoded, so the same binary
@@ -51,18 +77,28 @@ serves whichever project you are working on.
51
77
  The server refuses to start without a token rather than opening an
52
78
  unauthenticated port.
53
79
 
80
+ | Flag | |
81
+ |---|---|
82
+ | `--help`, `-h` | Usage and every environment variable. |
83
+ | `--version`, `-v` | Print the version. |
84
+
54
85
  ## Register it with your agent
55
86
 
87
+ > The extension generates these blocks with your token and paths already filled
88
+ > in — **Integration → Local agent bridge → step 4**. Copy from there rather than
89
+ > editing by hand.
90
+
56
91
  **Claude Code** — `.mcp.json` in your project, or `~/.claude.json`:
57
92
 
58
93
  ```json
59
94
  {
60
95
  "mcpServers": {
61
96
  "bugtracker": {
62
- "command": "node",
63
- "args": ["/absolute/path/to/mcp-server/dist/index.js"],
97
+ "command": "npx",
98
+ "args": ["-y", "@orbit360.lk/bugtracker-mcp"],
64
99
  "env": {
65
100
  "BUGTRACKER_BRIDGE_TOKEN": "paste-the-token-here",
101
+ "BUGTRACKER_BRIDGE_PORT": "4319",
66
102
  "BUGTRACKER_LOG_PATHS": "/path/to/your-app/storage/logs"
67
103
  }
68
104
  }
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 the origin is safe here because
52
- * the token is the actual gate and the socket only listens on loopback.
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 (!authorised(request, token)) {
103
+ if (!authed) {
72
104
  json(response, 401, { error: 'Bad or missing bearer token.' });
73
105
  return;
74
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
package/dist/config.js CHANGED
@@ -28,8 +28,9 @@ export function requireToken(config) {
28
28
  if (config.token)
29
29
  return;
30
30
  throw new Error('BUGTRACKER_BRIDGE_TOKEN is not set.\n\n' +
31
- 'Generate one in the extension under Settings AI agent bridge, then start\n' +
32
- 'this server with it in the environment. Without a token the bridge would\n' +
33
- 'accept records from anything else running on this machine.');
31
+ 'This server is normally launched by your MCP client, not by hand. Open the\n' +
32
+ 'extension dashboard, go to Integration \u2192 Local agent bridge, and follow the\n' +
33
+ 'five steps \u2014 step 4 gives you a config block with the token already filled in.\n\n' +
34
+ 'Run with --help to see every environment variable.');
34
35
  }
35
36
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqBjC,SAAS,IAAI,CAAC,KAAyB;IACrC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;SACjB,KAAK,CAAC,MAAM,CAAC;SACb,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAEhE,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI;QAC/E,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC;QAClF,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAChD,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO;IACzB,MAAM,IAAI,KAAK,CACb,yCAAyC;QACvC,8EAA8E;QAC9E,4EAA4E;QAC5E,4DAA4D,CAC/D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqBjC,SAAS,IAAI,CAAC,KAAyB;IACrC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;SACjB,KAAK,CAAC,MAAM,CAAC;SACb,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAEhE,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI;QAC/E,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC;QAClF,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAChD,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO;IACzB,MAAM,IAAI,KAAK,CACb,yCAAyC;QACvC,8EAA8E;QAC9E,oFAAoF;QACpF,yFAAyF;QACzF,oDAAoD,CACvD,CAAC;AACJ,CAAC"}
package/dist/index.js CHANGED
@@ -13,11 +13,44 @@
13
13
  */
14
14
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
15
15
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
16
+ import { createRequire } from 'node:module';
16
17
  import { z } from 'zod';
17
18
  import { loadConfig, requireToken } from './config.js';
18
19
  import { Store } from './store.js';
19
20
  import { startBridge } from './bridge.js';
20
21
  import { findInLogs } from './logs.js';
22
+ import { findLogsForRecord } from './log-cascade.js';
23
+ // Resolved at runtime so the reported version cannot drift from the package.
24
+ const { version: VERSION } = createRequire(import.meta.url)('../package.json');
25
+ const HELP = `bugtracker-mcp ${VERSION}
26
+
27
+ Local MCP server for the AI Bug & Feature Tracker Chrome extension. Exposes
28
+ captured bug reports and searches your local server logs, so an AI coding agent
29
+ gets both without your application exposing anything.
30
+
31
+ It is launched by your MCP client, not by hand — see "Integration → Local agent
32
+ bridge" in the extension for a config block with your token already filled in.
33
+
34
+ Environment:
35
+ BUGTRACKER_BRIDGE_TOKEN required Shared secret; generate it in the extension.
36
+ BUGTRACKER_LOG_PATHS optional Files or folders find_logs may read (allowlist).
37
+ BUGTRACKER_BRIDGE_PORT optional Loopback port. Default 4319.
38
+ BUGTRACKER_DATA_DIR optional Where records are mirrored. Default ~/.bugtracker.
39
+
40
+ Options:
41
+ -h, --help Show this message.
42
+ -v, --version Print the version.
43
+ `;
44
+ /* Handled before the token check so `npx … --help` works on a fresh machine. */
45
+ const argv = process.argv.slice(2);
46
+ if (argv.includes('--help') || argv.includes('-h')) {
47
+ process.stdout.write(HELP);
48
+ process.exit(0);
49
+ }
50
+ if (argv.includes('--version') || argv.includes('-v')) {
51
+ process.stdout.write(`${VERSION}\n`);
52
+ process.exit(0);
53
+ }
21
54
  const config = loadConfig();
22
55
  requireToken(config);
23
56
  const store = new Store(config.dataDir);
@@ -35,9 +68,18 @@ function summarise(record) {
35
68
  ` ${record.url}`,
36
69
  ].join('\n');
37
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
+ }
38
80
  const server = new McpServer({
39
81
  name: 'bugtracker',
40
- version: '0.1.0',
82
+ version: VERSION,
41
83
  });
42
84
  /* ------------------------------------------------------------- discovery */
43
85
  server.registerTool('list_projects', {
@@ -140,7 +182,7 @@ server.registerTool('get_module_backlog', {
140
182
  /* -------------------------------------------------------------- local logs */
141
183
  server.registerTool('find_logs', {
142
184
  title: 'Search local server logs',
143
- 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.',
144
186
  inputSchema: {
145
187
  query: z
146
188
  .string()
@@ -149,50 +191,73 @@ server.registerTool('find_logs', {
149
191
  .array(z.string())
150
192
  .optional()
151
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'),
152
203
  },
153
- }, async ({ query, paths }) => {
154
- const result = await findInLogs(query, config.logPaths, paths ?? []);
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
+ });
155
211
  if (!result.matches.length) {
156
212
  const why = result.skipped.length
157
213
  ? `\n\nSkipped:\n${result.skipped.map((s) => `- ${s.file}: ${s.reason}`).join('\n')}`
158
214
  : '';
159
215
  return text(`No log lines contain "${query}".${why}\n\n` +
160
216
  (config.logPaths.length
161
- ? `Searched: ${result.filesSearched.join(', ') || 'nothing readable'}`
217
+ ? `Scanned ${result.linesScanned} line(s) across: ${result.filesSearched.join(', ') || 'nothing readable'}`
162
218
  : 'Set BUGTRACKER_LOG_PATHS to the log files this server may read.'));
163
219
  }
164
- const body = result.matches
165
- .map((m) => `${m.file}:${m.line}\n${m.text}`)
166
- .join('\n\n');
167
- return text(`${result.matches.length} matching line(s)${result.truncated ? ' (truncated)' : ''}:\n\n` +
168
- '```\n' +
169
- body +
170
- '\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)}`);
171
222
  });
172
223
  server.registerTool('find_logs_for_bug', {
173
224
  title: 'Find the server logs behind a bug',
174
- description: 'Takes a record id, pulls the correlation ids the browser captured on its failed requests, and searches the local logs for each. The fastest path from a browser symptom to a server stack trace.',
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.',
175
226
  inputSchema: { id: z.string() },
176
227
  }, async ({ id }) => {
177
228
  const record = store.get(id);
178
229
  if (!record)
179
230
  return text(`No record with id \`${id}\`.`);
180
- const ids = record.requestIds ?? [];
181
- if (!ids.length) {
182
- return text('This capture carries no correlation id, so there is nothing to search on.\n\n' +
183
- 'The extension reads X-Request-Id, traceparent, CF-Ray, X-Amzn-Trace-Id, ' +
184
- 'X-Vercel-Id and similar. If none of those reaches the browser, the server ' +
185
- '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.');
186
234
  }
187
- const sections = [];
188
- for (const requestId of ids.slice(0, 5)) {
189
- const result = await findInLogs(requestId, config.logPaths);
190
- sections.push(result.matches.length
191
- ? `## \`${requestId}\`\n\n\`\`\`\n${result.matches
192
- .map((m) => `${m.file}:${m.line}\n${m.text}`)
193
- .join('\n\n')}\n\`\`\``
194
- : `## \`${requestId}\`\n\nNo matching log lines.`);
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'));
195
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
+ });
196
261
  return text(sections.join('\n\n'));
197
262
  });
198
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":";AACA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,KAAK,EAAuB,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,6EAA6E;AAC7E,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAE5E,CAAC;AAEF,MAAM,IAAI,GAAG,kBAAkB,OAAO;;;;;;;;;;;;;;;;;;CAkBrC,CAAC;AAEF,gFAAgF;AAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,YAAY,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAExC,uEAAuE;AACvE,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,IAAI,CAAC,CAAC;AAEvF,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,SAAS,CAAC,MAAsB;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO;QACL,OAAO,MAAM,CAAC,KAAK,IAAI;QACvB,WAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,QAAQ,GAAG,QAAQ,MAAM,MAAM,CAAC,MAAM,EAAE;QAC5F,cAAc,MAAM,CAAC,WAAW,IAAI,YAAY,cAAc,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE;QACpF,KAAK,MAAM,CAAC,GAAG,EAAE;KAClB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,mFAAmF;AACnF,SAAS,aAAa,CAAC,OAAmB;IACxC,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,OAAO,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,iBAAiB,IAAI,UAAU,CAAC;IACtE,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,6EAA6E;AAE7E,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;IACE,KAAK,EAAE,eAAe;IACtB,WAAW,EACT,+IAA+I;IACjJ,WAAW,EAAE,EAAE;CAChB,EACD,GAAG,EAAE;IACH,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CACT,gFAAgF;YAC9E,mDAAmD,CACtD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CACT,QAAQ;SACL,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,OAAO,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,0BAA0B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CACtG;SACA,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;IACE,KAAK,EAAE,gCAAgC;IACvC,WAAW,EACT,kIAAkI;IACpI,WAAW,EAAE;QACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACpE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;QACrE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACpF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KAC/D;CACF,EACD,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;AAC3F,CAAC,CACF,CAAC;AAEF,8EAA8E;AAE9E,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;IACE,KAAK,EAAE,oCAAoC;IAC3C,WAAW,EACT,wLAAwL;IAC1L,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE;CACrE,EACD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IACT,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,uBAAuB,EAAE,wCAAwC,CAAC,CAAC;IAC5F,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;IACE,KAAK,EAAE,oCAAoC;IAC3C,WAAW,EACT,gMAAgM;IAClM,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;CAChC,EACD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;IACT,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,iDAAiD,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;AAChF,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;IACE,KAAK,EAAE,oCAAoC;IAC3C,WAAW,EACT,kKAAkK;IACpK,WAAW,EAAE;QACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;KACnD;CACF,EACD,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;IACnC,MAAM,GAAG,GAAG,KAAK;SACd,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;SACjD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC;IAElF,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,2BAA2B,MAAM,IAAI,CAAC,CAAC;IAEpE,MAAM,IAAI,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IACjF,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACtD,CAAC;IAEF,MAAM,KAAK,GAAG;QACZ,kCAAkC;QAClC,2BAA2B;QAC3B,GAAG,OAAO,CAAC,GAAG,CACZ,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CACxF;KACF,CAAC;IAEF,OAAO,IAAI,CACT;QACE,qBAAqB,MAAM,EAAE;QAC7B,EAAE;QACF,GAAG,OAAO,CAAC,MAAM,+DAA+D;QAChF,mDAAmD;QACnD,EAAE;QACF,GAAG,KAAK;QACR,EAAE;QACF,KAAK;QACL,EAAE;QACF,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,WAAW,CAAC;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,+EAA+E;AAE/E,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;IACE,KAAK,EAAE,0BAA0B;IACjC,WAAW,EACT,iRAAiR;IACnR,WAAW,EAAE;QACX,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,CAAC,iEAAiE,CAAC;QAC9E,KAAK,EAAE,CAAC;aACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;QACzE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;QAClF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QAClF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KAClF;CACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;IACrD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;QACtD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM;YAC/B,CAAC,CAAC,iBAAiB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACrF,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,IAAI,CACT,yBAAyB,KAAK,KAAK,GAAG,MAAM;YAC1C,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;gBACrB,CAAC,CAAC,WAAW,MAAM,CAAC,YAAY,oBAC5B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBACrC,EAAE;gBACJ,CAAC,CAAC,iEAAiE,CAAC,CACzE,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CACT,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG;QAC9E,QAAQ,MAAM,CAAC,YAAY,wBAAwB,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CACrF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;IACE,KAAK,EAAE,mCAAmC;IAC1C,WAAW,EACT,4RAA4R;IAC9R,WAAW,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;CAChC,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACf,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,IAAI,CACT,mFAAmF;YACjF,6DAA6D,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,MAAM,iBAAiB,CAC1E,MAAM,EACN,MAAM,CAAC,QAAQ,CAChB,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,IAAI,CACT;YACE,kCAAkC,MAAM,CAAC,KAAK,IAAI;YAClD,EAAE;YACF,QAAQ;YACR,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,EAAE;YACF,aAAa,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,EAAE;YAC7D,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACtC,MAAM,MAAM,GACV,MAAM,CAAC,UAAU,KAAK,OAAO;YAC3B,CAAC,CAAC,gFAAgF;YAClF,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,QAAQ;gBAC9B,CAAC,CAAC,yFAAyF;gBAC3F,CAAC,CAAC,qFAAqF,CAAC;QAE9F,OAAO;YACL,MAAM,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,KAAK,IAAI;YACzC,EAAE;YACF,IAAI,MAAM,GAAG;YACb,EAAE;YACF,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,CAAC,CACF,CAAC;AAEF,8EAA8E;AAE9E,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;IACE,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EACT,kJAAkJ;IACpJ,WAAW,EAAE;QACX,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KACzE;CACF,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IACrB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;IAEzD,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,IAAI,CACT,WAAW,MAAM,CAAC,KAAK,+DAA+D,CACvF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,8EAA8E;AAE9E,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACnB,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,mBAAmB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7D,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAEjF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC5B,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,GAAG,CAAC,2BAA2B,CAAC,CAAC;AACnC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAChG,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -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":"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"}
@@ -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 = 200;
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, one level deep for directories. */
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
- for (const entry of await readdir(path, { withFileTypes: true })) {
38
- if (!entry.isFile())
39
- continue;
40
- if (!/\.(log|txt|out)$/i.test(entry.name))
41
- continue;
42
- files.push(join(path, entry.name));
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
- async function searchFile(file, needle, matches) {
59
- const stream = createReadStream(file, { encoding: 'utf8' });
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 line of lines) {
86
+ for await (const raw of lines) {
64
87
  lineNumber++;
65
- if (!line.includes(needle))
66
- continue;
67
- matches.push({
68
- file,
69
- line: lineNumber,
70
- text: line.length > MAX_LINE_CHARS ? `${line.slice(0, MAX_LINE_CHARS)}…` : line,
71
- });
72
- if (matches.length >= MAX_MATCHES)
73
- break;
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
- stream.destroy();
124
+ source.destroy();
79
125
  }
126
+ return { matches, linesScanned: lineNumber };
80
127
  }
81
128
  /**
82
- * Searches the configured logs for a literal string — normally a request id.
129
+ * Searches the configured logs for a literal string.
83
130
  *
84
- * @param extraPaths Caller-supplied paths, honoured only if they sit inside the
85
- * configured allowlist.
131
+ * @param configuredPaths The allowlist from BUGTRACKER_LOG_PATHS.
86
132
  */
87
- export async function findInLogs(needle, configuredPaths, extraPaths = []) {
88
- if (!needle.trim()) {
89
- return { matches: [], filesSearched: [], skipped: [], truncated: false };
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
- matches: [],
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 = extraPaths.length ? extraPaths : configuredPaths;
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, matches);
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: matches.length >= MAX_MATCHES,
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":"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"}
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,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,iEAAiE;AACjE,MAAM,cAAc,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AACzC,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,gFAAgF;AAChF,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,WAAW,GAAG,+CAA+C,CAAC;AAmCpE,gEAAgE;AAChE,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,KAAe;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,KAAK,UAAU,YAAY,CACzB,KAAe,EACf,KAAK,GAAG,CAAC;IAET,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAA+B,EAAE,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAE9B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,KAAK,IAAI,aAAa;oBAAE,SAAS;gBACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,OAAO;qBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;qBAC1E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBACpD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC/B,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,cAAc,GAAG,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;gBACvF,SAAS;YACX,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACnF,CAAC;AAOD;;;;;;GAMG;AACH,KAAK,UAAU,UAAU,CACvB,IAAY,EACZ,MAAc,EACd,OACwC;IAExC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,mDAAmD;IACnD,IAAI,OAAO,GAA6C,EAAE,CAAC;IAC3D,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YAC9B,UAAU,EAAE,CAAC;YAEb,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClC,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAEvD,wEAAwE;YACxE,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,KAAK,KAAK,IAAI;gBAAE,aAAa,GAAG,KAAK,CAAC;YAC1C,MAAM,SAAS,GAAG,KAAK,IAAI,aAAa,CAAC;YAEzC,MAAM,QAAQ,GACZ,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;gBAClE,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;YAE3F,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAa;oBACtB,IAAI;oBACJ,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;oBACf,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;oBAC5C,KAAK,EAAE,EAAE;oBACT,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxD,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBACD,sEAAsE;gBACtE,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK;oBAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YACtD,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,IAAI,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,aAAa;gBAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,eAAyB,EACzB,UAAyB,EAAE;IAE3B,MAAM,KAAK,GAAoB;QAC7B,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,EAAE;QACjB,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,KAAK;QAChB,YAAY,EAAE,CAAC;KAChB,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,GAAG,KAAK;YACR,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;SACpF,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC;IAC1E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAA+B,EAAE,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;YAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;IAC3C,MAAM,IAAI,GAAG;QACX,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;QACxC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,CAAC;QACzC,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC;IAEF,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IACnE,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;IAEzC,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAChC,aAAa,EAAE,QAAQ;QACvB,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,UAAU,CAAC;QACpC,SAAS;QACT,YAAY;KACb,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbit360.lk/bugtracker-mcp",
3
- "version": "0.1.0",
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",