rig-constellation 0.1.0 → 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
@@ -2,6 +2,13 @@
2
2
 
3
3
  **Watch your codebase become a constellation — and give your AI agent a map of it.**
4
4
 
5
+ <p align="center">
6
+ <a href="https://www.npmjs.com/package/rig-constellation"><img src="https://img.shields.io/npm/v/rig-constellation.svg?color=cb3837&label=npm" alt="npm version"></a>
7
+ <a href="https://github.com/Astralchemist/rig/actions/workflows/ci.yml"><img src="https://github.com/Astralchemist/rig/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
8
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue.svg" alt="License: Apache-2.0"></a>
9
+ <img src="https://img.shields.io/badge/runtime-Node%2020%2B%20%C2%B7%20Bun-339933.svg" alt="runs on Node 20+ and Bun">
10
+ </p>
11
+
5
12
  <p align="center">
6
13
  <a href="https://github.com/Astralchemist/rig/releases/download/v0.1.0/demo.mp4">
7
14
  <img src="docs/demo.gif" alt="Rig — the live map of a codebase, navigated in real time" width="820">
@@ -21,25 +28,35 @@ Everything runs on your machine. No API key, no upload, nothing leaves your lapt
21
28
  In any project directory:
22
29
 
23
30
  ```bash
24
- bunx rig-constellation
31
+ npx rig-constellation
25
32
  ```
26
33
 
27
- That's the whole thing. One command:
34
+ (Have [Bun](https://bun.sh)? `bunx rig-constellation` works too.) That's the whole thing. One command:
28
35
 
29
36
  ```
30
- ⬡ Rig — mapping your codebase…
37
+ ⬡ Rig — mapping my-project
38
+ http://localhost:7491
39
+
31
40
  ✓ initialized ./.rig
32
- indexing extract resolve → embed → hubness → communities
41
+ map live http://localhost:7491
42
+ → 1/6 extract ██████████████████ 212/212
43
+ → 5/6 hubness ████████████████░░
33
44
  ✓ indexed 1,204 nodes · 3,891 edges · 212 files · 36 skills
34
45
  ✓ wired claude
35
- ✓ map live http://localhost:7474
36
46
 
37
47
  press Ctrl-C to stop the map.
38
48
  ```
39
49
 
40
- 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.
41
55
 
42
- > 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`).
43
60
 
44
61
  ---
45
62
 
@@ -54,6 +71,33 @@ It initializes `.rig/`, indexes your code, wires up whichever agent it detects,
54
71
 
55
72
  ---
56
73
 
74
+ ## What your agent does differently
75
+
76
+ Without a map, an agent answers *"what breaks if I change `parseConfig`?"* by grepping the string and reading whatever files match — blind, lossy, and token-expensive.
77
+
78
+ With Rig it's one call:
79
+
80
+ ```
81
+ rig_impact parseConfig
82
+ → 7 transitive callers, ranked:
83
+ loadSettings calls · depth 1
84
+ bootstrap calls · depth 2
85
+ __tests__/config… tests · depth 1
86
+
87
+ ```
88
+
89
+ And *"what else should I look at?"* isn't a guess — `rig_pull` returns related anchors scored by graph distance, on-device embedding similarity, and recent activity, with the three components broken out so the ranking is **explainable, not a black box**:
90
+
91
+ ```
92
+ rig_pull parseConfig
93
+ → { node: "validateSchema", score: 0.81,
94
+ components: { structural: 0.4, semantic: 0.9, recency: 0.7 } }
95
+ ```
96
+
97
+ That ranked, self-explaining retrieval — not a flat grep dump — is the difference.
98
+
99
+ ---
100
+
57
101
  ## Privacy & local-first
58
102
 
59
103
  - Embeddings run locally via a small on-device model (`bge-small`). **No API key required.**
package/dist/rig.js CHANGED
@@ -3579,19 +3579,37 @@ init_bun_adapter();
3579
3579
  // package.json
3580
3580
  var package_default = {
3581
3581
  name: "rig-constellation",
3582
- version: "0.1.0",
3582
+ version: "0.1.2",
3583
3583
  private: false,
3584
3584
  type: "module",
3585
3585
  description: "Local-first semantic knowledge graph",
3586
+ keywords: [
3587
+ "mcp",
3588
+ "model-context-protocol",
3589
+ "claude-code",
3590
+ "cursor",
3591
+ "code-graph",
3592
+ "knowledge-graph",
3593
+ "code-navigation",
3594
+ "codebase-map",
3595
+ "ast",
3596
+ "tree-sitter",
3597
+ "local-first",
3598
+ "embeddings",
3599
+ "rag",
3600
+ "ai-agents",
3601
+ "developer-tools"
3602
+ ],
3586
3603
  author: "Astralchemist <kingolajohn55@gmail.com>",
3587
3604
  license: "Apache-2.0",
3588
3605
  homepage: "https://github.com/Astralchemist/rig",
3589
3606
  repository: {
3590
3607
  type: "git",
3591
- url: "https://github.com/Astralchemist/rig.git"
3608
+ url: "git+https://github.com/Astralchemist/rig.git"
3592
3609
  },
3593
3610
  bin: {
3594
- rig: "./dist/rig.js"
3611
+ rig: "./dist/rig.js",
3612
+ "rig-constellation": "./dist/rig.js"
3595
3613
  },
3596
3614
  files: [
3597
3615
  "dist",
@@ -7086,7 +7104,7 @@ var runIndex = async (cwd) => {
7086
7104
 
7087
7105
  // packages/cli/src/init.ts
7088
7106
  import { appendFileSync, existsSync as existsSync7, readFileSync as readFileSync7, writeFileSync as writeFileSync2 } from "node:fs";
7089
- import { join as join11, resolve as resolve8 } from "node:path";
7107
+ import { basename as basename4, join as join11, resolve as resolve8 } from "node:path";
7090
7108
  var ensureGitignored = (root) => {
7091
7109
  const path2 = join11(root, ".gitignore");
7092
7110
  const entry = ".rig/";
@@ -7104,12 +7122,33 @@ var ensureGitignored = (root) => {
7104
7122
  `);
7105
7123
  return true;
7106
7124
  };
