atabey-shared 0.0.37 → 0.1.1-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-identity.d.ts +34 -0
  3. package/dist/agent-identity.js +77 -0
  4. package/dist/agent-identity.js.map +1 -0
  5. package/dist/api-catalog.d.ts +57 -0
  6. package/dist/api-catalog.js +254 -0
  7. package/dist/api-catalog.js.map +1 -0
  8. package/dist/audit-chain.d.ts +32 -3
  9. package/dist/audit-chain.js +187 -10
  10. package/dist/audit-chain.js.map +1 -1
  11. package/dist/audit.d.ts +8 -0
  12. package/dist/audit.js +44 -7
  13. package/dist/audit.js.map +1 -1
  14. package/dist/constants.d.ts +7 -9
  15. package/dist/constants.js +14 -18
  16. package/dist/constants.js.map +1 -1
  17. package/dist/database.d.ts +1 -0
  18. package/dist/database.js +3 -0
  19. package/dist/database.js.map +1 -1
  20. package/dist/errors.d.ts +1 -1
  21. package/dist/errors.js +1 -1
  22. package/dist/file-lock.d.ts +5 -0
  23. package/dist/file-lock.js +20 -31
  24. package/dist/file-lock.js.map +1 -1
  25. package/dist/index.d.ts +9 -0
  26. package/dist/index.js +9 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/job-queue.d.ts +32 -9
  29. package/dist/job-queue.js +81 -8
  30. package/dist/job-queue.js.map +1 -1
  31. package/dist/logger.d.ts +1 -0
  32. package/dist/logger.js +33 -7
  33. package/dist/logger.js.map +1 -1
  34. package/dist/memory-prune.d.ts +18 -0
  35. package/dist/memory-prune.js +48 -0
  36. package/dist/memory-prune.js.map +1 -0
  37. package/dist/migrations.d.ts +69 -0
  38. package/dist/migrations.js +394 -0
  39. package/dist/migrations.js.map +1 -0
  40. package/dist/otel.d.ts +39 -0
  41. package/dist/otel.js +93 -0
  42. package/dist/otel.js.map +1 -0
  43. package/dist/outbound-http.d.ts +32 -0
  44. package/dist/outbound-http.js +88 -0
  45. package/dist/outbound-http.js.map +1 -0
  46. package/dist/pii.d.ts +1 -0
  47. package/dist/pii.js +82 -26
  48. package/dist/pii.js.map +1 -1
  49. package/dist/policy-gate.js +27 -3
  50. package/dist/policy-gate.js.map +1 -1
  51. package/dist/retention.d.ts +6 -1
  52. package/dist/retention.js +56 -9
  53. package/dist/retention.js.map +1 -1
  54. package/dist/sandbox-fs.d.ts +1 -1
  55. package/dist/sandbox-fs.js +31 -38
  56. package/dist/sandbox-fs.js.map +1 -1
  57. package/dist/sandbox-runtime.d.ts +22 -29
  58. package/dist/sandbox-runtime.js +125 -93
  59. package/dist/sandbox-runtime.js.map +1 -1
  60. package/dist/sandbox.d.ts +1 -1
  61. package/dist/sandbox.js +1 -1
  62. package/dist/secrets.d.ts +99 -0
  63. package/dist/secrets.js +371 -0
  64. package/dist/secrets.js.map +1 -0
  65. package/dist/storage.d.ts +67 -0
  66. package/dist/storage.js +291 -11
  67. package/dist/storage.js.map +1 -1
  68. package/dist/time.js +6 -2
  69. package/dist/time.js.map +1 -1
  70. package/dist/tls.d.ts +87 -0
  71. package/dist/tls.js +154 -0
  72. package/dist/tls.js.map +1 -0
  73. package/dist/tokenizer.d.ts +54 -0
  74. package/dist/tokenizer.js +272 -0
  75. package/dist/tokenizer.js.map +1 -0
  76. package/dist/types.d.ts +1 -1
  77. package/dist/types.js +1 -1
  78. package/dist/worker-pool.js +19 -0
  79. package/dist/worker-pool.js.map +1 -1
  80. package/package.json +19 -7
