@elsium-ai/observe 0.10.0 → 0.11.0

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.
@@ -0,0 +1,7 @@
1
+ import type { AuditSink } from './audit-sink';
2
+ export interface JsonlSinkConfig {
3
+ path: string;
4
+ fsync?: boolean;
5
+ }
6
+ export declare function createJsonlSink(config: JsonlSinkConfig): AuditSink;
7
+ //# sourceMappingURL=audit-sink-jsonl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-sink-jsonl.d.ts","sourceRoot":"","sources":["../src/audit-sink-jsonl.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAI7C,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAwDlE"}
package/dist/index.d.ts CHANGED
@@ -16,6 +16,8 @@ export { createSplunkSink } from './audit-sink-splunk';
16
16
  export type { SplunkSinkConfig } from './audit-sink-splunk';
17
17
  export { createDatadogSink } from './audit-sink-datadog';
18
18
  export type { DatadogSinkConfig } from './audit-sink-datadog';
19
+ export { createJsonlSink } from './audit-sink-jsonl';
20
+ export type { JsonlSinkConfig } from './audit-sink-jsonl';
19
21
  export { createProvenanceTracker } from './provenance';
20
22
  export type { ProvenanceRecord, ProvenanceTracker } from './provenance';
21
23
  export { createExperiment, createFileExperimentStore } from './experiment';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAG1F,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACnE,YAAY,EACX,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,cAAc,GACd,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAG9F,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAClF,YAAY,EACX,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACV,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAGvE,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAC1E,YAAY,EACX,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,GACf,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAClE,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,YAAY,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAG7E,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC/E,YAAY,EACX,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACN,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,QAAQ,CAAA;AACf,YAAY,EACX,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,GAClB,MAAM,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1282,6 +1282,68 @@ function createDatadogSink(config) {
1282
1282
  }
1283
1283
  };
1284
1284
  }
1285
+ // src/audit-sink-jsonl.ts
1286
+ import { mkdir, open } from "node:fs/promises";
1287
+ import { dirname } from "node:path";
1288
+ var log5 = createLogger();
1289
+ function createJsonlSink(config) {
1290
+ const { path, fsync = true } = config;
1291
+ let handle = null;
1292
+ let initPromise = null;
1293
+ let writeChain = Promise.resolve();
1294
+ async function getHandle() {
1295
+ if (handle)
1296
+ return handle;
1297
+ if (initPromise)
1298
+ return initPromise;
1299
+ initPromise = (async () => {
1300
+ await mkdir(dirname(path), { recursive: true });
1301
+ handle = await open(path, "a");
1302
+ return handle;
1303
+ })();
1304
+ return initPromise;
1305
+ }
1306
+ function withWriteLock(fn) {
1307
+ const previous = writeChain;
1308
+ const next = previous.catch(() => {}).then(fn);
1309
+ writeChain = next;
1310
+ return next;
1311
+ }
1312
+ return {
1313
+ name: "jsonl",
1314
+ async send(events) {
1315
+ if (events.length === 0)
1316
+ return;
1317
+ return withWriteLock(async () => {
1318
+ const fh = await getHandle();
1319
+ const payload = `${events.map((e) => JSON.stringify(e)).join(`
1320
+ `)}
1321
+ `;
1322
+ await fh.appendFile(payload, "utf8");
1323
+ if (fsync) {
1324
+ try {
1325
+ await fh.sync();
1326
+ } catch (err2) {
1327
+ log5.warn("jsonl sink fsync failed", { error: err2 });
1328
+ }
1329
+ }
1330
+ });
1331
+ },
1332
+ async shutdown() {
1333
+ await withWriteLock(async () => {
1334
+ if (handle) {
1335
+ try {
1336
+ if (fsync)
1337
+ await handle.sync();
1338
+ } finally {
1339
+ await handle.close();
1340
+ handle = null;
1341
+ }
1342
+ }
1343
+ });
1344
+ }
1345
+ };
1346
+ }
1285
1347
  // src/provenance.ts
1286
1348
  import { createHash as createHash2 } from "node:crypto";
