@wizeworks/lens-hub 0.0.0-stage → 0.3.0-alpha.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -2
  3. package/dist/api.d.ts +20 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +90 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/auth.d.ts +9 -0
  8. package/dist/auth.d.ts.map +1 -0
  9. package/dist/auth.js +55 -0
  10. package/dist/auth.js.map +1 -0
  11. package/dist/body.d.ts +9 -0
  12. package/dist/body.d.ts.map +1 -0
  13. package/dist/body.js +25 -0
  14. package/dist/body.js.map +1 -0
  15. package/dist/cli-args.d.ts +10 -0
  16. package/dist/cli-args.d.ts.map +1 -0
  17. package/dist/cli-args.js +63 -0
  18. package/dist/cli-args.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +35 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/data.d.ts +17 -0
  24. package/dist/data.d.ts.map +1 -0
  25. package/dist/data.js +39 -0
  26. package/dist/data.js.map +1 -0
  27. package/dist/hub.d.ts +14 -0
  28. package/dist/hub.d.ts.map +1 -0
  29. package/dist/hub.js +89 -0
  30. package/dist/hub.js.map +1 -0
  31. package/dist/import.d.ts +4 -0
  32. package/dist/import.d.ts.map +1 -0
  33. package/dist/import.js +41 -0
  34. package/dist/import.js.map +1 -0
  35. package/dist/index.d.ts +7 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +3 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/ingest.d.ts +9 -0
  40. package/dist/ingest.d.ts.map +1 -0
  41. package/dist/ingest.js +83 -0
  42. package/dist/ingest.js.map +1 -0
  43. package/dist/kit.d.ts +10 -0
  44. package/dist/kit.d.ts.map +1 -0
  45. package/dist/kit.js +8 -0
  46. package/dist/kit.js.map +1 -0
  47. package/dist/mcp.d.ts +4 -0
  48. package/dist/mcp.d.ts.map +1 -0
  49. package/dist/mcp.js +18 -0
  50. package/dist/mcp.js.map +1 -0
  51. package/dist/metrics-read.d.ts +12 -0
  52. package/dist/metrics-read.d.ts.map +1 -0
  53. package/dist/metrics-read.js +18 -0
  54. package/dist/metrics-read.js.map +1 -0
  55. package/dist/metrics-write.d.ts +12 -0
  56. package/dist/metrics-write.d.ts.map +1 -0
  57. package/dist/metrics-write.js +107 -0
  58. package/dist/metrics-write.js.map +1 -0
  59. package/dist/models-api.d.ts +5 -0
  60. package/dist/models-api.d.ts.map +1 -0
  61. package/dist/models-api.js +36 -0
  62. package/dist/models-api.js.map +1 -0
  63. package/dist/options.d.ts +36 -0
  64. package/dist/options.d.ts.map +1 -0
  65. package/dist/options.js +22 -0
  66. package/dist/options.js.map +1 -0
  67. package/dist/otlp/index.d.ts +8 -0
  68. package/dist/otlp/index.d.ts.map +1 -0
  69. package/dist/otlp/index.js +41 -0
  70. package/dist/otlp/index.js.map +1 -0
  71. package/dist/otlp/logs.d.ts +24 -0
  72. package/dist/otlp/logs.d.ts.map +1 -0
  73. package/dist/otlp/logs.js +44 -0
  74. package/dist/otlp/logs.js.map +1 -0
  75. package/dist/otlp/metrics.d.ts +59 -0
  76. package/dist/otlp/metrics.d.ts.map +1 -0
  77. package/dist/otlp/metrics.js +73 -0
  78. package/dist/otlp/metrics.js.map +1 -0
  79. package/dist/otlp/proto.d.ts +14 -0
  80. package/dist/otlp/proto.d.ts.map +1 -0
  81. package/dist/otlp/proto.js +132 -0
  82. package/dist/otlp/proto.js.map +1 -0
  83. package/dist/otlp/spans.d.ts +33 -0
  84. package/dist/otlp/spans.d.ts.map +1 -0
  85. package/dist/otlp/spans.js +80 -0
  86. package/dist/otlp/spans.js.map +1 -0
  87. package/dist/otlp/values.d.ts +40 -0
  88. package/dist/otlp/values.d.ts.map +1 -0
  89. package/dist/otlp/values.js +78 -0
  90. package/dist/otlp/values.js.map +1 -0
  91. package/dist/scale-exec.d.ts +10 -0
  92. package/dist/scale-exec.d.ts.map +1 -0
  93. package/dist/scale-exec.js +22 -0
  94. package/dist/scale-exec.js.map +1 -0
  95. package/dist/schema-scale.d.ts +7 -0
  96. package/dist/schema-scale.d.ts.map +1 -0
  97. package/dist/schema-scale.js +99 -0
  98. package/dist/schema-scale.js.map +1 -0
  99. package/dist/schema.d.ts +13 -0
  100. package/dist/schema.d.ts.map +1 -0
  101. package/dist/schema.js +49 -0
  102. package/dist/schema.js.map +1 -0
  103. package/dist/settle.d.ts +28 -0
  104. package/dist/settle.d.ts.map +1 -0
  105. package/dist/settle.js +103 -0
  106. package/dist/settle.js.map +1 -0
  107. package/dist/store-read.d.ts +27 -0
  108. package/dist/store-read.d.ts.map +1 -0
  109. package/dist/store-read.js +74 -0
  110. package/dist/store-read.js.map +1 -0
  111. package/dist/store.d.ts +42 -0
  112. package/dist/store.d.ts.map +1 -0
  113. package/dist/store.js +118 -0
  114. package/dist/store.js.map +1 -0
  115. package/package.json +64 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-read.d.ts","sourceRoot":"","sources":["../src/store-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAA6C,KAAK,UAAU,EAA6B,KAAK,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEzI,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAID,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAWtE;AAgBD,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,GAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAoB,GAAG,KAAK,EAAE,CAUpI;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,KAAK,GAAG,SAAS,CAG/H;AASD,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CASxE;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,EAAE,CAI/E;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG7E"}
