@stelis/agent-q-core 0.0.0
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 +144 -0
- package/dist/adapter-internal.d.ts +5 -0
- package/dist/adapter-internal.js +6 -0
- package/dist/adapter-internal.js.map +1 -0
- package/dist/config.d.ts +74 -0
- package/dist/config.js +489 -0
- package/dist/config.js.map +1 -0
- package/dist/core.d.ts +320 -0
- package/dist/core.js +840 -0
- package/dist/core.js.map +1 -0
- package/dist/device.d.ts +55 -0
- package/dist/device.js +23 -0
- package/dist/device.js.map +1 -0
- package/dist/errors.d.ts +6 -0
- package/dist/errors.js +20 -0
- package/dist/errors.js.map +1 -0
- package/dist/host-output-schema.d.ts +2437 -0
- package/dist/host-output-schema.js +655 -0
- package/dist/host-output-schema.js.map +1 -0
- package/dist/protocol-error.d.ts +4 -0
- package/dist/protocol-error.js +9 -0
- package/dist/protocol-error.js.map +1 -0
- package/dist/protocol-management-primitives.d.ts +27 -0
- package/dist/protocol-management-primitives.js +51 -0
- package/dist/protocol-management-primitives.js.map +1 -0
- package/dist/protocol-primitives.d.ts +53 -0
- package/dist/protocol-primitives.js +331 -0
- package/dist/protocol-primitives.js.map +1 -0
- package/dist/protocol.d.ts +207 -0
- package/dist/protocol.js +897 -0
- package/dist/protocol.js.map +1 -0
- package/dist/provider-protocol.d.ts +262 -0
- package/dist/provider-protocol.js +637 -0
- package/dist/provider-protocol.js.map +1 -0
- package/dist/public-error.d.ts +9 -0
- package/dist/public-error.js +79 -0
- package/dist/public-error.js.map +1 -0
- package/dist/safe-text.d.ts +31 -0
- package/dist/safe-text.js +143 -0
- package/dist/safe-text.js.map +1 -0
- package/dist/transport-invariants.d.ts +18 -0
- package/dist/transport-invariants.js +24 -0
- package/dist/transport-invariants.js.map +1 -0
- package/dist/usb.d.ts +76 -0
- package/dist/usb.js +454 -0
- package/dist/usb.js.map +1 -0
- package/package.json +58 -0
package/dist/usb.js
ADDED
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
import { SerialPort } from "serialport";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { AgentQError } from "./errors.js";
|
|
4
|
+
import { assertAccountsResponse, assertApprovalHistoryResponse, assertCapabilitiesResponse, assertPolicyProposeResultResponse, assertPolicyResponse, assertSignResultResponse, assertConnectResponse, assertDisconnectResponse, assertIdentifyDeviceResponse, assertStatusResponse, makeConnectRequest, makeDisconnectRequest, makeGetCapabilitiesRequest, makeGetAccountsRequest, makeGetApprovalHistoryRequest, makePolicyProposeRequest, makeIdentifyDeviceRequest, makePolicyGetRequest, makeGetStatusRequest, consumeProtocolResponseChunk, parseJsonLine, parseProtocolResponse, ProtocolError, serializeRequest, } from "./protocol.js";
|
|
5
|
+
import { makeSignPersonalMessageRequest, makeSignTransactionRequest, } from "./provider-protocol.js";
|
|
6
|
+
import { AGENT_Q_USB_PRODUCT_ID, AGENT_Q_USB_VENDOR_ID, DEFAULT_AGENT_Q_USB_BAUD_RATE, INTERNAL_USB_DEADLINE_MS, } from "./transport-invariants.js";
|
|
7
|
+
export { AGENT_Q_USB_PRODUCT_ID, AGENT_Q_USB_VENDOR_ID, INTERNAL_USB_DEADLINE_MS };
|
|
8
|
+
export class SerialPortUsbDriver {
|
|
9
|
+
async listPorts() {
|
|
10
|
+
return (await SerialPort.list()).map((port) => ({
|
|
11
|
+
...port,
|
|
12
|
+
path: resolveUsbCalloutPath(port.path),
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
async requestStatus(portPath, deadlineMs) {
|
|
16
|
+
return requestStatusOverSerial(portPath, deadlineMs);
|
|
17
|
+
}
|
|
18
|
+
async identifyDevice(portPath, code, deadlineMs) {
|
|
19
|
+
return identifyDeviceOverSerial(portPath, code, deadlineMs);
|
|
20
|
+
}
|
|
21
|
+
async connectDevice(portPath, clientName, deadlineMs) {
|
|
22
|
+
return connectDeviceOverSerial(portPath, clientName, deadlineMs);
|
|
23
|
+
}
|
|
24
|
+
async disconnectDevice(portPath, sessionId, deadlineMs) {
|
|
25
|
+
return disconnectDeviceOverSerial(portPath, sessionId, deadlineMs);
|
|
26
|
+
}
|
|
27
|
+
async getCapabilities(portPath, sessionId, deadlineMs) {
|
|
28
|
+
return getCapabilitiesOverSerial(portPath, sessionId, deadlineMs);
|
|
29
|
+
}
|
|
30
|
+
async getAccounts(portPath, sessionId, deadlineMs) {
|
|
31
|
+
return getAccountsOverSerial(portPath, sessionId, deadlineMs);
|
|
32
|
+
}
|
|
33
|
+
async policyGet(portPath, sessionId, deadlineMs) {
|
|
34
|
+
return policyGetOverSerial(portPath, sessionId, deadlineMs);
|
|
35
|
+
}
|
|
36
|
+
async getApprovalHistory(portPath, sessionId, params, deadlineMs) {
|
|
37
|
+
return getApprovalHistoryOverSerial(portPath, sessionId, params, deadlineMs);
|
|
38
|
+
}
|
|
39
|
+
async policyPropose(portPath, sessionId, policy, deadlineMs) {
|
|
40
|
+
return policyProposeOverSerial(portPath, sessionId, policy, deadlineMs);
|
|
41
|
+
}
|
|
42
|
+
async signTransaction(portPath, sessionId, route, params, deadlineMs) {
|
|
43
|
+
return signTransactionOverSerial(portPath, sessionId, route, params, deadlineMs);
|
|
44
|
+
}
|
|
45
|
+
async signPersonalMessage(portPath, sessionId, route, params, deadlineMs) {
|
|
46
|
+
return signPersonalMessageOverSerial(portPath, sessionId, route, params, deadlineMs);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function resolveUsbCalloutPath(path, platform = process.platform, pathExists = existsSync) {
|
|
50
|
+
if (platform !== "darwin" || !path.startsWith("/dev/tty.")) {
|
|
51
|
+
return path;
|
|
52
|
+
}
|
|
53
|
+
const calloutPath = `/dev/cu.${path.slice("/dev/tty.".length)}`;
|
|
54
|
+
return pathExists(calloutPath) ? calloutPath : path;
|
|
55
|
+
}
|
|
56
|
+
export function validateInternalDeadlineMs(value) {
|
|
57
|
+
if (value === undefined) {
|
|
58
|
+
return INTERNAL_USB_DEADLINE_MS;
|
|
59
|
+
}
|
|
60
|
+
if (!Number.isInteger(value) || typeof value !== "number" || value <= 0) {
|
|
61
|
+
throw new AgentQError("agent_q_error", "Internal USB deadline is invalid.", false);
|
|
62
|
+
}
|
|
63
|
+
if (value > INTERNAL_USB_DEADLINE_MS) {
|
|
64
|
+
throw new AgentQError("agent_q_error", "Internal USB deadline is invalid.", false);
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
export function isLikelyAgentQUsbPort(port) {
|
|
69
|
+
const vendorId = normalizeUsbId(port.vendorId);
|
|
70
|
+
const productId = normalizeUsbId(port.productId);
|
|
71
|
+
const manufacturer = port.manufacturer?.toLowerCase() ?? "";
|
|
72
|
+
const pnpId = port.pnpId?.toLowerCase() ?? "";
|
|
73
|
+
const serialNumber = port.serialNumber ?? "";
|
|
74
|
+
const hasLikelyDescriptor = manufacturer.includes("espressif") || pnpId.includes("303a") || pnpId.includes("esp");
|
|
75
|
+
const hasUsbSerialPath = /(^|[/\\])(cu|tty)\.usbmodem/i.test(port.path);
|
|
76
|
+
const hasDeviceSerial = serialNumber.length > 0;
|
|
77
|
+
if (vendorId.length > 0 || productId.length > 0) {
|
|
78
|
+
if (vendorId !== AGENT_Q_USB_VENDOR_ID || productId !== AGENT_Q_USB_PRODUCT_ID) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
return manufacturer.length === 0 && pnpId.length === 0 ? true : hasLikelyDescriptor;
|
|
82
|
+
}
|
|
83
|
+
return hasLikelyDescriptor && hasUsbSerialPath && hasDeviceSerial;
|
|
84
|
+
}
|
|
85
|
+
export async function scanUsbDevices(driver, deadlineMs = INTERNAL_USB_DEADLINE_MS) {
|
|
86
|
+
return (await scanUsbDeviceStatuses(driver, deadlineMs)).devices;
|
|
87
|
+
}
|
|
88
|
+
// Enforce a host-side deadline on a transport call so a slow or uncooperative
|
|
89
|
+
// driver — one that ignores its deadline argument, or a stuck listPorts() — cannot
|
|
90
|
+
// push the scan past its budget. A genuine rejection from `work` propagates
|
|
91
|
+
// UNCHANGED, so callers can still tell an enumeration/transport error apart from
|
|
92
|
+
// "no device present"; swallowing the error (returning []) would conflate the two.
|
|
93
|
+
function raceDeadline(work, remainingMs, timeoutMessage) {
|
|
94
|
+
// Swallow only a LATE rejection from the losing branch to avoid an unhandled
|
|
95
|
+
// rejection; an early rejection still propagates through the race below.
|
|
96
|
+
work.catch(() => { });
|
|
97
|
+
let timer;
|
|
98
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
99
|
+
timer = setTimeout(() => reject(new AgentQError("timeout", timeoutMessage, true)), Math.max(0, remainingMs));
|
|
100
|
+
});
|
|
101
|
+
return Promise.race([work, timeout]).finally(() => clearTimeout(timer));
|
|
102
|
+
}
|
|
103
|
+
// Single enforcement boundary for the transport deadline contract. Wrapping a
|
|
104
|
+
// driver here races every deadline-bearing call against its own deadline argument,
|
|
105
|
+
// so a driver that ignores the argument still cannot exceed the budget. Applied
|
|
106
|
+
// once in AgentQCore, this bounds deadline-bearing calls in one place instead
|
|
107
|
+
// of relying on each call site to remember to race.
|
|
108
|
+
// listPorts has no deadline argument and is bounded by the shared scan deadline in
|
|
109
|
+
// scanUsbDeviceStatuses.
|
|
110
|
+
export function deadlineEnforcingDriver(driver) {
|
|
111
|
+
return {
|
|
112
|
+
listPorts: () => driver.listPorts(),
|
|
113
|
+
requestStatus: (portPath, deadlineMs) => raceDeadline(driver.requestStatus(portPath, deadlineMs), deadlineMs, "USB status handshake exceeded its timeout."),
|
|
114
|
+
identifyDevice: (portPath, code, deadlineMs) => raceDeadline(driver.identifyDevice(portPath, code, deadlineMs), deadlineMs, "USB identify exceeded its timeout."),
|
|
115
|
+
connectDevice: (portPath, clientName, deadlineMs) => raceDeadline(driver.connectDevice(portPath, clientName, deadlineMs), deadlineMs, "USB connect exceeded its timeout."),
|
|
116
|
+
disconnectDevice: (portPath, sessionId, deadlineMs) => raceDeadline(driver.disconnectDevice(portPath, sessionId, deadlineMs), deadlineMs, "USB disconnect exceeded its timeout."),
|
|
117
|
+
getCapabilities: (portPath, sessionId, deadlineMs) => raceDeadline(driver.getCapabilities(portPath, sessionId, deadlineMs), deadlineMs, "USB get capabilities exceeded its timeout."),
|
|
118
|
+
getAccounts: (portPath, sessionId, deadlineMs) => raceDeadline(driver.getAccounts(portPath, sessionId, deadlineMs), deadlineMs, "USB get accounts exceeded its timeout."),
|
|
119
|
+
policyGet: (portPath, sessionId, deadlineMs) => raceDeadline(driver.policyGet(portPath, sessionId, deadlineMs), deadlineMs, "USB policy_get exceeded its timeout."),
|
|
120
|
+
getApprovalHistory: (portPath, sessionId, params, deadlineMs) => raceDeadline(driver.getApprovalHistory(portPath, sessionId, params, deadlineMs), deadlineMs, "USB get approval history exceeded its timeout."),
|
|
121
|
+
policyPropose: (portPath, sessionId, policy, deadlineMs) => raceDeadline(driver.policyPropose(portPath, sessionId, policy, deadlineMs), deadlineMs, "USB policy_propose exceeded its timeout."),
|
|
122
|
+
signTransaction: (portPath, sessionId, route, params, deadlineMs) => raceDeadline(driver.signTransaction(portPath, sessionId, route, params, deadlineMs), deadlineMs, "USB sign_transaction exceeded its timeout."),
|
|
123
|
+
signPersonalMessage: (portPath, sessionId, route, params, deadlineMs) => raceDeadline(driver.signPersonalMessage(portPath, sessionId, route, params, deadlineMs), deadlineMs, "USB sign_personal_message exceeded its timeout."),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export async function scanUsbDeviceStatuses(driver, deadlineMs = INTERNAL_USB_DEADLINE_MS, now = () => Date.now()) {
|
|
127
|
+
// deadlineMs is a total wall-clock budget for the whole scan, not a per-candidate
|
|
128
|
+
// limit. Port enumeration AND every handshake draw from one shared deadline, so
|
|
129
|
+
// a slow listPorts() or many candidates cannot push the call past deadlineMs.
|
|
130
|
+
// `now` is injectable so the deadline is deterministically testable.
|
|
131
|
+
const totalDeadlineMs = validateInternalDeadlineMs(deadlineMs);
|
|
132
|
+
const deadline = now() + totalDeadlineMs;
|
|
133
|
+
// Enumeration is bounded by the deadline but its errors propagate (a failed
|
|
134
|
+
// listPorts is not the same as "no devices"; the caller maps it).
|
|
135
|
+
const ports = await raceDeadline(driver.listPorts(), deadline - now(), "USB port enumeration exceeded the scan deadline.");
|
|
136
|
+
const candidates = ports.filter(isLikelyAgentQUsbPort);
|
|
137
|
+
const results = [];
|
|
138
|
+
const failures = [];
|
|
139
|
+
for (const candidate of candidates) {
|
|
140
|
+
const remainingMs = deadline - now();
|
|
141
|
+
if (remainingMs <= 0) {
|
|
142
|
+
// Budget exhausted before this candidate was reached.
|
|
143
|
+
failures.push({
|
|
144
|
+
portPath: candidate.path,
|
|
145
|
+
unavailableReason: "timeout",
|
|
146
|
+
});
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
// scanUsbDeviceStatuses OWNS the total scan budget, so it bounds each
|
|
151
|
+
// handshake itself by the time remaining until the deadline. A raw/direct
|
|
152
|
+
// caller is therefore safe even without the AgentQCore driver wrapper; the
|
|
153
|
+
// wrapper adds the same bound for Core's non-scan transport calls and the
|
|
154
|
+
// overlap on this path is harmless (same timeout, whichever fires first).
|
|
155
|
+
const protocolResponse = await raceDeadline(driver.requestStatus(candidate.path, remainingMs), remainingMs, "USB status handshake exceeded the scan deadline.");
|
|
156
|
+
results.push({
|
|
157
|
+
portPath: candidate.path,
|
|
158
|
+
protocolResponse,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
failures.push({
|
|
163
|
+
portPath: candidate.path,
|
|
164
|
+
unavailableReason: mapErrorToUnavailableReason(error),
|
|
165
|
+
firmwareErrorCode: getFirmwareErrorCode(error),
|
|
166
|
+
});
|
|
167
|
+
// Scan only reports confirmed Agent-Q devices. Callers can use failures
|
|
168
|
+
// to explain why a previously known device is not live now.
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
ports,
|
|
173
|
+
devices: results,
|
|
174
|
+
failures,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export function mapErrorToUnavailableReason(error) {
|
|
178
|
+
if (error instanceof AgentQError) {
|
|
179
|
+
if (isUnavailableReason(error.code)) {
|
|
180
|
+
return error.code;
|
|
181
|
+
}
|
|
182
|
+
if (error.code === "unsupported_version" || error.code === "incompatible_version") {
|
|
183
|
+
return "incompatible_version";
|
|
184
|
+
}
|
|
185
|
+
if (error.code === "timeout") {
|
|
186
|
+
return "timeout";
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (error instanceof ProtocolError) {
|
|
190
|
+
if (error.code === "unsupported_version" || error.code === "incompatible_version") {
|
|
191
|
+
return "incompatible_version";
|
|
192
|
+
}
|
|
193
|
+
return "handshake_failed";
|
|
194
|
+
}
|
|
195
|
+
const serialReason = classifySerialUnavailableReason(error);
|
|
196
|
+
if (serialReason !== null) {
|
|
197
|
+
return serialReason;
|
|
198
|
+
}
|
|
199
|
+
return "handshake_failed";
|
|
200
|
+
}
|
|
201
|
+
async function requestStatusOverSerial(portPath, deadlineMs) {
|
|
202
|
+
const request = makeGetStatusRequest();
|
|
203
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertStatusResponse(response));
|
|
204
|
+
}
|
|
205
|
+
async function identifyDeviceOverSerial(portPath, code, deadlineMs) {
|
|
206
|
+
const request = makeIdentifyDeviceRequest(code);
|
|
207
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertIdentifyDeviceResponse(response));
|
|
208
|
+
}
|
|
209
|
+
async function connectDeviceOverSerial(portPath, clientName, deadlineMs) {
|
|
210
|
+
const request = makeConnectRequest(clientName);
|
|
211
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertConnectResponse(response));
|
|
212
|
+
}
|
|
213
|
+
async function disconnectDeviceOverSerial(portPath, sessionId, deadlineMs) {
|
|
214
|
+
const request = makeDisconnectRequest(sessionId);
|
|
215
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertDisconnectResponse(response));
|
|
216
|
+
}
|
|
217
|
+
async function getCapabilitiesOverSerial(portPath, sessionId, deadlineMs) {
|
|
218
|
+
const request = makeGetCapabilitiesRequest(sessionId);
|
|
219
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertCapabilitiesResponse(response));
|
|
220
|
+
}
|
|
221
|
+
async function getAccountsOverSerial(portPath, sessionId, deadlineMs) {
|
|
222
|
+
const request = makeGetAccountsRequest(sessionId);
|
|
223
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertAccountsResponse(response));
|
|
224
|
+
}
|
|
225
|
+
async function policyGetOverSerial(portPath, sessionId, deadlineMs) {
|
|
226
|
+
const request = makePolicyGetRequest(sessionId);
|
|
227
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertPolicyResponse(response));
|
|
228
|
+
}
|
|
229
|
+
async function getApprovalHistoryOverSerial(portPath, sessionId, params, deadlineMs) {
|
|
230
|
+
const request = makeGetApprovalHistoryRequest(sessionId, params);
|
|
231
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertApprovalHistoryResponse(response));
|
|
232
|
+
}
|
|
233
|
+
async function policyProposeOverSerial(portPath, sessionId, policy, deadlineMs) {
|
|
234
|
+
const request = makePolicyProposeRequest(sessionId, policy);
|
|
235
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertPolicyProposeResultResponse(response));
|
|
236
|
+
}
|
|
237
|
+
async function signTransactionOverSerial(portPath, sessionId, route, params, deadlineMs) {
|
|
238
|
+
const request = makeSignTransactionRequest(sessionId, route.chain, route.method, params);
|
|
239
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertSignResultResponse(response));
|
|
240
|
+
}
|
|
241
|
+
async function signPersonalMessageOverSerial(portPath, sessionId, route, params, deadlineMs) {
|
|
242
|
+
const request = makeSignPersonalMessageRequest(sessionId, route.chain, route.method, params);
|
|
243
|
+
return requestOverSerial(portPath, request, deadlineMs, (response) => assertSignResultResponse(response));
|
|
244
|
+
}
|
|
245
|
+
async function requestOverSerial(portPath, request, deadlineMs, assertResponse) {
|
|
246
|
+
const port = new SerialPort({
|
|
247
|
+
path: portPath,
|
|
248
|
+
baudRate: DEFAULT_AGENT_Q_USB_BAUD_RATE,
|
|
249
|
+
autoOpen: false,
|
|
250
|
+
});
|
|
251
|
+
await openPort(port);
|
|
252
|
+
try {
|
|
253
|
+
// Flush discards only OS-side serial buffers. Bytes already in transit on
|
|
254
|
+
// the USB wire may still arrive after this call.
|
|
255
|
+
await flushPort(port);
|
|
256
|
+
return await new Promise((resolve, reject) => {
|
|
257
|
+
let settled = false;
|
|
258
|
+
let buffer = "";
|
|
259
|
+
const timer = setTimeout(() => {
|
|
260
|
+
settle(() => reject(new AgentQError("timeout", "Timed out waiting for Firmware response.", true)));
|
|
261
|
+
}, deadlineMs);
|
|
262
|
+
const settle = (complete) => {
|
|
263
|
+
if (settled) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
settled = true;
|
|
267
|
+
clearTimeout(timer);
|
|
268
|
+
port.off("data", onData);
|
|
269
|
+
port.off("error", onError);
|
|
270
|
+
port.off("close", onClose);
|
|
271
|
+
complete();
|
|
272
|
+
};
|
|
273
|
+
const onError = (error) => {
|
|
274
|
+
settle(() => reject(mapSerialOpenError(error)));
|
|
275
|
+
};
|
|
276
|
+
const onClose = () => {
|
|
277
|
+
settle(() => reject(new AgentQError("transport_closed", "USB serial transport closed.", true)));
|
|
278
|
+
};
|
|
279
|
+
const onData = (chunk) => {
|
|
280
|
+
let lines;
|
|
281
|
+
try {
|
|
282
|
+
const consumed = consumeProtocolResponseChunk(buffer, chunk.toString("utf8"));
|
|
283
|
+
buffer = consumed.buffer;
|
|
284
|
+
lines = consumed.lines;
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
settle(() => reject(toAgentQProtocolError(error)));
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
for (const rawLine of lines) {
|
|
291
|
+
const line = rawLine.trim();
|
|
292
|
+
if (line.length === 0 || !line.startsWith("{")) {
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
let parsed;
|
|
296
|
+
try {
|
|
297
|
+
parsed = tryParseMatchingResponseLine(line, request.id, assertResponse);
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
settle(() => reject(error));
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (parsed !== undefined) {
|
|
304
|
+
settle(() => resolve(parsed));
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
port.on("data", onData);
|
|
310
|
+
port.on("error", onError);
|
|
311
|
+
port.on("close", onClose);
|
|
312
|
+
port.write(serializeRequest(request), (error) => {
|
|
313
|
+
if (error) {
|
|
314
|
+
settle(() => reject(mapSerialOpenError(error)));
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
port.drain((drainError) => {
|
|
318
|
+
if (drainError) {
|
|
319
|
+
settle(() => reject(mapSerialOpenError(drainError)));
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
finally {
|
|
326
|
+
await closePort(port);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function toAgentQProtocolError(error) {
|
|
330
|
+
if (error instanceof ProtocolError) {
|
|
331
|
+
return new AgentQError(error.code, error.message, error.code === "timeout");
|
|
332
|
+
}
|
|
333
|
+
return error;
|
|
334
|
+
}
|
|
335
|
+
/** @internal Exported for focused protocol-line tests; not part of Agent-Q's public API. */
|
|
336
|
+
export function tryParseMatchingResponseLine(line, expectedId, assertResponse) {
|
|
337
|
+
let parsed;
|
|
338
|
+
try {
|
|
339
|
+
parsed = parseJsonLine(line);
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return undefined;
|
|
343
|
+
}
|
|
344
|
+
if (!isRecord(parsed)) {
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
347
|
+
if (parsed.id !== expectedId) {
|
|
348
|
+
if (parsed.id === undefined && parsed.type === "error") {
|
|
349
|
+
const response = parseProtocolResponse(line);
|
|
350
|
+
if (response.type === "error") {
|
|
351
|
+
throw new AgentQError(response.error.code, response.error.message, isRetryableIdlessFirmwareError(response.error.code));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
try {
|
|
357
|
+
return assertResponse(parseProtocolResponse(line, expectedId));
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
if (error instanceof ProtocolError) {
|
|
361
|
+
throw new AgentQError(error.code, error.message, error.code === "timeout");
|
|
362
|
+
}
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function openPort(port) {
|
|
367
|
+
return new Promise((resolve, reject) => {
|
|
368
|
+
port.open((error) => {
|
|
369
|
+
if (error) {
|
|
370
|
+
reject(mapSerialOpenError(error));
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
resolve();
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
function flushPort(port) {
|
|
378
|
+
return new Promise((resolve, reject) => {
|
|
379
|
+
port.flush((error) => {
|
|
380
|
+
if (error) {
|
|
381
|
+
reject(mapSerialOpenError(error));
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
resolve();
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
function closePort(port) {
|
|
389
|
+
if (!port.isOpen) {
|
|
390
|
+
return Promise.resolve();
|
|
391
|
+
}
|
|
392
|
+
return new Promise((resolve) => {
|
|
393
|
+
port.close(() => resolve());
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
function mapSerialOpenError(error) {
|
|
397
|
+
const message = error.message || "USB serial transport failed.";
|
|
398
|
+
const reason = classifySerialUnavailableReason(error);
|
|
399
|
+
if (reason !== null) {
|
|
400
|
+
return new AgentQError(reason, message, true);
|
|
401
|
+
}
|
|
402
|
+
return new AgentQError("handshake_failed", message, true);
|
|
403
|
+
}
|
|
404
|
+
function classifySerialUnavailableReason(error) {
|
|
405
|
+
const message = error instanceof Error ? error.message : "";
|
|
406
|
+
const code = isRecord(error) && typeof error.code === "string" ? error.code : "";
|
|
407
|
+
const text = `${code} ${message}`;
|
|
408
|
+
if (/\b(?:eacces|eperm)\b|operation not permitted|permission denied|access denied/i.test(text)) {
|
|
409
|
+
return "port_permission_denied";
|
|
410
|
+
}
|
|
411
|
+
if (/busy|resource busy|in use/i.test(text)) {
|
|
412
|
+
return "port_in_use";
|
|
413
|
+
}
|
|
414
|
+
if (/not found|cannot open|no such file|\benoent\b/i.test(text)) {
|
|
415
|
+
return "port_not_found";
|
|
416
|
+
}
|
|
417
|
+
if (/closed|disconnect/i.test(text)) {
|
|
418
|
+
return "transport_closed";
|
|
419
|
+
}
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
function normalizeUsbId(value) {
|
|
423
|
+
if (value === undefined || value.length === 0) {
|
|
424
|
+
return "";
|
|
425
|
+
}
|
|
426
|
+
return value.toLowerCase().replace(/^0x/, "").padStart(4, "0");
|
|
427
|
+
}
|
|
428
|
+
function isUnavailableReason(value) {
|
|
429
|
+
return (value === "timeout" ||
|
|
430
|
+
value === "port_not_found" ||
|
|
431
|
+
value === "port_in_use" ||
|
|
432
|
+
value === "port_permission_denied" ||
|
|
433
|
+
value === "handshake_failed" ||
|
|
434
|
+
value === "incompatible_version" ||
|
|
435
|
+
value === "transport_closed");
|
|
436
|
+
}
|
|
437
|
+
function isRetryableIdlessFirmwareError(code) {
|
|
438
|
+
// Current Firmware does not emit id-less transient errors. Keep this narrow
|
|
439
|
+
// because these errors cannot be correlated to a request id.
|
|
440
|
+
return code === "busy" || code === "timeout";
|
|
441
|
+
}
|
|
442
|
+
function getFirmwareErrorCode(error) {
|
|
443
|
+
if (error instanceof AgentQError && !isUnavailableReason(error.code)) {
|
|
444
|
+
return error.code;
|
|
445
|
+
}
|
|
446
|
+
if (error instanceof ProtocolError) {
|
|
447
|
+
return error.code;
|
|
448
|
+
}
|
|
449
|
+
return undefined;
|
|
450
|
+
}
|
|
451
|
+
function isRecord(value) {
|
|
452
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
453
|
+
}
|
|
454
|
+
//# sourceMappingURL=usb.js.map
|
package/dist/usb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usb.js","sourceRoot":"","sources":["../src/usb.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stelis/agent-q-core",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Agent-Q core for device transport, protocol requests, session state, config, and result parsing.",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/stelis-dev/agent-q.git",
|
|
10
|
+
"directory": "packages/core"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/core.js",
|
|
13
|
+
"types": "./dist/core.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/core.d.ts",
|
|
17
|
+
"import": "./dist/core.js"
|
|
18
|
+
},
|
|
19
|
+
"./device": {
|
|
20
|
+
"types": "./dist/device.d.ts",
|
|
21
|
+
"import": "./dist/device.js"
|
|
22
|
+
},
|
|
23
|
+
"./adapter-internal": {
|
|
24
|
+
"types": "./dist/adapter-internal.d.ts",
|
|
25
|
+
"import": "./dist/adapter-internal.js"
|
|
26
|
+
},
|
|
27
|
+
"./protocol": {
|
|
28
|
+
"types": "./dist/protocol.d.ts",
|
|
29
|
+
"import": "./dist/protocol.js"
|
|
30
|
+
},
|
|
31
|
+
"./provider-protocol": {
|
|
32
|
+
"types": "./dist/provider-protocol.d.ts",
|
|
33
|
+
"import": "./dist/provider-protocol.js"
|
|
34
|
+
},
|
|
35
|
+
"./package.json": "./package.json"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md"
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "npm run build:self",
|
|
43
|
+
"build:self": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.json",
|
|
44
|
+
"test": "npm run build && npm run test:self",
|
|
45
|
+
"test:self": "node --test test/*.test.mjs"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"serialport": "13.0.0",
|
|
49
|
+
"zod": "4.4.3"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/node": "25.9.1",
|
|
53
|
+
"typescript": "6.0.3"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=22"
|
|
57
|
+
}
|
|
58
|
+
}
|