atabey 0.1.1-beta → 0.1.2

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 (229) hide show
  1. package/README.md +144 -78
  2. package/dist/atabey/src/cli/commands/coverage.js +17 -12
  3. package/dist/atabey/src/cli/commands/coverage.js.map +1 -1
  4. package/dist/atabey/src/cli/commands/lint.d.ts +2 -1
  5. package/dist/atabey/src/cli/commands/lint.js +20 -1
  6. package/dist/atabey/src/cli/commands/lint.js.map +1 -1
  7. package/dist/atabey/src/cli/commands/mcp.js +56 -23
  8. package/dist/atabey/src/cli/commands/mcp.js.map +1 -1
  9. package/dist/atabey/src/cli/commands/orchestrate.d.ts +6 -6
  10. package/dist/shared/src/agent-identity.d.ts +1 -34
  11. package/dist/shared/src/agent-identity.js +1 -76
  12. package/dist/shared/src/agent-identity.js.map +1 -1
  13. package/dist/shared/src/api-catalog.d.ts +1 -57
  14. package/dist/shared/src/api-catalog.js +1 -253
  15. package/dist/shared/src/api-catalog.js.map +1 -1
  16. package/dist/shared/src/audit-chain.d.ts +1 -80
  17. package/dist/shared/src/audit-chain.js +1 -261
  18. package/dist/shared/src/audit-chain.js.map +1 -1
  19. package/dist/shared/src/audit.d.ts +1 -121
  20. package/dist/shared/src/audit.js +1 -321
  21. package/dist/shared/src/audit.js.map +1 -1
  22. package/dist/shared/src/constants.d.ts +1 -150
  23. package/dist/shared/src/constants.js +1 -211
  24. package/dist/shared/src/constants.js.map +1 -1
  25. package/dist/shared/src/database.d.ts +1 -6
  26. package/dist/shared/src/database.js +1 -15
  27. package/dist/shared/src/database.js.map +1 -1
  28. package/dist/shared/src/errors.d.ts +1 -46
  29. package/dist/shared/src/errors.js +1 -68
  30. package/dist/shared/src/errors.js.map +1 -1
  31. package/dist/shared/src/file-lock.d.ts +1 -93
  32. package/dist/shared/src/file-lock.js +1 -239
  33. package/dist/shared/src/file-lock.js.map +1 -1
  34. package/dist/shared/src/fs.d.ts +1 -9
  35. package/dist/shared/src/fs.js +1 -53
  36. package/dist/shared/src/fs.js.map +1 -1
  37. package/dist/shared/src/index.d.ts +2 -31
  38. package/dist/shared/src/index.js +2 -31
  39. package/dist/shared/src/index.js.map +1 -1
  40. package/dist/shared/src/job-queue.d.ts +1 -76
  41. package/dist/shared/src/job-queue.js +1 -199
  42. package/dist/shared/src/job-queue.js.map +1 -1
  43. package/dist/shared/src/lock.d.ts +1 -82
  44. package/dist/shared/src/lock.js +1 -158
  45. package/dist/shared/src/lock.js.map +1 -1
  46. package/dist/shared/src/logger.d.ts +1 -31
  47. package/dist/shared/src/logger.js +1 -152
  48. package/dist/shared/src/logger.js.map +1 -1
  49. package/dist/shared/src/memory-prune.d.ts +1 -18
  50. package/dist/shared/src/memory-prune.js +1 -47
  51. package/dist/shared/src/memory-prune.js.map +1 -1
  52. package/dist/shared/src/migrations.d.ts +1 -69
  53. package/dist/shared/src/migrations.js +1 -393
  54. package/dist/shared/src/migrations.js.map +1 -1
  55. package/dist/shared/src/modules/agent/agent-identity.d.ts +34 -0
  56. package/dist/shared/src/modules/agent/agent-identity.js +77 -0
  57. package/dist/shared/src/modules/agent/agent-identity.js.map +1 -0
  58. package/dist/shared/src/modules/agent/api-catalog.d.ts +57 -0
  59. package/dist/shared/src/modules/agent/api-catalog.js +254 -0
  60. package/dist/shared/src/modules/agent/api-catalog.js.map +1 -0
  61. package/dist/shared/src/modules/agent/index.d.ts +3 -0
  62. package/dist/shared/src/modules/agent/index.js +4 -0
  63. package/dist/shared/src/modules/agent/index.js.map +1 -0
  64. package/dist/shared/src/modules/agent/tokenizer.d.ts +54 -0
  65. package/dist/shared/src/modules/agent/tokenizer.js +272 -0
  66. package/dist/shared/src/modules/agent/tokenizer.js.map +1 -0
  67. package/dist/shared/src/modules/concurrency/file-lock.d.ts +93 -0
  68. package/dist/shared/src/modules/concurrency/file-lock.js +240 -0
  69. package/dist/shared/src/modules/concurrency/file-lock.js.map +1 -0
  70. package/dist/shared/src/modules/concurrency/index.d.ts +6 -0
  71. package/dist/shared/src/modules/concurrency/index.js +7 -0
  72. package/dist/shared/src/modules/concurrency/index.js.map +1 -0
  73. package/dist/shared/src/modules/concurrency/job-queue.d.ts +76 -0
  74. package/dist/shared/src/modules/concurrency/job-queue.js +200 -0
  75. package/dist/shared/src/modules/concurrency/job-queue.js.map +1 -0
  76. package/dist/shared/src/modules/concurrency/lock.d.ts +82 -0
  77. package/dist/shared/src/modules/concurrency/lock.js +159 -0
  78. package/dist/shared/src/modules/concurrency/lock.js.map +1 -0
  79. package/dist/shared/src/modules/concurrency/resilience.d.ts +84 -0
  80. package/dist/shared/src/modules/concurrency/resilience.js +217 -0
  81. package/dist/shared/src/modules/concurrency/resilience.js.map +1 -0
  82. package/dist/shared/src/modules/concurrency/worker-pool.d.ts +52 -0
  83. package/dist/shared/src/modules/concurrency/worker-pool.js +229 -0
  84. package/dist/shared/src/modules/concurrency/worker-pool.js.map +1 -0
  85. package/dist/shared/src/modules/concurrency/worker-thread.d.ts +21 -0
  86. package/dist/shared/src/modules/concurrency/worker-thread.js +67 -0
  87. package/dist/shared/src/modules/concurrency/worker-thread.js.map +1 -0
  88. package/dist/shared/src/modules/index.d.ts +14 -0
  89. package/dist/shared/src/modules/index.js +15 -0
  90. package/dist/shared/src/modules/index.js.map +1 -0
  91. package/dist/shared/src/modules/observability/audit-chain.d.ts +80 -0
  92. package/dist/shared/src/modules/observability/audit-chain.js +262 -0
  93. package/dist/shared/src/modules/observability/audit-chain.js.map +1 -0
  94. package/dist/shared/src/modules/observability/audit.d.ts +121 -0
  95. package/dist/shared/src/modules/observability/audit.js +322 -0
  96. package/dist/shared/src/modules/observability/audit.js.map +1 -0
  97. package/dist/shared/src/modules/observability/index.d.ts +4 -0
  98. package/dist/shared/src/modules/observability/index.js +5 -0
  99. package/dist/shared/src/modules/observability/index.js.map +1 -0
  100. package/dist/shared/src/modules/observability/logger.d.ts +31 -0
  101. package/dist/shared/src/modules/observability/logger.js +153 -0
  102. package/dist/shared/src/modules/observability/logger.js.map +1 -0
  103. package/dist/shared/src/modules/observability/otel.d.ts +39 -0
  104. package/dist/shared/src/modules/observability/otel.js +93 -0
  105. package/dist/shared/src/modules/observability/otel.js.map +1 -0
  106. package/dist/shared/src/modules/primitives/constants.d.ts +150 -0
  107. package/dist/shared/src/modules/primitives/constants.js +212 -0
  108. package/dist/shared/src/modules/primitives/constants.js.map +1 -0
  109. package/dist/shared/src/modules/primitives/errors.d.ts +46 -0
  110. package/dist/shared/src/modules/primitives/errors.js +69 -0
  111. package/dist/shared/src/modules/primitives/errors.js.map +1 -0
  112. package/dist/shared/src/modules/primitives/fs.d.ts +9 -0
  113. package/dist/shared/src/modules/primitives/fs.js +54 -0
  114. package/dist/shared/src/modules/primitives/fs.js.map +1 -0
  115. package/dist/shared/src/modules/primitives/index.d.ts +7 -0
  116. package/dist/shared/src/modules/primitives/index.js +8 -0
  117. package/dist/shared/src/modules/primitives/index.js.map +1 -0
  118. package/dist/shared/src/modules/primitives/outbound-http.d.ts +32 -0
  119. package/dist/shared/src/modules/primitives/outbound-http.js +88 -0
  120. package/dist/shared/src/modules/primitives/outbound-http.js.map +1 -0
  121. package/dist/shared/src/modules/primitives/string.d.ts +1 -0
  122. package/dist/shared/src/modules/primitives/string.js +30 -0
  123. package/dist/shared/src/modules/primitives/string.js.map +1 -0
  124. package/dist/shared/src/modules/primitives/time.d.ts +5 -0
  125. package/dist/shared/src/modules/primitives/time.js +35 -0
  126. package/dist/shared/src/modules/primitives/time.js.map +1 -0
  127. package/dist/shared/src/modules/primitives/types.d.ts +27 -0
  128. package/dist/shared/src/modules/primitives/types.js +17 -0
  129. package/dist/shared/src/modules/primitives/types.js.map +1 -0
  130. package/dist/shared/src/modules/sandbox/index.d.ts +3 -0
  131. package/dist/shared/src/modules/sandbox/index.js +4 -0
  132. package/dist/shared/src/modules/sandbox/index.js.map +1 -0
  133. package/dist/shared/src/modules/sandbox/sandbox-fs.d.ts +28 -0
  134. package/dist/shared/src/modules/sandbox/sandbox-fs.js +143 -0
  135. package/dist/shared/src/modules/sandbox/sandbox-fs.js.map +1 -0
  136. package/dist/shared/src/modules/sandbox/sandbox-runtime.d.ts +78 -0
  137. package/dist/shared/src/modules/sandbox/sandbox-runtime.js +282 -0
  138. package/dist/shared/src/modules/sandbox/sandbox-runtime.js.map +1 -0
  139. package/dist/shared/src/modules/sandbox/sandbox.d.ts +54 -0
  140. package/dist/shared/src/modules/sandbox/sandbox.js +179 -0
  141. package/dist/shared/src/modules/sandbox/sandbox.js.map +1 -0
  142. package/dist/shared/src/modules/security/index.d.ts +5 -0
  143. package/dist/shared/src/modules/security/index.js +6 -0
  144. package/dist/shared/src/modules/security/index.js.map +1 -0
  145. package/dist/shared/src/modules/security/pii.d.ts +70 -0
  146. package/dist/shared/src/modules/security/pii.js +276 -0
  147. package/dist/shared/src/modules/security/pii.js.map +1 -0
  148. package/dist/shared/src/modules/security/policy-gate.d.ts +42 -0
  149. package/dist/shared/src/modules/security/policy-gate.js +172 -0
  150. package/dist/shared/src/modules/security/policy-gate.js.map +1 -0
  151. package/dist/shared/src/modules/security/retention.d.ts +68 -0
  152. package/dist/shared/src/modules/security/retention.js +218 -0
  153. package/dist/shared/src/modules/security/retention.js.map +1 -0
  154. package/dist/shared/src/modules/security/secrets.d.ts +99 -0
  155. package/dist/shared/src/modules/security/secrets.js +371 -0
  156. package/dist/shared/src/modules/security/secrets.js.map +1 -0
  157. package/dist/shared/src/modules/security/tls.d.ts +87 -0
  158. package/dist/shared/src/modules/security/tls.js +154 -0
  159. package/dist/shared/src/modules/security/tls.js.map +1 -0
  160. package/dist/shared/src/modules/storage/database.d.ts +6 -0
  161. package/dist/shared/src/modules/storage/database.js +16 -0
  162. package/dist/shared/src/modules/storage/database.js.map +1 -0
  163. package/dist/shared/src/modules/storage/index.d.ts +4 -0
  164. package/dist/shared/src/modules/storage/index.js +5 -0
  165. package/dist/shared/src/modules/storage/index.js.map +1 -0
  166. package/dist/shared/src/modules/storage/memory-prune.d.ts +18 -0
  167. package/dist/shared/src/modules/storage/memory-prune.js +48 -0
  168. package/dist/shared/src/modules/storage/memory-prune.js.map +1 -0
  169. package/dist/shared/src/modules/storage/migrations.d.ts +69 -0
  170. package/dist/shared/src/modules/storage/migrations.js +394 -0
  171. package/dist/shared/src/modules/storage/migrations.js.map +1 -0
  172. package/dist/shared/src/modules/storage/storage.d.ts +341 -0
  173. package/dist/shared/src/modules/storage/storage.js +1004 -0
  174. package/dist/shared/src/modules/storage/storage.js.map +1 -0
  175. package/dist/shared/src/otel.d.ts +1 -39
  176. package/dist/shared/src/otel.js +1 -92
  177. package/dist/shared/src/otel.js.map +1 -1
  178. package/dist/shared/src/outbound-http.d.ts +1 -32
  179. package/dist/shared/src/outbound-http.js +1 -87
  180. package/dist/shared/src/outbound-http.js.map +1 -1
  181. package/dist/shared/src/pii.d.ts +1 -70
  182. package/dist/shared/src/pii.js +1 -275
  183. package/dist/shared/src/pii.js.map +1 -1
  184. package/dist/shared/src/policy-gate.d.ts +1 -42
  185. package/dist/shared/src/policy-gate.js +1 -171
  186. package/dist/shared/src/policy-gate.js.map +1 -1
  187. package/dist/shared/src/resilience.d.ts +1 -84
  188. package/dist/shared/src/resilience.js +1 -216
  189. package/dist/shared/src/resilience.js.map +1 -1
  190. package/dist/shared/src/retention.d.ts +1 -68
  191. package/dist/shared/src/retention.js +1 -217
  192. package/dist/shared/src/retention.js.map +1 -1
  193. package/dist/shared/src/sandbox-fs.d.ts +1 -28
  194. package/dist/shared/src/sandbox-fs.js +1 -142
  195. package/dist/shared/src/sandbox-fs.js.map +1 -1
  196. package/dist/shared/src/sandbox-runtime.d.ts +1 -78
  197. package/dist/shared/src/sandbox-runtime.js +1 -281
  198. package/dist/shared/src/sandbox-runtime.js.map +1 -1
  199. package/dist/shared/src/sandbox.d.ts +1 -54
  200. package/dist/shared/src/sandbox.js +1 -178
  201. package/dist/shared/src/sandbox.js.map +1 -1
  202. package/dist/shared/src/secrets.d.ts +1 -99
  203. package/dist/shared/src/secrets.js +1 -370
  204. package/dist/shared/src/secrets.js.map +1 -1
  205. package/dist/shared/src/storage.d.ts +1 -341
  206. package/dist/shared/src/storage.js +1 -1003
  207. package/dist/shared/src/storage.js.map +1 -1
  208. package/dist/shared/src/string.d.ts +1 -1
  209. package/dist/shared/src/string.js +1 -29
  210. package/dist/shared/src/string.js.map +1 -1
  211. package/dist/shared/src/time.d.ts +1 -5
  212. package/dist/shared/src/time.js +1 -34
  213. package/dist/shared/src/time.js.map +1 -1
  214. package/dist/shared/src/tls.d.ts +1 -87
  215. package/dist/shared/src/tls.js +1 -153
  216. package/dist/shared/src/tls.js.map +1 -1
  217. package/dist/shared/src/tokenizer.d.ts +1 -54
  218. package/dist/shared/src/tokenizer.js +1 -271
  219. package/dist/shared/src/tokenizer.js.map +1 -1
  220. package/dist/shared/src/types.d.ts +1 -27
  221. package/dist/shared/src/types.js +1 -16
  222. package/dist/shared/src/types.js.map +1 -1
  223. package/dist/shared/src/worker-pool.d.ts +1 -52
  224. package/dist/shared/src/worker-pool.js +1 -228
  225. package/dist/shared/src/worker-pool.js.map +1 -1
  226. package/dist/shared/src/worker-thread.d.ts +1 -21
  227. package/dist/shared/src/worker-thread.js +1 -66
  228. package/dist/shared/src/worker-thread.js.map +1 -1
  229. package/package.json +4 -4
