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
@@ -0,0 +1,218 @@
1
+ /**
2
+ * [KVKK/GDPR] Data Retention & Privacy Service
3
+ *
4
+ * KVKK Art. 4, 5, 7, 11 and GDPR Art. 5, 17 compliant data retention management.
5
+ *
6
+ * Features:
7
+ * - Automatic expired record cleanup
8
+ * - Data categorization (operational, user_data, api_call, security, compliance)
9
+ * - "Right to Erasure" support
10
+ * - Configurable retention policies
11
+ * - Periodic cleanup cron job
12
+ */
13
+ import { Audit } from "../observability/audit.js";
14
+ import { logger } from "../observability/logger.js";
15
+ import { databaseHolder } from "../storage/database.js";
16
+ import { clearChainAnchor, writeChainAnchor } from "../observability/audit-chain.js";
17
+ /**
18
+ * Data retention categories and default durations (days)
19
+ */
20
+ export const RETENTION_POLICIES = {
21
+ OPERATIONAL: 30, // Operational logs: 30 days
22
+ USER_DATA: 90, // User data: 90 days (KVKK Art. 5)
23
+ API_CALL: 180, // API call records: 180 days
24
+ SECURITY: 365, // Security logs: 1 year
25
+ COMPLIANCE: 730, // Compliance records: 2 years
26
+ };
27
+ /**
28
+ * [KVKK/GDPR] Data Retention Manager
29
+ */
30
+ export class DataRetention {
31
+ static cleanupInterval = null;
32
+ /**
33
+ * Initialize data retention with automatic cleanup.
34
+ * Starts a periodic cleanup job.
35
+ *
36
+ * @param intervalMs Cleanup interval in milliseconds (default: 1 hour)
37
+ */
38
+ static initialize(intervalMs = 3600000) {
39
+ // Run initial cleanup
40
+ this.runCleanup();
41
+ // Schedule periodic cleanup
42
+ if (this.cleanupInterval) {
43
+ clearInterval(this.cleanupInterval);
44
+ }
45
+ this.cleanupInterval = setInterval(() => this.runCleanup(), intervalMs);
46
+ logger.info("[RETENTION] Data retention initialized. " +
47
+ `Cleanup interval: ${intervalMs / 60000}min. ` +
48
+ `Policies: ${Object.entries(RETENTION_POLICIES).map(([k, v]) => `${k}=${v}d`).join(", ")}`);
49
+ }
50
+ /**
51
+ * Run cleanup for all data stores.
52
+ * Cleans audit logs, messages, and logs based on retention policies.
53
+ */
54
+ static runCleanup() {
55
+ const result = { audit: 0, messages: 0, logs: 0 };
56
+ try {
57
+ // 1. Clean audit logs
58
+ result.audit = Audit.cleanExpired();
59
+ // 2. Clean old messages (Hermes message queue)
60
+ result.messages = this.cleanOldMessages();
61
+ // 3. Clean old logs
62
+ result.logs = this.cleanOldLogs();
63
+ if (result.audit > 0 || result.messages > 0 || result.logs > 0) {
64
+ logger.info("[RETENTION] Cleanup complete: " +
65
+ `${result.audit} audit, ${result.messages} messages, ${result.logs} logs`);
66
+ }
67
+ }
68
+ catch (error) {
69
+ logger.error(`[RETENTION] Cleanup failed: ${error.message}`);
70
+ }
71
+ return result;
72
+ }
73
+ /**
74
+ * [KVKK Art. 7] "Right to Erasure" — Deletes all data for a given trace ID.
75
+ * Cleans audit records, messages, logs, and tasks.
76
+ *
77
+ * @param traceId Trace ID to erase
78
+ * @returns Total number of deleted records
79
+ */
80
+ static eraseTraceData(traceId) {
81
+ let total = 0;
82
+ const db = databaseHolder.getDB();
83
+ // Audit logs
84
+ total += Audit.deleteByFilter({ traceId });
85
+ // Messages
86
+ const msgResult = db.prepare("DELETE FROM messages WHERE trace_id = ?").run(traceId);
87
+ total += msgResult.changes;
88
+ // Tasks
89
+ const taskResult = db.prepare("DELETE FROM tasks WHERE trace_id = ?").run(traceId);
90
+ total += taskResult.changes;
91
+ // Logs
92
+ const logResult = db.prepare("DELETE FROM logs WHERE trace_id = ?").run(traceId);
93
+ total += logResult.changes;
94
+ if (logResult.changes > 0)
95
+ this.refreshLogAnchor();
96
+ // Costs (may carry trace_id / usage data)
97
+ total += db.prepare("DELETE FROM costs WHERE trace_id = ?").run(traceId).changes;
98
+ // Approvals (args + passcode)
99
+ total += db.prepare("DELETE FROM approvals WHERE trace_id = ?").run(traceId).changes;
100
+ logger.info(`[RETENTION] Trace ${traceId} erased: ${total} records deleted (KVKK Article 7)`);
101
+ return total;
102
+ }
103
+ /**
104
+ * [KVKK Art. 11] Erases all data across every store (full right-to-erasure).
105
+ * Only works with the confirmation code.
106
+ */
107
+ static eraseAllData(confirmationCode) {
108
+ if (confirmationCode !== "KVKK-RIGHT-TO-ERASURE") {
109
+ throw new Error("[RETENTION] Invalid confirmation code. Use 'KVKK-RIGHT-TO-ERASURE'");
110
+ }
111
+ let total = 0;
112
+ const db = databaseHolder.getDB();
113
+ total += Audit.clearAll(confirmationCode);
114
+ // Every table that can hold user/agent/personal data.
115
+ for (const table of [
116
+ "messages",
117
+ "tasks",
118
+ "logs",
119
+ "agents",
120
+ "metadata",
121
+ "costs",
122
+ "knowledge",
123
+ "users",
124
+ "loop_cooldowns",
125
+ "approvals",
126
+ "discipline",
127
+ "distributed_locks",
128
+ ]) {
129
+ try {
130
+ total += db.prepare(`DELETE FROM ${table}`).run().changes;
131
+ }
132
+ catch {
133
+ // Table may not exist in this schema version — skip.
134
+ }
135
+ }
136
+ // Both hash-chain anchors are now empty.
137
+ clearChainAnchor("agent-log");
138
+ clearChainAnchor("structured");
139
+ logger.warn(`[RETENTION] ALL DATA ERASED: ${total} records (KVKK Article 7 - Right to Erasure)`);
140
+ return total;
141
+ }
142
+ /**
143
+ * Recompute the agent-log chain anchor after a legitimate deletion so that
144
+ * verification does not mistake retention/erasure for tampering.
145
+ */
146
+ static refreshLogAnchor() {
147
+ try {
148
+ const db = databaseHolder.getDB();
149
+ const row = db.prepare("SELECT hash FROM logs WHERE hash IS NOT NULL ORDER BY id DESC LIMIT 1").get();
150
+ const count = db.prepare("SELECT COUNT(*) AS c FROM logs WHERE hash IS NOT NULL").get().c;
151
+ if (row?.hash && count > 0)
152
+ writeChainAnchor("agent-log", row.hash, count);
153
+ else
154
+ clearChainAnchor("agent-log");
155
+ }
156
+ catch {
157
+ /* ignore */
158
+ }
159
+ }
160
+ /**
161
+ * Get retention statistics.
162
+ */
163
+ static getStats() {
164
+ const db = databaseHolder.getDB();
165
+ const auditExpired = db.prepare(`
166
+ SELECT COUNT(*) as count FROM audit_log
167
+ WHERE retentionDays IS NOT NULL
168
+ AND timestamp < datetime('now', '-' || retentionDays || ' days')
169
+ `).get().count;
170
+ const messageCount = db.prepare("SELECT COUNT(*) as count FROM messages").get().count;
171
+ const logCount = db.prepare("SELECT COUNT(*) as count FROM logs").get().count;
172
+ const taskCount = db.prepare("SELECT COUNT(*) as count FROM tasks").get().count;
173
+ return {
174
+ auditExpired,
175
+ messageCount,
176
+ logCount,
177
+ taskCount,
178
+ policies: { ...RETENTION_POLICIES },
179
+ };
180
+ }
181
+ /**
182
+ * Stop the periodic cleanup job.
183
+ */
184
+ static shutdown() {
185
+ if (this.cleanupInterval) {
186
+ clearInterval(this.cleanupInterval);
187
+ this.cleanupInterval = null;
188
+ logger.info("[RETENTION] Cleanup job stopped");
189
+ }
190
+ }
191
+ /**
192
+ * Clean old messages from the Hermes queue.
193
+ * Messages older than 30 days are removed.
194
+ */
195
+ static cleanOldMessages() {
196
+ const db = databaseHolder.getDB();
197
+ const result = db.prepare(`
198
+ DELETE FROM messages
199
+ WHERE strftime('%Y-%m-%d %H:%M:%S', timestamp) < datetime('now', '-30 days')
200
+ `).run();
201
+ return result.changes;
202
+ }
203
+ /**
204
+ * Clean old logs.
205
+ * Logs older than 30 days are removed.
206
+ */
207
+ static cleanOldLogs() {
208
+ const db = databaseHolder.getDB();
209
+ const result = db.prepare(`
210
+ DELETE FROM logs
211
+ WHERE strftime('%Y-%m-%d %H:%M:%S', timestamp) < datetime('now', '-30 days')
212
+ `).run();
213
+ if (result.changes > 0)
214
+ this.refreshLogAnchor();
215
+ return result.changes;
216
+ }
217
+ }
218
+ //# sourceMappingURL=retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../../../../../shared/src/modules/security/retention.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Secret Management & Leak Guard (Phase 1.5)
3
+ *
4
+ * Provides:
5
+ * 1. Encrypted local secret vault (.atabey/secrets.vault.json) using AES-256-GCM
6
+ * with per-secret random salt (HKDF-SHA256) and 96-bit IV.
7
+ * 2. Subprocess environment scrubber (strips sensitive keys before spawning child processes).
8
+ * 3. Secret leak scanner (detects API keys, cloud credentials, private keys, and vault values).
9
+ */
10
+ export interface VaultEntry {
11
+ /** Base64-encoded 16-byte HKDF salt */
12
+ salt: string;
13
+ /** Base64-encoded 12-byte GCM initialization vector */
14
+ iv: string;
15
+ /** Base64-encoded 16-byte GCM authentication tag */
16
+ tag: string;
17
+ /** Base64-encoded ciphertext */
18
+ ciphertext: string;
19
+ /** ISO-8601 creation timestamp */
20
+ createdAt: string;
21
+ /** ISO-8601 last update timestamp */
22
+ updatedAt: string;
23
+ /** Optional non-sensitive description */
24
+ description?: string;
25
+ }
26
+ export interface VaultFile {
27
+ version: 1;
28
+ entries: Record<string, VaultEntry>;
29
+ }
30
+ export interface SecretMetadata {
31
+ name: string;
32
+ createdAt: string;
33
+ updatedAt: string;
34
+ description?: string;
35
+ }
36
+ export interface SecretFinding {
37
+ ruleId: string;
38
+ description: string;
39
+ matchPreview: string;
40
+ index: number;
41
+ }
42
+ export declare class SecretManager {
43
+ private static resolveVaultDir;
44
+ private static resolveMasterKey;
45
+ private static vaultFilePath;
46
+ private static readVault;
47
+ private static writeVault;
48
+ /**
49
+ * Encrypt and store a secret in the local AES-256-GCM vault.
50
+ */
51
+ static setSecret(name: string, value: string, options?: {
52
+ description?: string;
53
+ vaultDir?: string;
54
+ }): void;
55
+ /**
56
+ * Retrieve and decrypt a secret by name.
57
+ * Checks process.env[name] fallback only when allowEnvFallback is true.
58
+ */
59
+ static getSecret(name: string, options?: {
60
+ vaultDir?: string;
61
+ allowEnvFallback?: boolean;
62
+ }): string | null;
63
+ /**
64
+ * Delete a secret from the vault.
65
+ */
66
+ static deleteSecret(name: string, options?: {
67
+ vaultDir?: string;
68
+ }): boolean;
69
+ /**
70
+ * List stored secret metadata without exposing plaintext values.
71
+ */
72
+ static listSecrets(options?: {
73
+ vaultDir?: string;
74
+ }): SecretMetadata[];
75
+ /**
76
+ * Re-encrypt all vault entries under a new 32-byte master key.
77
+ *
78
+ * Safe ordering: decrypt everything first, build the new vault in memory,
79
+ * then atomically swap. The previous key is kept as `master.key.bak` for
80
+ * the duration of the swap and restored on failure, so a mid-rotation error
81
+ * cannot make the vault permanently undecryptable.
82
+ */
83
+ static rotateMasterKey(newKeyMaterial: string | Buffer, options?: {
84
+ vaultDir?: string;
85
+ }): number;
86
+ }
87
+ /**
88
+ * Scrub sensitive credentials from an environment object before passing to a child process.
89
+ */
90
+ export declare function scrubEnvForSubprocess(env?: NodeJS.ProcessEnv, extraAllowedKeys?: string[]): NodeJS.ProcessEnv;
91
+ /**
92
+ * Scan arbitrary text (command output, file content, tool arguments) for leaked secrets.
93
+ */
94
+ export declare function scanForSecrets(text: string): SecretFinding[];
95
+ /**
96
+ * Redact leaked secrets from text before it is returned to an AI/LLM.
97
+ * Complements PII masking with cloud-credential/private-key patterns.
98
+ */
99
+ export declare function redactSecrets(text: string): string;