@abhinav2203/codeflow-canvas 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/abhinav2203-codeflow-canvas-0.1.0.tgz +0 -0
  2. package/dist/bin/cli.d.ts +3 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +84 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/components/blueprint-workbench.d.ts +2 -0
  7. package/dist/components/blueprint-workbench.d.ts.map +1 -0
  8. package/dist/components/blueprint-workbench.js +144 -0
  9. package/dist/components/blueprint-workbench.js.map +1 -0
  10. package/dist/components/code-diff-editor.d.ts +12 -0
  11. package/dist/components/code-diff-editor.d.ts.map +1 -0
  12. package/dist/components/code-diff-editor.js +39 -0
  13. package/dist/components/code-diff-editor.js.map +1 -0
  14. package/dist/components/code-editor.d.ts +25 -0
  15. package/dist/components/code-editor.d.ts.map +1 -0
  16. package/dist/components/code-editor.js +264 -0
  17. package/dist/components/code-editor.js.map +1 -0
  18. package/dist/components/file-tabs.d.ts +5 -0
  19. package/dist/components/file-tabs.d.ts.map +1 -0
  20. package/dist/components/file-tabs.js +164 -0
  21. package/dist/components/file-tabs.js.map +1 -0
  22. package/dist/components/file-tree.d.ts +7 -0
  23. package/dist/components/file-tree.d.ts.map +1 -0
  24. package/dist/components/file-tree.js +176 -0
  25. package/dist/components/file-tree.js.map +1 -0
  26. package/dist/components/graph-canvas.d.ts +25 -0
  27. package/dist/components/graph-canvas.d.ts.map +1 -0
  28. package/dist/components/graph-canvas.js +224 -0
  29. package/dist/components/graph-canvas.js.map +1 -0
  30. package/dist/components/ide-layout.d.ts +10 -0
  31. package/dist/components/ide-layout.d.ts.map +1 -0
  32. package/dist/components/ide-layout.js +40 -0
  33. package/dist/components/ide-layout.js.map +1 -0
  34. package/dist/components/ide-workbench.d.ts +4 -0
  35. package/dist/components/ide-workbench.d.ts.map +1 -0
  36. package/dist/components/ide-workbench.js +6 -0
  37. package/dist/components/ide-workbench.js.map +1 -0
  38. package/dist/components/index.d.ts +13 -0
  39. package/dist/components/index.d.ts.map +1 -0
  40. package/dist/components/index.js +13 -0
  41. package/dist/components/index.js.map +1 -0
  42. package/dist/components/monaco-setup.d.ts +4 -0
  43. package/dist/components/monaco-setup.d.ts.map +1 -0
  44. package/dist/components/monaco-setup.js +34 -0
  45. package/dist/components/monaco-setup.js.map +1 -0
  46. package/dist/components/opencode-settings.d.ts +8 -0
  47. package/dist/components/opencode-settings.d.ts.map +1 -0
  48. package/dist/components/opencode-settings.js +33 -0
  49. package/dist/components/opencode-settings.js.map +1 -0
  50. package/dist/components/policy-workbench.d.ts +2 -0
  51. package/dist/components/policy-workbench.d.ts.map +1 -0
  52. package/dist/components/policy-workbench.js +102 -0
  53. package/dist/components/policy-workbench.js.map +1 -0
  54. package/dist/components/ts-language-service.d.ts +14 -0
  55. package/dist/components/ts-language-service.d.ts.map +1 -0
  56. package/dist/components/ts-language-service.js +123 -0
  57. package/dist/components/ts-language-service.js.map +1 -0
  58. package/dist/index.d.ts +23 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +22 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/lib/browser/storage.d.ts +16 -0
  63. package/dist/lib/browser/storage.d.ts.map +1 -0
  64. package/dist/lib/browser/storage.js +18 -0
  65. package/dist/lib/browser/storage.js.map +1 -0
  66. package/dist/lib/edit.d.ts +14 -0
  67. package/dist/lib/edit.d.ts.map +1 -0
  68. package/dist/lib/edit.js +57 -0
  69. package/dist/lib/edit.js.map +1 -0
  70. package/dist/lib/flow-view.d.ts +80 -0
  71. package/dist/lib/flow-view.d.ts.map +1 -0
  72. package/dist/lib/flow-view.js +850 -0
  73. package/dist/lib/flow-view.js.map +1 -0
  74. package/dist/lib/heatmap.d.ts +28 -0
  75. package/dist/lib/heatmap.d.ts.map +1 -0
  76. package/dist/lib/heatmap.js +61 -0
  77. package/dist/lib/heatmap.js.map +1 -0
  78. package/dist/lib/index.d.ts +9 -0
  79. package/dist/lib/index.d.ts.map +1 -0
  80. package/dist/lib/index.js +6 -0
  81. package/dist/lib/index.js.map +1 -0
  82. package/dist/lib/node-navigation.d.ts +36 -0
  83. package/dist/lib/node-navigation.d.ts.map +1 -0
  84. package/dist/lib/node-navigation.js +52 -0
  85. package/dist/lib/node-navigation.js.map +1 -0
  86. package/dist/lib/traces.d.ts +3 -0
  87. package/dist/lib/traces.d.ts.map +1 -0
  88. package/dist/lib/traces.js +64 -0
  89. package/dist/lib/traces.js.map +1 -0
  90. package/dist/lib/types.d.ts +57 -0
  91. package/dist/lib/types.d.ts.map +1 -0
  92. package/dist/lib/types.js +7 -0
  93. package/dist/lib/types.js.map +1 -0
  94. package/dist/store/blueprint-store.d.ts +35 -0
  95. package/dist/store/blueprint-store.d.ts.map +1 -0
  96. package/dist/store/blueprint-store.js +79 -0
  97. package/dist/store/blueprint-store.js.map +1 -0
  98. package/dist/store/index.d.ts +3 -0
  99. package/dist/store/index.d.ts.map +1 -0
  100. package/dist/store/index.js +2 -0
  101. package/dist/store/index.js.map +1 -0
  102. package/package.json +52 -0
  103. package/scripts/wrap-cli.mjs +15 -0
  104. package/src/bin/cli.ts +128 -0
  105. package/src/components/blueprint-workbench.tsx +305 -0
  106. package/src/components/code-diff-editor.tsx +80 -0
  107. package/src/components/code-editor.tsx +389 -0
  108. package/src/components/file-tabs.tsx +288 -0
  109. package/src/components/file-tree.tsx +301 -0
  110. package/src/components/graph-canvas.tsx +404 -0
  111. package/src/components/ide-layout.tsx +104 -0
  112. package/src/components/ide-workbench.tsx +5 -0
  113. package/src/components/index.ts +12 -0
  114. package/src/components/monaco-setup.ts +67 -0
  115. package/src/components/opencode-settings.tsx +82 -0
  116. package/src/components/policy-workbench.tsx +233 -0
  117. package/src/components/ts-language-service.ts +170 -0
  118. package/src/index.ts +54 -0
  119. package/src/lib/browser/storage.ts +19 -0
  120. package/src/lib/edit.ts +74 -0
  121. package/src/lib/flow-view.ts +1176 -0
  122. package/src/lib/heatmap.ts +103 -0
  123. package/src/lib/index.ts +41 -0
  124. package/src/lib/node-navigation.ts +76 -0
  125. package/src/lib/traces.ts +79 -0
  126. package/src/lib/types.ts +79 -0
  127. package/src/store/blueprint-store.ts +136 -0
  128. package/src/store/index.ts +2 -0
  129. package/test-fixtures/minimal-blueprint.json +34 -0
  130. package/test-fixtures/sample-blueprint.json +184 -0
  131. package/tsconfig.build.json +9 -0
  132. package/tsconfig.json +22 -0
  133. package/tsconfig.tsbuildinfo +1 -0
  134. package/vitest.config.ts +9 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { resolve, dirname } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ function renderJson(graph, options) {
7
+ if (options.nodeId) {
8
+ const node = graph.nodes.find((n) => n.id === options.nodeId);
9
+ if (!node) {
10
+ return JSON.stringify({ error: `Node ${options.nodeId} not found` }, null, 2);
11
+ }
12
+ return JSON.stringify(node, null, 2);
13
+ }
14
+ return JSON.stringify(graph, null, 2);
15
+ }
16
+ function renderText(graph) {
17
+ const lines = [];
18
+ lines.push(`# ${graph.projectName}`);
19
+ lines.push(`Phase: ${graph.phase}`);
20
+ lines.push("");
21
+ lines.push("## Nodes");
22
+ for (const node of graph.nodes) {
23
+ lines.push(`- [${node.kind}] ${node.name}: ${node.summary}`);
24
+ }
25
+ lines.push("");
26
+ lines.push("## Edges");
27
+ for (const edge of graph.edges) {
28
+ lines.push(`- ${edge.from} --[${edge.kind}]--> ${edge.to}`);
29
+ }
30
+ return lines.join("\n");
31
+ }
32
+ async function main() {
33
+ const args = process.argv.slice(2);
34
+ let filePath;
35
+ let command = "render";
36
+ const options = { format: "json" };
37
+ for (let i = 0; i < args.length; i++) {
38
+ if (args[i] === "render" && i + 1 < args.length) {
39
+ command = "render";
40
+ filePath = args[++i];
41
+ }
42
+ else if (args[i] === "--format" && i + 1 < args.length) {
43
+ options.format = args[++i];
44
+ }
45
+ else if (args[i] === "--node" && i + 1 < args.length) {
46
+ options.nodeId = args[++i];
47
+ }
48
+ else if (!args[i].startsWith("--")) {
49
+ filePath = args[i];
50
+ }
51
+ }
52
+ if (!filePath) {
53
+ console.error("Usage: codeflow-canvas render <file> [--format json|text] [--node <id>]");
54
+ process.exit(1);
55
+ }
56
+ const resolvedPath = resolve(filePath);
57
+ let graph;
58
+ try {
59
+ const content = readFileSync(resolvedPath, "utf-8");
60
+ graph = JSON.parse(content);
61
+ }
62
+ catch {
63
+ console.error(`Failed to read or parse blueprint file: ${resolvedPath}`);
64
+ process.exit(1);
65
+ }
66
+ switch (command) {
67
+ case "render":
68
+ if (options.format === "text") {
69
+ console.log(renderText(graph));
70
+ }
71
+ else {
72
+ console.log(renderJson(graph, options));
73
+ }
74
+ break;
75
+ default:
76
+ console.error(`Unknown command: ${command}`);
77
+ process.exit(1);
78
+ }
79
+ }
80
+ main().catch((err) => {
81
+ console.error("CLI error:", err);
82
+ process.exit(1);
83
+ });
84
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function BlueprintWorkbench(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=blueprint-workbench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-workbench.d.ts","sourceRoot":"","sources":["../../src/components/blueprint-workbench.tsx"],"names":[],"mappings":"AAmIA,wBAAgB,kBAAkB,4CA6KjC"}
@@ -0,0 +1,144 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { z } from "zod";
4
+ import { useMemo, useRef, useState } from "react";
5
+ import { useBlueprintStore } from "../store/blueprint-store.js";
6
+ import { GraphCanvas } from "./graph-canvas.js";
7
+ import { buildDetailFlow, indexRuntimeExecutionResult } from "../lib/flow-view.js";
8
+ import { computeHeatmap } from "../lib/heatmap.js";
9
+ import { traceSpanSchema } from "@abhinav2203/codeflow-core/schema";
10
+ const tracesSchema = z.array(traceSpanSchema);
11
+ const maskApiKey = (value) => {
12
+ const trimmed = value.trim();
13
+ if (trimmed.length <= 8) {
14
+ return trimmed;
15
+ }
16
+ return `${trimmed.slice(0, 4)}...${trimmed.slice(-4)}`;
17
+ };
18
+ export function BlueprintWorkbench() {
19
+ const { activeFile, floatingGraph, graph, openFiles, repoPath, selectedNodeId, setActiveFile, setFloatingGraph, setGraph, setOpenFiles, setRepoPath, setSelectedNodeId } = useBlueprintStore();
20
+ const MIN_OBSERVABILITY_INTERVAL_SECS = 2;
21
+ const [projectName, setProjectName] = useState("CodeFlow Workspace");
22
+ const [prdText, setPrdText] = useState("");
23
+ const [aiPrompt, setAiPrompt] = useState("");
24
+ const [nvidiaApiKey, setNvidiaApiKey] = useState("");
25
+ const [executionMode, setExecutionMode] = useState("essential");
26
+ const [outputDir, setOutputDir] = useState("");
27
+ const [traceInput, setTraceInput] = useState("");
28
+ const [runInput, setRunInput] = useState("{}");
29
+ const [error, setError] = useState(null);
30
+ const [busyLabel, setBusyLabel] = useState(null);
31
+ const [exportResult, setExportResult] = useState(null);
32
+ const [runPlan, setRunPlan] = useState(null);
33
+ const [riskReport, setRiskReport] = useState(null);
34
+ const [session, setSession] = useState(null);
35
+ const [pendingApproval, setPendingApproval] = useState(null);
36
+ const [executionResult, setExecutionResult] = useState(null);
37
+ const [latestLogs, setLatestLogs] = useState([]);
38
+ const [latestSpans, setLatestSpans] = useState([]);
39
+ const [conflictReport, setConflictReport] = useState(null);
40
+ const [newNodeName, setNewNodeName] = useState("");
41
+ const [newNodeKind, setNewNodeKind] = useState("function");
42
+ const [edgeFrom, setEdgeFrom] = useState("");
43
+ const [edgeTo, setEdgeTo] = useState("");
44
+ const [edgeKind, setEdgeKind] = useState("calls");
45
+ const [useAI, setUseAI] = useState(true);
46
+ const [drilldownStack, setDrilldownStack] = useState([]);
47
+ const [selectedDetailNodeId, setSelectedDetailNodeId] = useState(null);
48
+ const [codeDrafts, setCodeDrafts] = useState({});
49
+ const [suggestionInstruction, setSuggestionInstruction] = useState("");
50
+ const [codeSuggestion, setCodeSuggestion] = useState(null);
51
+ const [liveCompletionsEnabled, setLiveCompletionsEnabled] = useState(true);
52
+ const [serverApiKeyConfigured, setServerApiKeyConfigured] = useState(false);
53
+ const [apiKeyStatusLoaded, setApiKeyStatusLoaded] = useState(false);
54
+ const [statusTitle, setStatusTitle] = useState("Ready to build");
55
+ const [statusDetail, setStatusDetail] = useState("Enter a project description or repo input, then build a blueprint.");
56
+ const [statusTone, setStatusTone] = useState("info");
57
+ const [activeDockTab, setActiveDockTab] = useState("terminal");
58
+ const [activityFeed, setActivityFeed] = useState([]);
59
+ const [showSettings, setShowSettings] = useState(false);
60
+ const [showPromptPanel, setShowPromptPanel] = useState(true);
61
+ const [showEditPanel, setShowEditPanel] = useState(false);
62
+ const [showInspector, setShowInspector] = useState(false);
63
+ const [showObservabilityPanel, setShowObservabilityPanel] = useState(false);
64
+ const [autoObservability, setAutoObservability] = useState(false);
65
+ const [observabilityIntervalSecs, setObservabilityIntervalSecs] = useState(5);
66
+ const autoObsRef = useRef(autoObservability);
67
+ autoObsRef.current = autoObservability;
68
+ const [autoImplementNodes, setAutoImplementNodes] = useState(false);
69
+ const [cycleReport, setCycleReport] = useState(null);
70
+ const [smellReport, setSmellReport] = useState(null);
71
+ const [graphMetrics, setGraphMetrics] = useState(null);
72
+ const [mermaidDiagram, setMermaidDiagram] = useState(null);
73
+ const [ghostSuggestions, setGhostSuggestions] = useState([]);
74
+ const [showMcpPanel, setShowMcpPanel] = useState(false);
75
+ const [mcpServerUrl, setMcpServerUrl] = useState("");
76
+ const [mcpHeadersJson, setMcpHeadersJson] = useState("{}");
77
+ const [mcpToolName, setMcpToolName] = useState("");
78
+ const [mcpToolArgsJson, setMcpToolArgsJson] = useState("{}");
79
+ const [availableMcpTools, setAvailableMcpTools] = useState([]);
80
+ const [mcpInvokeResult, setMcpInvokeResult] = useState(null);
81
+ const [mcpError, setMcpError] = useState(null);
82
+ const [branches, setBranches] = useState([]);
83
+ const [showBranchPanel, setShowBranchPanel] = useState(false);
84
+ const [newBranchName, setNewBranchName] = useState("");
85
+ const [newBranchDescription, setNewBranchDescription] = useState("");
86
+ const [activeBranchId, setActiveBranchId] = useState(null);
87
+ const [branchDiff, setBranchDiff] = useState(null);
88
+ const [diffTargetBranchId, setDiffTargetBranchId] = useState(null);
89
+ const [showVcrPanel, setShowVcrPanel] = useState(false);
90
+ const [vcrRecording, setVcrRecording] = useState(null);
91
+ const [vcrFrameIndex, setVcrFrameIndex] = useState(0);
92
+ const [vcrPlaying, setVcrPlaying] = useState(false);
93
+ const [vcrGraph, setVcrGraph] = useState(null);
94
+ const [vcrError, setVcrError] = useState(null);
95
+ const [showDigitalTwinPanel, setShowDigitalTwinPanel] = useState(false);
96
+ const [digitalTwinSnapshot, setDigitalTwinSnapshot] = useState(null);
97
+ const [digitalTwinGraph, setDigitalTwinGraph] = useState(null);
98
+ const [digitalTwinWindowSecs, setDigitalTwinWindowSecs] = useState(60);
99
+ const [autoDigitalTwin, setAutoDigitalTwin] = useState(false);
100
+ const autoDigitalTwinRef = useRef(autoDigitalTwin);
101
+ autoDigitalTwinRef.current = autoDigitalTwin;
102
+ const [simulateNodeIds, setSimulateNodeIds] = useState("");
103
+ const [simulateLabel, setSimulateLabel] = useState("");
104
+ const [digitalTwinError, setDigitalTwinError] = useState(null);
105
+ const [digitalTwinPollError, setDigitalTwinPollError] = useState(null);
106
+ const [digitalTwinLastUpdatedAt, setDigitalTwinLastUpdatedAt] = useState(null);
107
+ const [showRefactorPanel, setShowRefactorPanel] = useState(false);
108
+ const [refactorReport, setRefactorReport] = useState(null);
109
+ const [healResult, setHealResult] = useState(null);
110
+ const [refactorError, setRefactorError] = useState(null);
111
+ const graphReplacedByHealRef = useRef(false);
112
+ const refactorAbortRef = useRef(null);
113
+ const [showGeneticPanel, setShowGeneticPanel] = useState(false);
114
+ const [showMascotPanel, setShowMascotPanel] = useState(false);
115
+ const [showPhasePanel, setShowPhasePanel] = useState(false);
116
+ const [geneticGenerations, setGeneticGenerations] = useState(3);
117
+ const [geneticPopulationSize, setGeneticPopulationSize] = useState(6);
118
+ const [tournamentResult, setTournamentResult] = useState(null);
119
+ const [geneticError, setGeneticError] = useState(null);
120
+ const [editorRevealTarget, setEditorRevealTarget] = useState(null);
121
+ const [navigationError, setNavigationError] = useState(null);
122
+ const [showOpencodePanel, setShowOpencodePanel] = useState(false);
123
+ const [opencodeStatus, setOpencodeStatus] = useState({ status: "stopped" });
124
+ const [useOpencodeForAgent, setUseOpencodeForAgent] = useState(false);
125
+ const selectedNode = graph?.nodes.find((node) => node.id === selectedNodeId) ?? null;
126
+ const drilldownNodeId = drilldownStack.at(-1) ?? null;
127
+ const drilldownRootNode = graph?.nodes.find((node) => node.id === drilldownNodeId) ?? null;
128
+ const executionIndex = useMemo(() => indexRuntimeExecutionResult(executionResult), [executionResult]);
129
+ const detailFlow = graph && drilldownNodeId
130
+ ? buildDetailFlow(graph, drilldownNodeId, selectedDetailNodeId ?? undefined, executionResult)
131
+ : null;
132
+ const heatmapData = useMemo(() => graph &&
133
+ graph.nodes.some((node) => node.traceState && node.traceState.count > 0)
134
+ ? computeHeatmap(graph)
135
+ : undefined, [graph]);
136
+ const canStartImplementation = false;
137
+ const canStartIntegration = false;
138
+ const canImplementActiveNode = false;
139
+ const canRunActiveNode = false;
140
+ const isBusy = Boolean(busyLabel);
141
+ const isBuilding = busyLabel === "Building blueprint";
142
+ return (_jsx("div", { className: "workbench-shell", children: _jsx("div", { className: "workbench-main", children: _jsx("div", { className: "graph-panel", children: _jsx(GraphCanvas, { graph: graph, selectedNodeId: selectedNodeId, onSelect: setSelectedNodeId, heatmapData: heatmapData }) }) }) }));
143
+ }
144
+ //# sourceMappingURL=blueprint-workbench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-workbench.js","sourceRoot":"","sources":["../../src/components/blueprint-workbench.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ type CodeDiffEditorProps = {
2
+ originalValue: string;
3
+ modifiedValue: string;
4
+ language?: "typescript" | "javascript" | "json" | "markdown";
5
+ height?: string;
6
+ readOnly?: boolean;
7
+ theme?: "light" | "dark";
8
+ onModifiedChange?: (value: string) => void;
9
+ };
10
+ export declare function CodeDiffEditor({ originalValue, modifiedValue, language, height, readOnly, theme, onModifiedChange }: CodeDiffEditorProps): React.JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=code-diff-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-diff-editor.d.ts","sourceRoot":"","sources":["../../src/components/code-diff-editor.tsx"],"names":[],"mappings":"AAcA,KAAK,mBAAmB,GAAG;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,aAAa,EACb,QAAuB,EACvB,MAAgB,EAChB,QAAgB,EAChB,KAAc,EACd,gBAAgB,EACjB,EAAE,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA+CzC"}
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useRef } from "react";
4
+ import dynamic from "next/dynamic";
5
+ import { prepareMonaco, toMonacoPath } from "./monaco-setup.js";
6
+ const MonacoDiffEditor = dynamic(() => import("@monaco-editor/react").then(mod => mod.DiffEditor), {
7
+ ssr: false,
8
+ loading: () => _jsx("div", { className: "code-diff-editor-loading", children: "Loading diff editor..." })
9
+ });
10
+ export function CodeDiffEditor({ originalValue, modifiedValue, language = "typescript", height = "28rem", readOnly = false, theme = "dark", onModifiedChange }) {
11
+ const monacoRef = useRef(null);
12
+ const modifiedListenerRef = useRef(null);
13
+ return (_jsx("div", { className: "code-diff-editor-shell", style: {
14
+ height,
15
+ minHeight: height === "100%" ? 0 : height
16
+ }, children: _jsx(MonacoDiffEditor, { beforeMount: prepareMonaco, height: height, language: language, modified: modifiedValue, modifiedModelPath: toMonacoPath("diff/modified.ts"), options: {
17
+ automaticLayout: true,
18
+ diffCodeLens: true,
19
+ enableSplitViewResizing: true,
20
+ fontFamily: "IBM Plex Mono, SFMono-Regular, SF Mono, monospace",
21
+ fontLigatures: true,
22
+ fontSize: 14,
23
+ lineNumbersMinChars: 3,
24
+ minimap: { enabled: false },
25
+ padding: { top: 16, bottom: 16 },
26
+ readOnly,
27
+ renderSideBySide: true,
28
+ scrollBeyondLastLine: false,
29
+ smoothScrolling: true,
30
+ wordWrap: "on"
31
+ }, original: originalValue, originalModelPath: toMonacoPath("diff/original.ts"), onMount: (editor, monaco) => {
32
+ monacoRef.current = monaco;
33
+ modifiedListenerRef.current?.dispose();
34
+ modifiedListenerRef.current = editor.getModifiedEditor().onDidChangeModelContent(() => {
35
+ onModifiedChange?.(editor.getModifiedEditor().getValue());
36
+ });
37
+ }, theme: theme === "dark" ? "vs-dark" : "vs-light" }) }));
38
+ }
39
+ //# sourceMappingURL=code-diff-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-diff-editor.js","sourceRoot":"","sources":["../../src/components/code-diff-editor.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,OAAO,MAAM,cAAc,CAAC;AAGnC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;IACjG,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,GAAG,EAAE,CAAC,cAAK,SAAS,EAAC,0BAA0B,uCAA6B;CACtF,CAAC,CAAC;AAYH,MAAM,UAAU,cAAc,CAAC,EAC7B,aAAa,EACb,aAAa,EACb,QAAQ,GAAG,YAAY,EACvB,MAAM,GAAG,OAAO,EAChB,QAAQ,GAAG,KAAK,EAChB,KAAK,GAAG,MAAM,EACd,gBAAgB,EACI;IACpB,MAAM,SAAS,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IACrD,MAAM,mBAAmB,GAAG,MAAM,CAA4B,IAAI,CAAC,CAAC;IAEpE,OAAO,CACL,cACE,SAAS,EAAC,wBAAwB,EAClC,KAAK,EAAE;YACL,MAAM;YACN,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;SAC1C,YAED,KAAC,gBAAgB,IACf,WAAW,EAAE,aAAa,EAC1B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,aAAa,EACvB,iBAAiB,EAAE,YAAY,CAAC,kBAAkB,CAAC,EACnD,OAAO,EAAE;gBACP,eAAe,EAAE,IAAI;gBACrB,YAAY,EAAE,IAAI;gBAClB,uBAAuB,EAAE,IAAI;gBAC7B,UAAU,EAAE,mDAAmD;gBAC/D,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,EAAE;gBACZ,mBAAmB,EAAE,CAAC;gBACtB,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;gBAC3B,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;gBAChC,QAAQ;gBACR,gBAAgB,EAAE,IAAI;gBACtB,oBAAoB,EAAE,KAAK;gBAC3B,eAAe,EAAE,IAAI;gBACrB,QAAQ,EAAE,IAAI;aACf,EACD,QAAQ,EAAE,aAAa,EACvB,iBAAiB,EAAE,YAAY,CAAC,kBAAkB,CAAC,EACnD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;gBAC1B,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;gBAC3B,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;gBACvC,mBAAmB,CAAC,OAAO,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC,uBAAuB,CAAC,GAAG,EAAE;oBACpF,gBAAgB,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5D,CAAC,CAAC,CAAC;YACL,CAAC,EACD,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,GAChD,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { BlueprintGraph } from "@abhinav2203/codeflow-core/schema";
2
+ import type { NavigationTarget } from "../lib/node-navigation.js";
3
+ type CodeEditorProps = {
4
+ path: string;
5
+ value: string;
6
+ onChange: (value: string) => void;
7
+ language?: "typescript" | "javascript" | "json" | "markdown";
8
+ height?: string;
9
+ ariaLabel?: string;
10
+ readOnly?: boolean;
11
+ theme?: "light" | "dark";
12
+ onSave?: () => void | Promise<void>;
13
+ revealTarget?: NavigationTarget | null;
14
+ completionContext?: {
15
+ enabled: boolean;
16
+ graph: BlueprintGraph;
17
+ nodeId: string;
18
+ nvidiaApiKey?: string;
19
+ retrievalQuery?: string;
20
+ retrievalDepth?: number;
21
+ };
22
+ };
23
+ export declare function CodeEditor({ path, value, onChange, language, height, ariaLabel, readOnly, theme, onSave, revealTarget, completionContext }: CodeEditorProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};
25
+ //# sourceMappingURL=code-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-editor.d.ts","sourceRoot":"","sources":["../../src/components/code-editor.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AASlE,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,iBAAiB,CAAC,EAAE;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,cAAc,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH,CAAC;AA2DF,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAuB,EACvB,MAAgB,EAChB,SAAS,EACT,QAAgB,EAChB,KAAc,EACd,MAAM,EACN,YAAY,EACZ,iBAAiB,EAClB,EAAE,eAAe,2CAyRjB"}
@@ -0,0 +1,264 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useRef } from "react";
4
+ import dynamic from "next/dynamic";
5
+ import { prepareMonaco, toMonacoPath } from "./monaco-setup.js";
6
+ import { getTypeScriptLanguageService } from "./ts-language-service.js";
7
+ const MonacoEditor = dynamic(() => import("@monaco-editor/react"), {
8
+ ssr: false,
9
+ loading: () => _jsx("div", { className: "code-editor-loading", children: "Loading editor..." })
10
+ });
11
+ const COMPLETION_TTL_MS = 15_000;
12
+ const COMPLETION_DEBOUNCE_MS = 220;
13
+ const toCompletionKind = (monaco, kind) => {
14
+ switch (kind) {
15
+ case "method":
16
+ return monaco.languages.CompletionItemKind.Method;
17
+ case "function":
18
+ return monaco.languages.CompletionItemKind.Function;
19
+ case "constructor":
20
+ return monaco.languages.CompletionItemKind.Constructor;
21
+ case "field":
22
+ return monaco.languages.CompletionItemKind.Field;
23
+ case "variable":
24
+ return monaco.languages.CompletionItemKind.Variable;
25
+ case "class":
26
+ return monaco.languages.CompletionItemKind.Class;
27
+ case "interface":
28
+ return monaco.languages.CompletionItemKind.Interface;
29
+ case "module":
30
+ return monaco.languages.CompletionItemKind.Module;
31
+ case "property":
32
+ return monaco.languages.CompletionItemKind.Property;
33
+ case "unit":
34
+ return monaco.languages.CompletionItemKind.Unit;
35
+ case "value":
36
+ return monaco.languages.CompletionItemKind.Value;
37
+ case "enum":
38
+ return monaco.languages.CompletionItemKind.Enum;
39
+ case "keyword":
40
+ return monaco.languages.CompletionItemKind.Keyword;
41
+ case "snippet":
42
+ return monaco.languages.CompletionItemKind.Snippet;
43
+ case "color":
44
+ return monaco.languages.CompletionItemKind.Color;
45
+ case "file":
46
+ return monaco.languages.CompletionItemKind.File;
47
+ case "reference":
48
+ return monaco.languages.CompletionItemKind.Reference;
49
+ default:
50
+ return monaco.languages.CompletionItemKind.Text;
51
+ }
52
+ };
53
+ export function CodeEditor({ path, value, onChange, language = "typescript", height = "28rem", ariaLabel, readOnly = false, theme = "dark", onSave, revealTarget, completionContext }) {
54
+ const monacoRef = useRef(null);
55
+ const editorRef = useRef(null);
56
+ const decorationIdsRef = useRef([]);
57
+ const completionContextRef = useRef(completionContext);
58
+ const providerRef = useRef(null);
59
+ const cacheRef = useRef(new Map());
60
+ const inflightRef = useRef(new Map());
61
+ const debounceRef = useRef({
62
+ timer: null,
63
+ resolve: null
64
+ });
65
+ const waitForDebounce = () => new Promise((resolve) => {
66
+ if (debounceRef.current.timer) {
67
+ window.clearTimeout(debounceRef.current.timer);
68
+ debounceRef.current.resolve?.(false);
69
+ }
70
+ debounceRef.current.resolve = resolve;
71
+ debounceRef.current.timer = window.setTimeout(() => {
72
+ debounceRef.current.timer = null;
73
+ debounceRef.current.resolve = null;
74
+ resolve(true);
75
+ }, COMPLETION_DEBOUNCE_MS);
76
+ });
77
+ const registerCompletionProvider = useCallback((monaco) => {
78
+ providerRef.current?.dispose();
79
+ if (readOnly || (language !== "typescript" && language !== "javascript")) {
80
+ return;
81
+ }
82
+ providerRef.current = monaco.languages.registerCompletionItemProvider(language, {
83
+ triggerCharacters: [".", "("],
84
+ provideCompletionItems: async (model, position, context) => {
85
+ const activeContext = completionContextRef.current;
86
+ if (!activeContext?.enabled) {
87
+ return { suggestions: [] };
88
+ }
89
+ if (context.triggerKind === monaco.languages.CompletionTriggerKind.TriggerCharacter &&
90
+ ![".", "("].includes(context.triggerCharacter ?? "")) {
91
+ return { suggestions: [] };
92
+ }
93
+ const word = model.getWordUntilPosition(position);
94
+ const lineContent = model.getLineContent(position.lineNumber);
95
+ const linePrefix = lineContent.slice(0, position.column - 1);
96
+ const lineSuffix = lineContent.slice(position.column - 1);
97
+ const currentCode = model.getValue();
98
+ const cursorOffset = model.getOffsetAt(position);
99
+ const recentPrefix = currentCode.slice(Math.max(0, cursorOffset - 180), cursorOffset);
100
+ if (context.triggerKind !== monaco.languages.CompletionTriggerKind.TriggerCharacter &&
101
+ recentPrefix.trim().length < 3) {
102
+ return { suggestions: [] };
103
+ }
104
+ const cacheKey = JSON.stringify([
105
+ activeContext.nodeId,
106
+ activeContext.retrievalQuery ?? "",
107
+ activeContext.retrievalDepth ?? 0,
108
+ context.triggerCharacter ?? "manual",
109
+ recentPrefix
110
+ ]);
111
+ const cached = cacheRef.current.get(cacheKey);
112
+ if (cached && Date.now() - cached.createdAt < COMPLETION_TTL_MS) {
113
+ return { suggestions: cached.suggestions };
114
+ }
115
+ const inflight = inflightRef.current.get(cacheKey);
116
+ if (inflight) {
117
+ return { suggestions: await inflight };
118
+ }
119
+ const shouldContinue = await waitForDebounce();
120
+ if (!shouldContinue) {
121
+ return { suggestions: [] };
122
+ }
123
+ const completionPromise = (async () => {
124
+ try {
125
+ const response = await fetch("/api/code-completions", {
126
+ method: "POST",
127
+ headers: {
128
+ "content-type": "application/json"
129
+ },
130
+ body: JSON.stringify({
131
+ graph: activeContext.graph,
132
+ nodeId: activeContext.nodeId,
133
+ currentCode,
134
+ cursorOffset,
135
+ linePrefix,
136
+ lineSuffix,
137
+ triggerCharacter: context.triggerCharacter ?? undefined,
138
+ retrievalQuery: activeContext.retrievalQuery,
139
+ retrievalDepth: activeContext.retrievalDepth,
140
+ nvidiaApiKey: activeContext.nvidiaApiKey
141
+ })
142
+ });
143
+ if (!response.ok) {
144
+ return [];
145
+ }
146
+ const body = (await response.json());
147
+ const range = new monaco.Range(position.lineNumber, position.column - word.word.length, position.lineNumber, position.column);
148
+ return body.suggestions.map((suggestion) => ({
149
+ detail: suggestion.detail,
150
+ documentation: suggestion.documentation,
151
+ insertText: suggestion.insertText,
152
+ insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
153
+ kind: toCompletionKind(monaco, suggestion.kind),
154
+ label: suggestion.label,
155
+ range
156
+ }));
157
+ }
158
+ catch {
159
+ return [];
160
+ }
161
+ })();
162
+ inflightRef.current.set(cacheKey, completionPromise);
163
+ try {
164
+ const suggestions = await completionPromise;
165
+ cacheRef.current.set(cacheKey, {
166
+ createdAt: Date.now(),
167
+ suggestions
168
+ });
169
+ return { suggestions };
170
+ }
171
+ finally {
172
+ inflightRef.current.delete(cacheKey);
173
+ }
174
+ }
175
+ });
176
+ }, [language, readOnly]);
177
+ useEffect(() => {
178
+ completionContextRef.current = completionContext;
179
+ }, [completionContext]);
180
+ useEffect(() => {
181
+ if (monacoRef.current) {
182
+ registerCompletionProvider(monacoRef.current);
183
+ }
184
+ }, [language, readOnly, registerCompletionProvider]);
185
+ useEffect(() => {
186
+ if (!monacoRef.current || (language !== "typescript" && language !== "javascript")) {
187
+ return;
188
+ }
189
+ getTypeScriptLanguageService(monacoRef.current).upsertWorkspaceFile(path, value);
190
+ }, [language, path, value]);
191
+ useEffect(() => {
192
+ if (!editorRef.current || !monacoRef.current || !revealTarget) {
193
+ return;
194
+ }
195
+ const monaco = monacoRef.current;
196
+ const editor = editorRef.current;
197
+ const startColumn = Math.max(1, revealTarget.columnStart ?? 1);
198
+ const endLineNumber = Math.max(revealTarget.endLineNumber ?? revealTarget.lineNumber, revealTarget.lineNumber);
199
+ const endColumn = Math.max(revealTarget.columnEnd ?? (endLineNumber === revealTarget.lineNumber ? startColumn + 1 : 1), 1);
200
+ const range = new monaco.Range(revealTarget.lineNumber, startColumn, endLineNumber, endColumn);
201
+ editor.revealRangeInCenter(range);
202
+ editor.setSelection(range);
203
+ decorationIdsRef.current = editor.deltaDecorations(decorationIdsRef.current, [
204
+ {
205
+ range,
206
+ options: {
207
+ className: "code-editor-highlight",
208
+ inlineClassName: "code-editor-highlight-inline",
209
+ isWholeLine: revealTarget.lineNumber === endLineNumber && startColumn === 1
210
+ }
211
+ }
212
+ ]);
213
+ }, [revealTarget]);
214
+ useEffect(() => {
215
+ const debounceState = debounceRef.current;
216
+ return () => {
217
+ providerRef.current?.dispose();
218
+ if (editorRef.current) {
219
+ decorationIdsRef.current = editorRef.current.deltaDecorations(decorationIdsRef.current, []);
220
+ }
221
+ if (debounceState.timer) {
222
+ window.clearTimeout(debounceState.timer);
223
+ }
224
+ debounceState.resolve?.(false);
225
+ };
226
+ }, []);
227
+ return (_jsxs("div", { className: "code-editor-shell", style: {
228
+ height,
229
+ minHeight: height === "100%" ? 0 : height
230
+ }, children: [_jsx(MonacoEditor, { beforeMount: prepareMonaco, height: height, language: language, onMount: (editor, monaco) => {
231
+ monacoRef.current = monaco;
232
+ editorRef.current = editor;
233
+ getTypeScriptLanguageService(monaco).upsertWorkspaceFile(path, value);
234
+ registerCompletionProvider(monaco);
235
+ editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {
236
+ void onSave?.();
237
+ });
238
+ }, onChange: (nextValue) => onChange(nextValue ?? ""), options: {
239
+ automaticLayout: true,
240
+ ariaLabel: ariaLabel ?? path,
241
+ fontFamily: "IBM Plex Mono, SFMono-Regular, SF Mono, monospace",
242
+ fontLigatures: true,
243
+ fontSize: 14,
244
+ lineNumbersMinChars: 3,
245
+ minimap: { enabled: false },
246
+ padding: { top: 16, bottom: 16 },
247
+ readOnly,
248
+ scrollBeyondLastLine: false,
249
+ smoothScrolling: true,
250
+ tabSize: 2,
251
+ wordWrap: "on"
252
+ }, path: toMonacoPath(path), theme: theme === "dark" ? "vs-dark" : "vs-light", value: value }), _jsx("style", { dangerouslySetInnerHTML: { __html: `
253
+ .code-editor-shell .code-editor-highlight {
254
+ background: rgba(96, 165, 250, 0.18);
255
+ border-left: 2px solid rgba(125, 211, 252, 0.8);
256
+ }
257
+
258
+ .code-editor-shell .code-editor-highlight-inline {
259
+ background: rgba(96, 165, 250, 0.18);
260
+ border-radius: 3px;
261
+ }
262
+ ` } })] }));
263
+ }
264
+ //# sourceMappingURL=code-editor.js.map