@aayambansal/squint 0.4.6 → 0.4.7
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 +3 -0
- package/dist/App-HWMVSRMF.js +23 -0
- package/dist/{cdp-OYRHOPVP.js → cdp-PBQKXC6R.js} +1 -1
- package/dist/{chunk-O2S6PAJE.js → chunk-7CAGWFAQ.js} +1 -1
- package/dist/chunk-7MOKOZOR.js +1415 -0
- package/dist/{chunk-XEQ6JXXL.js → chunk-AUJJGMZG.js} +1 -1
- package/dist/{chunk-X2RZJT4L.js → chunk-HC4E42SV.js} +11 -5
- package/dist/chunk-M25IQ7C7.js +587 -0
- package/dist/chunk-NX7XQY2X.js +147 -0
- package/dist/{chunk-D7Q3M6PA.js → chunk-ZSDCMYZR.js} +6 -6
- package/dist/cli.js +260 -2113
- package/dist/{preview-XREFPMHX.js → preview-WT34NVCH.js} +3 -3
- package/dist/remote-6O6FPTUF.js +114 -0
- package/dist/{sandbox-J2NCPYHJ.js → sandbox-MK7Q2YNO.js} +1 -1
- package/dist/shots-OKWOYF7F.js +2 -2
- package/dist/{state-QOS7WCZO.js → state-PLY7YAD2.js} +1 -1
- package/dist/variants-3IEP7DFY.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
Session
|
|
4
|
+
} from "./chunk-7MOKOZOR.js";
|
|
5
|
+
|
|
6
|
+
// src/daemon/client.ts
|
|
7
|
+
import net from "net";
|
|
8
|
+
function connectDaemon(sock, timeoutMs = 3e3) {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const socket = net.createConnection(sock);
|
|
11
|
+
const timer = setTimeout(() => {
|
|
12
|
+
socket.destroy();
|
|
13
|
+
reject(new Error(`no daemon listening at ${sock}`));
|
|
14
|
+
}, timeoutMs);
|
|
15
|
+
const handlers = [];
|
|
16
|
+
let buffer = "";
|
|
17
|
+
socket.on("connect", () => {
|
|
18
|
+
clearTimeout(timer);
|
|
19
|
+
resolve({
|
|
20
|
+
send: (msg) => socket.write(`${JSON.stringify(msg)}
|
|
21
|
+
`),
|
|
22
|
+
onMessage: (handler) => handlers.push(handler),
|
|
23
|
+
close: () => socket.destroy()
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
socket.on("error", (error) => {
|
|
27
|
+
clearTimeout(timer);
|
|
28
|
+
reject(error);
|
|
29
|
+
});
|
|
30
|
+
socket.on("data", (chunk) => {
|
|
31
|
+
buffer += chunk.toString();
|
|
32
|
+
let idx;
|
|
33
|
+
while ((idx = buffer.indexOf("\n")) >= 0) {
|
|
34
|
+
const line = buffer.slice(0, idx);
|
|
35
|
+
buffer = buffer.slice(idx + 1);
|
|
36
|
+
if (!line.trim()) continue;
|
|
37
|
+
try {
|
|
38
|
+
const msg = JSON.parse(line);
|
|
39
|
+
for (const handler of handlers) handler(msg);
|
|
40
|
+
} catch {
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// src/daemon/server.ts
|
|
48
|
+
import crypto from "crypto";
|
|
49
|
+
import fs from "fs";
|
|
50
|
+
import net2 from "net";
|
|
51
|
+
import os from "os";
|
|
52
|
+
import path from "path";
|
|
53
|
+
var MAX_ITEMS_SENT = 200;
|
|
54
|
+
function socketPath(cwd) {
|
|
55
|
+
const direct = path.join(cwd, ".squint", "daemon.sock");
|
|
56
|
+
if (Buffer.byteLength(direct) <= 96) return direct;
|
|
57
|
+
const hash = crypto.createHash("sha256").update(cwd).digest("hex").slice(0, 12);
|
|
58
|
+
return path.join(os.tmpdir(), `squint-${hash}.sock`);
|
|
59
|
+
}
|
|
60
|
+
function startDaemon(opts) {
|
|
61
|
+
const session = new Session(opts);
|
|
62
|
+
const sock = socketPath(opts.cwd);
|
|
63
|
+
fs.mkdirSync(path.dirname(sock), { recursive: true });
|
|
64
|
+
fs.rmSync(sock, { force: true });
|
|
65
|
+
const clients = [];
|
|
66
|
+
const driver = () => clients[0];
|
|
67
|
+
const serialize = () => {
|
|
68
|
+
const state = session.getState();
|
|
69
|
+
return `${JSON.stringify({ type: "state", state: { ...state, items: state.items.slice(-MAX_ITEMS_SENT) } })}
|
|
70
|
+
`;
|
|
71
|
+
};
|
|
72
|
+
const server = net2.createServer((socket) => {
|
|
73
|
+
clients.push(socket);
|
|
74
|
+
const role = socket === driver() ? "driver" : "observer";
|
|
75
|
+
socket.write(`${JSON.stringify({ type: "hello", role, engineId: session.getState().engineId })}
|
|
76
|
+
`);
|
|
77
|
+
socket.write(serialize());
|
|
78
|
+
let buffer = "";
|
|
79
|
+
socket.on("data", (chunk) => {
|
|
80
|
+
buffer += chunk.toString();
|
|
81
|
+
let idx;
|
|
82
|
+
while ((idx = buffer.indexOf("\n")) >= 0) {
|
|
83
|
+
const line = buffer.slice(0, idx);
|
|
84
|
+
buffer = buffer.slice(idx + 1);
|
|
85
|
+
if (!line.trim()) continue;
|
|
86
|
+
let msg;
|
|
87
|
+
try {
|
|
88
|
+
msg = JSON.parse(line);
|
|
89
|
+
} catch {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (msg.type === "ping") {
|
|
93
|
+
socket.write(`${JSON.stringify({ type: "ping" })}
|
|
94
|
+
`);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (socket !== driver()) {
|
|
98
|
+
socket.write(`${JSON.stringify({ type: "denied", reason: "observer \u2014 the driver steers this session" })}
|
|
99
|
+
`);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (msg.type === "input" && typeof msg.text === "string") session.input(msg.text);
|
|
103
|
+
else if (msg.type === "command" && typeof msg.text === "string") session.command(msg.text);
|
|
104
|
+
else if (msg.type === "interrupt") session.interrupt();
|
|
105
|
+
else if (msg.type === "cycleMode") session.cycleMode();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
const drop = () => {
|
|
109
|
+
const index = clients.indexOf(socket);
|
|
110
|
+
if (index >= 0) clients.splice(index, 1);
|
|
111
|
+
const next = driver();
|
|
112
|
+
if (index === 0 && next && !next.destroyed) {
|
|
113
|
+
next.write(`${JSON.stringify({ type: "hello", role: "driver", engineId: session.getState().engineId })}
|
|
114
|
+
`);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
socket.on("close", drop);
|
|
118
|
+
socket.on("error", drop);
|
|
119
|
+
});
|
|
120
|
+
const unsubscribe = session.subscribe(() => {
|
|
121
|
+
const payload = serialize();
|
|
122
|
+
for (const client of clients) {
|
|
123
|
+
if (!client.destroyed) client.write(payload);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
server.once("error", reject);
|
|
128
|
+
server.listen(sock, () => {
|
|
129
|
+
resolve({
|
|
130
|
+
session,
|
|
131
|
+
clientCount: () => clients.length,
|
|
132
|
+
close: () => {
|
|
133
|
+
unsubscribe();
|
|
134
|
+
for (const client of clients) client.destroy();
|
|
135
|
+
server.close();
|
|
136
|
+
fs.rmSync(sock, { force: true });
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
connectDaemon,
|
|
145
|
+
socketPath,
|
|
146
|
+
startDaemon
|
|
147
|
+
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
ensureSquintIgnore
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-7CAGWFAQ.js";
|
|
5
|
+
import {
|
|
6
|
+
cdpCapture,
|
|
7
|
+
hasWebSocket
|
|
8
|
+
} from "./chunk-HC4E42SV.js";
|
|
5
9
|
import {
|
|
6
10
|
findChrome,
|
|
7
11
|
screenshot
|
|
8
12
|
} from "./chunk-IMDRXXFU.js";
|
|
9
|
-
import {
|
|
10
|
-
cdpCapture,
|
|
11
|
-
hasWebSocket
|
|
12
|
-
} from "./chunk-X2RZJT4L.js";
|
|
13
13
|
|
|
14
14
|
// src/preview/preview.ts
|
|
15
15
|
import fs2 from "fs";
|
|
@@ -163,7 +163,7 @@ async function probeRuntime(url, cwd) {
|
|
|
163
163
|
async function comparePulse(previous, current) {
|
|
164
164
|
const chrome = findChrome();
|
|
165
165
|
if (!chrome || !hasWebSocket()) return null;
|
|
166
|
-
const { pixelDiffPct } = await import("./cdp-
|
|
166
|
+
const { pixelDiffPct } = await import("./cdp-PBQKXC6R.js");
|
|
167
167
|
return pixelDiffPct(chrome, previous, current);
|
|
168
168
|
}
|
|
169
169
|
function buildRuntimeFixPrompt(report) {
|