@vreko/cli 3.3.0 → 3.3.1
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/dist/{InitApp-YM5CK55D.js → InitApp-2J6XGUNQ.js} +3 -3
- package/dist/{InitApp-YM5CK55D.js.map → InitApp-2J6XGUNQ.js.map} +1 -1
- package/dist/{chunk-53BJRUUT.js → chunk-2OPUNVDJ.js} +4 -4
- package/dist/{chunk-53BJRUUT.js.map → chunk-2OPUNVDJ.js.map} +1 -1
- package/dist/{chunk-3YXBGNHD.js → chunk-AXNZWZ26.js} +3 -3
- package/dist/{chunk-3YXBGNHD.js.map → chunk-AXNZWZ26.js.map} +1 -1
- package/dist/{chunk-FROYVC6U.js → chunk-B42UQ2W7.js} +5 -5
- package/dist/{chunk-FROYVC6U.js.map → chunk-B42UQ2W7.js.map} +1 -1
- package/dist/{chunk-HEUTZR52.js → chunk-MWTSOZTM.js} +3 -2
- package/dist/chunk-MWTSOZTM.js.map +1 -0
- package/dist/{dashboardServer-2T7OBLSV.js → dashboardServer-MELKRCBX.js} +3 -3
- package/dist/{dashboardServer-2T7OBLSV.js.map → dashboardServer-MELKRCBX.js.map} +1 -1
- package/dist/index.js +19 -14
- package/dist/index.js.map +1 -1
- package/dist/init-command-ZUISJBCT.js +7 -0
- package/dist/{init-command-LXEBDSYX.js.map → init-command-ZUISJBCT.js.map} +1 -1
- package/dist/{init-core-ETGVVENN.js → init-core-FQYDSJWC.js} +5 -5
- package/dist/{init-core-ETGVVENN.js.map → init-core-FQYDSJWC.js.map} +1 -1
- package/package.json +1 -1
- package/scripts/publish-clean.mjs +14 -3
- package/dist/chunk-HEUTZR52.js.map +0 -1
- package/dist/init-command-LXEBDSYX.js +0 -7
- /package/dist/{._InitApp-YM5CK55D.js → ._InitApp-2J6XGUNQ.js} +0 -0
- /package/dist/{._InitApp-YM5CK55D.js.map → ._InitApp-2J6XGUNQ.js.map} +0 -0
- /package/dist/{._chunk-3YXBGNHD.js → ._chunk-2OPUNVDJ.js} +0 -0
- /package/dist/{._chunk-3YXBGNHD.js.map → ._chunk-2OPUNVDJ.js.map} +0 -0
- /package/dist/{._chunk-53BJRUUT.js → ._chunk-AXNZWZ26.js} +0 -0
- /package/dist/{._chunk-53BJRUUT.js.map → ._chunk-AXNZWZ26.js.map} +0 -0
- /package/dist/{._chunk-FROYVC6U.js → ._chunk-B42UQ2W7.js} +0 -0
- /package/dist/{._chunk-FROYVC6U.js.map → ._chunk-B42UQ2W7.js.map} +0 -0
- /package/dist/{._chunk-HEUTZR52.js → ._chunk-MWTSOZTM.js} +0 -0
- /package/dist/{._chunk-HEUTZR52.js.map → ._chunk-MWTSOZTM.js.map} +0 -0
- /package/dist/{._dashboardServer-2T7OBLSV.js → ._dashboardServer-MELKRCBX.js} +0 -0
- /package/dist/{._dashboardServer-2T7OBLSV.js.map → ._dashboardServer-MELKRCBX.js.map} +0 -0
- /package/dist/{._init-command-LXEBDSYX.js → ._init-command-ZUISJBCT.js} +0 -0
- /package/dist/{._init-command-LXEBDSYX.js.map → ._init-command-ZUISJBCT.js.map} +0 -0
- /package/dist/{._init-core-ETGVVENN.js → ._init-core-FQYDSJWC.js} +0 -0
- /package/dist/{._init-core-ETGVVENN.js.map → ._init-core-FQYDSJWC.js.map} +0 -0
|
@@ -114,10 +114,11 @@ function resolveWorkspaceJsonPath(workspacePath) {
|
|
|
114
114
|
if (existsSync(primary)) {
|
|
115
115
|
return primary;
|
|
116
116
|
}
|
|
117
|
+
console.warn(`[vreko] .agents/workspace.json not found, falling back to legacy .agents/agents.workspace.json in ${workspacePath}`);
|
|
117
118
|
return join(workspacePath, ".agents", "agents.workspace.json");
|
|
118
119
|
}
|
|
119
120
|
__name(resolveWorkspaceJsonPath, "resolveWorkspaceJsonPath");
|
|
120
121
|
|
|
121
122
|
export { findGitRoot, findWorkspaceRoot, resolveWorkspaceJsonPath, resolveWorkspaceRoot };
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
123
|
-
//# sourceMappingURL=chunk-
|
|
123
|
+
//# sourceMappingURL=chunk-MWTSOZTM.js.map
|
|
124
|
+
//# sourceMappingURL=chunk-MWTSOZTM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/workspace.ts"],"names":["validateWorkspacePath","workspacePath","normalizedPath","normalize","absolutePath","resolve","startsWith","process","cwd","valid","root","error","hasGit","existsSync","hasPackageJson","hasVreko","stat","lstatSync","isSymbolicLink","Error","message","resolveWorkspaceRoot","explicitPath","validation","currentPath","maxIterations","i","hasMarker","parent","findWorkspaceRoot","dir","join","findGitRoot","execSync","require","encoding","stdio","trim","resolveWorkspaceJsonPath","primary","console","warn"],"mappings":"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","file":"chunk-MWTSOZTM.js","sourcesContent":["/**\n * Workspace Utilities\n *\n * Shared workspace detection and path utilities for CLI commands.\n * Supersedes @vreko/mcp/middleware workspace helpers - no transitive engine/intelligence deps.\n *\n * @module utils/workspace\n */\n\nimport { existsSync, lstatSync } from \"node:fs\";\nimport { join, normalize, resolve } from \"node:path\";\n\n// =============================================================================\n// WORKSPACE VALIDATION (migrated from @vreko/mcp/middleware - Phase 3A)\n// =============================================================================\n\nexport interface WorkspaceValidationResult {\n\tvalid: boolean;\n\troot: string;\n\terror?: string;\n}\n\n/**\n * Validate a workspace path according to security criteria.\n * Checks for .git, package.json, or .vreko markers; rejects symlinks.\n */\nexport function validateWorkspacePath(workspacePath: string): WorkspaceValidationResult {\n\ttry {\n\t\tconst normalizedPath = normalize(workspacePath);\n\t\tconst absolutePath = resolve(normalizedPath);\n\n\t\tif (!absolutePath.startsWith(process.cwd()) && !absolutePath.startsWith(\"/\")) {\n\t\t\treturn { valid: false, root: \"\", error: \"Invalid workspace path\" };\n\t\t}\n\n\t\tconst hasGit = existsSync(resolve(absolutePath, \".git\"));\n\t\tconst hasPackageJson = existsSync(resolve(absolutePath, \"package.json\"));\n\t\tconst hasVreko = existsSync(resolve(absolutePath, \".vreko\"));\n\n\t\tif (!hasGit && !hasPackageJson && !hasVreko) {\n\t\t\treturn {\n\t\t\t\tvalid: false,\n\t\t\t\troot: absolutePath,\n\t\t\t\terror: \"Workspace must contain at least one marker: .git, package.json, or .vreko\",\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst stat = lstatSync(absolutePath);\n\t\t\tif (stat.isSymbolicLink()) {\n\t\t\t\treturn {\n\t\t\t\t\tvalid: false,\n\t\t\t\t\troot: absolutePath,\n\t\t\t\t\terror: \"Workspace path cannot be a symbolic link\",\n\t\t\t\t};\n\t\t\t}\n\t\t} catch {\n\t\t\treturn { valid: false, root: absolutePath, error: \"Cannot access workspace path\" };\n\t\t}\n\n\t\treturn { valid: true, root: absolutePath };\n\t} catch (error) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\troot: \"\",\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error validating workspace\",\n\t\t};\n\t}\n}\n\n/**\n * Resolve workspace root with fallback chain:\n * 1. Explicit path (if provided and valid)\n * 2. Traversal upward from cwd looking for .git / package.json / .vreko\n * 3. cwd itself as last resort\n */\nexport function resolveWorkspaceRoot(explicitPath?: string): WorkspaceValidationResult {\n\tif (explicitPath) {\n\t\tconst validation = validateWorkspacePath(explicitPath);\n\t\tif (validation.valid) {\n\t\t\treturn validation;\n\t\t}\n\t}\n\n\t// Traverse upward\n\tlet currentPath = resolve(process.cwd());\n\tconst maxIterations = 50;\n\tfor (let i = 0; i < maxIterations; i++) {\n\t\tconst hasMarker =\n\t\t\texistsSync(resolve(currentPath, \".git\")) ||\n\t\t\texistsSync(resolve(currentPath, \"package.json\")) ||\n\t\t\texistsSync(resolve(currentPath, \".vreko\"));\n\t\tif (hasMarker) {\n\t\t\treturn validateWorkspacePath(currentPath);\n\t\t}\n\t\tconst parent = resolve(currentPath, \"..\");\n\t\tif (parent === currentPath) {\n\t\t\tbreak;\n\t\t}\n\t\tcurrentPath = parent;\n\t}\n\n\t// Fallback: cwd\n\treturn validateWorkspacePath(process.cwd());\n}\n\n/**\n * Find the workspace root by traversing up from the given directory\n * looking for a .vreko directory.\n *\n * @param cwd - Current working directory to start from\n * @returns Absolute path to workspace root, or null if not found\n */\nexport function findWorkspaceRoot(cwd: string): string | null {\n\tlet dir = cwd;\n\twhile (dir !== \"/\") {\n\t\tif (existsSync(join(dir, \".vreko\"))) {\n\t\t\treturn dir;\n\t\t}\n\t\tconst parent = join(dir, \"..\");\n\t\tif (parent === dir) {\n\t\t\tbreak;\n\t\t}\n\t\tdir = parent;\n\t}\n\treturn null;\n}\n\n/**\n * Find git root by traversing up from the given directory.\n *\n * @param cwd - Current working directory to start from\n * @returns Absolute path to git root, or null if not in a git repo\n */\nexport function findGitRoot(cwd: string): string | null {\n\ttry {\n\t\tconst { execSync } = require(\"node:child_process\");\n\t\treturn execSync(\"git rev-parse --show-toplevel\", {\n\t\t\tcwd,\n\t\t\tencoding: \"utf-8\",\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t}).trim();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Resolve the canonical path to workspace.json.\n * Tries the v0.4 path first (`.agents/workspace.json`),\n * then falls back to the legacy path (`.agents/agents.workspace.json`).\n *\n * @param workspacePath - Absolute path to the workspace root\n * @returns Absolute path to workspace.json (may or may not exist)\n */\nexport function resolveWorkspaceJsonPath(workspacePath: string): string {\n\tconst primary = join(workspacePath, \".agents\", \"workspace.json\");\n\tif (existsSync(primary)) {\n\t\treturn primary;\n\t}\n\tconsole.warn(\n\t\t`[vreko] .agents/workspace.json not found, falling back to legacy .agents/agents.workspace.json in ${workspacePath}`,\n\t);\n\treturn join(workspacePath, \".agents\", \"agents.workspace.json\");\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { writeDashboardDescriptor, deleteDashboardDescriptor } from './chunk-I4LIA7HE.js';
|
|
3
|
-
import { resolveWorkspaceJsonPath } from './chunk-
|
|
3
|
+
import { resolveWorkspaceJsonPath } from './chunk-MWTSOZTM.js';
|
|
4
4
|
import { __name } from './chunk-EWOJGXRX.js';
|
|
5
5
|
import { readFileSync } from 'fs';
|
|
6
6
|
import { createServer } from 'http';
|
|
@@ -898,5 +898,5 @@ async function startDashboardServer(options) {
|
|
|
898
898
|
__name(startDashboardServer, "startDashboardServer");
|
|
899
899
|
|
|
900
900
|
export { startDashboardServer };
|
|
901
|
-
//# sourceMappingURL=dashboardServer-
|
|
902
|
-
//# sourceMappingURL=dashboardServer-
|
|
901
|
+
//# sourceMappingURL=dashboardServer-MELKRCBX.js.map
|
|
902
|
+
//# sourceMappingURL=dashboardServer-MELKRCBX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/dashboard/EmptyState.tsx","../src/ui/dashboard/panels/AIAttributionPanel.tsx","../src/ui/dashboard/panels/CoChangeClustersPanel.tsx","../src/ui/dashboard/panels/FragileZonesPanel.tsx","../src/ui/dashboard/panels/RecentIntelligencePanel.tsx","../src/ui/dashboard/panels/WatchStatusPanel.tsx","../src/ui/dashboard/BrowserDashboardApp.tsx","../src/ui/dashboard/server/sse.ts","../src/ui/dashboard/server/dashboardServer.ts"],"names":["EmptyState","icon","title","hint","div","className","_jsx","span","aria-hidden","p","AIAttributionPanel","data","_data","_jsxs","shortPath","file","parts","split","length","slice","join","CoChangeClustersPanel","clusters","generated","coChange","ul","map","cluster","i","li","files","occurrences","rate","toFixed","fragilityColor","score","FragileZonesPanel","items","fragility","filter","e","excluded","entry","fragilityScore","style","width","Math","round","RecentIntelligencePanel","WatchStatusPanel","serviceConnected","health","fileIndex","fileCount","confidence","observationCount","state","intelligenceState","toLocaleString","BrowserDashboardApp","generatedAt","ts","Date","toLocaleTimeString","id","header","main","footer","a","href","target","rel","SseManager","clients","Set","addClient","res","writeHead","Connection","write","add","on","removeClient","delete","broadcast","event","payload","client","clientCount","size","DASHBOARD_CSS","DASHBOARD_JS","readWorkspaceJson","workspaceJsonPath","raw","readFileSync","JSON","parse","buildHtmlPage","bodyHtml","renderToStaticMarkup","createElement","build503Page","reason","empty","replace","findFreePort","startPort","net","maxAttempts","port","free","Promise","resolve","probe","createServer","once","close","listen","Error","startDashboardServer","options","workspacePath","requestedPort","Number","process","env","VREKO_DASHBOARD_PORT","resolveWorkspaceJsonPath","sseManager","url","watcher","chokidar","watch","persistent","ignoreInitial","awaitWriteFinish","stabilityThreshold","pollInterval","server","req","pathname","end","stringify","degraded","sseClients","html","reject","writeDashboardDescriptor","pid","deleteDashboardDescriptor","exit"],"mappings":"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","file":"dashboardServer-2T7OBLSV.js","sourcesContent":["/**\n * EmptyState - shared empty/partial state component for dashboard panels.\n * Every panel reuses this instead of rendering a blank box.\n */\n\ninterface EmptyStateProps {\n\ticon: string;\n\ttitle: string;\n\thint: string;\n}\n\nexport function EmptyState({ icon, title, hint }: EmptyStateProps) {\n\treturn (\n\t\t<div className=\"empty-state\">\n\t\t\t<span className=\"empty-icon\" aria-hidden=\"true\">\n\t\t\t\t{icon}\n\t\t\t</span>\n\t\t\t<p className=\"empty-title\">{title}</p>\n\t\t\t<p className=\"empty-hint\">{hint}</p>\n\t\t</div>\n\t);\n}\n","/**\n * AIAttributionPanel - AI-change attribution breakdown.\n *\n * SCHEMA GAP: generated.attribution does NOT exist in workspace.json.\n * This panel always renders an informative empty state.\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n};\n\nexport function AIAttributionPanel({ data: _data }: Props) {\n\t// generated.attribution is not present in the schema - always empty state\n\treturn (\n\t\t<div className=\"panel panel-attribution\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">AI Attribution</span>\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t<EmptyState\n\t\t\t\t\ticon=\"✨\"\n\t\t\t\t\ttitle=\"AI attribution not yet available\"\n\t\t\t\t\thint=\"Per-file AI change attribution will appear here once the Vreko service has captured enough sessions.\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * CoChangeClustersPanel - file pairs that frequently change together.\n * Reads from: generated.coChange (spec says \"clusters\" - actual field is \"coChange\").\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n};\n\nfunction shortPath(file: string): string {\n\tconst parts = file.split(\"/\");\n\tif (parts.length <= 2) return file;\n\treturn `…/${parts.slice(-1).join(\"/\")}`;\n}\n\nexport function CoChangeClustersPanel({ data }: Props) {\n\t// Actual field is coChange, not clusters\n\tconst clusters = (data.generated?.coChange ?? []).slice(0, 6);\n\n\treturn (\n\t\t<div className=\"panel panel-cochange\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">Co-change Clusters</span>\n\t\t\t\t{clusters.length > 0 && <span className=\"panel-count\">{clusters.length} pairs</span>}\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t{clusters.length === 0 ? (\n\t\t\t\t\t<EmptyState\n\t\t\t\t\t\ticon=\"🔗\"\n\t\t\t\t\t\ttitle=\"No co-change patterns yet\"\n\t\t\t\t\t\thint=\"Vreko detects files that change together. These clusters appear after enough commit history is observed.\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<ul className=\"cochange-list\">\n\t\t\t\t\t\t{clusters.map((cluster, i) => (\n\t\t\t\t\t\t\t<li key={i} className=\"cochange-item\">\n\t\t\t\t\t\t\t\t<div className=\"cochange-files\">\n\t\t\t\t\t\t\t\t\t{cluster.files.slice(0, 3).map((file) => (\n\t\t\t\t\t\t\t\t\t\t<span key={file} className=\"cochange-badge\" title={file}>\n\t\t\t\t\t\t\t\t\t\t\t{shortPath(file)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t{cluster.files.length > 3 && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"cochange-badge cochange-more\">\n\t\t\t\t\t\t\t\t\t\t\t+{cluster.files.length - 3}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<span className=\"cochange-rate\">\n\t\t\t\t\t\t\t\t\t{cluster.occurrences}x · {(cluster.rate * 100).toFixed(0)}%\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * FragileZonesPanel - top fragile files with heat-bar scores.\n * Reads from: generated.fragility\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n};\n\nfunction fragilityColor(score: number): string {\n\tif (score >= 0.7) return \"fragility-high\";\n\tif (score >= 0.35) return \"fragility-medium\";\n\treturn \"fragility-low\";\n}\n\nfunction shortPath(file: string): string {\n\tconst parts = file.split(\"/\");\n\tif (parts.length <= 3) return file;\n\treturn `…/${parts.slice(-2).join(\"/\")}`;\n}\n\nexport function FragileZonesPanel({ data }: Props) {\n\tconst items = (data.generated?.fragility ?? []).filter((e) => !e.excluded).slice(0, 8);\n\n\treturn (\n\t\t<div className=\"panel panel-fragile\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">Fragile Zones</span>\n\t\t\t\t{items.length > 0 && <span className=\"panel-count\">{items.length} files</span>}\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t{items.length === 0 ? (\n\t\t\t\t\t<EmptyState\n\t\t\t\t\t\ticon=\"♥\"\n\t\t\t\t\t\ttitle=\"No fragile files detected\"\n\t\t\t\t\t\thint=\"Vreko tracks reverts and churn - fragile files surface here after enough observations.\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<ul className=\"fragile-list\">\n\t\t\t\t\t\t{items.map((entry) => (\n\t\t\t\t\t\t\t<li key={entry.file} className=\"fragile-item\">\n\t\t\t\t\t\t\t\t<span className=\"fragile-path\" title={entry.file}>\n\t\t\t\t\t\t\t\t\t{shortPath(entry.file)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"fragile-bar-wrap\">\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={`fragile-bar ${fragilityColor(entry.fragilityScore)}`}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${Math.round(entry.fragilityScore * 100)}%` }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"fragile-score\">{entry.fragilityScore.toFixed(2)}</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * RecentIntelligencePanel - recent learned patterns and insights.\n *\n * SCHEMA GAP: generated.learnings does NOT exist in workspace.json.\n * This panel always renders an informative empty state.\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n};\n\nexport function RecentIntelligencePanel({ data: _data }: Props) {\n\t// generated.learnings is not present in the schema - always empty state\n\treturn (\n\t\t<div className=\"panel panel-intelligence\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">Recent Intelligence</span>\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t<EmptyState\n\t\t\t\t\ticon=\"🧠\"\n\t\t\t\t\ttitle=\"No intelligence captured yet\"\n\t\t\t\t\thint=\"Run vr learn or use AI coding tools to capture patterns. Insights will surface here as they accumulate.\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * WatchStatusPanel - Vreko service connection status and file index summary.\n * Reads from: health, generated.fileIndex\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n\tserviceConnected: boolean;\n};\n\nexport function WatchStatusPanel({ data, serviceConnected }: Props) {\n\tconst health = data.health;\n\tconst fileIndex = data.generated?.fileIndex ?? [];\n\tconst fileCount = fileIndex.length;\n\tconst confidence = health?.confidence ?? 0;\n\tconst observationCount = health?.observationCount ?? 0;\n\tconst state = health?.intelligenceState ?? \"unknown\";\n\n\treturn (\n\t\t<div className=\"panel panel-watch\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">Watch Status</span>\n\t\t\t\t<span className={`status-dot ${serviceConnected ? \"status-connected\" : \"status-disconnected\"}`} />\n\t\t\t\t<span className=\"status-label\">{serviceConnected ? \"Connected\" : \"Not connected\"}</span>\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t{fileCount === 0 && observationCount === 0 ? (\n\t\t\t\t\t<EmptyState\n\t\t\t\t\t\ticon=\"●\"\n\t\t\t\t\t\ttitle=\"No observations yet\"\n\t\t\t\t\t\thint=\"Run vr sync to start collecting workspace intelligence.\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<ul className=\"stat-list\">\n\t\t\t\t\t\t<li className=\"stat-item\">\n\t\t\t\t\t\t\t<span className=\"stat-label\">Files indexed</span>\n\t\t\t\t\t\t\t<span className=\"stat-value\">{fileCount.toLocaleString()}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"stat-item\">\n\t\t\t\t\t\t\t<span className=\"stat-label\">Observations</span>\n\t\t\t\t\t\t\t<span className=\"stat-value\">{observationCount.toLocaleString()}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"stat-item\">\n\t\t\t\t\t\t\t<span className=\"stat-label\">Confidence</span>\n\t\t\t\t\t\t\t<span className=\"stat-value\">{(confidence * 100).toFixed(0)}%</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"stat-item\">\n\t\t\t\t\t\t\t<span className=\"stat-label\">State</span>\n\t\t\t\t\t\t\t<span className=\"stat-value stat-mono\">{state}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * BrowserDashboardApp - SSR root for the browser-based local dashboard.\n *\n * Rendered server-side via react-dom/server renderToStaticMarkup.\n * Wraps all five panels and wires them to the workspace.json payload.\n * This is NOT the TUI Ink dashboard (DashboardApp.tsx) - it is a\n * separate, React-to-HTML-string entry point for the HTTP server.\n */\n\nimport { AIAttributionPanel } from \"./panels/AIAttributionPanel.js\";\nimport { CoChangeClustersPanel } from \"./panels/CoChangeClustersPanel.js\";\nimport { FragileZonesPanel } from \"./panels/FragileZonesPanel.js\";\nimport { RecentIntelligencePanel } from \"./panels/RecentIntelligencePanel.js\";\nimport { WatchStatusPanel } from \"./panels/WatchStatusPanel.js\";\nimport type { WorkspaceJson } from \"./types.js\";\n\ninterface BrowserDashboardAppProps {\n\tdata: WorkspaceJson;\n\tserviceConnected: boolean;\n\tgeneratedAt?: string;\n}\n\nexport function BrowserDashboardApp({ data, serviceConnected, generatedAt }: BrowserDashboardAppProps) {\n\tconst ts = generatedAt ? new Date(generatedAt).toLocaleTimeString() : \" - \";\n\n\treturn (\n\t\t<div id=\"vreko-dashboard\">\n\t\t\t<header className=\"dashboard-header\">\n\t\t\t\t<div className=\"header-brand\">\n\t\t\t\t\t<span className=\"brand-mark\">v</span>\n\t\t\t\t\t<span className=\"brand-name\">Vreko</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"header-meta\">\n\t\t\t\t\t<span className={`header-status-dot ${serviceConnected ? \"dot-connected\" : \"dot-disconnected\"}`} />\n\t\t\t\t\t<span className=\"header-status-label\">\n\t\t\t\t\t\t{serviceConnected ? \"Service connected\" : \"Service not connected\"}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"header-ts\">Updated {ts}</span>\n\t\t\t\t</div>\n\t\t\t</header>\n\n\t\t\t{!serviceConnected && (\n\t\t\t\t<div className=\"degraded-banner\">\n\t\t\t\t\tVreko service not connected - showing last captured state. Live updates resume when the service is\n\t\t\t\t\trunning.\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<main className=\"dashboard-grid\">\n\t\t\t\t<WatchStatusPanel data={data} serviceConnected={serviceConnected} />\n\t\t\t\t<FragileZonesPanel data={data} />\n\t\t\t\t<CoChangeClustersPanel data={data} />\n\t\t\t\t<AIAttributionPanel data={data} />\n\t\t\t\t<RecentIntelligencePanel data={data} />\n\t\t\t</main>\n\n\t\t\t<footer className=\"dashboard-footer\">\n\t\t\t\t<span>\n\t\t\t\t\t<a href=\"https://vreko.dev\" target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t\t\tvreko.dev\n\t\t\t\t\t</a>\n\t\t\t\t</span>\n\t\t\t\t<span>Local dashboard · 127.0.0.1</span>\n\t\t\t</footer>\n\t\t</div>\n\t);\n}\n","/**\n * SSE Manager\n *\n * Manages a set of connected SSE clients and broadcasts events.\n * SSE is a notification-only channel - workspace.json body is never pushed over SSE.\n *\n * Emit format: event: workspace:updated\\ndata: {}\\n\\n\n */\n\nimport type { ServerResponse } from \"node:http\";\n\nexport class SseManager {\n\tprivate clients: Set<ServerResponse> = new Set();\n\n\t/**\n\t * Register a new SSE client connection.\n\t * Sets appropriate headers for the SSE stream.\n\t */\n\taddClient(res: ServerResponse): void {\n\t\tres.writeHead(200, {\n\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\tConnection: \"keep-alive\",\n\t\t\t\"X-Accel-Buffering\": \"no\",\n\t\t});\n\t\tres.write(\": connected\\n\\n\");\n\t\tthis.clients.add(res);\n\n\t\tres.on(\"close\", () => {\n\t\t\tthis.removeClient(res);\n\t\t});\n\t}\n\n\t/**\n\t * Deregister a client.\n\t */\n\tremoveClient(res: ServerResponse): void {\n\t\tthis.clients.delete(res);\n\t}\n\n\t/**\n\t * Broadcast an event to all connected clients.\n\t * Only sends the event name and an empty data payload (notification-only).\n\t */\n\tbroadcast(event: string): void {\n\t\tconst payload = `event: ${event}\\ndata: {}\\n\\n`;\n\t\tfor (const client of this.clients) {\n\t\t\ttry {\n\t\t\t\tclient.write(payload);\n\t\t\t} catch {\n\t\t\t\t// Client disconnected mid-write - remove it\n\t\t\t\tthis.removeClient(client);\n\t\t\t}\n\t\t}\n\t}\n\n\tget clientCount(): number {\n\t\treturn this.clients.size;\n\t}\n}\n","/**\n * Dashboard HTTP Server\n *\n * Serves the Vreko local browser dashboard.\n * - Binds 127.0.0.1 ONLY (never 0.0.0.0)\n * - Default port: 7842 (VREKO_DASHBOARD_PORT env / --port flag)\n * - On EADDRINUSE: scans port+1 to port+20\n * - Serves SSR HTML, /api/workspace, /api/health, /events (SSE)\n * - SSE is notification-only; workspace.json body is fetched via /api/workspace\n * - File-watch fallback via chokidar when service not connected\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { createServer } from \"node:http\";\nimport chokidar from \"chokidar\";\nimport { createElement } from \"react\";\nimport { renderToStaticMarkup } from \"react-dom/server\";\nimport { resolveWorkspaceJsonPath } from \"../../../utils/workspace.js\";\nimport { BrowserDashboardApp } from \"../BrowserDashboardApp.js\";\nimport type { WorkspaceJson } from \"../types.js\";\nimport { deleteDashboardDescriptor, writeDashboardDescriptor } from \"./descriptor.js\";\nimport { SseManager } from \"./sse.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DashboardServerOptions {\n\tworkspacePath: string;\n\tport?: number;\n}\n\nexport interface DashboardServerHandle {\n\tport: number;\n\turl: string;\n\tserver: Server;\n\tclose: () => void;\n}\n\n// =============================================================================\n// INLINE CSS - production-grade dark terminal aesthetic\n// =============================================================================\n\nconst DASHBOARD_CSS = `\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n:root {\n --green: #4ADE80;\n --green-dim: #22c55e;\n --amber: #f59e0b;\n --red: #f87171;\n --bg: #0d1117;\n --bg-panel: #161b22;\n --bg-panel-header: #1c2330;\n --border: #30363d;\n --text: #e6edf3;\n --text-dim: #8b949e;\n --text-mono: #d2a8ff;\n --radius: 8px;\n}\n\nbody {\n background: var(--bg);\n color: var(--text);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n min-height: 100vh;\n}\n\n#vreko-dashboard {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n max-width: 1200px;\n margin: 0 auto;\n padding: 0 16px;\n}\n\n/* HEADER */\n.dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 0 12px;\n border-bottom: 1px solid var(--border);\n margin-bottom: 20px;\n}\n.header-brand {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.brand-mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n background: var(--green);\n color: #000;\n font-weight: 700;\n font-size: 14px;\n border-radius: 6px;\n}\n.brand-name {\n font-size: 18px;\n font-weight: 600;\n color: var(--text);\n letter-spacing: -0.3px;\n}\n.header-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 12px;\n color: var(--text-dim);\n}\n.header-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n.dot-connected { background: var(--green); box-shadow: 0 0 6px var(--green); }\n.dot-disconnected { background: var(--amber); }\n.header-ts { color: var(--text-dim); }\n\n/* DEGRADED BANNER */\n.degraded-banner {\n background: rgba(245,158,11,0.12);\n border: 1px solid rgba(245,158,11,0.35);\n border-radius: var(--radius);\n padding: 10px 14px;\n margin-bottom: 16px;\n color: var(--amber);\n font-size: 13px;\n}\n\n/* GRID */\n.dashboard-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n flex: 1;\n}\n@media (max-width: 700px) {\n .dashboard-grid { grid-template-columns: 1fr; }\n}\n\n/* PANEL */\n.panel {\n background: var(--bg-panel);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n overflow: hidden;\n}\n.panel-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--bg-panel-header);\n border-bottom: 1px solid var(--border);\n}\n.panel-title {\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.6px;\n color: var(--green);\n}\n.panel-count {\n margin-left: auto;\n font-size: 11px;\n color: var(--text-dim);\n}\n.panel-body { padding: 14px; }\n\n/* STATUS DOT IN PANEL */\n.status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n.status-connected { background: var(--green); box-shadow: 0 0 5px var(--green); }\n.status-disconnected { background: var(--amber); }\n.status-label { font-size: 12px; color: var(--text-dim); }\n\n/* STAT LIST */\n.stat-list { list-style: none; display: flex; flex-direction: column; gap: 6px; }\n.stat-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 13px;\n}\n.stat-label { color: var(--text-dim); }\n.stat-value { font-weight: 500; }\n.stat-mono { font-family: ui-monospace, monospace; font-size: 12px; color: var(--text-mono); }\n\n/* FRAGILE LIST */\n.fragile-list { list-style: none; display: flex; flex-direction: column; gap: 8px; }\n.fragile-item {\n display: grid;\n grid-template-columns: 1fr 80px 36px;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n}\n.fragile-path {\n font-family: ui-monospace, monospace;\n color: var(--text-dim);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.fragile-bar-wrap {\n height: 6px;\n background: rgba(255,255,255,0.07);\n border-radius: 3px;\n overflow: hidden;\n}\n.fragile-bar {\n display: block;\n height: 100%;\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n.fragility-high { background: var(--red); }\n.fragility-medium { background: var(--amber); }\n.fragility-low { background: var(--green-dim); }\n.fragile-score {\n font-family: ui-monospace, monospace;\n text-align: right;\n color: var(--text-dim);\n}\n\n/* CO-CHANGE LIST */\n.cochange-list { list-style: none; display: flex; flex-direction: column; gap: 10px; }\n.cochange-item { display: flex; flex-direction: column; gap: 4px; }\n.cochange-files { display: flex; flex-wrap: wrap; gap: 4px; }\n.cochange-badge {\n display: inline-block;\n padding: 2px 7px;\n background: rgba(74,222,128,0.1);\n border: 1px solid rgba(74,222,128,0.25);\n border-radius: 4px;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n color: var(--green);\n white-space: nowrap;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.cochange-more {\n background: rgba(255,255,255,0.05);\n border-color: var(--border);\n color: var(--text-dim);\n}\n.cochange-rate { font-size: 11px; color: var(--text-dim); }\n\n/* EMPTY STATE */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 24px 16px;\n text-align: center;\n}\n.empty-icon {\n font-size: 22px;\n opacity: 0.4;\n}\n.empty-title {\n font-size: 13px;\n font-weight: 500;\n color: var(--text-dim);\n}\n.empty-hint {\n font-size: 12px;\n color: var(--text-dim);\n opacity: 0.7;\n max-width: 240px;\n}\n\n/* FOOTER */\n.dashboard-footer {\n display: flex;\n justify-content: space-between;\n padding: 12px 0 16px;\n border-top: 1px solid var(--border);\n margin-top: 20px;\n font-size: 11px;\n color: var(--text-dim);\n}\n.dashboard-footer a { color: var(--text-dim); text-decoration: none; }\n.dashboard-footer a:hover { color: var(--green); }\n\n/* SSE FADE-IN ANIMATION */\n@keyframes fadeIn { from { opacity:0; transform:translateY(4px); } to { opacity:1; transform:none; } }\n.sse-updated { animation: fadeIn 0.35s ease; }\n`;\n\n// =============================================================================\n// INLINE JS - SSE client + workspace refresh\n// =============================================================================\n\nconst DASHBOARD_JS = `\n(function() {\n var es = new EventSource('/events');\n es.addEventListener('workspace:updated', function() {\n fetch('/api/workspace')\n .then(function(r) { return r.json(); })\n .then(function(data) {\n if (data && !data.degraded) {\n // Reload page to re-render SSR with fresh data\n // A future enhancement can do fine-grained DOM patching here\n document.body.classList.add('sse-updated');\n setTimeout(function() { window.location.reload(); }, 300);\n }\n })\n .catch(function() {});\n });\n es.onerror = function() {\n // SSE reconnect is handled automatically by EventSource\n };\n})();\n`;\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\nfunction readWorkspaceJson(workspaceJsonPath: string): WorkspaceJson | null {\n\ttry {\n\t\tconst raw = readFileSync(workspaceJsonPath, \"utf-8\");\n\t\treturn JSON.parse(raw) as WorkspaceJson;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction buildHtmlPage(data: WorkspaceJson, serviceConnected: boolean): string {\n\tconst generatedAt = data.generated?.generatedAt;\n\tconst bodyHtml = renderToStaticMarkup(createElement(BrowserDashboardApp, { data, serviceConnected, generatedAt }));\n\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Vreko Local Dashboard</title>\n<style>${DASHBOARD_CSS}</style>\n</head>\n<body>\n${bodyHtml}\n<script>${DASHBOARD_JS}</script>\n</body>\n</html>`;\n}\n\nfunction build503Page(reason: string, serviceConnected: boolean): string {\n\tconst empty: WorkspaceJson = {};\n\treturn buildHtmlPage(empty, serviceConnected).replace(\"</body>\", `<!-- degraded: ${reason} --></body>`);\n}\n\n// =============================================================================\n// PORT SCANNING\n// =============================================================================\n\nasync function findFreePort(startPort: number): Promise<number> {\n\tconst net = await import(\"node:net\");\n\tconst maxAttempts = 21;\n\tfor (let i = 0; i < maxAttempts; i++) {\n\t\tconst port = startPort + i;\n\t\tconst free = await new Promise<boolean>((resolve) => {\n\t\t\tconst probe = net.createServer();\n\t\t\tprobe.once(\"error\", () => resolve(false));\n\t\t\tprobe.once(\"listening\", () => {\n\t\t\t\tprobe.close(() => resolve(true));\n\t\t\t});\n\t\t\tprobe.listen(port, \"127.0.0.1\");\n\t\t});\n\t\tif (free) return port;\n\t}\n\tthrow new Error(`No free port found in range ${startPort}–${startPort + 20}. Stop another process and retry.`);\n}\n\n// =============================================================================\n// SERVER FACTORY\n// =============================================================================\n\n// biome-ignore lint/complexity/noExcessiveLinesPerFunction: server factory integrates port-scan, watch, and request routing\nexport async function startDashboardServer(options: DashboardServerOptions): Promise<DashboardServerHandle> {\n\tconst { workspacePath } = options;\n\tconst requestedPort = options.port ?? Number(process.env.VREKO_DASHBOARD_PORT ?? 7842);\n\n\tconst workspaceJsonPath = resolveWorkspaceJsonPath(workspacePath);\n\tconst sseManager = new SseManager();\n\n\t// Try to find a free port\n\tconst port = await findFreePort(requestedPort);\n\tconst url = `http://127.0.0.1:${port}`;\n\n\t// We don't import @vreko/intelligence directly (ARCH-01), so service\n\t// connection is detected by whether the workspace.json file exists and\n\t// was recently modified. A future phase can wire the IPC service emitter.\n\tlet serviceConnected = false;\n\n\t// Set up chokidar file-watch fallback (SSE fallback)\n\tconst watcher = chokidar.watch(workspaceJsonPath, {\n\t\tpersistent: true,\n\t\tignoreInitial: true,\n\t\tawaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },\n\t});\n\n\twatcher.on(\"change\", () => {\n\t\tserviceConnected = true;\n\t\tsseManager.broadcast(\"workspace:updated\");\n\t});\n\n\tconst server = createServer((req: IncomingMessage, res: ServerResponse) => {\n\t\tconst pathname = req.url?.split(\"?\")[0] ?? \"/\";\n\n\t\t// SSE endpoint\n\t\tif (pathname === \"/events\") {\n\t\t\tsseManager.addClient(res);\n\t\t\treturn;\n\t\t}\n\n\t\t// API: workspace data\n\t\tif (pathname === \"/api/workspace\") {\n\t\t\tconst data = readWorkspaceJson(workspaceJsonPath);\n\t\t\tif (!data) {\n\t\t\t\tres.writeHead(503, { \"Content-Type\": \"application/json\" });\n\t\t\t\tres.end(JSON.stringify({ degraded: true, reason: \"workspace.json not found or unreadable\" }));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tres.writeHead(200, { \"Content-Type\": \"application/json\" });\n\t\t\tres.end(JSON.stringify(data));\n\t\t\treturn;\n\t\t}\n\n\t\t// API: health\n\t\tif (pathname === \"/api/health\") {\n\t\t\tres.writeHead(200, { \"Content-Type\": \"application/json\" });\n\t\t\tres.end(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tserver: true,\n\t\t\t\t\tserviceConnected,\n\t\t\t\t\tworkspaceJsonPath,\n\t\t\t\t\tsseClients: sseManager.clientCount,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// SPA fallback - serve SSR HTML\n\t\tconst data = readWorkspaceJson(workspaceJsonPath);\n\t\tif (!data) {\n\t\t\tres.writeHead(503, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\tres.end(build503Page(\"workspace.json not found\", serviceConnected));\n\t\t\treturn;\n\t\t}\n\n\t\tconst html = buildHtmlPage(data, serviceConnected);\n\t\tres.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\tres.end(html);\n\t});\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tserver.once(\"error\", reject);\n\t\t// NEVER bind to 0.0.0.0\n\t\tserver.listen(port, \"127.0.0.1\", () => {\n\t\t\tresolve();\n\t\t});\n\t});\n\n\t// Write discovery descriptor\n\twriteDashboardDescriptor(url, port, process.pid);\n\n\tconst close = () => {\n\t\twatcher.close();\n\t\tserver.close();\n\t\tdeleteDashboardDescriptor();\n\t};\n\n\t// Clean up descriptor on process exit\n\tprocess.once(\"exit\", close);\n\tprocess.once(\"SIGINT\", () => {\n\t\tclose();\n\t\tprocess.exit(0);\n\t});\n\tprocess.once(\"SIGTERM\", () => {\n\t\tclose();\n\t\tprocess.exit(0);\n\t});\n\n\treturn { port, url, server, close };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/dashboard/EmptyState.tsx","../src/ui/dashboard/panels/AIAttributionPanel.tsx","../src/ui/dashboard/panels/CoChangeClustersPanel.tsx","../src/ui/dashboard/panels/FragileZonesPanel.tsx","../src/ui/dashboard/panels/RecentIntelligencePanel.tsx","../src/ui/dashboard/panels/WatchStatusPanel.tsx","../src/ui/dashboard/BrowserDashboardApp.tsx","../src/ui/dashboard/server/sse.ts","../src/ui/dashboard/server/dashboardServer.ts"],"names":["EmptyState","icon","title","hint","div","className","_jsx","span","aria-hidden","p","AIAttributionPanel","data","_data","_jsxs","shortPath","file","parts","split","length","slice","join","CoChangeClustersPanel","clusters","generated","coChange","ul","map","cluster","i","li","files","occurrences","rate","toFixed","fragilityColor","score","FragileZonesPanel","items","fragility","filter","e","excluded","entry","fragilityScore","style","width","Math","round","RecentIntelligencePanel","WatchStatusPanel","serviceConnected","health","fileIndex","fileCount","confidence","observationCount","state","intelligenceState","toLocaleString","BrowserDashboardApp","generatedAt","ts","Date","toLocaleTimeString","id","header","main","footer","a","href","target","rel","SseManager","clients","Set","addClient","res","writeHead","Connection","write","add","on","removeClient","delete","broadcast","event","payload","client","clientCount","size","DASHBOARD_CSS","DASHBOARD_JS","readWorkspaceJson","workspaceJsonPath","raw","readFileSync","JSON","parse","buildHtmlPage","bodyHtml","renderToStaticMarkup","createElement","build503Page","reason","empty","replace","findFreePort","startPort","net","maxAttempts","port","free","Promise","resolve","probe","createServer","once","close","listen","Error","startDashboardServer","options","workspacePath","requestedPort","Number","process","env","VREKO_DASHBOARD_PORT","resolveWorkspaceJsonPath","sseManager","url","watcher","chokidar","watch","persistent","ignoreInitial","awaitWriteFinish","stabilityThreshold","pollInterval","server","req","pathname","end","stringify","degraded","sseClients","html","reject","writeDashboardDescriptor","pid","deleteDashboardDescriptor","exit"],"mappings":"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","file":"dashboardServer-MELKRCBX.js","sourcesContent":["/**\n * EmptyState - shared empty/partial state component for dashboard panels.\n * Every panel reuses this instead of rendering a blank box.\n */\n\ninterface EmptyStateProps {\n\ticon: string;\n\ttitle: string;\n\thint: string;\n}\n\nexport function EmptyState({ icon, title, hint }: EmptyStateProps) {\n\treturn (\n\t\t<div className=\"empty-state\">\n\t\t\t<span className=\"empty-icon\" aria-hidden=\"true\">\n\t\t\t\t{icon}\n\t\t\t</span>\n\t\t\t<p className=\"empty-title\">{title}</p>\n\t\t\t<p className=\"empty-hint\">{hint}</p>\n\t\t</div>\n\t);\n}\n","/**\n * AIAttributionPanel - AI-change attribution breakdown.\n *\n * SCHEMA GAP: generated.attribution does NOT exist in workspace.json.\n * This panel always renders an informative empty state.\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n};\n\nexport function AIAttributionPanel({ data: _data }: Props) {\n\t// generated.attribution is not present in the schema - always empty state\n\treturn (\n\t\t<div className=\"panel panel-attribution\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">AI Attribution</span>\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t<EmptyState\n\t\t\t\t\ticon=\"✨\"\n\t\t\t\t\ttitle=\"AI attribution not yet available\"\n\t\t\t\t\thint=\"Per-file AI change attribution will appear here once the Vreko service has captured enough sessions.\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * CoChangeClustersPanel - file pairs that frequently change together.\n * Reads from: generated.coChange (spec says \"clusters\" - actual field is \"coChange\").\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n};\n\nfunction shortPath(file: string): string {\n\tconst parts = file.split(\"/\");\n\tif (parts.length <= 2) return file;\n\treturn `…/${parts.slice(-1).join(\"/\")}`;\n}\n\nexport function CoChangeClustersPanel({ data }: Props) {\n\t// Actual field is coChange, not clusters\n\tconst clusters = (data.generated?.coChange ?? []).slice(0, 6);\n\n\treturn (\n\t\t<div className=\"panel panel-cochange\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">Co-change Clusters</span>\n\t\t\t\t{clusters.length > 0 && <span className=\"panel-count\">{clusters.length} pairs</span>}\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t{clusters.length === 0 ? (\n\t\t\t\t\t<EmptyState\n\t\t\t\t\t\ticon=\"🔗\"\n\t\t\t\t\t\ttitle=\"No co-change patterns yet\"\n\t\t\t\t\t\thint=\"Vreko detects files that change together. These clusters appear after enough commit history is observed.\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<ul className=\"cochange-list\">\n\t\t\t\t\t\t{clusters.map((cluster, i) => (\n\t\t\t\t\t\t\t<li key={i} className=\"cochange-item\">\n\t\t\t\t\t\t\t\t<div className=\"cochange-files\">\n\t\t\t\t\t\t\t\t\t{cluster.files.slice(0, 3).map((file) => (\n\t\t\t\t\t\t\t\t\t\t<span key={file} className=\"cochange-badge\" title={file}>\n\t\t\t\t\t\t\t\t\t\t\t{shortPath(file)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t{cluster.files.length > 3 && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"cochange-badge cochange-more\">\n\t\t\t\t\t\t\t\t\t\t\t+{cluster.files.length - 3}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<span className=\"cochange-rate\">\n\t\t\t\t\t\t\t\t\t{cluster.occurrences}x · {(cluster.rate * 100).toFixed(0)}%\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * FragileZonesPanel - top fragile files with heat-bar scores.\n * Reads from: generated.fragility\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n};\n\nfunction fragilityColor(score: number): string {\n\tif (score >= 0.7) return \"fragility-high\";\n\tif (score >= 0.35) return \"fragility-medium\";\n\treturn \"fragility-low\";\n}\n\nfunction shortPath(file: string): string {\n\tconst parts = file.split(\"/\");\n\tif (parts.length <= 3) return file;\n\treturn `…/${parts.slice(-2).join(\"/\")}`;\n}\n\nexport function FragileZonesPanel({ data }: Props) {\n\tconst items = (data.generated?.fragility ?? []).filter((e) => !e.excluded).slice(0, 8);\n\n\treturn (\n\t\t<div className=\"panel panel-fragile\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">Fragile Zones</span>\n\t\t\t\t{items.length > 0 && <span className=\"panel-count\">{items.length} files</span>}\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t{items.length === 0 ? (\n\t\t\t\t\t<EmptyState\n\t\t\t\t\t\ticon=\"♥\"\n\t\t\t\t\t\ttitle=\"No fragile files detected\"\n\t\t\t\t\t\thint=\"Vreko tracks reverts and churn - fragile files surface here after enough observations.\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<ul className=\"fragile-list\">\n\t\t\t\t\t\t{items.map((entry) => (\n\t\t\t\t\t\t\t<li key={entry.file} className=\"fragile-item\">\n\t\t\t\t\t\t\t\t<span className=\"fragile-path\" title={entry.file}>\n\t\t\t\t\t\t\t\t\t{shortPath(entry.file)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"fragile-bar-wrap\">\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={`fragile-bar ${fragilityColor(entry.fragilityScore)}`}\n\t\t\t\t\t\t\t\t\t\tstyle={{ width: `${Math.round(entry.fragilityScore * 100)}%` }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span className=\"fragile-score\">{entry.fragilityScore.toFixed(2)}</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * RecentIntelligencePanel - recent learned patterns and insights.\n *\n * SCHEMA GAP: generated.learnings does NOT exist in workspace.json.\n * This panel always renders an informative empty state.\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n};\n\nexport function RecentIntelligencePanel({ data: _data }: Props) {\n\t// generated.learnings is not present in the schema - always empty state\n\treturn (\n\t\t<div className=\"panel panel-intelligence\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">Recent Intelligence</span>\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t<EmptyState\n\t\t\t\t\ticon=\"🧠\"\n\t\t\t\t\ttitle=\"No intelligence captured yet\"\n\t\t\t\t\thint=\"Run vr learn or use AI coding tools to capture patterns. Insights will surface here as they accumulate.\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * WatchStatusPanel - Vreko service connection status and file index summary.\n * Reads from: health, generated.fileIndex\n */\n\nimport { EmptyState } from \"../EmptyState.js\";\nimport type { WorkspaceJson } from \"../types.js\";\n\ntype Props = {\n\tdata: WorkspaceJson;\n\tserviceConnected: boolean;\n};\n\nexport function WatchStatusPanel({ data, serviceConnected }: Props) {\n\tconst health = data.health;\n\tconst fileIndex = data.generated?.fileIndex ?? [];\n\tconst fileCount = fileIndex.length;\n\tconst confidence = health?.confidence ?? 0;\n\tconst observationCount = health?.observationCount ?? 0;\n\tconst state = health?.intelligenceState ?? \"unknown\";\n\n\treturn (\n\t\t<div className=\"panel panel-watch\">\n\t\t\t<div className=\"panel-header\">\n\t\t\t\t<span className=\"panel-title\">Watch Status</span>\n\t\t\t\t<span className={`status-dot ${serviceConnected ? \"status-connected\" : \"status-disconnected\"}`} />\n\t\t\t\t<span className=\"status-label\">{serviceConnected ? \"Connected\" : \"Not connected\"}</span>\n\t\t\t</div>\n\t\t\t<div className=\"panel-body\">\n\t\t\t\t{fileCount === 0 && observationCount === 0 ? (\n\t\t\t\t\t<EmptyState\n\t\t\t\t\t\ticon=\"●\"\n\t\t\t\t\t\ttitle=\"No observations yet\"\n\t\t\t\t\t\thint=\"Run vr sync to start collecting workspace intelligence.\"\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<ul className=\"stat-list\">\n\t\t\t\t\t\t<li className=\"stat-item\">\n\t\t\t\t\t\t\t<span className=\"stat-label\">Files indexed</span>\n\t\t\t\t\t\t\t<span className=\"stat-value\">{fileCount.toLocaleString()}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"stat-item\">\n\t\t\t\t\t\t\t<span className=\"stat-label\">Observations</span>\n\t\t\t\t\t\t\t<span className=\"stat-value\">{observationCount.toLocaleString()}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"stat-item\">\n\t\t\t\t\t\t\t<span className=\"stat-label\">Confidence</span>\n\t\t\t\t\t\t\t<span className=\"stat-value\">{(confidence * 100).toFixed(0)}%</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li className=\"stat-item\">\n\t\t\t\t\t\t\t<span className=\"stat-label\">State</span>\n\t\t\t\t\t\t\t<span className=\"stat-value stat-mono\">{state}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * BrowserDashboardApp - SSR root for the browser-based local dashboard.\n *\n * Rendered server-side via react-dom/server renderToStaticMarkup.\n * Wraps all five panels and wires them to the workspace.json payload.\n * This is NOT the TUI Ink dashboard (DashboardApp.tsx) - it is a\n * separate, React-to-HTML-string entry point for the HTTP server.\n */\n\nimport { AIAttributionPanel } from \"./panels/AIAttributionPanel.js\";\nimport { CoChangeClustersPanel } from \"./panels/CoChangeClustersPanel.js\";\nimport { FragileZonesPanel } from \"./panels/FragileZonesPanel.js\";\nimport { RecentIntelligencePanel } from \"./panels/RecentIntelligencePanel.js\";\nimport { WatchStatusPanel } from \"./panels/WatchStatusPanel.js\";\nimport type { WorkspaceJson } from \"./types.js\";\n\ninterface BrowserDashboardAppProps {\n\tdata: WorkspaceJson;\n\tserviceConnected: boolean;\n\tgeneratedAt?: string;\n}\n\nexport function BrowserDashboardApp({ data, serviceConnected, generatedAt }: BrowserDashboardAppProps) {\n\tconst ts = generatedAt ? new Date(generatedAt).toLocaleTimeString() : \" - \";\n\n\treturn (\n\t\t<div id=\"vreko-dashboard\">\n\t\t\t<header className=\"dashboard-header\">\n\t\t\t\t<div className=\"header-brand\">\n\t\t\t\t\t<span className=\"brand-mark\">v</span>\n\t\t\t\t\t<span className=\"brand-name\">Vreko</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"header-meta\">\n\t\t\t\t\t<span className={`header-status-dot ${serviceConnected ? \"dot-connected\" : \"dot-disconnected\"}`} />\n\t\t\t\t\t<span className=\"header-status-label\">\n\t\t\t\t\t\t{serviceConnected ? \"Service connected\" : \"Service not connected\"}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"header-ts\">Updated {ts}</span>\n\t\t\t\t</div>\n\t\t\t</header>\n\n\t\t\t{!serviceConnected && (\n\t\t\t\t<div className=\"degraded-banner\">\n\t\t\t\t\tVreko service not connected - showing last captured state. Live updates resume when the service is\n\t\t\t\t\trunning.\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<main className=\"dashboard-grid\">\n\t\t\t\t<WatchStatusPanel data={data} serviceConnected={serviceConnected} />\n\t\t\t\t<FragileZonesPanel data={data} />\n\t\t\t\t<CoChangeClustersPanel data={data} />\n\t\t\t\t<AIAttributionPanel data={data} />\n\t\t\t\t<RecentIntelligencePanel data={data} />\n\t\t\t</main>\n\n\t\t\t<footer className=\"dashboard-footer\">\n\t\t\t\t<span>\n\t\t\t\t\t<a href=\"https://vreko.dev\" target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t\t\tvreko.dev\n\t\t\t\t\t</a>\n\t\t\t\t</span>\n\t\t\t\t<span>Local dashboard · 127.0.0.1</span>\n\t\t\t</footer>\n\t\t</div>\n\t);\n}\n","/**\n * SSE Manager\n *\n * Manages a set of connected SSE clients and broadcasts events.\n * SSE is a notification-only channel - workspace.json body is never pushed over SSE.\n *\n * Emit format: event: workspace:updated\\ndata: {}\\n\\n\n */\n\nimport type { ServerResponse } from \"node:http\";\n\nexport class SseManager {\n\tprivate clients: Set<ServerResponse> = new Set();\n\n\t/**\n\t * Register a new SSE client connection.\n\t * Sets appropriate headers for the SSE stream.\n\t */\n\taddClient(res: ServerResponse): void {\n\t\tres.writeHead(200, {\n\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\tConnection: \"keep-alive\",\n\t\t\t\"X-Accel-Buffering\": \"no\",\n\t\t});\n\t\tres.write(\": connected\\n\\n\");\n\t\tthis.clients.add(res);\n\n\t\tres.on(\"close\", () => {\n\t\t\tthis.removeClient(res);\n\t\t});\n\t}\n\n\t/**\n\t * Deregister a client.\n\t */\n\tremoveClient(res: ServerResponse): void {\n\t\tthis.clients.delete(res);\n\t}\n\n\t/**\n\t * Broadcast an event to all connected clients.\n\t * Only sends the event name and an empty data payload (notification-only).\n\t */\n\tbroadcast(event: string): void {\n\t\tconst payload = `event: ${event}\\ndata: {}\\n\\n`;\n\t\tfor (const client of this.clients) {\n\t\t\ttry {\n\t\t\t\tclient.write(payload);\n\t\t\t} catch {\n\t\t\t\t// Client disconnected mid-write - remove it\n\t\t\t\tthis.removeClient(client);\n\t\t\t}\n\t\t}\n\t}\n\n\tget clientCount(): number {\n\t\treturn this.clients.size;\n\t}\n}\n","/**\n * Dashboard HTTP Server\n *\n * Serves the Vreko local browser dashboard.\n * - Binds 127.0.0.1 ONLY (never 0.0.0.0)\n * - Default port: 7842 (VREKO_DASHBOARD_PORT env / --port flag)\n * - On EADDRINUSE: scans port+1 to port+20\n * - Serves SSR HTML, /api/workspace, /api/health, /events (SSE)\n * - SSE is notification-only; workspace.json body is fetched via /api/workspace\n * - File-watch fallback via chokidar when service not connected\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { IncomingMessage, Server, ServerResponse } from \"node:http\";\nimport { createServer } from \"node:http\";\nimport chokidar from \"chokidar\";\nimport { createElement } from \"react\";\nimport { renderToStaticMarkup } from \"react-dom/server\";\nimport { resolveWorkspaceJsonPath } from \"../../../utils/workspace.js\";\nimport { BrowserDashboardApp } from \"../BrowserDashboardApp.js\";\nimport type { WorkspaceJson } from \"../types.js\";\nimport { deleteDashboardDescriptor, writeDashboardDescriptor } from \"./descriptor.js\";\nimport { SseManager } from \"./sse.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DashboardServerOptions {\n\tworkspacePath: string;\n\tport?: number;\n}\n\nexport interface DashboardServerHandle {\n\tport: number;\n\turl: string;\n\tserver: Server;\n\tclose: () => void;\n}\n\n// =============================================================================\n// INLINE CSS - production-grade dark terminal aesthetic\n// =============================================================================\n\nconst DASHBOARD_CSS = `\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n:root {\n --green: #4ADE80;\n --green-dim: #22c55e;\n --amber: #f59e0b;\n --red: #f87171;\n --bg: #0d1117;\n --bg-panel: #161b22;\n --bg-panel-header: #1c2330;\n --border: #30363d;\n --text: #e6edf3;\n --text-dim: #8b949e;\n --text-mono: #d2a8ff;\n --radius: 8px;\n}\n\nbody {\n background: var(--bg);\n color: var(--text);\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n min-height: 100vh;\n}\n\n#vreko-dashboard {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n max-width: 1200px;\n margin: 0 auto;\n padding: 0 16px;\n}\n\n/* HEADER */\n.dashboard-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 0 12px;\n border-bottom: 1px solid var(--border);\n margin-bottom: 20px;\n}\n.header-brand {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.brand-mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n background: var(--green);\n color: #000;\n font-weight: 700;\n font-size: 14px;\n border-radius: 6px;\n}\n.brand-name {\n font-size: 18px;\n font-weight: 600;\n color: var(--text);\n letter-spacing: -0.3px;\n}\n.header-meta {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 12px;\n color: var(--text-dim);\n}\n.header-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n.dot-connected { background: var(--green); box-shadow: 0 0 6px var(--green); }\n.dot-disconnected { background: var(--amber); }\n.header-ts { color: var(--text-dim); }\n\n/* DEGRADED BANNER */\n.degraded-banner {\n background: rgba(245,158,11,0.12);\n border: 1px solid rgba(245,158,11,0.35);\n border-radius: var(--radius);\n padding: 10px 14px;\n margin-bottom: 16px;\n color: var(--amber);\n font-size: 13px;\n}\n\n/* GRID */\n.dashboard-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n flex: 1;\n}\n@media (max-width: 700px) {\n .dashboard-grid { grid-template-columns: 1fr; }\n}\n\n/* PANEL */\n.panel {\n background: var(--bg-panel);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n overflow: hidden;\n}\n.panel-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n background: var(--bg-panel-header);\n border-bottom: 1px solid var(--border);\n}\n.panel-title {\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.6px;\n color: var(--green);\n}\n.panel-count {\n margin-left: auto;\n font-size: 11px;\n color: var(--text-dim);\n}\n.panel-body { padding: 14px; }\n\n/* STATUS DOT IN PANEL */\n.status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n.status-connected { background: var(--green); box-shadow: 0 0 5px var(--green); }\n.status-disconnected { background: var(--amber); }\n.status-label { font-size: 12px; color: var(--text-dim); }\n\n/* STAT LIST */\n.stat-list { list-style: none; display: flex; flex-direction: column; gap: 6px; }\n.stat-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 13px;\n}\n.stat-label { color: var(--text-dim); }\n.stat-value { font-weight: 500; }\n.stat-mono { font-family: ui-monospace, monospace; font-size: 12px; color: var(--text-mono); }\n\n/* FRAGILE LIST */\n.fragile-list { list-style: none; display: flex; flex-direction: column; gap: 8px; }\n.fragile-item {\n display: grid;\n grid-template-columns: 1fr 80px 36px;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n}\n.fragile-path {\n font-family: ui-monospace, monospace;\n color: var(--text-dim);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.fragile-bar-wrap {\n height: 6px;\n background: rgba(255,255,255,0.07);\n border-radius: 3px;\n overflow: hidden;\n}\n.fragile-bar {\n display: block;\n height: 100%;\n border-radius: 3px;\n transition: width 0.4s ease;\n}\n.fragility-high { background: var(--red); }\n.fragility-medium { background: var(--amber); }\n.fragility-low { background: var(--green-dim); }\n.fragile-score {\n font-family: ui-monospace, monospace;\n text-align: right;\n color: var(--text-dim);\n}\n\n/* CO-CHANGE LIST */\n.cochange-list { list-style: none; display: flex; flex-direction: column; gap: 10px; }\n.cochange-item { display: flex; flex-direction: column; gap: 4px; }\n.cochange-files { display: flex; flex-wrap: wrap; gap: 4px; }\n.cochange-badge {\n display: inline-block;\n padding: 2px 7px;\n background: rgba(74,222,128,0.1);\n border: 1px solid rgba(74,222,128,0.25);\n border-radius: 4px;\n font-family: ui-monospace, monospace;\n font-size: 11px;\n color: var(--green);\n white-space: nowrap;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.cochange-more {\n background: rgba(255,255,255,0.05);\n border-color: var(--border);\n color: var(--text-dim);\n}\n.cochange-rate { font-size: 11px; color: var(--text-dim); }\n\n/* EMPTY STATE */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 24px 16px;\n text-align: center;\n}\n.empty-icon {\n font-size: 22px;\n opacity: 0.4;\n}\n.empty-title {\n font-size: 13px;\n font-weight: 500;\n color: var(--text-dim);\n}\n.empty-hint {\n font-size: 12px;\n color: var(--text-dim);\n opacity: 0.7;\n max-width: 240px;\n}\n\n/* FOOTER */\n.dashboard-footer {\n display: flex;\n justify-content: space-between;\n padding: 12px 0 16px;\n border-top: 1px solid var(--border);\n margin-top: 20px;\n font-size: 11px;\n color: var(--text-dim);\n}\n.dashboard-footer a { color: var(--text-dim); text-decoration: none; }\n.dashboard-footer a:hover { color: var(--green); }\n\n/* SSE FADE-IN ANIMATION */\n@keyframes fadeIn { from { opacity:0; transform:translateY(4px); } to { opacity:1; transform:none; } }\n.sse-updated { animation: fadeIn 0.35s ease; }\n`;\n\n// =============================================================================\n// INLINE JS - SSE client + workspace refresh\n// =============================================================================\n\nconst DASHBOARD_JS = `\n(function() {\n var es = new EventSource('/events');\n es.addEventListener('workspace:updated', function() {\n fetch('/api/workspace')\n .then(function(r) { return r.json(); })\n .then(function(data) {\n if (data && !data.degraded) {\n // Reload page to re-render SSR with fresh data\n // A future enhancement can do fine-grained DOM patching here\n document.body.classList.add('sse-updated');\n setTimeout(function() { window.location.reload(); }, 300);\n }\n })\n .catch(function() {});\n });\n es.onerror = function() {\n // SSE reconnect is handled automatically by EventSource\n };\n})();\n`;\n\n// =============================================================================\n// UTILITIES\n// =============================================================================\n\nfunction readWorkspaceJson(workspaceJsonPath: string): WorkspaceJson | null {\n\ttry {\n\t\tconst raw = readFileSync(workspaceJsonPath, \"utf-8\");\n\t\treturn JSON.parse(raw) as WorkspaceJson;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction buildHtmlPage(data: WorkspaceJson, serviceConnected: boolean): string {\n\tconst generatedAt = data.generated?.generatedAt;\n\tconst bodyHtml = renderToStaticMarkup(createElement(BrowserDashboardApp, { data, serviceConnected, generatedAt }));\n\n\treturn `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Vreko Local Dashboard</title>\n<style>${DASHBOARD_CSS}</style>\n</head>\n<body>\n${bodyHtml}\n<script>${DASHBOARD_JS}</script>\n</body>\n</html>`;\n}\n\nfunction build503Page(reason: string, serviceConnected: boolean): string {\n\tconst empty: WorkspaceJson = {};\n\treturn buildHtmlPage(empty, serviceConnected).replace(\"</body>\", `<!-- degraded: ${reason} --></body>`);\n}\n\n// =============================================================================\n// PORT SCANNING\n// =============================================================================\n\nasync function findFreePort(startPort: number): Promise<number> {\n\tconst net = await import(\"node:net\");\n\tconst maxAttempts = 21;\n\tfor (let i = 0; i < maxAttempts; i++) {\n\t\tconst port = startPort + i;\n\t\tconst free = await new Promise<boolean>((resolve) => {\n\t\t\tconst probe = net.createServer();\n\t\t\tprobe.once(\"error\", () => resolve(false));\n\t\t\tprobe.once(\"listening\", () => {\n\t\t\t\tprobe.close(() => resolve(true));\n\t\t\t});\n\t\t\tprobe.listen(port, \"127.0.0.1\");\n\t\t});\n\t\tif (free) return port;\n\t}\n\tthrow new Error(`No free port found in range ${startPort}–${startPort + 20}. Stop another process and retry.`);\n}\n\n// =============================================================================\n// SERVER FACTORY\n// =============================================================================\n\n// biome-ignore lint/complexity/noExcessiveLinesPerFunction: server factory integrates port-scan, watch, and request routing\nexport async function startDashboardServer(options: DashboardServerOptions): Promise<DashboardServerHandle> {\n\tconst { workspacePath } = options;\n\tconst requestedPort = options.port ?? Number(process.env.VREKO_DASHBOARD_PORT ?? 7842);\n\n\tconst workspaceJsonPath = resolveWorkspaceJsonPath(workspacePath);\n\tconst sseManager = new SseManager();\n\n\t// Try to find a free port\n\tconst port = await findFreePort(requestedPort);\n\tconst url = `http://127.0.0.1:${port}`;\n\n\t// We don't import @vreko/intelligence directly (ARCH-01), so service\n\t// connection is detected by whether the workspace.json file exists and\n\t// was recently modified. A future phase can wire the IPC service emitter.\n\tlet serviceConnected = false;\n\n\t// Set up chokidar file-watch fallback (SSE fallback)\n\tconst watcher = chokidar.watch(workspaceJsonPath, {\n\t\tpersistent: true,\n\t\tignoreInitial: true,\n\t\tawaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 },\n\t});\n\n\twatcher.on(\"change\", () => {\n\t\tserviceConnected = true;\n\t\tsseManager.broadcast(\"workspace:updated\");\n\t});\n\n\tconst server = createServer((req: IncomingMessage, res: ServerResponse) => {\n\t\tconst pathname = req.url?.split(\"?\")[0] ?? \"/\";\n\n\t\t// SSE endpoint\n\t\tif (pathname === \"/events\") {\n\t\t\tsseManager.addClient(res);\n\t\t\treturn;\n\t\t}\n\n\t\t// API: workspace data\n\t\tif (pathname === \"/api/workspace\") {\n\t\t\tconst data = readWorkspaceJson(workspaceJsonPath);\n\t\t\tif (!data) {\n\t\t\t\tres.writeHead(503, { \"Content-Type\": \"application/json\" });\n\t\t\t\tres.end(JSON.stringify({ degraded: true, reason: \"workspace.json not found or unreadable\" }));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tres.writeHead(200, { \"Content-Type\": \"application/json\" });\n\t\t\tres.end(JSON.stringify(data));\n\t\t\treturn;\n\t\t}\n\n\t\t// API: health\n\t\tif (pathname === \"/api/health\") {\n\t\t\tres.writeHead(200, { \"Content-Type\": \"application/json\" });\n\t\t\tres.end(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tserver: true,\n\t\t\t\t\tserviceConnected,\n\t\t\t\t\tworkspaceJsonPath,\n\t\t\t\t\tsseClients: sseManager.clientCount,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// SPA fallback - serve SSR HTML\n\t\tconst data = readWorkspaceJson(workspaceJsonPath);\n\t\tif (!data) {\n\t\t\tres.writeHead(503, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\t\tres.end(build503Page(\"workspace.json not found\", serviceConnected));\n\t\t\treturn;\n\t\t}\n\n\t\tconst html = buildHtmlPage(data, serviceConnected);\n\t\tres.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n\t\tres.end(html);\n\t});\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tserver.once(\"error\", reject);\n\t\t// NEVER bind to 0.0.0.0\n\t\tserver.listen(port, \"127.0.0.1\", () => {\n\t\t\tresolve();\n\t\t});\n\t});\n\n\t// Write discovery descriptor\n\twriteDashboardDescriptor(url, port, process.pid);\n\n\tconst close = () => {\n\t\twatcher.close();\n\t\tserver.close();\n\t\tdeleteDashboardDescriptor();\n\t};\n\n\t// Clean up descriptor on process exit\n\tprocess.once(\"exit\", close);\n\tprocess.once(\"SIGINT\", () => {\n\t\tclose();\n\t\tprocess.exit(0);\n\t});\n\tprocess.once(\"SIGTERM\", () => {\n\t\tclose();\n\t\tprocess.exit(0);\n\t});\n\n\treturn { port, url, server, close };\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -3,14 +3,14 @@ import { Sentry, createSentryConfig } from './chunk-YPTTIXKC.js';
|
|
|
3
3
|
import { detectOrphans } from './chunk-F7GEJLP7.js';
|
|
4
4
|
import './chunk-ZIIRQODJ.js';
|
|
5
5
|
import { readDashboardDescriptor } from './chunk-I4LIA7HE.js';
|
|
6
|
-
import { generateClaudeIntegration, createHooksCommand } from './chunk-
|
|
6
|
+
import { generateClaudeIntegration, createHooksCommand } from './chunk-B42UQ2W7.js';
|
|
7
7
|
import { cliState } from './chunk-GRMRYWYS.js';
|
|
8
8
|
export { cliState } from './chunk-GRMRYWYS.js';
|
|
9
|
-
import { resolveWorkspaceRoot, findWorkspaceRoot } from './chunk-
|
|
9
|
+
import { resolveWorkspaceRoot, findWorkspaceRoot } from './chunk-MWTSOZTM.js';
|
|
10
10
|
import { isVrekoInitialized, getWorkspaceDir, getViolations, getProtectedFiles, appendVrekoJsonl, getCredentials, createGlobalDirectory, saveCredentials, clearCredentials, getWorkspaceVitals, saveProtectedFiles, getCurrentSession, endCurrentSession, isLoggedIn, getWorkspaceConfig, recordLearning, getLearnings, readVrekoJson, recordViolation, writeVrekoJson, getGlobalPath, getGlobalDir, saveCurrentSession, loadVrekoJsonl, getGlobalConfig, saveGlobalConfig, saveWorkspaceConfig } from './chunk-P4EZUU47.js';
|
|
11
|
-
import { connectToDaemon, isDaemonAvailable, withDaemon, getDaemonClient, withDaemonOptional, disconnectFromDaemon, isDaemonConnected } from './chunk-
|
|
11
|
+
import { connectToDaemon, isDaemonAvailable, withDaemon, getDaemonClient, withDaemonOptional, disconnectFromDaemon, isDaemonConnected } from './chunk-AXNZWZ26.js';
|
|
12
12
|
import { JsonRpcClientError, getDefaultSocketPath, createServiceClient, connectServiceClient, createSessionViaDaemon, endSessionViaDaemon, WorkspaceStatusOutput, isServiceRunning, VrekoLocalClient, readServicePid, isServiceHealthy, StartStatusOutput, getLogPath, formatDuration, formatBytes, getServiceSocketPath, getServicePidPath } from './chunk-AV5Y3YR6.js';
|
|
13
|
-
import { createInitCommand } from './chunk-
|
|
13
|
+
import { createInitCommand } from './chunk-2OPUNVDJ.js';
|
|
14
14
|
import { isInteractive, getRenderMode } from './chunk-H7773ONB.js';
|
|
15
15
|
import './chunk-DMXC2JTC.js';
|
|
16
16
|
import { isRedisAvailable, getCache, setCache } from './chunk-3KKPXC3D.js';
|
|
@@ -72,7 +72,7 @@ var require_package = __commonJS({
|
|
|
72
72
|
"package.json"(exports, module) {
|
|
73
73
|
module.exports = {
|
|
74
74
|
name: "@vreko/cli",
|
|
75
|
-
version: "3.
|
|
75
|
+
version: "3.3.1",
|
|
76
76
|
description: "Vreko CLI \u2014 AI-aware developer intelligence for the command line",
|
|
77
77
|
homepage: "https://vreko.dev",
|
|
78
78
|
repository: {
|
|
@@ -116,8 +116,8 @@ var require_package = __commonJS({
|
|
|
116
116
|
"@asteasolutions/zod-to-openapi": "catalog:",
|
|
117
117
|
"@babel/parser": "catalog:",
|
|
118
118
|
"@babel/traverse": "catalog:",
|
|
119
|
-
"@better-auth/passkey": "
|
|
120
|
-
"@better-auth/sso": "
|
|
119
|
+
"@better-auth/passkey": "1.6.19",
|
|
120
|
+
"@better-auth/sso": "1.6.19",
|
|
121
121
|
"@clack/prompts": "catalog:",
|
|
122
122
|
"@electric-sql/pglite": "catalog:",
|
|
123
123
|
"@hubspot/api-client": "catalog:",
|
|
@@ -144,7 +144,7 @@ var require_package = __commonJS({
|
|
|
144
144
|
"@vreko/mcp-client": "workspace:*",
|
|
145
145
|
"@vreko/mcp-config": "workspace:*",
|
|
146
146
|
"@vreko/sentry-privacy": "workspace:*",
|
|
147
|
-
"better-auth": "
|
|
147
|
+
"better-auth": "1.6.19",
|
|
148
148
|
boxen: "catalog:",
|
|
149
149
|
chalk: "catalog:",
|
|
150
150
|
chokidar: "catalog:",
|
|
@@ -191,6 +191,7 @@ var require_package = __commonJS({
|
|
|
191
191
|
keytar: "7.9.0"
|
|
192
192
|
},
|
|
193
193
|
bundledDependencies: [
|
|
194
|
+
"@asteasolutions/zod-to-openapi",
|
|
194
195
|
"@vreko/auth",
|
|
195
196
|
"@vreko/claims-ledger",
|
|
196
197
|
"@vreko/intelligence",
|
|
@@ -2542,7 +2543,7 @@ function createOnboardCommand() {
|
|
|
2542
2543
|
const quiet = !!options.quiet;
|
|
2543
2544
|
if (!quiet) console.log(chalk2.bold("\nVreko Onboarding\n"));
|
|
2544
2545
|
try {
|
|
2545
|
-
const { createInitCommand: createInitCommand3 } = await import('./init-command-
|
|
2546
|
+
const { createInitCommand: createInitCommand3 } = await import('./init-command-ZUISJBCT.js');
|
|
2546
2547
|
const initCmd = createInitCommand3();
|
|
2547
2548
|
const argv = [
|
|
2548
2549
|
"node",
|
|
@@ -55394,7 +55395,7 @@ function createDiagnosticsCommand() {
|
|
|
55394
55395
|
return diagnostics;
|
|
55395
55396
|
}
|
|
55396
55397
|
__name(createDiagnosticsCommand, "createDiagnosticsCommand");
|
|
55397
|
-
var cliVersion = "3.
|
|
55398
|
+
var cliVersion = "3.3.1" ;
|
|
55398
55399
|
function createDoctorCommand() {
|
|
55399
55400
|
return new Command("doctor").description("Diagnose Vreko installation and ecosystem health").option("--json", "Output structured JSON result").option("--local", "Skip network checks").option("--check <system>", "Check specific subsystem (cli|service|workspace|knowledge|mcp|network|auth|extension)").option("--fix", "Attempt automatic repair for known issues").option("--sync-config", "Trigger immediate fingerprint config sync from cloud").option("-q, --quiet", "Only show failures").option("-v, --verbose", "Show all check details").action(async (options) => {
|
|
55400
55401
|
if (options.syncConfig) {
|
|
@@ -55975,7 +55976,11 @@ __name(checkWorkspace, "checkWorkspace");
|
|
|
55975
55976
|
function resolveWorkspaceJsonPath(workspacePath) {
|
|
55976
55977
|
const newPath = join(workspacePath, ".agents", "workspace.json");
|
|
55977
55978
|
const legacyPath = join(workspacePath, ".agents", "agents.workspace.json");
|
|
55978
|
-
|
|
55979
|
+
if (existsSync(newPath)) {
|
|
55980
|
+
return newPath;
|
|
55981
|
+
}
|
|
55982
|
+
console.warn(`[vreko] .agents/workspace.json not found, falling back to legacy .agents/agents.workspace.json in ${workspacePath}`);
|
|
55983
|
+
return legacyPath;
|
|
55979
55984
|
}
|
|
55980
55985
|
__name(resolveWorkspaceJsonPath, "resolveWorkspaceJsonPath");
|
|
55981
55986
|
function checkAgentsJsonFreshness(workspacePath) {
|
|
@@ -56923,7 +56928,7 @@ function createUpgradeCommand() {
|
|
|
56923
56928
|
}
|
|
56924
56929
|
__name(createUpgradeCommand, "createUpgradeCommand");
|
|
56925
56930
|
async function getVersionInfo(canary = false) {
|
|
56926
|
-
const current = "3.
|
|
56931
|
+
const current = "3.3.1";
|
|
56927
56932
|
let latest = current;
|
|
56928
56933
|
try {
|
|
56929
56934
|
const tag = canary ? "canary" : "latest";
|
|
@@ -57506,7 +57511,7 @@ function createDashboardCommand() {
|
|
|
57506
57511
|
}
|
|
57507
57512
|
return;
|
|
57508
57513
|
}
|
|
57509
|
-
const { startDashboardServer } = await import('./dashboardServer-
|
|
57514
|
+
const { startDashboardServer } = await import('./dashboardServer-MELKRCBX.js');
|
|
57510
57515
|
const resolvedWorkspace = process.env.VREKO_DASHBOARD_WORKSPACE ?? workspacePath;
|
|
57511
57516
|
try {
|
|
57512
57517
|
const handle = await startDashboardServer({
|
|
@@ -57766,7 +57771,7 @@ Sentry.init(createSentryConfig({
|
|
|
57766
57771
|
}));
|
|
57767
57772
|
async function createCLI() {
|
|
57768
57773
|
const program = new Command();
|
|
57769
|
-
program.name("vreko").description("Intelligence-driven development - observe, learn, and surface warnings before the next mistake").version("3.
|
|
57774
|
+
program.name("vreko").description("Intelligence-driven development - observe, learn, and surface warnings before the next mistake").version("3.3.1", "-v, --version", "Display version number").helpOption("-h, --help", "Display help for command").addOption(new Option("--verbose", "Enable verbose output").env("VREKO_VERBOSE").default(process.env.VREKO_VERBOSE ?? false)).addOption(new Option("-q, --quiet", "Suppress non-essential output").default(false)).addOption(new Option("--no-color", "Disable colored output").env("NO_COLOR").default(false)).addOption(new Option("--debug", "Enable debug mode with detailed logging").env("VREKO_DEBUG").default(process.env.VREKO_DEBUG ?? false)).addOption(new Option("--json", "Output in JSON format for LLM consumption").env("VREKO_JSON").default(process.env.VREKO_JSON ?? false)).addOption(new Option("--plain", "Disable TUI; output JSON for scripts and CI (same as VREKO_PLAIN=1)").env("VREKO_PLAIN").default(process.env.VREKO_PLAIN ?? false)).addOption(new Option("-y, --yes", "Skip confirmation prompts (for CI/automation)").default(false)).hook("preAction", (thisCommand) => {
|
|
57770
57775
|
const opts = thisCommand.opts();
|
|
57771
57776
|
cliState.verbose = opts.verbose || false;
|
|
57772
57777
|
cliState.quiet = opts.quiet || false;
|