57dc91585d
Internal SmartGift build of a Claude Code monitoring dashboard. Lanes: a durable unit of parallel agent work, one per working directory, tracked across session restarts. Managed lanes are git worktrees the dashboard provisions and can reset or remove behind a three-check destroy guard and a counted preflight; adopted lanes are directories you already own and are never destroyable. Pipelines: a lane moves through pipeline stages. A stage the agent declares with evidence renders green; a stage inferred from the tool-event stream renders dashed amber and never counts as done. Detection is forward-only within a 30-minute window, and never writes the declared stage. Workspace: one page at /run with a lane grid, the selected lane's pipeline, and a full Claude console behind a disclosure.
41 lines
1.1 KiB
JavaScript
41 lines
1.1 KiB
JavaScript
/**
|
|
* @file stream-json-parser.js
|
|
* @description Newline-delimited JSON line buffer for parsing `claude
|
|
* --output-format stream-json` output. Reassembles arbitrarily chunked stdout
|
|
* into discrete JSON envelopes (one per line). Robust to partial writes;
|
|
* malformed lines are reported via onError but never throw.
|
|
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
|
*/
|
|
|
|
function createLineParser(onObject, onError) {
|
|
let buf = "";
|
|
return {
|
|
push(chunk) {
|
|
buf += chunk;
|
|
let nlIdx;
|
|
while ((nlIdx = buf.indexOf("\n")) >= 0) {
|
|
const line = buf.slice(0, nlIdx).trim();
|
|
buf = buf.slice(nlIdx + 1);
|
|
if (!line) continue;
|
|
try {
|
|
onObject(JSON.parse(line));
|
|
} catch (err) {
|
|
if (typeof onError === "function") onError(err, line);
|
|
}
|
|
}
|
|
},
|
|
flush() {
|
|
const tail = buf.trim();
|
|
buf = "";
|
|
if (!tail) return;
|
|
try {
|
|
onObject(JSON.parse(tail));
|
|
} catch (err) {
|
|
if (typeof onError === "function") onError(err, tail);
|
|
}
|
|
},
|
|
};
|
|
}
|
|
|
|
module.exports = { createLineParser };
|