rlz-engine 1.0.54 → 1.0.55

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 (134) hide show
  1. package/README.md +225 -0
  2. package/dist/back/auth/admin-secret.d.ts +4 -0
  3. package/dist/back/auth/admin-secret.js +86 -0
  4. package/dist/back/auth/admin-secret.js.map +1 -0
  5. package/dist/back/auth/cookies.d.ts +12 -0
  6. package/dist/back/auth/cookies.js +20 -0
  7. package/dist/back/auth/cookies.js.map +1 -0
  8. package/dist/back/auth/csrf.d.ts +8 -0
  9. package/dist/back/auth/csrf.js +47 -0
  10. package/dist/back/auth/csrf.js.map +1 -0
  11. package/dist/back/auth/model.d.ts +7 -3
  12. package/dist/back/auth/module.d.ts +14 -0
  13. package/dist/back/auth/module.js +121 -0
  14. package/dist/back/auth/module.js.map +1 -0
  15. package/dist/back/auth/rate-limit.d.ts +11 -0
  16. package/dist/back/auth/rate-limit.js +59 -0
  17. package/dist/back/auth/rate-limit.js.map +1 -0
  18. package/dist/back/auth/session.d.ts +22 -0
  19. package/dist/back/auth/session.js +55 -0
  20. package/dist/back/auth/session.js.map +1 -0
  21. package/dist/back/auth/storage.d.ts +9 -9
  22. package/dist/back/auth/storage.js +39 -36
  23. package/dist/back/auth/storage.js.map +1 -1
  24. package/dist/back/auth/utils.d.ts +10 -8
  25. package/dist/back/auth/utils.js +43 -56
  26. package/dist/back/auth/utils.js.map +1 -1
  27. package/dist/back/certificate/adm-rpc.d.ts +5 -0
  28. package/dist/back/certificate/adm-rpc.js +52 -0
  29. package/dist/back/certificate/adm-rpc.js.map +1 -0
  30. package/dist/back/certificate/module.d.ts +13 -0
  31. package/dist/back/certificate/module.js +19 -0
  32. package/dist/back/certificate/module.js.map +1 -0
  33. package/dist/back/cli/cli-engine.d.ts +25 -0
  34. package/dist/back/cli/cli-engine.js +68 -0
  35. package/dist/back/cli/cli-engine.js.map +1 -0
  36. package/dist/back/http/module.d.ts +7 -0
  37. package/dist/back/http/module.js +34 -0
  38. package/dist/back/http/module.js.map +1 -0
  39. package/dist/back/http/server.d.ts +22 -0
  40. package/dist/back/http/server.js +126 -0
  41. package/dist/back/http/server.js.map +1 -0
  42. package/dist/back/logger/adm-rpc.d.ts +2 -0
  43. package/dist/back/logger/adm-rpc.js +50 -0
  44. package/dist/back/logger/adm-rpc.js.map +1 -0
  45. package/dist/back/logger/audit-logger.d.ts +97 -0
  46. package/dist/back/logger/audit-logger.js +155 -0
  47. package/dist/back/logger/audit-logger.js.map +1 -0
  48. package/dist/back/logger/cli.d.ts +2 -0
  49. package/dist/back/logger/cli.js +43 -0
  50. package/dist/back/logger/cli.js.map +1 -0
  51. package/dist/back/logger/format.d.ts +3 -0
  52. package/dist/back/logger/format.js +27 -0
  53. package/dist/back/logger/format.js.map +1 -0
  54. package/dist/back/logger/module.d.ts +14 -0
  55. package/dist/back/logger/module.js +24 -0
  56. package/dist/back/logger/module.js.map +1 -0
  57. package/dist/back/logger/sqlite-storage.d.ts +27 -0
  58. package/dist/back/logger/sqlite-storage.js +169 -0
  59. package/dist/back/logger/sqlite-storage.js.map +1 -0
  60. package/dist/back/logger/system-logger.d.ts +27 -0
  61. package/dist/back/logger/system-logger.js +82 -0
  62. package/dist/back/logger/system-logger.js.map +1 -0
  63. package/dist/back/module/composer.d.ts +34 -0
  64. package/dist/back/module/composer.js +57 -0
  65. package/dist/back/module/composer.js.map +1 -0
  66. package/dist/back/rpc/gen.d.ts +2 -1
  67. package/dist/back/rpc/gen.js +38 -17
  68. package/dist/back/rpc/gen.js.map +1 -1
  69. package/dist/back/rpc/module.d.ts +14 -0
  70. package/dist/back/rpc/module.js +43 -0
  71. package/dist/back/rpc/module.js.map +1 -0
  72. package/dist/back/rpc/rpc.d.ts +53 -6
  73. package/dist/back/rpc/rpc.js +72 -29
  74. package/dist/back/rpc/rpc.js.map +1 -1
  75. package/dist/back/storage/db.js +5 -3
  76. package/dist/back/storage/db.js.map +1 -1
  77. package/dist/back/storage/model.d.ts +2 -2
  78. package/dist/back/storage/model.js +2 -2
  79. package/dist/back/storage/model.js.map +1 -1
  80. package/dist/back/storage/sync.d.ts +5 -2
  81. package/dist/back/storage/sync.js +1 -3
  82. package/dist/back/storage/sync.js.map +1 -1
  83. package/dist/client/adm/admin.d.ts +17 -0
  84. package/dist/client/adm/admin.js +62 -0
  85. package/dist/client/adm/admin.js.map +1 -0
  86. package/dist/client/adm/audit-logs.d.ts +5 -0
  87. package/dist/client/adm/audit-logs.js +68 -0
  88. package/dist/client/adm/audit-logs.js.map +1 -0
  89. package/dist/client/adm/certificate.d.ts +5 -0
  90. package/dist/client/adm/certificate.js +48 -0
  91. package/dist/client/adm/certificate.js.map +1 -0
  92. package/dist/client/config.d.ts +2 -0
  93. package/dist/client/config.js +7 -0
  94. package/dist/client/config.js.map +1 -1
  95. package/dist/client/rpc.d.ts +4 -4
  96. package/dist/client/rpc.js +19 -7
  97. package/dist/client/rpc.js.map +1 -1
  98. package/dist/client/screens/404.js.map +1 -1
  99. package/dist/client/screens/SignupSigninScreen.d.ts +13 -1
  100. package/dist/client/screens/SignupSigninScreen.js +41 -37
  101. package/dist/client/screens/SignupSigninScreen.js.map +1 -1
  102. package/dist/client/state/auth.d.ts +13 -7
  103. package/dist/client/state/auth.js +24 -19
  104. package/dist/client/state/auth.js.map +1 -1
  105. package/dist/client/sync.d.ts +7 -2
  106. package/dist/client/sync.js +5 -3
  107. package/dist/client/sync.js.map +1 -1
  108. package/dist/client/widgets/ItemsSelect.js +15 -8
  109. package/dist/client/widgets/ItemsSelect.js.map +1 -1
  110. package/package.json +87 -77
  111. package/dist/back/auth/controllers.d.ts +0 -7
  112. package/dist/back/auth/controllers.js +0 -39
  113. package/dist/back/auth/controllers.js.map +0 -1
  114. package/dist/back/esbuild-plugin-pino.d.ts +0 -6
  115. package/dist/back/esbuild-plugin-pino.js +0 -87
  116. package/dist/back/esbuild-plugin-pino.js.map +0 -1
  117. package/dist/back/logger.d.ts +0 -7
  118. package/dist/back/logger.js +0 -43
  119. package/dist/back/logger.js.map +0 -1
  120. package/dist/back/server.d.ts +0 -17
  121. package/dist/back/server.js +0 -94
  122. package/dist/back/server.js.map +0 -1
  123. package/dist/client/api/api.d.ts +0 -22
  124. package/dist/client/api/api.js +0 -87
  125. package/dist/client/api/api.js.map +0 -1
  126. package/dist/client/api/auth.d.ts +0 -5
  127. package/dist/client/api/auth.js +0 -22
  128. package/dist/client/api/auth.js.map +0 -1
  129. package/dist/shared/api/auth.d.ts +0 -19
  130. package/dist/shared/api/auth.js +0 -17
  131. package/dist/shared/api/auth.js.map +0 -1
  132. package/dist/shared/api/sync.d.ts +0 -21
  133. package/dist/shared/api/sync.js +0 -22
  134. package/dist/shared/api/sync.js.map +0 -1