7107
- 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) => ({
7108
7146
  version: 1,
7147
+ name: deriveProjectName(root),
7109
7148
  host: "127.0.0.1",
7110
- port: 7474,
7149
+ port: stablePort(root),
7111
7150
  embedder: { kind: "local", model: "Xenova/bge-small-en-v1.5" }
7112
- };
7151
+ });
7113
7152
  var ensureInit = async (root) => {
7114
7153
  const rigDir = join11(root, RIG_DIR_NAME);
7115
7154
  if (existsSync7(rigDir)) {
@@ -7118,7 +7157,7 @@ var ensureInit = async (root) => {
7118
7157
  const rig = await Rig.init(root);
7119
7158
  const cfgPath = join11(rigDir, "config.json");
7120
7159
  if (!existsSync7(cfgPath)) {
7121
- writeFileSync2(cfgPath, JSON.stringify(DEFAULT_CONFIG, null, 2) + `
7160
+ writeFileSync2(cfgPath, JSON.stringify(defaultConfig(root), null, 2) + `
7122
7161
  `);
7123
7162
  }
7124
7163
  rig.close();
@@ -7936,6 +7975,102 @@ async function dispatchToolCall(name, args, ctx, handlers) {
7936
7975
  throw err2;
7937
7976
  }
7938
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
+ };
7939
8074
 
7940
8075
  // packages/mcp/src/transport.ts
7941
8076
  import * as readline from "readline";
@@ -8098,7 +8233,7 @@ var buildHandlersMap = (exports) => {
8098
8233
  var SERVER_INFO = {
8099
8234
  protocolVersion: "2024-11-05",
8100
8235
  capabilities: { tools: {} },
8101
- serverInfo: { name: "rig", version: "0.0.1" }
8236
+ serverInfo: { name: "rig", version: package_default2.version }
8102
8237
  };
8103
8238
  var isParams = (v) => typeof v === "object" && v !== null;
8104
8239
  var handleToolsCall = async (params, ctx, handlers) => {
@@ -10912,88 +11047,8 @@ async function serveMcp(opts = {}) {
10912
11047
  import compress from "@fastify/compress";
10913
11048
  import cors from "@fastify/cors";
10914
11049
  import fastifyStatic from "@fastify/static";
10915
- // package.json
10916
- var package_default2 = {
10917
- name: "rig-constellation",
10918
- version: "0.1.0",
10919
- private: false,
10920
- type: "module",
10921
- description: "Local-first semantic knowledge graph",
10922
- author: "Astralchemist <kingolajohn55@gmail.com>",
10923
- license: "Apache-2.0",
10924
- homepage: "https://github.com/Astralchemist/rig",
10925
- repository: {
10926
- type: "git",
10927
- url: "https://github.com/Astralchemist/rig.git"
10928
- },
10929
- bin: {
10930
- rig: "./dist/rig.js"
10931
- },
10932
- files: [
10933
- "dist",
10934
- "generated",
10935
- "packages/web/dist",
10936
- "LICENSE",
10937
- "LICENSE-CODEGRAPH.txt",
10938
- "NOTICE",
10939
- "README.md"
10940
- ],
10941
- engines: {
10942
- bun: ">=1.1",
10943
- node: ">=20 <25"
10944
- },
10945
- workspaces: [
10946
- "packages/*"
10947
- ],
10948
- scripts: {
10949
- gen: "bun run scripts/gen.ts",
10950
- "gen:check": "bun run scripts/gen-check.ts",
10951
- "gen:wasm": "bun run scripts/gen-wasm.ts",
10952
- "check:compat": "bun run scripts/compat-check.ts",
10953
- "compat:snapshot": "bun run scripts/compat-check.ts --write",
10954
- "check:migrations": "bun run scripts/migration-lock.ts",
10955
- "migration:lock": "bun run scripts/migration-lock.ts --write",
10956
- test: "bun test",
10957
- "test:e2e": "playwright test",
10958
- "install:hooks": "bash scripts/install-hooks.sh",
10959
- build: "bun run build:web && bun run build:cli",
10960
- "build:web": "cd packages/web && bunx vite build",
10961
- "build:cli": "bun run gen:wasm && bun run scripts/build-cli.ts",
10962
- prepublishOnly: "bun run build && bun test && bun run gen:check && bun run check:compat && bun run check:migrations"
10963
- },
10964
- dependencies: {
10965
- "@fastify/compress": "8.3.1",
10966
- "@fastify/cors": "11.2.0",
10967
- "@fastify/static": "9.1.3",
10968
- "@xenova/transformers": "^2.17",
10969
- fastify: "5.8.5",
10970
- ignore: "7.0.5",
10971
- "jsonc-parser": "3.3.1",
10972
- "tree-sitter-wasms": "0.1.13",
10973
- "web-tree-sitter": "^0.25.3",
10974
- ws: "8.20.1",
10975
- zod: "^3.23"
10976
- },
10977
- optionalDependencies: {
10978
- "better-sqlite3": "^12"
10979
- },
10980
- devDependencies: {
10981
- "@playwright/test": "1.60.0",
10982
- "@types/bun": "latest",
10983
- "@types/node": "^20",
10984
- prettier: "^3",
10985
- typescript: "^5.5",
10986
- zod: "^3.23",
10987
- "zod-to-json-schema": "^3.23"
10988
- },
10989
- comments: {
10990
- 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."
10991
- }
10992
- };
10993
-
10994
- // packages/web/src/server.ts
10995
- import { existsSync as existsSync18 } from "node:fs";
10996
- 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";
10997
11052
  import { fileURLToPath as fileURLToPath2 } from "node:url";
10998
11053
  import Fastify from "fastify";
10999
11054
 
@@ -11094,6 +11149,49 @@ var registerConfigRoutes = (app, projectRoot) => {
11094
11149
  });
11095
11150
  };
11096
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
+
11097
11195
  // packages/web/src/routes.ts
11098
11196
  var intOrUndef = (s) => s === undefined ? undefined : Number.parseInt(s, 10);
11099
11197
  var ensureNode = (rig, id) => rig.getNode(id) ? { ok: true } : { ok: false, status: 404, body: { error: `node ${id} not found` } };
@@ -11164,7 +11262,7 @@ var registerRoutes = (app, rig) => {
11164
11262
 
11165
11263
  // packages/web/src/ws.ts
11166
11264
  import { watch as watch2 } from "node:fs";
11167
- import { join as join18, resolve as resolve11 } from "node:path";
11265
+ import { join as join19, resolve as resolve11 } from "node:path";
11168
11266
  import { WebSocketServer } from "ws";
11169
11267
 
11170
11268
  // packages/web/src/ws-derive.ts
@@ -11315,7 +11413,7 @@ var attachWs = (httpServer, rig) => {
11315
11413
  }, DEBOUNCE_MS);
11316
11414
  };
11317
11415
  try {
11318
- const w = watch2(join18(root, RIG_DIR), { persistent: false }, (_evt, filename) => {
11416
+ const w = watch2(join19(root, RIG_DIR), { persistent: false }, (_evt, filename) => {
11319
11417
  if (filename && filename.startsWith("rig.db"))
11320
11418
  onDbChange();
11321
11419
  });
@@ -11338,13 +11436,13 @@ var attachWs = (httpServer, rig) => {
11338
11436
 
11339
11437
  // packages/web/src/server.ts
11340
11438
  var HERE2 = dirname8(fileURLToPath2(import.meta.url));
11341
- var DIST_DIR = join19(findAssetRoot(HERE2), "packages/web/dist");
11439
+ var DIST_DIR = join20(findAssetRoot(HERE2), "packages/web/dist");
11342
11440
  var LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "::1"]);
11343
11441
  var DEFAULT_HOST = "127.0.0.1";
11344
- var DEFAULT_PORT = 7474;
11345
11442
  async function serveWeb(opts) {
11346
11443
  const host = opts.host ?? DEFAULT_HOST;
11347
- const port = opts.port ?? DEFAULT_PORT;
11444
+ const port = resolvePort(opts.projectRoot, opts.port);
11445
+ const project = resolveProjectName(opts.projectRoot);
11348
11446
  const isLoopback = LOOPBACK_HOSTS.has(host);
11349
11447
  const authMode = opts.auth ?? "auto";
11350
11448
  const authOn = authMode === true || authMode === "auto" && !isLoopback;
@@ -11359,17 +11457,17 @@ async function serveWeb(opts) {
11359
11457
  await app.register(compress, { global: true, encodings: ["gzip", "deflate"], threshold: 1024 });
11360
11458
  let token = null;
11361
11459
  if (authOn) {
11362
- token = loadOrCreateToken(join19(opts.projectRoot, ".rig"));
11460
+ token = loadOrCreateToken(join20(opts.projectRoot, ".rig"));
11363
11461
  app.addHook("preHandler", requireBearer(token));
11364
11462
  registerAuthRoutes(app, { token, cookieMaxAgeSec: 60 * 60 * 24 * 7 });
11365
11463
  } else {
11366
11464
  app.get("/api/session/me", async () => ({ authed: true, auth_required: false }));
11367
11465
  }
11368
11466
  const version = package_default2.version;
11369
- 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 }));
11370
11468
  registerRoutes(app, rig);
11371
11469
  registerConfigRoutes(app, opts.projectRoot);
11372
- if (existsSync18(DIST_DIR)) {
11470
+ if (existsSync19(DIST_DIR)) {
11373
11471
  await app.register(fastifyStatic, { root: DIST_DIR, prefix: "/", wildcard: false });
11374
11472
  app.setNotFoundHandler((req, reply) => {
11375
11473
  if (req.url.startsWith("/api") || req.url === "/ws") {
@@ -11382,7 +11480,7 @@ async function serveWeb(opts) {
11382
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>`);
11383
11481
  });
11384
11482
  }
11385
- const address = await app.listen({ host, port });
11483
+ const address = await listenWithFallback(app, host, port);
11386
11484
  const ws = attachWs(app.server, rig);
11387
11485
  return {
11388
11486
  app,
@@ -11459,21 +11557,21 @@ async function runServe(cwd) {
11459
11557
  }
11460
11558
 
11461
11559
  // packages/cli/src/start.ts
11462
- 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";
11463
11561
  import { fileURLToPath as fileURLToPath3 } from "node:url";
11464
11562
 
11465
11563
  // packages/cli/src/init.ts
11466
- import { appendFileSync as appendFileSync2, existsSync as existsSync19, readFileSync as readFileSync11, writeFileSync as writeFileSync5 } from "node:fs";
11467
- 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";
11468
11566
  var ensureGitignored2 = (root) => {
11469
- const path7 = join20(root, ".gitignore");
11567
+ const path7 = join21(root, ".gitignore");
11470
11568
  const entry = ".rig/";
11471
- if (!existsSync19(path7)) {
11569
+ if (!existsSync20(path7)) {
11472
11570
  writeFileSync5(path7, `${entry}
11473
11571
  `);
11474
11572
  return true;
11475
11573
  }
11476
- const lines = readFileSync11(path7, "utf-8").split(/\r?\n/);
11574
+ const lines = readFileSync12(path7, "utf-8").split(/\r?\n/);
11477
11575
  if (lines.some((l) => l.trim() === entry || l.trim() === ".rig"))
11478
11576
  return false;
11479
11577
  const sep = lines.at(-1) === "" ? "" : `
@@ -11482,21 +11580,42 @@ var ensureGitignored2 = (root) => {
11482
11580
  `);
11483
11581
  return true;
11484
11582
  };
11485
- 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) => ({
11486
11604
  version: 1,
11605
+ name: deriveProjectName2(root),
11487
11606
  host: "127.0.0.1",
11488
- port: 7474,
11607
+ port: stablePort2(root),
11489
11608
  embedder: { kind: "local", model: "Xenova/bge-small-en-v1.5" }
11490
- };
11609
+ });
11491
11610
  var ensureInit2 = async (root) => {
11492
- const rigDir = join20(root, RIG_DIR_NAME);
11493
- if (existsSync19(rigDir)) {
11611
+ const rigDir = join21(root, RIG_DIR_NAME);
11612
+ if (existsSync20(rigDir)) {
11494
11613
  return { rigDir, created: false, gitignoreUpdated: false };
11495
11614
  }
11496
11615
  const rig = await Rig.init(root);
11497
- const cfgPath = join20(rigDir, "config.json");
11498
- if (!existsSync19(cfgPath)) {
11499
- 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) + `
11500
11619
  `);
11501
11620
  }
