The Console gains three read-only views. Queue lists every row from
rows() in packages/queue (lead decision 83: the same lock-free read as
`queue list`, writing nothing), run in a child with a timeout and an
output cap; a row page shows the full row. Business shows names, an
allowlist of vars, arbiters, authority per action and credential
metadata (service, account, role, date, never a value, file or
variable). Settings shows RELEASE, the board origin and the notifier
binding. Every route is GET only, and every string in a body or
refusal passes a redactor: the config directory and dataRoot become
<config> and <dataRoot>, other absolute, ~/ and file:// paths <path>,
and 17 to 20 digit runs <id>. A queue-read that fails to start sends a
fixed message, never node's stderr.
Four fixes to HEAD behaviour, each with a test: the bus view's refresh
timer is cleared at render, a same-page refresh keeps focus on the H1,
#conv-pick is emptied when a conversation opens, and error() returns
focus to <main> only when something had focus. Filbert's T8 tests the
failed first read.
Dewey built it in two rounds. Round 1 (dba2429e) got changes from
Filbert (27185: After rendered [object Object], ~/ and :/ paths leaked)
and Darkwing (27186: Arbiters always none, queue-read import failure
leaked a file:// path and stack). Round 2 (afb2ae0e) was approved by
Filbert (27190) and Darkwing (27191, correction 27192). Sage's gate on
d64f434f plus the candidate: 13 package node suites 0 failed (queue
149, webui 39), every scripts/test-*.sh 0 failed (task 98/0 with
Docker, 26/0 without; release 14/0), build-tokens --check current.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
22 lines
1.1 KiB
JavaScript
22 lines
1.1 KiB
JavaScript
// Row 54 (#1543): the Console's read of the queue, run as a child with its
|
|
// cwd at the checkout so one slow read never stalls the HTTP server. It
|
|
// calls rows() in packages/queue (lead decision 83): the same unlocked read
|
|
// as `queue list`, which writes nothing. JSON on stdout; a refusal's message
|
|
// on stderr with the store's exit code.
|
|
//
|
|
// The store is imported inside the try, so a store.mjs that fails to load
|
|
// (a half-written file in a shared checkout) prints "the queue read failed",
|
|
// never Node's own message, which names the file:// path and a stack.
|
|
|
|
let QueueError = null;
|
|
try {
|
|
({ QueueError } = await import('../../queue/src/errors.mjs'));
|
|
const { rows } = await import('../../queue/src/store.mjs');
|
|
const r = rows({});
|
|
process.stdout.write(`${JSON.stringify({ rows: r.rows, notes: r.err })}\n`);
|
|
} catch (err) {
|
|
const refused = QueueError !== null && err instanceof QueueError;
|
|
process.stderr.write(`${refused ? err.message : 'the queue read failed'}\n`);
|
|
process.exitCode = refused && Number.isInteger(err.code) && err.code > 0 ? err.code : 1;
|
|
}
|