@tailormade/seq-mcp 1.1.1

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.
Files changed (54) hide show
  1. package/README.md +121 -0
  2. package/dist/api/client.d.ts +63 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +176 -0
  5. package/dist/api/client.js.map +1 -0
  6. package/dist/api/formatter.d.ts +4 -0
  7. package/dist/api/formatter.d.ts.map +1 -0
  8. package/dist/api/formatter.js +214 -0
  9. package/dist/api/formatter.js.map +1 -0
  10. package/dist/api/history.d.ts +26 -0
  11. package/dist/api/history.d.ts.map +1 -0
  12. package/dist/api/history.js +122 -0
  13. package/dist/api/history.js.map +1 -0
  14. package/dist/api/prefs.d.ts +12 -0
  15. package/dist/api/prefs.d.ts.map +1 -0
  16. package/dist/api/prefs.js +59 -0
  17. package/dist/api/prefs.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +44 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/tools/history.d.ts +3 -0
  23. package/dist/tools/history.d.ts.map +1 -0
  24. package/dist/tools/history.js +78 -0
  25. package/dist/tools/history.js.map +1 -0
  26. package/dist/tools/live.d.ts +4 -0
  27. package/dist/tools/live.d.ts.map +1 -0
  28. package/dist/tools/live.js +26 -0
  29. package/dist/tools/live.js.map +1 -0
  30. package/dist/tools/prefs.d.ts +3 -0
  31. package/dist/tools/prefs.d.ts.map +1 -0
  32. package/dist/tools/prefs.js +34 -0
  33. package/dist/tools/prefs.js.map +1 -0
  34. package/dist/tools/query.d.ts +4 -0
  35. package/dist/tools/query.d.ts.map +1 -0
  36. package/dist/tools/query.js +220 -0
  37. package/dist/tools/query.js.map +1 -0
  38. package/dist/tools/recent.d.ts +4 -0
  39. package/dist/tools/recent.d.ts.map +1 -0
  40. package/dist/tools/recent.js +31 -0
  41. package/dist/tools/recent.js.map +1 -0
  42. package/dist/tools/search.d.ts +4 -0
  43. package/dist/tools/search.d.ts.map +1 -0
  44. package/dist/tools/search.js +42 -0
  45. package/dist/tools/search.js.map +1 -0
  46. package/dist/tools/signals.d.ts +4 -0
  47. package/dist/tools/signals.d.ts.map +1 -0
  48. package/dist/tools/signals.js +19 -0
  49. package/dist/tools/signals.js.map +1 -0
  50. package/dist/tools/stream.d.ts +4 -0
  51. package/dist/tools/stream.d.ts.map +1 -0
  52. package/dist/tools/stream.js +36 -0
  53. package/dist/tools/stream.js.map +1 -0
  54. package/package.json +44 -0