@@ -0,0 +1,43 @@
1
+ import { number, oneOf, option, optional, string } from 'cmd-ts';
2
+ import { resolve } from 'node:path';
3
+ import { formatAuditRecord } from './format.js';
4
+ import { readAuditLogFile } from './sqlite-storage.js';
5
+ const levels = ['fatal', 'error', 'warn', 'info', 'debug', 'trace'];
6
+ export function makeAuditLogCliModule(workingDirectory = () => process.cwd()) {
7
+ return {
8
+ name: 'logger',
9
+ description: 'Read and inspect persisted audit logs.',
10
+ commands: {
11
+ logs: {
12
+ description: 'Read audit records from a SQLite database with optional filters.',
13
+ args: {
14
+ database: option({
15
+ long: 'database',
16
+ type: string,
17
+ defaultValue: () => 'logs.sqlite',
18
+ description: 'SQLite database path, relative to the application working directory.'
19
+ }),
20
+ from: option({ long: 'from', type: optional(string), description: 'Include records at or after this ISO timestamp.' }),
21
+ to: option({ long: 'to', type: optional(string), description: 'Include records at or before this ISO timestamp.' }),
22
+ module: option({ long: 'module', type: optional(string), description: 'Only include this logger module.' }),
23
+ level: option({ long: 'level', type: optional(oneOf(levels)), description: 'Only include this log level.' }),
24
+ limit: option({ long: 'limit', type: optional(number), description: 'Maximum records to return, from 1 to 1000.' }),
25
+ offset: option({ long: 'offset', type: optional(number), description: 'Number of matching records to skip.' })
26
+ },
27
+ handler: async ({ database, from, to, module, level, limit, offset }) => {
28
+ const directory = typeof workingDirectory === 'function' ? workingDirectory() : workingDirectory;
29
+ const page = readAuditLogFile(resolve(directory, database), {
30
+ ...(from === undefined ? {} : { from }),
31
+ ...(to === undefined ? {} : { to }),
32
+ ...(module === undefined ? {} : { module }),
33
+ ...(level === undefined ? {} : { level }),
34
+ limit: limit ?? 100,
35
+ offset: offset ?? 0
36
+ });
37
+ process.stdout.write(page.records.map((record) => formatAuditRecord(record)).join(''));
38
+ }
39
+ }
40
+ }
41
+ };
42
+ }
43
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/back/logger/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AuditRecord } from './audit-logger.js';
2
+ /** Formats an audit record for both the live console sink and the log-reading CLI. */
3
+ export declare function formatAuditRecord(record: AuditRecord, color?: boolean): string;
@@ -0,0 +1,27 @@
1
+ import { inspect } from 'node:util';
2
+ const LEVEL_COLORS = {
3
+ fatal: '\u001b[35m',
4
+ error: '\u001b[31m',
5
+ warn: '\u001b[33m',
6
+ info: '\u001b[32m',
7
+ debug: '\u001b[36m',
8
+ trace: '\u001b[90m'
9
+ };
10
+ /** Formats an audit record for both the live console sink and the log-reading CLI. */
11
+ export function formatAuditRecord(record, color = true) {
12
+ const prefix = `${record.time} ${record.level.toUpperCase()} [${record.module}]`;
13
+ const formattedPrefix = color ? `${LEVEL_COLORS[record.level]}${prefix}\u001b[0m` : prefix;
14
+ const details = record.data === undefined
15
+ ? ''
16
+ : Object.entries(record.data)
17
+ .map(([key, value]) => {
18
+ const formattedValue = inspect(value, { colors: color, compact: true, depth: 1, breakLength: Infinity });
19
+ return `\n ${key}: ${formattedValue.replaceAll('\n', '\n ')}`;
20
+ })
21
+ .join('');
22
+ const error = record.error === undefined
23
+ ? ''
24
+ : `\n error: ${(record.error.stack ?? `${record.error.name}: ${record.error.message}`).replaceAll('\n', '\n ')}`;
25
+ return `${formattedPrefix} ${record.type}${details}${error}\n`;
26
+ }
27
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/back/logger/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC,MAAM,YAAY,GAA6B;IAC3C,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;CACtB,CAAA;AAED,sFAAsF;AACtF,MAAM,UAAU,iBAAiB,CAAC,MAAmB,EAAE,KAAK,GAAG,IAAI;IAC/D,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,MAAM,GAAG,CAAA;IAChF,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,MAAM,CAAA;IAC1F,MAAM,OAAO,GACT,MAAM,CAAC,IAAI,KAAK,SAAS;QACrB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;aACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAClB,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAA;YACxG,OAAO,SAAS,GAAG,KAAK,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAA;QACvE,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAA;IACvB,MAAM,KAAK,GACP,MAAM,CAAC,KAAK,KAAK,SAAS;QACtB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAA;IAE9H,OAAO,GAAG,eAAe,IAAI,MAAM,CAAC,IAAI,GAAG,OAAO,GAAG,KAAK,IAAI,CAAA;AAClE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { makeAuditLogAdmRpc } from './adm-rpc.js';
2
+ import { makeAuditLogCliModule } from './cli.js';
3
+ import type { AdmModule } from '../../client/adm/admin.js';
4
+ declare function makeAdm(): AdmModule;
5
+ /** Audit logging integrations. Each factory is optional to consumers. */
6
+ export declare const LOGGER_MODULE: {
7
+ /** Create the SQLite audit-log reader command. */
8
+ makeCli: typeof makeAuditLogCliModule;
9
+ /** Create the admin-secret-protected audit-log query endpoint. */
10
+ makeAdmRpc: typeof makeAuditLogAdmRpc;
11
+ /** Create the audit-log administration section. */
12
+ makeAdm: typeof makeAdm;
13
+ };
14
+ export {};
@@ -0,0 +1,24 @@
1
+ import { makeAuditLogAdmRpc } from './adm-rpc.js';
2
+ import { makeAuditLogCliModule } from './cli.js';
3
+ import { AuditLogs } from '../../client/adm/audit-logs.js';
4
+ import { admRpcCall } from '../../client/rpc.js';
5
+ function makeAdm() {
6
+ return {
7
+ name: 'audit',
8
+ title: 'Audit log',
9
+ component: AuditLogs,
10
+ verify: async (auth) => {
11
+ await admRpcCall(auth, 'audit', 'logs', 1, { limit: 1, offset: 0 });
12
+ }
13
+ };
14
+ }
15
+ /** Audit logging integrations. Each factory is optional to consumers. */
16
+ export const LOGGER_MODULE = {
17
+ /** Create the SQLite audit-log reader command. */
18
+ makeCli: makeAuditLogCliModule,
19
+ /** Create the admin-secret-protected audit-log query endpoint. */
20
+ makeAdmRpc: makeAuditLogAdmRpc,
21
+ /** Create the audit-log administration section. */
22
+ makeAdm
23
+ };
24
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/back/logger/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGhD,SAAS,OAAO;IACZ,OAAO;QACH,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QACvE,CAAC;KACJ,CAAA;AACL,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,kDAAkD;IAClD,OAAO,EAAE,qBAAqB;IAC9B,kEAAkE;IAClE,UAAU,EAAE,kBAAkB;IAC9B,mDAAmD;IACnD,OAAO;CACV,CAAA"}
@@ -0,0 +1,27 @@
1
+ import type { AuditLogPage, AuditLogQuery, AuditRecord } from './audit-logger.js';
2
+ export interface SqliteAuditStorageOptions {
3
+ path: string;
4
+ retentionMs: number;
5
+ maxRecords: number;
6
+ cleanupIntervalMs?: number;
7
+ onError?: (error: unknown) => void;
8
+ }
9
+ /** Synchronous SQLite writer for the single-process application deployment model. */
10
+ export declare class SqliteAuditStorage {
11
+ private readonly options;
12
+ private readonly db;
13
+ private readonly insertRecord;
14
+ private readonly deleteExpired;
15
+ private readonly countRecords;
16
+ private readonly deleteOldest;
17
+ private readonly timer;
18
+ private readonly onError;
19
+ constructor(options: SqliteAuditStorageOptions);
20
+ write(record: AuditRecord): void;
21
+ read(query: AuditLogQuery): AuditLogPage;
22
+ close(): void;
23
+ private cleanupSafely;
24
+ private cleanup;
25
+ }
26
+ /** Reads an existing audit database without creating, pruning, or modifying it. */
27
+ export declare function readAuditLogFile(path: string, query: AuditLogQuery): AuditLogPage;
@@ -0,0 +1,169 @@
1
+ import { chmodSync, closeSync, openSync } from 'node:fs';
2
+ import { DatabaseSync } from 'node:sqlite';
3
+ const CLEANUP_MARGIN_MAX = 1000;
4
+ /** Synchronous SQLite writer for the single-process application deployment model. */
5
+ export class SqliteAuditStorage {
6
+ options;
7
+ db;
8
+ insertRecord;
9
+ deleteExpired;
10
+ countRecords;
11
+ deleteOldest;
12
+ timer;
13
+ onError;
14
+ constructor(options) {
15
+ this.options = options;
16
+ if (!Number.isFinite(options.retentionMs) || options.retentionMs <= 0) {
17
+ throw new RangeError('Audit retention must be a positive finite number of milliseconds');
18
+ }
19
+ if (!Number.isSafeInteger(options.maxRecords) || options.maxRecords < 1) {
20
+ throw new RangeError('Audit maximum record count must be a positive safe integer');
21
+ }
22
+ this.onError = options.onError ?? reportStorageError;
23
+ const fd = openSync(options.path, 'a', 0o600);
24
+ closeSync(fd);
25
+ chmodSync(options.path, 0o600);
26
+ this.db = new DatabaseSync(options.path);
27
+ try {
28
+ this.db.exec('PRAGMA busy_timeout = 5000; PRAGMA journal_mode = WAL;');
29
+ this.db.exec(`
30
+ CREATE TABLE IF NOT EXISTS audit_logs (
31
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
32
+ time TEXT NOT NULL,
33
+ level TEXT NOT NULL,
34
+ module TEXT NOT NULL,
35
+ type TEXT NOT NULL,
36
+ data TEXT,
37
+ error TEXT
38
+ ) STRICT;
39
+ CREATE INDEX IF NOT EXISTS audit_logs_time_id ON audit_logs (time, id);
40
+ CREATE INDEX IF NOT EXISTS audit_logs_module_time_id ON audit_logs (module, time, id);
41
+ CREATE INDEX IF NOT EXISTS audit_logs_level_time_id ON audit_logs (level, time, id);
42
+ CREATE INDEX IF NOT EXISTS audit_logs_module_level_time_id ON audit_logs (module, level, time, id);
43
+ `);
44
+ this.insertRecord = this.db.prepare(`
45
+ INSERT INTO audit_logs (time, level, module, type, data, error)
46
+ VALUES (?, ?, ?, ?, ?, ?)
47
+ `);
48
+ this.deleteExpired = this.db.prepare('DELETE FROM audit_logs WHERE time < ?');
49
+ this.countRecords = this.db.prepare('SELECT COUNT(*) AS count FROM audit_logs');
50
+ this.deleteOldest = this.db.prepare(`
51
+ DELETE FROM audit_logs WHERE id IN (
52
+ SELECT id FROM audit_logs ORDER BY time ASC, id ASC LIMIT ?
53
+ )
54
+ `);
55
+ this.cleanup();
56
+ this.timer = setInterval(() => this.cleanupSafely(), options.cleanupIntervalMs ?? 60 * 60 * 1000);
57
+ this.timer.unref();
58
+ }
59
+ catch (error) {
60
+ this.db.close();
61
+ throw error;
62
+ }
63
+ }
64
+ write(record) {
65
+ this.insertRecord.run(record.time, record.level, record.module, record.type, record.data === undefined ? null : JSON.stringify(record.data), record.error === undefined ? null : JSON.stringify(record.error));
66
+ }
67
+ read(query) {
68
+ return readAuditLogDatabase(this.db, query);
69
+ }
70
+ close() {
71
+ clearInterval(this.timer);
72
+ this.db.close();
73
+ }
74
+ cleanupSafely() {
75
+ try {
76
+ this.cleanup();
77
+ }
78
+ catch (error) {
79
+ this.onError(error);
80
+ }
81
+ }
82
+ cleanup() {
83
+ const cutoff = new Date(Date.now() - this.options.retentionMs).toISOString();
84
+ this.deleteExpired.run(cutoff);
85
+ const countRow = this.countRecords.get();
86
+ if (countRow.count <= this.options.maxRecords)
87
+ return;
88
+ const margin = Math.min(CLEANUP_MARGIN_MAX, Math.max(1, Math.floor(this.options.maxRecords * 0.01)), this.options.maxRecords - 1);
89
+ const targetCount = Math.max(0, this.options.maxRecords - margin);
90
+ this.deleteOldest.run(countRow.count - targetCount);
91
+ }
92
+ }
93
+ /** Reads an existing audit database without creating, pruning, or modifying it. */
94
+ export function readAuditLogFile(path, query) {
95
+ const db = new DatabaseSync(path, { readOnly: true });
96
+ try {
97
+ return readAuditLogDatabase(db, query);
98
+ }
99
+ finally {
100
+ db.close();
101
+ }
102
+ }
103
+ function readAuditLogDatabase(db, query) {
104
+ validatePage(query);
105
+ const from = query.from === undefined ? undefined : normalizeTime(query.from, 'from');
106
+ const to = query.to === undefined ? undefined : normalizeTime(query.to, 'to');
107
+ if (from !== undefined && to !== undefined && from > to) {
108
+ throw new RangeError('Audit query from must not be later than to');
109
+ }
110
+ const conditions = [];
111
+ const values = [];
112
+ if (from !== undefined) {
113
+ conditions.push('time >= ?');
114
+ values.push(from);
115
+ }
116
+ if (to !== undefined) {
117
+ conditions.push('time <= ?');
118
+ values.push(to);
119
+ }
120
+ if (query.module !== undefined) {
121
+ conditions.push('module = ?');
122
+ values.push(query.module);
123
+ }
124
+ if (query.level !== undefined) {
125
+ conditions.push('level = ?');
126
+ values.push(query.level);
127
+ }
128
+ const where = conditions.length === 0 ? '' : `WHERE ${conditions.join(' AND ')}`;
129
+ const count = db.prepare(`SELECT COUNT(*) AS count FROM audit_logs ${where}`).get(...values);
130
+ const rows = db
131
+ .prepare(`
132
+ SELECT id, time, level, module, type, data, error
133
+ FROM audit_logs ${where}
134
+ ORDER BY time DESC, id DESC
135
+ LIMIT ? OFFSET ?
136
+ `)
137
+ .all(...values, query.limit, query.offset);
138
+ return { records: rows.map(toAuditLogEntry), total: count.count };
139
+ }
140
+ function toAuditLogEntry(row) {
141
+ return {
142
+ id: row.id,
143
+ time: row.time,
144
+ level: row.level,
145
+ module: row.module,
146
+ type: row.type,
147
+ ...(row.data === null ? {} : { data: JSON.parse(row.data) }),
148
+ ...(row.error === null ? {} : { error: JSON.parse(row.error) })
149
+ };
150
+ }
151
+ function validatePage(query) {
152
+ if (!Number.isSafeInteger(query.limit) || query.limit < 1 || query.limit > 1000) {
153
+ throw new RangeError('Audit page limit must be an integer between 1 and 1000');
154
+ }
155
+ if (!Number.isSafeInteger(query.offset) || query.offset < 0) {
156
+ throw new RangeError('Audit page offset must be a non-negative safe integer');
157
+ }
158
+ }
159
+ function normalizeTime(value, field) {
160
+ const date = new Date(value);
161
+ if (!Number.isFinite(date.getTime()))
162
+ throw new RangeError(`Audit query ${field} must be a valid date`);
163
+ return date.toISOString();
164
+ }
165
+ function reportStorageError(error) {
166
+ const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
167
+ process.stderr.write(`AuditLogger SQLite maintenance error: ${message.replaceAll(/\s*\n\s*/g, ' | ')}\n`);
168
+ }
169
+ //# sourceMappingURL=sqlite-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-storage.js","sourceRoot":"","sources":["../../../src/back/logger/sqlite-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { FastifyBaseLogger, FastifyLogFn } from 'fastify';
2
+ type Bindings = Parameters<FastifyBaseLogger['child']>[0];
3
+ type ChildLoggerOptions = Parameters<FastifyBaseLogger['child']>[1];
4
+ export interface SystemLoggerConfig {
5
+ debug?: boolean;
6
+ }
7
+ /** Pino-compatible adapter for Fastify; application modules should use getAuditLogger directly. */
8
+ export declare class SystemLogger implements FastifyBaseLogger {
9
+ private readonly name;
10
+ private readonly bindingsValue;
11
+ private readonly threshold;
12
+ private readonly audit;
13
+ readonly level: string;
14
+ constructor(name?: string, { debug }?: SystemLoggerConfig, bindings?: Bindings);
15
+ fatal: FastifyLogFn;
16
+ error: FastifyLogFn;
17
+ warn: FastifyLogFn;
18
+ info: FastifyLogFn;
19
+ debug: FastifyLogFn;
20
+ trace: FastifyLogFn;
21
+ silent: FastifyLogFn;
22
+ child(bindings: Bindings, _options?: ChildLoggerOptions): FastifyBaseLogger;
23
+ private makeLog;
24
+ private log;
25
+ }
26
+ export declare function getSystemLogger(name: string, config?: SystemLoggerConfig): SystemLogger;
27
+ export {};
@@ -0,0 +1,82 @@
1
+ import { PRODUCTION } from '../config.js';
2
+ import { getAuditLogger } from './audit-logger.js';
3
+ const LEVELS = { fatal: 60, error: 50, warn: 40, info: 30, debug: 20, trace: 10 };
4
+ /** Pino-compatible adapter for Fastify; application modules should use getAuditLogger directly. */
5
+ export class SystemLogger {
6
+ name;
7
+ bindingsValue;
8
+ threshold;
9
+ audit = getAuditLogger('SYSTEM');
10
+ level;
11
+ constructor(name = 'SYSTEM', { debug = false } = {}, bindings = {}) {
12
+ this.name = name;
13
+ this.bindingsValue = bindings;
14
+ this.threshold = debug ? (PRODUCTION ? 'debug' : 'trace') : 'info';
15
+ this.level = this.threshold;
16
+ }
17
+ fatal = this.makeLog('fatal');
18
+ error = this.makeLog('error');
19
+ warn = this.makeLog('warn');
20
+ info = this.makeLog('info');
21
+ debug = this.makeLog('debug');
22
+ trace = this.makeLog('trace');
23
+ silent = (() => undefined);
24
+ child(bindings, _options) {
25
+ return new SystemLogger(this.name, { debug: this.threshold !== 'info' }, { ...this.bindingsValue, ...bindings });
26
+ }
27
+ makeLog(level) {
28
+ return ((obj, msg, ...args) => this.log(level, obj, msg, args));
29
+ }
30
+ log(level, obj, msg, args = []) {
31
+ if (LEVELS[level] < LEVELS[this.threshold])
32
+ return;
33
+ const { message, data, error } = normalizeLog(obj, msg, args, this.bindingsValue);
34
+ this.audit.write(level, { ...(data ?? {}), type: message, logger: this.name }, error);
35
+ if (PRODUCTION) {
36
+ const fields = data === undefined ? '' : ` ${formatFields(data)}`;
37
+ const stack = error?.stack?.replaceAll(/\s*\n\s*/g, ' | ');
38
+ const errorText = error === undefined ? '' : ` ${error.name}: ${error.message}${stack ? ` ${stack}` : ''}`;
39
+ const singleLineMessage = message.replaceAll(/\s*[\r\n]+\s*/g, ' | ');
40
+ process.stdout.write(`${new Date().toISOString()} ${level.toUpperCase()} [${this.name}] ${singleLineMessage}${fields}${errorText}\n`);
41
+ }
42
+ }
43
+ }
44
+ export function getSystemLogger(name, config) {
45
+ return new SystemLogger(name, config);
46
+ }
47
+ function normalizeLog(obj, msg, args, bindings) {
48
+ const values = [obj, ...args];
49
+ let message = typeof obj === 'string' ? obj : typeof msg === 'string' ? msg : '';
50
+ if (typeof obj === 'string' && typeof msg === 'string')
51
+ message = msg;
52
+ const data = { ...bindings };
53
+ let error;
54
+ for (const value of values) {
55
+ if (value instanceof Error)
56
+ error = value;
57
+ else if (isRecord(value))
58
+ Object.assign(data, value);
59
+ }
60
+ if (typeof obj !== 'string' && typeof msg === 'string')
61
+ message = msg;
62
+ if (!message)
63
+ message = error?.message ?? 'Log record';
64
+ return { message, ...(Object.keys(data).length ? { data: jsonSafe(data) } : {}), ...(error ? { error } : {}) };
65
+ }
66
+ function isRecord(value) {
67
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
68
+ }
69
+ function jsonSafe(data) {
70
+ try {
71
+ return JSON.parse(JSON.stringify(data));
72
+ }
73
+ catch {
74
+ return { serializationError: 'Structured log data was not JSON-serializable' };
75
+ }
76
+ }
77
+ function formatFields(data) {
78
+ return Object.entries(data)
79
+ .map(([key, value]) => `${key}=${JSON.stringify(value)}`)
80
+ .join(' ');
81
+ }
82
+ //# sourceMappingURL=system-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-logger.js","sourceRoot":"","sources":["../../../src/back/logger/system-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { FastifyInstance, FastifyPluginOptions } from 'fastify';
2
+ import { CliEngine, type CliModule, DevCliEngine } from '../cli/cli-engine.js';
3
+ import type { AdmRpcPluginBuilder, RpcPluginBuilder } from '../rpc/rpc.js';
4
+ import type { AdmModule } from '../../client/adm/admin.js';
5
+ /**
6
+ * Runtime facets returned by feature module factories. Applications create only
7
+ * the facets they need, then pass those values to `composeModules`.
8
+ */
9
+ export interface ModuleFacets {
10
+ cli?: readonly CliModule[];
11
+ devCli?: readonly CliModule[];
12
+ rpc?: readonly RpcPluginBuilder[];
13
+ admRpc?: readonly AdmRpcPluginBuilder[];
14
+ adm?: readonly AdmModule[];
15
+ rpcOptions?: Readonly<Record<string, FastifyPluginOptions>>;
16
+ admRpcOptions?: Readonly<Record<string, FastifyPluginOptions>>;
17
+ }
18
+ /**
19
+ * Combines selected feature facets into application startup operations.
20
+ * Factory invocation and deployment configuration remain in the application;
21
+ * this object only registers the resulting CLI modules and RPC plugins.
22
+ */
23
+ export declare function composeModules(...facets: readonly ModuleFacets[]): {
24
+ /** Administration sections for the application's route at `/.adm`. */
25
+ adm: AdmModule[];
26
+ /** Register the selected operational commands with the application's CLI. */
27
+ registerCli(engine: CliEngine): CliEngine;
28
+ /** Register development-only commands with a separate CLI entry point. */
29
+ registerDevCli(engine: DevCliEngine): DevCliEngine;
30
+ /** Register user-authenticated and anonymous RPC plugins on a Fastify server. */
31
+ registerRpc(server: FastifyInstance): Promise<void>;
32
+ /** Register admin-secret-protected RPC plugins on a Fastify server. */
33
+ registerAdmRpc(server: FastifyInstance): Promise<void>;
34
+ };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Combines selected feature facets into application startup operations.
3
+ * Factory invocation and deployment configuration remain in the application;
4
+ * this object only registers the resulting CLI modules and RPC plugins.
5
+ */
6
+ export function composeModules(...facets) {
7
+ const cliModules = facets.flatMap(({ cli = [] }) => cli);
8
+ const devCliModules = facets.flatMap(({ devCli = [] }) => devCli);
9
+ const rpcBuilders = facets.flatMap(({ rpc = [] }) => rpc);
10
+ const admRpcBuilders = facets.flatMap(({ admRpc = [] }) => admRpc);
11
+ const admModules = facets.flatMap(({ adm = [] }) => adm);
12
+ const rpcOptions = Object.assign({}, ...facets.map(({ rpcOptions = {} }) => rpcOptions));
13
+ const admRpcOptions = Object.assign({}, ...facets.map(({ admRpcOptions = {} }) => admRpcOptions));
14
+ assertUniqueNames(cliModules.map(({ name }) => name), 'CLI module');
15
+ assertUniqueNames(devCliModules.map(({ name }) => name), 'development CLI module');
16
+ assertUniqueNames(rpcBuilders.map(({ name }) => name), 'RPC plugin');
17
+ assertUniqueNames(admRpcBuilders.map(({ name }) => name), 'administrative RPC plugin');
18
+ assertUniqueNames(admModules.map(({ name }) => name), 'administration section');
19
+ return {
20
+ /** Administration sections for the application's route at `/.adm`. */
21
+ adm: admModules,
22
+ /** Register the selected operational commands with the application's CLI. */
23
+ registerCli(engine) {
24
+ for (const module of cliModules)
25
+ engine.register(module);
26
+ return engine;
27
+ },
28
+ /** Register development-only commands with a separate CLI entry point. */
29
+ registerDevCli(engine) {
30
+ for (const module of devCliModules)
31
+ engine.register(module);
32
+ return engine;
33
+ },
34
+ /** Register user-authenticated and anonymous RPC plugins on a Fastify server. */
35
+ async registerRpc(server) {
36
+ for (const builder of rpcBuilders) {
37
+ // RPC builders with no options use `never`; Fastify's register overload expects its default options type.
38
+ await server.register(builder.makeFastifyPlugin(), rpcOptions[builder.name]);
39
+ }
40
+ },
41
+ /** Register admin-secret-protected RPC plugins on a Fastify server. */
42
+ async registerAdmRpc(server) {
43
+ for (const builder of admRpcBuilders) {
44
+ await server.register(builder.makeFastifyPlugin(), admRpcOptions[builder.name]);
45
+ }
46
+ }
47
+ };
48
+ }
49
+ function assertUniqueNames(names, kind) {
50
+ const seen = new Set();
51
+ for (const name of names) {
52
+ if (seen.has(name))
53
+ throw new Error(`${kind} already composed: ${name}`);
54
+ seen.add(name);
55
+ }
56
+ }
57
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../../../src/back/module/composer.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
- import { RpcPluginBuilder } from './rpc.js';
1
+ import { AdmRpcPluginBuilder, RpcPluginBuilder } from './rpc.js';
2
2
  export declare function generateClient(fileName: string, ...rpcBuilders: readonly RpcPluginBuilder[]): string;
3
+ export declare function generateAdmClient(fileName: string, ...rpcBuilders: readonly AdmRpcPluginBuilder[]): string;