@@ -0,0 +1,69 @@
1
+ /**
2
+ * SQLite Schema Migration Runner, Startup Integrity Check & Online Backup/Restore (Phase 1.5)
3
+ *
4
+ * Provides:
5
+ * 1. Versioned, checksummed schema migrations (`schema_migrations` table).
6
+ * 2. Startup integrity verification (`PRAGMA quick_check` / `PRAGMA integrity_check`).
7
+ * 3. Atomic online backup (`VACUUM INTO` + `.sha256` manifest) and verified restore.
8
+ */
9
+ import Database from "better-sqlite3";
10
+ export interface SchemaMigration {
11
+ version: number;
12
+ name: string;
13
+ sql: string;
14
+ }
15
+ export interface AppliedMigration {
16
+ version: number;
17
+ name: string;
18
+ checksum: string;
19
+ applied_at: string;
20
+ }
21
+ export interface IntegrityCheckResult {
22
+ ok: boolean;
23
+ messages: string[];
24
+ foreignKeyViolations: number;
25
+ }
26
+ export interface BackupResult {
27
+ backupPath: string;
28
+ sha256: string;
29
+ sizeBytes: number;
30
+ createdAt: string;
31
+ schemaVersion: number;
32
+ }
33
+ export declare const BUILTIN_MIGRATIONS: SchemaMigration[];
34
+ /**
35
+ * Run all pending schema migrations transactionally and return applied version numbers.
36
+ */
37
+ export declare function runPendingMigrations(db: Database.Database, migrations?: SchemaMigration[]): {
38
+ applied: number[];
39
+ currentVersion: number;
40
+ };
41
+ /**
42
+ * Return applied and pending migrations for diagnostics/CLI.
43
+ */
44
+ export declare function getMigrationStatus(db: Database.Database, migrations?: SchemaMigration[]): {
45
+ currentVersion: number;
46
+ applied: AppliedMigration[];
47
+ pending: Array<{
48
+ version: number;
49
+ name: string;
50
+ }>;
51
+ };
52
+ /**
53
+ * Run SQLite integrity_check / quick_check and foreign_key_check.
54
+ */
55
+ export declare function verifyDatabaseIntegrity(db: Database.Database, mode?: "quick" | "full"): IntegrityCheckResult;
56
+ /**
57
+ * Perform a consistent online backup using SQLite `VACUUM INTO` and write a `.sha256` sidecar.
58
+ */
59
+ export declare function backupDatabase(db: Database.Database, destinationPath: string): BackupResult;
60
+ /**
61
+ * Verify a backup file (checksum sidecar + SQLite integrity_check) and atomically restore it.
62
+ */
63
+ export declare function restoreDatabase(backupPath: string, targetDbPath: string, options?: {
64
+ verifyChecksum?: boolean;
65
+ }): {
66
+ restoredPath: string;
67
+ sha256: string;
68
+ schemaVersion: number;
69
+ };
@@ -0,0 +1,394 @@
1
+ /**
2
+ * SQLite Schema Migration Runner, Startup Integrity Check & Online Backup/Restore (Phase 1.5)
3
+ *
4
+ * Provides:
5
+ * 1. Versioned, checksummed schema migrations (`schema_migrations` table).
6
+ * 2. Startup integrity verification (`PRAGMA quick_check` / `PRAGMA integrity_check`).
7
+ * 3. Atomic online backup (`VACUUM INTO` + `.sha256` manifest) and verified restore.
8
+ */
9
+ import Database from "better-sqlite3";
10
+ import crypto from "crypto";
11
+ import fs from "fs";
12
+ import path from "path";
13
+ export const BUILTIN_MIGRATIONS = [
14
+ {
15
+ version: 1,
16
+ name: "001_initial_core_tables",
17
+ sql: `
18
+ CREATE TABLE IF NOT EXISTS agents (
19
+ name TEXT PRIMARY KEY,
20
+ state TEXT DEFAULT 'READY',
21
+ task TEXT DEFAULT 'Idle',
22
+ description TEXT DEFAULT '',
23
+ skills TEXT DEFAULT '[]',
24
+ last_updated DATETIME DEFAULT CURRENT_TIMESTAMP
25
+ );
26
+ CREATE TABLE IF NOT EXISTS messages (
27
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
28
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
29
+ sender TEXT,
30
+ receiver TEXT,
31
+ category TEXT,
32
+ content TEXT,
33
+ trace_id TEXT,
34
+ parent_id TEXT,
35
+ status TEXT DEFAULT 'PENDING',
36
+ priority TEXT DEFAULT 'NORMAL',
37
+ requires_approval BOOLEAN DEFAULT 0
38
+ );
39
+ CREATE TABLE IF NOT EXISTS tasks (
40
+ id TEXT PRIMARY KEY,
41
+ trace_id TEXT,
42
+ description TEXT,
43
+ agent TEXT,
44
+ status TEXT DEFAULT 'PENDING',
45
+ priority TEXT DEFAULT 'NORMAL',
46
+ dependencies TEXT,
47
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
48
+ );
49
+ CREATE TABLE IF NOT EXISTS logs (
50
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
51
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
52
+ agent TEXT,
53
+ action TEXT,
54
+ trace_id TEXT,
55
+ status TEXT,
56
+ summary TEXT,
57
+ findings TEXT,
58
+ prev_hash TEXT,
59
+ hash TEXT
60
+ );
61
+ CREATE TABLE IF NOT EXISTS metadata (
62
+ key TEXT PRIMARY KEY,
63
+ value TEXT
64
+ );
65
+ CREATE TABLE IF NOT EXISTS costs (
66
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
67
+ provider TEXT,
68
+ model TEXT,
69
+ input_tokens INTEGER,
70
+ output_tokens INTEGER,
71
+ cost REAL,
72
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
73
+ trace_id TEXT
74
+ );
75
+ CREATE TABLE IF NOT EXISTS knowledge (
76
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
77
+ filename TEXT UNIQUE,
78
+ content TEXT,
79
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
80
+ );
81
+ CREATE TABLE IF NOT EXISTS users (
82
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
83
+ name TEXT UNIQUE,
84
+ token TEXT UNIQUE,
85
+ role TEXT DEFAULT 'user',
86
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
87
+ );
88
+ `,
89
+ },
90
+ {
91
+ version: 2,
92
+ name: "002_governance_approvals_discipline_cooldowns",
93
+ sql: `
94
+ CREATE TABLE IF NOT EXISTS loop_cooldowns (
95
+ agent TEXT PRIMARY KEY,
96
+ cooldown_until INTEGER NOT NULL,
97
+ detail TEXT,
98
+ cooldown_count INTEGER DEFAULT 1,
99
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
100
+ );
101
+ CREATE TABLE IF NOT EXISTS approvals (
102
+ trace_id TEXT PRIMARY KEY,
103
+ tool_name TEXT NOT NULL,
104
+ agent TEXT NOT NULL,
105
+ risk_score INTEGER NOT NULL,
106
+ risk_level TEXT NOT NULL,
107
+ reason TEXT NOT NULL,
108
+ args TEXT NOT NULL,
109
+ created_at INTEGER NOT NULL,
110
+ expires_at INTEGER NOT NULL,
111
+ status TEXT DEFAULT 'PENDING',
112
+ passcode TEXT
113
+ );
114
+ CREATE TABLE IF NOT EXISTS discipline (
115
+ agent TEXT PRIMARY KEY,
116
+ total_calls INTEGER DEFAULT 0,
117
+ violations INTEGER DEFAULT 0,
118
+ last_violation TEXT,
119
+ cooldown_until INTEGER DEFAULT 0,
120
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
121
+ );
122
+ `,
123
+ },
124
+ {
125
+ version: 3,
126
+ name: "003_performance_indexes",
127
+ sql: `
128
+ CREATE INDEX IF NOT EXISTS idx_messages_receiver_status ON messages(receiver, status);
129
+ CREATE INDEX IF NOT EXISTS idx_messages_trace ON messages(trace_id);
130
+ CREATE INDEX IF NOT EXISTS idx_tasks_trace ON tasks(trace_id);
131
+ CREATE INDEX IF NOT EXISTS idx_logs_trace ON logs(trace_id);
132
+ CREATE INDEX IF NOT EXISTS idx_costs_timestamp ON costs(timestamp);
133
+ CREATE INDEX IF NOT EXISTS idx_costs_trace ON costs(trace_id);
134
+ `,
135
+ },
136
+ {
137
+ version: 4,
138
+ name: "004_api_catalog",
139
+ sql: `
140
+ CREATE TABLE IF NOT EXISTS api_endpoints (
141
+ method TEXT NOT NULL,
142
+ path TEXT NOT NULL,
143
+ tag TEXT,
144
+ summary TEXT,
145
+ auth_required INTEGER DEFAULT 0,
146
+ request_schema TEXT,
147
+ response_schema TEXT,
148
+ source TEXT,
149
+ updated_at TEXT NOT NULL,
150
+ PRIMARY KEY (method, path)
151
+ );
152
+ CREATE INDEX IF NOT EXISTS idx_api_endpoints_tag ON api_endpoints(tag);
153
+ `,
154
+ },
155
+ {
156
+ version: 5,
157
+ name: "005_discipline_call_history",
158
+ sql: `
159
+ CREATE TABLE IF NOT EXISTS discipline_calls (
160
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
161
+ agent TEXT NOT NULL,
162
+ tool TEXT NOT NULL,
163
+ ts INTEGER NOT NULL,
164
+ args_size INTEGER DEFAULT 0
165
+ );
166
+ CREATE INDEX IF NOT EXISTS idx_discipline_calls_agent_ts ON discipline_calls(agent, ts);
167
+ `,
168
+ },
169
+ {
170
+ version: 6,
171
+ name: "006_code_graph",
172
+ sql: `
173
+ CREATE TABLE IF NOT EXISTS code_files (
174
+ path TEXT PRIMARY KEY,
175
+ hash TEXT NOT NULL,
176
+ updated_at TEXT NOT NULL
177
+ );
178
+ CREATE TABLE IF NOT EXISTS code_symbols (
179
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
180
+ file TEXT NOT NULL,
181
+ name TEXT NOT NULL,
182
+ kind TEXT NOT NULL,
183
+ start_line INTEGER,
184
+ end_line INTEGER,
185
+ signature TEXT,
186
+ exported INTEGER DEFAULT 0
187
+ );
188
+ CREATE INDEX IF NOT EXISTS idx_code_symbols_name ON code_symbols(name);
189
+ CREATE INDEX IF NOT EXISTS idx_code_symbols_file ON code_symbols(file);
190
+ CREATE TABLE IF NOT EXISTS code_imports (
191
+ file TEXT NOT NULL,
192
+ specifier TEXT NOT NULL
193
+ );
194
+ CREATE INDEX IF NOT EXISTS idx_code_imports_file ON code_imports(file);
195
+ `,
196
+ },
197
+ {
198
+ version: 7,
199
+ name: "007_job_queue",
200
+ sql: `
201
+ CREATE TABLE IF NOT EXISTS job_queue (
202
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
203
+ queue_name TEXT NOT NULL,
204
+ payload TEXT NOT NULL,
205
+ status TEXT DEFAULT 'pending',
206
+ retries INTEGER DEFAULT 0,
207
+ max_retries INTEGER DEFAULT 3,
208
+ error_message TEXT,
209
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
210
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
211
+ );
212
+ CREATE INDEX IF NOT EXISTS idx_job_queue_status ON job_queue(status);
213
+ CREATE INDEX IF NOT EXISTS idx_job_queue_queue_name ON job_queue(queue_name);
214
+ `,
215
+ },
216
+ ];
217
+ function migrationChecksum(sql) {
218
+ return crypto.createHash("sha256").update(sql.trim(), "utf8").digest("hex");
219
+ }
220
+ function ensureMigrationsTable(db) {
221
+ db.exec(`
222
+ CREATE TABLE IF NOT EXISTS schema_migrations (
223
+ version INTEGER PRIMARY KEY,
224
+ name TEXT NOT NULL,
225
+ checksum TEXT NOT NULL,
226
+ applied_at TEXT NOT NULL
227
+ )
228
+ `);
229
+ }
230
+ /**
231
+ * Run all pending schema migrations transactionally and return applied version numbers.
232
+ */
233
+ export function runPendingMigrations(db, migrations = BUILTIN_MIGRATIONS) {
234
+ ensureMigrationsTable(db);
235
+ const existingRows = db
236
+ .prepare("SELECT version, name, checksum, applied_at FROM schema_migrations ORDER BY version ASC")
237
+ .all();
238
+ const existingMap = new Map(existingRows.map((r) => [r.version, r]));
239
+ const sorted = [...migrations].sort((a, b) => a.version - b.version);
240
+ const applied = [];
241
+ for (const m of sorted) {
242
+ const prev = existingMap.get(m.version);
243
+ const checksum = migrationChecksum(m.sql);
244
+ if (prev) {
245
+ if (prev.checksum !== checksum) {
246
+ throw new Error(`[MIGRATION] Checksum mismatch for migration v${m.version} (${m.name}): ` +
247
+ `expected ${prev.checksum}, got ${checksum}.`);
248
+ }
249
+ continue;
250
+ }
251
+ const applyOne = db.transaction(() => {
252
+ db.exec(m.sql);
253
+ db.prepare("INSERT INTO schema_migrations (version, name, checksum, applied_at) VALUES (?, ?, ?, ?)").run(m.version, m.name, checksum, new Date().toISOString());
254
+ });
255
+ applyOne();
256
+ applied.push(m.version);
257
+ }
258
+ // Legacy column backfill for older databases that predate v1 hash columns
259
+ try {
260
+ const tableInfo = db.prepare("PRAGMA table_info(logs)").all();
261
+ const colNames = tableInfo.map((c) => c.name);
262
+ if (colNames.length > 0) {
263
+ if (!colNames.includes("prev_hash"))
264
+ db.exec("ALTER TABLE logs ADD COLUMN prev_hash TEXT");
265
+ if (!colNames.includes("hash"))
266
+ db.exec("ALTER TABLE logs ADD COLUMN hash TEXT");
267
+ }
268
+ }
269
+ catch {
270
+ /* ignore if logs table does not exist in custom migration test */
271
+ }
272
+ const latest = db.prepare("SELECT MAX(version) as v FROM schema_migrations").get();
273
+ return {
274
+ applied,
275
+ currentVersion: latest?.v ?? 0,
276
+ };
277
+ }
278
+ /**
279
+ * Return applied and pending migrations for diagnostics/CLI.
280
+ */
281
+ export function getMigrationStatus(db, migrations = BUILTIN_MIGRATIONS) {
282
+ ensureMigrationsTable(db);
283
+ const applied = db
284
+ .prepare("SELECT version, name, checksum, applied_at FROM schema_migrations ORDER BY version ASC")
285
+ .all();
286
+ const appliedSet = new Set(applied.map((a) => a.version));
287
+ const pending = migrations
288
+ .filter((m) => !appliedSet.has(m.version))
289
+ .map((m) => ({ version: m.version, name: m.name }));
290
+ const currentVersion = applied.length > 0 ? applied[applied.length - 1].version : 0;
291
+ return { currentVersion, applied, pending };
292
+ }
293
+ /**
294
+ * Run SQLite integrity_check / quick_check and foreign_key_check.
295
+ */
296
+ export function verifyDatabaseIntegrity(db, mode = "quick") {
297
+ const pragma = mode === "full" ? "integrity_check" : "quick_check";
298
+ const rows = db.prepare(`PRAGMA ${pragma}`).all();
299
+ const messages = rows.map((r) => Object.values(r)[0] || "");
300
+ const fkRows = db.prepare("PRAGMA foreign_key_check").all();
301
+ const ok = messages.length === 1 && messages[0].toLowerCase() === "ok" && fkRows.length === 0;
302
+ return {
303
+ ok,
304
+ messages,
305
+ foreignKeyViolations: fkRows.length,
306
+ };
307
+ }
308
+ /**
309
+ * Perform a consistent online backup using SQLite `VACUUM INTO` and write a `.sha256` sidecar.
310
+ */
311
+ export function backupDatabase(db, destinationPath) {
312
+ const absDest = path.resolve(destinationPath);
313
+ const parentDir = path.dirname(absDest);
314
+ fs.mkdirSync(parentDir, { recursive: true });
315
+ if (fs.existsSync(absDest)) {
316
+ fs.unlinkSync(absDest);
317
+ }
318
+ // Escape single quotes in path for SQLite VACUUM INTO literal
319
+ const escapedPath = absDest.replace(/'/g, "''");
320
+ db.exec(`VACUUM INTO '${escapedPath}'`);
321
+ const bytes = fs.readFileSync(absDest);
322
+ const sha256 = crypto.createHash("sha256").update(bytes).digest("hex");
323
+ fs.writeFileSync(`${absDest}.sha256`, `${sha256} ${path.basename(absDest)}\n`, { mode: 0o600 });
324
+ const status = getMigrationStatus(db);
325
+ return {
326
+ backupPath: absDest,
327
+ sha256,
328
+ sizeBytes: bytes.length,
329
+ createdAt: new Date().toISOString(),
330
+ schemaVersion: status.currentVersion,
331
+ };
332
+ }
333
+ /**
334
+ * Verify a backup file (checksum sidecar + SQLite integrity_check) and atomically restore it.
335
+ */
336
+ export function restoreDatabase(backupPath, targetDbPath, options = {}) {
337
+ const absBackup = path.resolve(backupPath);
338
+ const absTarget = path.resolve(targetDbPath);
339
+ if (!fs.existsSync(absBackup)) {
340
+ throw new Error(`Backup file does not exist: ${absBackup}`);
341
+ }
342
+ const bytes = fs.readFileSync(absBackup);
343
+ const actualSha256 = crypto.createHash("sha256").update(bytes).digest("hex");
344
+ const sidecarPath = `${absBackup}.sha256`;
345
+ if (options.verifyChecksum !== false && fs.existsSync(sidecarPath)) {
346
+ const expected = fs.readFileSync(sidecarPath, "utf8").trim().split(/\s+/)[0];
347
+ if (expected && expected !== actualSha256) {
348
+ throw new Error(`Backup checksum mismatch for ${absBackup}: expected ${expected}, got ${actualSha256}`);
349
+ }
350
+ }
351
+ // Open backup in read-only mode to verify SQLite integrity before overwriting target
352
+ const tempCheckDb = new Database(absBackup, { readonly: true });
353
+ let schemaVersion = 0;
354
+ try {
355
+ const integrity = verifyDatabaseIntegrity(tempCheckDb, "full");
356
+ if (!integrity.ok) {
357
+ throw new Error(`Backup file failed SQLite integrity check: ${integrity.messages.join("; ")}`);
358
+ }
359
+ try {
360
+ const row = tempCheckDb
361
+ .prepare("SELECT MAX(version) as v FROM schema_migrations")
362
+ .get();
363
+ schemaVersion = row?.v ?? 0;
364
+ }
365
+ catch {
366
+ /* schema_migrations table may not exist in older backups */
367
+ }
368
+ }
369
+ finally {
370
+ tempCheckDb.close();
371
+ }
372
+ fs.mkdirSync(path.dirname(absTarget), { recursive: true });
373
+ const stagingPath = `${absTarget}.restore.${process.pid}`;
374
+ fs.copyFileSync(absBackup, stagingPath);
375
+ // Remove stale WAL/SHM files before atomic swap
376
+ for (const suffix of ["-wal", "-shm"]) {
377
+ const walFile = `${absTarget}${suffix}`;
378
+ if (fs.existsSync(walFile)) {
379
+ try {
380
+ fs.unlinkSync(walFile);
381
+ }
382
+ catch {
383
+ /* ignore */
384
+ }
385
+ }
386
+ }
387
+ fs.renameSync(stagingPath, absTarget);
388
+ return {
389
+ restoredPath: absTarget,
390
+ sha256: actualSha256,
391
+ schemaVersion,
392
+ };
393
+ }
394
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
package/dist/otel.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ /**
2
+ * OpenTelemetry-compatible tracing without an SDK dependency.
3
+ *
4
+ * Produces W3C Trace Context ids and OTLP-shaped span records, written as
5
+ * JSON Lines to `.atabey/telemetry/otel.jsonl` (and optionally pushed to an
6
+ * OTLP/HTTP collector via OTEL_EXPORTER_OTLP_ENDPOINT). This lets enterprise
7
+ * teams ship Atabey's tool spans to Datadog/Jaeger/Grafana/ELK without Atabey
8
+ * taking a hard dependency on the OTel SDK.
9
+ */
10
+ export interface SpanAttributes {
11
+ [key: string]: string | number | boolean | undefined;
12
+ }
13
+ export interface SpanRecord {
14
+ traceId: string;
15
+ spanId: string;
16
+ parentSpanId?: string;
17
+ name: string;
18
+ startTimeUnixNano: string;
19
+ endTimeUnixNano: string;
20
+ attributes: Record<string, string | number | boolean>;
21
+ status: "OK" | "ERROR";
22
+ }
23
+ export declare function newTraceId(): string;
24
+ export declare function newSpanId(): string;
25
+ /** W3C traceparent header for the given ids. */
26
+ export declare function formatTraceparent(traceId: string, spanId: string, sampled?: boolean): string;
27
+ /**
28
+ * Emit a span record. Best-effort: telemetry must never break tool execution.
29
+ */
30
+ export declare function emitSpan(projectRoot: string, span: {
31
+ name: string;
32
+ traceId: string;
33
+ spanId: string;
34
+ parentSpanId?: string;
35
+ startMs: number;
36
+ endMs: number;
37
+ attributes?: SpanAttributes;
38
+ status?: "OK" | "ERROR";
39
+ }): SpanRecord;
package/dist/otel.js ADDED
@@ -0,0 +1,93 @@
1
+ /**
2
+ * OpenTelemetry-compatible tracing without an SDK dependency.
3
+ *
4
+ * Produces W3C Trace Context ids and OTLP-shaped span records, written as
5
+ * JSON Lines to `.atabey/telemetry/otel.jsonl` (and optionally pushed to an
6
+ * OTLP/HTTP collector via OTEL_EXPORTER_OTLP_ENDPOINT). This lets enterprise
7
+ * teams ship Atabey's tool spans to Datadog/Jaeger/Grafana/ELK without Atabey
8
+ * taking a hard dependency on the OTel SDK.
9
+ */
10
+ import crypto from "crypto";
11
+ import fs from "fs";
12
+ import os from "os";
13
+ import path from "path";
14
+ export function newTraceId() {
15
+ return crypto.randomBytes(16).toString("hex");
16
+ }
17
+ export function newSpanId() {
18
+ return crypto.randomBytes(8).toString("hex");
19
+ }
20
+ /** W3C traceparent header for the given ids. */
21
+ export function formatTraceparent(traceId, spanId, sampled = true) {
22
+ return `00-${traceId}-${spanId}-${sampled ? "01" : "00"}`;
23
+ }
24
+ function cleanAttributes(attributes) {
25
+ const out = {};
26
+ for (const [k, v] of Object.entries(attributes)) {
27
+ if (v !== undefined)
28
+ out[k] = v;
29
+ }
30
+ return out;
31
+ }
32
+ /**
33
+ * Emit a span record. Best-effort: telemetry must never break tool execution.
34
+ */
35
+ export function emitSpan(projectRoot, span) {
36
+ const record = {
37
+ traceId: span.traceId,
38
+ spanId: span.spanId,
39
+ parentSpanId: span.parentSpanId,
40
+ name: span.name,
41
+ startTimeUnixNano: String(BigInt(Math.round(span.startMs)) * 1000000n),
42
+ endTimeUnixNano: String(BigInt(Math.round(span.endMs)) * 1000000n),
43
+ attributes: cleanAttributes(span.attributes || {}),
44
+ status: span.status || "OK",
45
+ };
46
+ try {
47
+ const effectiveRoot = process.env.VITEST && path.resolve(projectRoot) === path.resolve(process.cwd())
48
+ ? path.join(os.tmpdir(), `atabey-vitest-worker-${process.pid}`)
49
+ : projectRoot;
50
+ const dir = path.join(effectiveRoot, ".atabey", "telemetry");
51
+ fs.mkdirSync(dir, { recursive: true });
52
+ fs.appendFileSync(path.join(dir, "otel.jsonl"), `${JSON.stringify(record)}\n`);
53
+ }
54
+ catch {
55
+ /* best-effort */
56
+ }
57
+ const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim();
58
+ if (endpoint) {
59
+ void pushOtlp(endpoint, record).catch(() => { });
60
+ }
61
+ return record;
62
+ }
63
+ async function pushOtlp(endpoint, record) {
64
+ const url = endpoint.replace(/\/$/, "") + "/v1/traces";
65
+ const body = JSON.stringify({
66
+ resourceSpans: [{
67
+ resource: { attributes: [{ key: "service.name", value: { stringValue: "atabey" } }] },
68
+ scopeSpans: [{ spans: [{
69
+ traceId: record.traceId,
70
+ spanId: record.spanId,
71
+ parentSpanId: record.parentSpanId,
72
+ name: record.name,
73
+ startTimeUnixNano: record.startTimeUnixNano,
74
+ endTimeUnixNano: record.endTimeUnixNano,
75
+ attributes: Object.entries(record.attributes).map(([k, v]) => ({
76
+ key: k,
77
+ value: typeof v === "number"
78
+ ? { doubleValue: v }
79
+ : typeof v === "boolean"
80
+ ? { boolValue: v }
81
+ : { stringValue: String(v) },
82
+ })),
83
+ status: { code: record.status === "ERROR" ? 2 : 1 },
84
+ }] }],
85
+ }],
86
+ });
87
+ await fetch(url, {
88
+ method: "POST",
89
+ headers: { "Content-Type": "application/json" },
90
+ body,
91
+ }).catch(() => { });
92
+ }
93
+ //# sourceMappingURL=otel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Outbound HTTP(S) helper with TLS 1.3 / mTLS client-certificate support.
3
+ *
4
+ * Node's global `fetch` does not expose per-request client certificates, so
5
+ * Atabey tooling that performs outbound requests uses this `http`/`https`
6
+ * based transport instead. It performs a SINGLE request (no redirect
7
+ * following) and returns the raw response so callers can re-validate each hop
8
+ * (e.g. SSRF checks) before continuing.
9
+ */
10
+ import http from "http";
11
+ export interface OutboundRequestInput {
12
+ url: string;
13
+ method?: string;
14
+ headers?: Record<string, string>;
15
+ body?: string;
16
+ timeoutMs?: number;
17
+ /** Max response body bytes to buffer (default 5 MiB). */
18
+ maxBytes?: number;
19
+ }
20
+ export interface OutboundResponse {
21
+ status: number;
22
+ headers: http.IncomingHttpHeaders;
23
+ text: string;
24
+ /** Redirect target (from the Location header), if any. */
25
+ location?: string;
26
+ finalUrl: string;
27
+ }
28
+ /**
29
+ * Perform a single outbound request. TLS client options come from
30
+ * `resolveOutboundTlsOptions()` (ATABEY_TLS_CLIENT_* env vars).
31
+ */
32
+ export declare function outboundRequest(input: OutboundRequestInput): Promise<OutboundResponse>;