@monotykamary/localterm-server 1.41.4 → 1.41.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ import type { AutomationFinding, AutomationFindingSeverity, FindingState } from "./types.js";
2
+ export declare class FindingStore {
3
+ private readonly filePath;
4
+ private findings;
5
+ constructor(filePath: string);
6
+ list(state?: FindingState): AutomationFinding[];
7
+ get(id: string): AutomationFinding | null;
8
+ findByDedupKey(automationId: string, dedupKey: string): AutomationFinding | null;
9
+ findOpenByAutomation(automationId: string): AutomationFinding[];
10
+ size(): number;
11
+ openCount(): number;
12
+ upsert(automationId: string, severity: AutomationFindingSeverity, title: string, dedupKey: string, sourceRunId: string | null, now?: number): AutomationFinding;
13
+ resolve(id: string, now?: number): AutomationFinding | null;
14
+ resolveAllByAutomation(automationId: string, now?: number): number;
15
+ dismiss(id: string): AutomationFinding | null;
16
+ markRead(id: string): AutomationFinding | null;
17
+ pruneResolved(now?: number): number;
18
+ private load;
19
+ private persist;
20
+ }
21
+ //# sourceMappingURL=finding-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-store.d.ts","sourceRoot":"","sources":["../src/finding-store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7F,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,QAAQ,CAA2B;gBAEd,QAAQ,EAAE,MAAM;IAI7C,IAAI,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,iBAAiB,EAAE;IAK/C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAIzC,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAWhF,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAM/D,IAAI,IAAI,MAAM;IAId,SAAS,IAAI,MAAM;IAInB,MAAM,CACJ,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,yBAAyB,EACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,GAAG,GAAE,MAAmB,GACvB,iBAAiB;IAwCpB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,iBAAiB,GAAG,IAAI;IAWvE,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM;IAY9E,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAS7C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAQ9C,aAAa,CAAC,GAAG,GAAE,MAAmB,GAAG,MAAM;IAW/C,OAAO,CAAC,IAAI;IAsBZ,OAAO,CAAC,OAAO;CAOhB"}
@@ -0,0 +1,155 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { FINDING_RESOLVED_PRUNE_AGE_MS, FINDINGS_FILE_VERSION, MAX_AUTOMATION_FINDING_DEDUP_KEY_LENGTH, MAX_AUTOMATION_FINDING_TITLE_LENGTH, MAX_AUTOMATION_FINDINGS_TOTAL, } from "./constants.js";
5
+ import { findingsFileSchema } from "./schemas.js";
6
+ export class FindingStore {
7
+ filePath;
8
+ findings = [];
9
+ constructor(filePath) {
10
+ this.filePath = filePath;
11
+ this.load();
12
+ }
13
+ list(state) {
14
+ if (state === undefined)
15
+ return [...this.findings];
16
+ return this.findings.filter((finding) => finding.state === state);
17
+ }
18
+ get(id) {
19
+ return this.findings.find((finding) => finding.id === id) ?? null;
20
+ }
21
+ findByDedupKey(automationId, dedupKey) {
22
+ return (this.findings.find((finding) => finding.automationId === automationId &&
23
+ finding.dedupKey === dedupKey &&
24
+ (finding.state === "open" || finding.state === "resolved")) ?? null);
25
+ }
26
+ findOpenByAutomation(automationId) {
27
+ return this.findings.filter((finding) => finding.automationId === automationId && finding.state === "open");
28
+ }
29
+ size() {
30
+ return this.findings.length;
31
+ }
32
+ openCount() {
33
+ return this.findings.filter((finding) => finding.state === "open").length;
34
+ }
35
+ upsert(automationId, severity, title, dedupKey, sourceRunId, now = Date.now()) {
36
+ const existing = this.findByDedupKey(automationId, dedupKey);
37
+ if (existing) {
38
+ existing.severity = severity;
39
+ existing.title = title.slice(0, MAX_AUTOMATION_FINDING_TITLE_LENGTH);
40
+ existing.sourceRunId = sourceRunId;
41
+ existing.lastSeenAt = now;
42
+ existing.runCount += 1;
43
+ if (existing.state === "resolved") {
44
+ existing.state = "open";
45
+ existing.resolvedAt = null;
46
+ existing.resolvedCount += 1;
47
+ }
48
+ this.persist();
49
+ return existing;
50
+ }
51
+ const finding = {
52
+ id: randomUUID(),
53
+ automationId,
54
+ severity,
55
+ title: title.slice(0, MAX_AUTOMATION_FINDING_TITLE_LENGTH),
56
+ dedupKey: dedupKey.slice(0, MAX_AUTOMATION_FINDING_DEDUP_KEY_LENGTH),
57
+ sourceRunId,
58
+ firstSeenAt: now,
59
+ lastSeenAt: now,
60
+ runCount: 1,
61
+ state: severity === "clear" ? "dismissed" : "open",
62
+ resolvedAt: null,
63
+ resolvedCount: 0,
64
+ read: false,
65
+ };
66
+ this.findings.unshift(finding);
67
+ if (this.findings.length > MAX_AUTOMATION_FINDINGS_TOTAL) {
68
+ this.findings = this.findings.slice(0, MAX_AUTOMATION_FINDINGS_TOTAL);
69
+ }
70
+ this.persist();
71
+ return finding;
72
+ }
73
+ resolve(id, now = Date.now()) {
74
+ const index = this.findings.findIndex((finding) => finding.id === id);
75
+ if (index === -1)
76
+ return null;
77
+ const finding = this.findings[index];
78
+ if (finding.state !== "open")
79
+ return null;
80
+ finding.state = "resolved";
81
+ finding.resolvedAt = now;
82
+ this.persist();
83
+ return finding;
84
+ }
85
+ resolveAllByAutomation(automationId, now = Date.now()) {
86
+ let resolvedCount = 0;
87
+ for (const finding of this.findings) {
88
+ if (finding.automationId !== automationId || finding.state !== "open")
89
+ continue;
90
+ finding.state = "resolved";
91
+ finding.resolvedAt = now;
92
+ resolvedCount += 1;
93
+ }
94
+ if (resolvedCount > 0)
95
+ this.persist();
96
+ return resolvedCount;
97
+ }
98
+ dismiss(id) {
99
+ const index = this.findings.findIndex((finding) => finding.id === id);
100
+ if (index === -1)
101
+ return null;
102
+ const finding = this.findings[index];
103
+ finding.state = "dismissed";
104
+ this.persist();
105
+ return finding;
106
+ }
107
+ markRead(id) {
108
+ const finding = this.get(id);
109
+ if (!finding || finding.state !== "open")
110
+ return null;
111
+ finding.read = true;
112
+ this.persist();
113
+ return finding;
114
+ }
115
+ pruneResolved(now = Date.now()) {
116
+ const cutoff = now - FINDING_RESOLVED_PRUNE_AGE_MS;
117
+ const before = this.findings.length;
118
+ this.findings = this.findings.filter((finding) => finding.state !== "resolved" || (finding.resolvedAt ?? 0) >= cutoff);
119
+ const pruned = before - this.findings.length;
120
+ if (pruned > 0)
121
+ this.persist();
122
+ return pruned;
123
+ }
124
+ load() {
125
+ let raw;
126
+ try {
127
+ raw = fs.readFileSync(this.filePath, "utf8");
128
+ }
129
+ catch {
130
+ return;
131
+ }
132
+ let json;
133
+ try {
134
+ json = JSON.parse(raw);
135
+ }
136
+ catch {
137
+ console.warn(`findings file invalid; starting with an empty list (${this.filePath})`);
138
+ return;
139
+ }
140
+ const parsed = findingsFileSchema.safeParse(json);
141
+ if (parsed.success) {
142
+ this.findings = parsed.data.findings;
143
+ return;
144
+ }
145
+ console.warn(`findings file invalid; starting with an empty list (${this.filePath})`);
146
+ }
147
+ persist() {
148
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true });
149
+ const payload = { version: FINDINGS_FILE_VERSION, findings: this.findings };
150
+ const tmpPath = `${this.filePath}.tmp`;
151
+ fs.writeFileSync(tmpPath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
152
+ fs.renameSync(tmpPath, this.filePath);
153
+ }
154
+ }
155
+ //# sourceMappingURL=finding-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-store.js","sourceRoot":"","sources":["../src/finding-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ParsedFinding {
2
+ severity: "info" | "warn" | "error" | "clear";
3
+ title: string;
4
+ dedupKey: string | null;
5
+ }
6
+ export declare const parseOscFindingsFromChunk: (data: string) => ParsedFinding[];
7
+ //# sourceMappingURL=parse-osc-finding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-osc-finding.d.ts","sourceRoot":"","sources":["../../src/utils/parse-osc-finding.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,yBAAyB,GAAI,MAAM,MAAM,KAAG,aAAa,EA2CrE,CAAC"}
@@ -0,0 +1,55 @@
1
+ // OSC 7888 (localterm automation finding) format:
2
+ // ESC ] 7888 ; automation-finding ; <severity> ; <title> [ ; <dedupKey> ] ST
3
+ // where ST is either BEL (0x07) or ESC \ (0x1b 0x5c).
4
+ //
5
+ // severity is one of: info, warn, error, clear
6
+ // title is a short human-readable summary (e.g. "Tests failing in src/utils")
7
+ // dedupKey is optional; when absent the server synthesizes one from the title
8
+ //
9
+ // Emitted by automation commands to report structured findings back to the
10
+ // server. Multiple findings can be emitted in one session. A severity of
11
+ // "clear" signals that nothing is worth reporting (auto-resolves open findings).
12
+ import { MAX_AUTOMATION_FINDING_TITLE_LENGTH } from "../constants.js";
13
+ const OSC_FINDING_PREFIX = "\x1b]7888;automation-finding;";
14
+ const BEL = "\x07";
15
+ const ST = "\x1b\\";
16
+ const VALID_SEVERITIES = new Set(["info", "warn", "error", "clear"]);
17
+ export const parseOscFindingsFromChunk = (data) => {
18
+ const findings = [];
19
+ let searchFrom = 0;
20
+ while (searchFrom < data.length) {
21
+ const start = data.indexOf(OSC_FINDING_PREFIX, searchFrom);
22
+ if (start === -1)
23
+ break;
24
+ const payloadStart = start + OSC_FINDING_PREFIX.length;
25
+ const belIndex = data.indexOf(BEL, payloadStart);
26
+ const stIndex = data.indexOf(ST, payloadStart);
27
+ let payloadEnd;
28
+ if (belIndex !== -1 && (stIndex === -1 || belIndex < stIndex)) {
29
+ payloadEnd = belIndex;
30
+ }
31
+ else if (stIndex !== -1) {
32
+ payloadEnd = stIndex;
33
+ }
34
+ else {
35
+ break;
36
+ }
37
+ const payload = data.slice(payloadStart, payloadEnd);
38
+ const parts = payload.split(";");
39
+ const severity = parts[0];
40
+ const title = parts.slice(1, -1).join(";") || parts[1] || "";
41
+ const dedupKey = parts.length >= 3 ? parts[parts.length - 1] : null;
42
+ if (VALID_SEVERITIES.has(severity) &&
43
+ title.length > 0 &&
44
+ title.length <= MAX_AUTOMATION_FINDING_TITLE_LENGTH) {
45
+ findings.push({
46
+ severity: severity,
47
+ title,
48
+ dedupKey,
49
+ });
50
+ }
51
+ searchFrom = payloadEnd + 1;
52
+ }
53
+ return findings;
54
+ };
55
+ //# sourceMappingURL=parse-osc-finding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-osc-finding.js","sourceRoot":"","sources":["../../src/utils/parse-osc-finding.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,+EAA+E;AAC/E,sDAAsD;AACtD,EAAE;AACF,+CAA+C;AAC/C,8EAA8E;AAC9E,8EAA8E;AAC9E,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,iFAAiF;AAEjF,OAAO,EAAE,mCAAmC,EAAE,MAAM,iBAAiB,CAAC;AAEtE,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAC3D,MAAM,GAAG,GAAG,MAAM,CAAC;AACnB,MAAM,EAAE,GAAG,QAAQ,CAAC;AAEpB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAQrE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAY,EAAmB,EAAE;IACzE,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,MAAM;QAExB,MAAM,YAAY,GAAG,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAE/C,IAAI,UAAkB,CAAC;QACvB,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;YAC9D,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1B,UAAU,GAAG,OAAO,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpE,IACE,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC9B,KAAK,CAAC,MAAM,GAAG,CAAC;YAChB,KAAK,CAAC,MAAM,IAAI,mCAAmC,EACnD,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,QAAqC;gBAC/C,KAAK;gBACL,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monotykamary/localterm-server",
3
- "version": "1.41.4",
3
+ "version": "1.41.6",
4
4
  "description": "PTY-backed HTTP/WebSocket server that powers localterm, built on Hono + node-pty.",
5
5
  "keywords": [
6
6
  "hono",