fluidcad 0.0.34 → 0.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +69 -0
- package/bin/commands/login.js +148 -0
- package/bin/commands/mcp.js +3 -2
- package/bin/commands/pack.js +49 -0
- package/bin/commands/publish.js +231 -0
- package/bin/fluidcad.js +6 -0
- package/bin/lib/api-client.js +48 -0
- package/bin/lib/browser.js +16 -0
- package/bin/lib/config.js +39 -0
- package/bin/lib/model-config.js +61 -0
- package/bin/lib/prompt.js +97 -0
- package/bin/lib/workspace.js +57 -0
- package/lib/dist/common/shape-factory.d.ts +2 -1
- package/lib/dist/common/shape-factory.js +4 -0
- package/lib/dist/common/transformable-primitive.d.ts +6 -5
- package/lib/dist/common/transformable-primitive.js +8 -7
- package/lib/dist/common/vertex.js +0 -1
- package/lib/dist/core/2d/aline.d.ts +4 -3
- package/lib/dist/core/2d/aline.js +3 -2
- package/lib/dist/core/2d/arc.d.ts +3 -2
- package/lib/dist/core/2d/arc.js +4 -3
- package/lib/dist/core/2d/bezier.d.ts +8 -6
- package/lib/dist/core/2d/circle.d.ts +4 -3
- package/lib/dist/core/2d/circle.js +3 -2
- package/lib/dist/core/2d/ellipse.d.ts +5 -4
- package/lib/dist/core/2d/ellipse.js +5 -4
- package/lib/dist/core/2d/hline.d.ts +4 -3
- package/lib/dist/core/2d/hline.js +5 -3
- package/lib/dist/core/2d/line.js +1 -0
- package/lib/dist/core/2d/offset.d.ts +3 -2
- package/lib/dist/core/2d/offset.js +6 -5
- package/lib/dist/core/2d/polygon.d.ts +5 -4
- package/lib/dist/core/2d/polygon.js +10 -9
- package/lib/dist/core/2d/rect.d.ts +4 -3
- package/lib/dist/core/2d/rect.js +10 -9
- package/lib/dist/core/2d/slot.d.ts +14 -6
- package/lib/dist/core/2d/slot.js +19 -8
- package/lib/dist/core/2d/vline.d.ts +4 -3
- package/lib/dist/core/2d/vline.js +5 -3
- package/lib/dist/core/chamfer.d.ts +5 -4
- package/lib/dist/core/chamfer.js +7 -6
- package/lib/dist/core/color.d.ts +3 -2
- package/lib/dist/core/color.js +2 -1
- package/lib/dist/core/cut.d.ts +4 -3
- package/lib/dist/core/cut.js +5 -4
- package/lib/dist/core/cylinder.d.ts +2 -1
- package/lib/dist/core/cylinder.js +2 -1
- package/lib/dist/core/draft.d.ts +3 -2
- package/lib/dist/core/draft.js +3 -2
- package/lib/dist/core/extrude.d.ts +4 -3
- package/lib/dist/core/extrude.js +5 -4
- package/lib/dist/core/fillet.d.ts +5 -4
- package/lib/dist/core/fillet.js +6 -5
- package/lib/dist/core/index.d.ts +1 -0
- package/lib/dist/core/index.js +1 -0
- package/lib/dist/core/interfaces.d.ts +25 -24
- package/lib/dist/core/param.d.ts +74 -0
- package/lib/dist/core/param.js +147 -0
- package/lib/dist/core/repeat.d.ts +2 -1
- package/lib/dist/core/repeat.js +10 -8
- package/lib/dist/core/revolve.d.ts +2 -1
- package/lib/dist/core/revolve.js +3 -2
- package/lib/dist/core/rib.d.ts +3 -2
- package/lib/dist/core/rib.js +6 -2
- package/lib/dist/core/rotate.d.ts +5 -4
- package/lib/dist/core/rotate.js +4 -3
- package/lib/dist/core/shell.d.ts +3 -2
- package/lib/dist/core/shell.js +3 -2
- package/lib/dist/core/sphere.d.ts +3 -2
- package/lib/dist/core/sphere.js +2 -1
- package/lib/dist/core/translate.d.ts +7 -6
- package/lib/dist/core/translate.js +6 -5
- package/lib/dist/features/2d/arc.js +5 -5
- package/lib/dist/features/2d/bezier.js +16 -16
- package/lib/dist/features/2d/circle.js +4 -0
- package/lib/dist/features/2d/ellipse.js +4 -0
- package/lib/dist/features/2d/hline.d.ts +3 -0
- package/lib/dist/features/2d/hline.js +9 -2
- package/lib/dist/features/2d/line.d.ts +3 -0
- package/lib/dist/features/2d/line.js +11 -3
- package/lib/dist/features/2d/sketch.js +5 -1
- package/lib/dist/features/2d/slot.d.ts +5 -0
- package/lib/dist/features/2d/slot.js +52 -7
- package/lib/dist/features/2d/tarc-to-point-tangent.js +3 -0
- package/lib/dist/features/2d/tarc-to-point.js +3 -0
- package/lib/dist/features/2d/tarc-with-tangent.js +3 -0
- package/lib/dist/features/2d/tarc.js +3 -0
- package/lib/dist/features/2d/vline.d.ts +3 -0
- package/lib/dist/features/2d/vline.js +9 -2
- package/lib/dist/features/copy-circular.d.ts +4 -3
- package/lib/dist/features/copy-circular.js +16 -9
- package/lib/dist/features/copy-circular2d.js +16 -9
- package/lib/dist/features/copy-linear.d.ts +4 -3
- package/lib/dist/features/copy-linear.js +18 -12
- package/lib/dist/features/copy-linear2d.js +18 -12
- package/lib/dist/features/extrude-base.d.ts +4 -3
- package/lib/dist/features/extrude-base.js +10 -3
- package/lib/dist/features/mirror-shape2d.js +2 -2
- package/lib/dist/features/repeat-base.d.ts +13 -0
- package/lib/dist/features/repeat-base.js +21 -0
- package/lib/dist/features/repeat-circular.d.ts +6 -5
- package/lib/dist/features/repeat-circular.js +3 -6
- package/lib/dist/features/repeat-linear.d.ts +7 -7
- package/lib/dist/features/repeat-linear.js +3 -6
- package/lib/dist/index.d.ts +5 -0
- package/lib/dist/index.js +8 -1
- package/lib/dist/io/file-import.d.ts +7 -0
- package/lib/dist/io/file-import.js +30 -10
- package/lib/dist/math/lazy-matrix.d.ts +5 -0
- package/lib/dist/math/lazy-matrix.js +78 -10
- package/lib/dist/oc/boolean-ops.d.ts +2 -2
- package/lib/dist/param-registry.d.ts +34 -0
- package/lib/dist/param-registry.js +60 -0
- package/lib/dist/rendering/mesh-builder.js +2 -1
- package/lib/dist/tests/features/copy-circular.test.js +1 -1
- package/lib/dist/tests/features/copy-linear.test.js +10 -10
- package/lib/dist/tests/features/repeat-user-repro-cache.test.d.ts +1 -0
- package/lib/dist/tests/features/repeat-user-repro-cache.test.js +97 -0
- package/lib/dist/tsconfig.tsbuildinfo +1 -1
- package/llm-docs/api/bezier.md +10 -11
- package/llm-docs/api/index.json +1 -1
- package/llm-docs/api/types/arc-points.md +2 -2
- package/llm-docs/api/types/cut.md +10 -10
- package/llm-docs/api/types/extrude.md +10 -10
- package/llm-docs/api/types/loft.md +6 -6
- package/llm-docs/api/types/revolve.md +6 -6
- package/llm-docs/api/types/rib.md +2 -2
- package/llm-docs/api/types/slot.md +2 -2
- package/llm-docs/api/types/sweep.md +10 -10
- package/llm-docs/api/types/transformable.md +14 -14
- package/llm-docs/index.json +12 -12
- package/mcp/dist/client.d.ts +1 -0
- package/mcp/dist/client.js +8 -1
- package/mcp/dist/server.js +14 -1
- package/mcp/dist/tools/engine.d.ts +16 -0
- package/mcp/dist/tools/engine.js +45 -0
- package/package.json +9 -3
- package/server/dist/api.d.ts +37 -0
- package/server/dist/api.js +44 -0
- package/server/dist/code-editor.d.ts +64 -0
- package/server/dist/code-editor.js +520 -2
- package/server/dist/fluidcad-server.d.ts +87 -1
- package/server/dist/fluidcad-server.js +254 -88
- package/server/dist/host/blocked-imports.d.ts +8 -0
- package/server/dist/host/blocked-imports.js +30 -0
- package/server/dist/{vite-manager.d.ts → host/local-scene-host.d.ts} +3 -1
- package/server/dist/{vite-manager.js → host/local-scene-host.js} +6 -26
- package/server/dist/host/scene-host.d.ts +19 -0
- package/server/dist/host/scene-host.js +1 -0
- package/server/dist/index.js +24 -117
- package/server/dist/model-package/capture-params.d.ts +19 -0
- package/server/dist/model-package/capture-params.js +42 -0
- package/server/dist/model-package/pack.d.ts +23 -0
- package/server/dist/model-package/pack.js +230 -0
- package/server/dist/model-package/types.d.ts +79 -0
- package/server/dist/model-package/types.js +17 -0
- package/server/dist/routes/hit-test.d.ts +3 -0
- package/server/dist/routes/hit-test.js +17 -0
- package/server/dist/routes/pack.d.ts +10 -0
- package/server/dist/routes/pack.js +47 -0
- package/server/dist/routes/params.d.ts +3 -0
- package/server/dist/routes/params.js +75 -0
- package/server/dist/routes/sketch-edits.d.ts +3 -0
- package/server/dist/routes/sketch-edits.js +542 -0
- package/server/dist/routes/timeline.d.ts +3 -0
- package/server/dist/routes/timeline.js +49 -0
- package/server/dist/server-core.d.ts +53 -0
- package/server/dist/server-core.js +147 -0
- package/server/dist/ws-protocol.d.ts +101 -2
- package/ui/dist/assets/index-CDJmUpFI.css +2 -0
- package/ui/dist/assets/index-MRqwG9Vh.js +5417 -0
- package/ui/dist/index.html +2 -2
- package/server/dist/routes/actions.d.ts +0 -3
- package/server/dist/routes/actions.js +0 -309
- package/ui/dist/assets/index-BdqrMDRu.js +0 -4946
- package/ui/dist/assets/index-DR7c2Qk9.css +0 -2
package/ui/dist/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>FluidCAD Viewer</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-MRqwG9Vh.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CDJmUpFI.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body class="m-0 p-0 overflow-hidden w-full h-full bg-base-100 text-base-content">
|
|
11
11
|
<div id="fluidcad-viewer" class="relative w-full h-full"></div>
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { Router } from 'express';
|
|
2
|
-
import type { FluidCadServer } from '../fluidcad-server.ts';
|
|
3
|
-
export declare function createActionsRouter(fluidCadServer: FluidCadServer, sendToExtension: (msg: any) => void, broadcastToUI: (msg: any) => void, workspacePath: string): Router;
|
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
import { Router } from 'express';
|
|
2
|
-
import { addBreakpoint, removeBreakpoint, toggleBreakpoint, clearBreakpoints, insertPoint, removePoint, addPick, removePick, setPickPoints, } from "../code-editor.js";
|
|
3
|
-
export function createActionsRouter(fluidCadServer, sendToExtension, broadcastToUI, workspacePath) {
|
|
4
|
-
const router = Router();
|
|
5
|
-
router.post('/hit-test', (req, res) => {
|
|
6
|
-
const { shapeId, rayOrigin, rayDir, edgeThreshold } = req.body;
|
|
7
|
-
if (typeof shapeId !== 'string' ||
|
|
8
|
-
!Array.isArray(rayOrigin) || rayOrigin.length !== 3 ||
|
|
9
|
-
!Array.isArray(rayDir) || rayDir.length !== 3 ||
|
|
10
|
-
typeof edgeThreshold !== 'number') {
|
|
11
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
const result = fluidCadServer.hitTest(shapeId, rayOrigin, rayDir, edgeThreshold);
|
|
15
|
-
res.json(result);
|
|
16
|
-
});
|
|
17
|
-
router.post('/insert-point', (req, res) => {
|
|
18
|
-
const { point, sourceLocation } = req.body;
|
|
19
|
-
if (!Array.isArray(point) || point.length !== 2 ||
|
|
20
|
-
!sourceLocation || typeof sourceLocation.line !== 'number' || typeof sourceLocation.column !== 'number') {
|
|
21
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
sendToExtension({
|
|
25
|
-
type: 'insert-point',
|
|
26
|
-
point: point,
|
|
27
|
-
sourceLocation,
|
|
28
|
-
});
|
|
29
|
-
res.json({ success: true });
|
|
30
|
-
});
|
|
31
|
-
router.post('/remove-point', (req, res) => {
|
|
32
|
-
const { point, sourceLocation } = req.body;
|
|
33
|
-
if (!Array.isArray(point) || point.length !== 2 ||
|
|
34
|
-
!sourceLocation || typeof sourceLocation.line !== 'number' || typeof sourceLocation.column !== 'number') {
|
|
35
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
sendToExtension({
|
|
39
|
-
type: 'remove-point',
|
|
40
|
-
point: point,
|
|
41
|
-
sourceLocation,
|
|
42
|
-
});
|
|
43
|
-
res.json({ success: true });
|
|
44
|
-
});
|
|
45
|
-
router.post('/rollback', async (req, res) => {
|
|
46
|
-
const { index } = req.body;
|
|
47
|
-
if (typeof index !== 'number' || index < 0) {
|
|
48
|
-
res.status(400).json({ error: 'Invalid index' });
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const data = await fluidCadServer.rollbackFromUI(index);
|
|
52
|
-
if (!data) {
|
|
53
|
-
res.status(404).json({ error: 'No active scene' });
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
sendToExtension({
|
|
57
|
-
type: 'scene-rendered',
|
|
58
|
-
absPath: data.absPath,
|
|
59
|
-
result: data.result,
|
|
60
|
-
rollbackStop: data.rollbackStop,
|
|
61
|
-
});
|
|
62
|
-
broadcastToUI({
|
|
63
|
-
type: 'scene-rendered',
|
|
64
|
-
result: data.result,
|
|
65
|
-
absPath: data.absPath,
|
|
66
|
-
rollbackStop: data.rollbackStop,
|
|
67
|
-
});
|
|
68
|
-
res.json({ success: true });
|
|
69
|
-
});
|
|
70
|
-
router.post('/recompute', async (_req, res) => {
|
|
71
|
-
const data = await fluidCadServer.recomputeCurrentFile();
|
|
72
|
-
if (!data) {
|
|
73
|
-
res.status(404).json({ error: 'No active scene' });
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
sendToExtension({
|
|
77
|
-
type: 'scene-rendered',
|
|
78
|
-
absPath: data.absPath,
|
|
79
|
-
result: data.result,
|
|
80
|
-
rollbackStop: data.rollbackStop,
|
|
81
|
-
});
|
|
82
|
-
broadcastToUI({
|
|
83
|
-
type: 'scene-rendered',
|
|
84
|
-
result: data.result,
|
|
85
|
-
absPath: data.absPath,
|
|
86
|
-
breakpointHit: data.breakpointHit,
|
|
87
|
-
});
|
|
88
|
-
res.json({ success: true });
|
|
89
|
-
});
|
|
90
|
-
router.post('/clear-breakpoints', (_req, res) => {
|
|
91
|
-
sendToExtension({ type: 'clear-breakpoints' });
|
|
92
|
-
res.json({ success: true });
|
|
93
|
-
});
|
|
94
|
-
router.post('/add-breakpoint', (req, res) => {
|
|
95
|
-
const { sourceLocation } = req.body;
|
|
96
|
-
if (!sourceLocation ||
|
|
97
|
-
typeof sourceLocation.filePath !== 'string' ||
|
|
98
|
-
typeof sourceLocation.line !== 'number') {
|
|
99
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
sendToExtension({
|
|
103
|
-
type: 'add-breakpoint',
|
|
104
|
-
filePath: sourceLocation.filePath,
|
|
105
|
-
line: sourceLocation.line,
|
|
106
|
-
});
|
|
107
|
-
res.json({ success: true });
|
|
108
|
-
});
|
|
109
|
-
router.post('/add-pick', (req, res) => {
|
|
110
|
-
const { sourceLocation } = req.body;
|
|
111
|
-
if (!sourceLocation || typeof sourceLocation.line !== 'number' || typeof sourceLocation.column !== 'number') {
|
|
112
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
sendToExtension({
|
|
116
|
-
type: 'add-pick',
|
|
117
|
-
sourceLocation,
|
|
118
|
-
});
|
|
119
|
-
res.json({ success: true });
|
|
120
|
-
});
|
|
121
|
-
router.post('/remove-pick', (req, res) => {
|
|
122
|
-
const { sourceLocation } = req.body;
|
|
123
|
-
if (!sourceLocation || typeof sourceLocation.line !== 'number' || typeof sourceLocation.column !== 'number') {
|
|
124
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
sendToExtension({
|
|
128
|
-
type: 'remove-pick',
|
|
129
|
-
sourceLocation,
|
|
130
|
-
});
|
|
131
|
-
res.json({ success: true });
|
|
132
|
-
});
|
|
133
|
-
router.post('/set-pick-points', (req, res) => {
|
|
134
|
-
const { points, sourceLocation } = req.body;
|
|
135
|
-
if (!Array.isArray(points) ||
|
|
136
|
-
!sourceLocation || typeof sourceLocation.line !== 'number' || typeof sourceLocation.column !== 'number') {
|
|
137
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
sendToExtension({
|
|
141
|
-
type: 'set-pick-points',
|
|
142
|
-
points: points,
|
|
143
|
-
sourceLocation,
|
|
144
|
-
});
|
|
145
|
-
res.json({ success: true });
|
|
146
|
-
});
|
|
147
|
-
router.post('/import-file', async (req, res) => {
|
|
148
|
-
const { fileName, data } = req.body;
|
|
149
|
-
if (typeof fileName !== 'string' || typeof data !== 'string') {
|
|
150
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
try {
|
|
154
|
-
await fluidCadServer.importFile(workspacePath, fileName, data);
|
|
155
|
-
}
|
|
156
|
-
catch (err) {
|
|
157
|
-
res.status(500).json({ error: err.message || String(err) });
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
const loadName = fileName.replace(/\.(step|stp)$/i, '');
|
|
161
|
-
res.json({ success: true, fileName: loadName });
|
|
162
|
-
});
|
|
163
|
-
// ---------------------------------------------------------------------------
|
|
164
|
-
// /api/code/* — extensions send the current buffer text plus operation
|
|
165
|
-
// params; the server returns the fully edited text. All source-text
|
|
166
|
-
// manipulation lives here so VSCode and Neovim share one implementation.
|
|
167
|
-
// ---------------------------------------------------------------------------
|
|
168
|
-
router.post('/code/add-breakpoint', async (req, res) => {
|
|
169
|
-
const { code, referenceRow } = req.body;
|
|
170
|
-
if (typeof code !== 'string' || typeof referenceRow !== 'number') {
|
|
171
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
try {
|
|
175
|
-
const result = await addBreakpoint(code, referenceRow);
|
|
176
|
-
res.json(result);
|
|
177
|
-
}
|
|
178
|
-
catch (err) {
|
|
179
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
router.post('/code/remove-breakpoint', async (req, res) => {
|
|
183
|
-
const { code, line } = req.body;
|
|
184
|
-
if (typeof code !== 'string' || typeof line !== 'number') {
|
|
185
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
try {
|
|
189
|
-
const result = await removeBreakpoint(code, line);
|
|
190
|
-
res.json(result);
|
|
191
|
-
}
|
|
192
|
-
catch (err) {
|
|
193
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
router.post('/code/toggle-breakpoint', async (req, res) => {
|
|
197
|
-
const { code, cursorRow } = req.body;
|
|
198
|
-
if (typeof code !== 'string' || typeof cursorRow !== 'number') {
|
|
199
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
try {
|
|
203
|
-
const result = await toggleBreakpoint(code, cursorRow);
|
|
204
|
-
res.json(result);
|
|
205
|
-
}
|
|
206
|
-
catch (err) {
|
|
207
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
router.post('/code/clear-breakpoints', async (req, res) => {
|
|
211
|
-
const { code } = req.body;
|
|
212
|
-
if (typeof code !== 'string') {
|
|
213
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
try {
|
|
217
|
-
const result = await clearBreakpoints(code);
|
|
218
|
-
res.json(result);
|
|
219
|
-
}
|
|
220
|
-
catch (err) {
|
|
221
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
router.post('/code/insert-point', async (req, res) => {
|
|
225
|
-
const { code, sourceLine, point } = req.body;
|
|
226
|
-
if (typeof code !== 'string' || typeof sourceLine !== 'number' ||
|
|
227
|
-
!Array.isArray(point) || point.length !== 2) {
|
|
228
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
try {
|
|
232
|
-
const result = await insertPoint(code, sourceLine, point);
|
|
233
|
-
res.json(result);
|
|
234
|
-
}
|
|
235
|
-
catch (err) {
|
|
236
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
router.post('/code/remove-point', async (req, res) => {
|
|
240
|
-
const { code, sourceLine, point } = req.body;
|
|
241
|
-
if (typeof code !== 'string' || typeof sourceLine !== 'number' ||
|
|
242
|
-
!Array.isArray(point) || point.length !== 2) {
|
|
243
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
try {
|
|
247
|
-
const result = await removePoint(code, sourceLine, point);
|
|
248
|
-
res.json(result);
|
|
249
|
-
}
|
|
250
|
-
catch (err) {
|
|
251
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
router.post('/code/add-pick', async (req, res) => {
|
|
255
|
-
const { code, sourceLine } = req.body;
|
|
256
|
-
if (typeof code !== 'string' || typeof sourceLine !== 'number') {
|
|
257
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
try {
|
|
261
|
-
const result = await addPick(code, sourceLine);
|
|
262
|
-
res.json(result);
|
|
263
|
-
}
|
|
264
|
-
catch (err) {
|
|
265
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
router.post('/code/remove-pick', async (req, res) => {
|
|
269
|
-
const { code, sourceLine } = req.body;
|
|
270
|
-
if (typeof code !== 'string' || typeof sourceLine !== 'number') {
|
|
271
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
try {
|
|
275
|
-
const result = await removePick(code, sourceLine);
|
|
276
|
-
res.json(result);
|
|
277
|
-
}
|
|
278
|
-
catch (err) {
|
|
279
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
router.post('/code/goto-source', (req, res) => {
|
|
283
|
-
const { filePath, line, column } = req.body;
|
|
284
|
-
if (typeof filePath !== 'string' ||
|
|
285
|
-
typeof line !== 'number' ||
|
|
286
|
-
typeof column !== 'number') {
|
|
287
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
sendToExtension({ type: 'goto-source', filePath, line, column });
|
|
291
|
-
res.json({ success: true });
|
|
292
|
-
});
|
|
293
|
-
router.post('/code/set-pick-points', async (req, res) => {
|
|
294
|
-
const { code, sourceLine, points } = req.body;
|
|
295
|
-
if (typeof code !== 'string' || typeof sourceLine !== 'number' ||
|
|
296
|
-
!Array.isArray(points)) {
|
|
297
|
-
res.status(400).json({ error: 'Invalid request body' });
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
try {
|
|
301
|
-
const result = await setPickPoints(code, sourceLine, points);
|
|
302
|
-
res.json(result);
|
|
303
|
-
}
|
|
304
|
-
catch (err) {
|
|
305
|
-
res.status(500).json({ error: err?.message || String(err) });
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
return router;
|
|
309
|
-
}
|