@@ -1,262 +1,2 @@
1
- /**
2
- * Tamper-evident audit hash chain helpers (Phase 1.4).
3
- *
4
- * Chain: each entry stores prev_hash (previous entry hash or GENESIS) and hash = SHA-256(payload).
5
- * Any mutation of historical rows fails verification.
6
- */
7
- import crypto from "crypto";
8
- import fs from "fs";
9
- import os from "os";
10
- import path from "path";
11
- import { databaseHolder } from "./database.js";
12
- export const AUDIT_CHAIN_GENESIS = "GENESIS";
13
- /**
14
- * Resolve the HMAC key for the audit chain (memoized).
15
- *
16
- * Priority:
17
- * 1. ATABEY_AUDIT_HMAC_KEY env var (recommended for production / secret managers)
18
- * 2. `.atabey/audit-hmac.key` next to the SQLite DB (created 0600 on first use)
19
- * 3. null → falls back to unkeyed SHA-256 (insecure; warned once)
20
- *
21
- * A key is required for the chain to be genuinely tamper-evident. Without it,
22
- * anyone who can write the DB can also recompute the hashes.
23
- */
24
- let cachedKey;
25
- let warnedUnkeyed = false;
26
- const inMemoryAnchors = new Map();
27
- /** Directory holding the HMAC key and chain anchor (next to the SQLite DB), or null for :memory: DBs. */
28
- function resolveChainDir() {
29
- const envDir = process.env.ATABEY_TEST_DIR || process.env.ATABEY_FRAMEWORK_DIR;
30
- if (envDir && envDir.trim()) {
31
- return envDir.trim();
32
- }
33
- try {
34
- const db = databaseHolder.getDB();
35
- if (db) {
36
- if (db.memory === true || db.name === ":memory:" || db.name === "") {
37
- return null;
38
- }
39
- if (typeof db.name === "string" && db.name) {
40
- return path.dirname(db.name);
41
- }
42
- }
43
- }
44
- catch {
45
- /* DB not initialized yet */
46
- }
47
- return process.env.VITEST
48
- ? path.join(os.tmpdir(), `atabey-vitest-worker-${process.pid}`, ".atabey")
49
- : path.join(process.cwd(), ".atabey");
50
- }
51
- export function resolveAuditChainKey() {
52
- if (cachedKey !== undefined)
53
- return cachedKey;
54
- const envKey = process.env.ATABEY_AUDIT_HMAC_KEY;
55
- if (envKey && envKey.trim()) {
56
- cachedKey = Buffer.from(envKey.trim(), "utf8");
57
- return cachedKey;
58
- }
59
- const dir = resolveChainDir();
60
- if (!dir) {
61
- cachedKey = null;
62
- return cachedKey;
63
- }
64
- const keyFile = path.join(dir, "audit-hmac.key");
65
- try {
66
- if (fs.existsSync(keyFile)) {
67
- cachedKey = fs.readFileSync(keyFile);
68
- return cachedKey;
69
- }
70
- if (process.env.ATABEY_AUDIT_HMAC_AUTOCREATE !== "false" && !process.env.VITEST) {
71
- fs.mkdirSync(dir, { recursive: true });
72
- const generated = crypto.randomBytes(32);
73
- fs.writeFileSync(keyFile, generated, { mode: 0o600 });
74
- cachedKey = generated;
75
- return cachedKey;
76
- }
77
- }
78
- catch {
79
- /* fall through to unkeyed */
80
- }
81
- cachedKey = null;
82
- return cachedKey;
83
- }
84
- /** Test helper — clears the memoized key. */
85
- export function clearAuditChainKeyCache() {
86
- cachedKey = undefined;
87
- warnedUnkeyed = false;
88
- inMemoryAnchors.clear();
89
- }
90
- /**
91
- * Keyed digest for audit chain entries.
92
- * Uses HMAC-SHA256 when a key is available; otherwise falls back to plain
93
- * SHA-256 with a one-time warning (degraded, not recommended).
94
- */
95
- export function chainDigest(payload) {
96
- const key = resolveAuditChainKey();
97
- if (key) {
98
- return crypto.createHmac("sha256", key).update(payload, "utf8").digest("hex");
99
- }
100
- if (!warnedUnkeyed) {
101
- warnedUnkeyed = true;
102
- process.stderr.write("[AUDIT] WARNING: no audit HMAC key configured — chain is unkeyed (SHA-256 only). " +
103
- "Set ATABEY_AUDIT_HMAC_KEY or allow key-file creation for tamper-evidence.\n");
104
- }
105
- return crypto.createHash("sha256").update(payload, "utf8").digest("hex");
106
- }
107
- /** @deprecated Use chainDigest() — unkeyed SHA-256 is not tamper-evident. */
108
- export function sha256Hex(payload) {
109
- return crypto.createHash("sha256").update(payload, "utf8").digest("hex");
110
- }
111
- function anchorFile(dir, name) {
112
- return path.join(dir, `audit-chain-${name}.anchor.json`);
113
- }
114
- export function writeChainAnchor(name, tip, count) {
115
- const data = { tip, count, updatedAt: new Date().toISOString() };
116
- const dir = resolveChainDir();
117
- if (!dir) {
118
- inMemoryAnchors.set(name, data);
119
- return;
120
- }
121
- try {
122
- fs.mkdirSync(dir, { recursive: true });
123
- fs.writeFileSync(anchorFile(dir, name), JSON.stringify(data), { mode: 0o600 });
124
- }
125
- catch {
126
- /* non-fatal: verification will report "no anchor" */
127
- }
128
- }
129
- export function readChainAnchor(name) {
130
- const dir = resolveChainDir();
131
- if (!dir) {
132
- return inMemoryAnchors.get(name) ?? null;
133
- }
134
- try {
135
- const f = anchorFile(dir, name);
136
- if (!fs.existsSync(f))
137
- return null;
138
- return JSON.parse(fs.readFileSync(f, "utf8"));
139
- }
140
- catch {
141
- return null;
142
- }
143
- }
144
- export function clearChainAnchor(name) {
145
- inMemoryAnchors.delete(name);
146
- const dir = resolveChainDir();
147
- if (!dir)
148
- return;
149
- try {
150
- const f = anchorFile(dir, name);
151
- if (fs.existsSync(f))
152
- fs.unlinkSync(f);
153
- }
154
- catch {
155
- /* ignore */
156
- }
157
- }
158
- /**
159
- * Canonical payload for agent execution logs (Storage.saveLog).
160
- *
161
- * v2: fields are length-delimited via JSON to remove `|`-join boundary
162
- * ambiguity (previously agent="a|b" collided with action="b|c"). Changing this
163
- * invalidates verification of rows written by older (v1) builds.
164
- */
165
- export function buildAgentLogChainPayload(fields) {
166
- return JSON.stringify([
167
- "v2",
168
- fields.prevHash,
169
- fields.agent,
170
- fields.action,
171
- fields.traceId,
172
- fields.status,
173
- fields.summary,
174
- fields.timestamp,
175
- ]);
176
- }
177
- /**
178
- * Canonical payload for structured Audit.log entries (v2, length-delimited).
179
- */
180
- export function buildStructuredAuditChainPayload(fields) {
181
- return JSON.stringify([
182
- "v2",
183
- fields.prevHash,
184
- fields.agent,
185
- fields.action,
186
- fields.status,
187
- fields.traceId,
188
- fields.timestamp,
189
- fields.detailsJson,
190
- fields.errorMessage,
191
- ]);
192
- }
193
- /**
194
- * Verify a sequence of rows already ordered by id ASC.
195
- * `computePayload(row, prevHash)` must rebuild the exact string used at insert time.
196
- *
197
- * @param options.digest keyed digest used at insert time (default: chainDigest)
198
- * @param options.expectedTip last appended hash (from an external anchor) — detects truncation
199
- * @param options.expectedCount number of chained rows expected — detects deletion at the tail
200
- */
201
- export function verifyHashChain(rows, computePayload, options = {}) {
202
- const digest = options.digest ?? chainDigest;
203
- let expectedPrev = rows.length > 0 ? (rows[0].prev_hash || AUDIT_CHAIN_GENESIS) : AUDIT_CHAIN_GENESIS;
204
- let checked = 0;
205
- for (const row of rows) {
206
- checked++;
207
- const prev = row.prev_hash || "";
208
- if (prev !== expectedPrev) {
209
- return {
210
- valid: false,
211
- checked,
212
- failedLogId: row.id,
213
- reason: `prev_hash mismatch at row ${row.id}`,
214
- tip: "A log was deleted, reordered, or inserted out of chain order.",
215
- };
216
- }
217
- if (!row.hash) {
218
- return {
219
- valid: false,
220
- checked,
221
- failedLogId: row.id,
222
- reason: `Missing hash at row ${row.id}`,
223
- tip: "Legacy row without hash; re-seed or accept and re-hash from tip.",
224
- };
225
- }
226
- const payload = computePayload(row, prev);
227
- const calculated = digest(payload);
228
- if (calculated !== row.hash) {
229
- return {
230
- valid: false,
231
- checked,
232
- failedLogId: row.id,
233
- reason: `Hash corruption at row ${row.id}`,
234
- tip: "Row content was modified after append (or the HMAC key changed).",
235
- };
236
- }
237
- expectedPrev = row.hash;
238
- }
239
- // Truncation detection against an external anchor.
240
- if (options.expectedCount !== undefined && rows.length < options.expectedCount) {
241
- return {
242
- valid: false,
243
- checked,
244
- reason: `Chain truncated: expected ${options.expectedCount} rows, found ${rows.length}.`,
245
- tip: "Tail audit rows were deleted after append.",
246
- };
247
- }
248
- if (options.expectedTip !== undefined && rows.length > 0) {
249
- const actualTip = rows[rows.length - 1].hash;
250
- if (actualTip !== options.expectedTip) {
251
- return {
252
- valid: false,
253
- checked,
254
- failedLogId: rows[rows.length - 1].id,
255
- reason: "Chain tip does not match the anchored tip.",
256
- tip: "Rows were appended/replaced outside the audited writer, or deleted.",
257
- };
258
- }
259
- }
260
- return { valid: true, checked, tip: rows.length > 0 ? rows[rows.length - 1].hash ?? undefined : undefined };
261
- }
1
+ export * from "./modules/observability/audit-chain.js";
262
2
  //# sourceMappingURL=audit-chain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-chain.js","sourceRoot":"","sources":["../../../../shared/src/audit-chain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit-chain.js","sourceRoot":"","sources":["../../../../shared/src/audit-chain.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAC"}
