trace-viz 0.3.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.
Files changed (110) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +385 -0
  4. package/dist/adapters/index.d.ts +32 -0
  5. package/dist/adapters/index.d.ts.map +1 -0
  6. package/dist/adapters/index.js +83 -0
  7. package/dist/adapters/index.js.map +1 -0
  8. package/dist/agent.d.ts +66 -0
  9. package/dist/agent.d.ts.map +1 -0
  10. package/dist/agent.js +329 -0
  11. package/dist/agent.js.map +1 -0
  12. package/dist/atlas/atlas.d.ts +203 -0
  13. package/dist/atlas/atlas.d.ts.map +1 -0
  14. package/dist/atlas/atlas.js +1466 -0
  15. package/dist/atlas/atlas.js.map +1 -0
  16. package/dist/atlas/index.d.ts +7 -0
  17. package/dist/atlas/index.d.ts.map +1 -0
  18. package/dist/atlas/index.js +4 -0
  19. package/dist/atlas/index.js.map +1 -0
  20. package/dist/atlas/layout.d.ts +44 -0
  21. package/dist/atlas/layout.d.ts.map +1 -0
  22. package/dist/atlas/layout.js +103 -0
  23. package/dist/atlas/layout.js.map +1 -0
  24. package/dist/atlas/model.d.ts +164 -0
  25. package/dist/atlas/model.d.ts.map +1 -0
  26. package/dist/atlas/model.js +489 -0
  27. package/dist/atlas/model.js.map +1 -0
  28. package/dist/channels.d.ts +105 -0
  29. package/dist/channels.d.ts.map +1 -0
  30. package/dist/channels.js +411 -0
  31. package/dist/channels.js.map +1 -0
  32. package/dist/components.d.ts +76 -0
  33. package/dist/components.d.ts.map +1 -0
  34. package/dist/components.js +432 -0
  35. package/dist/components.js.map +1 -0
  36. package/dist/estate.d.ts +25 -0
  37. package/dist/estate.d.ts.map +1 -0
  38. package/dist/estate.js +285 -0
  39. package/dist/estate.js.map +1 -0
  40. package/dist/failure.d.ts +36 -0
  41. package/dist/failure.d.ts.map +1 -0
  42. package/dist/failure.js +82 -0
  43. package/dist/failure.js.map +1 -0
  44. package/dist/geometry.d.ts +24 -0
  45. package/dist/geometry.d.ts.map +1 -0
  46. package/dist/geometry.js +92 -0
  47. package/dist/geometry.js.map +1 -0
  48. package/dist/index.d.ts +51 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +34 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/layout.d.ts +66 -0
  53. package/dist/layout.d.ts.map +1 -0
  54. package/dist/layout.js +152 -0
  55. package/dist/layout.js.map +1 -0
  56. package/dist/layout3d.d.ts +98 -0
  57. package/dist/layout3d.d.ts.map +1 -0
  58. package/dist/layout3d.js +350 -0
  59. package/dist/layout3d.js.map +1 -0
  60. package/dist/mesh.d.ts +23 -0
  61. package/dist/mesh.d.ts.map +1 -0
  62. package/dist/mesh.js +263 -0
  63. package/dist/mesh.js.map +1 -0
  64. package/dist/model.d.ts +94 -0
  65. package/dist/model.d.ts.map +1 -0
  66. package/dist/model.js +84 -0
  67. package/dist/model.js.map +1 -0
  68. package/dist/particles.d.ts +80 -0
  69. package/dist/particles.d.ts.map +1 -0
  70. package/dist/particles.js +118 -0
  71. package/dist/particles.js.map +1 -0
  72. package/dist/project.d.ts +113 -0
  73. package/dist/project.d.ts.map +1 -0
  74. package/dist/project.js +288 -0
  75. package/dist/project.js.map +1 -0
  76. package/dist/react/index.d.ts +22 -0
  77. package/dist/react/index.d.ts.map +1 -0
  78. package/dist/react/index.js +69 -0
  79. package/dist/react/index.js.map +1 -0
  80. package/dist/renderer.d.ts +252 -0
  81. package/dist/renderer.d.ts.map +1 -0
  82. package/dist/renderer.js +1710 -0
  83. package/dist/renderer.js.map +1 -0
  84. package/dist/scales.d.ts +99 -0
  85. package/dist/scales.d.ts.map +1 -0
  86. package/dist/scales.js +126 -0
  87. package/dist/scales.js.map +1 -0
  88. package/dist/scene.d.ts +53 -0
  89. package/dist/scene.d.ts.map +1 -0
  90. package/dist/scene.js +44 -0
  91. package/dist/scene.js.map +1 -0
  92. package/dist/schema.d.ts +24 -0
  93. package/dist/schema.d.ts.map +1 -0
  94. package/dist/schema.js +131 -0
  95. package/dist/schema.js.map +1 -0
  96. package/dist/seed.d.ts +33 -0
  97. package/dist/seed.d.ts.map +1 -0
  98. package/dist/seed.js +173 -0
  99. package/dist/seed.js.map +1 -0
  100. package/dist/theme.d.ts +35 -0
  101. package/dist/theme.d.ts.map +1 -0
  102. package/dist/theme.js +83 -0
  103. package/dist/theme.js.map +1 -0
  104. package/dist/trace-viz.esm.js +15 -0
  105. package/dist/trace-viz.min.js +15 -0
  106. package/dist/types.d.ts +92 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +9 -0
  109. package/dist/types.js.map +1 -0
  110. package/package.json +105 -0