@@ -0,0 +1,74 @@
1
+ import { buildTrace, HUB_ONLINE_MS } from "@wizeworks/lens-core";
2
+ const CHUNK = 400;
3
+ /** Trace ids that match, newest first. */
4
+ export function findTraceIds(db, q) {
5
+ const where = [];
6
+ const args = [];
7
+ const add = (sql, v) => (where.push(sql), args.push(v));
8
+ if (q.since !== undefined)
9
+ add("updated_ms >= ?", q.since);
10
+ if (q.before !== undefined)
11
+ add("start_ms < ?", q.before);
12
+ if (q.env)
13
+ add("env = ?", q.env);
14
+ if (q.project)
15
+ add("project = ?", q.project);
16
+ if (q.session)
17
+ add("trace_id IN (SELECT trace_id FROM spans WHERE session = ?)", q.session);
18
+ const sql = `SELECT trace_id FROM traces ${where.length ? `WHERE ${where.join(" AND ")}` : ""} ORDER BY start_ms DESC LIMIT ?`;
19
+ return db.prepare(sql).all(...args, q.limit).map((r) => r.trace_id);
20
+ }
21
+ function rowsByTrace(db, table, column, ids) {
22
+ const out = new Map();
23
+ for (let i = 0; i < ids.length; i += CHUNK) {
24
+ const part = ids.slice(i, i + CHUNK);
25
+ const sql = `SELECT trace_id, ${column} AS v FROM ${table} WHERE trace_id IN (${part.map(() => "?").join(",")})`;
26
+ for (const r of db.prepare(sql).all(...part)) {
27
+ const list = out.get(r.trace_id);
28
+ if (list)
29
+ list.push(r.v);
30
+ else
31
+ out.set(r.trace_id, [r.v]);
32
+ }
33
+ }
34
+ return out;
35
+ }
36
+ /** Build full traces, in the order of `ids`. `keepRemote` drops remotes the hub already has. */
37
+ export function loadTraces(db, ids, keepRemote = () => true) {
38
+ if (ids.length === 0)
39
+ return [];
40
+ const spans = rowsByTrace(db, "spans", "json", ids);
41
+ const logs = rowsByTrace(db, "logs", "json", ids);
42
+ const remotes = rowsByTrace(db, "remotes", "endpoint", ids);
43
+ return ids.map((id) => {
44
+ const s = (spans.get(id) ?? []).map((j) => JSON.parse(j));
45
+ const l = (logs.get(id) ?? []).map((j) => JSON.parse(j)).sort((a, b) => a.timeMs - b.timeMs);
46
+ return buildTrace(id, s, l, (remotes.get(id) ?? []).filter(keepRemote));
47
+ });
48
+ }
49
+ export function getStoredTrace(db, traceId, keepRemote) {
50
+ const exists = db.prepare("SELECT 1 FROM traces WHERE trace_id = ?").get(traceId);
51
+ return exists ? loadTraces(db, [traceId], keepRemote)[0] : undefined;
52
+ }
53
+ /** Every service the hub knows, online ones first. */
54
+ export function listServices(db, now) {
55
+ const rows = db.prepare("SELECT via, info, first_seen, last_seen FROM services ORDER BY last_seen DESC").all();
56
+ return rows.map((r) => ({
57
+ ...JSON.parse(r.info),
58
+ via: r.via,
59
+ firstSeenMs: r.first_seen,
60
+ lastSeenMs: r.last_seen,
61
+ online: now - r.last_seen <= HUB_ONLINE_MS,
62
+ }));
63
+ }
64
+ /** Environments (or projects) seen in services and traces, sorted. */
65
+ export function distinctOf(db, field) {
66
+ const serviceColumn = field === "env" ? "environment" : "project";
67
+ const sql = `SELECT ${serviceColumn} AS v FROM services UNION SELECT DISTINCT ${field} FROM traces`;
68
+ return db.prepare(sql).all().map((r) => r.v).filter(Boolean).sort();
69
+ }
70
+ export function countRows(db) {
71
+ const n = (table) => db.prepare(`SELECT count(*) AS n FROM ${table}`).get().n;
72
+ return { traces: n("traces"), spans: n("spans") };
73
+ }
74
+ //# sourceMappingURL=store-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-read.js","sourceRoot":"","sources":["../src/store-read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import { type HubLog, type HubRemote, type HubSender, type MetricPoint, type Span } from "@wizeworks/lens-core";
3
+ export interface HubStoreOptions {
4
+ /** SQLite file, or ":memory:". */
5
+ path: string;
6
+ /** Most traces kept. Default 50000. */
7
+ maxTraces?: number;
8
+ /** Oldest trace (and metric point) kept, in ms. Default 7 days. */
9
+ maxAgeMs?: number;
10
+ /** Most metric points kept. Default 2,000,000. */
11
+ maxMetricPoints?: number;
12
+ now?: () => number;
13
+ }
14
+ /** What one write holds. Spans and logs are already checked and redacted. */
15
+ export interface HubWrite {
16
+ sender: HubSender;
17
+ via: "addon" | "otlp";
18
+ spans: readonly Span[];
19
+ logs: readonly HubLog[];
20
+ remotes: readonly HubRemote[];
21
+ /** Metric points, already checked and redacted, with the sender's service. */
22
+ metrics?: readonly MetricPoint[];
23
+ }
24
+ /** The hub's SQLite file. Writes come from ingest; reads build traces on demand (see store-read.ts). */
25
+ export declare class HubStore {
26
+ #private;
27
+ readonly db: DatabaseSync;
28
+ readonly maxTraces: number;
29
+ readonly maxAgeMs: number;
30
+ readonly maxMetricPoints: number;
31
+ readonly path: string;
32
+ readonly now: () => number;
33
+ /** Goes up whenever stats change (settle or prune), for cache keys. */
34
+ settleGen: number;
35
+ constructor(o: HubStoreOptions);
36
+ /** Save one batch in one transaction. */
37
+ write(w: HubWrite): void;
38
+ /** Drop traces past the age or count limit, and services not seen for as long. Returns traces dropped. */
39
+ prune(): number;
40
+ close(): void;
41
+ }
42
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAwB,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAU,KAAK,WAAW,EAAe,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAM3J,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,6EAA6E;AAC7E,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC;IACtB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IAC9B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC;AASD,wGAAwG;AACxG,qBAAa,QAAQ;;IACnB,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAE3B,uEAAuE;IACvE,SAAS,SAAK;IAEd,YAAY,CAAC,EAAE,eAAe,EAW7B;IAED,yCAAyC;IACzC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CASvB;IA0BD,0GAA0G;IAC1G,KAAK,IAAI,MAAM,CAuBd;IAUD,KAAK,IAAI,IAAI,CAMZ;CACF"}
package/dist/store.js ADDED
@@ -0,0 +1,118 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdirSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ import { DatabaseSync } from "node:sqlite";
5
+ import { ATTR_BROWSER_SESSION, logKey, seriesKeyOf } from "@wizeworks/lens-core";
6
+ import { prepareHubStatements } from "./schema.js";
7
+ import { upgradeHubSchema } from "./schema-scale.js";
8
+ import { pruneStats } from "./settle.js";
9
+ import { pruneMetricRollups, writeMetricRollups } from "./metrics-write.js";
10
+ const DAY_MS = 24 * 60 * 60_000;
11
+ const hashKey = (text) => createHash("sha1").update(text).digest("hex");
12
+ const sessionOf = (s) => {
13
+ const v = s.attributes[ATTR_BROWSER_SESSION];
14
+ return typeof v === "string" && v ? v : null;
15
+ };
16
+ /** The hub's SQLite file. Writes come from ingest; reads build traces on demand (see store-read.ts). */
17
+ export class HubStore {
18
+ db;
19
+ maxTraces;
20
+ maxAgeMs;
21
+ maxMetricPoints;
22
+ path;
23
+ now;
24
+ #stmts;
25
+ /** Goes up whenever stats change (settle or prune), for cache keys. */
26
+ settleGen = 0;
27
+ constructor(o) {
28
+ this.path = o.path;
29
+ this.maxTraces = Math.max(1, o.maxTraces ?? 50_000);
30
+ this.maxAgeMs = Math.max(60_000, o.maxAgeMs ?? 7 * DAY_MS);
31
+ this.maxMetricPoints = Math.max(1, o.maxMetricPoints ?? 2_000_000);
32
+ this.now = o.now ?? Date.now;
33
+ if (o.path !== ":memory:")
34
+ mkdirSync(dirname(o.path), { recursive: true });
35
+ this.db = new DatabaseSync(o.path);
36
+ this.db.exec("PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL; PRAGMA busy_timeout = 5000;");
37
+ upgradeHubSchema(this.db);
38
+ this.#stmts = prepareHubStatements(this.db);
39
+ }
40
+ /** Save one batch in one transaction. */
41
+ write(w) {
42
+ this.db.exec("BEGIN");
43
+ try {
44
+ this.#writeAll(w);
45
+ this.db.exec("COMMIT");
46
+ }
47
+ catch (err) {
48
+ this.db.exec("ROLLBACK");
49
+ throw err;
50
+ }
51
+ }
52
+ #writeAll(w) {
53
+ const now = this.now();
54
+ const env = w.sender.environment ?? "";
55
+ const project = w.sender.project ?? "";
56
+ const st = this.#stmts;
57
+ this.#touchService(w.sender, w.via, now);
58
+ for (const s of w.spans) {
59
+ st.upsertTrace.run(s.traceId, s.startMs, s.startMs + s.durationMs, now, env, project);
60
+ st.upsertSpan.run(s.traceId, s.spanId, s.service, s.startMs, s.durationMs, sessionOf(s), JSON.stringify(s));
61
+ }
62
+ for (const { traceId, log } of w.logs) {
63
+ st.upsertTrace.run(traceId, log.timeMs, log.timeMs, now, env, project);
64
+ st.insertLog.run(traceId, hashKey(logKey(log)), log.timeMs, JSON.stringify(log));
65
+ }
66
+ for (const r of w.remotes)
67
+ st.insertRemote.run(r.traceId, r.endpoint);
68
+ for (const p of w.metrics ?? [])
69
+ st.insertMetric.run(p.timeMs, project, env, p.service, p.name, hashKey(seriesKeyOf(p)), JSON.stringify(p));
70
+ writeMetricRollups(this.db, project, env, w.metrics ?? [], now);
71
+ }
72
+ #touchService(sender, via, now) {
73
+ const s = sender;
74
+ this.#stmts.upsertService.run(s.project ?? "", s.service, s.environment ?? "", s.host ?? "", via, JSON.stringify(sender), now, now);
75
+ }
76
+ /** Drop traces past the age or count limit, and services not seen for as long. Returns traces dropped. */
77
+ prune() {
78
+ const cutoff = this.now() - this.maxAgeMs;
79
+ const doomed = this.db
80
+ .prepare(`SELECT trace_id, project, env, contrib FROM traces WHERE trace_id IN (SELECT trace_id FROM traces WHERE start_ms < ?
81
+ UNION SELECT trace_id FROM (SELECT trace_id FROM traces ORDER BY start_ms DESC LIMIT -1 OFFSET ?))`)
82
+ .all(cutoff, this.maxTraces);
83
+ this.db.exec("BEGIN");
84
+ try {
85
+ pruneStats(this, doomed);
86
+ for (const table of ["traces", "spans", "logs", "remotes"]) {
87
+ const del = this.db.prepare(`DELETE FROM ${table} WHERE trace_id = ?`);
88
+ for (const r of doomed)
89
+ del.run(r.trace_id);
90
+ }
91
+ this.db.prepare("DELETE FROM services WHERE last_seen < ?").run(cutoff);
92
+ this.#pruneMetrics(cutoff);
93
+ this.db.exec("COMMIT");
94
+ }
95
+ catch (err) {
96
+ this.db.exec("ROLLBACK");
97
+ throw err;
98
+ }
99
+ return doomed.length;
100
+ }
101
+ /** Drop metric points past the age limit, then the oldest past the count limit. */
102
+ #pruneMetrics(cutoff) {
103
+ this.db.prepare("DELETE FROM metrics WHERE time_ms < ?").run(cutoff);
104
+ pruneMetricRollups(this.db, this.now(), this.maxAgeMs);
105
+ const edge = this.db.prepare("SELECT time_ms FROM metrics ORDER BY time_ms DESC LIMIT 1 OFFSET ?").get(this.maxMetricPoints);
106
+ if (edge)
107
+ this.db.prepare("DELETE FROM metrics WHERE time_ms <= ?").run(edge.time_ms);
108
+ }
109
+ close() {
110
+ try {
111
+ this.db.close();
112
+ }
113
+ catch {
114
+ // already closed
115
+ }
116
+ }
117
+ }
118
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,67 @@
1
1
  {
2
2
  "name": "@wizeworks/lens-hub",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.3.0-alpha.2",
4
+ "description": "The WizeLens local hub: one place for the traces of every service on your machine or network, with the full dashboard and MCP.",
5
+ "license": "MIT",
6
+ "author": "WizeWorks LLC",
7
+ "homepage": "https://github.com/brandonkorous/wizelens#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/brandonkorous/wizelens.git",
11
+ "directory": "js/packages/hub"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/brandonkorous/wizelens/issues"
15
+ },
16
+ "keywords": [
17
+ "wizelens",
18
+ "hub",
19
+ "tracing",
20
+ "opentelemetry",
21
+ "otlp",
22
+ "profiler",
23
+ "dashboard"
24
+ ],
25
+ "type": "module",
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "bin": {
29
+ "wizelens-hub": "./dist/cli.js"
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ },
36
+ "./kit": {
37
+ "types": "./dist/kit.d.ts",
38
+ "import": "./dist/kit.js"
39
+ },
40
+ "./package.json": "./package.json"
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "engines": {
46
+ "node": ">=22.13"
47
+ },
48
+ "dependencies": {
49
+ "protobufjs": "^7.6.6",
50
+ "@wizeworks/lens-ui": "^0.3.0-alpha.2",
51
+ "@wizeworks/lens-node": "^0.3.0-alpha.2",
52
+ "@wizeworks/lens-core": "^0.3.0-alpha.2"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^24.19.2",
56
+ "typescript": "^7.0.2",
57
+ "vitest": "^5.0.5"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "scripts": {
63
+ "build": "tsc -p tsconfig.build.json",
64
+ "test": "vitest run",
65
+ "start": "node dist/cli.js"
66
+ }
6
67
  }