rig-constellation 0.1.1 → 0.1.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.
package/README.md CHANGED
@@ -34,19 +34,29 @@ npx rig-constellation
34
34
  (Have [Bun](https://bun.sh)? `bunx rig-constellation` works too.) That's the whole thing. One command:
35
35
 
36
36
  ```
37
- ⬡ Rig — mapping your codebase…
37
+ ⬡ Rig — mapping my-project
38
+ http://localhost:7491
39
+
38
40
  ✓ initialized ./.rig
39
- indexing extract resolve → embed → hubness → communities
41
+ map live http://localhost:7491
42
+ → 1/6 extract ██████████████████ 212/212
43
+ → 5/6 hubness ████████████████░░
40
44
  ✓ indexed 1,204 nodes · 3,891 edges · 212 files · 36 skills
41
45
  ✓ wired claude
42
- ✓ map live http://localhost:7474
43
46
 
44
47
  press Ctrl-C to stop the map.
45
48
  ```
46
49
 
47
- It initializes `.rig/`, indexes your code, wires up whichever agent it detects, and opens the live map in your browser. Re-run any time, or use the explicit subcommands below.
50
+ It initializes `.rig/`, opens the live map **first**, then indexes your code so the
51
+ graph assembles in the already-open browser tab in real time, and wires up whichever
52
+ agent it detects. The map title and port are derived per project, so two checkouts can
53
+ run side by side on stable, distinct ports. Re-run any time, or use the explicit
54
+ subcommands below.
48
55
 
49
- > Prefer a global install? `bun install -g rig-constellation` (or `npm i -g rig-constellation`), then `rig start`.
56
+ > The command is `rig` (alias: `rig-constellation`). Prefer a global install?
57
+ > `npm i -g rig-constellation` (or `bun install -g rig-constellation`), then `rig start`.
58
+ > Installed locally with `npm i rig-constellation`? The binary lives in `node_modules/.bin` —
59
+ > run it with `npx rig start` (or install with `-g` to get `rig` on your `PATH`).
50
60
 
51
61
  ---
52
62
 
package/dist/rig.js CHANGED
@@ -3579,7 +3579,7 @@ init_bun_adapter();
3579
3579
  // package.json
3580
3580
  var package_default = {
3581
3581
  name: "rig-constellation",
3582
- version: "0.1.1",
3582
+ version: "0.1.2",
3583
3583
  private: false,
3584
3584
  type: "module",
3585
3585
  description: "Local-first semantic knowledge graph",
@@ -3608,7 +3608,8 @@ var package_default = {
3608
3608
  url: "git+https://github.com/Astralchemist/rig.git"
3609
3609
  },
3610
3610
  bin: {
3611
- rig: "./dist/rig.js"
3611
+ rig: "./dist/rig.js",
3612
+ "rig-constellation": "./dist/rig.js"
3612
3613
  },
3613
3614
  files: [
3614
3615
  "dist",
@@ -7103,7 +7104,7 @@ var runIndex = async (cwd) => {
7103
7104
 
7104
7105
  // packages/cli/src/init.ts
7105
7106
  import { appendFileSync, existsSync as existsSync7, readFileSync as readFileSync7, writeFileSync as writeFileSync2 } from "node:fs";
7106
- import { join as join11, resolve as resolve8 } from "node:path";
7107
+ import { basename as basename4, join as join11, resolve as resolve8 } from "node:path";
7107
7108
  var ensureGitignored = (root) => {
7108
7109
  const path2 = join11(root, ".gitignore");
7109
7110
  const entry = ".rig/";
@@ -7121,12 +7122,33 @@ var ensureGitignored = (root) => {
7121
7122
  `);
7122
7123
  return true;
7123
7124
  };
7124
- var DEFAULT_CONFIG = {
7125
+ var deriveProjectName = (root) => {
7126
+ const pkgPath = join11(root, "package.json");
7127
+ if (existsSync7(pkgPath)) {
7128
+ try {
7129
+ const name = JSON.parse(readFileSync7(pkgPath, "utf-8")).name;
7130
+ if (typeof name === "string" && name.trim())
7131
+ return name.trim();
7132
+ } catch {}
7133
+ }
7134
+ return basename4(root);
7135
+ };
7136
+ var PORT_BASE = 7474;
7137
+ var PORT_SPAN = 64;
7138
+ var stablePort = (root) => {
7139
+ const abs = resolve8(root);
7140
+ let h = 0;
7141
+ for (let i = 0;i < abs.length; i++)
7142
+ h = h * 31 + abs.charCodeAt(i) >>> 0;
7143
+ return PORT_BASE + h % PORT_SPAN;
7144
+ };
7145
+ var defaultConfig = (root) => ({
7125
7146
  version: 1,
7147
+ name: deriveProjectName(root),
7126
7148
  host: "127.0.0.1",
7127
- port: 7474,
7149
+ port: stablePort(root),
7128
7150
  embedder: { kind: "local", model: "Xenova/bge-small-en-v1.5" }
7129
- };
7151
+ });
7130
7152
  var ensureInit = async (root) => {
7131
7153
  const rigDir = join11(root, RIG_DIR_NAME);
7132
7154
  if (existsSync7(rigDir)) {
@@ -7135,7 +7157,7 @@ var ensureInit = async (root) => {
7135
7157
  const rig = await Rig.init(root);
7136
7158
  const cfgPath = join11(rigDir, "config.json");
7137
7159
  if (!existsSync7(cfgPath)) {
7138
- writeFileSync2(cfgPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + `
7160
+ writeFileSync2(cfgPath, JSON.stringify(defaultConfig(root), null, 2) + `
7139
7161
  `);
7140
7162
  }
7141
7163
  rig.close();
@@ -7953,6 +7975,102 @@ async function dispatchToolCall(name, args, ctx, handlers) {
7953
7975
  throw err2;
7954
7976
  }
7955
7977
  }
7978
+ // package.json
7979
+ var package_default2 = {
7980
+ name: "rig-constellation",
7981
+ version: "0.1.2",
7982
+ private: false,
7983
+ type: "module",
7984
+ description: "Local-first semantic knowledge graph",
7985
+ keywords: [
7986
+ "mcp",
7987
+ "model-context-protocol",
7988
+ "claude-code",
7989
+ "cursor",
7990
+ "code-graph",
7991
+ "knowledge-graph",
7992
+ "code-navigation",
7993
+ "codebase-map",
7994
+ "ast",
7995
+ "tree-sitter",
7996
+ "local-first",
7997
+ "embeddings",
7998
+ "rag",
7999
+ "ai-agents",
8000
+ "developer-tools"
8001
+ ],
8002
+ author: "Astralchemist <kingolajohn55@gmail.com>",
8003
+ license: "Apache-2.0",
8004
+ homepage: "https://github.com/Astralchemist/rig",
8005
+ repository: {
8006
+ type: "git",
8007
+ url: "git+https://github.com/Astralchemist/rig.git"
8008
+ },
8009
+ bin: {
8010
+ rig: "./dist/rig.js",
8011
+ "rig-constellation": "./dist/rig.js"
8012
+ },
8013
+ files: [
8014
+ "dist",
8015
+ "generated",
8016
+ "packages/web/dist",
8017
+ "LICENSE",
8018
+ "LICENSE-CODEGRAPH.txt",
8019
+ "NOTICE",
8020
+ "README.md"
8021
+ ],
8022
+ engines: {
8023
+ bun: ">=1.1",
8024
+ node: ">=20 <25"
8025
+ },
8026
+ workspaces: [
8027
+ "packages/*"
8028
+ ],
8029
+ scripts: {
8030
+ gen: "bun run scripts/gen.ts",
8031
+ "gen:check": "bun run scripts/gen-check.ts",
8032
+ "gen:wasm": "bun run scripts/gen-wasm.ts",
8033
+ "check:compat": "bun run scripts/compat-check.ts",
8034
+ "compat:snapshot": "bun run scripts/compat-check.ts --write",
8035
+ "check:migrations": "bun run scripts/migration-lock.ts",
8036
+ "migration:lock": "bun run scripts/migration-lock.ts --write",
8037
+ test: "bun test",
8038
+ "test:e2e": "playwright test",
8039
+ "install:hooks": "bash scripts/install-hooks.sh",
8040
+ build: "bun run build:web && bun run build:cli",
8041
+ "build:web": "cd packages/web && bunx vite build",
8042
+ "build:cli": "bun run gen:wasm && bun run scripts/build-cli.ts",
8043
+ prepublishOnly: "bun run build && bun test && bun run gen:check && bun run check:compat && bun run check:migrations"
8044
+ },
8045
+ dependencies: {
8046
+ "@fastify/compress": "8.3.1",
8047
+ "@fastify/cors": "11.2.0",
8048
+ "@fastify/static": "9.1.3",
8049
+ "@xenova/transformers": "^2.17",
8050
+ fastify: "5.8.5",
8051
+ ignore: "7.0.5",
8052
+ "jsonc-parser": "3.3.1",
8053
+ "tree-sitter-wasms": "0.1.13",
8054
+ "web-tree-sitter": "^0.25.3",
8055
+ ws: "8.20.1",
8056
+ zod: "^3.23"
8057
+ },
8058
+ optionalDependencies: {
8059
+ "better-sqlite3": "^12"
8060
+ },
8061
+ devDependencies: {
8062
+ "@playwright/test": "1.60.0",
8063
+ "@types/bun": "latest",
8064
+ "@types/node": "^20",
8065
+ prettier: "^3",
8066
+ typescript: "^5.5",
8067
+ zod: "^3.23",
8068
+ "zod-to-json-schema": "^3.23"
8069
+ },
8070
+ comments: {
8071
+ design: "Local-first: bun:sqlite is the primary store, better-sqlite3 an optional Node fallback (the only optionalDependency today). Optional native accelerators (sqlite-vec, fastembed-rs) are planned as optionalDependencies — see backlog F1 — not yet declared."
8072
+ }
8073
+ };
7956
8074
 
7957
8075
  // packages/mcp/src/transport.ts
7958
8076
  import * as readline from "readline";
@@ -8115,7 +8233,7 @@ var buildHandlersMap = (exports) => {
8115
8233
  var SERVER_INFO = {
8116
8234
  protocolVersion: "2024-11-05",
8117
8235
  capabilities: { tools: {} },
8118
- serverInfo: { name: "rig", version: "0.0.1" }
8236
+ serverInfo: { name: "rig", version: package_default2.version }
8119
8237
  };
8120
8238
  var isParams = (v) => typeof v === "object" && v !== null;
8121
8239
  var handleToolsCall = async (params, ctx, handlers) => {
@@ -10929,105 +11047,8 @@ async function serveMcp(opts = {}) {
10929
11047
  import compress from "@fastify/compress";
10930
11048
  import cors from "@fastify/cors";
10931
11049
  import fastifyStatic from "@fastify/static";
10932
- // package.json
10933
- var package_default2 = {
10934
- name: "rig-constellation",
10935
- version: "0.1.1",
10936
- private: false,
10937
- type: "module",
10938
- description: "Local-first semantic knowledge graph",
10939
- keywords: [
10940
- "mcp",
10941
- "model-context-protocol",
10942
- "claude-code",
10943
- "cursor",
10944
- "code-graph",
10945
- "knowledge-graph",
10946
- "code-navigation",
10947
- "codebase-map",
10948
- "ast",
10949
- "tree-sitter",
10950
- "local-first",
10951
- "embeddings",
10952
- "rag",
10953
- "ai-agents",
10954
- "developer-tools"
10955
- ],
10956
- author: "Astralchemist <kingolajohn55@gmail.com>",
10957
- license: "Apache-2.0",
10958
- homepage: "https://github.com/Astralchemist/rig",
10959
- repository: {
10960
- type: "git",
10961
- url: "git+https://github.com/Astralchemist/rig.git"
10962
- },
10963
- bin: {
10964
- rig: "./dist/rig.js"
10965
- },
10966
- files: [
10967
- "dist",
10968
- "generated",
10969
- "packages/web/dist",
10970
- "LICENSE",
10971
- "LICENSE-CODEGRAPH.txt",
10972
- "NOTICE",
10973
- "README.md"
10974
- ],
10975
- engines: {
10976
- bun: ">=1.1",
10977
- node: ">=20 <25"
10978
- },
10979
- workspaces: [
10980
- "packages/*"
10981
- ],
10982
- scripts: {
10983
- gen: "bun run scripts/gen.ts",
10984
- "gen:check": "bun run scripts/gen-check.ts",
10985
- "gen:wasm": "bun run scripts/gen-wasm.ts",
10986
- "check:compat": "bun run scripts/compat-check.ts",
10987
- "compat:snapshot": "bun run scripts/compat-check.ts --write",
10988
- "check:migrations": "bun run scripts/migration-lock.ts",
10989
- "migration:lock": "bun run scripts/migration-lock.ts --write",
10990
- test: "bun test",
10991
- "test:e2e": "playwright test",
10992
- "install:hooks": "bash scripts/install-hooks.sh",
10993
- build: "bun run build:web && bun run build:cli",
10994
- "build:web": "cd packages/web && bunx vite build",
10995
- "build:cli": "bun run gen:wasm && bun run scripts/build-cli.ts",
10996
- prepublishOnly: "bun run build && bun test && bun run gen:check && bun run check:compat && bun run check:migrations"
10997
- },
10998
- dependencies: {
10999
- "@fastify/compress": "8.3.1",
11000
- "@fastify/cors": "11.2.0",
11001
- "@fastify/static": "9.1.3",
11002
- "@xenova/transformers": "^2.17",
11003
- fastify: "5.8.5",
11004
- ignore: "7.0.5",
11005
- "jsonc-parser": "3.3.1",
11006
- "tree-sitter-wasms": "0.1.13",
11007
- "web-tree-sitter": "^0.25.3",
11008
- ws: "8.20.1",
11009
- zod: "^3.23"
11010
- },
11011
- optionalDependencies: {
11012
- "better-sqlite3": "^12"
11013
- },
11014
- devDependencies: {
11015
- "@playwright/test": "1.60.0",
11016
- "@types/bun": "latest",
11017
- "@types/node": "^20",
11018
- prettier: "^3",
11019
- typescript: "^5.5",
11020
- zod: "^3.23",
11021
- "zod-to-json-schema": "^3.23"
11022
- },
11023
- comments: {
11024
- design: "Local-first: bun:sqlite is the primary store, better-sqlite3 an optional Node fallback (the only optionalDependency today). Optional native accelerators (sqlite-vec, fastembed-rs) are planned as optionalDependencies — see backlog F1 — not yet declared."
11025
- }
11026
- };
11027
-
11028
- // packages/web/src/server.ts
11029
- import { existsSync as existsSync18 } from "node:fs";
11030
- import { dirname as dirname8, join as join19 } from "node:path";
11050
+ import { existsSync as existsSync19 } from "node:fs";
11051
+ import { dirname as dirname8, join as join20 } from "node:path";
11031
11052
  import { fileURLToPath as fileURLToPath2 } from "node:url";
11032
11053
  import Fastify from "fastify";
11033
11054
 
@@ -11128,6 +11149,49 @@ var registerConfigRoutes = (app, projectRoot) => {
11128
11149
  });
11129
11150
  };
11130
11151
 
11152
+ // packages/web/src/listen.ts
11153
+ import { existsSync as existsSync18, readFileSync as readFileSync11 } from "node:fs";
11154
+ import { basename as basename5, join as join18 } from "node:path";
11155
+ var DEFAULT_PORT = 7474;
11156
+ var FALLBACK_SPAN = 64;
11157
+ var readConfig = (projectRoot) => {
11158
+ const file = join18(projectRoot, ".rig", "config.json");
11159
+ if (!existsSync18(file))
11160
+ return {};
11161
+ try {
11162
+ return JSON.parse(readFileSync11(file, "utf-8"));
11163
+ } catch {
11164
+ return {};
11165
+ }
11166
+ };
11167
+ var resolvePort = (projectRoot, explicit) => {
11168
+ if (typeof explicit === "number" && Number.isFinite(explicit))
11169
+ return explicit;
11170
+ const fromCfg = readConfig(projectRoot).port;
11171
+ if (typeof fromCfg === "number" && Number.isFinite(fromCfg))
11172
+ return fromCfg;
11173
+ return DEFAULT_PORT;
11174
+ };
11175
+ var resolveProjectName = (projectRoot) => {
11176
+ const name = readConfig(projectRoot).name;
11177
+ if (typeof name === "string" && name.trim())
11178
+ return name.trim();
11179
+ return basename5(projectRoot);
11180
+ };
11181
+ var isAddrInUse = (err2) => !!err2 && typeof err2 === "object" && err2.code === "EADDRINUSE";
11182
+ var listenWithFallback = async (app, host, port) => {
11183
+ for (let p = port;p <= port + FALLBACK_SPAN; p++) {
11184
+ try {
11185
+ return await app.listen({ host, port: p });
11186
+ } catch (err2) {
11187
+ if (isAddrInUse(err2) && p < port + FALLBACK_SPAN)
11188
+ continue;
11189
+ throw err2;
11190
+ }
11191
+ }
11192
+ throw new Error(`rig serve: no free port in ${port}–${port + FALLBACK_SPAN}`);
11193
+ };
11194
+
11131
11195
  // packages/web/src/routes.ts
11132
11196
  var intOrUndef = (s) => s === undefined ? undefined : Number.parseInt(s, 10);
11133
11197
  var ensureNode = (rig, id) => rig.getNode(id) ? { ok: true } : { ok: false, status: 404, body: { error: `node ${id} not found` } };
@@ -11198,7 +11262,7 @@ var registerRoutes = (app, rig) => {
11198
11262
 
11199
11263
  // packages/web/src/ws.ts
11200
11264
  import { watch as watch2 } from "node:fs";
11201
- import { join as join18, resolve as resolve11 } from "node:path";
11265
+ import { join as join19, resolve as resolve11 } from "node:path";
11202
11266
  import { WebSocketServer } from "ws";
11203
11267
 
11204
11268
  // packages/web/src/ws-derive.ts
@@ -11349,7 +11413,7 @@ var attachWs = (httpServer, rig) => {
11349
11413
  }, DEBOUNCE_MS);
11350
11414
  };
11351
11415
  try {
11352
- const w = watch2(join18(root, RIG_DIR), { persistent: false }, (_evt, filename) => {
11416
+ const w = watch2(join19(root, RIG_DIR), { persistent: false }, (_evt, filename) => {
11353
11417
  if (filename && filename.startsWith("rig.db"))
11354
11418
  onDbChange();
11355
11419
  });
@@ -11372,13 +11436,13 @@ var attachWs = (httpServer, rig) => {
11372
11436
 
11373
11437
  // packages/web/src/server.ts
11374
11438
  var HERE2 = dirname8(fileURLToPath2(import.meta.url));
11375
- var DIST_DIR = join19(findAssetRoot(HERE2), "packages/web/dist");
11439
+ var DIST_DIR = join20(findAssetRoot(HERE2), "packages/web/dist");
11376
11440
  var LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "::1"]);
11377
11441
  var DEFAULT_HOST = "127.0.0.1";
11378
- var DEFAULT_PORT = 7474;
11379
11442
  async function serveWeb(opts) {
11380
11443
  const host = opts.host ?? DEFAULT_HOST;
11381
- const port = opts.port ?? DEFAULT_PORT;
11444
+ const port = resolvePort(opts.projectRoot, opts.port);
11445
+ const project = resolveProjectName(opts.projectRoot);
11382
11446
  const isLoopback = LOOPBACK_HOSTS.has(host);
11383
11447
  const authMode = opts.auth ?? "auto";
11384
11448
  const authOn = authMode === true || authMode === "auto" && !isLoopback;
@@ -11393,17 +11457,17 @@ async function serveWeb(opts) {
11393
11457
  await app.register(compress, { global: true, encodings: ["gzip", "deflate"], threshold: 1024 });
11394
11458
  let token = null;
11395
11459
  if (authOn) {
11396
- token = loadOrCreateToken(join19(opts.projectRoot, ".rig"));
11460
+ token = loadOrCreateToken(join20(opts.projectRoot, ".rig"));
11397
11461
  app.addHook("preHandler", requireBearer(token));
11398
11462
  registerAuthRoutes(app, { token, cookieMaxAgeSec: 60 * 60 * 24 * 7 });
11399
11463
  } else {
11400
11464
  app.get("/api/session/me", async () => ({ authed: true, auth_required: false }));
11401
11465
  }
11402
11466
  const version = package_default2.version;
11403
- app.get("/health", async () => ({ ok: true, name: "rig-web", version, auth: authOn }));
11467
+ app.get("/health", async () => ({ ok: true, name: "rig-web", project, version, auth: authOn }));
11404
11468
  registerRoutes(app, rig);
11405
11469
  registerConfigRoutes(app, opts.projectRoot);
11406
- if (existsSync18(DIST_DIR)) {
11470
+ if (existsSync19(DIST_DIR)) {
11407
11471
  await app.register(fastifyStatic, { root: DIST_DIR, prefix: "/", wildcard: false });
11408
11472
  app.setNotFoundHandler((req, reply) => {
11409
11473
  if (req.url.startsWith("/api") || req.url === "/ws") {
@@ -11416,7 +11480,7 @@ async function serveWeb(opts) {
11416
11480
  return reply.type("text/html").send(`<!doctype html><meta charset="utf-8"><title>Rig</title><body style="font:14px sans-serif;padding:40px;background:#0b0d12;color:#e5e7eb">` + `<h1>Rig web server is running</h1>` + `<p>UI bundle not built yet. Run <code>cd packages/web &amp;&amp; bunx vite build</code> then refresh.</p>` + `<p>API surface available now at <code>/api/status</code>, <code>/api/graph</code>, etc.</p></body>`);
11417
11481
  });
11418
11482
  }
11419
- const address = await app.listen({ host, port });
11483
+ const address = await listenWithFallback(app, host, port);
11420
11484
  const ws = attachWs(app.server, rig);
11421
11485
  return {
11422
11486
  app,
@@ -11493,21 +11557,21 @@ async function runServe(cwd) {
11493
11557
  }
11494
11558
 
11495
11559
  // packages/cli/src/start.ts
11496
- import { dirname as dirname9, join as join21, resolve as resolve13 } from "node:path";
11560
+ import { dirname as dirname9, join as join22, resolve as resolve13 } from "node:path";
11497
11561
  import { fileURLToPath as fileURLToPath3 } from "node:url";
11498
11562
 
11499
11563
  // packages/cli/src/init.ts
11500
- import { appendFileSync as appendFileSync2, existsSync as existsSync19, readFileSync as readFileSync11, writeFileSync as writeFileSync5 } from "node:fs";
11501
- import { join as join20, resolve as resolve12 } from "node:path";
11564
+ import { appendFileSync as appendFileSync2, existsSync as existsSync20, readFileSync as readFileSync12, writeFileSync as writeFileSync5 } from "node:fs";
11565
+ import { basename as basename6, join as join21, resolve as resolve12 } from "node:path";
11502
11566
  var ensureGitignored2 = (root) => {
11503
- const path7 = join20(root, ".gitignore");
11567
+ const path7 = join21(root, ".gitignore");
11504
11568
  const entry = ".rig/";
11505
- if (!existsSync19(path7)) {
11569
+ if (!existsSync20(path7)) {
11506
11570
  writeFileSync5(path7, `${entry}
11507
11571
  `);
11508
11572
  return true;
11509
11573
  }
11510
- const lines = readFileSync11(path7, "utf-8").split(/\r?\n/);
11574
+ const lines = readFileSync12(path7, "utf-8").split(/\r?\n/);
11511
11575
  if (lines.some((l) => l.trim() === entry || l.trim() === ".rig"))
11512
11576
  return false;
11513
11577
  const sep = lines.at(-1) === "" ? "" : `
@@ -11516,21 +11580,42 @@ var ensureGitignored2 = (root) => {
11516
11580
  `);
11517
11581
  return true;
11518
11582
  };
11519
- var DEFAULT_CONFIG2 = {
11583
+ var deriveProjectName2 = (root) => {
11584
+ const pkgPath = join21(root, "package.json");
11585
+ if (existsSync20(pkgPath)) {
11586
+ try {
11587
+ const name = JSON.parse(readFileSync12(pkgPath, "utf-8")).name;
11588
+ if (typeof name === "string" && name.trim())
11589
+ return name.trim();
11590
+ } catch {}
11591
+ }
11592
+ return basename6(root);
11593
+ };
11594
+ var PORT_BASE2 = 7474;
11595
+ var PORT_SPAN2 = 64;
11596
+ var stablePort2 = (root) => {
11597
+ const abs = resolve12(root);
11598
+ let h = 0;
11599
+ for (let i = 0;i < abs.length; i++)
11600
+ h = h * 31 + abs.charCodeAt(i) >>> 0;
11601
+ return PORT_BASE2 + h % PORT_SPAN2;
11602
+ };
11603
+ var defaultConfig2 = (root) => ({
11520
11604
  version: 1,
11605
+ name: deriveProjectName2(root),
11521
11606
  host: "127.0.0.1",
11522
- port: 7474,
11607
+ port: stablePort2(root),
11523
11608
  embedder: { kind: "local", model: "Xenova/bge-small-en-v1.5" }
11524
- };
11609
+ });
11525
11610
  var ensureInit2 = async (root) => {
11526
- const rigDir = join20(root, RIG_DIR_NAME);
11527
- if (existsSync19(rigDir)) {
11611
+ const rigDir = join21(root, RIG_DIR_NAME);
11612
+ if (existsSync20(rigDir)) {
11528
11613
  return { rigDir, created: false, gitignoreUpdated: false };
11529
11614
  }
11530
11615
  const rig = await Rig.init(root);
11531
- const cfgPath = join20(rigDir, "config.json");
11532
- if (!existsSync19(cfgPath)) {
11533
- writeFileSync5(cfgPath, JSON.stringify(DEFAULT_CONFIG2, null, 2) + `
11616
+ const cfgPath = join21(rigDir, "config.json");
11617
+ if (!existsSync20(cfgPath)) {
11618
+ writeFileSync5(cfgPath, JSON.stringify(defaultConfig2(root), null, 2) + `
11534
11619
  `);
11535
11620
  }
11536
11621
  rig.close();
@@ -11540,7 +11625,7 @@ var ensureInit2 = async (root) => {
11540
11625
 
11541
11626
  // packages/cli/src/open-url.ts
11542
11627
  import { spawn } from "node:child_process";
11543
- import { existsSync as existsSync20 } from "node:fs";
11628
+ import { existsSync as existsSync21 } from "node:fs";
11544
11629
  var openUrl = (url) => {
11545
11630
  const launch = (cmd, args) => {
11546
11631
  try {
@@ -11556,7 +11641,7 @@ var openUrl = (url) => {
11556
11641
  return void launch("open", [url]);
11557
11642
  if (process.platform === "win32")
11558
11643
  return void launch("cmd", ["/c", "start", "", url]);
11559
- if (existsSync20("/proc/sys/kernel/osrelease") && process.env.WSL_DISTRO_NAME) {
11644
+ if (existsSync21("/proc/sys/kernel/osrelease") && process.env.WSL_DISTRO_NAME) {
11560
11645
  if (launch("wslview", [url]))
11561
11646
  return;
11562
11647
  return void launch("cmd.exe", ["/c", "start", "", url]);
@@ -11564,17 +11649,74 @@ var openUrl = (url) => {
11564
11649
  launch("xdg-open", [url]);
11565
11650
  };
11566
11651
 
11652
+ // packages/cli/src/ui.ts
11653
+ var isTty2 = () => process.stderr.isTTY === true;
11654
+ var plain = () => !isTty2() || process.env.NO_COLOR !== undefined;
11655
+ var wrap = (code) => (s) => plain() ? s : `\x1B[${code}m${s}\x1B[0m`;
11656
+ var dim = wrap("2");
11657
+ var bold = wrap("1");
11658
+ var cyan = wrap("36");
11659
+ var green = wrap("32");
11660
+ var yellow = wrap("33");
11661
+ var red = wrap("31");
11662
+ var sym = { ok: "✓", hub: "⬡", dot: "·", arrow: "→" };
11663
+ var write = (s) => void process.stderr.write(s);
11664
+ var clearLine = () => {
11665
+ if (isTty2())
11666
+ write("\r\x1B[K");
11667
+ };
11668
+ var banner = (project, url) => {
11669
+ write(`
11670
+ `);
11671
+ write(` ${cyan(sym.hub)} ${bold("Rig")} ${dim("— mapping")} ${bold(project)}
11672
+ `);
11673
+ write(` ${dim(url)}
11674
+
11675
+ `);
11676
+ };
11677
+ var line = (symbol, label, detail = "") => {
11678
+ clearLine();
11679
+ write(` ${symbol} ${label}${detail ? " " + dim(detail) : ""}
11680
+ `);
11681
+ };
11682
+ var PHASES = ["extract", "resolve", "embed", "tests-edges", "hubness", "communities"];
11683
+ var BAR_WIDTH = 18;
11684
+ var bar = (current, total) => {
11685
+ const ratio = total > 0 ? Math.min(1, current / total) : 0;
11686
+ const filled = Math.round(ratio * BAR_WIDTH);
11687
+ return `${"█".repeat(filled)}${dim("░".repeat(BAR_WIDTH - filled))}`;
11688
+ };
11689
+ var makeProgress = () => {
11690
+ let lastLog = "";
11691
+ return (p) => {
11692
+ const idx = PHASES.indexOf(p.phase);
11693
+ const step2 = idx >= 0 ? `${idx + 1}/${PHASES.length}` : "·";
11694
+ const count = p.total !== undefined ? `${p.current ?? p.total}/${p.total}` : p.current !== undefined ? String(p.current) : "";
11695
+ if (plain()) {
11696
+ const log = ` indexing ${step2} ${p.phase} ${count}`.trimEnd();
11697
+ if (log !== lastLog) {
11698
+ write(log + `
11699
+ `);
11700
+ lastLog = log;
11701
+ }
11702
+ return;
11703
+ }
11704
+ const meter = p.total !== undefined ? `${bar(p.current ?? p.total, p.total)} ` : "";
11705
+ const tail = p.detail ? dim(" " + p.detail) : "";
11706
+ clearLine();
11707
+ write(` ${cyan(sym.arrow)} ${dim(step2)} ${bold(p.phase.padEnd(12))} ${meter}${dim(count)}${tail}`);
11708
+ };
11709
+ };
11710
+ var endProgress = () => clearLine();
11711
+
11567
11712
  // packages/cli/src/start.ts
11568
11713
  var HERE3 = dirname9(fileURLToPath3(import.meta.url));
11569
- var GENERATED_DIR2 = join21(findAssetRoot(HERE3), "generated/installer");
11714
+ var GENERATED_DIR2 = join22(findAssetRoot(HERE3), "generated/installer");
11570
11715
  var flag6 = (n) => process.argv.includes(n);
11571
11716
  var opt = (n) => {
11572
11717
  const i = process.argv.indexOf(n);
11573
11718
  return i >= 0 && i + 1 < process.argv.length ? process.argv[i + 1] : undefined;
11574
11719
  };
11575
- var isTty2 = process.stderr.isTTY === true;
11576
- var status = (line) => void process.stderr.write(isTty2 ? `\r\x1B[K${line}` : line + `
11577
- `);
11578
11720
  var wireAgents = async (root) => {
11579
11721
  const opts = { rigBin: opt("--bin") ?? "rig", cursorPath: root, generatedDir: GENERATED_DIR2, dryRun: false };
11580
11722
  const wired = [];
@@ -11589,13 +11731,8 @@ var wireAgents = async (root) => {
11589
11731
  };
11590
11732
  var runStart = async (cwd) => {
11591
11733
  const root = resolve13(cwd);
11592
- process.stderr.write(`
11593
- ⬡ Rig — mapping your codebase…
11594
-
11595
- `);
11734
+ const project = deriveProjectName2(root);
11596
11735
  const init = await ensureInit2(root);
11597
- process.stderr.write(` ${init.created ? "✓ initialized" : "· already set up"} ${init.rigDir}
11598
- `);
11599
11736
  const portStr = opt("--port");
11600
11737
  const host = opt("--host");
11601
11738
  const web = await serveWeb({
@@ -11605,15 +11742,17 @@ var runStart = async (cwd) => {
11605
11742
  ...host ? { host } : {}
11606
11743
  });
11607
11744
  const mapUrl = web.token ? `${web.url}/auth?t=${web.token}` : web.url;
11745
+ banner(project, mapUrl);
11746
+ line(init.created ? sym.ok : sym.dot, init.created ? "initialized" : "already set up", init.rigDir);
11608
11747
  if (!flag6("--no-open"))
11609
11748
  openUrl(mapUrl);
11610
- process.stderr.write(` ✓ map live ${mapUrl}
11611
- `);
11749
+ line(sym.ok, "map live", web.url);
11750
+ const progress = makeProgress();
11612
11751
  const rig = await Rig.open(root);
11613
11752
  try {
11614
11753
  const r = await rig.indexAll({
11615
11754
  onProgress: (p) => {
11616
- status(` indexing ${p.phase} ${p.current ?? ""}${p.total ? "/" + p.total : ""}`);
11755
+ progress(p);
11617
11756
  web.ws.broadcast({
11618
11757
  type: "index:progress",
11619
11758
  ts: Date.now(),
@@ -11621,26 +11760,26 @@ var runStart = async (cwd) => {
11621
11760
  });
11622
11761
  }
11623
11762
  });
11624
- if (isTty2)
11625
- process.stderr.write("\r\x1B[K");
11763
+ endProgress();
11626
11764
  const skills = rig.seedSkills(tools_manifest_default.tools);
11627
11765
  web.ws.broadcast({
11628
11766
  type: "index:progress",
11629
11767
  ts: Date.now(),
11630
11768
  payload: { phase: "done", done: true, nodes: r.nodes, edges: r.edges, files: r.files }
11631
11769
  });
11632
- process.stderr.write(` ✓ indexed ${r.nodes} nodes · ${r.edges} edges · ${r.files} files · ${skills} skills
11633
- `);
11770
+ line(sym.ok, "indexed", `${r.nodes} nodes · ${r.edges} edges · ${r.files} files · ${skills} skills`);
11634
11771
  } finally {
11635
11772
  rig.close();
11636
11773
  }
11637
11774
  if (!flag6("--no-wire")) {
11638
11775
  const wired = await wireAgents(root);
11639
- process.stderr.write(wired.length ? ` ✓ wired ${wired.join(", ")}
11640
- ` : " · no agents detected (run `rig install <target>` later)\n");
11776
+ if (wired.length)
11777
+ line(sym.ok, "wired", wired.join(", "));
11778
+ else
11779
+ line(sym.dot, "no agents detected", "run `rig install <target>` later");
11641
11780
  }
11642
11781
  process.stderr.write(`
11643
- press Ctrl-C to stop the map.
11782
+ ${dim("press Ctrl-C to stop the map.")}
11644
11783
  `);
11645
11784
  const shutdown = async () => {
11646
11785
  await web.close();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rig-constellation",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Local-first semantic knowledge graph",
@@ -29,7 +29,8 @@
29
29
  "url": "git+https://github.com/Astralchemist/rig.git"
30
30
  },
31
31
  "bin": {
32
- "rig": "./dist/rig.js"
32
+ "rig": "./dist/rig.js",
33
+ "rig-constellation": "./dist/rig.js"
33
34
  },
34
35
  "files": [
35
36
  "dist",
@@ -51,4 +51,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
51
51
  }
52
52
  `);function Md(e,n){(n==null||n>e.length)&&(n=e.length);for(var r=0,i=Array(n);r<n;r++)i[r]=e[r];return i}function Nd(e){if(Array.isArray(e))return e}function Pd(e){if(Array.isArray(e))return Md(e)}function Fd(e,n,r){if(Id())return Reflect.construct.apply(null,arguments);var i=[null];return i.push.apply(i,n),new(e.bind.apply(e,i))}function Z(e,n,r){return(n=Kd(n))in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,e}function Id(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(Id=function(){return!!e})()}function Ld(e){if(typeof Symbol<`u`&&e[Symbol.iterator]!=null||e[`@@iterator`]!=null)return Array.from(e)}function Rd(e,n){var r=e==null?null:typeof Symbol<`u`&&e[Symbol.iterator]||e[`@@iterator`];if(r!=null){var i,a,o,s,c=[],l=!0,u=!1;try{if(o=(r=r.call(e)).next,n!==0)for(;!(l=(i=o.call(r)).done)&&(c.push(i.value),c.length!==n);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&r.return!=null&&(s=r.return(),Object(s)!==s))return}finally{if(u)throw a}}return c}}function zd(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
53
53
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Bd(){throw TypeError(`Invalid attempt to spread non-iterable instance.
54
- In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Vd(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),r.push.apply(r,i)}return r}function Hd(e){for(var n=1;n<arguments.length;n++){var r=arguments[n]==null?{}:arguments[n];n%2?Vd(Object(r),!0).forEach(function(n){Z(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Vd(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function Ud(e,n){return Nd(e)||Rd(e,n)||Jd(e,n)||zd()}function Wd(e){return Pd(e)||Ld(e)||Jd(e)||Bd()}function Gd(e,n){if(typeof e!=`object`||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var i=r.call(e,n);if(typeof i!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(e)}function Kd(e){var n=Gd(e,`string`);return typeof n==`symbol`?n:n+``}function qd(e){"@babel/helpers - typeof";return qd=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},qd(e)}function Jd(e,n){if(e){if(typeof e==`string`)return Md(e,n);var r={}.toString.call(e).slice(8,-1);return r===`Object`&&e.constructor&&(r=e.constructor.name),r===`Map`||r===`Set`?Array.from(e):r===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Md(e,n):void 0}}var Yd=Od(Ad);function Xd(e,n,r){!n||typeof r!=`string`||e.filter(function(e){return!e[r]}).forEach(function(e){e[r]=Yd(n(e))})}function Zd(e,n){var r=e.nodes,i=e.links,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},o=a.nodeFilter,s=o===void 0?function(){return!0}:o,c=a.onLoopError,l=c===void 0?function(e){throw`Invalid DAG structure! Found cycle in node path: ${e.join(` -> `)}.`}:c,u={};r.forEach(function(e){return u[n(e)]={data:e,out:[],depth:-1,skip:!s(e)}}),i.forEach(function(e){var r=e.source,i=e.target,a=l(r),o=l(i);if(!u.hasOwnProperty(a))throw`Missing source node with id: ${a}`;if(!u.hasOwnProperty(o))throw`Missing target node with id: ${o}`;var s=u[a],c=u[o];s.out.push(c);function l(e){return qd(e)===`object`?n(e):e}});var d=[];return f(Object.values(u)),Object.assign.apply(Object,[{}].concat(Wd(Object.entries(u).filter(function(e){return!Ud(e,2)[1].skip}).map(function(e){var n=Ud(e,2),r=n[0],i=n[1];return Z({},r,i.depth)}))));function f(e){for(var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=function(){var a=e[o];if(r.indexOf(a)!==-1){var s=[].concat(Wd(r.slice(r.indexOf(a))),[a]).map(function(e){return n(e.data)});return d.some(function(e){return e.length===s.length&&e.every(function(e,n){return e===s[n]})})||(d.push(s),l(s)),1}i>a.depth&&(a.depth=i,f(a.out,[].concat(Wd(r),[a]),i+ +!a.skip))},o=0,s=e.length;o<s;o++)if(a())continue}}var Qd=2,$d=function(e,n){return n.onNeedsRedraw&&n.onNeedsRedraw()},ef=function(e,n){if(!n.isShadow){var r=F(n.linkDirectionalParticles);n.graphData.links.forEach(function(e){var n=Math.round(Math.abs(r(e)));n?e.__photons=Wd(Array(n)).map(function(){return{}}):delete e.__photons})}},tf=Zo({props:{graphData:{default:{nodes:[],links:[]},onChange:function(e,n){n.engineRunning=!1,ef(e,n)}},dagMode:{onChange:function(e,n){!e&&(n.graphData.nodes||[]).forEach(function(e){e.fx=e.fy=void 0})}},dagLevelDistance:{},dagNodeFilter:{default:function(e){return!0}},onDagError:{triggerUpdate:!1},nodeRelSize:{default:4,triggerUpdate:!1,onChange:$d},nodeId:{default:`id`},nodeVal:{default:`val`,triggerUpdate:!1,onChange:$d},nodeColor:{default:`color`,triggerUpdate:!1,onChange:$d},nodeAutoColorBy:{},nodeCanvasObject:{triggerUpdate:!1,onChange:$d},nodeCanvasObjectMode:{default:function(){return`replace`},triggerUpdate:!1,onChange:$d},nodeVisibility:{default:!0,triggerUpdate:!1,onChange:$d},linkSource:{default:`source`},linkTarget:{default:`target`},linkVisibility:{default:!0,triggerUpdate:!1,onChange:$d},linkColor:{default:`color`,triggerUpdate:!1,onChange:$d},linkAutoColorBy:{},linkLineDash:{triggerUpdate:!1,onChange:$d},linkWidth:{default:1,triggerUpdate:!1,onChange:$d},linkCurvature:{default:0,triggerUpdate:!1,onChange:$d},linkCanvasObject:{triggerUpdate:!1,onChange:$d},linkCanvasObjectMode:{default:function(){return`replace`},triggerUpdate:!1,onChange:$d},linkDirectionalArrowLength:{default:0,triggerUpdate:!1,onChange:$d},linkDirectionalArrowColor:{triggerUpdate:!1,onChange:$d},linkDirectionalArrowRelPos:{default:.5,triggerUpdate:!1,onChange:$d},linkDirectionalParticles:{default:0,triggerUpdate:!1,onChange:ef},linkDirectionalParticleSpeed:{default:.01,triggerUpdate:!1},linkDirectionalParticleOffset:{default:0,triggerUpdate:!1},linkDirectionalParticleWidth:{default:4,triggerUpdate:!1},linkDirectionalParticleColor:{triggerUpdate:!1},linkDirectionalParticleCanvasObject:{triggerUpdate:!1},globalScale:{default:1,triggerUpdate:!1},d3AlphaMin:{default:0,triggerUpdate:!1},d3AlphaDecay:{default:.0228,triggerUpdate:!1,onChange:function(e,n){n.forceLayout.alphaDecay(e)}},d3AlphaTarget:{default:0,triggerUpdate:!1,onChange:function(e,n){n.forceLayout.alphaTarget(e)}},d3VelocityDecay:{default:.4,triggerUpdate:!1,onChange:function(e,n){n.forceLayout.velocityDecay(e)}},warmupTicks:{default:0,triggerUpdate:!1},cooldownTicks:{default:1/0,triggerUpdate:!1},cooldownTime:{default:15e3,triggerUpdate:!1},onUpdate:{default:function(){},triggerUpdate:!1},onFinishUpdate:{default:function(){},triggerUpdate:!1},onEngineTick:{default:function(){},triggerUpdate:!1},onEngineStop:{default:function(){},triggerUpdate:!1},onNeedsRedraw:{triggerUpdate:!1},isShadow:{default:!1,triggerUpdate:!1}},methods:{d3Force:function(e,n,r){return r===void 0?e.forceLayout.force(n):(e.forceLayout.force(n,r),this)},d3ReheatSimulation:function(e){return e.forceLayout.alpha(1),this.resetCountdown(),this},resetCountdown:function(e){return e.cntTicks=0,e.startTickTime=new Date,e.engineRunning=!0,this},isEngineRunning:function(e){return!!e.engineRunning},tickFrame:function(e){return!e.isShadow&&n(),i(),!e.isShadow&&a(),!e.isShadow&&o(),r(),this;function n(){e.engineRunning&&(++e.cntTicks>e.cooldownTicks||new Date-e.startTickTime>e.cooldownTime||e.d3AlphaMin>0&&e.forceLayout.alpha()<e.d3AlphaMin?(e.engineRunning=!1,e.onEngineStop()):(e.forceLayout.tick(),e.onEngineTick()))}function r(){var n=F(e.nodeVisibility),r=F(e.nodeVal),i=F(e.nodeColor),a=F(e.nodeCanvasObjectMode),o=e.ctx,s=e.isShadow/e.globalScale,c=e.graphData.nodes.filter(n);o.save(),c.forEach(function(n){var c=a(n);if(e.nodeCanvasObject&&(c===`before`||c===`replace`)&&(e.nodeCanvasObject(n,o,e.globalScale),c===`replace`)){o.restore();return}var l=Math.sqrt(Math.max(0,r(n)||1))*e.nodeRelSize+s;o.beginPath(),o.arc(n.x,n.y,l,0,2*Math.PI,!1),o.fillStyle=i(n)||`rgba(31, 120, 180, 0.92)`,o.fill(),e.nodeCanvasObject&&c===`after`&&e.nodeCanvasObject(n,e.ctx,e.globalScale)}),o.restore()}function i(){var n=F(e.linkVisibility),r=F(e.linkColor),i=F(e.linkWidth),a=F(e.linkLineDash),o=F(e.linkCurvature),s=F(e.linkCanvasObjectMode),c=e.ctx,l=e.isShadow*2,u=e.graphData.links.filter(n);u.forEach(_);var d=[],f=[],p=u;if(e.linkCanvasObject){var m=[],h=[];u.forEach(function(e){return({before:d,after:f,replace:m}[s(e)]||h).push(e)}),p=[].concat(Wd(d),f,h),d=d.concat(m)}c.save(),d.forEach(function(n){return e.linkCanvasObject(n,c,e.globalScale)}),c.restore();var g=Td(p,[r,i,a]);c.save(),Object.entries(g).forEach(function(n){var r=Ud(n,2),i=r[0],o=r[1],s=!i||i===`undefined`?`rgba(0,0,0,0.15)`:i;Object.entries(o).forEach(function(n){var r=Ud(n,2),i=r[0],o=r[1],u=(i||1)/e.globalScale+l;Object.entries(o).forEach(function(e){var n=Ud(e,2);n[0];var r=n[1],i=a(r[0]);c.beginPath(),r.forEach(function(e){var n=e.source,r=e.target;if(!(!n||!r||!n.hasOwnProperty(`x`)||!r.hasOwnProperty(`x`))){c.moveTo(n.x,n.y);var i=e.__controlPoints;i?c[i.length===2?`quadraticCurveTo`:`bezierCurveTo`].apply(c,Wd(i).concat([r.x,r.y])):c.lineTo(r.x,r.y)}}),c.strokeStyle=s,c.lineWidth=u,c.setLineDash(i||[]),c.stroke()})})}),c.restore(),c.save(),f.forEach(function(n){return e.linkCanvasObject(n,c,e.globalScale)}),c.restore();function _(e){var n=o(e);if(!n){e.__controlPoints=null;return}var r=e.source,i=e.target;if(!(!r||!i||!r.hasOwnProperty(`x`)||!i.hasOwnProperty(`x`))){var a=Math.sqrt((i.x-r.x)**2+(i.y-r.y)**2);if(a>0){var s=Math.atan2(i.y-r.y,i.x-r.x),c=a*n,l={x:(r.x+i.x)/2+c*Math.cos(s-Math.PI/2),y:(r.y+i.y)/2+c*Math.sin(s-Math.PI/2)};e.__controlPoints=[l.x,l.y]}else{var u=n*70;e.__controlPoints=[i.x,i.y-u,i.x+u,i.y]}}}}function a(){var n=1.6,r=.2,i=F(e.linkDirectionalArrowLength),a=F(e.linkDirectionalArrowRelPos),o=F(e.linkVisibility),s=F(e.linkDirectionalArrowColor||e.linkColor),c=F(e.nodeVal),l=e.ctx;l.save(),e.graphData.links.filter(o).forEach(function(o){var u=i(o);if(!(!u||u<0)){var d=o.source,f=o.target;if(!(!d||!f||!d.hasOwnProperty(`x`)||!f.hasOwnProperty(`x`))){var p=Math.sqrt(Math.max(0,c(d)||1))*e.nodeRelSize,m=Math.sqrt(Math.max(0,c(f)||1))*e.nodeRelSize,h=Math.min(1,Math.max(0,a(o))),g=s(o)||`rgba(0,0,0,0.28)`,_=u/n/2,v=o.__controlPoints&&Fd(dd,[d.x,d.y].concat(Wd(o.__controlPoints),[f.x,f.y])),y=v?function(e){return v.get(e)}:function(e){return{x:d.x+(f.x-d.x)*e||0,y:d.y+(f.y-d.y)*e||0}},b=v?v.length():Math.sqrt((f.x-d.x)**2+(f.y-d.y)**2),x=p+u+(b-p-m-u)*h,S=y(x/b),C=y((x-u)/b),w=y((x-u*(1-r))/b),T=Math.atan2(S.y-C.y,S.x-C.x)-Math.PI/2;l.beginPath(),l.moveTo(S.x,S.y),l.lineTo(C.x+_*Math.cos(T),C.y+_*Math.sin(T)),l.lineTo(w.x,w.y),l.lineTo(C.x-_*Math.cos(T),C.y-_*Math.sin(T)),l.fillStyle=g,l.fill()}}}),l.restore()}function o(){var n=F(e.linkDirectionalParticles),r=F(e.linkDirectionalParticleSpeed),i=F(e.linkDirectionalParticleOffset),a=F(e.linkDirectionalParticleWidth),o=F(e.linkVisibility),s=F(e.linkDirectionalParticleColor||e.linkColor),c=e.ctx;c.save(),e.graphData.links.filter(o).forEach(function(o){var l=n(o);if(!(!o.hasOwnProperty(`__photons`)||!o.__photons.length)){var u=o.source,d=o.target;if(!(!u||!d||!u.hasOwnProperty(`x`)||!d.hasOwnProperty(`x`))){var f=r(o),p=Math.abs(i(o)),m=o.__photons||[],h=Math.max(0,a(o)/2)/Math.sqrt(e.globalScale);c.fillStyle=s(o)||`rgba(0,0,0,0.28)`;var g=o.__controlPoints?Fd(dd,[u.x,u.y].concat(Wd(o.__controlPoints),[d.x,d.y])):null,_=0,v=!1;m.forEach(function(n){var r=!!n.__singleHop;if(n.hasOwnProperty(`__progressRatio`)||(n.__progressRatio=r?+(f<0):(_+p)/l),!r&&_++,n.__progressRatio+=f,n.__progressRatio>=1||n.__progressRatio<0)if(!r)n.__progressRatio%=1,n.__progressRatio<0&&n.__progressRatio++;else{v=!0;return}var i=n.__progressRatio,a=g?g.get(i):{x:u.x+(d.x-u.x)*i||0,y:u.y+(d.y-u.y)*i||0};e.linkDirectionalParticleCanvasObject?e.linkDirectionalParticleCanvasObject(a.x,a.y,o,c,e.globalScale):(c.beginPath(),c.arc(a.x,a.y,h,0,2*Math.PI,!1),c.fill())}),v&&(o.__photons=o.__photons.filter(function(e){return!e.__singleHop||e.__progressRatio<=1&&e.__progressRatio>=0}))}}}),c.restore()}},emitParticle:function(e,n){return n&&(!n.__photons&&(n.__photons=[]),n.__photons.push({__singleHop:!0})),this}},stateInit:function(){return{forceLayout:zu().force(`link`,Du()).force(`charge`,Bu()).force(`center`,hl()).force(`dagRadial`,null).stop(),engineRunning:!1}},init:function(e,n){n.ctx=e},update:function(e,n){e.engineRunning=!1,e.onUpdate(),e.nodeAutoColorBy!==null&&Xd(e.graphData.nodes,F(e.nodeAutoColorBy),e.nodeColor),e.linkAutoColorBy!==null&&Xd(e.graphData.links,F(e.linkAutoColorBy),e.linkColor),e.graphData.links.forEach(function(n){n.source=n[e.linkSource],n.target=n[e.linkTarget]}),e.forceLayout.stop().alpha(1).nodes(e.graphData.nodes);var r=e.forceLayout.force(`link`);r&&r.id(function(n){return n[e.nodeId]}).links(e.graphData.links);var i=e.dagMode&&Zd(e.graphData,function(n){return n[e.nodeId]},{nodeFilter:e.dagNodeFilter,onLoopError:e.onDagError||void 0}),a=Math.max.apply(Math,Wd(Object.values(i||[]))),o=e.dagLevelDistance||e.graphData.nodes.length/(a||1)*Qd*([`radialin`,`radialout`].indexOf(e.dagMode)===-1?1:.7);if([`lr`,`rl`,`td`,`bu`].includes(n.dagMode)){var s=[`lr`,`rl`].includes(n.dagMode)?`fx`:`fy`;e.graphData.nodes.filter(e.dagNodeFilter).forEach(function(e){return delete e[s]})}if([`lr`,`rl`,`td`,`bu`].includes(e.dagMode)){var c=[`rl`,`bu`].includes(e.dagMode),l=function(n){return(i[n[e.nodeId]]-a/2)*o*(c?-1:1)},u=[`lr`,`rl`].includes(e.dagMode)?`fx`:`fy`;e.graphData.nodes.filter(e.dagNodeFilter).forEach(function(e){return e[u]=l(e)})}e.forceLayout.force(`dagRadial`,[`radialin`,`radialout`].indexOf(e.dagMode)===-1?null:Vu(function(n){var r=i[n[e.nodeId]]||-1;return(e.dagMode===`radialin`?a-r:r)*o}).strength(function(n){return+!!e.dagNodeFilter(n)}));for(var d=0;d<e.warmupTicks&&!(e.d3AlphaMin>0&&e.forceLayout.alpha()<e.d3AlphaMin);d++)e.forceLayout.tick();this.resetCountdown(),e.onFinishUpdate()}});function nf(e,n){var r=e instanceof Array?e:[e],i=new n;return i._destructor&&i._destructor(),{linkProp:function(e){return{default:i[e](),onChange:function(n,i){r.forEach(function(r){return i[r][e](n)})},triggerUpdate:!1}},linkMethod:function(e){return function(n){var i=[...arguments].slice(1),a=[];return r.forEach(function(r){var o=n[r],s=o[e].apply(o,i);s!==o&&a.push(s)}),a.length?a[0]:this}}}}var rf=800,af=4,of=5,sf=nf(`forceGraph`,tf),cf=nf([`forceGraph`,`shadowGraph`],tf),lf=Object.assign.apply(Object,Wd(`nodeColor.nodeAutoColorBy.nodeCanvasObject.nodeCanvasObjectMode.linkColor.linkAutoColorBy.linkLineDash.linkWidth.linkCanvasObject.linkCanvasObjectMode.linkDirectionalArrowLength.linkDirectionalArrowColor.linkDirectionalArrowRelPos.linkDirectionalParticles.linkDirectionalParticleSpeed.linkDirectionalParticleOffset.linkDirectionalParticleWidth.linkDirectionalParticleColor.linkDirectionalParticleCanvasObject.dagMode.dagLevelDistance.dagNodeFilter.onDagError.d3AlphaMin.d3AlphaDecay.d3VelocityDecay.warmupTicks.cooldownTicks.cooldownTime.onEngineTick.onEngineStop`.split(`.`).map(function(e){return Z({},e,sf.linkProp(e))})).concat(Wd([`nodeRelSize`,`nodeId`,`nodeVal`,`nodeVisibility`,`linkSource`,`linkTarget`,`linkVisibility`,`linkCurvature`].map(function(e){return Z({},e,cf.linkProp(e))})))),uf=Object.assign.apply(Object,Wd([`d3Force`,`d3ReheatSimulation`,`emitParticle`].map(function(e){return Z({},e,sf.linkMethod(e))})));function df(e){if(e.canvas){var n=e.canvas.width,r=e.canvas.height;n===300&&r===150&&(n=r=0);var i=window.devicePixelRatio;n/=i,r/=i,[e.canvas,e.shadowCanvas].forEach(function(a){a.style.width=`${e.width}px`,a.style.height=`${e.height}px`,a.width=e.width*i,a.height=e.height*i,!n&&!r&&a.getContext(`2d`).scale(i,i)});var a=Fa(e.canvas).k;e.zoom.translateBy(e.zoom.__baseElem,(e.width-n)/2/a,(e.height-r)/2/a),e.needsRedraw=!0}}function ff(e){var n=window.devicePixelRatio;e.setTransform(n,0,0,n,0,0)}function pf(e,n,r){e.save(),ff(e),e.clearRect(0,0,n,r),e.restore()}var mf=Zo({props:Hd({width:{default:window.innerWidth,onChange:function(e,n){return df(n)},triggerUpdate:!1},height:{default:window.innerHeight,onChange:function(e,n){return df(n)},triggerUpdate:!1},graphData:{default:{nodes:[],links:[]},onChange:function(e,n){[e.nodes,e.links].every(function(e){return(e||[]).every(function(e){return!e.hasOwnProperty(`__indexColor`)})})&&n.colorTracker.reset(),[{type:`Node`,objs:e.nodes},{type:`Link`,objs:e.links}].forEach(r),n.forceGraph.graphData(e),n.shadowGraph.graphData(e);function r(e){var r=e.type;e.objs.filter(function(e){if(!e.hasOwnProperty(`__indexColor`))return!0;var r=n.colorTracker.lookup(e.__indexColor);return!r||!r.hasOwnProperty(`d`)||r.d!==e}).forEach(function(e){e.__indexColor=n.colorTracker.register({type:r,d:e})})}},triggerUpdate:!1},backgroundColor:{onChange:function(e,n){n.canvas&&e&&(n.canvas.style.background=e)},triggerUpdate:!1},nodeLabel:{default:`name`,triggerUpdate:!1},nodePointerAreaPaint:{onChange:function(e,n){n.shadowGraph.nodeCanvasObject(e?function(n,r,i){return e(n,n.__indexColor,r,i)}:null),n.flushShadowCanvas&&n.flushShadowCanvas()},triggerUpdate:!1},linkPointerAreaPaint:{onChange:function(e,n){n.shadowGraph.linkCanvasObject(e?function(n,r,i){return e(n,n.__indexColor,r,i)}:null),n.flushShadowCanvas&&n.flushShadowCanvas()},triggerUpdate:!1},linkLabel:{default:`name`,triggerUpdate:!1},linkHoverPrecision:{default:4,triggerUpdate:!1},minZoom:{default:.01,onChange:function(e,n){n.zoom.scaleExtent([e,n.zoom.scaleExtent()[1]])},triggerUpdate:!1},maxZoom:{default:1e3,onChange:function(e,n){n.zoom.scaleExtent([n.zoom.scaleExtent()[0],e])},triggerUpdate:!1},enableNodeDrag:{default:!0,triggerUpdate:!1},enableZoomInteraction:{default:!0,triggerUpdate:!1},enablePanInteraction:{default:!0,triggerUpdate:!1},enableZoomPanInteraction:{default:!0,triggerUpdate:!1},enablePointerInteraction:{default:!0,onChange:function(e,n){n.hoverObj=null},triggerUpdate:!1},autoPauseRedraw:{default:!0,triggerUpdate:!1},onNodeDrag:{default:function(){},triggerUpdate:!1},onNodeDragEnd:{default:function(){},triggerUpdate:!1},onNodeClick:{triggerUpdate:!1},onNodeRightClick:{triggerUpdate:!1},onNodeHover:{triggerUpdate:!1},onLinkClick:{triggerUpdate:!1},onLinkRightClick:{triggerUpdate:!1},onLinkHover:{triggerUpdate:!1},onBackgroundClick:{triggerUpdate:!1},onBackgroundRightClick:{triggerUpdate:!1},showPointerCursor:{default:!0,triggerUpdate:!1},onZoom:{triggerUpdate:!1},onZoomEnd:{triggerUpdate:!1},onRenderFramePre:{triggerUpdate:!1},onRenderFramePost:{triggerUpdate:!1}},lf),aliases:{stopAnimation:`pauseAnimation`},methods:Hd({graph2ScreenCoords:function(e,n,r){var i=Fa(e.canvas);return{x:n*i.k+i.x,y:r*i.k+i.y}},screen2GraphCoords:function(e,n,r){var i=Fa(e.canvas);return{x:(n-i.x)/i.k,y:(r-i.y)/i.k}},centerAt:function(e,n,r,i){if(!e.canvas)return null;if(n!==void 0||r!==void 0){var a=Object.assign({},n===void 0?{}:{x:n},r===void 0?{}:{y:r});return i?e.tweenGroup.add(new Bo(o()).to(a,i).easing(Po.Quadratic.Out).onUpdate(s).onComplete(function(){e.tweenGroup.remove(this)}).start()):s(a),this}return o();function o(){var n=Fa(e.canvas);return{x:(e.width/2-n.x)/n.k,y:(e.height/2-n.y)/n.k}}function s(n){var r=n.x,i=n.y;e.zoom.translateTo(e.zoom.__baseElem,r===void 0?o().x:r,i===void 0?o().y:i),e.needsRedraw=!0}},zoom:function(e,n,r){if(!e.canvas)return null;if(n!==void 0)return r?e.tweenGroup.add(new Bo({k:i()}).to({k:n},r).easing(Po.Quadratic.Out).onUpdate(function(e){var n=e.k;return a(n)}).onComplete(function(){e.tweenGroup.remove(this)}).start()):a(n),this;return i();function i(){return Fa(e.canvas).k}function a(n){e.zoom.scaleTo(e.zoom.__baseElem,n),e.needsRedraw=!0}},zoomToFit:function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:10,i=[...arguments].slice(3),a=this.getGraphBbox.apply(this,i);if(a){var o={x:(a.x[0]+a.x[1])/2,y:(a.y[0]+a.y[1])/2},s=Math.max(1e-12,Math.min(0xe8d4a51000,(e.width-r*2)/(a.x[1]-a.x[0]),(e.height-r*2)/(a.y[1]-a.y[0])));this.centerAt(o.x,o.y,n),this.zoom(s,n)}return this},getGraphBbox:function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(){return!0},r=F(e.nodeVal),i=function(n){return Math.sqrt(Math.max(0,r(n)||1))*e.nodeRelSize},a=e.graphData.nodes.filter(n).map(function(e){return{x:e.x,y:e.y,r:i(e)}});return a.length?{x:[Za(a,function(e){return e.x-e.r}),Xa(a,function(e){return e.x+e.r})],y:[Za(a,function(e){return e.y-e.r}),Xa(a,function(e){return e.y+e.r})]}:null},pauseAnimation:function(e){return e.animationFrameRequestId&&=(cancelAnimationFrame(e.animationFrameRequestId),null),this},resumeAnimation:function(e){return e.animationFrameRequestId||this._animationCycle(),this},_destructor:function(){this.pauseAnimation(),this.graphData({nodes:[],links:[]})}},uf),stateInit:function(){return{lastSetZoom:1,zoom:Wa(),forceGraph:new tf,shadowGraph:new tf().cooldownTicks(0).nodeColor(`__indexColor`).linkColor(`__indexColor`).isShadow(!0),colorTracker:new sc,tweenGroup:new Io}},init:function(e,n){var r=this;e.innerHTML=``;var i=document.createElement(`div`);i.classList.add(`force-graph-container`),i.style.position=`relative`,e.appendChild(i),n.canvas=document.createElement(`canvas`),n.backgroundColor&&(n.canvas.style.background=n.backgroundColor),i.appendChild(n.canvas),n.shadowCanvas=document.createElement(`canvas`);var a=n.canvas.getContext(`2d`),o=n.shadowCanvas.getContext(`2d`,{willReadFrequently:!0}),s={x:-0xe8d4a51000,y:-0xe8d4a51000},c=function(){var e=null,r=window.devicePixelRatio,i=s.x>0&&s.y>0?o.getImageData(s.x*r,s.y*r,1,1):null;return i&&(e=n.colorTracker.lookup(i.data)),e};mn(n.canvas).call(Fn().subject(function(){if(!n.enableNodeDrag)return null;var e=c();return e&&e.type===`Node`?e.d:null}).on(`start`,function(e){var r=e.subject;r.__initialDragPos={x:r.x,y:r.y,fx:r.fx,fy:r.fy},e.active||(r.fx=r.x,r.fy=r.y),n.canvas.classList.add(`grabbable`)}).on(`drag`,function(e){var r=e.subject,i=r.__initialDragPos,a=e,o=Fa(n.canvas).k,s={x:i.x+(a.x-i.x)/o-r.x,y:i.y+(a.y-i.y)/o-r.y};[`x`,`y`].forEach(function(e){return r[`f${e}`]=r[e]=i[e]+(a[e]-i[e])/o}),!(!r.__dragged&&of>=Math.sqrt(Qa([`x`,`y`].map(function(n){return(e[n]-i[n])**2}))))&&(n.forceGraph.d3AlphaTarget(.3).resetCountdown(),n.isPointerDragging=!0,r.__dragged=!0,n.onNodeDrag(r,s))}).on(`end`,function(e){var r=e.subject,i=r.__initialDragPos,a={x:r.x-i.x,y:r.y-i.y};i.fx===void 0&&(r.fx=void 0),i.fy===void 0&&(r.fy=void 0),delete r.__initialDragPos,n.forceGraph.d3AlphaTarget()&&n.forceGraph.d3AlphaTarget(0).resetCountdown(),n.canvas.classList.remove(`grabbable`),n.isPointerDragging=!1,r.__dragged&&(delete r.__dragged,n.onNodeDragEnd(r,a))})),n.zoom(n.zoom.__baseElem=mn(n.canvas)),n.zoom.__baseElem.on(`dblclick.zoom`,null),n.zoom.filter(function(e){return!e.button&&n.enableZoomPanInteraction&&(e.type!==`wheel`||F(n.enableZoomInteraction)(e))&&(e.type===`wheel`||F(n.enablePanInteraction)(e))}).on(`zoom`,function(e){var i=e.transform;[a,o].forEach(function(e){ff(e),e.translate(i.x,i.y),e.scale(i.k,i.k)}),n.isPointerDragging=!0,n.onZoom&&n.onZoom(Hd(Hd({},i),r.centerAt())),n.needsRedraw=!0}).on(`end`,function(e){n.isPointerDragging=!1,n.onZoomEnd&&n.onZoomEnd(Hd(Hd({},e.transform),r.centerAt()))}),df(n),n.forceGraph.onNeedsRedraw(function(){return n.needsRedraw=!0}).onFinishUpdate(function(){Fa(n.canvas).k===n.lastSetZoom&&n.graphData.nodes.length&&(n.zoom.scaleTo(n.zoom.__baseElem,n.lastSetZoom=af/Math.cbrt(n.graphData.nodes.length)),n.needsRedraw=!0)}),n.tooltip=new ml(i),[`pointermove`,`pointerdown`].forEach(function(e){return i.addEventListener(e,function(r){e===`pointerdown`&&(n.isPointerPressed=!0,n.pointerDownEvent=r),!n.isPointerDragging&&r.type===`pointermove`&&n.onBackgroundClick&&(r.pressure>0||n.isPointerPressed)&&(r.pointerType===`mouse`||r.movementX===void 0||[r.movementX,r.movementY].some(function(e){return Math.abs(e)>1}))&&(n.isPointerDragging=!0);var a=o(i);s.x=r.pageX-a.left,s.y=r.pageY-a.top;function o(e){var n=e.getBoundingClientRect(),r=window.pageXOffset||document.documentElement.scrollLeft,i=window.pageYOffset||document.documentElement.scrollTop;return{top:n.top+i,left:n.left+r}}},{passive:!0})}),i.addEventListener(`pointerup`,function(e){if(n.isPointerPressed){if(n.isPointerPressed=!1,n.isPointerDragging){n.isPointerDragging=!1;return}var r=[e,n.pointerDownEvent];requestAnimationFrame(function(){if(e.button===0)if(n.hoverObj){var i=n[`on${n.hoverObj.type}Click`];i&&i.apply(void 0,[n.hoverObj.d].concat(r))}else n.onBackgroundClick&&n.onBackgroundClick.apply(n,r);if(e.button===2)if(n.hoverObj){var a=n[`on${n.hoverObj.type}RightClick`];a&&a.apply(void 0,[n.hoverObj.d].concat(r))}else n.onBackgroundRightClick&&n.onBackgroundRightClick.apply(n,r)})}},{passive:!0}),i.addEventListener(`contextmenu`,function(e){return!n.onBackgroundRightClick&&!n.onNodeRightClick&&!n.onLinkRightClick?!0:(e.preventDefault(),!1)}),n.forceGraph(a),n.shadowGraph(o);var l=No(function(){pf(o,n.width,n.height),n.shadowGraph.linkWidth(function(e){return F(n.linkWidth)(e)+n.linkHoverPrecision});var e=Fa(n.canvas);n.shadowGraph.globalScale(e.k).tickFrame()},rf);n.flushShadowCanvas=l.flush,(this._animationCycle=function e(){var r=!n.autoPauseRedraw||!!n.needsRedraw||n.forceGraph.isEngineRunning()||n.graphData.links.some(function(e){return e.__photons&&e.__photons.length});if(n.needsRedraw=!1,n.enablePointerInteraction){var i=n.isPointerDragging?null:c();if(i!==n.hoverObj){var o=n.hoverObj,s=o?o.type:null,u=i?i.type:null;if(s&&s!==u){var d=n[`on${s}Hover`];d&&d(null,o.d)}if(u){var f=n[`on${u}Hover`];f&&f(i.d,s===u?o.d:null)}n.tooltip.content(i&&F(n[`${i.type.toLowerCase()}Label`])(i.d)||null),n.canvas.classList[(i&&n[`on${u}Click`]||!i&&n.onBackgroundClick)&&F(n.showPointerCursor)(i?.d)?`add`:`remove`](`clickable`),n.hoverObj=i}r&&l()}if(r){pf(a,n.width,n.height);var p=Fa(n.canvas).k;n.onRenderFramePre&&n.onRenderFramePre(a,p),n.forceGraph.globalScale(p).tickFrame(),n.onRenderFramePost&&n.onRenderFramePost(a,p)}n.tweenGroup.update(),n.animationFrameRequestId=requestAnimationFrame(e)})()},update:function(e){}}),hf=s(((e,n)=>{n.exports=`SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED`})),gf=s(((e,n)=>{var r=hf();function i(){}function a(){}a.resetWarningCache=i,n.exports=function(){function e(e,n,i,a,o,s){if(s!==r){var c=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw c.name=`Invariant Violation`,c}}e.isRequired=e;function n(){return e}var o={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:n,element:e,elementType:e,instanceOf:n,node:e,objectOf:n,oneOf:n,oneOfType:n,shape:n,exact:n,checkPropTypes:a,resetWarningCache:i};return o.PropTypes=o,o}})),Q=l(s(((e,n)=>{n.exports=gf()()}))(),1),_f={width:Q.default.number,height:Q.default.number,graphData:Q.default.shape({nodes:Q.default.arrayOf(Q.default.object).isRequired,links:Q.default.arrayOf(Q.default.object).isRequired}),backgroundColor:Q.default.string,nodeRelSize:Q.default.number,nodeId:Q.default.string,nodeLabel:Q.default.oneOfType([Q.default.string,Q.default.func]),nodeVal:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),nodeVisibility:Q.default.oneOfType([Q.default.bool,Q.default.string,Q.default.func]),nodeColor:Q.default.oneOfType([Q.default.string,Q.default.func]),nodeAutoColorBy:Q.default.oneOfType([Q.default.string,Q.default.func]),onNodeHover:Q.default.func,onNodeClick:Q.default.func,linkSource:Q.default.string,linkTarget:Q.default.string,linkLabel:Q.default.oneOfType([Q.default.string,Q.default.func]),linkVisibility:Q.default.oneOfType([Q.default.bool,Q.default.string,Q.default.func]),linkColor:Q.default.oneOfType([Q.default.string,Q.default.func]),linkAutoColorBy:Q.default.oneOfType([Q.default.string,Q.default.func]),linkWidth:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkCurvature:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalArrowLength:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalArrowColor:Q.default.oneOfType([Q.default.string,Q.default.func]),linkDirectionalArrowRelPos:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticles:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticleSpeed:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticleOffset:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticleWidth:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticleColor:Q.default.oneOfType([Q.default.string,Q.default.func]),onLinkHover:Q.default.func,onLinkClick:Q.default.func,dagMode:Q.default.oneOf([`td`,`bu`,`lr`,`rl`,`zin`,`zout`,`radialin`,`radialout`]),dagLevelDistance:Q.default.number,dagNodeFilter:Q.default.func,onDagError:Q.default.func,d3AlphaMin:Q.default.number,d3AlphaDecay:Q.default.number,d3VelocityDecay:Q.default.number,warmupTicks:Q.default.number,cooldownTicks:Q.default.number,cooldownTime:Q.default.number,onEngineTick:Q.default.func,onEngineStop:Q.default.func,getGraphBbox:Q.default.func},vf={zoomToFit:Q.default.func,onNodeRightClick:Q.default.func,onNodeDrag:Q.default.func,onNodeDragEnd:Q.default.func,onLinkRightClick:Q.default.func,linkHoverPrecision:Q.default.number,onBackgroundClick:Q.default.func,onBackgroundRightClick:Q.default.func,showPointerCursor:Q.default.oneOfType([Q.default.bool,Q.default.func]),enablePointerInteraction:Q.default.bool,enableNodeDrag:Q.default.bool},yf={showNavInfo:Q.default.bool,nodeOpacity:Q.default.number,nodeResolution:Q.default.number,nodeThreeObject:Q.default.oneOfType([Q.default.object,Q.default.string,Q.default.func]),nodeThreeObjectExtend:Q.default.oneOfType([Q.default.bool,Q.default.string,Q.default.func]),nodePositionUpdate:Q.default.func,linkOpacity:Q.default.number,linkResolution:Q.default.number,linkCurveRotation:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkMaterial:Q.default.oneOfType([Q.default.object,Q.default.string,Q.default.func]),linkThreeObject:Q.default.oneOfType([Q.default.object,Q.default.string,Q.default.func]),linkThreeObjectExtend:Q.default.oneOfType([Q.default.bool,Q.default.string,Q.default.func]),linkPositionUpdate:Q.default.func,linkDirectionalArrowResolution:Q.default.number,linkDirectionalParticleResolution:Q.default.number,linkDirectionalParticleThreeObject:Q.default.oneOfType([Q.default.object,Q.default.string,Q.default.func]),forceEngine:Q.default.oneOf([`d3`,`ngraph`]),ngraphPhysics:Q.default.object,numDimensions:Q.default.oneOf([1,2,3])},bf=Object.assign({},_f,vf,{linkLineDash:Q.default.oneOfType([Q.default.arrayOf(Q.default.number),Q.default.string,Q.default.func]),nodeCanvasObjectMode:Q.default.oneOfType([Q.default.string,Q.default.func]),nodeCanvasObject:Q.default.func,nodePointerAreaPaint:Q.default.func,linkCanvasObjectMode:Q.default.oneOfType([Q.default.string,Q.default.func]),linkCanvasObject:Q.default.func,linkPointerAreaPaint:Q.default.func,linkDirectionalParticleCanvasObject:Q.default.func,autoPauseRedraw:Q.default.bool,minZoom:Q.default.number,maxZoom:Q.default.number,enableZoomInteraction:Q.default.oneOfType([Q.default.bool,Q.default.func]),enablePanInteraction:Q.default.oneOfType([Q.default.bool,Q.default.func]),onZoom:Q.default.func,onZoomEnd:Q.default.func,onRenderFramePre:Q.default.func,onRenderFramePost:Q.default.func});Object.assign({},_f,vf,yf,{enableNavigationControls:Q.default.bool,controlType:Q.default.oneOf([`trackball`,`orbit`,`fly`]),rendererConfig:Q.default.object,extraRenderers:Q.default.arrayOf(Q.default.shape({render:Q.default.func.isRequired}))}),Object.assign({},_f,yf,{nodeDesc:Q.default.oneOfType([Q.default.string,Q.default.func]),linkDesc:Q.default.oneOfType([Q.default.string,Q.default.func])}),Object.assign({},_f,yf,{markerAttrs:Q.default.object,yOffset:Q.default.number,glScale:Q.default.number});var xf=A(mf,{methodNames:[`emitParticle`,`d3Force`,`d3ReheatSimulation`,`stopAnimation`,`pauseAnimation`,`resumeAnimation`,`centerAt`,`zoom`,`zoomToFit`,`getGraphBbox`,`screen2GraphCoords`,`graph2ScreenCoords`]});xf.displayName=`ForceGraph2D`,xf.propTypes=bf;var Sf={file:`#94a3b8`,module:`#a78bfa`,"markdown-section":`#fcd34d`,class:`#fbbf24`,function:`#34d399`,method:`#60a5fa`,property:`#f472b6`,variable:`#f87171`,constant:`#fb923c`,enum:`#c084fc`,interface:`#22d3ee`,type_alias:`#22d3ee`,cluster:`#ec4899`},Cf=[`#60a5fa`,`#34d399`,`#fbbf24`,`#f472b6`,`#a78bfa`,`#fb923c`,`#22d3ee`,`#c084fc`,`#ec4899`,`#facc15`,`#4ade80`,`#f87171`,`#818cf8`,`#fcd34d`,`#2dd4bf`,`#e879f9`],wf=[{id:`observatory`,name:`Observatory`,scheme:`dark`,tokens:{bg:`#0a0c10`,surface:`#12151c`,surface2:`#171b24`,border:`#232834`,text:`#e6e9ef`,muted:`#7d8694`,accent:`#38e1c6`,accentText:`#04110e`,hub:`#f5b544`,structural:`#2c3340`,semantic:`#38e1c6`,pending:`#f5b544`,pulse:`#f472b6`,danger:`#f87171`,success:`#34d399`},nodeKinds:Sf,community:Cf},{id:`warm`,name:`Warm instrument`,scheme:`dark`,tokens:{bg:`#0d0b09`,surface:`#17130f`,surface2:`#1d1813`,border:`#2b2620`,text:`#ece6dd`,muted:`#8a8175`,accent:`#f5a623`,accentText:`#1a1206`,hub:`#ffd27d`,structural:`#3a332a`,semantic:`#5ec8c0`,pending:`#f5a623`,pulse:`#ff9e7d`,danger:`#f08a6c`,success:`#7fce8c`},nodeKinds:Sf,community:Cf},{id:`nebula`,name:`Indigo nebula`,scheme:`dark`,tokens:{bg:`#0b0a14`,surface:`#15131f`,surface2:`#1b1828`,border:`#272336`,text:`#e8e6f0`,muted:`#837e98`,accent:`#b16cff`,accentText:`#120a1f`,hub:`#fbbf24`,structural:`#322c47`,semantic:`#7c6cff`,pending:`#fbbf24`,pulse:`#f472b6`,danger:`#f87171`,success:`#4ade80`},nodeKinds:Sf,community:Cf},{id:`light`,name:`Daylight`,scheme:`light`,tokens:{bg:`#eef1f5`,surface:`#ffffff`,surface2:`#ffffff`,border:`#d4dae2`,text:`#1b2430`,muted:`#5f6b7a`,accent:`#0ea5a0`,accentText:`#ffffff`,hub:`#b45309`,structural:`#b8c1cd`,semantic:`#0ea5a0`,pending:`#b45309`,pulse:`#db2777`,danger:`#dc2626`,success:`#059669`},nodeKinds:{...Sf,"markdown-section":`#d97706`,class:`#d97706`},community:Cf}],Tf=`observatory`,Ef=e=>wf.find(n=>n.id===e)??wf[0],Df=s((e=>{var n=Symbol.for(`react.transitional.element`),r=Symbol.for(`react.fragment`);function i(e,r,i){var a=null;if(i!==void 0&&(a=``+i),r.key!==void 0&&(a=``+r.key),`key`in r)for(var o in i={},r)o!==`key`&&(i[o]=r[o]);else i=r;return r=i.ref,{$$typeof:n,type:e,key:a,ref:r===void 0?null:r,props:i}}e.Fragment=r,e.jsx=i,e.jsxs=i})),$=s(((e,n)=>{n.exports=Df()}))(),Of=(0,v.createContext)(null),kf=e=>{let n=document.documentElement;for(let[r,i]of Object.entries(e.tokens))n.style.setProperty(`--${Af(r)}`,i);n.style.setProperty(`color-scheme`,e.scheme)},Af=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`);function jf({children:e}){let[n,r]=(0,v.useState)(Tf),[i,a]=(0,v.useState)(!1),o=Ef(n);return(0,v.useEffect)(()=>{let e=!1;return fetch(`/api/config`).then(e=>e.ok?e.json():null).then(n=>{!e&&n?.theme&&wf.some(e=>e.id===n.theme)&&r(n.theme)}).catch(()=>{}).finally(()=>!e&&a(!0)),()=>{e=!0}},[]),(0,v.useEffect)(()=>kf(o),[o]),(0,$.jsx)(Of.Provider,{value:{theme:o,themeId:n,setThemeId:e=>{r(e),fetch(`/api/config`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({theme:e})})},themes:wf},children:e})}function Mf(){let e=(0,v.useContext)(Of);if(!e)throw Error(`useTheme must be used within ThemeProvider`);return e}var Nf=(e,n)=>{let r=e.replace(`#`,``);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${n})`},Pf=e=>4+Math.max(0,Math.min(1,e.pull_score))*14+(e.is_hub?6+(e.hubness??0)*8:0);function Ff({snapshot:e,onSelect:n,onAccept:r,onReject:i,focusToken:a,selectedId:o,pulses:s}){let{theme:c}=Mf(),l=e=>c.nodeKinds[e]??c.tokens.muted,u=e=>e===void 0?c.tokens.muted:c.community[e%c.community.length],d=(0,v.useMemo)(()=>Array.from(new Set(e.nodes.map(e=>e.type))).sort((e,n)=>e.localeCompare(n)),[e.nodes]),[f,p]=(0,v.useState)(new Set),[m,h]=(0,v.useState)(!1),[g,_]=(0,v.useState)(`kind`),y=(0,v.useMemo)(()=>{let n=e.nodes.filter(e=>m&&!e.is_hub?!1:!f.has(e.type)),r=new Set(n.map(e=>e.id)),i=n.map(e=>({...e})),a=e=>r.has(e.src)&&r.has(e.dst);return{nodes:i,links:[...e.edges_structural.filter(a).map(e=>({source:e.src,target:e.dst,table:`structural`})),...e.edges_semantic.filter(a).map(e=>({source:e.src,target:e.dst,table:`semantic`,weight:e.weight})),...e.pending_edges.filter(e=>r.has(e.src)&&r.has(e.dst)).map(e=>({source:e.src,target:e.dst,table:`pending`,pending:e}))]}},[e,f,m]),b=(0,v.useRef)(),[x,S]=(0,v.useState)({w:800,h:600}),[C,w]=(0,v.useState)(null),[T,E]=(0,v.useState)(null);(0,v.useEffect)(()=>{let e=()=>S({w:window.innerWidth,h:window.innerHeight});return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),(0,v.useEffect)(()=>{if(!a)return;let e=y.nodes.find(e=>e.id===a.id);!e||e.x===void 0||e.y===void 0||(b.current?.centerAt(e.x,e.y,600),b.current?.zoom(4,600))},[a,y.nodes]),(0,v.useEffect)(()=>{!s||s.size===0||b.current?.d3ReheatSimulation()},[s]),(0,v.useEffect)(()=>{b.current?.d3ReheatSimulation()},[c]);let ee=e=>{p(n=>{let r=new Set(n);return r.has(e)?r.delete(e):r.add(e),r})};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{style:{position:`absolute`,top:52,left:12,zIndex:10,display:`flex`,flexWrap:`wrap`,gap:6,maxWidth:`calc(100vw - 24px)`},children:[(0,$.jsx)(`button`,{onClick:()=>h(e=>!e),title:`Show only hub nodes`,style:{padding:`4px 10px`,fontSize:11,border:`1px solid ${m?c.tokens.hub:`var(--border)`}`,borderRadius:999,background:m?c.tokens.hub:`var(--surface)`,color:m?c.tokens.bg:c.tokens.hub,cursor:`pointer`},children:m?`◉ hubs only`:`○ hubs only`}),(0,$.jsxs)(`button`,{onClick:()=>_(e=>e===`kind`?`community`:`kind`),title:`Toggle node coloring between anchor kind and community`,style:{padding:`4px 10px`,fontSize:11,border:`1px solid var(--border)`,borderRadius:999,background:`var(--surface)`,color:g===`community`?`var(--accent)`:`var(--muted)`,cursor:`pointer`},children:[`color: `,g]}),d.map(e=>{let n=f.has(e);return(0,$.jsx)(`button`,{onClick:()=>ee(e),style:{padding:`4px 10px`,fontSize:11,border:`1px solid ${n?`var(--border)`:l(e)}`,borderRadius:999,background:n?`var(--surface)`:Nf(l(e),.13),color:n?`var(--muted)`:l(e),cursor:`pointer`,opacity:n?.5:1},children:e},e)})]}),(0,$.jsx)(xf,{ref:b,width:x.w,height:x.h,graphData:y,backgroundColor:c.tokens.bg,nodeId:`id`,linkColor:e=>{let n=e.table;return n===`pending`?c.tokens.pending:n===`semantic`?Nf(c.tokens.semantic,.33):c.tokens.structural},linkWidth:e=>e.table===`pending`?2:e.table===`semantic`?1.5:.8,linkLineDash:e=>e.table===`pending`?[4,4]:null,nodeLabel:e=>`${e.type}: ${e.name}`,nodeCanvasObject:(e,n,r)=>{let i=e,a=Pf(i),d=i.x??0,f=i.y??0;if(i.is_hub){let e=a+3+(i.hubness??0)*4;n.beginPath(),n.arc(d,f,e,0,2*Math.PI),n.strokeStyle=Nf(c.tokens.hub,.55),n.lineWidth=1.5,n.stroke()}let p=1500,m=s?.get(i.id);if(m!==void 0){let e=Date.now()-m;if(e<p){let r=1-e/p,i=a+6+(1-r)*18;n.beginPath(),n.arc(d,f,i,0,2*Math.PI),n.strokeStyle=Nf(c.tokens.pulse,Number(r.toFixed(2))),n.lineWidth=2,n.stroke()}}n.beginPath(),n.arc(d,f,a,0,2*Math.PI),n.fillStyle=g===`community`?u(i.community_id):l(i.type),n.fill(),o===i.id&&(n.beginPath(),n.arc(d,f,a+4,0,2*Math.PI),n.strokeStyle=c.tokens.accent,n.lineWidth=2,n.stroke()),(r>1.2||i.is_hub)&&(n.fillStyle=i.is_hub?c.tokens.hub:c.tokens.text,n.font=`${(i.is_hub?11:10)/r}px ui-sans-serif`,n.fillText(i.name,d+a+2,f+3))},onNodeClick:(e,r)=>{let i=r;n(e.id,i?{x:i.clientX,y:i.clientY}:void 0)},onLinkHover:e=>{w(e?.pending??null)},onLinkClick:(e,n)=>{E({x:n.clientX,y:n.clientY})}}),C&&T&&(0,$.jsxs)(`div`,{style:{position:`fixed`,left:T.x+12,top:T.y+12,background:`var(--surface2)`,border:`1px solid ${c.tokens.pending}`,borderRadius:10,padding:12,maxWidth:320,zIndex:20,fontSize:12,color:`var(--text)`,boxShadow:`0 12px 32px rgba(0,0,0,0.45)`},children:[(0,$.jsx)(`div`,{style:{color:`var(--pending)`,marginBottom:6,fontWeight:600},children:`pending edge`}),(0,$.jsxs)(`div`,{style:{color:`var(--muted)`,marginBottom:6},children:[C.provenance,` · `,C.kind,` · weight `,C.weight.toFixed(2)]}),(0,$.jsx)(`div`,{style:{marginBottom:8},children:C.rationale}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:6},children:[(0,$.jsx)(`button`,{onClick:()=>{r(C.id),w(null),E(null)},style:{background:`var(--success)`,color:`var(--bg)`,border:`none`,borderRadius:6,padding:`5px 12px`,cursor:`pointer`,fontSize:11,fontWeight:600},children:`accept`}),(0,$.jsx)(`button`,{onClick:()=>{i(C.id),w(null),E(null)},style:{background:`var(--surface)`,color:`var(--text)`,border:`1px solid var(--border)`,borderRadius:6,padding:`5px 12px`,cursor:`pointer`,fontSize:11},children:`reject`})]})]})]})}var If=e=>e.toFixed(2);function Lf({id:e,onClose:n,onJump:r}){let[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(null);(0,v.useEffect)(()=>{a(null),s([]),l(null),Promise.all([fetch(`/api/node/${encodeURIComponent(e)}`).then(e=>e.json()),fetch(`/api/node/${encodeURIComponent(e)}/pull?k=6`).then(e=>e.json())]).then(([e,n])=>{a(e),s(n)}).catch(e=>l(e instanceof Error?e.message:String(e)))},[e]);let u=i?.data&&typeof i.data.filePath==`string`?i.data.filePath:null,d=i?.data&&typeof i.data.signature==`string`?i.data.signature:null;return(0,$.jsxs)(`aside`,{style:{position:`absolute`,top:52,right:0,bottom:0,width:360,background:`color-mix(in srgb, var(--bg) 94%, transparent)`,backdropFilter:`blur(8px)`,borderLeft:`1px solid var(--border)`,padding:20,overflowY:`auto`,zIndex:9},children:[(0,$.jsxs)(`header`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`baseline`},children:[(0,$.jsx)(`h2`,{style:{margin:0,fontSize:16},children:i?.name??`…`}),(0,$.jsx)(`button`,{onClick:n,style:{background:`transparent`,border:`none`,color:`var(--muted)`,cursor:`pointer`,fontSize:18},children:`×`})]}),c&&(0,$.jsx)(`p`,{style:{color:`var(--danger)`},children:c}),i&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{style:{color:`var(--muted)`,fontSize:12,marginBottom:12},children:[(0,$.jsx)(`code`,{style:{color:`var(--accent)`},children:i.type}),u&&(0,$.jsxs)($.Fragment,{children:[` · `,(0,$.jsx)(`span`,{children:u})]})]}),d&&(0,$.jsx)(`pre`,{style:{background:`var(--surface)`,padding:8,borderRadius:4,fontSize:12,whiteSpace:`pre-wrap`,margin:`8px 0`},children:d}),(0,$.jsxs)(`section`,{style:{marginTop:16},children:[(0,$.jsx)(`h3`,{style:{fontSize:13,color:`var(--muted)`,textTransform:`uppercase`,letterSpacing:.5},children:`Neighbors`}),(0,$.jsxs)(`ul`,{style:{listStyle:`none`,padding:0,margin:0},children:[Object.entries(i.neighbor_counts).map(([e,n])=>(0,$.jsxs)(`li`,{style:{display:`flex`,justifyContent:`space-between`,padding:`2px 0`},children:[(0,$.jsx)(`span`,{children:e}),(0,$.jsx)(`span`,{style:{color:`var(--muted)`},children:n})]},e)),Object.keys(i.neighbor_counts).length===0&&(0,$.jsx)(`li`,{style:{color:`var(--muted)`},children:`(none)`})]})]}),(0,$.jsxs)(`section`,{style:{marginTop:16},children:[(0,$.jsx)(`h3`,{style:{fontSize:13,color:`var(--muted)`,textTransform:`uppercase`,letterSpacing:.5},children:`Magnetic pull`}),(0,$.jsxs)(`ul`,{style:{listStyle:`none`,padding:0,margin:0},children:[o.map(e=>(0,$.jsxs)(`li`,{onClick:()=>r(e.nodeId),style:{padding:`4px 0`,cursor:`pointer`,fontSize:12},children:[(0,$.jsxs)(`div`,{style:{color:`var(--accent)`},children:[e.nodeId.slice(0,28),`…`]}),(0,$.jsxs)(`div`,{style:{color:`var(--muted)`},children:[`score `,If(e.score),` · s `,If(e.components.structural),` · e`,` `,If(e.components.semantic),` · r `,If(e.components.recency)]})]},e.nodeId)),o.length===0&&(0,$.jsx)(`li`,{style:{color:`var(--muted)`},children:`(none)`})]})]})]})]})}function Rf({nodeId:e,x:n,y:r,onClose:i,onJump:a,onOpenDetail:o}){let[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)([]);if((0,v.useEffect)(()=>{let n=!1;return(async()=>{try{let[r,i]=await Promise.all([fetch(`/api/node/${encodeURIComponent(e)}`),fetch(`/api/node/${encodeURIComponent(e)}/pull?k=6`)]);if(!r.ok||!i.ok)return;let a=await r.json(),o=await i.json();if(n)return;c(a);let s=await Promise.all(o.map(async e=>{let n=await fetch(`/api/node/${encodeURIComponent(e.nodeId)}`);if(!n.ok)return null;let r=await n.json();return{entry:e,name:r.name,kind:r.type}}));n||u(s.filter(e=>e!==null))}catch{}})(),()=>{n=!0}},[e]),(0,v.useEffect)(()=>{let e=e=>{e.key===`Escape`&&i()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]),!s)return null;let d=Math.min(Math.max(n+16,8),window.innerWidth-320-8),f=Math.min(Math.max(r+16,8),window.innerHeight-280-8),p=Object.values(s.neighbor_counts).reduce((e,n)=>e+n,0);return(0,$.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{position:`fixed`,left:d,top:f,width:320,zIndex:25,background:`var(--surface2)`,border:`1px solid var(--border)`,borderRadius:8,boxShadow:`0 10px 30px rgba(0,0,0,0.5)`,color:`var(--text)`,fontSize:12},children:[(0,$.jsxs)(`div`,{style:{padding:12,borderBottom:`1px solid var(--border)`},children:[(0,$.jsx)(`div`,{style:{fontWeight:600,fontSize:13},children:s.name}),(0,$.jsxs)(`div`,{style:{color:`var(--muted)`,marginTop:2},children:[(0,$.jsx)(`span`,{style:{color:`var(--accent)`},children:s.type}),s.data?.filePath&&(0,$.jsxs)($.Fragment,{children:[` · `,s.data.filePath]})]}),s.data?.signature&&(0,$.jsx)(`div`,{style:{color:`var(--muted)`,fontFamily:`ui-monospace, monospace`,fontSize:11,marginTop:4,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:s.data.signature}),(0,$.jsxs)(`div`,{style:{color:`var(--muted)`,marginTop:4,fontSize:11},children:[p,` neighbor`,p===1?``:`s`,s.neighbor_counts.contains?` · ${s.neighbor_counts.contains} contains`:``,s.neighbor_counts.references?` · ${s.neighbor_counts.references} refs`:``]})]}),(0,$.jsxs)(`div`,{style:{padding:`8px 12px`},children:[(0,$.jsx)(`div`,{style:{color:`var(--muted)`,fontSize:10,marginBottom:4,textTransform:`uppercase`},children:`magnetic pull`}),l.length===0&&(0,$.jsx)(`div`,{style:{color:`var(--muted)`},children:`no nearby anchors`}),l.map(e=>(0,$.jsxs)(`div`,{onClick:()=>a(e.entry.nodeId),style:{display:`flex`,gap:8,alignItems:`baseline`,padding:`3px 0`,cursor:`pointer`},title:`s=${e.entry.components.structural.toFixed(2)} m=${e.entry.components.semantic.toFixed(2)} r=${e.entry.components.recency.toFixed(2)}`,children:[(0,$.jsx)(`span`,{style:{color:`var(--hub)`,minWidth:36,fontSize:11},children:e.entry.score.toFixed(2)}),(0,$.jsx)(`span`,{style:{flex:1,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.name}),(0,$.jsx)(`span`,{style:{color:`var(--muted)`,fontSize:10},children:e.kind})]},e.entry.nodeId))]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:8,padding:8,borderTop:`1px solid var(--border)`,justifyContent:`space-between`},children:[(0,$.jsx)(`button`,{onClick:o,style:{background:`var(--surface)`,color:`var(--text)`,border:`none`,borderRadius:4,padding:`4px 10px`,cursor:`pointer`,fontSize:11},children:`open details`}),(0,$.jsx)(`button`,{onClick:i,style:{background:`transparent`,color:`var(--muted)`,border:`none`,cursor:`pointer`,fontSize:11},children:`esc`})]})]})}function zf({onPick:e}){let[n,r]=(0,v.useState)(!1),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(0),u=(0,v.useRef)(null);if((0,v.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`?(e.preventDefault(),r(e=>!e)):e.key===`Escape`&&r(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[]),(0,v.useEffect)(()=>{n?setTimeout(()=>u.current?.focus(),0):(a(``),s([]),l(0))},[n]),(0,v.useEffect)(()=>{if(!n||!i.trim()){s([]);return}let e=!1,r=setTimeout(async()=>{try{let n=await(await fetch(`/api/search?q=${encodeURIComponent(i)}&limit=12`)).json();e||(s(n),l(0))}catch{e||s([])}},80);return()=>{e=!0,clearTimeout(r)}},[i,n]),!n)return null;let d=n=>{n&&(e(n.id),r(!1))};return(0,$.jsx)(`div`,{onClick:()=>r(!1),style:{position:`fixed`,inset:0,background:`rgba(0,0,0,0.4)`,zIndex:30,display:`flex`,alignItems:`flex-start`,justifyContent:`center`,paddingTop:`15vh`},children:(0,$.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{width:560,maxWidth:`90vw`,background:`var(--surface2)`,border:`1px solid var(--border)`,borderRadius:8,boxShadow:`0 20px 60px rgba(0,0,0,0.5)`,overflow:`hidden`},children:[(0,$.jsx)(`input`,{ref:u,value:i,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`ArrowDown`?(e.preventDefault(),l(e=>Math.min(o.length-1,e+1))):e.key===`ArrowUp`?(e.preventDefault(),l(e=>Math.max(0,e-1))):e.key===`Enter`&&(e.preventDefault(),d(o[c]))},placeholder:`Search anchors (name, qualified name, alias)…`,style:{width:`100%`,padding:`14px 18px`,background:`transparent`,border:`none`,borderBottom:`1px solid var(--border)`,color:`var(--text)`,fontSize:15,outline:`none`}}),(0,$.jsxs)(`div`,{style:{maxHeight:`40vh`,overflowY:`auto`},children:[o.length===0&&i.trim()&&(0,$.jsx)(`div`,{style:{padding:16,color:`var(--muted)`,fontSize:12},children:`no matches`}),o.map((e,n)=>(0,$.jsxs)(`div`,{onClick:()=>d(e),onMouseEnter:()=>l(n),style:{padding:`8px 18px`,background:n===c?`var(--surface)`:`transparent`,cursor:`pointer`,fontSize:13,color:`var(--text)`,display:`flex`,gap:10,alignItems:`baseline`},children:[(0,$.jsx)(`span`,{style:{color:`var(--accent)`,minWidth:80,fontSize:11},children:e.type}),(0,$.jsx)(`span`,{style:{flex:1},children:e.name}),e.data?.filePath&&(0,$.jsx)(`span`,{style:{color:`var(--muted)`,fontSize:11},children:e.data.filePath})]},e.id))]}),(0,$.jsx)(`div`,{style:{padding:`6px 18px`,borderTop:`1px solid var(--border)`,color:`var(--muted)`,fontSize:11},children:`↑↓ navigate · ⏎ select · esc close · ⌘K toggle`})]})})}function Bf(){let{theme:e,themeId:n,setThemeId:r,themes:i}=Mf(),[a,o]=(0,v.useState)(!1),s=(0,v.useRef)(null);return(0,v.useEffect)(()=>{if(!a)return;let e=e=>{s.current&&!s.current.contains(e.target)&&o(!1)},n=e=>e.key===`Escape`&&o(!1);return window.addEventListener(`mousedown`,e),window.addEventListener(`keydown`,n),()=>{window.removeEventListener(`mousedown`,e),window.removeEventListener(`keydown`,n)}},[a]),(0,$.jsxs)(`div`,{ref:s,style:{position:`relative`},children:[(0,$.jsx)(`button`,{onClick:()=>o(e=>!e),title:`Theme`,"aria-label":`Theme settings`,style:{background:a?`var(--surface2)`:`transparent`,color:`var(--muted)`,border:`1px solid var(--border)`,borderRadius:8,width:28,height:28,display:`grid`,placeItems:`center`,cursor:`pointer`,fontSize:14,lineHeight:1},children:`⚙`}),a&&(0,$.jsxs)(`div`,{style:{position:`absolute`,top:36,right:0,width:200,background:`var(--surface2)`,border:`1px solid var(--border)`,borderRadius:10,boxShadow:`0 12px 32px rgba(0,0,0,0.45)`,padding:6,zIndex:40},children:[(0,$.jsx)(`div`,{style:{fontSize:10,textTransform:`uppercase`,letterSpacing:.6,color:`var(--muted)`,padding:`4px 8px`},children:`Theme`}),i.map(e=>{let i=e.id===n;return(0,$.jsxs)(`button`,{onClick:()=>r(e.id),style:{display:`flex`,alignItems:`center`,gap:10,width:`100%`,background:i?`var(--surface)`:`transparent`,border:`none`,borderRadius:6,padding:`7px 8px`,cursor:`pointer`,color:`var(--text)`,fontSize:13,textAlign:`left`},children:[(0,$.jsx)(`span`,{"aria-hidden":!0,style:{width:12,height:12,borderRadius:`50%`,flexShrink:0,background:e.tokens.accent,border:`2px solid ${e.tokens.bg}`,boxShadow:`0 0 0 1px ${e.tokens.border}`}}),(0,$.jsx)(`span`,{style:{flex:1},children:e.name}),i&&(0,$.jsx)(`span`,{style:{color:`var(--accent)`},children:`✓`})]},e.id)})]})]})}function Vf(){let[e,n]=(0,v.useState)(null),[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(null),[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)(null),[d,f]=(0,v.useState)(!1),[p,m]=(0,v.useState)(()=>new Map),[h,g]=(0,v.useState)(null),_=async()=>{try{let[e,r]=await Promise.all([fetch(`/api/status`).then(e=>e.json()),fetch(`/api/graph?limit=2000`).then(e=>e.json())]);n(e),i(r),g(null)}catch(e){g(e instanceof Error?e.message:String(e))}};return(0,v.useEffect)(()=>{_();let e=new WebSocket(`ws://${location.host}/ws`);return e.addEventListener(`message`,e=>{let n=JSON.parse(e.data);if(n.type===`db:changed`&&_(),n.type===`activation:fired`&&n.payload?.ids){let e=Date.now();m(r=>{let i=new Map(r);for(let r of n.payload.ids)i.set(r,e);return i}),setTimeout(()=>{m(e=>{let n=new Map,r=Date.now()-1500;for(let[i,a]of e)a>r&&n.set(i,a);return n})},1600)}}),()=>e.close()},[]),(0,v.useEffect)(()=>{let e=()=>{let e=location.hash.replace(/^#/,``);e&&(o(e),c({id:e,ts:Date.now()}))};return e(),window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),(0,v.useEffect)(()=>{let e=a?`#${a}`:``;location.hash!==e&&history.replaceState(null,``,`${location.pathname}${location.search}${e}`)},[a]),(0,v.useEffect)(()=>{fetch(`/api/selection`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({node_id:a})})},[a]),(0,$.jsxs)(`div`,{style:{position:`fixed`,inset:0},children:[(0,$.jsxs)(`header`,{style:{position:`absolute`,top:0,left:0,right:0,height:44,padding:`0 16px`,background:`color-mix(in srgb, var(--bg) 82%, transparent)`,backdropFilter:`blur(8px)`,borderBottom:`1px solid var(--border)`,zIndex:10,display:`flex`,gap:14,alignItems:`center`},children:[(0,$.jsxs)(`span`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[(0,$.jsx)(`span`,{"aria-hidden":!0,style:{width:9,height:9,borderRadius:`50%`,background:`var(--accent)`,boxShadow:`0 0 8px var(--accent)`}}),(0,$.jsx)(`strong`,{style:{color:`var(--text)`,letterSpacing:.2},children:`Rig`})]}),e&&(0,$.jsxs)(`span`,{style:{color:`var(--muted)`,fontSize:12},children:[e.nodes.toLocaleString(),` nodes ·`,` `,(e.edges_structural+e.edges_semantic).toLocaleString(),` edges ·`,` `,e.files.toLocaleString(),` files`]}),a&&(0,$.jsx)(`span`,{style:{color:`var(--accent)`,fontSize:11,fontFamily:`ui-monospace, monospace`,maxWidth:220,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:a}),r&&r.pending_edges.length>0&&(0,$.jsxs)(`span`,{style:{color:`var(--pending)`,fontSize:11,border:`1px solid var(--pending)`,borderRadius:999,padding:`1px 8px`},children:[r.pending_edges.length,` pending`]}),h&&(0,$.jsxs)(`span`,{style:{color:`var(--danger)`,fontSize:12},children:[`error: `,h]}),(0,$.jsxs)(`span`,{style:{marginLeft:`auto`,display:`flex`,gap:8,alignItems:`center`},children:[(0,$.jsx)(`button`,{onClick:async()=>{await fetch(`/api/undo`,{method:`POST`}),await _()},style:{background:`var(--surface)`,color:`var(--text)`,border:`1px solid var(--border)`,borderRadius:8,padding:`5px 12px`,cursor:`pointer`,fontSize:12},children:`Undo`}),(0,$.jsx)(Bf,{})]})]}),r&&r.nodes.length>0&&(0,$.jsx)(Ff,{snapshot:r,onSelect:(e,n)=>{o(e),u(n?{id:e,x:n.x,y:n.y}:null)},focusToken:s,selectedId:a,pulses:p,onAccept:async e=>{await fetch(`/api/pending-edges/${e}/accept`,{method:`POST`}),await _()},onReject:async e=>{await fetch(`/api/pending-edges/${e}/reject`,{method:`POST`}),await _()}}),l&&(0,$.jsx)(Rf,{nodeId:l.id,x:l.x,y:l.y,onClose:()=>u(null),onJump:e=>{o(e),c({id:e,ts:Date.now()}),u(null)},onOpenDetail:()=>{f(!0),u(null)}}),(0,$.jsx)(zf,{onPick:e=>{o(e),c({id:e,ts:Date.now()})}}),(0,$.jsx)(`kbd`,{style:{position:`absolute`,bottom:12,left:12,padding:`5px 10px`,background:`color-mix(in srgb, var(--surface) 88%, transparent)`,border:`1px solid var(--border)`,borderRadius:8,color:`var(--muted)`,fontSize:11,fontFamily:`ui-monospace, monospace`,zIndex:10},children:`⌘K to search`}),a&&d&&(0,$.jsx)(Lf,{id:a,onClose:()=>f(!1),onJump:e=>{o(e),c({id:e,ts:Date.now()})}}),r&&r.nodes.length===0&&(0,$.jsx)(`div`,{style:{position:`absolute`,inset:0,display:`grid`,placeItems:`center`,textAlign:`center`,color:`var(--muted)`},children:(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`p`,{style:{fontSize:15,color:`var(--text)`,margin:`0 0 6px`},children:`The graph is empty.`}),(0,$.jsxs)(`p`,{style:{margin:0},children:[`Run`,` `,(0,$.jsx)(`code`,{style:{color:`var(--accent)`,background:`var(--surface)`,border:`1px solid var(--border)`,borderRadius:6,padding:`2px 6px`,fontFamily:`ui-monospace, monospace`},children:`rig index`}),` `,`in your project, then refresh.`]})]})})]})}function Hf({children:e}){let[n,r]=(0,v.useState)(`checking`),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(null);if((0,v.useEffect)(()=>{(async()=>{try{let e=await fetch(`/api/session/me`,{credentials:`include`});r(e.ok||e.status===404?`authed`:`unauthed`)}catch{r(`unauthed`)}})()},[]),n===`checking`)return(0,$.jsx)($.Fragment,{});if(n===`authed`)return(0,$.jsx)($.Fragment,{children:e});let c=async()=>{let e=i.trim();if(!e)return;let n=await fetch(`/auth?t=${encodeURIComponent(e)}`,{credentials:`include`,redirect:`manual`});n.status===302||n.ok?location.reload():s(`invalid token`)};return(0,$.jsx)(`div`,{style:{position:`fixed`,inset:0,background:`var(--bg)`,color:`var(--text)`,display:`flex`,alignItems:`center`,justifyContent:`center`,zIndex:50},children:(0,$.jsxs)(`div`,{style:{maxWidth:480,padding:32,border:`1px solid var(--border)`,borderRadius:8,background:`var(--surface2)`},children:[(0,$.jsx)(`h1`,{style:{margin:0,fontSize:20,color:`var(--accent)`},children:`Rig — sign in`}),(0,$.jsxs)(`p`,{style:{color:`var(--muted)`,marginTop:12},children:[`The map requires a session token. Tokens live in `,(0,$.jsx)(`code`,{children:`.rig/.runtime`}),` and rotate when you delete that file.`]}),(0,$.jsx)(`h3`,{style:{fontSize:13,color:`var(--text)`,marginTop:24,marginBottom:8},children:`Option 1 — open via your AI agent`}),(0,$.jsxs)(`p`,{style:{color:`var(--muted)`,fontSize:12,margin:0},children:[`In Claude Code / Cursor / Codex, ask:`,` `,(0,$.jsx)(`span`,{style:{color:`var(--accent)`},children:`"open the rig map"`}),` — your agent will call`,` `,(0,$.jsx)(`code`,{children:`rig_session_token`}),` and hand you a one-click login URL.`]}),(0,$.jsx)(`h3`,{style:{fontSize:13,color:`var(--text)`,marginTop:24,marginBottom:8},children:`Option 2 — paste the token`}),(0,$.jsxs)(`p`,{style:{color:`var(--muted)`,fontSize:12,margin:`0 0 8px`},children:[(0,$.jsx)(`code`,{children:`cat .rig/.runtime`}),` in your project directory.`]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:8},children:[(0,$.jsx)(`input`,{value:i,onChange:e=>{a(e.target.value),s(null)},onKeyDown:e=>{e.key===`Enter`&&c()},placeholder:`paste token here`,style:{flex:1,padding:`6px 10px`,background:`var(--bg)`,border:`1px solid ${o?`var(--danger)`:`var(--border)`}`,borderRadius:4,color:`var(--text)`,fontSize:13,fontFamily:`ui-monospace, monospace`,outline:`none`}}),(0,$.jsx)(`button`,{onClick:()=>void c(),style:{padding:`6px 14px`,background:`var(--accent)`,color:`var(--accent-text)`,border:`none`,borderRadius:4,cursor:`pointer`,fontSize:13,fontWeight:600},children:`sign in`})]}),o&&(0,$.jsx)(`div`,{style:{color:`var(--danger)`,fontSize:12,marginTop:6},children:o})]})})}var Uf=document.getElementById(`root`);if(!Uf)throw Error(`root mount missing`);(0,y.createRoot)(Uf).render((0,$.jsx)(v.StrictMode,{children:(0,$.jsx)(jf,{children:(0,$.jsx)(Hf,{children:(0,$.jsx)(Vf,{})})})}));
54
+ In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Vd(e,n){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),r.push.apply(r,i)}return r}function Hd(e){for(var n=1;n<arguments.length;n++){var r=arguments[n]==null?{}:arguments[n];n%2?Vd(Object(r),!0).forEach(function(n){Z(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Vd(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function Ud(e,n){return Nd(e)||Rd(e,n)||Jd(e,n)||zd()}function Wd(e){return Pd(e)||Ld(e)||Jd(e)||Bd()}function Gd(e,n){if(typeof e!=`object`||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var i=r.call(e,n);if(typeof i!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(n===`string`?String:Number)(e)}function Kd(e){var n=Gd(e,`string`);return typeof n==`symbol`?n:n+``}function qd(e){"@babel/helpers - typeof";return qd=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},qd(e)}function Jd(e,n){if(e){if(typeof e==`string`)return Md(e,n);var r={}.toString.call(e).slice(8,-1);return r===`Object`&&e.constructor&&(r=e.constructor.name),r===`Map`||r===`Set`?Array.from(e):r===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Md(e,n):void 0}}var Yd=Od(Ad);function Xd(e,n,r){!n||typeof r!=`string`||e.filter(function(e){return!e[r]}).forEach(function(e){e[r]=Yd(n(e))})}function Zd(e,n){var r=e.nodes,i=e.links,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},o=a.nodeFilter,s=o===void 0?function(){return!0}:o,c=a.onLoopError,l=c===void 0?function(e){throw`Invalid DAG structure! Found cycle in node path: ${e.join(` -> `)}.`}:c,u={};r.forEach(function(e){return u[n(e)]={data:e,out:[],depth:-1,skip:!s(e)}}),i.forEach(function(e){var r=e.source,i=e.target,a=l(r),o=l(i);if(!u.hasOwnProperty(a))throw`Missing source node with id: ${a}`;if(!u.hasOwnProperty(o))throw`Missing target node with id: ${o}`;var s=u[a],c=u[o];s.out.push(c);function l(e){return qd(e)===`object`?n(e):e}});var d=[];return f(Object.values(u)),Object.assign.apply(Object,[{}].concat(Wd(Object.entries(u).filter(function(e){return!Ud(e,2)[1].skip}).map(function(e){var n=Ud(e,2),r=n[0],i=n[1];return Z({},r,i.depth)}))));function f(e){for(var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,a=function(){var a=e[o];if(r.indexOf(a)!==-1){var s=[].concat(Wd(r.slice(r.indexOf(a))),[a]).map(function(e){return n(e.data)});return d.some(function(e){return e.length===s.length&&e.every(function(e,n){return e===s[n]})})||(d.push(s),l(s)),1}i>a.depth&&(a.depth=i,f(a.out,[].concat(Wd(r),[a]),i+ +!a.skip))},o=0,s=e.length;o<s;o++)if(a())continue}}var Qd=2,$d=function(e,n){return n.onNeedsRedraw&&n.onNeedsRedraw()},ef=function(e,n){if(!n.isShadow){var r=F(n.linkDirectionalParticles);n.graphData.links.forEach(function(e){var n=Math.round(Math.abs(r(e)));n?e.__photons=Wd(Array(n)).map(function(){return{}}):delete e.__photons})}},tf=Zo({props:{graphData:{default:{nodes:[],links:[]},onChange:function(e,n){n.engineRunning=!1,ef(e,n)}},dagMode:{onChange:function(e,n){!e&&(n.graphData.nodes||[]).forEach(function(e){e.fx=e.fy=void 0})}},dagLevelDistance:{},dagNodeFilter:{default:function(e){return!0}},onDagError:{triggerUpdate:!1},nodeRelSize:{default:4,triggerUpdate:!1,onChange:$d},nodeId:{default:`id`},nodeVal:{default:`val`,triggerUpdate:!1,onChange:$d},nodeColor:{default:`color`,triggerUpdate:!1,onChange:$d},nodeAutoColorBy:{},nodeCanvasObject:{triggerUpdate:!1,onChange:$d},nodeCanvasObjectMode:{default:function(){return`replace`},triggerUpdate:!1,onChange:$d},nodeVisibility:{default:!0,triggerUpdate:!1,onChange:$d},linkSource:{default:`source`},linkTarget:{default:`target`},linkVisibility:{default:!0,triggerUpdate:!1,onChange:$d},linkColor:{default:`color`,triggerUpdate:!1,onChange:$d},linkAutoColorBy:{},linkLineDash:{triggerUpdate:!1,onChange:$d},linkWidth:{default:1,triggerUpdate:!1,onChange:$d},linkCurvature:{default:0,triggerUpdate:!1,onChange:$d},linkCanvasObject:{triggerUpdate:!1,onChange:$d},linkCanvasObjectMode:{default:function(){return`replace`},triggerUpdate:!1,onChange:$d},linkDirectionalArrowLength:{default:0,triggerUpdate:!1,onChange:$d},linkDirectionalArrowColor:{triggerUpdate:!1,onChange:$d},linkDirectionalArrowRelPos:{default:.5,triggerUpdate:!1,onChange:$d},linkDirectionalParticles:{default:0,triggerUpdate:!1,onChange:ef},linkDirectionalParticleSpeed:{default:.01,triggerUpdate:!1},linkDirectionalParticleOffset:{default:0,triggerUpdate:!1},linkDirectionalParticleWidth:{default:4,triggerUpdate:!1},linkDirectionalParticleColor:{triggerUpdate:!1},linkDirectionalParticleCanvasObject:{triggerUpdate:!1},globalScale:{default:1,triggerUpdate:!1},d3AlphaMin:{default:0,triggerUpdate:!1},d3AlphaDecay:{default:.0228,triggerUpdate:!1,onChange:function(e,n){n.forceLayout.alphaDecay(e)}},d3AlphaTarget:{default:0,triggerUpdate:!1,onChange:function(e,n){n.forceLayout.alphaTarget(e)}},d3VelocityDecay:{default:.4,triggerUpdate:!1,onChange:function(e,n){n.forceLayout.velocityDecay(e)}},warmupTicks:{default:0,triggerUpdate:!1},cooldownTicks:{default:1/0,triggerUpdate:!1},cooldownTime:{default:15e3,triggerUpdate:!1},onUpdate:{default:function(){},triggerUpdate:!1},onFinishUpdate:{default:function(){},triggerUpdate:!1},onEngineTick:{default:function(){},triggerUpdate:!1},onEngineStop:{default:function(){},triggerUpdate:!1},onNeedsRedraw:{triggerUpdate:!1},isShadow:{default:!1,triggerUpdate:!1}},methods:{d3Force:function(e,n,r){return r===void 0?e.forceLayout.force(n):(e.forceLayout.force(n,r),this)},d3ReheatSimulation:function(e){return e.forceLayout.alpha(1),this.resetCountdown(),this},resetCountdown:function(e){return e.cntTicks=0,e.startTickTime=new Date,e.engineRunning=!0,this},isEngineRunning:function(e){return!!e.engineRunning},tickFrame:function(e){return!e.isShadow&&n(),i(),!e.isShadow&&a(),!e.isShadow&&o(),r(),this;function n(){e.engineRunning&&(++e.cntTicks>e.cooldownTicks||new Date-e.startTickTime>e.cooldownTime||e.d3AlphaMin>0&&e.forceLayout.alpha()<e.d3AlphaMin?(e.engineRunning=!1,e.onEngineStop()):(e.forceLayout.tick(),e.onEngineTick()))}function r(){var n=F(e.nodeVisibility),r=F(e.nodeVal),i=F(e.nodeColor),a=F(e.nodeCanvasObjectMode),o=e.ctx,s=e.isShadow/e.globalScale,c=e.graphData.nodes.filter(n);o.save(),c.forEach(function(n){var c=a(n);if(e.nodeCanvasObject&&(c===`before`||c===`replace`)&&(e.nodeCanvasObject(n,o,e.globalScale),c===`replace`)){o.restore();return}var l=Math.sqrt(Math.max(0,r(n)||1))*e.nodeRelSize+s;o.beginPath(),o.arc(n.x,n.y,l,0,2*Math.PI,!1),o.fillStyle=i(n)||`rgba(31, 120, 180, 0.92)`,o.fill(),e.nodeCanvasObject&&c===`after`&&e.nodeCanvasObject(n,e.ctx,e.globalScale)}),o.restore()}function i(){var n=F(e.linkVisibility),r=F(e.linkColor),i=F(e.linkWidth),a=F(e.linkLineDash),o=F(e.linkCurvature),s=F(e.linkCanvasObjectMode),c=e.ctx,l=e.isShadow*2,u=e.graphData.links.filter(n);u.forEach(_);var d=[],f=[],p=u;if(e.linkCanvasObject){var m=[],h=[];u.forEach(function(e){return({before:d,after:f,replace:m}[s(e)]||h).push(e)}),p=[].concat(Wd(d),f,h),d=d.concat(m)}c.save(),d.forEach(function(n){return e.linkCanvasObject(n,c,e.globalScale)}),c.restore();var g=Td(p,[r,i,a]);c.save(),Object.entries(g).forEach(function(n){var r=Ud(n,2),i=r[0],o=r[1],s=!i||i===`undefined`?`rgba(0,0,0,0.15)`:i;Object.entries(o).forEach(function(n){var r=Ud(n,2),i=r[0],o=r[1],u=(i||1)/e.globalScale+l;Object.entries(o).forEach(function(e){var n=Ud(e,2);n[0];var r=n[1],i=a(r[0]);c.beginPath(),r.forEach(function(e){var n=e.source,r=e.target;if(!(!n||!r||!n.hasOwnProperty(`x`)||!r.hasOwnProperty(`x`))){c.moveTo(n.x,n.y);var i=e.__controlPoints;i?c[i.length===2?`quadraticCurveTo`:`bezierCurveTo`].apply(c,Wd(i).concat([r.x,r.y])):c.lineTo(r.x,r.y)}}),c.strokeStyle=s,c.lineWidth=u,c.setLineDash(i||[]),c.stroke()})})}),c.restore(),c.save(),f.forEach(function(n){return e.linkCanvasObject(n,c,e.globalScale)}),c.restore();function _(e){var n=o(e);if(!n){e.__controlPoints=null;return}var r=e.source,i=e.target;if(!(!r||!i||!r.hasOwnProperty(`x`)||!i.hasOwnProperty(`x`))){var a=Math.sqrt((i.x-r.x)**2+(i.y-r.y)**2);if(a>0){var s=Math.atan2(i.y-r.y,i.x-r.x),c=a*n,l={x:(r.x+i.x)/2+c*Math.cos(s-Math.PI/2),y:(r.y+i.y)/2+c*Math.sin(s-Math.PI/2)};e.__controlPoints=[l.x,l.y]}else{var u=n*70;e.__controlPoints=[i.x,i.y-u,i.x+u,i.y]}}}}function a(){var n=1.6,r=.2,i=F(e.linkDirectionalArrowLength),a=F(e.linkDirectionalArrowRelPos),o=F(e.linkVisibility),s=F(e.linkDirectionalArrowColor||e.linkColor),c=F(e.nodeVal),l=e.ctx;l.save(),e.graphData.links.filter(o).forEach(function(o){var u=i(o);if(!(!u||u<0)){var d=o.source,f=o.target;if(!(!d||!f||!d.hasOwnProperty(`x`)||!f.hasOwnProperty(`x`))){var p=Math.sqrt(Math.max(0,c(d)||1))*e.nodeRelSize,m=Math.sqrt(Math.max(0,c(f)||1))*e.nodeRelSize,h=Math.min(1,Math.max(0,a(o))),g=s(o)||`rgba(0,0,0,0.28)`,_=u/n/2,v=o.__controlPoints&&Fd(dd,[d.x,d.y].concat(Wd(o.__controlPoints),[f.x,f.y])),y=v?function(e){return v.get(e)}:function(e){return{x:d.x+(f.x-d.x)*e||0,y:d.y+(f.y-d.y)*e||0}},b=v?v.length():Math.sqrt((f.x-d.x)**2+(f.y-d.y)**2),x=p+u+(b-p-m-u)*h,S=y(x/b),C=y((x-u)/b),w=y((x-u*(1-r))/b),T=Math.atan2(S.y-C.y,S.x-C.x)-Math.PI/2;l.beginPath(),l.moveTo(S.x,S.y),l.lineTo(C.x+_*Math.cos(T),C.y+_*Math.sin(T)),l.lineTo(w.x,w.y),l.lineTo(C.x-_*Math.cos(T),C.y-_*Math.sin(T)),l.fillStyle=g,l.fill()}}}),l.restore()}function o(){var n=F(e.linkDirectionalParticles),r=F(e.linkDirectionalParticleSpeed),i=F(e.linkDirectionalParticleOffset),a=F(e.linkDirectionalParticleWidth),o=F(e.linkVisibility),s=F(e.linkDirectionalParticleColor||e.linkColor),c=e.ctx;c.save(),e.graphData.links.filter(o).forEach(function(o){var l=n(o);if(!(!o.hasOwnProperty(`__photons`)||!o.__photons.length)){var u=o.source,d=o.target;if(!(!u||!d||!u.hasOwnProperty(`x`)||!d.hasOwnProperty(`x`))){var f=r(o),p=Math.abs(i(o)),m=o.__photons||[],h=Math.max(0,a(o)/2)/Math.sqrt(e.globalScale);c.fillStyle=s(o)||`rgba(0,0,0,0.28)`;var g=o.__controlPoints?Fd(dd,[u.x,u.y].concat(Wd(o.__controlPoints),[d.x,d.y])):null,_=0,v=!1;m.forEach(function(n){var r=!!n.__singleHop;if(n.hasOwnProperty(`__progressRatio`)||(n.__progressRatio=r?+(f<0):(_+p)/l),!r&&_++,n.__progressRatio+=f,n.__progressRatio>=1||n.__progressRatio<0)if(!r)n.__progressRatio%=1,n.__progressRatio<0&&n.__progressRatio++;else{v=!0;return}var i=n.__progressRatio,a=g?g.get(i):{x:u.x+(d.x-u.x)*i||0,y:u.y+(d.y-u.y)*i||0};e.linkDirectionalParticleCanvasObject?e.linkDirectionalParticleCanvasObject(a.x,a.y,o,c,e.globalScale):(c.beginPath(),c.arc(a.x,a.y,h,0,2*Math.PI,!1),c.fill())}),v&&(o.__photons=o.__photons.filter(function(e){return!e.__singleHop||e.__progressRatio<=1&&e.__progressRatio>=0}))}}}),c.restore()}},emitParticle:function(e,n){return n&&(!n.__photons&&(n.__photons=[]),n.__photons.push({__singleHop:!0})),this}},stateInit:function(){return{forceLayout:zu().force(`link`,Du()).force(`charge`,Bu()).force(`center`,hl()).force(`dagRadial`,null).stop(),engineRunning:!1}},init:function(e,n){n.ctx=e},update:function(e,n){e.engineRunning=!1,e.onUpdate(),e.nodeAutoColorBy!==null&&Xd(e.graphData.nodes,F(e.nodeAutoColorBy),e.nodeColor),e.linkAutoColorBy!==null&&Xd(e.graphData.links,F(e.linkAutoColorBy),e.linkColor),e.graphData.links.forEach(function(n){n.source=n[e.linkSource],n.target=n[e.linkTarget]}),e.forceLayout.stop().alpha(1).nodes(e.graphData.nodes);var r=e.forceLayout.force(`link`);r&&r.id(function(n){return n[e.nodeId]}).links(e.graphData.links);var i=e.dagMode&&Zd(e.graphData,function(n){return n[e.nodeId]},{nodeFilter:e.dagNodeFilter,onLoopError:e.onDagError||void 0}),a=Math.max.apply(Math,Wd(Object.values(i||[]))),o=e.dagLevelDistance||e.graphData.nodes.length/(a||1)*Qd*([`radialin`,`radialout`].indexOf(e.dagMode)===-1?1:.7);if([`lr`,`rl`,`td`,`bu`].includes(n.dagMode)){var s=[`lr`,`rl`].includes(n.dagMode)?`fx`:`fy`;e.graphData.nodes.filter(e.dagNodeFilter).forEach(function(e){return delete e[s]})}if([`lr`,`rl`,`td`,`bu`].includes(e.dagMode)){var c=[`rl`,`bu`].includes(e.dagMode),l=function(n){return(i[n[e.nodeId]]-a/2)*o*(c?-1:1)},u=[`lr`,`rl`].includes(e.dagMode)?`fx`:`fy`;e.graphData.nodes.filter(e.dagNodeFilter).forEach(function(e){return e[u]=l(e)})}e.forceLayout.force(`dagRadial`,[`radialin`,`radialout`].indexOf(e.dagMode)===-1?null:Vu(function(n){var r=i[n[e.nodeId]]||-1;return(e.dagMode===`radialin`?a-r:r)*o}).strength(function(n){return+!!e.dagNodeFilter(n)}));for(var d=0;d<e.warmupTicks&&!(e.d3AlphaMin>0&&e.forceLayout.alpha()<e.d3AlphaMin);d++)e.forceLayout.tick();this.resetCountdown(),e.onFinishUpdate()}});function nf(e,n){var r=e instanceof Array?e:[e],i=new n;return i._destructor&&i._destructor(),{linkProp:function(e){return{default:i[e](),onChange:function(n,i){r.forEach(function(r){return i[r][e](n)})},triggerUpdate:!1}},linkMethod:function(e){return function(n){var i=[...arguments].slice(1),a=[];return r.forEach(function(r){var o=n[r],s=o[e].apply(o,i);s!==o&&a.push(s)}),a.length?a[0]:this}}}}var rf=800,af=4,of=5,sf=nf(`forceGraph`,tf),cf=nf([`forceGraph`,`shadowGraph`],tf),lf=Object.assign.apply(Object,Wd(`nodeColor.nodeAutoColorBy.nodeCanvasObject.nodeCanvasObjectMode.linkColor.linkAutoColorBy.linkLineDash.linkWidth.linkCanvasObject.linkCanvasObjectMode.linkDirectionalArrowLength.linkDirectionalArrowColor.linkDirectionalArrowRelPos.linkDirectionalParticles.linkDirectionalParticleSpeed.linkDirectionalParticleOffset.linkDirectionalParticleWidth.linkDirectionalParticleColor.linkDirectionalParticleCanvasObject.dagMode.dagLevelDistance.dagNodeFilter.onDagError.d3AlphaMin.d3AlphaDecay.d3VelocityDecay.warmupTicks.cooldownTicks.cooldownTime.onEngineTick.onEngineStop`.split(`.`).map(function(e){return Z({},e,sf.linkProp(e))})).concat(Wd([`nodeRelSize`,`nodeId`,`nodeVal`,`nodeVisibility`,`linkSource`,`linkTarget`,`linkVisibility`,`linkCurvature`].map(function(e){return Z({},e,cf.linkProp(e))})))),uf=Object.assign.apply(Object,Wd([`d3Force`,`d3ReheatSimulation`,`emitParticle`].map(function(e){return Z({},e,sf.linkMethod(e))})));function df(e){if(e.canvas){var n=e.canvas.width,r=e.canvas.height;n===300&&r===150&&(n=r=0);var i=window.devicePixelRatio;n/=i,r/=i,[e.canvas,e.shadowCanvas].forEach(function(a){a.style.width=`${e.width}px`,a.style.height=`${e.height}px`,a.width=e.width*i,a.height=e.height*i,!n&&!r&&a.getContext(`2d`).scale(i,i)});var a=Fa(e.canvas).k;e.zoom.translateBy(e.zoom.__baseElem,(e.width-n)/2/a,(e.height-r)/2/a),e.needsRedraw=!0}}function ff(e){var n=window.devicePixelRatio;e.setTransform(n,0,0,n,0,0)}function pf(e,n,r){e.save(),ff(e),e.clearRect(0,0,n,r),e.restore()}var mf=Zo({props:Hd({width:{default:window.innerWidth,onChange:function(e,n){return df(n)},triggerUpdate:!1},height:{default:window.innerHeight,onChange:function(e,n){return df(n)},triggerUpdate:!1},graphData:{default:{nodes:[],links:[]},onChange:function(e,n){[e.nodes,e.links].every(function(e){return(e||[]).every(function(e){return!e.hasOwnProperty(`__indexColor`)})})&&n.colorTracker.reset(),[{type:`Node`,objs:e.nodes},{type:`Link`,objs:e.links}].forEach(r),n.forceGraph.graphData(e),n.shadowGraph.graphData(e);function r(e){var r=e.type;e.objs.filter(function(e){if(!e.hasOwnProperty(`__indexColor`))return!0;var r=n.colorTracker.lookup(e.__indexColor);return!r||!r.hasOwnProperty(`d`)||r.d!==e}).forEach(function(e){e.__indexColor=n.colorTracker.register({type:r,d:e})})}},triggerUpdate:!1},backgroundColor:{onChange:function(e,n){n.canvas&&e&&(n.canvas.style.background=e)},triggerUpdate:!1},nodeLabel:{default:`name`,triggerUpdate:!1},nodePointerAreaPaint:{onChange:function(e,n){n.shadowGraph.nodeCanvasObject(e?function(n,r,i){return e(n,n.__indexColor,r,i)}:null),n.flushShadowCanvas&&n.flushShadowCanvas()},triggerUpdate:!1},linkPointerAreaPaint:{onChange:function(e,n){n.shadowGraph.linkCanvasObject(e?function(n,r,i){return e(n,n.__indexColor,r,i)}:null),n.flushShadowCanvas&&n.flushShadowCanvas()},triggerUpdate:!1},linkLabel:{default:`name`,triggerUpdate:!1},linkHoverPrecision:{default:4,triggerUpdate:!1},minZoom:{default:.01,onChange:function(e,n){n.zoom.scaleExtent([e,n.zoom.scaleExtent()[1]])},triggerUpdate:!1},maxZoom:{default:1e3,onChange:function(e,n){n.zoom.scaleExtent([n.zoom.scaleExtent()[0],e])},triggerUpdate:!1},enableNodeDrag:{default:!0,triggerUpdate:!1},enableZoomInteraction:{default:!0,triggerUpdate:!1},enablePanInteraction:{default:!0,triggerUpdate:!1},enableZoomPanInteraction:{default:!0,triggerUpdate:!1},enablePointerInteraction:{default:!0,onChange:function(e,n){n.hoverObj=null},triggerUpdate:!1},autoPauseRedraw:{default:!0,triggerUpdate:!1},onNodeDrag:{default:function(){},triggerUpdate:!1},onNodeDragEnd:{default:function(){},triggerUpdate:!1},onNodeClick:{triggerUpdate:!1},onNodeRightClick:{triggerUpdate:!1},onNodeHover:{triggerUpdate:!1},onLinkClick:{triggerUpdate:!1},onLinkRightClick:{triggerUpdate:!1},onLinkHover:{triggerUpdate:!1},onBackgroundClick:{triggerUpdate:!1},onBackgroundRightClick:{triggerUpdate:!1},showPointerCursor:{default:!0,triggerUpdate:!1},onZoom:{triggerUpdate:!1},onZoomEnd:{triggerUpdate:!1},onRenderFramePre:{triggerUpdate:!1},onRenderFramePost:{triggerUpdate:!1}},lf),aliases:{stopAnimation:`pauseAnimation`},methods:Hd({graph2ScreenCoords:function(e,n,r){var i=Fa(e.canvas);return{x:n*i.k+i.x,y:r*i.k+i.y}},screen2GraphCoords:function(e,n,r){var i=Fa(e.canvas);return{x:(n-i.x)/i.k,y:(r-i.y)/i.k}},centerAt:function(e,n,r,i){if(!e.canvas)return null;if(n!==void 0||r!==void 0){var a=Object.assign({},n===void 0?{}:{x:n},r===void 0?{}:{y:r});return i?e.tweenGroup.add(new Bo(o()).to(a,i).easing(Po.Quadratic.Out).onUpdate(s).onComplete(function(){e.tweenGroup.remove(this)}).start()):s(a),this}return o();function o(){var n=Fa(e.canvas);return{x:(e.width/2-n.x)/n.k,y:(e.height/2-n.y)/n.k}}function s(n){var r=n.x,i=n.y;e.zoom.translateTo(e.zoom.__baseElem,r===void 0?o().x:r,i===void 0?o().y:i),e.needsRedraw=!0}},zoom:function(e,n,r){if(!e.canvas)return null;if(n!==void 0)return r?e.tweenGroup.add(new Bo({k:i()}).to({k:n},r).easing(Po.Quadratic.Out).onUpdate(function(e){var n=e.k;return a(n)}).onComplete(function(){e.tweenGroup.remove(this)}).start()):a(n),this;return i();function i(){return Fa(e.canvas).k}function a(n){e.zoom.scaleTo(e.zoom.__baseElem,n),e.needsRedraw=!0}},zoomToFit:function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:10,i=[...arguments].slice(3),a=this.getGraphBbox.apply(this,i);if(a){var o={x:(a.x[0]+a.x[1])/2,y:(a.y[0]+a.y[1])/2},s=Math.max(1e-12,Math.min(0xe8d4a51000,(e.width-r*2)/(a.x[1]-a.x[0]),(e.height-r*2)/(a.y[1]-a.y[0])));this.centerAt(o.x,o.y,n),this.zoom(s,n)}return this},getGraphBbox:function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(){return!0},r=F(e.nodeVal),i=function(n){return Math.sqrt(Math.max(0,r(n)||1))*e.nodeRelSize},a=e.graphData.nodes.filter(n).map(function(e){return{x:e.x,y:e.y,r:i(e)}});return a.length?{x:[Za(a,function(e){return e.x-e.r}),Xa(a,function(e){return e.x+e.r})],y:[Za(a,function(e){return e.y-e.r}),Xa(a,function(e){return e.y+e.r})]}:null},pauseAnimation:function(e){return e.animationFrameRequestId&&=(cancelAnimationFrame(e.animationFrameRequestId),null),this},resumeAnimation:function(e){return e.animationFrameRequestId||this._animationCycle(),this},_destructor:function(){this.pauseAnimation(),this.graphData({nodes:[],links:[]})}},uf),stateInit:function(){return{lastSetZoom:1,zoom:Wa(),forceGraph:new tf,shadowGraph:new tf().cooldownTicks(0).nodeColor(`__indexColor`).linkColor(`__indexColor`).isShadow(!0),colorTracker:new sc,tweenGroup:new Io}},init:function(e,n){var r=this;e.innerHTML=``;var i=document.createElement(`div`);i.classList.add(`force-graph-container`),i.style.position=`relative`,e.appendChild(i),n.canvas=document.createElement(`canvas`),n.backgroundColor&&(n.canvas.style.background=n.backgroundColor),i.appendChild(n.canvas),n.shadowCanvas=document.createElement(`canvas`);var a=n.canvas.getContext(`2d`),o=n.shadowCanvas.getContext(`2d`,{willReadFrequently:!0}),s={x:-0xe8d4a51000,y:-0xe8d4a51000},c=function(){var e=null,r=window.devicePixelRatio,i=s.x>0&&s.y>0?o.getImageData(s.x*r,s.y*r,1,1):null;return i&&(e=n.colorTracker.lookup(i.data)),e};mn(n.canvas).call(Fn().subject(function(){if(!n.enableNodeDrag)return null;var e=c();return e&&e.type===`Node`?e.d:null}).on(`start`,function(e){var r=e.subject;r.__initialDragPos={x:r.x,y:r.y,fx:r.fx,fy:r.fy},e.active||(r.fx=r.x,r.fy=r.y),n.canvas.classList.add(`grabbable`)}).on(`drag`,function(e){var r=e.subject,i=r.__initialDragPos,a=e,o=Fa(n.canvas).k,s={x:i.x+(a.x-i.x)/o-r.x,y:i.y+(a.y-i.y)/o-r.y};[`x`,`y`].forEach(function(e){return r[`f${e}`]=r[e]=i[e]+(a[e]-i[e])/o}),!(!r.__dragged&&of>=Math.sqrt(Qa([`x`,`y`].map(function(n){return(e[n]-i[n])**2}))))&&(n.forceGraph.d3AlphaTarget(.3).resetCountdown(),n.isPointerDragging=!0,r.__dragged=!0,n.onNodeDrag(r,s))}).on(`end`,function(e){var r=e.subject,i=r.__initialDragPos,a={x:r.x-i.x,y:r.y-i.y};i.fx===void 0&&(r.fx=void 0),i.fy===void 0&&(r.fy=void 0),delete r.__initialDragPos,n.forceGraph.d3AlphaTarget()&&n.forceGraph.d3AlphaTarget(0).resetCountdown(),n.canvas.classList.remove(`grabbable`),n.isPointerDragging=!1,r.__dragged&&(delete r.__dragged,n.onNodeDragEnd(r,a))})),n.zoom(n.zoom.__baseElem=mn(n.canvas)),n.zoom.__baseElem.on(`dblclick.zoom`,null),n.zoom.filter(function(e){return!e.button&&n.enableZoomPanInteraction&&(e.type!==`wheel`||F(n.enableZoomInteraction)(e))&&(e.type===`wheel`||F(n.enablePanInteraction)(e))}).on(`zoom`,function(e){var i=e.transform;[a,o].forEach(function(e){ff(e),e.translate(i.x,i.y),e.scale(i.k,i.k)}),n.isPointerDragging=!0,n.onZoom&&n.onZoom(Hd(Hd({},i),r.centerAt())),n.needsRedraw=!0}).on(`end`,function(e){n.isPointerDragging=!1,n.onZoomEnd&&n.onZoomEnd(Hd(Hd({},e.transform),r.centerAt()))}),df(n),n.forceGraph.onNeedsRedraw(function(){return n.needsRedraw=!0}).onFinishUpdate(function(){Fa(n.canvas).k===n.lastSetZoom&&n.graphData.nodes.length&&(n.zoom.scaleTo(n.zoom.__baseElem,n.lastSetZoom=af/Math.cbrt(n.graphData.nodes.length)),n.needsRedraw=!0)}),n.tooltip=new ml(i),[`pointermove`,`pointerdown`].forEach(function(e){return i.addEventListener(e,function(r){e===`pointerdown`&&(n.isPointerPressed=!0,n.pointerDownEvent=r),!n.isPointerDragging&&r.type===`pointermove`&&n.onBackgroundClick&&(r.pressure>0||n.isPointerPressed)&&(r.pointerType===`mouse`||r.movementX===void 0||[r.movementX,r.movementY].some(function(e){return Math.abs(e)>1}))&&(n.isPointerDragging=!0);var a=o(i);s.x=r.pageX-a.left,s.y=r.pageY-a.top;function o(e){var n=e.getBoundingClientRect(),r=window.pageXOffset||document.documentElement.scrollLeft,i=window.pageYOffset||document.documentElement.scrollTop;return{top:n.top+i,left:n.left+r}}},{passive:!0})}),i.addEventListener(`pointerup`,function(e){if(n.isPointerPressed){if(n.isPointerPressed=!1,n.isPointerDragging){n.isPointerDragging=!1;return}var r=[e,n.pointerDownEvent];requestAnimationFrame(function(){if(e.button===0)if(n.hoverObj){var i=n[`on${n.hoverObj.type}Click`];i&&i.apply(void 0,[n.hoverObj.d].concat(r))}else n.onBackgroundClick&&n.onBackgroundClick.apply(n,r);if(e.button===2)if(n.hoverObj){var a=n[`on${n.hoverObj.type}RightClick`];a&&a.apply(void 0,[n.hoverObj.d].concat(r))}else n.onBackgroundRightClick&&n.onBackgroundRightClick.apply(n,r)})}},{passive:!0}),i.addEventListener(`contextmenu`,function(e){return!n.onBackgroundRightClick&&!n.onNodeRightClick&&!n.onLinkRightClick?!0:(e.preventDefault(),!1)}),n.forceGraph(a),n.shadowGraph(o);var l=No(function(){pf(o,n.width,n.height),n.shadowGraph.linkWidth(function(e){return F(n.linkWidth)(e)+n.linkHoverPrecision});var e=Fa(n.canvas);n.shadowGraph.globalScale(e.k).tickFrame()},rf);n.flushShadowCanvas=l.flush,(this._animationCycle=function e(){var r=!n.autoPauseRedraw||!!n.needsRedraw||n.forceGraph.isEngineRunning()||n.graphData.links.some(function(e){return e.__photons&&e.__photons.length});if(n.needsRedraw=!1,n.enablePointerInteraction){var i=n.isPointerDragging?null:c();if(i!==n.hoverObj){var o=n.hoverObj,s=o?o.type:null,u=i?i.type:null;if(s&&s!==u){var d=n[`on${s}Hover`];d&&d(null,o.d)}if(u){var f=n[`on${u}Hover`];f&&f(i.d,s===u?o.d:null)}n.tooltip.content(i&&F(n[`${i.type.toLowerCase()}Label`])(i.d)||null),n.canvas.classList[(i&&n[`on${u}Click`]||!i&&n.onBackgroundClick)&&F(n.showPointerCursor)(i?.d)?`add`:`remove`](`clickable`),n.hoverObj=i}r&&l()}if(r){pf(a,n.width,n.height);var p=Fa(n.canvas).k;n.onRenderFramePre&&n.onRenderFramePre(a,p),n.forceGraph.globalScale(p).tickFrame(),n.onRenderFramePost&&n.onRenderFramePost(a,p)}n.tweenGroup.update(),n.animationFrameRequestId=requestAnimationFrame(e)})()},update:function(e){}}),hf=s(((e,n)=>{n.exports=`SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED`})),gf=s(((e,n)=>{var r=hf();function i(){}function a(){}a.resetWarningCache=i,n.exports=function(){function e(e,n,i,a,o,s){if(s!==r){var c=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw c.name=`Invariant Violation`,c}}e.isRequired=e;function n(){return e}var o={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:n,element:e,elementType:e,instanceOf:n,node:e,objectOf:n,oneOf:n,oneOfType:n,shape:n,exact:n,checkPropTypes:a,resetWarningCache:i};return o.PropTypes=o,o}})),Q=l(s(((e,n)=>{n.exports=gf()()}))(),1),_f={width:Q.default.number,height:Q.default.number,graphData:Q.default.shape({nodes:Q.default.arrayOf(Q.default.object).isRequired,links:Q.default.arrayOf(Q.default.object).isRequired}),backgroundColor:Q.default.string,nodeRelSize:Q.default.number,nodeId:Q.default.string,nodeLabel:Q.default.oneOfType([Q.default.string,Q.default.func]),nodeVal:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),nodeVisibility:Q.default.oneOfType([Q.default.bool,Q.default.string,Q.default.func]),nodeColor:Q.default.oneOfType([Q.default.string,Q.default.func]),nodeAutoColorBy:Q.default.oneOfType([Q.default.string,Q.default.func]),onNodeHover:Q.default.func,onNodeClick:Q.default.func,linkSource:Q.default.string,linkTarget:Q.default.string,linkLabel:Q.default.oneOfType([Q.default.string,Q.default.func]),linkVisibility:Q.default.oneOfType([Q.default.bool,Q.default.string,Q.default.func]),linkColor:Q.default.oneOfType([Q.default.string,Q.default.func]),linkAutoColorBy:Q.default.oneOfType([Q.default.string,Q.default.func]),linkWidth:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkCurvature:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalArrowLength:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalArrowColor:Q.default.oneOfType([Q.default.string,Q.default.func]),linkDirectionalArrowRelPos:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticles:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticleSpeed:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticleOffset:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticleWidth:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkDirectionalParticleColor:Q.default.oneOfType([Q.default.string,Q.default.func]),onLinkHover:Q.default.func,onLinkClick:Q.default.func,dagMode:Q.default.oneOf([`td`,`bu`,`lr`,`rl`,`zin`,`zout`,`radialin`,`radialout`]),dagLevelDistance:Q.default.number,dagNodeFilter:Q.default.func,onDagError:Q.default.func,d3AlphaMin:Q.default.number,d3AlphaDecay:Q.default.number,d3VelocityDecay:Q.default.number,warmupTicks:Q.default.number,cooldownTicks:Q.default.number,cooldownTime:Q.default.number,onEngineTick:Q.default.func,onEngineStop:Q.default.func,getGraphBbox:Q.default.func},vf={zoomToFit:Q.default.func,onNodeRightClick:Q.default.func,onNodeDrag:Q.default.func,onNodeDragEnd:Q.default.func,onLinkRightClick:Q.default.func,linkHoverPrecision:Q.default.number,onBackgroundClick:Q.default.func,onBackgroundRightClick:Q.default.func,showPointerCursor:Q.default.oneOfType([Q.default.bool,Q.default.func]),enablePointerInteraction:Q.default.bool,enableNodeDrag:Q.default.bool},yf={showNavInfo:Q.default.bool,nodeOpacity:Q.default.number,nodeResolution:Q.default.number,nodeThreeObject:Q.default.oneOfType([Q.default.object,Q.default.string,Q.default.func]),nodeThreeObjectExtend:Q.default.oneOfType([Q.default.bool,Q.default.string,Q.default.func]),nodePositionUpdate:Q.default.func,linkOpacity:Q.default.number,linkResolution:Q.default.number,linkCurveRotation:Q.default.oneOfType([Q.default.number,Q.default.string,Q.default.func]),linkMaterial:Q.default.oneOfType([Q.default.object,Q.default.string,Q.default.func]),linkThreeObject:Q.default.oneOfType([Q.default.object,Q.default.string,Q.default.func]),linkThreeObjectExtend:Q.default.oneOfType([Q.default.bool,Q.default.string,Q.default.func]),linkPositionUpdate:Q.default.func,linkDirectionalArrowResolution:Q.default.number,linkDirectionalParticleResolution:Q.default.number,linkDirectionalParticleThreeObject:Q.default.oneOfType([Q.default.object,Q.default.string,Q.default.func]),forceEngine:Q.default.oneOf([`d3`,`ngraph`]),ngraphPhysics:Q.default.object,numDimensions:Q.default.oneOf([1,2,3])},bf=Object.assign({},_f,vf,{linkLineDash:Q.default.oneOfType([Q.default.arrayOf(Q.default.number),Q.default.string,Q.default.func]),nodeCanvasObjectMode:Q.default.oneOfType([Q.default.string,Q.default.func]),nodeCanvasObject:Q.default.func,nodePointerAreaPaint:Q.default.func,linkCanvasObjectMode:Q.default.oneOfType([Q.default.string,Q.default.func]),linkCanvasObject:Q.default.func,linkPointerAreaPaint:Q.default.func,linkDirectionalParticleCanvasObject:Q.default.func,autoPauseRedraw:Q.default.bool,minZoom:Q.default.number,maxZoom:Q.default.number,enableZoomInteraction:Q.default.oneOfType([Q.default.bool,Q.default.func]),enablePanInteraction:Q.default.oneOfType([Q.default.bool,Q.default.func]),onZoom:Q.default.func,onZoomEnd:Q.default.func,onRenderFramePre:Q.default.func,onRenderFramePost:Q.default.func});Object.assign({},_f,vf,yf,{enableNavigationControls:Q.default.bool,controlType:Q.default.oneOf([`trackball`,`orbit`,`fly`]),rendererConfig:Q.default.object,extraRenderers:Q.default.arrayOf(Q.default.shape({render:Q.default.func.isRequired}))}),Object.assign({},_f,yf,{nodeDesc:Q.default.oneOfType([Q.default.string,Q.default.func]),linkDesc:Q.default.oneOfType([Q.default.string,Q.default.func])}),Object.assign({},_f,yf,{markerAttrs:Q.default.object,yOffset:Q.default.number,glScale:Q.default.number});var xf=A(mf,{methodNames:[`emitParticle`,`d3Force`,`d3ReheatSimulation`,`stopAnimation`,`pauseAnimation`,`resumeAnimation`,`centerAt`,`zoom`,`zoomToFit`,`getGraphBbox`,`screen2GraphCoords`,`graph2ScreenCoords`]});xf.displayName=`ForceGraph2D`,xf.propTypes=bf;var Sf={file:`#94a3b8`,module:`#a78bfa`,"markdown-section":`#fcd34d`,class:`#fbbf24`,function:`#34d399`,method:`#60a5fa`,property:`#f472b6`,variable:`#f87171`,constant:`#fb923c`,enum:`#c084fc`,interface:`#22d3ee`,type_alias:`#22d3ee`,cluster:`#ec4899`},Cf=[`#60a5fa`,`#34d399`,`#fbbf24`,`#f472b6`,`#a78bfa`,`#fb923c`,`#22d3ee`,`#c084fc`,`#ec4899`,`#facc15`,`#4ade80`,`#f87171`,`#818cf8`,`#fcd34d`,`#2dd4bf`,`#e879f9`],wf=[{id:`observatory`,name:`Observatory`,scheme:`dark`,tokens:{bg:`#0a0c10`,surface:`#12151c`,surface2:`#171b24`,border:`#232834`,text:`#e6e9ef`,muted:`#7d8694`,accent:`#38e1c6`,accentText:`#04110e`,hub:`#f5b544`,structural:`#2c3340`,semantic:`#38e1c6`,pending:`#f5b544`,pulse:`#f472b6`,danger:`#f87171`,success:`#34d399`},nodeKinds:Sf,community:Cf},{id:`warm`,name:`Warm instrument`,scheme:`dark`,tokens:{bg:`#0d0b09`,surface:`#17130f`,surface2:`#1d1813`,border:`#2b2620`,text:`#ece6dd`,muted:`#8a8175`,accent:`#f5a623`,accentText:`#1a1206`,hub:`#ffd27d`,structural:`#3a332a`,semantic:`#5ec8c0`,pending:`#f5a623`,pulse:`#ff9e7d`,danger:`#f08a6c`,success:`#7fce8c`},nodeKinds:Sf,community:Cf},{id:`nebula`,name:`Indigo nebula`,scheme:`dark`,tokens:{bg:`#0b0a14`,surface:`#15131f`,surface2:`#1b1828`,border:`#272336`,text:`#e8e6f0`,muted:`#837e98`,accent:`#b16cff`,accentText:`#120a1f`,hub:`#fbbf24`,structural:`#322c47`,semantic:`#7c6cff`,pending:`#fbbf24`,pulse:`#f472b6`,danger:`#f87171`,success:`#4ade80`},nodeKinds:Sf,community:Cf},{id:`light`,name:`Daylight`,scheme:`light`,tokens:{bg:`#eef1f5`,surface:`#ffffff`,surface2:`#ffffff`,border:`#d4dae2`,text:`#1b2430`,muted:`#5f6b7a`,accent:`#0ea5a0`,accentText:`#ffffff`,hub:`#b45309`,structural:`#b8c1cd`,semantic:`#0ea5a0`,pending:`#b45309`,pulse:`#db2777`,danger:`#dc2626`,success:`#059669`},nodeKinds:{...Sf,"markdown-section":`#d97706`,class:`#d97706`},community:Cf}],Tf=`observatory`,Ef=e=>wf.find(n=>n.id===e)??wf[0],Df=s((e=>{var n=Symbol.for(`react.transitional.element`),r=Symbol.for(`react.fragment`);function i(e,r,i){var a=null;if(i!==void 0&&(a=``+i),r.key!==void 0&&(a=``+r.key),`key`in r)for(var o in i={},r)o!==`key`&&(i[o]=r[o]);else i=r;return r=i.ref,{$$typeof:n,type:e,key:a,ref:r===void 0?null:r,props:i}}e.Fragment=r,e.jsx=i,e.jsxs=i})),$=s(((e,n)=>{n.exports=Df()}))(),Of=(0,v.createContext)(null),kf=e=>{let n=document.documentElement;for(let[r,i]of Object.entries(e.tokens))n.style.setProperty(`--${Af(r)}`,i);n.style.setProperty(`color-scheme`,e.scheme)},Af=e=>e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`);function jf({children:e}){let[n,r]=(0,v.useState)(Tf),[i,a]=(0,v.useState)(!1),o=Ef(n);return(0,v.useEffect)(()=>{let e=!1;return fetch(`/api/config`).then(e=>e.ok?e.json():null).then(n=>{!e&&n?.theme&&wf.some(e=>e.id===n.theme)&&r(n.theme)}).catch(()=>{}).finally(()=>!e&&a(!0)),()=>{e=!0}},[]),(0,v.useEffect)(()=>kf(o),[o]),(0,$.jsx)(Of.Provider,{value:{theme:o,themeId:n,setThemeId:e=>{r(e),fetch(`/api/config`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({theme:e})})},themes:wf},children:e})}function Mf(){let e=(0,v.useContext)(Of);if(!e)throw Error(`useTheme must be used within ThemeProvider`);return e}var Nf=(e,n)=>{let r=e.replace(`#`,``);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${n})`},Pf=e=>4+Math.max(0,Math.min(1,e.pull_score))*14+(e.is_hub?6+(e.hubness??0)*8:0);function Ff({snapshot:e,onSelect:n,onAccept:r,onReject:i,focusToken:a,selectedId:o,pulses:s}){let{theme:c}=Mf(),l=e=>c.nodeKinds[e]??c.tokens.muted,u=e=>e===void 0?c.tokens.muted:c.community[e%c.community.length],d=(0,v.useMemo)(()=>Array.from(new Set(e.nodes.map(e=>e.type))).sort((e,n)=>e.localeCompare(n)),[e.nodes]),[f,p]=(0,v.useState)(new Set),[m,h]=(0,v.useState)(!1),[g,_]=(0,v.useState)(`kind`),y=(0,v.useMemo)(()=>{let n=e.nodes.filter(e=>m&&!e.is_hub?!1:!f.has(e.type)),r=new Set(n.map(e=>e.id)),i=n.map(e=>({...e})),a=e=>r.has(e.src)&&r.has(e.dst);return{nodes:i,links:[...e.edges_structural.filter(a).map(e=>({source:e.src,target:e.dst,table:`structural`})),...e.edges_semantic.filter(a).map(e=>({source:e.src,target:e.dst,table:`semantic`,weight:e.weight})),...e.pending_edges.filter(e=>r.has(e.src)&&r.has(e.dst)).map(e=>({source:e.src,target:e.dst,table:`pending`,pending:e}))]}},[e,f,m]),b=(0,v.useRef)(),[x,S]=(0,v.useState)({w:800,h:600}),[C,w]=(0,v.useState)(null),[T,E]=(0,v.useState)(null);(0,v.useEffect)(()=>{let e=()=>S({w:window.innerWidth,h:window.innerHeight});return e(),window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),(0,v.useEffect)(()=>{if(!a)return;let e=y.nodes.find(e=>e.id===a.id);!e||e.x===void 0||e.y===void 0||(b.current?.centerAt(e.x,e.y,600),b.current?.zoom(4,600))},[a,y.nodes]),(0,v.useEffect)(()=>{!s||s.size===0||b.current?.d3ReheatSimulation()},[s]),(0,v.useEffect)(()=>{b.current?.d3ReheatSimulation()},[c]);let ee=e=>{p(n=>{let r=new Set(n);return r.has(e)?r.delete(e):r.add(e),r})};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{style:{position:`absolute`,top:52,left:12,zIndex:10,display:`flex`,flexWrap:`wrap`,gap:6,maxWidth:`calc(100vw - 24px)`},children:[(0,$.jsx)(`button`,{onClick:()=>h(e=>!e),title:`Show only hub nodes`,style:{padding:`4px 10px`,fontSize:11,border:`1px solid ${m?c.tokens.hub:`var(--border)`}`,borderRadius:999,background:m?c.tokens.hub:`var(--surface)`,color:m?c.tokens.bg:c.tokens.hub,cursor:`pointer`},children:m?`◉ hubs only`:`○ hubs only`}),(0,$.jsxs)(`button`,{onClick:()=>_(e=>e===`kind`?`community`:`kind`),title:`Toggle node coloring between anchor kind and community`,style:{padding:`4px 10px`,fontSize:11,border:`1px solid var(--border)`,borderRadius:999,background:`var(--surface)`,color:g===`community`?`var(--accent)`:`var(--muted)`,cursor:`pointer`},children:[`color: `,g]}),d.map(e=>{let n=f.has(e);return(0,$.jsx)(`button`,{onClick:()=>ee(e),style:{padding:`4px 10px`,fontSize:11,border:`1px solid ${n?`var(--border)`:l(e)}`,borderRadius:999,background:n?`var(--surface)`:Nf(l(e),.13),color:n?`var(--muted)`:l(e),cursor:`pointer`,opacity:n?.5:1},children:e},e)})]}),(0,$.jsx)(xf,{ref:b,width:x.w,height:x.h,graphData:y,backgroundColor:c.tokens.bg,nodeId:`id`,linkColor:e=>{let n=e.table;return n===`pending`?c.tokens.pending:n===`semantic`?Nf(c.tokens.semantic,.33):c.tokens.structural},linkWidth:e=>e.table===`pending`?2:e.table===`semantic`?1.5:.8,linkLineDash:e=>e.table===`pending`?[4,4]:null,nodeLabel:e=>`${e.type}: ${e.name}`,nodeCanvasObject:(e,n,r)=>{let i=e,a=Pf(i),d=i.x??0,f=i.y??0;if(i.is_hub){let e=a+3+(i.hubness??0)*4;n.beginPath(),n.arc(d,f,e,0,2*Math.PI),n.strokeStyle=Nf(c.tokens.hub,.55),n.lineWidth=1.5,n.stroke()}let p=1500,m=s?.get(i.id);if(m!==void 0){let e=Date.now()-m;if(e<p){let r=1-e/p,i=a+6+(1-r)*18;n.beginPath(),n.arc(d,f,i,0,2*Math.PI),n.strokeStyle=Nf(c.tokens.pulse,Number(r.toFixed(2))),n.lineWidth=2,n.stroke()}}n.beginPath(),n.arc(d,f,a,0,2*Math.PI),n.fillStyle=g===`community`?u(i.community_id):l(i.type),n.fill(),o===i.id&&(n.beginPath(),n.arc(d,f,a+4,0,2*Math.PI),n.strokeStyle=c.tokens.accent,n.lineWidth=2,n.stroke()),(r>1.2||i.is_hub)&&(n.fillStyle=i.is_hub?c.tokens.hub:c.tokens.text,n.font=`${(i.is_hub?11:10)/r}px ui-sans-serif`,n.fillText(i.name,d+a+2,f+3))},onNodeClick:(e,r)=>{let i=r;n(e.id,i?{x:i.clientX,y:i.clientY}:void 0)},onLinkHover:e=>{w(e?.pending??null)},onLinkClick:(e,n)=>{E({x:n.clientX,y:n.clientY})}}),C&&T&&(0,$.jsxs)(`div`,{style:{position:`fixed`,left:T.x+12,top:T.y+12,background:`var(--surface2)`,border:`1px solid ${c.tokens.pending}`,borderRadius:10,padding:12,maxWidth:320,zIndex:20,fontSize:12,color:`var(--text)`,boxShadow:`0 12px 32px rgba(0,0,0,0.45)`},children:[(0,$.jsx)(`div`,{style:{color:`var(--pending)`,marginBottom:6,fontWeight:600},children:`pending edge`}),(0,$.jsxs)(`div`,{style:{color:`var(--muted)`,marginBottom:6},children:[C.provenance,` · `,C.kind,` · weight `,C.weight.toFixed(2)]}),(0,$.jsx)(`div`,{style:{marginBottom:8},children:C.rationale}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:6},children:[(0,$.jsx)(`button`,{onClick:()=>{r(C.id),w(null),E(null)},style:{background:`var(--success)`,color:`var(--bg)`,border:`none`,borderRadius:6,padding:`5px 12px`,cursor:`pointer`,fontSize:11,fontWeight:600},children:`accept`}),(0,$.jsx)(`button`,{onClick:()=>{i(C.id),w(null),E(null)},style:{background:`var(--surface)`,color:`var(--text)`,border:`1px solid var(--border)`,borderRadius:6,padding:`5px 12px`,cursor:`pointer`,fontSize:11},children:`reject`})]})]})]})}var If=e=>e.toFixed(2);function Lf({id:e,onClose:n,onJump:r}){let[i,a]=(0,v.useState)(null),[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(null);(0,v.useEffect)(()=>{a(null),s([]),l(null),Promise.all([fetch(`/api/node/${encodeURIComponent(e)}`).then(e=>e.json()),fetch(`/api/node/${encodeURIComponent(e)}/pull?k=6`).then(e=>e.json())]).then(([e,n])=>{a(e),s(n)}).catch(e=>l(e instanceof Error?e.message:String(e)))},[e]);let u=i?.data&&typeof i.data.filePath==`string`?i.data.filePath:null,d=i?.data&&typeof i.data.signature==`string`?i.data.signature:null;return(0,$.jsxs)(`aside`,{style:{position:`absolute`,top:52,right:0,bottom:0,width:360,background:`color-mix(in srgb, var(--bg) 94%, transparent)`,backdropFilter:`blur(8px)`,borderLeft:`1px solid var(--border)`,padding:20,overflowY:`auto`,zIndex:9},children:[(0,$.jsxs)(`header`,{style:{display:`flex`,justifyContent:`space-between`,alignItems:`baseline`},children:[(0,$.jsx)(`h2`,{style:{margin:0,fontSize:16},children:i?.name??`…`}),(0,$.jsx)(`button`,{onClick:n,style:{background:`transparent`,border:`none`,color:`var(--muted)`,cursor:`pointer`,fontSize:18},children:`×`})]}),c&&(0,$.jsx)(`p`,{style:{color:`var(--danger)`},children:c}),i&&(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(`div`,{style:{color:`var(--muted)`,fontSize:12,marginBottom:12},children:[(0,$.jsx)(`code`,{style:{color:`var(--accent)`},children:i.type}),u&&(0,$.jsxs)($.Fragment,{children:[` · `,(0,$.jsx)(`span`,{children:u})]})]}),d&&(0,$.jsx)(`pre`,{style:{background:`var(--surface)`,padding:8,borderRadius:4,fontSize:12,whiteSpace:`pre-wrap`,margin:`8px 0`},children:d}),(0,$.jsxs)(`section`,{style:{marginTop:16},children:[(0,$.jsx)(`h3`,{style:{fontSize:13,color:`var(--muted)`,textTransform:`uppercase`,letterSpacing:.5},children:`Neighbors`}),(0,$.jsxs)(`ul`,{style:{listStyle:`none`,padding:0,margin:0},children:[Object.entries(i.neighbor_counts).map(([e,n])=>(0,$.jsxs)(`li`,{style:{display:`flex`,justifyContent:`space-between`,padding:`2px 0`},children:[(0,$.jsx)(`span`,{children:e}),(0,$.jsx)(`span`,{style:{color:`var(--muted)`},children:n})]},e)),Object.keys(i.neighbor_counts).length===0&&(0,$.jsx)(`li`,{style:{color:`var(--muted)`},children:`(none)`})]})]}),(0,$.jsxs)(`section`,{style:{marginTop:16},children:[(0,$.jsx)(`h3`,{style:{fontSize:13,color:`var(--muted)`,textTransform:`uppercase`,letterSpacing:.5},children:`Magnetic pull`}),(0,$.jsxs)(`ul`,{style:{listStyle:`none`,padding:0,margin:0},children:[o.map(e=>(0,$.jsxs)(`li`,{onClick:()=>r(e.nodeId),style:{padding:`4px 0`,cursor:`pointer`,fontSize:12},children:[(0,$.jsxs)(`div`,{style:{color:`var(--accent)`},children:[e.nodeId.slice(0,28),`…`]}),(0,$.jsxs)(`div`,{style:{color:`var(--muted)`},children:[`score `,If(e.score),` · s `,If(e.components.structural),` · e`,` `,If(e.components.semantic),` · r `,If(e.components.recency)]})]},e.nodeId)),o.length===0&&(0,$.jsx)(`li`,{style:{color:`var(--muted)`},children:`(none)`})]})]})]})]})}function Rf({nodeId:e,x:n,y:r,onClose:i,onJump:a,onOpenDetail:o}){let[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)([]);if((0,v.useEffect)(()=>{let n=!1;return(async()=>{try{let[r,i]=await Promise.all([fetch(`/api/node/${encodeURIComponent(e)}`),fetch(`/api/node/${encodeURIComponent(e)}/pull?k=6`)]);if(!r.ok||!i.ok)return;let a=await r.json(),o=await i.json();if(n)return;c(a);let s=await Promise.all(o.map(async e=>{let n=await fetch(`/api/node/${encodeURIComponent(e.nodeId)}`);if(!n.ok)return null;let r=await n.json();return{entry:e,name:r.name,kind:r.type}}));n||u(s.filter(e=>e!==null))}catch{}})(),()=>{n=!0}},[e]),(0,v.useEffect)(()=>{let e=e=>{e.key===`Escape`&&i()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[i]),!s)return null;let d=Math.min(Math.max(n+16,8),window.innerWidth-320-8),f=Math.min(Math.max(r+16,8),window.innerHeight-280-8),p=Object.values(s.neighbor_counts).reduce((e,n)=>e+n,0);return(0,$.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{position:`fixed`,left:d,top:f,width:320,zIndex:25,background:`var(--surface2)`,border:`1px solid var(--border)`,borderRadius:8,boxShadow:`0 10px 30px rgba(0,0,0,0.5)`,color:`var(--text)`,fontSize:12},children:[(0,$.jsxs)(`div`,{style:{padding:12,borderBottom:`1px solid var(--border)`},children:[(0,$.jsx)(`div`,{style:{fontWeight:600,fontSize:13},children:s.name}),(0,$.jsxs)(`div`,{style:{color:`var(--muted)`,marginTop:2},children:[(0,$.jsx)(`span`,{style:{color:`var(--accent)`},children:s.type}),s.data?.filePath&&(0,$.jsxs)($.Fragment,{children:[` · `,s.data.filePath]})]}),s.data?.signature&&(0,$.jsx)(`div`,{style:{color:`var(--muted)`,fontFamily:`ui-monospace, monospace`,fontSize:11,marginTop:4,whiteSpace:`nowrap`,overflow:`hidden`,textOverflow:`ellipsis`},children:s.data.signature}),(0,$.jsxs)(`div`,{style:{color:`var(--muted)`,marginTop:4,fontSize:11},children:[p,` neighbor`,p===1?``:`s`,s.neighbor_counts.contains?` · ${s.neighbor_counts.contains} contains`:``,s.neighbor_counts.references?` · ${s.neighbor_counts.references} refs`:``]})]}),(0,$.jsxs)(`div`,{style:{padding:`8px 12px`},children:[(0,$.jsx)(`div`,{style:{color:`var(--muted)`,fontSize:10,marginBottom:4,textTransform:`uppercase`},children:`magnetic pull`}),l.length===0&&(0,$.jsx)(`div`,{style:{color:`var(--muted)`},children:`no nearby anchors`}),l.map(e=>(0,$.jsxs)(`div`,{onClick:()=>a(e.entry.nodeId),style:{display:`flex`,gap:8,alignItems:`baseline`,padding:`3px 0`,cursor:`pointer`},title:`s=${e.entry.components.structural.toFixed(2)} m=${e.entry.components.semantic.toFixed(2)} r=${e.entry.components.recency.toFixed(2)}`,children:[(0,$.jsx)(`span`,{style:{color:`var(--hub)`,minWidth:36,fontSize:11},children:e.entry.score.toFixed(2)}),(0,$.jsx)(`span`,{style:{flex:1,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:e.name}),(0,$.jsx)(`span`,{style:{color:`var(--muted)`,fontSize:10},children:e.kind})]},e.entry.nodeId))]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:8,padding:8,borderTop:`1px solid var(--border)`,justifyContent:`space-between`},children:[(0,$.jsx)(`button`,{onClick:o,style:{background:`var(--surface)`,color:`var(--text)`,border:`none`,borderRadius:4,padding:`4px 10px`,cursor:`pointer`,fontSize:11},children:`open details`}),(0,$.jsx)(`button`,{onClick:i,style:{background:`transparent`,color:`var(--muted)`,border:`none`,cursor:`pointer`,fontSize:11},children:`esc`})]})]})}function zf({onPick:e}){let[n,r]=(0,v.useState)(!1),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)([]),[c,l]=(0,v.useState)(0),u=(0,v.useRef)(null);if((0,v.useEffect)(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`?(e.preventDefault(),r(e=>!e)):e.key===`Escape`&&r(!1)};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[]),(0,v.useEffect)(()=>{n?setTimeout(()=>u.current?.focus(),0):(a(``),s([]),l(0))},[n]),(0,v.useEffect)(()=>{if(!n||!i.trim()){s([]);return}let e=!1,r=setTimeout(async()=>{try{let n=await(await fetch(`/api/search?q=${encodeURIComponent(i)}&limit=12`)).json();e||(s(n),l(0))}catch{e||s([])}},80);return()=>{e=!0,clearTimeout(r)}},[i,n]),!n)return null;let d=n=>{n&&(e(n.id),r(!1))};return(0,$.jsx)(`div`,{onClick:()=>r(!1),style:{position:`fixed`,inset:0,background:`rgba(0,0,0,0.4)`,zIndex:30,display:`flex`,alignItems:`flex-start`,justifyContent:`center`,paddingTop:`15vh`},children:(0,$.jsxs)(`div`,{onClick:e=>e.stopPropagation(),style:{width:560,maxWidth:`90vw`,background:`var(--surface2)`,border:`1px solid var(--border)`,borderRadius:8,boxShadow:`0 20px 60px rgba(0,0,0,0.5)`,overflow:`hidden`},children:[(0,$.jsx)(`input`,{ref:u,value:i,onChange:e=>a(e.target.value),onKeyDown:e=>{e.key===`ArrowDown`?(e.preventDefault(),l(e=>Math.min(o.length-1,e+1))):e.key===`ArrowUp`?(e.preventDefault(),l(e=>Math.max(0,e-1))):e.key===`Enter`&&(e.preventDefault(),d(o[c]))},placeholder:`Search anchors (name, qualified name, alias)…`,style:{width:`100%`,padding:`14px 18px`,background:`transparent`,border:`none`,borderBottom:`1px solid var(--border)`,color:`var(--text)`,fontSize:15,outline:`none`}}),(0,$.jsxs)(`div`,{style:{maxHeight:`40vh`,overflowY:`auto`},children:[o.length===0&&i.trim()&&(0,$.jsx)(`div`,{style:{padding:16,color:`var(--muted)`,fontSize:12},children:`no matches`}),o.map((e,n)=>(0,$.jsxs)(`div`,{onClick:()=>d(e),onMouseEnter:()=>l(n),style:{padding:`8px 18px`,background:n===c?`var(--surface)`:`transparent`,cursor:`pointer`,fontSize:13,color:`var(--text)`,display:`flex`,gap:10,alignItems:`baseline`},children:[(0,$.jsx)(`span`,{style:{color:`var(--accent)`,minWidth:80,fontSize:11},children:e.type}),(0,$.jsx)(`span`,{style:{flex:1},children:e.name}),e.data?.filePath&&(0,$.jsx)(`span`,{style:{color:`var(--muted)`,fontSize:11},children:e.data.filePath})]},e.id))]}),(0,$.jsx)(`div`,{style:{padding:`6px 18px`,borderTop:`1px solid var(--border)`,color:`var(--muted)`,fontSize:11},children:`↑↓ navigate · ⏎ select · esc close · ⌘K toggle`})]})})}function Bf(){let{theme:e,themeId:n,setThemeId:r,themes:i}=Mf(),[a,o]=(0,v.useState)(!1),s=(0,v.useRef)(null);return(0,v.useEffect)(()=>{if(!a)return;let e=e=>{s.current&&!s.current.contains(e.target)&&o(!1)},n=e=>e.key===`Escape`&&o(!1);return window.addEventListener(`mousedown`,e),window.addEventListener(`keydown`,n),()=>{window.removeEventListener(`mousedown`,e),window.removeEventListener(`keydown`,n)}},[a]),(0,$.jsxs)(`div`,{ref:s,style:{position:`relative`},children:[(0,$.jsx)(`button`,{onClick:()=>o(e=>!e),title:`Theme`,"aria-label":`Theme settings`,style:{background:a?`var(--surface2)`:`transparent`,color:`var(--muted)`,border:`1px solid var(--border)`,borderRadius:8,width:28,height:28,display:`grid`,placeItems:`center`,cursor:`pointer`,fontSize:14,lineHeight:1},children:`⚙`}),a&&(0,$.jsxs)(`div`,{style:{position:`absolute`,top:36,right:0,width:200,background:`var(--surface2)`,border:`1px solid var(--border)`,borderRadius:10,boxShadow:`0 12px 32px rgba(0,0,0,0.45)`,padding:6,zIndex:40},children:[(0,$.jsx)(`div`,{style:{fontSize:10,textTransform:`uppercase`,letterSpacing:.6,color:`var(--muted)`,padding:`4px 8px`},children:`Theme`}),i.map(e=>{let i=e.id===n;return(0,$.jsxs)(`button`,{onClick:()=>r(e.id),style:{display:`flex`,alignItems:`center`,gap:10,width:`100%`,background:i?`var(--surface)`:`transparent`,border:`none`,borderRadius:6,padding:`7px 8px`,cursor:`pointer`,color:`var(--text)`,fontSize:13,textAlign:`left`},children:[(0,$.jsx)(`span`,{"aria-hidden":!0,style:{width:12,height:12,borderRadius:`50%`,flexShrink:0,background:e.tokens.accent,border:`2px solid ${e.tokens.bg}`,boxShadow:`0 0 0 1px ${e.tokens.border}`}}),(0,$.jsx)(`span`,{style:{flex:1},children:e.name}),i&&(0,$.jsx)(`span`,{style:{color:`var(--accent)`},children:`✓`})]},e.id)})]})]})}function Vf(){let[e,n]=(0,v.useState)(null),[r,i]=(0,v.useState)(null),[a,o]=(0,v.useState)(null),[s,c]=(0,v.useState)(null),[l,u]=(0,v.useState)(null),[d,f]=(0,v.useState)(!1),[p,m]=(0,v.useState)(()=>new Map),[h,g]=(0,v.useState)(null),_=async()=>{try{let[e,r]=await Promise.all([fetch(`/api/status`).then(e=>e.json()),fetch(`/api/graph?limit=2000`).then(e=>e.json())]);n(e),i(r),g(null)}catch(e){g(e instanceof Error?e.message:String(e))}};return(0,v.useEffect)(()=>{_();let e=new WebSocket(`ws://${location.host}/ws`);return e.addEventListener(`message`,e=>{let n=JSON.parse(e.data);if(n.type===`db:changed`&&_(),n.type===`activation:fired`&&n.payload?.ids){let e=Date.now();m(r=>{let i=new Map(r);for(let r of n.payload.ids)i.set(r,e);return i}),setTimeout(()=>{m(e=>{let n=new Map,r=Date.now()-1500;for(let[i,a]of e)a>r&&n.set(i,a);return n})},1600)}}),()=>e.close()},[]),(0,v.useEffect)(()=>{fetch(`/api/config`).then(e=>e.json()).then(e=>{e?.name&&(document.title=`Rig — ${e.name}`)}).catch(()=>{})},[]),(0,v.useEffect)(()=>{let e=()=>{let e=location.hash.replace(/^#/,``);e&&(o(e),c({id:e,ts:Date.now()}))};return e(),window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]),(0,v.useEffect)(()=>{let e=a?`#${a}`:``;location.hash!==e&&history.replaceState(null,``,`${location.pathname}${location.search}${e}`)},[a]),(0,v.useEffect)(()=>{fetch(`/api/selection`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({node_id:a})})},[a]),(0,$.jsxs)(`div`,{style:{position:`fixed`,inset:0},children:[(0,$.jsxs)(`header`,{style:{position:`absolute`,top:0,left:0,right:0,height:44,padding:`0 16px`,background:`color-mix(in srgb, var(--bg) 82%, transparent)`,backdropFilter:`blur(8px)`,borderBottom:`1px solid var(--border)`,zIndex:10,display:`flex`,gap:14,alignItems:`center`},children:[(0,$.jsxs)(`span`,{style:{display:`flex`,alignItems:`center`,gap:8},children:[(0,$.jsx)(`span`,{"aria-hidden":!0,style:{width:9,height:9,borderRadius:`50%`,background:`var(--accent)`,boxShadow:`0 0 8px var(--accent)`}}),(0,$.jsx)(`strong`,{style:{color:`var(--text)`,letterSpacing:.2},children:`Rig`})]}),e&&(0,$.jsxs)(`span`,{style:{color:`var(--muted)`,fontSize:12},children:[e.nodes.toLocaleString(),` nodes ·`,` `,(e.edges_structural+e.edges_semantic).toLocaleString(),` edges ·`,` `,e.files.toLocaleString(),` files`]}),a&&(0,$.jsx)(`span`,{style:{color:`var(--accent)`,fontSize:11,fontFamily:`ui-monospace, monospace`,maxWidth:220,overflow:`hidden`,textOverflow:`ellipsis`,whiteSpace:`nowrap`},children:a}),r&&r.pending_edges.length>0&&(0,$.jsxs)(`span`,{style:{color:`var(--pending)`,fontSize:11,border:`1px solid var(--pending)`,borderRadius:999,padding:`1px 8px`},children:[r.pending_edges.length,` pending`]}),h&&(0,$.jsxs)(`span`,{style:{color:`var(--danger)`,fontSize:12},children:[`error: `,h]}),(0,$.jsxs)(`span`,{style:{marginLeft:`auto`,display:`flex`,gap:8,alignItems:`center`},children:[(0,$.jsx)(`button`,{onClick:async()=>{await fetch(`/api/undo`,{method:`POST`}),await _()},style:{background:`var(--surface)`,color:`var(--text)`,border:`1px solid var(--border)`,borderRadius:8,padding:`5px 12px`,cursor:`pointer`,fontSize:12},children:`Undo`}),(0,$.jsx)(Bf,{})]})]}),r&&r.nodes.length>0&&(0,$.jsx)(Ff,{snapshot:r,onSelect:(e,n)=>{o(e),u(n?{id:e,x:n.x,y:n.y}:null)},focusToken:s,selectedId:a,pulses:p,onAccept:async e=>{await fetch(`/api/pending-edges/${e}/accept`,{method:`POST`}),await _()},onReject:async e=>{await fetch(`/api/pending-edges/${e}/reject`,{method:`POST`}),await _()}}),l&&(0,$.jsx)(Rf,{nodeId:l.id,x:l.x,y:l.y,onClose:()=>u(null),onJump:e=>{o(e),c({id:e,ts:Date.now()}),u(null)},onOpenDetail:()=>{f(!0),u(null)}}),(0,$.jsx)(zf,{onPick:e=>{o(e),c({id:e,ts:Date.now()})}}),(0,$.jsx)(`kbd`,{style:{position:`absolute`,bottom:12,left:12,padding:`5px 10px`,background:`color-mix(in srgb, var(--surface) 88%, transparent)`,border:`1px solid var(--border)`,borderRadius:8,color:`var(--muted)`,fontSize:11,fontFamily:`ui-monospace, monospace`,zIndex:10},children:`⌘K to search`}),a&&d&&(0,$.jsx)(Lf,{id:a,onClose:()=>f(!1),onJump:e=>{o(e),c({id:e,ts:Date.now()})}}),r&&r.nodes.length===0&&(0,$.jsx)(`div`,{style:{position:`absolute`,inset:0,display:`grid`,placeItems:`center`,textAlign:`center`,color:`var(--muted)`},children:(0,$.jsxs)(`div`,{children:[(0,$.jsx)(`p`,{style:{fontSize:15,color:`var(--text)`,margin:`0 0 6px`},children:`The graph is empty.`}),(0,$.jsxs)(`p`,{style:{margin:0},children:[`Run`,` `,(0,$.jsx)(`code`,{style:{color:`var(--accent)`,background:`var(--surface)`,border:`1px solid var(--border)`,borderRadius:6,padding:`2px 6px`,fontFamily:`ui-monospace, monospace`},children:`rig index`}),` `,`in your project, then refresh.`]})]})})]})}function Hf({children:e}){let[n,r]=(0,v.useState)(`checking`),[i,a]=(0,v.useState)(``),[o,s]=(0,v.useState)(null);if((0,v.useEffect)(()=>{(async()=>{try{let e=await fetch(`/api/session/me`,{credentials:`include`});r(e.ok||e.status===404?`authed`:`unauthed`)}catch{r(`unauthed`)}})()},[]),n===`checking`)return(0,$.jsx)($.Fragment,{});if(n===`authed`)return(0,$.jsx)($.Fragment,{children:e});let c=async()=>{let e=i.trim();if(!e)return;let n=await fetch(`/auth?t=${encodeURIComponent(e)}`,{credentials:`include`,redirect:`manual`});n.status===302||n.ok?location.reload():s(`invalid token`)};return(0,$.jsx)(`div`,{style:{position:`fixed`,inset:0,background:`var(--bg)`,color:`var(--text)`,display:`flex`,alignItems:`center`,justifyContent:`center`,zIndex:50},children:(0,$.jsxs)(`div`,{style:{maxWidth:480,padding:32,border:`1px solid var(--border)`,borderRadius:8,background:`var(--surface2)`},children:[(0,$.jsx)(`h1`,{style:{margin:0,fontSize:20,color:`var(--accent)`},children:`Rig — sign in`}),(0,$.jsxs)(`p`,{style:{color:`var(--muted)`,marginTop:12},children:[`The map requires a session token. Tokens live in `,(0,$.jsx)(`code`,{children:`.rig/.runtime`}),` and rotate when you delete that file.`]}),(0,$.jsx)(`h3`,{style:{fontSize:13,color:`var(--text)`,marginTop:24,marginBottom:8},children:`Option 1 — open via your AI agent`}),(0,$.jsxs)(`p`,{style:{color:`var(--muted)`,fontSize:12,margin:0},children:[`In Claude Code / Cursor / Codex, ask:`,` `,(0,$.jsx)(`span`,{style:{color:`var(--accent)`},children:`"open the rig map"`}),` — your agent will call`,` `,(0,$.jsx)(`code`,{children:`rig_session_token`}),` and hand you a one-click login URL.`]}),(0,$.jsx)(`h3`,{style:{fontSize:13,color:`var(--text)`,marginTop:24,marginBottom:8},children:`Option 2 — paste the token`}),(0,$.jsxs)(`p`,{style:{color:`var(--muted)`,fontSize:12,margin:`0 0 8px`},children:[(0,$.jsx)(`code`,{children:`cat .rig/.runtime`}),` in your project directory.`]}),(0,$.jsxs)(`div`,{style:{display:`flex`,gap:8},children:[(0,$.jsx)(`input`,{value:i,onChange:e=>{a(e.target.value),s(null)},onKeyDown:e=>{e.key===`Enter`&&c()},placeholder:`paste token here`,style:{flex:1,padding:`6px 10px`,background:`var(--bg)`,border:`1px solid ${o?`var(--danger)`:`var(--border)`}`,borderRadius:4,color:`var(--text)`,fontSize:13,fontFamily:`ui-monospace, monospace`,outline:`none`}}),(0,$.jsx)(`button`,{onClick:()=>void c(),style:{padding:`6px 14px`,background:`var(--accent)`,color:`var(--accent-text)`,border:`none`,borderRadius:4,cursor:`pointer`,fontSize:13,fontWeight:600},children:`sign in`})]}),o&&(0,$.jsx)(`div`,{style:{color:`var(--danger)`,fontSize:12,marginTop:6},children:o})]})})}var Uf=document.getElementById(`root`);if(!Uf)throw Error(`root mount missing`);(0,y.createRoot)(Uf).render((0,$.jsx)(v.StrictMode,{children:(0,$.jsx)(jf,{children:(0,$.jsx)(Hf,{children:(0,$.jsx)(Vf,{})})})}));
@@ -27,7 +27,7 @@
27
27
  transition: background 200ms ease, color 200ms ease;
28
28
  }
29
29
  </style>
30
- <script type="module" crossorigin src="/assets/index-VRO-sxc2.js"></script>
30
+ <script type="module" crossorigin src="/assets/index-DP5zI6Mb.js"></script>
31
31
  </head>
32
32
  <body>
33
33
  <div id="root"></div>