package/dist/estate.js ADDED
@@ -0,0 +1,285 @@
1
+ import { mulberry32 } from './particles.js';
2
+ const TIERS = ['edge', 'app', 'core', 'data'];
3
+ const DOMAINS = [
4
+ ['identity', ['auth', 'accounts', 'sessions', 'consent']],
5
+ ['payments', ['ledger', 'checkout', 'refunds', 'payouts', 'fraud-signals']],
6
+ ['risk', ['scoring', 'rules', 'review', 'chargebacks']],
7
+ ['marketplace', ['catalog', 'listings', 'sellers', 'reviews', 'media']],
8
+ ['orders', ['orders-core', 'cart', 'fulfilment', 'returns']],
9
+ ['logistics', ['dispatch', 'routing', 'tracking', 'carriers', 'warehouse']],
10
+ ['comms', ['notify', 'email', 'push', 'templates']],
11
+ ['search', ['query', 'indexing', 'ranking', 'suggest']],
12
+ ['pricing', ['quotes', 'promotions', 'tax', 'fx']],
13
+ ['growth', ['experiments', 'campaigns', 'referrals', 'loyalty']],
14
+ ['platform', ['config', 'flags', 'observability', 'secrets', 'scheduler', 'api-gateway']],
15
+ ['data', ['ingest', 'warehouse', 'features', 'ml-serving', 'lineage']],
16
+ ];
17
+ const ROLES = {
18
+ edge: ['bff', 'api', 'gateway', 'graphql', 'webhooks'],
19
+ app: ['service', 'orchestrator', 'handler', 'router', 'worker', 'sync', 'dispatcher', 'projector'],
20
+ core: ['engine', 'ledger', 'matcher', 'scorer', 'rules', 'calculator', 'validator', 'resolver', 'state'],
21
+ data: ['db', 'store', 'index', 'cache', 'kv', 'blob', 'timeseries'],
22
+ };
23
+ const ENGINES = {
24
+ db: 'postgres',
25
+ store: 'cassandra',
26
+ index: 'elasticsearch',
27
+ cache: 'redis',
28
+ kv: 'dynamo',
29
+ blob: 's3',
30
+ timeseries: 'clickhouse',
31
+ };
32
+ export function generateEstate(options = {}) {
33
+ const { seed = 7, services: serviceCount = 600, topics: topicCount = 80, regions = ['eu-west', 'us-east'], baseRps = 42000, title = `Estate: ${serviceCount} services, ${topicCount} topics, ${DOMAINS.length} domains`, } = options;
34
+ const rand = mulberry32(seed);
35
+ const between = (lo, hi) => lo + rand() * (hi - lo);
36
+ const pick = (xs) => xs[Math.floor(rand() * xs.length)];
37
+ const lognormal = (mu, sigma) => {
38
+ const u = Math.max(1e-9, rand());
39
+ const v = rand();
40
+ const z = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);
41
+ return Math.exp(mu + sigma * z);
42
+ };
43
+ // --- services --------------------------------------------------------------
44
+ const svcs = [];
45
+ const used = new Set();
46
+ const uniq = (base) => {
47
+ let n = base;
48
+ let i = 2;
49
+ while (used.has(n))
50
+ n = `${base}-${i++}`;
51
+ used.add(n);
52
+ return n;
53
+ };
54
+ const teams = DOMAINS.flatMap(([d, ts]) => ts.map((t) => ({ domain: d, team: t })));
55
+ // Team sizes are uneven on purpose: a couple of big teams per domain, a
56
+ // long tail of small ones.
57
+ const teamWeights = teams.map(() => lognormal(0, 0.6));
58
+ const wsum = teamWeights.reduce((a, b) => a + b, 0);
59
+ let remaining = serviceCount;
60
+ teams.forEach((t, i) => {
61
+ const want = i === teams.length - 1 ? remaining : Math.max(3, Math.round((serviceCount * teamWeights[i]) / wsum));
62
+ const n = Math.min(want, remaining);
63
+ remaining -= n;
64
+ for (let k = 0; k < n; k++) {
65
+ const r = rand();
66
+ const tier = k === 0 ? 'edge' : r < 0.36 ? 'app' : r < 0.74 ? 'core' : 'data';
67
+ const role = pick(ROLES[tier]);
68
+ const name = uniq(`${t.team}-${role}`);
69
+ const kind = tier === 'data' ? (role === 'cache' ? 'cache' : 'datastore') : tier === 'edge' && role === 'gateway' ? 'gateway' : 'service';
70
+ const level = tier === 'edge' ? 0 : tier === 'app' ? 1 + Math.floor(rand() * 2) : tier === 'core' ? 3 + Math.floor(rand() * 3) : 6;
71
+ svcs.push({
72
+ name,
73
+ domain: t.domain,
74
+ team: t.team,
75
+ tier,
76
+ kind,
77
+ role,
78
+ ...(tier === 'data' ? { engine: ENGINES[role] ?? 'postgres' } : {}),
79
+ level,
80
+ inbound: 0,
81
+ index: 0,
82
+ });
83
+ }
84
+ });
85
+ // A strict order so the call graph is a DAG by construction: tier first,
86
+ // then a shuffle. A few deliberate back-edges are added afterwards.
87
+ svcs.sort((a, b) => a.level - b.level || rand() - 0.5);
88
+ svcs.forEach((s, i) => (s.index = i));
89
+ const byName = new Map(svcs.map((s) => [s.name, s]));
90
+ const byTeam = new Map();
91
+ const byDomain = new Map();
92
+ for (const s of svcs) {
93
+ byTeam.set(s.team, [...(byTeam.get(s.team) ?? []), s]);
94
+ byDomain.set(s.domain, [...(byDomain.get(s.domain) ?? []), s]);
95
+ }
96
+ const platform = byDomain.get('platform').filter((s) => s.tier !== 'data');
97
+ const hubs = platform.filter((s) => /config|flags|secrets|auth/.test(s.name)).concat(byTeam.get('auth').filter((s) => s.tier !== 'data'));
98
+ // --- health ----------------------------------------------------------------
99
+ const nonData = svcs.filter((s) => s.tier !== 'data' && s.tier !== 'edge');
100
+ const sick = new Set();
101
+ while (sick.size < 6)
102
+ sick.add(pick(nonData).name);
103
+ const burning = new Set();
104
+ while (burning.size < 2) {
105
+ const s = pick(nonData).name;
106
+ if (!sick.has(s))
107
+ burning.add(s);
108
+ }
109
+ const errorFor = (target, healthy) => burning.has(target) ? between(0.12, 0.3) : sick.has(target) ? between(0.02, 0.05) : healthy;
110
+ const latencyFor = (t) => t === 'edge' ? between(5, 20) : t === 'app' ? between(8, 60) : t === 'core' ? between(4, 40) : between(1, 8);
111
+ const calls = [];
112
+ const edgeCount = new Map();
113
+ const link = (from, to, rps, back = false) => {
114
+ if (from === to)
115
+ return;
116
+ const k = `${from.name}>${to.name}`;
117
+ if (edgeCount.has(k))
118
+ return;
119
+ edgeCount.set(k, 1);
120
+ const sameTeam = from.team === to.team;
121
+ const failure = to.tier === 'data' ? 'fail-closed' : sameTeam ? (rand() < 0.6 ? 'fail-closed' : 'fail-open') : rand() < 0.3 ? 'fail-closed' : 'fail-open';
122
+ const api = to.tier === 'data' ? (to.role === 'cache' ? 'get' : to.role === 'blob' ? 'put' : 'query') : pick(['get', 'list', 'create', 'update', 'search', 'resolve', 'evaluate']);
123
+ calls.push({ from, to, api, rps, failure, protocol: to.tier === 'data' ? to.engine : rand() < 0.7 ? 'grpc' : 'http', back });
124
+ to.inbound += rps;
125
+ };
126
+ // Ingress: clients hit every domain's edge services, unevenly.
127
+ const clients = { name: 'clients', domain: 'outside', team: 'outside', tier: 'edge', kind: 'client', role: 'client', level: -1, inbound: 0, index: -1 };
128
+ const domainWeight = new Map(DOMAINS.map(([d]) => [d, lognormal(0, 0.9)]));
129
+ const dsum = [...domainWeight.values()].reduce((a, b) => a + b, 0);
130
+ for (const s of svcs) {
131
+ if (s.tier !== 'edge')
132
+ continue;
133
+ const teamEdges = byTeam.get(s.team).filter((x) => x.tier === 'edge').length;
134
+ const share = (domainWeight.get(s.domain) / dsum) / DOMAINS.find(([d]) => d === s.domain)[1].length / teamEdges;
135
+ link(clients, s, baseRps * share * between(0.6, 1.4));
136
+ }
137
+ for (const s of svcs) {
138
+ if (s.tier === 'data')
139
+ continue;
140
+ // Anything nobody calls still does work: a cron, a consumer, a job.
141
+ if (s.inbound === 0)
142
+ s.inbound = lognormal(1.5, 1);
143
+ const fan = s.tier === 'edge' ? 2 + Math.floor(rand() * 4) : 1 + Math.floor(rand() * 3);
144
+ for (let k = 0; k < fan; k++) {
145
+ const r = rand();
146
+ let pool;
147
+ if (r < 0.62)
148
+ pool = byTeam.get(s.team);
149
+ else if (r < 0.82)
150
+ pool = byDomain.get(s.domain);
151
+ else if (r < 0.94)
152
+ pool = hubs;
153
+ else
154
+ pool = svcs;
155
+ const later = pool.filter((t) => t.level > s.level && (t.tier !== 'data' || t.team === s.team || rand() < 0.05));
156
+ if (!later.length)
157
+ continue;
158
+ link(s, pick(later), s.inbound * between(0.15, 1.6));
159
+ }
160
+ // Every app/core service owns some data.
161
+ if (s.tier !== 'edge') {
162
+ const stores = byTeam.get(s.team).filter((t) => t.tier === 'data');
163
+ if (stores.length)
164
+ link(s, pick(stores), s.inbound * between(0.8, 2.5));
165
+ }
166
+ }
167
+ // Back-edges: callbacks and status polls that go against the grain.
168
+ for (let i = 0; i < Math.round(svcs.length * 0.012); i++) {
169
+ const a = pick(nonData);
170
+ const earlier = nonData.filter((t) => t.level < a.level && t.domain === a.domain);
171
+ if (earlier.length)
172
+ link(a, pick(earlier), a.inbound * between(0.02, 0.1), true);
173
+ }
174
+ // --- kafka -------------------------------------------------------------------
175
+ const topics = [];
176
+ const topicNames = new Set();
177
+ const producerPool = svcs.filter((s) => s.tier === 'app' || s.tier === 'core');
178
+ const produces = [];
179
+ const consumes = [];
180
+ const topicLag = new Map();
181
+ const events = ['created', 'updated', 'completed', 'failed', 'events', 'changes', 'snapshots', 'audit', 'metrics', 'commands'];
182
+ for (let i = 0; i < topicCount; i++) {
183
+ const owner = pick(producerPool);
184
+ let name = `${owner.team}.${pick(events)}`;
185
+ let n = 2;
186
+ while (topicNames.has(name))
187
+ name = `${owner.team}.${pick(events)}.v${n++}`;
188
+ topicNames.add(name);
189
+ const topic = { name, domain: owner.domain, team: owner.team, partitions: pick([3, 6, 12, 24, 48]) };
190
+ topics.push(topic);
191
+ const producers = new Set([owner]);
192
+ if (rand() < 0.35)
193
+ producers.add(pick(byTeam.get(owner.team).filter((s) => s.tier !== 'data')) ?? owner);
194
+ let produced = 0;
195
+ for (const p of producers) {
196
+ const rps = Math.max(0.2, p.inbound * between(0.1, 1.2));
197
+ produces.push({ from: p, topic, rps });
198
+ produced += rps;
199
+ }
200
+ const groups = 1 + Math.floor(rand() * 4);
201
+ const backedUp = rand() < 0.15;
202
+ let lag = 0;
203
+ const seen = new Set();
204
+ for (let g = 0; g < groups; g++) {
205
+ const r = rand();
206
+ const pool = r < 0.45 ? byDomain.get(owner.domain) : svcs;
207
+ const c = pick(pool.filter((s) => (s.tier === 'app' || s.tier === 'core') && s.team !== owner.team));
208
+ if (!c || seen.has(c.name))
209
+ continue;
210
+ seen.add(c.name);
211
+ const slow = backedUp && g === 0;
212
+ const rate = produced * (slow ? between(0.45, 0.85) : between(0.97, 1.0));
213
+ const l = slow ? Math.round(lognormal(12, 1)) : Math.round(lognormal(4, 1.2));
214
+ lag += l;
215
+ consumes.push({ topic, to: c, group: `${c.name}-cg`, rps: rate, lag: l });
216
+ c.inbound += rate;
217
+ }
218
+ topicLag.set(name, lag);
219
+ }
220
+ // --- emit --------------------------------------------------------------------
221
+ const records = [];
222
+ const nodes = [];
223
+ const regionShare = regions.map((_, i) => (i === 0 ? 1 : between(0.4, 0.8)));
224
+ const total = regionShare.reduce((a, b) => a + b, 0);
225
+ const r4 = (x) => Math.round(x * 10000) / 10000;
226
+ regions.forEach((region, ri) => {
227
+ const share = regionShare[ri] / total;
228
+ for (const c of calls) {
229
+ records.push({
230
+ from: { service: c.from.name, api: c.from.tier === 'edge' ? 'ingress' : 'call' },
231
+ to: { service: c.to.name, api: c.api },
232
+ dims: { env: 'prod', region, transport: 'sync', protocol: c.protocol, failure: c.failure },
233
+ metrics: {
234
+ rps: Math.round(c.rps * share * 100) / 100,
235
+ latencyMs: Math.round(latencyFor(c.to.tier) * 10) / 10,
236
+ errorRate: r4(errorFor(c.to.name, between(0, 0.003))),
237
+ bytes: Math.round(between(200, 6000)),
238
+ },
239
+ });
240
+ }
241
+ for (const p of produces) {
242
+ records.push({
243
+ from: { service: p.from.name, api: 'produce' },
244
+ to: { service: p.topic.name, api: 'produce' },
245
+ dims: { env: 'prod', region, transport: 'kafka', protocol: 'kafka', failure: 'fail-open' },
246
+ metrics: { rps: Math.round(p.rps * share * 100) / 100, latencyMs: Math.round(between(2, 12) * 10) / 10, errorRate: r4(between(0, 0.001)), bytes: Math.round(between(300, 4000)) },
247
+ });
248
+ }
249
+ for (const c of consumes) {
250
+ records.push({
251
+ from: { service: c.topic.name, api: c.group },
252
+ to: { service: c.to.name, api: 'consume' },
253
+ dims: { env: 'prod', region, transport: 'kafka', protocol: 'kafka', failure: 'fail-open', group: c.group },
254
+ metrics: { rps: Math.round(c.rps * share * 100) / 100, latencyMs: Math.round(between(5, 80) * 10) / 10, errorRate: r4(errorFor(c.to.name, between(0, 0.004))), bytes: Math.round(between(300, 4000)) },
255
+ });
256
+ }
257
+ });
258
+ for (const s of svcs) {
259
+ nodes.push({
260
+ key: { service: s.name },
261
+ dims: { domain: s.domain, team: s.team, kind: s.kind, tier: s.tier, role: s.role, ...(s.engine ? { engine: s.engine } : {}) },
262
+ attrs: { instances: s.tier === 'data' ? Math.round(between(3, 9)) : Math.round(lognormal(2.2, 0.7)), cpu: between(0.1, 0.9), mem: between(0.2, 0.9) },
263
+ });
264
+ }
265
+ for (const t of topics) {
266
+ nodes.push({
267
+ key: { service: t.name },
268
+ dims: { domain: t.domain, team: t.team, kind: 'topic', tier: 'core', role: 'topic' },
269
+ attrs: { partitions: t.partitions, lag: topicLag.get(t.name) ?? 0, retentionHours: pick([24, 72, 168]) },
270
+ });
271
+ }
272
+ nodes.push({ key: { service: 'clients' }, dims: { domain: 'outside', team: 'outside', kind: 'client', tier: 'edge', role: 'client' }, attrs: { instances: 1 } });
273
+ return {
274
+ version: 1,
275
+ records,
276
+ nodes,
277
+ meta: {
278
+ title,
279
+ window: 'synthetic',
280
+ hierarchy: ['domain', 'team'],
281
+ note: `${svcs.length} services, ${topics.length} topics, ${calls.length} sync edges, ${produces.length + consumes.length} kafka edges, ${sick.size} sick, ${burning.size} burning`,
282
+ },
283
+ };
284
+ }
285
+ //# sourceMappingURL=estate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estate.js","sourceRoot":"","sources":["../src/estate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { EdgeStyle } from './channels.js';
2
+ import type { Scene } from './scene.js';
3
+ /**
4
+ * Blast radius.
5
+ *
6
+ * `fail-closed` and `fail-open` are not decoration on a dependency, they are
7
+ * the dependency's contract: they say what happens to the caller when the
8
+ * callee dies. So they get a first-class model, not just a colour.
9
+ *
10
+ * An edge `a -> b` means a calls b:
11
+ *
12
+ * - **rigid** (fail-closed): if b is dead, a is dead. Death travels backwards
13
+ * up the call graph, and this is the propagation people underestimate.
14
+ * - **breakaway** (fail-open): if b is dead, a is *degraded* and still serving.
15
+ * The link parts, the caller survives. A fail-open dependency is a firebreak,
16
+ * and it is the only thing that stops the front.
17
+ * - **plain** (unknown): treated as breakaway, because assuming an undeclared
18
+ * dependency is load-bearing would turn every diagram black on the first kill
19
+ * and teach nothing. The UI flags these rather than guessing loudly.
20
+ */
21
+ export type NodeHealth = 'ok' | 'degraded' | 'dead';
22
+ export type EdgeHealth = 'flowing' | 'strained' | 'severed';
23
+ export interface FailureResult {
24
+ health: Map<string, NodeHealth>;
25
+ edgeHealth: Map<string, EdgeHealth>;
26
+ /** Hops from the nearest killed node, following the propagation. Drives the wavefront timing. */
27
+ hop: Map<string, number>;
28
+ /** Edges where a breakaway coupling stopped the front. */
29
+ firebreaks: string[];
30
+ deadRps: number;
31
+ degradedRps: number;
32
+ totalRps: number;
33
+ }
34
+ export declare function propagateFailure(scene: Scene, killed: string[], styles: Map<string, EdgeStyle>, couplingBound: boolean): FailureResult;
35
+ export declare function emptyFailure(scene: Scene): FailureResult;
36
+ //# sourceMappingURL=failure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC;AACpD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,iGAAiG;IACjG,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC9B,aAAa,EAAE,OAAO,GACrB,aAAa,CAmEf;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAUxD"}
@@ -0,0 +1,82 @@
1
+ export function propagateFailure(scene, killed, styles, couplingBound) {
2
+ const health = new Map();
3
+ const hop = new Map();
4
+ for (const n of scene.nodes)
5
+ health.set(n.id, 'ok');
6
+ const alive = new Set(scene.nodes.map((n) => n.id));
7
+ for (const id of killed) {
8
+ if (!alive.has(id))
9
+ continue;
10
+ health.set(id, 'dead');
11
+ hop.set(id, 0);
12
+ }
13
+ const couplingOf = (edgeId) => {
14
+ if (!couplingBound)
15
+ return 'breakaway';
16
+ const c = styles.get(edgeId)?.coupling ?? 'plain';
17
+ return c === 'plain' ? 'breakaway' : c;
18
+ };
19
+ // Fixpoint, so cycles terminate. Bounded by node count.
20
+ for (let pass = 0; pass < scene.nodes.length + 1; pass++) {
21
+ let changed = false;
22
+ for (const edge of scene.edges) {
23
+ if (edge.from === edge.to)
24
+ continue;
25
+ const callee = health.get(edge.to) ?? 'ok';
26
+ const caller = health.get(edge.from) ?? 'ok';
27
+ if (caller === 'dead')
28
+ continue;
29
+ const coupling = couplingOf(edge.id);
30
+ if (coupling === 'rigid' && callee === 'dead') {
31
+ health.set(edge.from, 'dead');
32
+ hop.set(edge.from, Math.min(hop.get(edge.from) ?? Infinity, (hop.get(edge.to) ?? 0) + 1));
33
+ changed = true;
34
+ }
35
+ else if (caller === 'ok' &&
36
+ ((coupling === 'breakaway' && callee !== 'ok') || (coupling === 'rigid' && callee === 'degraded'))) {
37
+ health.set(edge.from, 'degraded');
38
+ hop.set(edge.from, Math.min(hop.get(edge.from) ?? Infinity, (hop.get(edge.to) ?? 0) + 1));
39
+ changed = true;
40
+ }
41
+ }
42
+ if (!changed)
43
+ break;
44
+ }
45
+ const edgeHealth = new Map();
46
+ const firebreaks = [];
47
+ let deadRps = 0;
48
+ let degradedRps = 0;
49
+ let totalRps = 0;
50
+ for (const edge of scene.edges) {
51
+ totalRps += edge.metrics.rps;
52
+ const to = health.get(edge.to) ?? 'ok';
53
+ const from = health.get(edge.from) ?? 'ok';
54
+ if (to === 'dead' || from === 'dead') {
55
+ edgeHealth.set(edge.id, 'severed');
56
+ deadRps += edge.metrics.rps;
57
+ if (to === 'dead' && from !== 'dead' && couplingOf(edge.id) === 'breakaway')
58
+ firebreaks.push(edge.id);
59
+ }
60
+ else if (to === 'degraded' || from === 'degraded') {
61
+ edgeHealth.set(edge.id, 'strained');
62
+ degradedRps += edge.metrics.rps;
63
+ }
64
+ else {
65
+ edgeHealth.set(edge.id, 'flowing');
66
+ }
67
+ }
68
+ return { health, edgeHealth, hop, firebreaks, deadRps, degradedRps, totalRps };
69
+ }
70
+ export function emptyFailure(scene) {
71
+ const health = new Map();
72
+ for (const n of scene.nodes)
73
+ health.set(n.id, 'ok');
74
+ const edgeHealth = new Map();
75
+ let totalRps = 0;
76
+ for (const e of scene.edges) {
77
+ edgeHealth.set(e.id, 'flowing');
78
+ totalRps += e.metrics.rps;
79
+ }
80
+ return { health, edgeHealth, hop: new Map(), firebreaks: [], deadRps: 0, degradedRps: 0, totalRps };
81
+ }
82
+ //# sourceMappingURL=failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAoCA,MAAM,UAAU,gBAAgB,CAC9B,KAAY,EACZ,MAAgB,EAChB,MAA8B,EAC9B,aAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,MAAc,EAAY,EAAE;QAC9C,IAAI,CAAC,aAAa;YAAE,OAAO,WAAW,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,OAAO,CAAC;QAClD,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,wDAAwD;IACxD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACzD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE;gBAAE,SAAS;YACpC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC7C,IAAI,MAAM,KAAK,MAAM;gBAAE,SAAS;YAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAErC,IAAI,QAAQ,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC9B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1F,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,IACL,MAAM,KAAK,IAAI;gBACf,CAAC,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,KAAK,UAAU,CAAC,CAAC,EAClG,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAClC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1F,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,MAAM;IACtB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IACjD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;QAC3C,IAAI,EAAE,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACrC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACnC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAC5B,IAAI,EAAE,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,WAAW;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxG,CAAC;aAAM,IAAI,EAAE,KAAK,UAAU,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACpD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACpC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IACjD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAChC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;AACtG,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { LayoutNode, Point } from './layout.js';
2
+ /** A quadratic bezier from `a` to `b`, with sampled arc-length. */
3
+ export interface EdgePath {
4
+ a: Point;
5
+ b: Point;
6
+ ctrl: Point;
7
+ length: number;
8
+ pointAt(t: number): Point;
9
+ tangentAt(t: number): Point;
10
+ }
11
+ /** Where a line from `from` towards `to` leaves `from`'s rounded box. */
12
+ export declare function borderPoint(box: LayoutNode, towards: Point, inset?: number): Point;
13
+ /**
14
+ * Build the path for one edge.
15
+ *
16
+ * `offset` bows the curve sideways. Bidirectional pairs get equal and opposite
17
+ * offsets so the forward and reverse streams are visibly separate lanes -
18
+ * without that, a 401 challenge leg hides underneath the request it answers,
19
+ * and the whole point of the picture is lost.
20
+ */
21
+ export declare function edgePath(from: LayoutNode, to: LayoutNode, offset?: number): EdgePath;
22
+ /** Shortest distance from a point to the sampled curve, for hit-testing. */
23
+ export declare function distanceToPath(path: EdgePath, p: Point, samples?: number): number;
24
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAErD,mEAAmE;AACnE,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,KAAK,CAAC;IACT,CAAC,EAAE,KAAK,CAAC;IACT,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC1B,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC7B;AAUD,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,SAAI,GAAG,KAAK,CAQ7E;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,QAAQ,CAc/E;AAkCD,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,SAAK,GAAG,MAAM,CAS7E"}
@@ -0,0 +1,92 @@
1
+ function quad(a, c, b, t) {
2
+ const mt = 1 - t;
3
+ return {
4
+ x: mt * mt * a.x + 2 * mt * t * c.x + t * t * b.x,
5
+ y: mt * mt * a.y + 2 * mt * t * c.y + t * t * b.y,
6
+ };
7
+ }
8
+ /** Where a line from `from` towards `to` leaves `from`'s rounded box. */
9
+ export function borderPoint(box, towards, inset = 4) {
10
+ const dx = towards.x - box.x;
11
+ const dy = towards.y - box.y;
12
+ if (dx === 0 && dy === 0)
13
+ return { x: box.x, y: box.y };
14
+ const hw = box.width / 2 + inset;
15
+ const hh = box.height / 2 + inset;
16
+ const scale = Math.min(hw / Math.abs(dx || 1e-6), hh / Math.abs(dy || 1e-6));
17
+ return { x: box.x + dx * scale, y: box.y + dy * scale };
18
+ }
19
+ /**
20
+ * Build the path for one edge.
21
+ *
22
+ * `offset` bows the curve sideways. Bidirectional pairs get equal and opposite
23
+ * offsets so the forward and reverse streams are visibly separate lanes -
24
+ * without that, a 401 challenge leg hides underneath the request it answers,
25
+ * and the whole point of the picture is lost.
26
+ */
27
+ export function edgePath(from, to, offset = 0) {
28
+ if (from.id === to.id)
29
+ return selfLoop(from);
30
+ const a = borderPoint(from, { x: to.x, y: to.y });
31
+ const b = borderPoint(to, { x: from.x, y: from.y });
32
+ const mx = (a.x + b.x) / 2;
33
+ const my = (a.y + b.y) / 2;
34
+ const dx = b.x - a.x;
35
+ const dy = b.y - a.y;
36
+ const len = Math.hypot(dx, dy) || 1;
37
+ // Perpendicular unit vector, scaled by the requested lane offset.
38
+ const ctrl = { x: mx + (-dy / len) * offset * 2, y: my + (dx / len) * offset * 2 };
39
+ return finish(a, b, ctrl);
40
+ }
41
+ function selfLoop(node) {
42
+ const a = { x: node.x + node.width / 2, y: node.y - node.height / 4 };
43
+ const b = { x: node.x + node.width / 2, y: node.y + node.height / 4 };
44
+ const ctrl = { x: node.x + node.width / 2 + 54, y: node.y };
45
+ return finish(a, b, ctrl);
46
+ }
47
+ function finish(a, b, ctrl) {
48
+ const SAMPLES = 24;
49
+ let length = 0;
50
+ let prev = a;
51
+ for (let i = 1; i <= SAMPLES; i++) {
52
+ const p = quad(a, ctrl, b, i / SAMPLES);
53
+ length += Math.hypot(p.x - prev.x, p.y - prev.y);
54
+ prev = p;
55
+ }
56
+ return {
57
+ a,
58
+ b,
59
+ ctrl,
60
+ length: length || 1,
61
+ pointAt: (t) => quad(a, ctrl, b, t),
62
+ tangentAt: (t) => {
63
+ const mt = 1 - t;
64
+ const x = 2 * mt * (ctrl.x - a.x) + 2 * t * (b.x - ctrl.x);
65
+ const y = 2 * mt * (ctrl.y - a.y) + 2 * t * (b.y - ctrl.y);
66
+ const m = Math.hypot(x, y) || 1;
67
+ return { x: x / m, y: y / m };
68
+ },
69
+ };
70
+ }
71
+ /** Shortest distance from a point to the sampled curve, for hit-testing. */
72
+ export function distanceToPath(path, p, samples = 20) {
73
+ let best = Infinity;
74
+ let prev = path.pointAt(0);
75
+ for (let i = 1; i <= samples; i++) {
76
+ const cur = path.pointAt(i / samples);
77
+ best = Math.min(best, distanceToSegment(p, prev, cur));
78
+ prev = cur;
79
+ }
80
+ return best;
81
+ }
82
+ function distanceToSegment(p, a, b) {
83
+ const dx = b.x - a.x;
84
+ const dy = b.y - a.y;
85
+ const l2 = dx * dx + dy * dy;
86
+ if (l2 === 0)
87
+ return Math.hypot(p.x - a.x, p.y - a.y);
88
+ let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / l2;
89
+ t = t < 0 ? 0 : t > 1 ? 1 : t;
90
+ return Math.hypot(p.x - (a.x + t * dx), p.y - (a.y + t * dy));
91
+ }
92
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * tracelight - visualize service topologies as animated particle flows.
3
+ *
4
+ * @example
5
+ * ```ts
6
+ * import { TraceLight, authChallengeScenario } from 'tracelight';
7
+ *
8
+ * const tl = new TraceLight(document.querySelector('#map')!, { theme: 'auto' });
9
+ * tl.setGraph(authChallengeScenario(5000));
10
+ * ```
11
+ */
12
+ export { TraceLight } from './renderer.js';
13
+ export type { HoverTarget, TraceLightOptions, ViewInfo, Stats } from './renderer.js';
14
+ export { describeTable, endpointDims, fieldValue } from './model.js';
15
+ export type { FlowTable, FlowRecord, FlowMeasures, NodeFact, DimValues, DimensionMeta, TableSchema } from './model.js';
16
+ export { project, nodeIdFor, isMeasure } from './project.js';
17
+ export type { ViewSpec, WorldSpec, ChannelBinding, ProjectionResult } from './project.js';
18
+ export { sceneFromGraph } from './scene.js';
19
+ export type { Scene, SceneNode, SceneEdge } from './scene.js';
20
+ export { CHANNELS, styleScene, couplingFor, CATEGORICAL, ERROR_FLOOR, ERROR_CEIL } from './channels.js';
21
+ export type { ChannelName, ChannelDef, EdgeStyle, NodeStyle, Glyph, Coupling, LegendGroup, StyledScene } from './channels.js';
22
+ export { COMPONENTS, pickComponent, defaultTier, TIER_LABELS } from './components.js';
23
+ export type { WorldComponent, ComponentProps, ComponentBox } from './components.js';
24
+ export { layoutWorld, fitCamera, project3, worldExtent, defaultWorldLayout } from './layout3d.js';
25
+ export type { WorldNode, Camera, WorldLayoutOptions } from './layout3d.js';
26
+ export { propagateFailure, emptyFailure } from './failure.js';
27
+ export type { FailureResult, NodeHealth, EdgeHealth } from './failure.js';
28
+ export { proposeSpec, validateSpec, heuristicSpec, buildPrompt, extractJson } from './agent.js';
29
+ export type { Completion, ProposeOptions, ProposalResult } from './agent.js';
30
+ export { generateMesh } from './mesh.js';
31
+ export { generateEstate } from './estate.js';
32
+ export type { EstateOptions } from './estate.js';
33
+ export type { MeshOptions } from './mesh.js';
34
+ export { resolveGraph, safeResolveGraph, GraphValidationError } from './schema.js';
35
+ export { layoutGraph, defaultLayout } from './layout.js';
36
+ export type { LayoutNode, LayoutOptions, LayoutInput, Point } from './layout.js';
37
+ export { EdgeStream, mulberry32 } from './particles.js';
38
+ export type { Particle } from './particles.js';
39
+ export { edgePath, borderPoint, distanceToPath } from './geometry.js';
40
+ export type { EdgePath } from './geometry.js';
41
+ export { defaultEncoding, emissionRate, particleSpeed, particleRadius, edgeWidth, logNorm, rpsDomain, clamp, formatRps, formatLatency, formatBytes, } from './scales.js';
42
+ export type { EncodingOptions } from './scales.js';
43
+ export { themes, lightTheme, darkTheme, resolveTheme } from './theme.js';
44
+ export type { Theme } from './theme.js';
45
+ export { generateSeedGraph, authChallengeScenario, tokenAuthScenario } from './seed.js';
46
+ export type { SeedOptions } from './seed.js';
47
+ export { fromObject, fromUrl, fromEventSource, pollSource } from './adapters/index.js';
48
+ export type { GraphSource } from './adapters/index.js';
49
+ export type { Graph, GraphEdge, GraphNode, GraphMeta, EdgeMetrics, EdgeKind, NodeKind, ResolvedGraph, ResolvedEdge, ResolvedNode, } from './types.js';
50
+ export * from './atlas/index.js';
51
+ //# sourceMappingURL=index.d.ts.map