11502
11621
  rig.close();
@@ -11506,7 +11625,7 @@ var ensureInit2 = async (root) => {
11506
11625
 
11507
11626
  // packages/cli/src/open-url.ts
11508
11627
  import { spawn } from "node:child_process";
11509
- import { existsSync as existsSync20 } from "node:fs";
11628
+ import { existsSync as existsSync21 } from "node:fs";
11510
11629
  var openUrl = (url) => {
11511
11630
  const launch = (cmd, args) => {
11512
11631
  try {
@@ -11522,7 +11641,7 @@ var openUrl = (url) => {
11522
11641
  return void launch("open", [url]);
11523
11642
  if (process.platform === "win32")
11524
11643
  return void launch("cmd", ["/c", "start", "", url]);
11525
- if (existsSync20("/proc/sys/kernel/osrelease") && process.env.WSL_DISTRO_NAME) {
11644
+ if (existsSync21("/proc/sys/kernel/osrelease") && process.env.WSL_DISTRO_NAME) {
11526
11645
  if (launch("wslview", [url]))
11527
11646
  return;
11528
11647
  return void launch("cmd.exe", ["/c", "start", "", url]);
@@ -11530,17 +11649,74 @@ var openUrl = (url) => {
11530
11649
  launch("xdg-open", [url]);
11531
11650
  };
11532
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
+
11533
11712
  // packages/cli/src/start.ts
11534
11713
  var HERE3 = dirname9(fileURLToPath3(import.meta.url));
11535
- var GENERATED_DIR2 = join21(findAssetRoot(HERE3), "generated/installer");
11714
+ var GENERATED_DIR2 = join22(findAssetRoot(HERE3), "generated/installer");
11536
11715
  var flag6 = (n) => process.argv.includes(n);
11537
11716
  var opt = (n) => {
11538
11717
  const i = process.argv.indexOf(n);
11539
11718
  return i >= 0 && i + 1 < process.argv.length ? process.argv[i + 1] : undefined;
11540
11719
  };
11541
- var isTty2 = process.stderr.isTTY === true;
11542
- var status = (line) => void process.stderr.write(isTty2 ? `\r\x1B[K${line}` : line + `
11543
- `);
11544
11720
  var wireAgents = async (root) => {
11545
11721
  const opts = { rigBin: opt("--bin") ?? "rig", cursorPath: root, generatedDir: GENERATED_DIR2, dryRun: false };
11546
11722
  const wired = [];
@@ -11555,13 +11731,8 @@ var wireAgents = async (root) => {
11555
11731
  };
11556
11732
  var runStart = async (cwd) => {
11557
11733
  const root = resolve13(cwd);
11558
- process.stderr.write(`
11559
- ⬡ Rig — mapping your codebase…
11560
-
11561
- `);
11734
+ const project = deriveProjectName2(root);
11562
11735
  const init = await ensureInit2(root);
11563
- process.stderr.write(` ${init.created ? "✓ initialized" : "· already set up"} ${init.rigDir}
11564
- `);
11565
11736
  const portStr = opt("--port");
11566
11737
  const host = opt("--host");
11567
11738
  const web = await serveWeb({
@@ -11571,15 +11742,17 @@ var runStart = async (cwd) => {
11571
11742
  ...host ? { host } : {}
11572
11743
  });
11573
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);
11574
11747
  if (!flag6("--no-open"))
11575
11748
  openUrl(mapUrl);
11576
- process.stderr.write(` ✓ map live ${mapUrl}
11577
- `);
11749
+ line(sym.ok, "map live", web.url);
11750
+ const progress = makeProgress();
11578
11751
  const rig = await Rig.open(root);
11579
11752
  try {
11580
11753
  const r = await rig.indexAll({
11581
11754
  onProgress: (p) => {
11582
- status(` indexing ${p.phase} ${p.current ?? ""}${p.total ? "/" + p.total : ""}`);
11755
+ progress(p);
11583
11756
  web.ws.broadcast({
11584
11757
  type: "index:progress",
11585
11758
  ts: Date.now(),
@@ -11587,26 +11760,26 @@ var runStart = async (cwd) => {
11587
11760
  });
11588
11761
  }
11589
11762
  });
11590
- if (isTty2)
11591
- process.stderr.write("\r\x1B[K");
11763
+ endProgress();
11592
11764
  const skills = rig.seedSkills(tools_manifest_default.tools);
11593
11765
  web.ws.broadcast({
11594
11766
  type: "index:progress",
11595
11767
  ts: Date.now(),
11596
11768
  payload: { phase: "done", done: true, nodes: r.nodes, edges: r.edges, files: r.files }
11597
11769
  });
11598
- process.stderr.write(` ✓ indexed ${r.nodes} nodes · ${r.edges} edges · ${r.files} files · ${skills} skills
11599
- `);
11770
+ line(sym.ok, "indexed", `${r.nodes} nodes · ${r.edges} edges · ${r.files} files · ${skills} skills`);
11600
11771
  } finally {
11601
11772
  rig.close();
11602
11773
  }
11603
11774
  if (!flag6("--no-wire")) {
11604
11775
  const wired = await wireAgents(root);
11605
- process.stderr.write(wired.length ? ` ✓ wired ${wired.join(", ")}
11606
- ` : " · 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");
11607
11780
  }
11608
11781
  process.stderr.write(`
11609
- press Ctrl-C to stop the map.
11782
+ ${dim("press Ctrl-C to stop the map.")}
11610
11783
  `);
11611
11784
  const shutdown = async () => {
11612
11785
  await web.close();
package/package.json CHANGED
@@ -1,18 +1,36 @@
1
1
  {
2
2
  "name": "rig-constellation",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Local-first semantic knowledge graph",
7
+ "keywords": [
8
+ "mcp",
9
+ "model-context-protocol",
10
+ "claude-code",
11
+ "cursor",
12
+ "code-graph",
13
+ "knowledge-graph",
14
+ "code-navigation",
15
+ "codebase-map",
16
+ "ast",
17
+ "tree-sitter",
18
+ "local-first",
19
+ "embeddings",
20
+ "rag",
21
+ "ai-agents",
22
+ "developer-tools"
23
+ ],
7
24
  "author": "Astralchemist <kingolajohn55@gmail.com>",
8
25
  "license": "Apache-2.0",
9
26
  "homepage": "https://github.com/Astralchemist/rig",
10
27
  "repository": {
11
28
  "type": "git",
12
- "url": "https://github.com/Astralchemist/rig.git"
29
+ "url": "git+https://github.com/Astralchemist/rig.git"
13
30
  },
14
31
  "bin": {
15
- "rig": "./dist/rig.js"
32
+ "rig": "./dist/rig.js",
33
+ "rig-constellation": "./dist/rig.js"
16
34
  },
17
35
  "files": [
18
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>