atabey-shared 0.1.3 → 0.1.5

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 (76) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +4 -1
  3. package/dist/modules/index.d.ts +2 -0
  4. package/dist/modules/index.js +2 -0
  5. package/dist/modules/index.js.map +1 -1
  6. package/dist/modules/lifecycle/index.d.ts +1 -0
  7. package/dist/modules/lifecycle/index.js +2 -0
  8. package/dist/modules/lifecycle/index.js.map +1 -0
  9. package/dist/modules/lifecycle/task-lifecycle.d.ts +63 -0
  10. package/dist/modules/lifecycle/task-lifecycle.js +135 -0
  11. package/dist/modules/lifecycle/task-lifecycle.js.map +1 -0
  12. package/dist/modules/primitives/fs.js +1 -3
  13. package/dist/modules/primitives/fs.js.map +1 -1
  14. package/dist/modules/primitives/outbound-http.d.ts +2 -0
  15. package/dist/modules/primitives/outbound-http.js +5 -1
  16. package/dist/modules/primitives/outbound-http.js.map +1 -1
  17. package/dist/modules/security/secrets.d.ts +1 -0
  18. package/dist/modules/security/secrets.js +55 -27
  19. package/dist/modules/security/secrets.js.map +1 -1
  20. package/dist/modules/storage/agents.d.ts +15 -0
  21. package/dist/modules/storage/agents.js +59 -0
  22. package/dist/modules/storage/agents.js.map +1 -0
  23. package/dist/modules/storage/api-catalog.d.ts +24 -0
  24. package/dist/modules/storage/api-catalog.js +96 -0
  25. package/dist/modules/storage/api-catalog.js.map +1 -0
  26. package/dist/modules/storage/approvals.d.ts +63 -0
  27. package/dist/modules/storage/approvals.js +80 -0
  28. package/dist/modules/storage/approvals.js.map +1 -0
  29. package/dist/modules/storage/base.d.ts +13 -0
  30. package/dist/modules/storage/base.js +186 -0
  31. package/dist/modules/storage/base.js.map +1 -0
  32. package/dist/modules/storage/code-graph.d.ts +37 -0
  33. package/dist/modules/storage/code-graph.js +109 -0
  34. package/dist/modules/storage/code-graph.js.map +1 -0
  35. package/dist/modules/storage/cooldowns.d.ts +25 -0
  36. package/dist/modules/storage/cooldowns.js +81 -0
  37. package/dist/modules/storage/cooldowns.js.map +1 -0
  38. package/dist/modules/storage/costs.d.ts +27 -0
  39. package/dist/modules/storage/costs.js +30 -0
  40. package/dist/modules/storage/costs.js.map +1 -0
  41. package/dist/modules/storage/discipline.d.ts +38 -0
  42. package/dist/modules/storage/discipline.js +108 -0
  43. package/dist/modules/storage/discipline.js.map +1 -0
  44. package/dist/modules/storage/framework-dir.d.ts +9 -0
  45. package/dist/modules/storage/framework-dir.js +54 -0
  46. package/dist/modules/storage/framework-dir.js.map +1 -0
  47. package/dist/modules/storage/integrity.d.ts +29 -0
  48. package/dist/modules/storage/integrity.js +41 -0
  49. package/dist/modules/storage/integrity.js.map +1 -0
  50. package/dist/modules/storage/knowledge.d.ts +20 -0
  51. package/dist/modules/storage/knowledge.js +40 -0
  52. package/dist/modules/storage/knowledge.js.map +1 -0
  53. package/dist/modules/storage/logs.d.ts +26 -0
  54. package/dist/modules/storage/logs.js +97 -0
  55. package/dist/modules/storage/logs.js.map +1 -0
  56. package/dist/modules/storage/messages.d.ts +18 -0
  57. package/dist/modules/storage/messages.js +60 -0
  58. package/dist/modules/storage/messages.js.map +1 -0
  59. package/dist/modules/storage/metadata.d.ts +11 -0
  60. package/dist/modules/storage/metadata.js +20 -0
  61. package/dist/modules/storage/metadata.js.map +1 -0
  62. package/dist/modules/storage/migrations.js +19 -5
  63. package/dist/modules/storage/migrations.js.map +1 -1
  64. package/dist/modules/storage/storage.d.ts +11 -334
  65. package/dist/modules/storage/storage.js +11 -996
  66. package/dist/modules/storage/storage.js.map +1 -1
  67. package/dist/modules/storage/tasks.d.ts +13 -0
  68. package/dist/modules/storage/tasks.js +54 -0
  69. package/dist/modules/storage/tasks.js.map +1 -0
  70. package/dist/modules/storage/types.d.ts +91 -0
  71. package/dist/modules/storage/types.js +6 -0
  72. package/dist/modules/storage/types.js.map +1 -0
  73. package/dist/modules/storage/users.d.ts +21 -0
  74. package/dist/modules/storage/users.js +46 -0
  75. package/dist/modules/storage/users.js.map +1 -0
  76. package/package.json +5 -3
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Loop-detector cooldown state (restart-durable).
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import { logger } from "../observability/logger.js";
8
+ import { StorageMetadata } from "./metadata.js";
9
+ export class StorageCooldowns extends StorageMetadata {
10
+ static saveLoopCooldown(agent, cooldownUntil, detail, cooldownCount = 1) {
11
+ const cleanAgent = agent.replace("@", "");
12
+ this.getDB().prepare(`
13
+ INSERT INTO loop_cooldowns (agent, cooldown_until, detail, cooldown_count, updated_at)
14
+ VALUES (?, ?, ?, ?, datetime('now'))
15
+ ON CONFLICT(agent) DO UPDATE SET
16
+ cooldown_until = excluded.cooldown_until,
17
+ detail = excluded.detail,
18
+ cooldown_count = excluded.cooldown_count,
19
+ updated_at = datetime('now')
20
+ `).run(cleanAgent, cooldownUntil, detail, cooldownCount);
21
+ }
22
+ static getLoopCooldown(agent) {
23
+ const cleanAgent = agent.replace("@", "");
24
+ try {
25
+ const row = this.getDB().prepare("SELECT * FROM loop_cooldowns WHERE agent = ?").get(cleanAgent);
26
+ if (!row)
27
+ return null;
28
+ return {
29
+ agent: row.agent,
30
+ cooldownUntil: row.cooldown_until,
31
+ detail: row.detail,
32
+ cooldownCount: row.cooldown_count
33
+ };
34
+ }
35
+ catch (err) {
36
+ logger.debug(`Failed to get loop cooldown: ${err.message}`);
37
+ return null;
38
+ }
39
+ }
40
+ static clearLoopCooldown(agent) {
41
+ const cleanAgent = agent.replace("@", "");
42
+ const info = this.getDB().prepare("DELETE FROM loop_cooldowns WHERE agent = ?").run(cleanAgent);
43
+ return info.changes > 0;
44
+ }
45
+ static clearAllLoopCooldowns() {
46
+ try {
47
+ this.getDB().prepare("DELETE FROM loop_cooldowns").run();
48
+ }
49
+ catch (err) {
50
+ logger.debug(`Failed to clear all loop cooldowns: ${err.message}`);
51
+ }
52
+ }
53
+ static listActiveLoopCooldowns() {
54
+ const now = Date.now();
55
+ try {
56
+ const rows = this.getDB().prepare("SELECT * FROM loop_cooldowns WHERE cooldown_until > ?").all(now);
57
+ return rows.map(r => ({
58
+ agent: r.agent,
59
+ cooldownUntil: r.cooldown_until,
60
+ detail: r.detail,
61
+ cooldownCount: r.cooldown_count
62
+ }));
63
+ }
64
+ catch (err) {
65
+ logger.debug(`Failed to list active loop cooldowns: ${err.message}`);
66
+ return [];
67
+ }
68
+ }
69
+ static purgeExpiredLoopCooldowns() {
70
+ const now = Date.now();
71
+ try {
72
+ const info = this.getDB().prepare("DELETE FROM loop_cooldowns WHERE cooldown_until <= ?").run(now);
73
+ return info.changes;
74
+ }
75
+ catch (err) {
76
+ logger.debug(`Failed to purge expired loop cooldowns: ${err.message}`);
77
+ return 0;
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=cooldowns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cooldowns.js","sourceRoot":"","sources":["../../../src/modules/storage/cooldowns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Token cost accounting rows per provider/model.
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import { StorageLogs } from "./logs.js";
8
+ export declare class StorageCosts extends StorageLogs {
9
+ static saveCost(cost: {
10
+ provider: string;
11
+ model: string;
12
+ inputTokens: number;
13
+ outputTokens: number;
14
+ cost: number;
15
+ timestamp: string;
16
+ traceId?: string;
17
+ }): void;
18
+ static getAllCosts(): Array<{
19
+ provider: string;
20
+ model: string;
21
+ inputTokens: number;
22
+ outputTokens: number;
23
+ cost: number;
24
+ timestamp: string;
25
+ traceId?: string;
26
+ }>;
27
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Token cost accounting rows per provider/model.
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import { StorageLogs } from "./logs.js";
8
+ export class StorageCosts extends StorageLogs {
9
+ static saveCost(cost) {
10
+ const db = this.getDB();
11
+ db.prepare(`
12
+ INSERT INTO costs (provider, model, input_tokens, output_tokens, cost, timestamp, trace_id)
13
+ VALUES (?, ?, ?, ?, ?, ?, ?)
14
+ `).run(cost.provider, cost.model, cost.inputTokens, cost.outputTokens, cost.cost, cost.timestamp, cost.traceId || null);
15
+ }
16
+ static getAllCosts() {
17
+ const db = this.getDB();
18
+ const rows = db.prepare("SELECT * FROM costs ORDER BY timestamp ASC").all();
19
+ return rows.map(r => ({
20
+ provider: r.provider,
21
+ model: r.model,
22
+ inputTokens: r.input_tokens,
23
+ outputTokens: r.output_tokens,
24
+ cost: r.cost,
25
+ timestamp: r.timestamp,
26
+ traceId: r.trace_id || undefined
27
+ }));
28
+ }
29
+ }
30
+ //# sourceMappingURL=costs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"costs.js","sourceRoot":"","sources":["../../../src/modules/storage/costs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,OAAO,YAAa,SAAQ,WAAW;IAClC,MAAM,CAAC,QAAQ,CAAC,IAQtB;QACG,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,EAAE,CAAC,OAAO,CAAC;;;SAGV,CAAC,CAAC,GAAG,CACF,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,IAAI,IAAI,CACvB,CAAC;IACN,CAAC;IAEM,MAAM,CAAC,WAAW;QASrB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAAiB,CAAC;QAC3F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,WAAW,EAAE,CAAC,CAAC,YAAY;YAC3B,YAAY,EAAE,CAAC,CAAC,aAAa;YAC7B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC,CAAC,QAAQ,IAAI,SAAS;SACnC,CAAC,CAAC,CAAC;IACR,CAAC;CACJ"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * AI discipline engine stats and call history.
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import { StorageApprovals } from "./approvals.js";
8
+ export declare class StorageDiscipline extends StorageApprovals {
9
+ static saveDiscipline(agent: string, stats: {
10
+ totalCalls: number;
11
+ violations: number;
12
+ lastViolation: string | null;
13
+ cooldownUntil: number;
14
+ }): void;
15
+ static getDiscipline(agent: string): {
16
+ agent: string;
17
+ totalCalls: number;
18
+ violations: number;
19
+ lastViolation: string | null;
20
+ cooldownUntil: number;
21
+ } | null;
22
+ static getAllDiscipline(): Array<{
23
+ agent: string;
24
+ totalCalls: number;
25
+ violations: number;
26
+ lastViolation: string | null;
27
+ cooldownUntil: number;
28
+ }>;
29
+ static clearAllDiscipline(): void;
30
+ static recordDisciplineCall(agent: string, tool: string, timestamp: number, argsSize: number): void;
31
+ static getRecentDisciplineCalls(agent: string, sinceTs: number): Array<{
32
+ tool: string;
33
+ timestamp: number;
34
+ argsSize: number;
35
+ }>;
36
+ static pruneDisciplineCalls(beforeTs: number): void;
37
+ static clearDisciplineCalls(agent?: string): void;
38
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * AI discipline engine stats and call history.
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import { logger } from "../observability/logger.js";
8
+ import { StorageApprovals } from "./approvals.js";
9
+ export class StorageDiscipline extends StorageApprovals {
10
+ static saveDiscipline(agent, stats) {
11
+ const cleanAgent = agent.replace("@", "");
12
+ this.getDB().prepare(`
13
+ INSERT INTO discipline (agent, total_calls, violations, last_violation, cooldown_until, updated_at)
14
+ VALUES (?, ?, ?, ?, ?, datetime('now'))
15
+ ON CONFLICT(agent) DO UPDATE SET
16
+ total_calls = excluded.total_calls,
17
+ violations = excluded.violations,
18
+ last_violation = excluded.last_violation,
19
+ cooldown_until = excluded.cooldown_until,
20
+ updated_at = datetime('now')
21
+ `).run(cleanAgent, stats.totalCalls, stats.violations, stats.lastViolation, stats.cooldownUntil);
22
+ }
23
+ static getDiscipline(agent) {
24
+ const cleanAgent = agent.replace("@", "");
25
+ try {
26
+ const row = this.getDB().prepare("SELECT * FROM discipline WHERE agent = ?").get(cleanAgent);
27
+ if (!row)
28
+ return null;
29
+ return {
30
+ agent: row.agent,
31
+ totalCalls: row.total_calls,
32
+ violations: row.violations,
33
+ lastViolation: row.last_violation,
34
+ cooldownUntil: row.cooldown_until
35
+ };
36
+ }
37
+ catch (err) {
38
+ logger.debug(`Failed to get discipline: ${err.message}`);
39
+ return null;
40
+ }
41
+ }
42
+ static getAllDiscipline() {
43
+ try {
44
+ const rows = this.getDB().prepare("SELECT * FROM discipline").all();
45
+ return rows.map(row => ({
46
+ agent: row.agent,
47
+ totalCalls: row.total_calls,
48
+ violations: row.violations,
49
+ lastViolation: row.last_violation,
50
+ cooldownUntil: row.cooldown_until
51
+ }));
52
+ }
53
+ catch (err) {
54
+ logger.debug(`Failed to get all discipline: ${err.message}`);
55
+ return [];
56
+ }
57
+ }
58
+ static clearAllDiscipline() {
59
+ try {
60
+ this.getDB().prepare("DELETE FROM discipline").run();
61
+ }
62
+ catch (err) {
63
+ logger.debug(`Failed to clear discipline: ${err.message}`);
64
+ }
65
+ }
66
+ static recordDisciplineCall(agent, tool, timestamp, argsSize) {
67
+ const cleanAgent = agent.replace("@", "");
68
+ try {
69
+ this.getDB().prepare("INSERT INTO discipline_calls (agent, tool, ts, args_size) VALUES (?, ?, ?, ?)").run(cleanAgent, tool, timestamp, argsSize);
70
+ }
71
+ catch (err) {
72
+ logger.debug(`Failed to record discipline call: ${err.message}`);
73
+ }
74
+ }
75
+ static getRecentDisciplineCalls(agent, sinceTs) {
76
+ const cleanAgent = agent.replace("@", "");
77
+ try {
78
+ const rows = this.getDB().prepare("SELECT tool, ts, args_size FROM discipline_calls WHERE agent = ? AND ts > ? ORDER BY ts ASC").all(cleanAgent, sinceTs);
79
+ return rows.map(r => ({ tool: r.tool, timestamp: r.ts, argsSize: r.args_size }));
80
+ }
81
+ catch (err) {
82
+ logger.debug(`Failed to get recent discipline calls: ${err.message}`);
83
+ return [];
84
+ }
85
+ }
86
+ static pruneDisciplineCalls(beforeTs) {
87
+ try {
88
+ this.getDB().prepare("DELETE FROM discipline_calls WHERE ts < ?").run(beforeTs);
89
+ }
90
+ catch (err) {
91
+ logger.debug(`Failed to prune discipline calls: ${err.message}`);
92
+ }
93
+ }
94
+ static clearDisciplineCalls(agent) {
95
+ try {
96
+ if (agent) {
97
+ this.getDB().prepare("DELETE FROM discipline_calls WHERE agent = ?").run(agent.replace("@", ""));
98
+ }
99
+ else {
100
+ this.getDB().prepare("DELETE FROM discipline_calls").run();
101
+ }
102
+ }
103
+ catch (err) {
104
+ logger.debug(`Failed to clear discipline calls: ${err.message}`);
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=discipline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discipline.js","sourceRoot":"","sources":["../../../src/modules/storage/discipline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Framework directory (.atabey) resolution shared by the storage domain modules.
3
+ * Split from the original storage.ts (2026-10-20 audit, S7).
4
+ */
5
+ /**
6
+ * Resolves the framework directory (.atabey) intelligently by ascending the directory tree,
7
+ * preventing subpackages and test runners from spraying databases in random subfolders.
8
+ */
9
+ export declare function resolveFrameworkDir(): string;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Framework directory (.atabey) resolution shared by the storage domain modules.
3
+ * Split from the original storage.ts (2026-10-20 audit, S7).
4
+ */
5
+ import fs from "fs";
6
+ import os from "os";
7
+ import path from "path";
8
+ let vitestWorkerFrameworkDir = null;
9
+ function getVitestWorkerFrameworkDir() {
10
+ if (!vitestWorkerFrameworkDir) {
11
+ vitestWorkerFrameworkDir = path.join(os.tmpdir(), `atabey-vitest-worker-${process.pid}`, ".atabey");
12
+ }
13
+ return vitestWorkerFrameworkDir;
14
+ }
15
+ /**
16
+ * Resolves the framework directory (.atabey) intelligently by ascending the directory tree,
17
+ * preventing subpackages and test runners from spraying databases in random subfolders.
18
+ */
19
+ export function resolveFrameworkDir() {
20
+ const testDir = process.env.ATABEY_TEST_DIR || process.env.ATABEY_FRAMEWORK_DIR;
21
+ if (testDir)
22
+ return testDir;
23
+ if (process.env.VITEST) {
24
+ return getVitestWorkerFrameworkDir();
25
+ }
26
+ if (process.env.ATABEY_PROJECT_ROOT) {
27
+ return path.join(process.env.ATABEY_PROJECT_ROOT, ".atabey");
28
+ }
29
+ let cur = process.cwd();
30
+ let firstFoundCandidate = null;
31
+ while (cur !== path.parse(cur).root) {
32
+ const pkgJson = path.join(cur, "package.json");
33
+ let isMonorepoRoot = false;
34
+ if (fs.existsSync(pkgJson)) {
35
+ try {
36
+ const pkg = JSON.parse(fs.readFileSync(pkgJson, "utf8"));
37
+ if (pkg.name === "atabey-monorepo" || pkg.frameworkRepo === true || (pkg.workspaces && Array.isArray(pkg.workspaces))) {
38
+ isMonorepoRoot = true;
39
+ }
40
+ }
41
+ catch { /* ignore */ }
42
+ }
43
+ const candidate = path.join(cur, ".atabey");
44
+ if (isMonorepoRoot) {
45
+ return candidate;
46
+ }
47
+ if (fs.existsSync(candidate) && !firstFoundCandidate) {
48
+ firstFoundCandidate = candidate;
49
+ }
50
+ cur = path.dirname(cur);
51
+ }
52
+ return firstFoundCandidate || path.join(process.cwd(), ".atabey");
53
+ }
54
+ //# sourceMappingURL=framework-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"framework-dir.js","sourceRoot":"","sources":["../../../src/modules/storage/framework-dir.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,IAAI,wBAAwB,GAAkB,IAAI,CAAC;AAEnD,SAAS,2BAA2B;IAChC,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC5B,wBAAwB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,wBAAwB,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,wBAAwB,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAChF,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,2BAA2B,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAE9C,OAAO,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC/C,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBACzD,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,GAAG,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;oBACpH,cAAc,GAAG,IAAI,CAAC;gBAC1B,CAAC;YACL,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC5C,IAAI,cAAc,EAAE,CAAC;YACjB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnD,mBAAmB,GAAG,SAAS,CAAC;QACpC,CAAC;QACD,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,mBAAmB,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Database integrity checks, migration status, backup/restore.
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import type { BackupResult, IntegrityCheckResult } from "./migrations.js";
8
+ import { StorageCodeGraph } from "./code-graph.js";
9
+ export declare class StorageIntegrity extends StorageCodeGraph {
10
+ static checkIntegrity(): {
11
+ ok: boolean;
12
+ message: string;
13
+ };
14
+ static verifyDatabaseIntegrity(mode?: "quick" | "full"): IntegrityCheckResult;
15
+ static getMigrationStatus(): {
16
+ currentVersion: number;
17
+ applied: import("./migrations.js").AppliedMigration[];
18
+ pending: Array<{
19
+ version: number;
20
+ name: string;
21
+ }>;
22
+ };
23
+ static backup(destinationPath?: string): BackupResult;
24
+ static restore(backupPath: string, targetDbPath?: string): {
25
+ restoredPath: string;
26
+ sha256: string;
27
+ schemaVersion: number;
28
+ };
29
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Database integrity checks, migration status, backup/restore.
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import path from "path";
8
+ import { backupDatabase, getMigrationStatus, restoreDatabase, verifyDatabaseIntegrity } from "./migrations.js";
9
+ import { resolveFrameworkDir } from "./framework-dir.js";
10
+ import { StorageCodeGraph } from "./code-graph.js";
11
+ export class StorageIntegrity extends StorageCodeGraph {
12
+ static checkIntegrity() {
13
+ try {
14
+ const db = this.getDB();
15
+ const res = verifyDatabaseIntegrity(db, "quick");
16
+ return { ok: res.ok, message: res.messages.join("; ") || "unknown" };
17
+ }
18
+ catch (err) {
19
+ return { ok: false, message: err.message };
20
+ }
21
+ }
22
+ static verifyDatabaseIntegrity(mode = "full") {
23
+ return verifyDatabaseIntegrity(this.getDB(), mode);
24
+ }
25
+ static getMigrationStatus() {
26
+ return getMigrationStatus(this.getDB());
27
+ }
28
+ static backup(destinationPath) {
29
+ const db = this.getDB();
30
+ const frameworkDir = resolveFrameworkDir();
31
+ const defaultDest = path.join(frameworkDir, "backups", `atabey-${new Date().toISOString().replace(/[:.]/g, "-")}.db`);
32
+ return backupDatabase(db, destinationPath || defaultDest);
33
+ }
34
+ static restore(backupPath, targetDbPath) {
35
+ const frameworkDir = resolveFrameworkDir();
36
+ const target = targetDbPath || path.join(frameworkDir, "atabey.db");
37
+ this.reset();
38
+ return restoreDatabase(backupPath, target);
39
+ }
40
+ }
41
+ //# sourceMappingURL=integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity.js","sourceRoot":"","sources":["../../../src/modules/storage/integrity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE/G,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,OAAO,gBAAiB,SAAQ,gBAAgB;IAC3C,MAAM,CAAC,cAAc;QACxB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;QAC1D,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,uBAAuB,CAAC,OAAyB,MAAM;QACjE,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAEM,MAAM,CAAC,kBAAkB;QAC5B,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,eAAwB;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CACzB,YAAY,EACZ,SAAS,EACT,UAAU,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAChE,CAAC;QACF,OAAO,cAAc,CAAC,EAAE,EAAE,eAAe,IAAI,WAAW,CAAC,CAAC;IAC9D,CAAC;IAEM,MAAM,CAAC,OAAO,CAAC,UAAkB,EAAE,YAAqB;QAC3D,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;CACJ"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Knowledge base file persistence (`.atabey/knowledge/*` mirror in SQLite).
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import { StorageBase } from "./base.js";
8
+ export declare class StorageKnowledge extends StorageBase {
9
+ static getKnowledgeList(): Array<{
10
+ filename: string;
11
+ updated_at: string;
12
+ }>;
13
+ static getKnowledgeFile(filename: string): {
14
+ filename: string;
15
+ content: string;
16
+ updated_at: string;
17
+ } | null;
18
+ static saveKnowledgeFile(filename: string, content: string): void;
19
+ static deleteKnowledgeFile(filename: string): boolean;
20
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Knowledge base file persistence (`.atabey/knowledge/*` mirror in SQLite).
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import { logger } from "../observability/logger.js";
8
+ import { StorageBase } from "./base.js";
9
+ export class StorageKnowledge extends StorageBase {
10
+ static getKnowledgeList() {
11
+ try {
12
+ return this.getDB().prepare("SELECT filename, updated_at FROM knowledge ORDER BY updated_at DESC").all();
13
+ }
14
+ catch (err) {
15
+ logger.debug(`Failed to get knowledge list: ${err.message}`);
16
+ return [];
17
+ }
18
+ }
19
+ static getKnowledgeFile(filename) {
20
+ try {
21
+ const row = this.getDB().prepare("SELECT * FROM knowledge WHERE filename = ?").get(filename);
22
+ return row || null;
23
+ }
24
+ catch (err) {
25
+ logger.debug(`Failed to get knowledge file: ${err.message}`);
26
+ return null;
27
+ }
28
+ }
29
+ static saveKnowledgeFile(filename, content) {
30
+ this.getDB().prepare(`
31
+ INSERT INTO knowledge (filename, content, updated_at) VALUES (?, ?, datetime('now'))
32
+ ON CONFLICT(filename) DO UPDATE SET content = excluded.content, updated_at = datetime('now')
33
+ `).run(filename, content);
34
+ }
35
+ static deleteKnowledgeFile(filename) {
36
+ const info = this.getDB().prepare("DELETE FROM knowledge WHERE filename = ?").run(filename);
37
+ return info.changes > 0;
38
+ }
39
+ }
40
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../../src/modules/storage/knowledge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IACtC,MAAM,CAAC,gBAAgB;QAC1B,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,qEAAqE,CAAC,CAAC,GAAG,EAAqD,CAAC;QAChK,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,iCAAkC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,gBAAgB,CAAC,QAAgB;QAC3C,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAA0E,CAAC;YACtK,OAAO,GAAG,IAAI,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,iCAAkC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,iBAAiB,CAAC,QAAgB,EAAE,OAAe;QAC7D,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;;;SAGpB,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAEM,MAAM,CAAC,mBAAmB,CAAC,QAAgB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5F,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;CACJ"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Hash-chained audit log persistence (KVKK/GDPR compliant, PII masked).
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import type { LogRow } from "./types.js";
8
+ import { StorageTasks } from "./tasks.js";
9
+ export declare class StorageLogs extends StorageTasks {
10
+ static saveLog(log: {
11
+ agent: string;
12
+ action: string;
13
+ trace_id?: string;
14
+ status: string;
15
+ summary: string;
16
+ findings?: string;
17
+ }): number;
18
+ static verifyLogIntegrity(): {
19
+ valid: boolean;
20
+ checked?: number;
21
+ failedLogId?: number;
22
+ reason?: string;
23
+ tip?: string;
24
+ };
25
+ static getLogs(agentName?: string): LogRow[];
26
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Hash-chained audit log persistence (KVKK/GDPR compliant, PII masked).
3
+ *
4
+ * Split from the original AtabeyStorage god-class (2026-10-20 audit, S7).
5
+ * Part of the storage inheritance chain; AtabeyStorage (storage.ts) is the facade.
6
+ */
7
+ import { AUDIT_CHAIN_GENESIS, buildAgentLogChainPayload, chainDigest, readChainAnchor, writeChainAnchor, verifyHashChain } from "../observability/audit-chain.js";
8
+ import { maskText } from "../security/pii.js";
9
+ import { asAgentID, asLogID } from "../primitives/types.js";
10
+ import { StorageTasks } from "./tasks.js";
11
+ export class StorageLogs extends StorageTasks {
12
+ static saveLog(log) {
13
+ const db = this.getDB();
14
+ const timestamp = new Date().toISOString();
15
+ const agent = log.agent.replace("@", "");
16
+ const maskedSummary = maskText(log.summary);
17
+ const maskedFindings = log.findings ? maskText(log.findings) : null;
18
+ const traceId = log.trace_id || "";
19
+ let lastId = 0;
20
+ const insert = db.transaction(() => {
21
+ let prevHash = AUDIT_CHAIN_GENESIS;
22
+ try {
23
+ const lastRow = db.prepare("SELECT hash FROM logs WHERE hash IS NOT NULL ORDER BY id DESC LIMIT 1").get();
24
+ if (lastRow && lastRow.hash) {
25
+ prevHash = lastRow.hash;
26
+ }
27
+ }
28
+ catch { /* best-effort fallback to genesis */ }
29
+ const payload = buildAgentLogChainPayload({
30
+ prevHash,
31
+ timestamp,
32
+ agent,
33
+ action: log.action,
34
+ traceId: traceId || "",
35
+ status: log.status,
36
+ summary: maskedSummary,
37
+ });
38
+ const hash = chainDigest(payload);
39
+ const result = db.prepare(`
40
+ INSERT INTO logs (timestamp, agent, action, trace_id, status, summary, findings, prev_hash, hash)
41
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
42
+ `).run(timestamp, agent, log.action, log.trace_id || null, log.status, maskedSummary, maskedFindings, prevHash, hash);
43
+ lastId = Number(result.lastInsertRowid);
44
+ const count = db.prepare("SELECT COUNT(*) AS c FROM logs WHERE hash IS NOT NULL").get().c;
45
+ writeChainAnchor("agent-log", hash, count);
46
+ });
47
+ insert();
48
+ return lastId;
49
+ }
50
+ static verifyLogIntegrity() {
51
+ const db = this.getDB();
52
+ try {
53
+ const rows = db.prepare("SELECT * FROM logs ORDER BY id ASC").all();
54
+ const hashed = rows.filter((r) => r.hash);
55
+ if (hashed.length === 0) {
56
+ return { valid: true, checked: 0, reason: "No hashed log rows yet" };
57
+ }
58
+ const anchor = readChainAnchor("agent-log");
59
+ return verifyHashChain(hashed, (row, prevHash) => buildAgentLogChainPayload({
60
+ prevHash,
61
+ agent: row.agent,
62
+ action: row.action,
63
+ traceId: row.trace_id || "",
64
+ status: row.status,
65
+ summary: row.summary,
66
+ timestamp: row.timestamp,
67
+ }), { expectedTip: anchor?.tip, expectedCount: anchor?.count });
68
+ }
69
+ catch (err) {
70
+ return { valid: false, reason: `Verification error: ${err.message}` };
71
+ }
72
+ }
73
+ static getLogs(agentName) {
74
+ const db = this.getDB();
75
+ let rows;
76
+ const cleanName = agentName ? agentName.replace("@", "") : undefined;
77
+ if (cleanName) {
78
+ rows = db.prepare("SELECT * FROM logs WHERE agent = ? ORDER BY timestamp DESC, id DESC").all(cleanName);
79
+ }
80
+ else {
81
+ rows = db.prepare("SELECT * FROM logs ORDER BY timestamp DESC, id DESC").all();
82
+ }
83
+ return rows.map(r => ({
84
+ id: asLogID(r.id),
85
+ timestamp: r.timestamp,
86
+ agent: asAgentID(r.agent),
87
+ action: r.action,
88
+ trace_id: r.trace_id || undefined,
89
+ status: r.status,
90
+ summary: maskText(r.summary),
91
+ findings: r.findings ? maskText(r.findings) : undefined,
92
+ prev_hash: r.prev_hash || undefined,
93
+ hash: r.hash || undefined
94
+ }));
95
+ }
96
+ }
97
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/modules/storage/logs.ts"],"names":[],"mappings":"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"}