@swarmvaultai/viewer 0.1.25 → 0.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ :root{--c-bg-base: #020617;--c-bg-surface: #0c1222;--c-bg-elevated: rgba(15, 23, 42, .88);--c-bg-inset: rgba(2, 6, 23, .82);--c-bg-input: #070d1a;--c-border: rgba(148, 163, 184, .1);--c-border-subtle: rgba(148, 163, 184, .06);--c-border-focus: rgba(125, 211, 252, .28);--c-border-danger: rgba(248, 113, 113, .24);--c-border-warning: rgba(251, 191, 36, .2);--c-text-primary: #e2e8f0;--c-text-secondary: #94a3b8;--c-text-muted: #64748b;--c-text-accent: #7dd3fc;--c-text-error: #f87171;--c-text-warning: #fbbf24;--c-accent-bg: rgba(14, 165, 233, .08);--c-danger-bg: rgba(127, 29, 29, .18);--font-sans: "Avenir Next", "Inter", "Segoe UI", system-ui, sans-serif;--font-mono: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;--text-2xs: .65rem;--text-xs: .72rem;--text-sm: .8rem;--text-base: .88rem;--text-lg: 1rem;--sp-1: 4px;--sp-2: 8px;--sp-3: 12px;--sp-4: 16px;--sp-5: 20px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 10px;--sidebar-width: 220px;--rail-width: 360px;--bar-height: 38px;color-scheme:dark;font-family:var(--font-sans);background:var(--c-bg-base);color:var(--c-text-primary)}*,*:before,*:after{box-sizing:border-box}body{margin:0;height:100vh;overflow:hidden;font-size:var(--text-sm);line-height:1.45;-webkit-font-smoothing:antialiased}#root{height:100vh;overflow:hidden}.app-shell{display:grid;grid-template-columns:var(--sidebar-width) minmax(0,1fr) var(--rail-width);grid-template-rows:var(--bar-height) minmax(0,1fr);grid-template-areas:"bar bar bar" "sidebar center rail";height:100vh;overflow:hidden}.app-bar{grid-area:bar;display:flex;align-items:center;gap:var(--sp-3);padding:0 var(--sp-4);background:var(--c-bg-surface);border-bottom:1px solid var(--c-border);z-index:10}.app-bar-title{font-size:var(--text-sm);font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--c-text-accent)}.app-bar-subtitle{font-size:var(--text-xs);color:var(--c-text-muted);letter-spacing:.04em}.sidebar{grid-area:sidebar;overflow-y:auto;padding:var(--sp-3);background:var(--c-bg-surface);border-right:1px solid var(--c-border);display:flex;flex-direction:column;gap:var(--sp-2);scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.sidebar-section{display:flex;flex-direction:column;gap:var(--sp-2)}.sidebar-heading{font-size:var(--text-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--c-text-muted);padding:var(--sp-1) 0;border-bottom:1px solid var(--c-border-subtle);margin-bottom:var(--sp-1)}.filter-group{display:flex;flex-direction:column;gap:3px}.filter-label{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted)}.center-area{grid-area:center;display:grid;grid-template-rows:auto minmax(0,1fr) auto;overflow:hidden}.stats-strip{display:flex;gap:var(--sp-4);padding:var(--sp-1) var(--sp-3);border-bottom:1px solid var(--c-border-subtle);background:var(--c-bg-surface);flex-wrap:wrap;align-items:baseline}.stat{display:flex;align-items:baseline;gap:var(--sp-1)}.stat-label{font-size:var(--text-2xs);color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.06em}.stat-value{font-family:var(--font-mono);font-size:var(--text-sm);color:var(--c-text-primary);font-weight:500}.canvas{min-height:0;background:radial-gradient(circle at 50% 50%,rgba(14,165,233,.03),transparent 70%),repeating-linear-gradient(0deg,transparent,transparent 39px,rgba(148,163,184,.03) 39px,rgba(148,163,184,.03) 40px),repeating-linear-gradient(90deg,transparent,transparent 39px,rgba(148,163,184,.03) 39px,rgba(148,163,184,.03) 40px),var(--c-bg-base)}.report-tabs{border-top:1px solid var(--c-border);background:var(--c-bg-surface);max-height:280px;overflow:hidden}.report-tabs .tabs{border:none;border-radius:0;background:transparent}.report-tabs .tab-panel{max-height:230px;overflow-y:auto}.report-stats{display:flex;gap:var(--sp-4);font-size:var(--text-sm);color:var(--c-text-secondary)}.report-stats strong{font-family:var(--font-mono);color:var(--c-text-primary);margin-left:var(--sp-1)}.surprise-row{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}.detail-rail{grid-area:rail;overflow-y:auto;padding:var(--sp-3);background:var(--c-bg-surface);border-left:1px solid var(--c-border);display:flex;flex-direction:column;gap:var(--sp-3);scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.tabs{border-radius:var(--radius-lg);border:1px solid var(--c-border);background:var(--c-bg-elevated);overflow:hidden}.tab-bar{display:flex;border-bottom:1px solid var(--c-border);padding:0 var(--sp-1);gap:0}.tab-btn{all:unset;padding:var(--sp-2) var(--sp-3);font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted);cursor:pointer;border-bottom:2px solid transparent;transition:color .12s,border-color .12s;white-space:nowrap}.tab-btn.is-active{color:var(--c-text-primary);border-bottom-color:var(--c-text-accent)}.tab-btn:hover:not(.is-active){color:var(--c-text-secondary)}.tab-count{margin-left:var(--sp-1);font-family:var(--font-mono);font-size:var(--text-2xs);color:var(--c-text-accent)}.tab-panel{padding:var(--sp-3);max-height:320px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.panel{background:var(--c-bg-elevated);border:1px solid var(--c-border);border-radius:var(--radius-lg);padding:var(--sp-3)}.panel-heading{margin:0 0 var(--sp-2);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted)}.card-list{display:grid;gap:var(--sp-2)}.card{background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2) var(--sp-3);display:flex;flex-direction:column;gap:3px}.card-warning{border-color:var(--c-border-warning)}.card-title{font-size:var(--text-sm);font-weight:600;color:var(--c-text-primary);margin:0;line-height:1.3}.result-card{all:unset;display:flex;flex-direction:column;gap:3px;background:var(--c-bg-inset);border:1px solid var(--c-border);border-radius:var(--radius-md);padding:var(--sp-2) var(--sp-3);cursor:pointer;transition:border-color .1s}.result-card:hover{border-color:var(--c-border-focus)}.result-card.is-active{border-color:var(--c-border-focus);background:#0ea5e90a}.input{background:var(--c-bg-input);color:var(--c-text-primary);border:1px solid var(--c-border);border-radius:var(--radius-sm);padding:6px var(--sp-2);font-family:var(--font-sans);font-size:var(--text-sm);width:100%;outline:none;transition:border-color .12s}.input:focus{border-color:var(--c-border-focus)}.input::placeholder{color:var(--c-text-muted)}select.input{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%2364748b'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;padding-right:24px;text-overflow:ellipsis}.btn{all:unset;display:inline-flex;align-items:center;gap:var(--sp-1);height:26px;padding:0 var(--sp-2);font-size:var(--text-xs);font-family:var(--font-sans);border-radius:var(--radius-sm);cursor:pointer;border:1px solid var(--c-border);background:transparent;color:var(--c-text-primary);transition:border-color .1s,background .1s;white-space:nowrap}.btn:hover{border-color:var(--c-border-focus)}.btn:disabled{opacity:.4;cursor:default;pointer-events:none}.btn-primary{border-color:var(--c-border-focus);background:var(--c-accent-bg)}.btn-danger{border-color:var(--c-border-danger);background:var(--c-danger-bg);color:var(--c-text-error)}.btn-ghost{border:none;background:transparent;color:var(--c-text-accent);padding:0 var(--sp-1);height:auto;font-size:var(--text-xs)}.btn-ghost:hover{text-decoration:underline;border:none}.action-row{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-1)}.chip-row{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-1)}.label{font-size:var(--text-2xs);text-transform:uppercase;letter-spacing:.06em;color:var(--c-text-muted);font-weight:500}.meta-grid{display:grid;grid-template-columns:auto 1fr;gap:2px var(--sp-3);font-size:var(--text-xs);align-items:baseline}.meta-label{color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.04em;font-size:var(--text-2xs);white-space:nowrap}.meta-value{color:var(--c-text-primary);word-break:break-all}.meta-value.mono,.text-mono{font-family:var(--font-mono)}.linked-section{margin-top:var(--sp-2);padding-top:var(--sp-2);border-top:1px solid var(--c-border-subtle)}.asset-preview{display:grid;gap:var(--sp-2);margin-top:var(--sp-2)}.asset-card{margin:0;display:grid;gap:var(--sp-1)}.asset-card img{width:100%;border-radius:var(--radius-md);border:1px solid var(--c-border);background:var(--c-bg-inset)}.asset-card figcaption{color:var(--c-text-muted);font-size:var(--text-2xs)}.content-pre{margin:var(--sp-2) 0 0;white-space:pre-wrap;overflow:auto;max-height:220px;padding:var(--sp-3);border-radius:var(--radius-md);background:var(--c-bg-inset);border:1px solid var(--c-border);font-family:var(--font-mono);font-size:var(--text-xs);color:var(--c-text-secondary);line-height:1.5;scrollbar-width:thin;scrollbar-color:var(--c-text-muted) transparent}.text-sm{font-size:var(--text-sm)}.text-muted{color:var(--c-text-muted)}.text-secondary{color:var(--c-text-secondary)}.text-error{color:var(--c-text-error);font-size:var(--text-xs)}code{font-family:var(--font-mono);font-size:var(--text-xs)}p,h3,h4{margin:0}a{color:var(--c-text-accent);text-decoration:none}a:hover{text-decoration:underline}@media(max-width:900px){.app-shell{grid-template-columns:1fr;grid-template-rows:var(--bar-height) auto minmax(300px,1fr) auto;grid-template-areas:"bar" "sidebar" "center" "rail";height:auto;min-height:100vh;overflow:auto}.sidebar{border-right:none;border-bottom:1px solid var(--c-border);max-height:260px}.center-area{grid-template-rows:auto minmax(50vh,1fr) auto}.detail-rail{border-left:none;border-top:1px solid var(--c-border)}.stats-strip{flex-wrap:wrap;gap:var(--sp-2)}}
package/dist/index.html CHANGED
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>SwarmVault Graph</title>
7
- <script type="module" crossorigin src="/assets/index-CmEm2Pd_.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-mRA-6D-Z.css">
7
+ <script type="module" crossorigin src="/assets/index-C7PCTMog.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-DiMCbjBi.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
package/dist/lib.d.ts CHANGED
@@ -14,6 +14,7 @@ type ViewerGraphNode = {
14
14
  label: string;
15
15
  sourceIds: string[];
16
16
  projectIds: string[];
17
+ sourceClass?: string;
17
18
  pageId?: string;
18
19
  language?: string;
19
20
  moduleId?: string;
@@ -50,6 +51,7 @@ type ViewerGraphPage = {
50
51
  kind: string;
51
52
  status: string;
52
53
  sourceType?: string;
54
+ sourceClass?: string;
53
55
  projectIds: string[];
54
56
  content: string;
55
57
  assets: ViewerOutputAsset[];
@@ -71,6 +73,7 @@ type ViewerGraphArtifact = {
71
73
  kind: string;
72
74
  status: string;
73
75
  sourceType?: string;
76
+ sourceClass?: string;
74
77
  projectIds: string[];
75
78
  nodeIds: string[];
76
79
  backlinks: string[];
@@ -87,6 +90,7 @@ type ViewerSearchResult = {
87
90
  status?: string;
88
91
  projectIds: string[];
89
92
  sourceType?: string;
93
+ sourceClass?: string;
90
94
  };
91
95
  type ViewerPagePayload = {
92
96
  path: string;
@@ -227,6 +231,18 @@ type ViewerGraphReport = {
227
231
  pages: number;
228
232
  communities: number;
229
233
  };
234
+ firstPartyOverview: {
235
+ nodes: number;
236
+ edges: number;
237
+ pages: number;
238
+ communities: number;
239
+ };
240
+ sourceClassBreakdown: Record<string, {
241
+ sources: number;
242
+ pages: number;
243
+ nodes: number;
244
+ }>;
245
+ warnings: string[];
230
246
  benchmark?: {
231
247
  generatedAt: string;
232
248
  stale: boolean;
@@ -282,6 +298,7 @@ type ViewerSearchOptions = {
282
298
  status?: string;
283
299
  project?: string;
284
300
  sourceType?: string;
301
+ sourceClass?: string;
285
302
  };
286
303
  declare function fetchGraphArtifact(input?: string, init?: RequestInit): Promise<ViewerGraphArtifact>;
287
304
  declare function searchViewerPages(query: string, options?: ViewerSearchOptions): Promise<ViewerSearchResult[]>;
package/dist/lib.js CHANGED
@@ -33,6 +33,7 @@ async function searchViewerPages(query, options = {}) {
33
33
  const status = options.status ?? "all";
34
34
  const project = options.project ?? "all";
35
35
  const sourceType = options.sourceType ?? "all";
36
+ const sourceClass = options.sourceClass ?? "all";
36
37
  if (embedded) {
37
38
  const normalizedQuery = query.trim().toLowerCase();
38
39
  if (!normalizedQuery) {
@@ -40,7 +41,7 @@ async function searchViewerPages(query, options = {}) {
40
41
  }
41
42
  return embedded.pages.filter((page) => kind === "all" ? true : page.kind === kind).filter((page) => status === "all" ? true : page.status === status).filter(
42
43
  (page) => project === "all" ? true : project === "unassigned" ? page.projectIds.length === 0 : page.projectIds.includes(project)
43
- ).filter((page) => sourceType === "all" ? true : (page.sourceType ?? "") === sourceType).map((page) => {
44
+ ).filter((page) => sourceType === "all" ? true : (page.sourceType ?? "") === sourceType).filter((page) => sourceClass === "all" ? true : (page.sourceClass ?? "") === sourceClass).map((page) => {
44
45
  const haystack = `${page.title}
45
46
  ${page.content}`.toLowerCase();
46
47
  const score = haystack.includes(normalizedQuery) ? haystack.indexOf(normalizedQuery) : Number.POSITIVE_INFINITY;
@@ -53,7 +54,8 @@ ${page.content}`.toLowerCase();
53
54
  kind: page.kind,
54
55
  status: page.status,
55
56
  projectIds: page.projectIds,
56
- sourceType: page.sourceType
57
+ sourceType: page.sourceType,
58
+ sourceClass: page.sourceClass
57
59
  };
58
60
  }).filter((page) => Number.isFinite(page.rank)).sort((left, right) => left.rank - right.rank || left.title.localeCompare(right.title)).slice(0, limit);
59
61
  }
@@ -63,7 +65,8 @@ ${page.content}`.toLowerCase();
63
65
  kind,
64
66
  status,
65
67
  project,
66
- sourceType
68
+ sourceType,
69
+ sourceClass
67
70
  });
68
71
  const response = await fetch(`/api/search?${params.toString()}`);
69
72
  if (!response.ok) {
@@ -86,7 +89,8 @@ async function fetchViewerPage(path) {
86
89
  kind: page.kind,
87
90
  status: page.status,
88
91
  project_ids: page.projectIds,
89
- source_type: page.sourceType
92
+ source_type: page.sourceType,
93
+ source_class: page.sourceClass
90
94
  },
91
95
  content: page.content,
92
96
  assets: page.assets ?? []
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swarmvaultai/viewer",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "description": "Graph viewer package for SwarmVault graph artifacts.",
5
5
  "type": "module",
6
6
  "main": "dist/lib.js",
@@ -37,13 +37,6 @@
37
37
  "engines": {
38
38
  "node": ">=24.0.0"
39
39
  },
40
- "scripts": {
41
- "build": "pnpm run build:lib && pnpm run build:app",
42
- "build:lib": "tsup src/lib.ts --format esm --dts --out-dir dist --clean",
43
- "build:app": "vite build",
44
- "test": "node -e \"process.exit(0)\"",
45
- "typecheck": "tsc --noEmit"
46
- },
47
40
  "dependencies": {
48
41
  "cytoscape": "^3.33.1",
49
42
  "react": "^19.1.1",
@@ -57,5 +50,12 @@
57
50
  "tsup": "^8.5.0",
58
51
  "typescript": "^5.9.2",
59
52
  "vite": "^7.1.7"
53
+ },
54
+ "scripts": {
55
+ "build": "pnpm run build:lib && pnpm run build:app",
56
+ "build:lib": "tsup src/lib.ts --format esm --dts --out-dir dist --clean",
57
+ "build:app": "vite build",
58
+ "test": "node -e \"process.exit(0)\"",
59
+ "typecheck": "tsc --noEmit"
60
60
  }
61
- }
61
+ }