@aristanetworks/eos-mcp-server 0.8.0-beta → 0.8.1-beta

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.
Files changed (71) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +4 -30
  3. package/dist/cli.d.ts +1 -4
  4. package/dist/cli.js +4 -63
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config/diagnostics.d.ts +10 -5
  7. package/dist/config/diagnostics.js +3 -2
  8. package/dist/config/diagnostics.js.map +1 -1
  9. package/dist/config/loadConfig.js +1 -5
  10. package/dist/config/loadConfig.js.map +1 -1
  11. package/dist/config/schema.d.ts +28 -14
  12. package/dist/diagnostics/concurrency.d.ts +7 -11
  13. package/dist/diagnostics/concurrency.js +38 -80
  14. package/dist/diagnostics/concurrency.js.map +1 -1
  15. package/dist/diagnostics/eapiRunner.js +7 -1
  16. package/dist/diagnostics/eapiRunner.js.map +1 -1
  17. package/dist/diagnostics/executor.d.ts +1 -2
  18. package/dist/diagnostics/executor.js +2 -3
  19. package/dist/diagnostics/executor.js.map +1 -1
  20. package/dist/diagnostics/types.d.ts +3 -4
  21. package/dist/eapi/client.js +5 -4
  22. package/dist/eapi/client.js.map +1 -1
  23. package/dist/eapi/types.d.ts +3 -0
  24. package/dist/eapi/types.js.map +1 -1
  25. package/dist/index.js +0 -10
  26. package/dist/index.js.map +1 -1
  27. package/dist/mcp/createServer.js +2 -19
  28. package/dist/mcp/createServer.js.map +1 -1
  29. package/dist/mcp/tools/ping.d.ts +0 -7
  30. package/dist/mcp/tools/ping.js +13 -26
  31. package/dist/mcp/tools/ping.js.map +1 -1
  32. package/dist/serverInfo/buildServerInfo.js +2 -1
  33. package/dist/serverInfo/buildServerInfo.js.map +1 -1
  34. package/dist/serverInfo/types.d.ts +1 -0
  35. package/docs/CHECKPOINT.md +3 -6
  36. package/docs/CODE_WALKTHROUGH.md +6 -11
  37. package/docs/DESIGN.md +3 -3
  38. package/docs/DIAGNOSTICS.md +18 -69
  39. package/docs/IMPLEMENTATION_PLAN.md +2 -2
  40. package/docs/adr/0002-fail-closed-diagnostic-reservations.md +2 -0
  41. package/docs/adr/0003-durable-diagnostic-ledger.md +2 -0
  42. package/docs/adr/0004-offline-operator-attested-release.md +2 -0
  43. package/docs/adr/0005-multi-destination-ping.md +1 -1
  44. package/docs/adr/0006-in-memory-timed-diagnostic-capacity.md +21 -0
  45. package/docs/research/eos-diagnostic-lifecycle.md +2 -0
  46. package/package.json +1 -1
  47. package/dist/commands/inspectDiagnostics.d.ts +0 -3
  48. package/dist/commands/inspectDiagnostics.js +0 -35
  49. package/dist/commands/inspectDiagnostics.js.map +0 -1
  50. package/dist/commands/releaseDiagnostics.d.ts +0 -9
  51. package/dist/commands/releaseDiagnostics.js +0 -87
  52. package/dist/commands/releaseDiagnostics.js.map +0 -1
  53. package/dist/diagnostics/journal.d.ts +0 -14
  54. package/dist/diagnostics/journal.js +0 -317
  55. package/dist/diagnostics/journal.js.map +0 -1
  56. package/dist/diagnostics/journalTypes.d.ts +0 -8
  57. package/dist/diagnostics/journalTypes.js +0 -2
  58. package/dist/diagnostics/journalTypes.js.map +0 -1
  59. package/dist/diagnostics/releaseEvidence.d.ts +0 -502
  60. package/dist/diagnostics/releaseEvidence.js +0 -115
  61. package/dist/diagnostics/releaseEvidence.js.map +0 -1
  62. package/dist/diagnostics/reservationSchema.d.ts +0 -49
  63. package/dist/diagnostics/reservationSchema.js +0 -18
  64. package/dist/diagnostics/reservationSchema.js.map +0 -1
  65. package/dist/diagnostics/statePath.d.ts +0 -4
  66. package/dist/diagnostics/statePath.js +0 -25
  67. package/dist/diagnostics/statePath.js.map +0 -1
  68. package/dist/utils/privateFile.d.ts +0 -3
  69. package/dist/utils/privateFile.js +0 -7
  70. package/dist/utils/privateFile.js.map +0 -1
  71. package/docs/examples/diagnostic-release-evidence.template.json +0 -26
