miravo 0.3.0 → 0.5.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.
- package/README.md +14 -236
- package/console-dist/assets/index-C1oOHU1J.js +119 -0
- package/console-dist/assets/index-C3XMYq26.css +2 -0
- package/console-dist/favicon.svg +31 -14
- package/console-dist/index.html +2 -2
- package/console-dist/miravo-logo.png +0 -0
- package/package.json +8 -7
- package/src/__tests__/integration/executable-methods-runner.ts +1 -0
- package/src/__tests__/integration/executable-methods.integration.ts +45 -39
- package/src/commands/inject.test.ts +0 -24
- package/src/commands/models.test.ts +1 -1
- package/src/commands/models.ts +6 -0
- package/src/commands/start.test.ts +122 -0
- package/src/commands/start.ts +310 -12
- package/src/commands/status.test.ts +0 -26
- package/src/commands/templates.test.ts +0 -13
- package/src/lib/shutdown.ts +13 -3
- package/src/logger.ts +21 -4
- package/console-dist/assets/index-BXtW73cF.css +0 -2
- package/console-dist/assets/index-ChSocZFW.js +0 -119
|
@@ -221,6 +221,7 @@ describe("resolveProtocolBootPlans", () => {
|
|
|
221
221
|
).toEqual([
|
|
222
222
|
{ name: "mqtt", shouldEnable: true, overrideRestore: false },
|
|
223
223
|
{ name: "opcua", shouldEnable: false, overrideRestore: false },
|
|
224
|
+
{ name: "modbus", shouldEnable: false, overrideRestore: false },
|
|
224
225
|
]);
|
|
225
226
|
});
|
|
226
227
|
|
|
@@ -236,6 +237,7 @@ describe("resolveProtocolBootPlans", () => {
|
|
|
236
237
|
).toEqual([
|
|
237
238
|
{ name: "mqtt", shouldEnable: true, overrideRestore: true },
|
|
238
239
|
{ name: "opcua", shouldEnable: false, overrideRestore: true },
|
|
240
|
+
{ name: "modbus", shouldEnable: false, overrideRestore: true },
|
|
239
241
|
]);
|
|
240
242
|
});
|
|
241
243
|
|
|
@@ -300,6 +302,126 @@ describe("resolveProtocolBootPlans", () => {
|
|
|
300
302
|
});
|
|
301
303
|
});
|
|
302
304
|
|
|
305
|
+
describe("resolveDetachAdapterConfigs", () => {
|
|
306
|
+
test("uses template adapter configs when no CLI/env overrides are provided", async () => {
|
|
307
|
+
const { resolveDetachAdapterConfigs } = await import("./start.ts");
|
|
308
|
+
|
|
309
|
+
const template = createTemplateWithNamespace({ prefix: "factory" });
|
|
310
|
+
const withProtocols: MiravoTemplate = {
|
|
311
|
+
...template,
|
|
312
|
+
protocols: {
|
|
313
|
+
mqtt: { port: 1889, embedded: true, retain: false, metadata: "base" },
|
|
314
|
+
opcua: { port: 4851, host: "127.0.0.1", security: "none" },
|
|
315
|
+
modbus: { port: 1602, host: "127.0.0.1" },
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
expect(
|
|
320
|
+
resolveDetachAdapterConfigs({
|
|
321
|
+
template: withProtocols,
|
|
322
|
+
simulationName: "factory-sim",
|
|
323
|
+
mqtt: { enabled: true, portOverride: undefined, overrides: {} },
|
|
324
|
+
opcua: {
|
|
325
|
+
enabled: true,
|
|
326
|
+
portOverride: undefined,
|
|
327
|
+
hostOverride: undefined,
|
|
328
|
+
writeBudgetOverride: undefined,
|
|
329
|
+
},
|
|
330
|
+
modbus: { enabled: true, portOverride: undefined, hostOverride: undefined },
|
|
331
|
+
}),
|
|
332
|
+
).toEqual({
|
|
333
|
+
mqtt: { port: 1889, host: "127.0.0.1", embedded: true },
|
|
334
|
+
opcua: { port: 4851, host: "127.0.0.1" },
|
|
335
|
+
modbus: { port: 1602, host: "127.0.0.1" },
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
test("CLI/env overrides take precedence over template values", async () => {
|
|
340
|
+
const { resolveDetachAdapterConfigs } = await import("./start.ts");
|
|
341
|
+
|
|
342
|
+
const template = createTemplateWithNamespace({ prefix: "factory" });
|
|
343
|
+
const withProtocols: MiravoTemplate = {
|
|
344
|
+
...template,
|
|
345
|
+
protocols: {
|
|
346
|
+
mqtt: { port: 1889, embedded: true, retain: false, metadata: "base" },
|
|
347
|
+
opcua: { port: 4851, host: "127.0.0.1", security: "none" },
|
|
348
|
+
modbus: { port: 1602, host: "127.0.0.1" },
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
expect(
|
|
353
|
+
resolveDetachAdapterConfigs({
|
|
354
|
+
template: withProtocols,
|
|
355
|
+
simulationName: "factory-sim",
|
|
356
|
+
mqtt: {
|
|
357
|
+
enabled: true,
|
|
358
|
+
portOverride: 1999,
|
|
359
|
+
overrides: { host: "0.0.0.0" },
|
|
360
|
+
},
|
|
361
|
+
opcua: {
|
|
362
|
+
enabled: true,
|
|
363
|
+
portOverride: 4852,
|
|
364
|
+
hostOverride: "0.0.0.0",
|
|
365
|
+
writeBudgetOverride: undefined,
|
|
366
|
+
},
|
|
367
|
+
modbus: { enabled: true, portOverride: 1702, hostOverride: "0.0.0.0" },
|
|
368
|
+
}),
|
|
369
|
+
).toEqual({
|
|
370
|
+
mqtt: { port: 1999, host: "0.0.0.0", embedded: true },
|
|
371
|
+
opcua: { port: 4852, host: "0.0.0.0" },
|
|
372
|
+
modbus: { port: 1702, host: "0.0.0.0" },
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
test("returns disabled placeholders when adapters are disabled", async () => {
|
|
377
|
+
const { resolveDetachAdapterConfigs } = await import("./start.ts");
|
|
378
|
+
const template = createTemplateWithNamespace({ prefix: "factory" });
|
|
379
|
+
|
|
380
|
+
expect(
|
|
381
|
+
resolveDetachAdapterConfigs({
|
|
382
|
+
template,
|
|
383
|
+
simulationName: "factory-sim",
|
|
384
|
+
mqtt: { enabled: false, portOverride: 1999, overrides: { host: "0.0.0.0" } },
|
|
385
|
+
opcua: {
|
|
386
|
+
enabled: false,
|
|
387
|
+
portOverride: 4852,
|
|
388
|
+
hostOverride: "0.0.0.0",
|
|
389
|
+
writeBudgetOverride: 4096,
|
|
390
|
+
},
|
|
391
|
+
modbus: { enabled: false, portOverride: 1702, hostOverride: "0.0.0.0" },
|
|
392
|
+
}),
|
|
393
|
+
).toEqual({
|
|
394
|
+
mqtt: { port: undefined, host: undefined, embedded: false },
|
|
395
|
+
opcua: { port: undefined, host: undefined },
|
|
396
|
+
modbus: { port: undefined, host: undefined },
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
test("marks external MQTT mode as non-embedded for detach conflict checks", async () => {
|
|
401
|
+
const { resolveDetachAdapterConfigs } = await import("./start.ts");
|
|
402
|
+
const template = createTemplateWithNamespace({ prefix: "factory" });
|
|
403
|
+
|
|
404
|
+
expect(
|
|
405
|
+
resolveDetachAdapterConfigs({
|
|
406
|
+
template,
|
|
407
|
+
simulationName: "factory-sim",
|
|
408
|
+
mqtt: {
|
|
409
|
+
enabled: true,
|
|
410
|
+
portOverride: undefined,
|
|
411
|
+
overrides: { mode: "external", url: "mqtt://broker.example.com:1883" },
|
|
412
|
+
},
|
|
413
|
+
opcua: {
|
|
414
|
+
enabled: false,
|
|
415
|
+
portOverride: undefined,
|
|
416
|
+
hostOverride: undefined,
|
|
417
|
+
writeBudgetOverride: undefined,
|
|
418
|
+
},
|
|
419
|
+
modbus: { enabled: false, portOverride: undefined, hostOverride: undefined },
|
|
420
|
+
}).mqtt.embedded,
|
|
421
|
+
).toBe(false);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
|
|
303
425
|
describe("error context aggregation", () => {
|
|
304
426
|
test("normalizeErrorContext redacts high-cardinality fragments", async () => {
|
|
305
427
|
const { normalizeErrorContext } = await import("./start.ts");
|