@@ -1,121 +1 @@
1
- /**
2
- * [AUDIT] Structured Audit Log Service
3
- *
4
- * Records all critical operations in structured JSON format to SQLite.
5
- * Queryable, filterable, and traceable.
6
- *
7
- * [KVKK/GDPR] GDPR and KVKK Art. 4, 5, 11, 12 compliant:
8
- * - Sensitive data automatically masked (PII masking)
9
- * - Data retention limited (TTL)
10
- * - Data subject rights supported (erasure, query)
11
- *
12
- * Usage:
13
- * Audit.log("user.create", "SUCCESS", { userId: "usr_123" });
14
- * Audit.query({ action: "user.create", status: "FAILED" });
15
- */
16
- import { type ChainVerifyResult } from "./audit-chain.js";
17
- export type AuditStatus = "SUCCESS" | "FAILED" | "BLOCKED" | "APPROVED" | "REJECTED";
18
- export type DataCategory = "OPERATIONAL" | "USER_DATA" | "API_CALL" | "SECURITY" | "COMPLIANCE";
19
- export interface AuditEntry {
20
- id?: number;
21
- timestamp: string;
22
- action: string;
23
- status: AuditStatus;
24
- agent: string;
25
- traceId?: string;
26
- details?: Record<string, unknown>;
27
- errorMessage?: string;
28
- durationMs?: number;
29
- dataCategory?: DataCategory;
30
- /** [KVKK] Data retention period (days). null = unlimited (not recommended) */
31
- retentionDays?: number;
32
- /** Tamper-evident chain (Phase 1.4) */
33
- prev_hash?: string;
34
- hash?: string;
35
- }
36
- export declare class Audit {
37
- private static TABLE;
38
- /** Out-of-DB anchor file name for the structured audit chain. */
39
- private static ANCHOR_NAME;
40
- /** [KVKK] Default data retention period: 30 days */
41
- private static DEFAULT_RETENTION_DAYS;
42
- /** [KVKK] Maximum retention for sensitive categories: 90 days */
43
- private static MAX_RETENTION_DAYS;
44
- static initialize(): void;
45
- /**
46
- * Refresh the out-of-DB chain anchor after a legitimate deletion
47
- * (retention / right-to-erasure). Without this, legitimate deletions would
48
- * be indistinguishable from tampering.
49
- */
50
- private static refreshAnchor;
51
- /**
52
- * Logs a structured audit entry.
53
- * [KVKK] Sensitive data is automatically masked.
54
- */
55
- static log(action: string, status: AuditStatus, options?: {
56
- agent?: string;
57
- traceId?: string;
58
- details?: Record<string, unknown>;
59
- errorMessage?: string;
60
- durationMs?: number;
61
- dataCategory?: DataCategory;
62
- /** [KVKK] Custom retention period (days). Default: 30 */
63
- retentionDays?: number;
64
- }): void;
65
- /**
66
- * Verify tamper-evident chain for structured audit_log table.
67
- */
68
- static verifyIntegrity(): ChainVerifyResult;
69
- /**
70
- * Queries audit logs with filters.
71
- */
72
- static query(options?: {
73
- action?: string;
74
- status?: AuditStatus;
75
- agent?: string;
76
- traceId?: string;
77
- dataCategory?: DataCategory;
78
- limit?: number;
79
- offset?: number;
80
- since?: string;
81
- until?: string;
82
- }): AuditEntry[];
83
- /**
84
- * [KVKK Art. 11] Deletes records upon data subject request.
85
- * Clears all records matching a given traceId or agent.
86
- *
87
- * @param filter Which records to delete
88
- * @returns Number of deleted records
89
- */
90
- static deleteByFilter(filter: {
91
- traceId?: string;
92
- agent?: string;
93
- action?: string;
94
- olderThanDays?: number;
95
- }): number;
96
- /**
97
- * [KVKK/GDPR] Cleans expired records.
98
- * Operates based on each audit record's retentionDays field.
99
- * Can be auto-triggered by cron job or each Audit.log() call.
100
- *
101
- * @returns Number of cleaned records
102
- */
103
- static cleanExpired(): number;
104
- /**
105
- * Returns audit statistics.
106
- */
107
- static getStats(): {
108
- total: number;
109
- byStatus: Record<string, number>;
110
- byAction: Record<string, number>;
111
- byCategory: Record<string, number>;
112
- recentErrors: AuditEntry[];
113
- expiredCount: number;
114
- };
115
- /**
116
- * [KVKK Art. 7] Clears all audit records.
117
- * Used under the "Right to Erasure" provision.
118
- * Only authorized users may call this.
119
- */
120
- static clearAll(confirmationCode: string): number;
121
- }
1
+ export * from "./modules/observability/audit.js";