@@ -1,87 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import { constants } from "node:fs";
3
- import path from "node:path";
4
- import { parseDocument } from "yaml";
5
- import { AppError, toErrorCode, toErrorMessage } from "../core/errors.js";
6
- import { diagnosticInventoryIdentity, resolveDiagnosticStateFile } from "../diagnostics/statePath.js";
7
- import { prettyJson } from "../utils/json.js";
8
- import { isPrivateRegularFile } from "../utils/privateFile.js";
9
- const MAX_EVIDENCE_BYTES = 65_536;
10
- async function readEvidence(file) {
11
- let handle;
12
- try {
13
- const before = await fs.lstat(file);
14
- if (!before.isFile() || before.isSymbolicLink()) {
15
- throw new AppError("diagnostic_release_evidence_invalid", "Evidence must be a regular file, not a symlink or device");
16
- }
17
- handle = await fs.open(file, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0));
18
- const stat = await handle.stat();
19
- if (!isPrivateRegularFile(stat) || stat.ino !== before.ino || stat.dev !== before.dev) {
20
- throw new AppError("diagnostic_release_evidence_invalid", "Evidence must be a private owner-controlled file (POSIX mode 0600)");
21
- }
22
- const buffer = Buffer.alloc(MAX_EVIDENCE_BYTES + 1);
23
- let length = 0;
24
- while (length < buffer.length) {
25
- const { bytesRead } = await handle.read(buffer, length, buffer.length - length, null);
26
- if (bytesRead === 0)
27
- break;
28
- length += bytesRead;
29
- }
30
- if (length > MAX_EVIDENCE_BYTES) {
31
- throw new AppError("diagnostic_release_evidence_too_large", "Evidence JSON must not exceed 65536 bytes; release smaller explicit batches");
32
- }
33
- const text = new TextDecoder("utf-8", { fatal: true }).decode(buffer.subarray(0, length));
34
- const value = JSON.parse(text);
35
- if (parseDocument(text, { uniqueKeys: true, prettyErrors: false }).errors.length > 0) {
36
- throw new AppError("diagnostic_release_evidence_invalid", "Evidence JSON must not contain duplicate or ambiguous object keys");
37
- }
38
- return value;
39
- }
40
- catch (error) {
41
- if (error instanceof AppError)
42
- throw error;
43
- throw new AppError("diagnostic_release_evidence_invalid", "Cannot read a private regular UTF-8 JSON evidence file");
44
- }
45
- finally {
46
- await handle?.close();
47
- }
48
- }
49
- /** Offline operator authority: no credentials, device calls, evidence fetching, or MCP reset. */
50
- export async function runReleaseDiagnostics(config, options) {
51
- try {
52
- if (options.confirmFenced !== true) {
53
- throw new AppError("diagnostic_release_confirmation_required", "Explicit --confirm-fenced is required after independent fencing verification");
54
- }
55
- if (options.evidenceFile === undefined) {
56
- throw new AppError("cli_missing_evidence_file", "release-diagnostics requires --evidence-file");
57
- }
58
- if (options.reservationIds === undefined || options.reservationIds.length === 0) {
59
- throw new AppError("cli_missing_reservation", "release-diagnostics requires explicit --reservation-id values");
60
- }
61
- const evidence = await readEvidence(path.resolve(options.evidenceFile));
62
- const file = resolveDiagnosticStateFile(config);
63
- const expected = config.inventoryPath === undefined ? undefined : diagnosticInventoryIdentity(config.inventoryPath);
64
- const { releaseDiagnosticReservations } = await import("../diagnostics/journal.js");
65
- const result = releaseDiagnosticReservations(file, {
66
- reservationIds: options.reservationIds, evidence, confirmedFenced: true,
67
- ...(expected === undefined ? {} : { expectedInventoryIdentity: expected })
68
- });
69
- if (options.json) {
70
- console.log(prettyJson({ ...result, authority: "operator_attestation" }));
71
- }
72
- else {
73
- console.log(`${result.already_committed ? "Already committed" : "Operator release committed"}: ${result.release_id}`);
74
- for (const id of result.released_reservation_ids)
75
- console.log(`- ${id}`);
76
- console.log("Authority: operator attestation, not machine-confirmed EOS completion. Inspect the durable audit before any further recovery.");
77
- }
78
- return 0;
79
- }
80
- catch (error) {
81
- if (!options.json)
82
- throw error;
83
- console.log(prettyJson({ error_code: toErrorCode(error, "diagnostic_release_failed"), message: toErrorMessage(error) }));
84
- return 1;
85
- }
86
- }
87
- //# sourceMappingURL=releaseDiagnostics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"releaseDiagnostics.js","sourceRoot":"","sources":["../../src/commands/releaseDiagnostics.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { DiagnosticJournal } from "./journalTypes.js";
2
- import type { DiagnosticReservationInfo } from "./types.js";
3
- import { type DiagnosticReleaseAudit, type DiagnosticReleaseRequest, type DiagnosticReleaseResult } from "./releaseEvidence.js";
4
- export declare function openDiagnosticJournal(stateFile: string, inventoryIdentity: string): DiagnosticJournal;
5
- /** No API device calls: release is explicitly authorized operator authority, not observed completion. */
6
- export declare function releaseDiagnosticReservations(stateFile: string, request: DiagnosticReleaseRequest): DiagnosticReleaseResult;
7
- export interface DiagnosticJournalInspection {
8
- schema_version: 1 | 2;
9
- inventory_identity: string;
10
- reservations: DiagnosticReservationInfo[];
11
- release_audit: DiagnosticReleaseAudit[];
12
- }
13
- /** Read-only inspection never acquires ownership, clears reservations, or normalizes state. */
14
- export declare function inspectDiagnosticJournal(stateFile: string): DiagnosticJournalInspection;
@@ -1,317 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { DatabaseSync } from "node:sqlite";
4
- import { randomUUID } from "node:crypto";
5
- import os from "node:os";
6
- import { AppError } from "../core/errors.js";
7
- import { isPrivateRegularFile } from "../utils/privateFile.js";
8
- import { isObject } from "../utils/value.js";
9
- import { parseReservation, reservationSchema } from "./reservationSchema.js";
10
- import { createReleaseAudit, evidenceDigest, matchAttestedReservations, parseReleaseAudit, validateReleaseRequest } from "./releaseEvidence.js";
11
- function checkPrivateFile(file) {
12
- const stat = fs.lstatSync(file);
13
- if (!isPrivateRegularFile(stat)) {
14
- throw new AppError("diagnostic_state_permissions_invalid", "Diagnostic state must be a private, owner-controlled regular file");
15
- }
16
- }
17
- function syncDirectory(directory) {
18
- if (process.platform === "win32")
19
- return;
20
- const fd = fs.openSync(directory, "r");
21
- try {
22
- fs.fsyncSync(fd);
23
- }
24
- finally {
25
- fs.closeSync(fd);
26
- }
27
- }
28
- function ensurePrivateFile(file) {
29
- let created = false;
30
- try {
31
- const fd = fs.openSync(file, "wx", 0o600);
32
- created = true;
33
- try {
34
- fs.fsyncSync(fd);
35
- }
36
- finally {
37
- fs.closeSync(fd);
38
- }
39
- syncDirectory(path.dirname(file));
40
- }
41
- catch (error) {
42
- if (!isObject(error) || error.code !== "EEXIST") {
43
- throw error;
44
- }
45
- }
46
- checkPrivateFile(file);
47
- return created;
48
- }
49
- function checkIntegrity(db) {
50
- const results = db.prepare("PRAGMA integrity_check").all();
51
- if (results.length !== 1 || results[0]?.integrity_check !== "ok") {
52
- throw new AppError("diagnostic_state_invalid", "Diagnostic ledger integrity check failed; capacity must not be recovered from corrupt indexes or records");
53
- }
54
- }
55
- function readReservations(db) {
56
- return db.prepare("SELECT reservation_id, payload FROM reservations ORDER BY reservation_id").all().map((row) => {
57
- const value = typeof row.payload === "string" ? JSON.parse(row.payload) : undefined;
58
- const reservation = parseReservation(value);
59
- if (reservation.reservation_id !== row.reservation_id) {
60
- throw new AppError("diagnostic_state_invalid", "Diagnostic reservation identity does not match its stored record");
61
- }
62
- return reservation;
63
- });
64
- }
65
- function readMetadata(db) {
66
- const metadata = db.prepare("SELECT schema_version, inventory_identity FROM metadata WHERE id = 1").get();
67
- if ((metadata?.schema_version !== 1 && metadata?.schema_version !== 2) || typeof metadata.inventory_identity !== "string" || metadata.inventory_identity.length === 0) {
68
- throw new AppError("diagnostic_state_invalid", "Unsupported or invalid diagnostic state schema");
69
- }
70
- return { schema_version: metadata.schema_version, inventory_identity: metadata.inventory_identity };
71
- }
72
- function readAudit(db, version, inventoryIdentity) {
73
- if (version === 1) {
74
- if (db.prepare("SELECT name FROM sqlite_schema WHERE name = 'release_audit'").get() !== undefined) {
75
- throw new AppError("diagnostic_state_invalid", "Legacy state has unexpected release audit data; it must not be ignored");
76
- }
77
- return [];
78
- }
79
- return db.prepare("SELECT release_id, attestation_id, payload FROM release_audit ORDER BY rowid").all().map((row) => {
80
- const audit = parseReleaseAudit(typeof row.payload === "string" ? JSON.parse(row.payload) : undefined);
81
- if (audit.release_id !== row.release_id || audit.evidence.attestation_id !== row.attestation_id || audit.inventory_identity !== inventoryIdentity) {
82
- throw new AppError("diagnostic_state_invalid", "Operator audit identity does not match its ledger record");
83
- }
84
- return audit;
85
- });
86
- }
87
- class SqliteDiagnosticJournal {
88
- db;
89
- ownership;
90
- closed = false;
91
- constructor(db, ownership) {
92
- this.db = db;
93
- this.ownership = ownership;
94
- }
95
- load() {
96
- this.assertOpen();
97
- try {
98
- return readReservations(this.db);
99
- }
100
- catch {
101
- throw new AppError("diagnostic_state_invalid", "Cannot read validated diagnostic reservations; state was not reset");
102
- }
103
- }
104
- save(reservation) {
105
- this.assertOpen();
106
- try {
107
- const value = reservationSchema.parse(reservation);
108
- this.db.prepare("INSERT INTO reservations (reservation_id, payload) VALUES (?, ?) ON CONFLICT(reservation_id) DO UPDATE SET payload = excluded.payload")
109
- .run(value.reservation_id, JSON.stringify(value));
110
- }
111
- catch {
112
- throw new AppError("diagnostic_state_write_failed", "Cannot durably save diagnostic reservation; no capacity may be assumed free");
113
- }
114
- }
115
- remove(reservationId) {
116
- this.assertOpen();
117
- try {
118
- const result = this.db.prepare("DELETE FROM reservations WHERE reservation_id = ?").run(reservationId);
119
- if (Number(result.changes) !== 1) {
120
- throw new AppError("diagnostic_state_invalid", "Reservation was missing from the durable ledger");
121
- }
122
- }
123
- catch {
124
- throw new AppError("diagnostic_state_write_failed", "Cannot durably record diagnostic completion; reservation remains unavailable");
125
- }
126
- }
127
- release(evidence) {
128
- this.assertOpen();
129
- const metadata = readMetadata(this.db);
130
- const current = readReservations(this.db);
131
- const previous = readAudit(this.db, metadata.schema_version, metadata.inventory_identity)
132
- .find((audit) => audit.evidence.attestation_id === evidence.attestation_id);
133
- if (previous !== undefined) {
134
- if (previous.evidence_sha256 !== evidenceDigest(evidence)) {
135
- throw new AppError("diagnostic_release_attestation_reused", "An attestation ID cannot authorize different evidence or reservation scope");
136
- }
137
- if (previous.released_reservations.some((released) => current.some((record) => record.reservation_id === released.reservation_id))) {
138
- throw new AppError("diagnostic_state_invalid", "An already released reservation has reappeared in unresolved state");
139
- }
140
- this.db.exec("COMMIT");
141
- return { release_id: previous.release_id, attestation_id: evidence.attestation_id,
142
- released_reservation_ids: previous.released_reservations.map((record) => record.reservation_id), already_committed: true };
143
- }
144
- const now = Date.now();
145
- const selected = matchAttestedReservations(evidence, current, now);
146
- const user = os.userInfo();
147
- const audit = createReleaseAudit({
148
- release_id: randomUUID(), recorded_at: new Date(now).toISOString(), authority: "operator_attestation",
149
- inventory_identity: metadata.inventory_identity, os_user: { username: user.username, uid: user.uid < 0 ? null : user.uid },
150
- evidence_sha256: evidenceDigest(evidence), evidence, released_reservations: selected
151
- });
152
- this.db.prepare("INSERT INTO release_audit (release_id, attestation_id, payload) VALUES (?, ?, ?)")
153
- .run(audit.release_id, evidence.attestation_id, JSON.stringify(audit));
154
- for (const reservation of selected) {
155
- if (Number(this.db.prepare("DELETE FROM reservations WHERE reservation_id = ?").run(reservation.reservation_id).changes) !== 1) {
156
- throw new AppError("diagnostic_state_invalid", "Selected reservation changed during operator release");
157
- }
158
- }
159
- this.db.exec("COMMIT");
160
- return { release_id: audit.release_id, attestation_id: evidence.attestation_id,
161
- released_reservation_ids: selected.map((record) => record.reservation_id), already_committed: false };
162
- }
163
- close() {
164
- if (this.closed)
165
- return;
166
- this.closed = true;
167
- try {
168
- try {
169
- this.db.close();
170
- }
171
- finally {
172
- this.ownership.close();
173
- }
174
- }
175
- catch {
176
- throw new AppError("diagnostic_state_close_failed", "Cannot close diagnostic state cleanly; inspect state before restarting");
177
- }
178
- }
179
- assertOpen() {
180
- if (this.closed) {
181
- throw new AppError("diagnostic_state_closed", "Diagnostic state is closed; commands must not be dispatched");
182
- }
183
- }
184
- }
185
- /** Separate SQLite ownership lock: crash-released by the OS, independent of ledger commits. */
186
- function openJournal(stateFile, inventoryIdentity, mode) {
187
- let ownership;
188
- let db;
189
- try {
190
- const directory = path.dirname(path.resolve(stateFile));
191
- if (mode === "release" && (!fs.existsSync(stateFile) || !fs.existsSync(`${stateFile}.lock.sqlite`))) {
192
- throw new AppError("diagnostic_state_invalid", "Operator release requires an existing ledger and ownership file; no state is created");
193
- }
194
- const createdDirectory = fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
195
- if (createdDirectory !== undefined) {
196
- // Persist every newly-created directory link, not only the files in the
197
- // leaf directory. FULL SQLite commits cannot repair a lost parent link.
198
- const stop = fs.realpathSync(path.dirname(path.resolve(createdDirectory)));
199
- let current = fs.realpathSync(directory);
200
- while (true) {
201
- syncDirectory(current);
202
- const parent = path.dirname(current);
203
- if (current === stop || parent === current)
204
- break;
205
- current = parent;
206
- }
207
- }
208
- const stat = fs.statSync(directory);
209
- if (process.platform !== "win32" && ((stat.mode & 0o022) !== 0 || (process.getuid !== undefined && stat.uid !== process.getuid()))) {
210
- throw new AppError("diagnostic_state_permissions_invalid", "Diagnostic state directory must be owner-controlled and not group/world writable");
211
- }
212
- const file = path.join(fs.realpathSync(directory), path.basename(stateFile));
213
- const lockFile = `${file}.lock.sqlite`;
214
- if (fs.existsSync(file))
215
- checkPrivateFile(file);
216
- if (fs.existsSync(file) !== fs.existsSync(lockFile)) {
217
- throw new AppError("diagnostic_state_invalid", "Diagnostic ledger and ownership file must be preserved together; neither may be recreated as fresh capacity");
218
- }
219
- const newLock = ensurePrivateFile(lockFile);
220
- ownership = new DatabaseSync(lockFile, { allowExtension: false, timeout: 0 });
221
- ownership.exec("BEGIN EXCLUSIVE");
222
- if (!newLock && !fs.existsSync(file)) {
223
- throw new AppError("diagnostic_state_invalid", "Existing diagnostic ownership has no ledger; state was not recreated");
224
- }
225
- const created = ensurePrivateFile(file);
226
- if (!created && fs.statSync(file).size === 0) {
227
- throw new AppError("diagnostic_state_invalid", "Existing diagnostic state is empty or truncated; it must not be initialized as new");
228
- }
229
- db = new DatabaseSync(file, { allowExtension: false, timeout: 0 });
230
- db.exec("PRAGMA journal_mode = DELETE; PRAGMA synchronous = FULL; PRAGMA trusted_schema = OFF; BEGIN IMMEDIATE");
231
- checkIntegrity(db);
232
- if (created) {
233
- db.exec(`CREATE TABLE metadata (id INTEGER PRIMARY KEY CHECK(id = 1), schema_version INTEGER NOT NULL, inventory_identity TEXT NOT NULL);
234
- CREATE TABLE reservations (reservation_id TEXT PRIMARY KEY, payload TEXT NOT NULL)`);
235
- }
236
- const metadata = db.prepare("SELECT id FROM metadata").get();
237
- if (metadata === undefined) {
238
- if (!created) {
239
- throw new AppError("diagnostic_state_invalid", "Existing diagnostic state has no metadata; it must not be reset");
240
- }
241
- if (db.prepare("SELECT reservation_id FROM reservations LIMIT 1").get() !== undefined) {
242
- throw new AppError("diagnostic_state_invalid", "Diagnostic state has reservations without metadata");
243
- }
244
- db.prepare("INSERT INTO metadata VALUES (1, 1, ?)").run(inventoryIdentity);
245
- }
246
- const stored = readMetadata(db);
247
- if (stored.inventory_identity !== inventoryIdentity) {
248
- throw new AppError("diagnostic_state_inventory_mismatch", "Diagnostic state belongs to a different inventory; it must not be reset or reused");
249
- }
250
- readAudit(db, stored.schema_version, inventoryIdentity);
251
- if (stored.schema_version === 1) {
252
- db.exec("CREATE TABLE release_audit (release_id TEXT PRIMARY KEY, attestation_id TEXT NOT NULL UNIQUE, payload TEXT NOT NULL); UPDATE metadata SET schema_version = 2 WHERE id = 1");
253
- }
254
- for (const reservation of readReservations(db)) {
255
- if (mode === "serve" && reservation.state === "active") {
256
- const recovered = {
257
- ...reservation, state: "uncertain", uncertain_since: new Date().toISOString(), reason_code: "diagnostic_server_restarted"
258
- };
259
- db.prepare("UPDATE reservations SET payload = ? WHERE reservation_id = ?").run(JSON.stringify(recovered), reservation.reservation_id);
260
- }
261
- }
262
- if (mode === "serve")
263
- db.exec("COMMIT");
264
- return new SqliteDiagnosticJournal(db, ownership);
265
- }
266
- catch (error) {
267
- db?.close();
268
- ownership?.close();
269
- if (error instanceof AppError)
270
- throw error;
271
- const busy = isObject(error) && error.errcode === 5;
272
- throw new AppError(busy ? "diagnostic_state_in_use" : "diagnostic_state_invalid", busy ? "Another server owns this diagnostic ledger; do not bypass it with a new state file" : "Cannot open diagnostic state safely; existing state was not reset");
273
- }
274
- }
275
- export function openDiagnosticJournal(stateFile, inventoryIdentity) {
276
- return openJournal(stateFile, inventoryIdentity, "serve");
277
- }
278
- /** No API device calls: release is explicitly authorized operator authority, not observed completion. */
279
- export function releaseDiagnosticReservations(stateFile, request) {
280
- const evidence = validateReleaseRequest(request);
281
- const journal = openJournal(stateFile, evidence.inventory_identity, "release");
282
- try {
283
- return journal.release(evidence);
284
- }
285
- catch (error) {
286
- if (error instanceof AppError)
287
- throw error;
288
- throw new AppError("diagnostic_release_failed", "Operator release could not commit; inspect reservations and audit before retrying");
289
- }
290
- finally {
291
- journal.close();
292
- }
293
- }
294
- /** Read-only inspection never acquires ownership, clears reservations, or normalizes state. */
295
- export function inspectDiagnosticJournal(stateFile) {
296
- let db;
297
- try {
298
- checkPrivateFile(stateFile);
299
- db = new DatabaseSync(stateFile, { readOnly: true, allowExtension: false, timeout: 1000 });
300
- // Keep integrity, schema, reservations, and audit in one read-only snapshot.
301
- db.exec("PRAGMA trusted_schema = OFF; BEGIN");
302
- checkIntegrity(db);
303
- const metadata = readMetadata(db);
304
- const inspection = { ...metadata, reservations: readReservations(db), release_audit: readAudit(db, metadata.schema_version, metadata.inventory_identity) };
305
- db.exec("COMMIT");
306
- return inspection;
307
- }
308
- catch (error) {
309
- if (error instanceof AppError)
310
- throw error;
311
- throw new AppError("diagnostic_state_invalid", "Cannot inspect diagnostic state; no file was created or reset");
312
- }
313
- finally {
314
- db?.close();
315
- }
316
- }
317
- //# sourceMappingURL=journal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/diagnostics/journal.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import type { DiagnosticReservationInfo } from "./types.js";
2
- /** Write-ahead storage: save/remove return only after the durable change commits. */
3
- export interface DiagnosticJournal {
4
- load(): DiagnosticReservationInfo[];
5
- save(reservation: DiagnosticReservationInfo): void;
6
- remove(reservationId: string): void;
7
- close(): void;
8
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=journalTypes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"journalTypes.js","sourceRoot":"","sources":["../../src/diagnostics/journalTypes.ts"],"names":[],"mappings":""}