package/README.md ADDED
@@ -0,0 +1,121 @@
1
+ # @tailormade/seq-mcp
2
+
3
+ MCP server for [Seq](https://datalust.co/seq) structured logging — search, query, signals, live events.
4
+
5
+ ## Stack
6
+
7
+ - TypeScript, Node.js >= 20
8
+ - [@modelcontextprotocol/sdk](https://www.npmjs.com/package/@modelcontextprotocol/sdk) ^1.5.0
9
+ - [Zod](https://www.npmjs.com/package/zod) ^4.3.6
10
+
11
+ ## Setup
12
+
13
+ ```bash
14
+ npm install @tailormade/seq-mcp
15
+ ```
16
+
17
+ Set environment variables:
18
+
19
+ ```
20
+ SEQ_SERVER_URL=https://your-seq-server
21
+ SEQ_API_KEY=your-api-key
22
+ ```
23
+
24
+ ### Claude Desktop / MCP config
25
+
26
+ ```json
27
+ {
28
+ "mcpServers": {
29
+ "seq": {
30
+ "command": "node",
31
+ "args": ["node_modules/@tailormade/seq-mcp/dist/index.js"],
32
+ "env": {
33
+ "SEQ_SERVER_URL": "https://your-seq-server",
34
+ "SEQ_API_KEY": "your-api-key"
35
+ }
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ ## API Key Permissions
42
+
43
+ The API key needs specific Seq permissions depending on which tools you want to use:
44
+
45
+ | Permission | Tools |
46
+ |------------|-------|
47
+ | **Read** | All tools |
48
+
49
+ Minimum required: **Read**.
50
+
51
+ ## Tools
52
+
53
+ | Tool | Description | Default format |
54
+ |------|-------------|---------------|
55
+ | `seq_search` | Search events by filter, signal, date range | compact |
56
+ | `seq_get_event` | Get single event by ID with full details | detail |
57
+ | `seq_recent` | Fetch most recent events, supports polling with afterId | compact |
58
+ | `seq_stream` | Long-poll for new events (real-time monitoring) | compact |
59
+ | `seq_signals` | List all shared signals (cached 10 min) | table |
60
+ | `seq_query` | Execute SQL queries (`select ... from stream`) | table |
61
+ | `seq_expression_indexes` | List expression indexes | table |
62
+ | `seq_fields` | Discover fields by sampling events (cached 10 min) | - |
63
+ | `seq_query_help` | Inline filter + SQL reference docs | - |
64
+ | `seq_prefs` | Show current preferences | - |
65
+ | `seq_prefs_update` | Update a preference | - |
66
+ | `seq_history` | Show cached query history and discovered systems | - |
67
+ | `seq_history_clear` | Clear history cache (all, queries, systems, or specific) | - |
68
+
69
+ ## Output Formats
70
+
71
+ All event tools support a `format` parameter: `compact`, `table`, `detail`, `raw`.
72
+
73
+ Default format is configurable via `seq_prefs_update key=defaultFormat value=compact`.
74
+
75
+ ## Preferences
76
+
77
+ Stored in `~/.seq-mcp-prefs.json`:
78
+
79
+ | Key | Default | Description |
80
+ |-----|---------|-------------|
81
+ | `defaultFormat` | `compact` | Default output format for event tools |
82
+ | `maxMessageLength` | `120` | Truncate messages in compact/table mode |
83
+ | `hideFields` | `ProcessId,ThreadId,EventId` | Fields hidden in detail view |
84
+ | `historyQueryKeepDays` | `60` | Auto-prune query history older than N days |
85
+ | `historySystemKeepDays` | `60` | Auto-prune system entries older than N days |
86
+ | `maxHistoryQueries` | `500` | Max query entries to keep in history |
87
+
88
+ ## Architecture
89
+
90
+ ```
91
+ src/
92
+ ├── index.ts Entry point — MCP server + tool registration
93
+ ├── api/
94
+ │ ├── client.ts SeqClient — HTTP calls + caching
95
+ │ ├── formatter.ts Event/signal formatting (compact/table/detail/raw)
96
+ │ ├── prefs.ts Preferences (~/.seq-mcp-prefs.json)
97
+ │ └── history.ts History cache (~/.seq-mcp-history-{hostname}.json)
98
+ └── tools/
99
+ ├── search.ts seq_search, seq_get_event
100
+ ├── signals.ts seq_signals
101
+ ├── recent.ts seq_recent
102
+ ├── stream.ts seq_stream
103
+ ├── query.ts seq_query, seq_query_help, seq_expression_indexes, seq_fields
104
+ ├── prefs.ts seq_prefs, seq_prefs_update
105
+ └── history.ts seq_history, seq_history_clear
106
+ ```
107
+
108
+ ## References
109
+
110
+ - [Seq HTTP API](https://datalust.co/docs/server-http-api) — Datalust
111
+ - [Seq SQL query syntax](https://datalust.co/docs/sql-queries) — Datalust
112
+ - [seq-api C# client](https://github.com/datalust/seq-api) — Datalust (reference for endpoint behavior)
113
+ - [MCP specification](https://modelcontextprotocol.io/) — Anthropic
114
+
115
+ ## Known limitations
116
+
117
+ - `afterId` on `/api/events/scan` scans backwards, not forward — use `seq_recent` for forward polling
118
+ - `seq_stream` with very short wait + non-matching filter can cause fetch timeout
119
+ - SQL `distinct()` over full stream may timeout — always set `rangeStartUtc`
120
+ - `seq_fields` discovers fields by sampling — fields that appear rarely may be missed with small sample sizes
121
+ - Properties format varies between Seq versions (array vs object) — formatter handles both
@@ -0,0 +1,63 @@
1
+ export interface SeqClientOptions {
2
+ serverUrl: string;
3
+ apiKey: string;
4
+ }
5
+ export interface QueryResult {
6
+ Columns?: string[];
7
+ Rows?: unknown[][];
8
+ Error?: string;
9
+ Reasons?: string[];
10
+ Suggestion?: string;
11
+ }
12
+ export interface ExpressionIndex {
13
+ Id: string;
14
+ Expression: string;
15
+ Description?: string;
16
+ }
17
+ export declare class SeqClient {
18
+ private baseUrl;
19
+ private apiKey;
20
+ private signalsCache;
21
+ private indexesCache;
22
+ private fieldValuesCache;
23
+ private CACHE_TTL;
24
+ constructor(opts: SeqClientOptions);
25
+ private request;
26
+ private post;
27
+ private requestNdjson;
28
+ search(opts: {
29
+ filter?: string;
30
+ signal?: string;
31
+ count?: number;
32
+ startedAt?: string;
33
+ endedAt?: string;
34
+ }): Promise<unknown[]>;
35
+ getEvent(eventId: string): Promise<unknown>;
36
+ listSignals(): Promise<unknown[]>;
37
+ recent(opts: {
38
+ filter?: string;
39
+ signal?: string;
40
+ count?: number;
41
+ afterId?: string;
42
+ }): Promise<unknown[]>;
43
+ scan(opts: {
44
+ filter?: string;
45
+ signal?: string;
46
+ count?: number;
47
+ afterId?: string;
48
+ wait?: number;
49
+ }): Promise<unknown[]>;
50
+ query(opts: {
51
+ q: string;
52
+ rangeStartUtc?: string;
53
+ rangeEndUtc?: string;
54
+ signal?: string;
55
+ timeout?: number;
56
+ }): Promise<QueryResult>;
57
+ listExpressionIndexes(): Promise<ExpressionIndex[]>;
58
+ discoverFields(filter: string, sampleSize?: number): Promise<{
59
+ fields: Record<string, Set<string>>;
60
+ sampleCount: number;
61
+ }>;
62
+ }
63
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAOD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,gBAAgB,CAA+F;IACvH,OAAO,CAAC,SAAS,CAAkB;gBAEvB,IAAI,EAAE,gBAAgB;YAKpB,OAAO;YAeP,IAAI;YAqBJ,aAAa;IAiBrB,MAAM,CAAC,IAAI,EAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAUhB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3C,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAUjC,MAAM,CAAC,IAAI,EAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAShB,IAAI,CAAC,IAAI,EAAE;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAUhB,KAAK,CAAC,IAAI,EAAE;QAChB,CAAC,EAAE,MAAM,CAAC;QACV,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,WAAW,CAAC;IASlB,qBAAqB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAUnD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,SAAK,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CA4B7H"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SeqClient = void 0;
4
+ class SeqClient {
5
+ baseUrl;
6
+ apiKey;
7
+ signalsCache = null;
8
+ indexesCache = null;
9
+ fieldValuesCache = new Map();
10
+ CACHE_TTL = 10 * 60 * 1000;
11
+ constructor(opts) {
12
+ this.baseUrl = opts.serverUrl.replace(/\/+$/, "");
13
+ this.apiKey = opts.apiKey;
14
+ }
15
+ async request(path, params = {}) {
16
+ const url = new URL(path, this.baseUrl);
17
+ for (const [k, v] of Object.entries(params)) {
18
+ if (v !== undefined && v !== "")
19
+ url.searchParams.set(k, v);
20
+ }
21
+ const res = await fetch(url.toString(), {
22
+ headers: { "X-Seq-ApiKey": this.apiKey },
23
+ });
24
+ if (!res.ok) {
25
+ const body = await res.text();
26
+ throw new Error(`Seq API ${res.status}: ${body}`);
27
+ }
28
+ return res.json();
29
+ }
30
+ async post(path, params = {}, body) {
31
+ const url = new URL(path, this.baseUrl);
32
+ for (const [k, v] of Object.entries(params)) {
33
+ if (v !== undefined && v !== "")
34
+ url.searchParams.set(k, v);
35
+ }
36
+ const res = await fetch(url.toString(), {
37
+ method: "POST",
38
+ headers: { "X-Seq-ApiKey": this.apiKey, "Content-Type": "application/json" },
39
+ body: body ? JSON.stringify(body) : undefined,
40
+ });
41
+ if (!res.ok) {
42
+ // For /api/data, 400 responses contain structured error info — return as-is
43
+ if (res.status === 400) {
44
+ try {
45
+ return await res.json();
46
+ }
47
+ catch { /* fall through */ }
48
+ }
49
+ const text = await res.text();
50
+ throw new Error(`Seq API ${res.status}: ${text}`);
51
+ }
52
+ return res.json();
53
+ }
54
+ async requestNdjson(path, params = {}) {
55
+ const url = new URL(path, this.baseUrl);
56
+ for (const [k, v] of Object.entries(params)) {
57
+ if (v !== undefined && v !== "")
58
+ url.searchParams.set(k, v);
59
+ }
60
+ const res = await fetch(url.toString(), {
61
+ headers: { "X-Seq-ApiKey": this.apiKey },
62
+ });
63
+ if (!res.ok) {
64
+ const body = await res.text();
65
+ throw new Error(`Seq API ${res.status}: ${body}`);
66
+ }
67
+ const text = await res.text();
68
+ if (!text.trim())
69
+ return [];
70
+ return text.trim().split("\n").map((line) => JSON.parse(line));
71
+ }
72
+ async search(opts) {
73
+ const params = {};
74
+ if (opts.filter)
75
+ params.filter = opts.filter;
76
+ if (opts.signal)
77
+ params.signal = opts.signal;
78
+ if (opts.count)
79
+ params.count = String(opts.count);
80
+ if (opts.startedAt)
81
+ params.fromDateUtc = opts.startedAt;
82
+ if (opts.endedAt)
83
+ params.toDateUtc = opts.endedAt;
84
+ return this.request("/api/events", params);
85
+ }
86
+ async getEvent(eventId) {
87
+ return this.request(`/api/events/${eventId}`, { render: "true" });
88
+ }
89
+ async listSignals() {
90
+ const now = Date.now();
91
+ if (this.signalsCache && now - this.signalsCache.fetchedAt < this.CACHE_TTL) {
92
+ return this.signalsCache.data;
93
+ }
94
+ const data = await this.request("/api/signals", { shared: "true" });
95
+ this.signalsCache = { data, fetchedAt: now };
96
+ return data;
97
+ }
98
+ async recent(opts) {
99
+ const params = {};
100
+ if (opts.filter)
101
+ params.filter = opts.filter;
102
+ if (opts.signal)
103
+ params.signal = opts.signal;
104
+ if (opts.count)
105
+ params.count = String(opts.count ?? 10);
106
+ if (opts.afterId)
107
+ params.afterId = opts.afterId;
108
+ return this.request("/api/events", params);
109
+ }
110
+ async scan(opts) {
111
+ const params = {};
112
+ if (opts.filter)
113
+ params.filter = opts.filter;
114
+ if (opts.signal)
115
+ params.signal = opts.signal;
116
+ if (opts.count)
117
+ params.count = String(opts.count ?? 10);
118
+ if (opts.afterId)
119
+ params.afterId = opts.afterId;
120
+ params.wait = String(opts.wait ?? 5000);
121
+ return this.requestNdjson("/api/events/scan", params);
122
+ }
123
+ async query(opts) {
124
+ const params = { q: opts.q };
125
+ if (opts.rangeStartUtc)
126
+ params.rangeStartUtc = opts.rangeStartUtc;
127
+ if (opts.rangeEndUtc)
128
+ params.rangeEndUtc = opts.rangeEndUtc;
129
+ if (opts.signal)
130
+ params.signal = opts.signal;
131
+ if (opts.timeout)
132
+ params.timeoutMS = String(opts.timeout);
133
+ return this.post("/api/data", params, {});
134
+ }
135
+ async listExpressionIndexes() {
136
+ const now = Date.now();
137
+ if (this.indexesCache && now - this.indexesCache.fetchedAt < this.CACHE_TTL) {
138
+ return this.indexesCache.data;
139
+ }
140
+ const data = await this.request("/api/expressionindexes", {});
141
+ this.indexesCache = { data, fetchedAt: now };
142
+ return data;
143
+ }
144
+ async discoverFields(filter, sampleSize = 20) {
145
+ const now = Date.now();
146
+ const cacheKey = `${filter}:${sampleSize}`;
147
+ const cached = this.fieldValuesCache.get(cacheKey);
148
+ if (cached && now - cached.fetchedAt < this.CACHE_TTL)
149
+ return cached.data;
150
+ const events = await this.search({ filter, count: sampleSize });
151
+ const fields = {};
152
+ for (const raw of events) {
153
+ const e = raw;
154
+ let props = {};
155
+ if (Array.isArray(e.Properties)) {
156
+ for (const { Name, Value } of e.Properties)
157
+ props[Name] = Value;
158
+ }
159
+ else if (e.Properties) {
160
+ props = e.Properties;
161
+ }
162
+ for (const [k, v] of Object.entries(props)) {
163
+ if (!fields[k])
164
+ fields[k] = new Set();
165
+ const val = v == null ? "" : String(v);
166
+ if (val && fields[k].size < 20)
167
+ fields[k].add(val);
168
+ }
169
+ }
170
+ const result = { fields, sampleCount: events.length };
171
+ this.fieldValuesCache.set(cacheKey, { data: result, fetchedAt: now });
172
+ return result;
173
+ }
174
+ }
175
+ exports.SeqClient = SeqClient;
176
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type FormatMode = "compact" | "table" | "detail" | "raw";
2
+ export declare function formatEvents(events: unknown[], mode: FormatMode): string;
3
+ export declare function formatSignals(signals: unknown[], mode: FormatMode): string;
4
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/api/formatter.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAoLhE,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAkBxE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAqC1E"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatEvents = formatEvents;
4
+ exports.formatSignals = formatSignals;
5
+ const prefs_js_1 = require("./prefs.js");
6
+ function props(e) {
7
+ const p = e.Properties;
8
+ if (!p)
9
+ return {};
10
+ if (Array.isArray(p)) {
11
+ const obj = {};
12
+ for (const { Name, Value } of p)
13
+ obj[Name] = Value;
14
+ return obj;
15
+ }
16
+ return p;
17
+ }
18
+ function ts(raw) {
19
+ if (!raw)
20
+ return "??:??:??";
21
+ const d = new Date(raw);
22
+ return d.toISOString().slice(11, 19);
23
+ }
24
+ function tsLong(raw) {
25
+ if (!raw)
26
+ return "unknown";
27
+ return raw.replace("T", " ").replace(/\.\d+Z?$/, " UTC");
28
+ }
29
+ function lvl(raw) {
30
+ if (!raw)
31
+ return "???";
32
+ const map = {
33
+ Error: "ERR", Fatal: "FTL", Warning: "WRN",
34
+ Information: "INF", Debug: "DBG", Verbose: "VRB",
35
+ };
36
+ return map[raw] ?? raw.slice(0, 3).toUpperCase();
37
+ }
38
+ function system(e) {
39
+ const p = props(e);
40
+ return String(p.System ?? p.ApplicationName ?? p.Application ?? "");
41
+ }
42
+ function reqPath(e) {
43
+ return String(props(e).RequestPath ?? "");
44
+ }
45
+ function renderTokens(tokens, p) {
46
+ if (!tokens)
47
+ return "";
48
+ return tokens.map((t) => {
49
+ if (t.Text != null)
50
+ return t.Text;
51
+ if (t.PropertyName) {
52
+ if (t.FormattedValue != null)
53
+ return t.FormattedValue;
54
+ const val = p[t.PropertyName];
55
+ return val == null ? "" : String(val);
56
+ }
57
+ return "";
58
+ }).join("");
59
+ }
60
+ function message(e, maxLen) {
61
+ let msg = e.RenderedMessage ?? "";
62
+ if (!msg && e.MessageTemplateTokens) {
63
+ msg = renderTokens(e.MessageTemplateTokens, props(e));
64
+ }
65
+ msg = msg.replace(/\r?\n/g, " ").trim();
66
+ if (maxLen > 0 && msg.length > maxLen)
67
+ msg = msg.slice(0, maxLen) + "...";
68
+ return msg;
69
+ }
70
+ function exceptionHead(e, lines = 3) {
71
+ if (!e.Exception)
72
+ return "";
73
+ return e.Exception.split(/\r?\n/).slice(0, lines).join("\n");
74
+ }
75
+ function formatCompact(events, maxLen) {
76
+ if (events.length === 0)
77
+ return "No events.";
78
+ const first = ts(events[events.length - 1]?.Timestamp);
79
+ const last = ts(events[0]?.Timestamp);
80
+ const lines = [`${events.length} events | ${first} - ${last}`, ""];
81
+ for (const e of events) {
82
+ const sys = system(e);
83
+ const path = reqPath(e);
84
+ const parts = [ts(e.Timestamp), lvl(e.Level)];
85
+ if (sys)
86
+ parts.push(sys);
87
+ if (path)
88
+ parts.push(path);
89
+ lines.push(parts.join(" "));
90
+ const msg = message(e, maxLen);
91
+ if (msg)
92
+ lines.push(` ${msg}`);
93
+ const exc = exceptionHead(e);
94
+ if (exc)
95
+ lines.push(` ${exc.split("\n").join("\n ")}`);
96
+ lines.push("");
97
+ }
98
+ return lines.join("\n").trimEnd();
99
+ }
100
+ function formatTable(events, maxLen) {
101
+ if (events.length === 0)
102
+ return "No events.";
103
+ const rows = events.map((e) => ({
104
+ time: ts(e.Timestamp),
105
+ level: lvl(e.Level),
106
+ sys: system(e),
107
+ path: reqPath(e),
108
+ msg: message(e, maxLen),
109
+ }));
110
+ const w = {
111
+ time: 8,
112
+ level: 5,
113
+ sys: Math.max(6, ...rows.map((r) => r.sys.length)),
114
+ path: Math.max(4, ...rows.map((r) => r.path.length)),
115
+ };
116
+ const hdr = [
117
+ "Time".padEnd(w.time),
118
+ "Level".padEnd(w.level),
119
+ "System".padEnd(w.sys),
120
+ "Path".padEnd(w.path),
121
+ "Message",
122
+ ].join(" | ");
123
+ const sep = [w.time, w.level, w.sys, w.path, 7].map((n) => "-".repeat(n)).join("-|-");
124
+ const body = rows.map((r) => [
125
+ r.time.padEnd(w.time),
126
+ r.level.padEnd(w.level),
127
+ r.sys.padEnd(w.sys),
128
+ r.path.padEnd(w.path),
129
+ r.msg,
130
+ ].join(" | "));
131
+ return [hdr, sep, ...body].join("\n");
132
+ }
133
+ function formatDetail(event) {
134
+ const prefs = (0, prefs_js_1.loadPrefs)();
135
+ const hide = new Set(prefs.hideFields);
136
+ const lines = [];
137
+ lines.push(`Event: ${event.Id ?? "unknown"}`);
138
+ lines.push(`Time: ${tsLong(event.Timestamp)}`);
139
+ lines.push(`Level: ${event.Level ?? "unknown"}`);
140
+ const sys = system(event);
141
+ if (sys)
142
+ lines.push(`System: ${sys}`);
143
+ lines.push("");
144
+ lines.push("Message:");
145
+ lines.push(` ${message(event, 0)}`);
146
+ if (event.Exception) {
147
+ lines.push("");
148
+ lines.push("Exception:");
149
+ lines.push(` ${event.Exception.split(/\r?\n/).join("\n ")}`);
150
+ }
151
+ const p = props(event);
152
+ const shown = Object.entries(p).filter(([k]) => !hide.has(k));
153
+ if (shown.length > 0) {
154
+ lines.push("");
155
+ lines.push("Properties:");
156
+ for (const [k, v] of shown) {
157
+ const val = typeof v === "string" ? v : JSON.stringify(v);
158
+ lines.push(` ${k}: ${val}`);
159
+ }
160
+ }
161
+ return lines.join("\n");
162
+ }
163
+ function formatEvents(events, mode) {
164
+ const prefs = (0, prefs_js_1.loadPrefs)();
165
+ const maxLen = mode === "detail" ? 0 : prefs.maxMessageLength;
166
+ const typed = events;
167
+ switch (mode) {
168
+ case "raw":
169
+ return JSON.stringify(events, null, 2);
170
+ case "compact":
171
+ return formatCompact(typed, maxLen);
172
+ case "table":
173
+ return formatTable(typed, maxLen);
174
+ case "detail":
175
+ if (typed.length === 1)
176
+ return formatDetail(typed[0]);
177
+ return typed.map((e) => formatDetail(e)).join("\n\n---\n\n");
178
+ default:
179
+ throw new Error(`Unknown format mode: ${mode}`);
180
+ }
181
+ }
182
+ function formatSignals(signals, mode) {
183
+ if (mode === "raw")
184
+ return JSON.stringify(signals, null, 2);
185
+ const typed = signals;
186
+ if (typed.length === 0)
187
+ return "No signals.";
188
+ if (mode === "detail") {
189
+ return typed.map((s) => {
190
+ const lines = [`Signal: ${s.Id ?? "?"}`, `Title: ${s.Title ?? ""}`];
191
+ if (s.Description)
192
+ lines.push(`Desc: ${s.Description}`);
193
+ const filters = s.Filters?.map((f) => f.Filter).filter(Boolean) ?? [];
194
+ if (filters.length)
195
+ lines.push(`Filter: ${filters.join(" | ")}`);
196
+ return lines.join("\n");
197
+ }).join("\n\n");
198
+ }
199
+ // table or compact → table
200
+ const rows = typed.map((s) => ({
201
+ id: s.Id ?? "?",
202
+ title: s.Title ?? "",
203
+ filter: s.Filters?.map((f) => f.Filter).filter(Boolean).join(" | ") ?? "",
204
+ }));
205
+ const w = {
206
+ id: Math.max(2, ...rows.map((r) => r.id.length)),
207
+ title: Math.max(5, ...rows.map((r) => r.title.length)),
208
+ };
209
+ const hdr = ["ID".padEnd(w.id), "Title".padEnd(w.title), "Filter"].join(" | ");
210
+ const sep = [w.id, w.title, 6].map((n) => "-".repeat(n)).join("-|-");
211
+ const body = rows.map((r) => [r.id.padEnd(w.id), r.title.padEnd(w.title), r.filter].join(" | "));
212
+ return [hdr, sep, ...body].join("\n");
213
+ }
214
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/api/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface QueryEntry {
2
+ filter?: string;
3
+ startedAt?: string;
4
+ endedAt?: string;
5
+ usedAt: string;
6
+ systems: string[];
7
+ }
8
+ export interface SystemEntry {
9
+ properties: string[];
10
+ lastUsed: string;
11
+ }
12
+ export interface SeqHistory {
13
+ queries: QueryEntry[];
14
+ systems: Record<string, SystemEntry>;
15
+ }
16
+ export declare function clearHistory(what: "all" | "queries" | "systems"): void;
17
+ export declare function clearSystem(system: string): boolean;
18
+ export declare function clearQueriesOlderThan(days: number): number;
19
+ export declare function historyFile(): string;
20
+ export declare function loadHistory(): SeqHistory;
21
+ export declare function recordQuery(params: {
22
+ filter?: string;
23
+ startedAt?: string;
24
+ endedAt?: string;
25
+ }, events: unknown[]): void;
26
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/api/history.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACtC;AAiCD,wBAAgB,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAKtE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,WAAW,IAAI,UAAU,CAExC;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACjE,MAAM,EAAE,OAAO,EAAE,GAChB,IAAI,CA2CN"}