1287
1349
  function sha256(input) {
@@ -1343,7 +1405,7 @@ function createProvenanceTracker(options) {
1343
1405
  import { createHash as createHash3 } from "node:crypto";
1344
1406
  import { existsSync, mkdirSync, readFileSync, writeFileSync as writeFileSync2 } from "node:fs";
1345
1407
  import { join } from "node:path";
1346
- var log5 = createLogger();
1408
+ var log6 = createLogger();
1347
1409
  function createFileExperimentStore(dir) {
1348
1410
  return {
1349
1411
  save(name, data) {
@@ -1354,7 +1416,7 @@ function createFileExperimentStore(dir) {
1354
1416
  const filePath = join(dir, `${name}.json`);
1355
1417
  writeFileSync2(filePath, JSON.stringify(data, null, 2));
1356
1418
  } catch (err2) {
1357
- log5.error("Failed to save experiment", {
1419
+ log6.error("Failed to save experiment", {
1358
1420
  name,
1359
1421
  error: err2 instanceof Error ? err2.message : String(err2)
1360
1422
  });
@@ -1385,7 +1447,7 @@ function loadFromStore(store, name, stats) {
1385
1447
  stats[vName].metrics[key] = { sum: m.sum, count: m.count };
1386
1448
  }
1387
1449
  }
1388
- log5.debug("Loaded experiment state", { name, totalAssignments: saved.totalAssignments });
1450
+ log6.debug("Loaded experiment state", { name, totalAssignments: saved.totalAssignments });
1389
1451
  }
1390
1452
  function recordMetrics(s, metrics) {
1391
1453
  for (const [key, value] of Object.entries(metrics)) {
@@ -1453,7 +1515,7 @@ function createExperiment(config) {
1453
1515
  const s = stats[variant.name];
1454
1516
  if (s)
1455
1517
  s.assignments++;
1456
- log5.debug("Experiment assignment", {
1518
+ log6.debug("Experiment assignment", {
1457
1519
  experiment: name,
1458
1520
  variant: variant.name,
1459
1521
  userId
@@ -1524,7 +1586,7 @@ function instrumentAgent(agent, tracer) {
1524
1586
  // src/studio-exporter.ts
1525
1587
  import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync3 } from "node:fs";
1526
1588
  import { join as join2 } from "node:path";
1527
- var log6 = createLogger();
1589
+ var log7 = createLogger();
1528
1590
  function ensureDir(dirPath) {
1529
1591
  if (!existsSync2(dirPath)) {
1530
1592
  mkdirSync2(dirPath, { recursive: true });
@@ -1534,7 +1596,7 @@ function safeWriteJSON(filePath, data) {
1534
1596
  try {
1535
1597
  writeFileSync3(filePath, JSON.stringify(data, null, 2));
1536
1598
  } catch (err2) {
1537
- log6.error("Studio exporter write failed", {
1599
+ log7.error("Studio exporter write failed", {
1538
1600
  file: filePath,
1539
1601
  error: err2 instanceof Error ? err2.message : String(err2)
1540
1602
  });
@@ -1919,7 +1981,7 @@ function formatComplianceReport(report) {
1919
1981
  `);
1920
1982
  }
1921
1983
  // src/otel.ts
1922
- var log7 = createLogger();
1984
+ var log8 = createLogger();
1923
1985
  var SPAN_KIND_MAP = {
1924
1986
  llm: 3,
1925
1987
  tool: 1,
@@ -2060,10 +2122,10 @@ function createOTLPExporter(config) {
2060
2122
  body: JSON.stringify(payload)
2061
2123
  });
2062
2124
  if (!response.ok) {
2063
- log7.error(`OTLP export failed: ${response.status} ${response.statusText}`);
2125
+ log8.error(`OTLP export failed: ${response.status} ${response.statusText}`);
2064
2126
  }
2065
2127
  } catch (err2) {
2066
- log7.error("OTLP export error", { error: err2 instanceof Error ? err2.message : String(err2) });
2128
+ log8.error("OTLP export error", { error: err2 instanceof Error ? err2.message : String(err2) });
2067
2129
  }
2068
2130
  }
2069
2131
  function startAutoFlush() {
@@ -2120,6 +2182,7 @@ export {
2120
2182
  createProvenanceTracker,
2121
2183
  createOTLPExporter,
2122
2184
  createMetrics,
2185
+ createJsonlSink,
2123
2186
  createFileExperimentStore,
2124
2187
  createExperiment,
2125
2188
  createDatadogSink,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elsium-ai/observe",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "Observability, tracing, and cost tracking for ElsiumAI",
5
5
  "license": "MIT",
6
6
  "author": "Eric Utrera <ebutrera9103@gmail.com>",
@@ -26,7 +26,7 @@
26
26
  "dev": "bun --watch src/index.ts"
27
27
  },
28
28
  "dependencies": {
29
- "@elsium-ai/core": "^0.10.0"
29
+ "@elsium-ai/core": "^0.11.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "typescript": "^5.7.0"