covenant-bridge 0.1.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.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Covenant Bridge Backend
3
+ *
4
+ * Main entry point for the LinuxCNC-Eden bridge.
5
+ * Initializes and exposes all AppBus services.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Covenant Bridge Backend
3
+ *
4
+ * Main entry point for the LinuxCNC-Eden bridge.
5
+ * Initializes and exposes all AppBus services.
6
+ */
7
+ import { initLinuxCNCService } from "./services/linuxcnc.js";
8
+ import { initGCodeService } from "./services/gcode.js";
9
+ import { initHalService } from "./services/hal.js";
10
+ import { initPositionLoggerService } from "./services/position-logger.js";
11
+ const appId = process.env.EDEN_APP_ID;
12
+ console.log(`[Covenant Bridge] Starting for ${appId}`);
13
+ // Initialize all services
14
+ initLinuxCNCService();
15
+ initGCodeService();
16
+ initHalService();
17
+ initPositionLoggerService();
18
+ console.log("[Covenant Bridge] All services initialized");
19
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AACtC,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;AAEvD,0BAA0B;AAC1B,mBAAmB,EAAE,CAAC;AACtB,gBAAgB,EAAE,CAAC;AACnB,cAAc,EAAE,CAAC;AACjB,yBAAyB,EAAE,CAAC;AAE5B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC"}
Binary file
@@ -0,0 +1,11 @@
1
+ /**
2
+ * G-Code Service
3
+ *
4
+ * Exposes G-code parsing via AppBus using LinuxCNC's rs274ngc interpreter.
5
+ * Implements GCodeProtocol from covenant-protocol.
6
+ */
7
+ /**
8
+ * Initialize the G-code service
9
+ */
10
+ export declare function initGCodeService(): void;
11
+ //# sourceMappingURL=gcode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcode.d.ts","sourceRoot":"","sources":["../../src/services/gcode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAqDvC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * G-Code Service
3
+ *
4
+ * Exposes G-code parsing via AppBus using LinuxCNC's rs274ngc interpreter.
5
+ * Implements GCodeProtocol from covenant-protocol.
6
+ */
7
+ import { parseGCode } from "@linuxcnc-node/gcode";
8
+ const SERVICE_NAME = "gcode";
9
+ /**
10
+ * Initialize the G-code service
11
+ */
12
+ export function initGCodeService() {
13
+ worker.appBus.exposeService(SERVICE_NAME, (connection, { appId: clientAppId }) => {
14
+ console.log(`[GCode] Client connected: ${clientAppId}`);
15
+ const typedConn = connection;
16
+ // Handle disconnect
17
+ connection.onClose(() => {
18
+ console.log(`[GCode] Client disconnected: ${clientAppId}`);
19
+ });
20
+ // Parse handler
21
+ typedConn.handle("parse", async ({ filepath, iniPath, progressUpdates }) => {
22
+ try {
23
+ const result = await parseGCode(filepath, {
24
+ iniPath,
25
+ progressUpdates: progressUpdates ?? 40,
26
+ onProgress: (progress) => {
27
+ // Stream progress updates to the client
28
+ try {
29
+ typedConn.send("parse-progress", progress);
30
+ }
31
+ catch (err) {
32
+ // Client may have disconnected
33
+ console.error("[GCode] Error sending progress:", err);
34
+ }
35
+ },
36
+ });
37
+ return result;
38
+ }
39
+ catch (err) {
40
+ // Send error message
41
+ typedConn.send("error", {
42
+ code: "PARSE_ERROR",
43
+ message: err instanceof Error ? err.message : String(err),
44
+ });
45
+ throw err;
46
+ }
47
+ });
48
+ // Ping handler
49
+ typedConn.handle("ping", () => {
50
+ return { timestamp: Date.now() };
51
+ });
52
+ }, { description: "G-code file parsing using LinuxCNC interpreter" });
53
+ console.log(`[GCode] Service exposed as '${SERVICE_NAME}'`);
54
+ }
55
+ //# sourceMappingURL=gcode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcode.js","sourceRoot":"","sources":["../../src/services/gcode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,MAAM,YAAY,GAAG,OAAO,CAAC;AAE7B;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAO,CAAC,MAAM,CAAC,aAAa,CAC1B,YAAY,EACZ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;QAExD,MAAM,SAAS,GAAG,UAA2C,CAAC;QAE9D,oBAAoB;QACpB,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,gCAAgC,WAAW,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,SAAS,CAAC,MAAM,CACd,OAAO,EACP,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE;YAC/C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE;oBACxC,OAAO;oBACP,eAAe,EAAE,eAAe,IAAI,EAAE;oBACtC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACvB,wCAAwC;wBACxC,IAAI,CAAC;4BACH,SAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;wBAC7C,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,+BAA+B;4BAC/B,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;wBACxD,CAAC;oBACH,CAAC;iBACF,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAqB;gBACrB,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE;oBACtB,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBAC1D,CAAC,CAAC;gBACH,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CACF,CAAC;QAEF,eAAe;QACf,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE;YAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAClE,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,+BAA+B,YAAY,GAAG,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * HAL Service
3
+ *
4
+ * Exposes HAL component management and I/O access via AppBus.
5
+ * Each connection gets its own HalComponent lifecycle.
6
+ * Implements HalProtocol from covenant-protocol.
7
+ */
8
+ /**
9
+ * Initialize the HAL service
10
+ */
11
+ export declare function initHalService(): void;
12
+ //# sourceMappingURL=hal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hal.d.ts","sourceRoot":"","sources":["../../src/services/hal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgCH;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAoXrC"}
@@ -0,0 +1,342 @@
1
+ /**
2
+ * HAL Service
3
+ *
4
+ * Exposes HAL component management and I/O access via AppBus.
5
+ * Each connection gets its own HalComponent lifecycle.
6
+ * Implements HalProtocol from covenant-protocol.
7
+ */
8
+ import { HalComponent, getMsgLevel, setMsgLevel, getValue, getInfoPins, getInfoSignals, getInfoParams, newSignal, pinHasWriter, setSignalValue, } from "@linuxcnc-node/hal";
9
+ import picomatch from "picomatch";
10
+ const SERVICE_NAME = "hal";
11
+ /**
12
+ * Initialize the HAL service
13
+ */
14
+ export function initHalService() {
15
+ worker.appBus.exposeService(SERVICE_NAME, (connection, { appId: clientAppId }) => {
16
+ console.log(`[HAL] Client connected: ${clientAppId}`);
17
+ const typedConn = connection;
18
+ // Per-connection state
19
+ const state = {
20
+ component: null,
21
+ pins: new Map(),
22
+ params: new Map(),
23
+ lastValues: new Map(),
24
+ cursor: 0,
25
+ pollInterval: null,
26
+ };
27
+ // Clean up on disconnect
28
+ connection.onClose(() => {
29
+ console.log(`[HAL] Client disconnected: ${clientAppId}`);
30
+ if (state.pollInterval) {
31
+ clearInterval(state.pollInterval);
32
+ }
33
+ if (state.component) {
34
+ state.component.dispose();
35
+ }
36
+ });
37
+ // Start polling for value changes
38
+ function startPolling() {
39
+ if (state.pollInterval)
40
+ return;
41
+ state.pollInterval = setInterval(() => {
42
+ if (!state.component)
43
+ return;
44
+ const changes = [];
45
+ // Check all pins and params for changes
46
+ for (const [name, pin] of state.pins) {
47
+ const value = pin.getValue();
48
+ const lastValue = state.lastValues.get(name);
49
+ if (value !== lastValue) {
50
+ changes.push({ name, value });
51
+ state.lastValues.set(name, value);
52
+ }
53
+ }
54
+ for (const [name, param] of state.params) {
55
+ const value = param.getValue();
56
+ const lastValue = state.lastValues.get(name);
57
+ if (value !== lastValue) {
58
+ changes.push({ name, value });
59
+ state.lastValues.set(name, value);
60
+ }
61
+ }
62
+ if (changes.length > 0) {
63
+ state.cursor++;
64
+ const delta = {
65
+ changes,
66
+ cursor: state.cursor,
67
+ timestamp: Date.now(),
68
+ };
69
+ try {
70
+ typedConn.send("items-delta", delta);
71
+ }
72
+ catch (err) {
73
+ console.error("[HAL] Error sending delta:", err);
74
+ }
75
+ }
76
+ }, 10); // 10ms polling interval
77
+ }
78
+ // === COMPONENT HANDLERS ===
79
+ typedConn.handle("component/init", ({ name, prefix }) => {
80
+ if (state.component) {
81
+ return {
82
+ success: false,
83
+ componentName: "",
84
+ error: "Component already initialized for this connection",
85
+ };
86
+ }
87
+ try {
88
+ state.component = new HalComponent(name, prefix);
89
+ return {
90
+ success: true,
91
+ componentName: state.component.name,
92
+ };
93
+ }
94
+ catch (err) {
95
+ return {
96
+ success: false,
97
+ componentName: "",
98
+ error: err instanceof Error ? err.message : String(err),
99
+ };
100
+ }
101
+ });
102
+ typedConn.handle("component/ready", () => {
103
+ if (!state.component) {
104
+ return { success: false, error: "Component not initialized" };
105
+ }
106
+ try {
107
+ state.component.ready();
108
+ startPolling();
109
+ typedConn.send("hal-ready", {
110
+ componentName: state.component.name,
111
+ prefix: state.component.prefix,
112
+ });
113
+ return { success: true };
114
+ }
115
+ catch (err) {
116
+ return {
117
+ success: false,
118
+ error: err instanceof Error ? err.message : String(err),
119
+ };
120
+ }
121
+ });
122
+ typedConn.handle("component/unready", () => {
123
+ if (!state.component) {
124
+ return { success: false, error: "Component not initialized" };
125
+ }
126
+ try {
127
+ state.component.unready();
128
+ return { success: true };
129
+ }
130
+ catch (err) {
131
+ return {
132
+ success: false,
133
+ error: err instanceof Error ? err.message : String(err),
134
+ };
135
+ }
136
+ });
137
+ // === PIN/PARAM HANDLERS ===
138
+ typedConn.handle("pin/create", ({ name, type, direction }) => {
139
+ if (!state.component) {
140
+ return {
141
+ success: false,
142
+ fullName: "",
143
+ error: "Component not initialized",
144
+ };
145
+ }
146
+ try {
147
+ const pin = state.component.newPin(name, type, direction);
148
+ state.pins.set(name, pin);
149
+ state.lastValues.set(name, pin.getValue());
150
+ return {
151
+ success: true,
152
+ fullName: `${state.component.prefix}.${pin.name}`,
153
+ };
154
+ }
155
+ catch (err) {
156
+ return {
157
+ success: false,
158
+ fullName: "",
159
+ error: err instanceof Error ? err.message : String(err),
160
+ };
161
+ }
162
+ });
163
+ typedConn.handle("param/create", ({ name, type, direction }) => {
164
+ if (!state.component) {
165
+ return {
166
+ success: false,
167
+ fullName: "",
168
+ error: "Component not initialized",
169
+ };
170
+ }
171
+ try {
172
+ const param = state.component.newParam(name, type, direction);
173
+ state.params.set(name, param);
174
+ state.lastValues.set(name, param.getValue());
175
+ return {
176
+ success: true,
177
+ fullName: `${state.component.prefix}.${param.name}`,
178
+ };
179
+ }
180
+ catch (err) {
181
+ return {
182
+ success: false,
183
+ fullName: "",
184
+ error: err instanceof Error ? err.message : String(err),
185
+ };
186
+ }
187
+ });
188
+ typedConn.handle("item/get-value", ({ name }) => {
189
+ if (!state.component) {
190
+ throw new Error("Component not initialized");
191
+ }
192
+ const value = state.component.getValue(name);
193
+ return { value };
194
+ });
195
+ typedConn.handle("item/set-value", ({ name, value }) => {
196
+ if (!state.component) {
197
+ return { success: false, error: "Component not initialized" };
198
+ }
199
+ try {
200
+ state.component.setValue(name, value);
201
+ state.lastValues.set(name, value);
202
+ return { success: true };
203
+ }
204
+ catch (err) {
205
+ return {
206
+ success: false,
207
+ error: err instanceof Error ? err.message : String(err),
208
+ };
209
+ }
210
+ });
211
+ typedConn.handle("items/sync", () => {
212
+ if (!state.component) {
213
+ throw new Error("Component not initialized");
214
+ }
215
+ // Build current items snapshot
216
+ const items = {};
217
+ for (const [name, pin] of state.pins) {
218
+ items[name] = pin.getValue();
219
+ }
220
+ for (const [name, param] of state.params) {
221
+ items[name] = param.getValue();
222
+ }
223
+ return {
224
+ items,
225
+ cursor: state.cursor,
226
+ };
227
+ });
228
+ // === GLOBAL HANDLERS ===
229
+ typedConn.handle("global/component-exists", ({ componentName }) => {
230
+ return { exists: HalComponent.exists(componentName) };
231
+ });
232
+ typedConn.handle("global/component-is-ready", ({ componentName }) => {
233
+ return { ready: HalComponent.isReady(componentName) };
234
+ });
235
+ typedConn.handle("global/signal-create", ({ name, type }) => {
236
+ try {
237
+ newSignal(name, type);
238
+ return { success: true };
239
+ }
240
+ catch (err) {
241
+ return {
242
+ success: false,
243
+ error: err instanceof Error ? err.message : String(err),
244
+ };
245
+ }
246
+ });
247
+ typedConn.handle("global/signal-get-value", ({ signalName }) => {
248
+ const value = getValue(signalName);
249
+ return { value };
250
+ });
251
+ typedConn.handle("global/signal-set-value", ({ signalName, value }) => {
252
+ try {
253
+ setSignalValue(signalName, value);
254
+ return { success: true };
255
+ }
256
+ catch (err) {
257
+ return {
258
+ success: false,
259
+ error: err instanceof Error ? err.message : String(err),
260
+ };
261
+ }
262
+ });
263
+ typedConn.handle("global/signal-connect", ({ pinName, signalName }) => {
264
+ // This would need net/connect functionality from hal
265
+ // For now, return not implemented
266
+ return { success: false, error: "Not implemented - use halcmd net" };
267
+ });
268
+ typedConn.handle("global/signal-disconnect", ({ pinName }) => {
269
+ // This would need disconnect functionality from hal
270
+ return {
271
+ success: false,
272
+ error: "Not implemented - use halcmd unlinkp",
273
+ };
274
+ });
275
+ typedConn.handle("global/pin-has-writer", ({ pinName }) => {
276
+ return { hasWriter: pinHasWriter(pinName) };
277
+ });
278
+ typedConn.handle("global/get-value", ({ name }) => {
279
+ const value = getValue(name);
280
+ // Determine type based on whether it's a pin, param, or signal
281
+ // For simplicity, return "pin" - could be enhanced with proper detection
282
+ return { value, type: "pin" };
283
+ });
284
+ typedConn.handle("global/list-pins", ({ filter }) => {
285
+ let pins = getInfoPins();
286
+ if (filter) {
287
+ const isMatch = picomatch(filter);
288
+ pins = pins.filter((p) => isMatch(p.name));
289
+ }
290
+ return { pins };
291
+ });
292
+ typedConn.handle("global/list-params", ({ filter }) => {
293
+ let params = getInfoParams();
294
+ if (filter) {
295
+ const isMatch = picomatch(filter);
296
+ params = params.filter((p) => isMatch(p.name));
297
+ }
298
+ return { params };
299
+ });
300
+ typedConn.handle("global/list-signals", ({ filter }) => {
301
+ let signals = getInfoSignals();
302
+ if (filter) {
303
+ const isMatch = picomatch(filter);
304
+ signals = signals.filter((s) => isMatch(s.name));
305
+ }
306
+ return { signals };
307
+ });
308
+ typedConn.handle("global/list-all", () => {
309
+ return {
310
+ pins: getInfoPins(),
311
+ params: getInfoParams(),
312
+ signals: getInfoSignals(),
313
+ };
314
+ });
315
+ typedConn.handle("global/msg-level-get", () => {
316
+ return { level: getMsgLevel() };
317
+ });
318
+ typedConn.handle("global/msg-level-set", ({ level }) => {
319
+ const previousLevel = getMsgLevel();
320
+ setMsgLevel(level);
321
+ return { success: true, previousLevel };
322
+ });
323
+ // === CONNECTION HANDLERS ===
324
+ typedConn.handle("ping", () => {
325
+ return { timestamp: Date.now() };
326
+ });
327
+ typedConn.handle("get-status", () => {
328
+ return {
329
+ connected: true,
330
+ componentName: state.component?.name ?? "",
331
+ componentReady: state.component
332
+ ? HalComponent.isReady(state.component.name)
333
+ : false,
334
+ pinCount: state.pins.size,
335
+ paramCount: state.params.size,
336
+ uptime: process.uptime(),
337
+ };
338
+ });
339
+ }, { description: "HAL component management and I/O access" });
340
+ console.log(`[HAL] Service exposed as '${SERVICE_NAME}'`);
341
+ }
342
+ //# sourceMappingURL=hal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hal.js","sourceRoot":"","sources":["../../src/services/hal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,YAAY,EAGZ,WAAW,EACX,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,YAAY,EACZ,cAAc,GACf,MAAM,oBAAoB,CAAC;AAI5B,OAAO,SAAS,MAAM,WAAW,CAAC;AAElC,MAAM,YAAY,GAAG,KAAK,CAAC;AAW3B;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAO,CAAC,MAAM,CAAC,aAAa,CAC1B,YAAY,EACZ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,EAAE,CAAC,CAAC;QAEtD,MAAM,SAAS,GAAG,UAAyC,CAAC;QAE5D,uBAAuB;QACvB,MAAM,KAAK,GAAoB;YAC7B,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,IAAI,GAAG,EAAE;YACf,MAAM,EAAE,IAAI,GAAG,EAAE;YACjB,UAAU,EAAE,IAAI,GAAG,EAAE;YACrB,MAAM,EAAE,CAAC;YACT,YAAY,EAAE,IAAI;SACnB,CAAC;QAEF,yBAAyB;QACzB,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;YACzD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACvB,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;YACD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,kCAAkC;QAClC,SAAS,YAAY;YACnB,IAAI,KAAK,CAAC,YAAY;gBAAE,OAAO;YAE/B,KAAK,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;gBACpC,IAAI,CAAC,KAAK,CAAC,SAAS;oBAAE,OAAO;gBAE7B,MAAM,OAAO,GAA6C,EAAE,CAAC;gBAE7D,wCAAwC;gBACxC,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACrC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC9B,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACzC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACxB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBAC9B,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,KAAK,CAAC,MAAM,EAAE,CAAC;oBACf,MAAM,KAAK,GAAa;wBACtB,OAAO;wBACP,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC;oBACF,IAAI,CAAC;wBACH,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;oBACvC,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;YACH,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAClC,CAAC;QAED,6BAA6B;QAE7B,SAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;YACtD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,aAAa,EAAE,EAAE;oBACjB,KAAK,EAAE,mDAAmD;iBAC3D,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,KAAK,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACjD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI;iBACpC,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,aAAa,EAAE,EAAE;oBACjB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACvC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;YAChE,CAAC;YAED,IAAI,CAAC;gBACH,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBACxB,YAAY,EAAE,CAAC;gBAEf,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE;oBAC1B,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI;oBACnC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM;iBAC/B,CAAC,CAAC;gBAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACzC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;YAChE,CAAC;YAED,IAAI,CAAC;gBACH,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAE7B,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;YAC3D,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE,2BAA2B;iBACnC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1B,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE3C,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,GAAG,KAAK,CAAC,SAAU,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE;iBACnD,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;YAC7D,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE,2BAA2B;iBACnC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC9D,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC9B,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE7C,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,GAAG,KAAK,CAAC,SAAU,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE;iBACrD,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAC9C,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACrD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;YAChE,CAAC;YAED,IAAI,CAAC;gBACH,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACtC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE;YAClC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,+BAA+B;YAC/B,MAAM,KAAK,GAA6B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC/B,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjC,CAAC;YAED,OAAO;gBACL,KAAK;gBACL,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAE1B,SAAS,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;YAChE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,2BAA2B,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;YAClE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YAC1D,IAAI,CAAC;gBACH,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACtB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnC,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,yBAAyB,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;YACpE,IAAI,CAAC;gBACH,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;gBAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;YACpE,qDAAqD;YACrD,kCAAkC;YAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAC3D,oDAAoD;YACpD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sCAAsC;aAC9C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACxD,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7B,+DAA+D;YAC/D,yEAAyE;YACzE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAc,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YAClD,IAAI,IAAI,GAAG,WAAW,EAAE,CAAC;YACzB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACpD,IAAI,MAAM,GAAG,aAAa,EAAE,CAAC;YAC7B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;YACrD,IAAI,OAAO,GAAG,cAAc,EAAE,CAAC;YAC/B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACvC,OAAO;gBACL,IAAI,EAAE,WAAW,EAAE;gBACnB,MAAM,EAAE,aAAa,EAAE;gBACvB,OAAO,EAAE,cAAc,EAAE;aAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC5C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YACrD,MAAM,aAAa,GAAG,WAAW,EAAE,CAAC;YACpC,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAE9B,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE;YAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE;YAClC,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE;gBAC1C,cAAc,EAAE,KAAK,CAAC,SAAS;oBAC7B,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC5C,CAAC,CAAC,KAAK;gBACT,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;gBACzB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;gBAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;aACzB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAC3D,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,6BAA6B,YAAY,GAAG,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * LinuxCNC Service
3
+ *
4
+ * Exposes LinuxCNC status monitoring and command execution via AppBus.
5
+ * Implements LinuxCNCProtocol from covenant-protocol.
6
+ */
7
+ /**
8
+ * Initialize the LinuxCNC service
9
+ */
10
+ export declare function initLinuxCNCService(): void;
11
+ //# sourceMappingURL=linuxcnc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linuxcnc.d.ts","sourceRoot":"","sources":["../../src/services/linuxcnc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsCH;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAiS1C"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * LinuxCNC Service
3
+ *
4
+ * Exposes LinuxCNC status monitoring and command execution via AppBus.
5
+ * Implements LinuxCNCProtocol from covenant-protocol.
6
+ */
7
+ import { StatChannel, CommandChannel, ErrorChannel } from "@linuxcnc-node/core";
8
+ import delve from "dlv";
9
+ const SERVICE_NAME = "linuxcnc";
10
+ // Shared state across all connections
11
+ let statChannel = null;
12
+ let commandChannel = null;
13
+ let errorChannel = null;
14
+ // Connected clients
15
+ const connections = new Map();
16
+ /**
17
+ * Broadcast stat delta to all connected clients
18
+ */
19
+ function broadcastDelta(changes) {
20
+ if (changes.length === 0 || !statChannel)
21
+ return;
22
+ const message = {
23
+ changes,
24
+ cursor: statChannel.getCursor(),
25
+ timestamp: Date.now(),
26
+ };
27
+ for (const conn of connections.values()) {
28
+ try {
29
+ conn.send("stat-delta", message);
30
+ }
31
+ catch (err) {
32
+ console.error("[LinuxCNC] Error sending delta:", err);
33
+ }
34
+ }
35
+ }
36
+ /**
37
+ * Initialize the LinuxCNC service
38
+ */
39
+ export function initLinuxCNCService() {
40
+ // Create channels (shared across all connections)
41
+ statChannel = new StatChannel({ pollInterval: 50 });
42
+ commandChannel = new CommandChannel();
43
+ errorChannel = new ErrorChannel({ pollInterval: 100 });
44
+ // Listen to native delta updates from StatChannel
45
+ statChannel.on("delta", broadcastDelta);
46
+ // Forward error channel events
47
+ errorChannel.on("message", (error) => {
48
+ for (const conn of connections.values()) {
49
+ try {
50
+ conn.send("error-channel-event", error);
51
+ }
52
+ catch (err) {
53
+ console.error("[LinuxCNC] Error forwarding error event:", err);
54
+ }
55
+ }
56
+ });
57
+ // Expose the service
58
+ worker.appBus.exposeService(SERVICE_NAME, (connection, { appId: clientAppId }) => {
59
+ console.log(`[LinuxCNC] Client connected: ${clientAppId}`);
60
+ const typedConn = connection;
61
+ connections.set(clientAppId, typedConn);
62
+ // Handle disconnect
63
+ connection.onClose(() => {
64
+ console.log(`[LinuxCNC] Client disconnected: ${clientAppId}`);
65
+ connections.delete(clientAppId);
66
+ });
67
+ // === STAT HANDLERS ===
68
+ typedConn.handle("stat/sync", () => {
69
+ const stat = statChannel.get();
70
+ if (!stat) {
71
+ throw new Error("StatChannel not ready");
72
+ }
73
+ return {
74
+ stat,
75
+ cursor: statChannel.getCursor(),
76
+ };
77
+ });
78
+ typedConn.handle("stat/get-value", ({ path }) => {
79
+ const stat = statChannel.get();
80
+ if (!stat) {
81
+ throw new Error("StatChannel not ready");
82
+ }
83
+ return { value: delve(stat, path) };
84
+ });
85
+ // === COMMAND HANDLERS ===
86
+ typedConn.handle("cmd/set-task-mode", async ({ mode }) => {
87
+ return commandChannel.setTaskMode(mode);
88
+ });
89
+ typedConn.handle("cmd/set-state", async ({ state }) => {
90
+ return commandChannel.setState(state);
91
+ });
92
+ typedConn.handle("cmd/mdi", async ({ command }) => {
93
+ return commandChannel.mdi(command);
94
+ });
95
+ typedConn.handle("cmd/abort", async () => {
96
+ return commandChannel.abortTask();
97
+ });
98
+ typedConn.handle("cmd/task-plan-synch", async () => {
99
+ return commandChannel.taskPlanSynch();
100
+ });
101
+ typedConn.handle("cmd/reset-interpreter", async () => {
102
+ return commandChannel.resetInterpreter();
103
+ });
104
+ // Program control
105
+ typedConn.handle("cmd/program-open", async ({ filePath }) => {
106
+ return commandChannel.programOpen(filePath);
107
+ });
108
+ typedConn.handle("cmd/program-run", async ({ startLine }) => {
109
+ return commandChannel.runProgram(startLine ?? 0);
110
+ });
111
+ typedConn.handle("cmd/program-pause", async () => {
112
+ return commandChannel.pauseProgram();
113
+ });
114
+ typedConn.handle("cmd/program-resume", async () => {
115
+ return commandChannel.resumeProgram();
116
+ });
117
+ typedConn.handle("cmd/program-step", async () => {
118
+ return commandChannel.stepProgram();
119
+ });
120
+ typedConn.handle("cmd/program-reverse", async () => {
121
+ return commandChannel.reverseProgram();
122
+ });
123
+ typedConn.handle("cmd/program-forward", async () => {
124
+ return commandChannel.forwardProgram();
125
+ });
126
+ // Motion control
127
+ typedConn.handle("cmd/set-feed-rate", async ({ scale }) => {
128
+ return commandChannel.setFeedRate(scale);
129
+ });
130
+ typedConn.handle("cmd/set-rapid-rate", async ({ scale }) => {
131
+ return commandChannel.setRapidRate(scale);
132
+ });
133
+ typedConn.handle("cmd/set-max-velocity", async ({ velocity }) => {
134
+ return commandChannel.setMaxVelocity(velocity);
135
+ });
136
+ typedConn.handle("cmd/set-traj-mode", async ({ mode }) => {
137
+ return commandChannel.setTrajMode(mode);
138
+ });
139
+ typedConn.handle("cmd/teleop-enable", async ({ enable }) => {
140
+ return commandChannel.teleopEnable(enable);
141
+ });
142
+ typedConn.handle("cmd/set-feed-override-enable", async ({ enable }) => {
143
+ return commandChannel.setFeedOverrideEnable(enable);
144
+ });
145
+ typedConn.handle("cmd/set-feed-hold-enable", async ({ enable }) => {
146
+ return commandChannel.setFeedHoldEnable(enable);
147
+ });
148
+ typedConn.handle("cmd/set-adaptive-feed-enable", async ({ enable }) => {
149
+ return commandChannel.setAdaptiveFeedEnable(enable);
150
+ });
151
+ // Jogging - note: CommandChannel uses (axis, isJoint, speed) order
152
+ typedConn.handle("cmd/jog-continuous", async ({ axis, speed, isJoint }) => {
153
+ return commandChannel.jogContinuous(axis, isJoint ?? false, speed);
154
+ });
155
+ typedConn.handle("cmd/jog-increment", async ({ axis, speed, increment, isJoint }) => {
156
+ return commandChannel.jogIncrement(axis, isJoint ?? false, speed, increment);
157
+ });
158
+ typedConn.handle("cmd/jog-stop", async ({ axis, isJoint }) => {
159
+ return commandChannel.jogStop(axis, isJoint ?? false);
160
+ });
161
+ // Homing
162
+ typedConn.handle("cmd/home", async ({ joint }) => {
163
+ return commandChannel.homeJoint(joint);
164
+ });
165
+ typedConn.handle("cmd/unhome", async ({ joint }) => {
166
+ return commandChannel.unhomeJoint(joint);
167
+ });
168
+ typedConn.handle("cmd/set-min-position-limit", async ({ joint, limit }) => {
169
+ return commandChannel.setMinPositionLimit(joint, limit);
170
+ });
171
+ typedConn.handle("cmd/set-max-position-limit", async ({ joint, limit }) => {
172
+ return commandChannel.setMaxPositionLimit(joint, limit);
173
+ });
174
+ // Spindle
175
+ typedConn.handle("cmd/spindle-on", async ({ speed, spindle, wait }) => {
176
+ return commandChannel.spindleOn(speed, spindle ?? 0, wait ?? false);
177
+ });
178
+ typedConn.handle("cmd/spindle-off", async ({ spindle }) => {
179
+ return commandChannel.spindleOff(spindle ?? 0);
180
+ });
181
+ typedConn.handle("cmd/spindle-override", async ({ scale, spindle }) => {
182
+ return commandChannel.setSpindleOverride(scale, spindle ?? 0);
183
+ });
184
+ typedConn.handle("cmd/spindle-brake", async ({ engage, spindle }) => {
185
+ return commandChannel.spindleBrake(engage, spindle ?? 0);
186
+ });
187
+ typedConn.handle("cmd/spindle-increase", async ({ spindle }) => {
188
+ return commandChannel.spindleIncrease(spindle ?? 0);
189
+ });
190
+ typedConn.handle("cmd/spindle-decrease", async ({ spindle }) => {
191
+ return commandChannel.spindleDecrease(spindle ?? 0);
192
+ });
193
+ typedConn.handle("cmd/set-spindle-override-enable", async ({ enable, spindle }) => {
194
+ return commandChannel.setSpindleOverrideEnable(enable, spindle ?? 0);
195
+ });
196
+ // Coolant
197
+ typedConn.handle("cmd/set-mist", async ({ on }) => {
198
+ return commandChannel.setMist(on);
199
+ });
200
+ typedConn.handle("cmd/set-flood", async ({ on }) => {
201
+ return commandChannel.setFlood(on);
202
+ });
203
+ // Tool
204
+ typedConn.handle("cmd/load-tool-table", async () => {
205
+ return commandChannel.loadToolTable();
206
+ });
207
+ typedConn.handle("cmd/set-tool", async ({ tool }) => {
208
+ return commandChannel.setTool(tool);
209
+ });
210
+ // I/O
211
+ typedConn.handle("cmd/set-digital-output", async ({ index, value }) => {
212
+ return commandChannel.setDigitalOutput(index, value);
213
+ });
214
+ typedConn.handle("cmd/set-analog-output", async ({ index, value }) => {
215
+ return commandChannel.setAnalogOutput(index, value);
216
+ });
217
+ // Misc
218
+ typedConn.handle("cmd/override-limits", async () => {
219
+ return commandChannel.overrideLimits();
220
+ });
221
+ typedConn.handle("cmd/set-optional-stop", async ({ enable }) => {
222
+ return commandChannel.setOptionalStop(enable);
223
+ });
224
+ typedConn.handle("cmd/set-block-delete", async ({ enable }) => {
225
+ return commandChannel.setBlockDelete(enable);
226
+ });
227
+ typedConn.handle("cmd/set-debug-level", async ({ level }) => {
228
+ return commandChannel.setDebugLevel(level);
229
+ });
230
+ typedConn.handle("cmd/send-operator-error", async ({ message }) => {
231
+ return commandChannel.sendOperatorError(message);
232
+ });
233
+ typedConn.handle("cmd/send-operator-text", async ({ message }) => {
234
+ return commandChannel.sendOperatorText(message);
235
+ });
236
+ typedConn.handle("cmd/send-operator-display", async ({ message }) => {
237
+ return commandChannel.sendOperatorDisplay(message);
238
+ });
239
+ // Connection
240
+ typedConn.handle("ping", () => {
241
+ return { timestamp: Date.now() };
242
+ });
243
+ }, { description: "LinuxCNC status monitoring and command execution" });
244
+ console.log(`[LinuxCNC] Service exposed as '${SERVICE_NAME}'`);
245
+ }
246
+ //# sourceMappingURL=linuxcnc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linuxcnc.js","sourceRoot":"","sources":["../../src/services/linuxcnc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Position Logger Service
3
+ *
4
+ * Exposes machine position logging and history streaming via AppBus.
5
+ * Implements PositionLoggerProtocol from covenant-protocol.
6
+ */
7
+ /**
8
+ * Initialize the Position Logger service
9
+ */
10
+ export declare function initPositionLoggerService(): void;
11
+ //# sourceMappingURL=position-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position-logger.d.ts","sourceRoot":"","sources":["../../src/services/position-logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqEH;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CA4GhD"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Position Logger Service
3
+ *
4
+ * Exposes machine position logging and history streaming via AppBus.
5
+ * Implements PositionLoggerProtocol from covenant-protocol.
6
+ */
7
+ import { PositionLogger } from "@linuxcnc-node/core";
8
+ import { POSITION_STRIDE } from "@linuxcnc-node/types";
9
+ const SERVICE_NAME = "position-logger";
10
+ const UPDATE_INTERVAL_MS = 50;
11
+ // Shared position logger instance
12
+ let logger = null;
13
+ // Cursor tracking
14
+ let cursor = 0;
15
+ let lastHistoryCount = 0;
16
+ // Connected clients
17
+ const connections = new Map();
18
+ // Update interval for pushing position updates
19
+ let updateInterval = null;
20
+ /**
21
+ * Start the update loop for pushing position deltas to clients
22
+ */
23
+ function startUpdateLoop() {
24
+ if (updateInterval)
25
+ return;
26
+ updateInterval = setInterval(() => {
27
+ if (!logger || connections.size === 0)
28
+ return;
29
+ const currentCount = logger.getHistoryCount();
30
+ if (currentCount <= lastHistoryCount)
31
+ return;
32
+ // Get new points since last update
33
+ const newPointCount = currentCount - lastHistoryCount;
34
+ const newPoints = logger.getMotionHistory(lastHistoryCount, newPointCount);
35
+ cursor++;
36
+ lastHistoryCount = currentCount;
37
+ // Push to all connected clients - cast to any to handle type conflicts
38
+ const message = {
39
+ points: newPoints,
40
+ count: newPointCount,
41
+ cursor,
42
+ };
43
+ for (const conn of connections.values()) {
44
+ try {
45
+ conn.send("position-update", message);
46
+ }
47
+ catch (err) {
48
+ console.error("[PositionLogger] Error sending update:", err);
49
+ }
50
+ }
51
+ }, UPDATE_INTERVAL_MS);
52
+ }
53
+ /**
54
+ * Stop the update loop
55
+ */
56
+ function stopUpdateLoop() {
57
+ if (updateInterval) {
58
+ clearInterval(updateInterval);
59
+ updateInterval = null;
60
+ }
61
+ }
62
+ /**
63
+ * Initialize the Position Logger service
64
+ */
65
+ export function initPositionLoggerService() {
66
+ // Create shared logger instance
67
+ logger = new PositionLogger();
68
+ worker.appBus.exposeService(SERVICE_NAME, (connection, { appId: clientAppId }) => {
69
+ console.log(`[PositionLogger] Client connected: ${clientAppId}`);
70
+ const typedConn = connection;
71
+ connections.set(clientAppId, typedConn);
72
+ // Handle disconnect
73
+ connection.onClose(() => {
74
+ console.log(`[PositionLogger] Client disconnected: ${clientAppId}`);
75
+ connections.delete(clientAppId);
76
+ // Stop update loop if no clients
77
+ if (connections.size === 0) {
78
+ stopUpdateLoop();
79
+ }
80
+ });
81
+ // Start handler
82
+ typedConn.handle("start", ({ interval, maxHistory }) => {
83
+ if (!logger) {
84
+ return { success: false, cursor: 0 };
85
+ }
86
+ logger.start({
87
+ interval: interval ?? 0.01,
88
+ maxHistorySize: maxHistory ?? 10000,
89
+ });
90
+ lastHistoryCount = 0;
91
+ cursor++;
92
+ // Start update loop if not running
93
+ startUpdateLoop();
94
+ return { success: true, cursor };
95
+ });
96
+ // Stop handler
97
+ typedConn.handle("stop", () => {
98
+ if (!logger) {
99
+ return { success: false };
100
+ }
101
+ logger.stop();
102
+ return { success: true };
103
+ });
104
+ // Clear handler
105
+ typedConn.handle("clear", () => {
106
+ if (!logger) {
107
+ return { success: false };
108
+ }
109
+ logger.clear();
110
+ lastHistoryCount = 0;
111
+ cursor++;
112
+ return { success: true };
113
+ });
114
+ typedConn.handle("sync", () => {
115
+ if (!logger) {
116
+ return {
117
+ history: new Float64Array(0),
118
+ count: 0,
119
+ cursor: 0,
120
+ };
121
+ }
122
+ const currentCount = logger.getHistoryCount();
123
+ const history = logger.getMotionHistory(0, currentCount);
124
+ return {
125
+ history,
126
+ count: history.length / POSITION_STRIDE,
127
+ cursor,
128
+ };
129
+ });
130
+ typedConn.handle("get-current", () => {
131
+ if (!logger) {
132
+ return { position: null };
133
+ }
134
+ const position = logger.getCurrentPosition();
135
+ return { position };
136
+ });
137
+ // Get cursor
138
+ typedConn.handle("get-cursor", () => {
139
+ return { cursor };
140
+ });
141
+ // Ping
142
+ typedConn.handle("ping", () => {
143
+ return { timestamp: Date.now() };
144
+ });
145
+ }, { description: "Machine position logging and history streaming" });
146
+ console.log(`[PositionLogger] Service exposed as '${SERVICE_NAME}'`);
147
+ }
148
+ //# sourceMappingURL=position-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position-logger.js","sourceRoot":"","sources":["../../src/services/position-logger.ts"],"names":[],"mappings":"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"}
package/manifest.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "com.covenant.bridge",
3
+ "name": "Covenant Bridge",
4
+ "version": "0.1.1",
5
+ "description": "LinuxCNC to Eden bridge - exposes LinuxCNC functionality via AppBus services",
6
+ "author": "Dariusz Majnert",
7
+ "backend": {
8
+ "entry": "dist/backend.js"
9
+ },
10
+ "services": [
11
+ {
12
+ "name": "linuxcnc",
13
+ "description": "LinuxCNC status monitoring and command execution"
14
+ },
15
+ {
16
+ "name": "gcode",
17
+ "description": "G-code file parsing using LinuxCNC interpreter"
18
+ },
19
+ {
20
+ "name": "hal",
21
+ "description": "HAL component management and I/O access"
22
+ },
23
+ {
24
+ "name": "position-logger",
25
+ "description": "Machine position logging and history streaming"
26
+ }
27
+ ]
28
+ }
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "covenant-bridge",
3
+ "version": "0.1.1",
4
+ "description": "LinuxCNC to Eden bridge worker",
5
+ "main": "dist/backend.js",
6
+ "type": "module",
7
+ "files": [
8
+ "dist",
9
+ "manifest.json"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc && genesis build . -o dist/bridge.edenite",
13
+ "clean": "rm -rf dist",
14
+ "rebuild": "npm run clean && npm run build",
15
+ "prepublishOnly": "npm run rebuild"
16
+ },
17
+ "keywords": [
18
+ "linuxcnc",
19
+ "eden",
20
+ "cnc",
21
+ "bridge"
22
+ ],
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "covenant-protocol": "^0.1.0",
26
+ "@edenapp/types": "^0.2.1",
27
+ "@linuxcnc-node/core": "^2.1.3",
28
+ "@linuxcnc-node/gcode": "^2.1.2",
29
+ "@linuxcnc-node/hal": "^2.1.2",
30
+ "@linuxcnc-node/types": "^2.1.1",
31
+ "dlv": "^1.1.3",
32
+ "picomatch": "^4.0.3"
33
+ },
34
+ "devDependencies": {
35
+ "@edenapp/genesis": "^0.2.2",
36
+ "@types/dlv": "^1.1.5",
37
+ "@types/node": "^20.0.0",
38
+ "@types/picomatch": "^4.0.2",
39
+ "typescript": "^5.0.0"
40
+ }
41
+ }