miravo 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +199 -0
- package/README.md +7 -70
- package/bin/miravo.js +84 -0
- package/package.json +20 -36
- package/console-dist/assets/activity-DsWeRq4h.js +0 -1
- package/console-dist/assets/api-4AqKvsm9.js +0 -1
- package/console-dist/assets/arrow-right-Ea_UhTNi.js +0 -1
- package/console-dist/assets/arrow-up-down-DFSjzzl2.js +0 -1
- package/console-dist/assets/blueprint-card-classes-DBFCDy0M.js +0 -1
- package/console-dist/assets/box-C1WaoOMF.js +0 -1
- package/console-dist/assets/card-BjeP32PN.js +0 -1
- package/console-dist/assets/catalog-BJzyzbLR.js +0 -1
- package/console-dist/assets/catalog-DKjEm-c4.js +0 -1
- package/console-dist/assets/catalog-template-icons-BrUeHaCY.js +0 -1
- package/console-dist/assets/checkbox-DZlJXTE4.js +0 -1
- package/console-dist/assets/chunk-OE4NN4TA-CEjpfhS6.js +0 -3
- package/console-dist/assets/combobox-BGnuCYxO.js +0 -1
- package/console-dist/assets/control-CPhvwx9o.js +0 -1
- package/console-dist/assets/control-Cg2up9NA.js +0 -1
- package/console-dist/assets/copy-button-WkbNkMcd.js +0 -1
- package/console-dist/assets/createLucideIcon-Bwxw859K.js +0 -1
- package/console-dist/assets/deploy-tab-JeWDwPoZ.js +0 -1
- package/console-dist/assets/dist-BhbDML0a.js +0 -1
- package/console-dist/assets/dist-Cy8XTNFT.js +0 -2
- package/console-dist/assets/download-DQ6NH16U.js +0 -1
- package/console-dist/assets/engine-store-CrLnz692.js +0 -1
- package/console-dist/assets/events-CXm29Ok4.js +0 -1
- package/console-dist/assets/events-D01IxhnP.js +0 -1
- package/console-dist/assets/fira-code-cyrillic-ext-wght-normal-DhYMMuQd.woff2 +0 -0
- package/console-dist/assets/fira-code-cyrillic-wght-normal-Y3u8pIsh.woff2 +0 -0
- package/console-dist/assets/fira-code-greek-ext-wght-normal-wWus70Ix.woff2 +0 -0
- package/console-dist/assets/fira-code-greek-wght-normal-B2SviObF.woff2 +0 -0
- package/console-dist/assets/fira-code-latin-ext-wght-normal-Dvfvaomy.woff2 +0 -0
- package/console-dist/assets/fira-code-latin-wght-normal-CHoedHDv.woff2 +0 -0
- package/console-dist/assets/fira-code-symbols2-wght-normal-CE6EOz_n.woff2 +0 -0
- package/console-dist/assets/fleet-CfxbKXt9.js +0 -1
- package/console-dist/assets/fleet-lotMGVqe.js +0 -1
- package/console-dist/assets/format-kXTonpDJ.js +0 -1
- package/console-dist/assets/gauge-Ci8zNZlk.js +0 -1
- package/console-dist/assets/get-error-message-3Q5Q-2G5.js +0 -1
- package/console-dist/assets/index-CVPKSDvJ.js +0 -12
- package/console-dist/assets/index-DJkgDeun.css +0 -2
- package/console-dist/assets/input-BWEQFptx.js +0 -1
- package/console-dist/assets/instance-detail-C5IVwuh3.js +0 -1
- package/console-dist/assets/karla-latin-ext-wght-normal-Dq0rrjgs.woff2 +0 -0
- package/console-dist/assets/karla-latin-wght-normal-C3-ma4ov.woff2 +0 -0
- package/console-dist/assets/label-uephX5ZG.js +0 -1
- package/console-dist/assets/layers-CUsLQ1fq.js +0 -1
- package/console-dist/assets/login-C3RJli0m.js +0 -126
- package/console-dist/assets/models-B_UioWQ5.js +0 -1
- package/console-dist/assets/models-_IPlPiZ7.js +0 -1
- package/console-dist/assets/not-found-B8gAm08S.js +0 -1
- package/console-dist/assets/platform-targets-R3T-4eJ7.js +0 -1
- package/console-dist/assets/platforms-BWh0BQ3Y.js +0 -1
- package/console-dist/assets/platforms-DStNbtVc.js +0 -1
- package/console-dist/assets/proxy-CsnYqnPp.js +0 -9
- package/console-dist/assets/query-keys-BvtE7BMs.js +0 -1
- package/console-dist/assets/radio-CoHegOv5.js +0 -1
- package/console-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
- package/console-dist/assets/schibsted-grotesk-latin-ext-wght-normal-hsMS0n0O.woff2 +0 -0
- package/console-dist/assets/schibsted-grotesk-latin-wght-normal-Bb8VGrTG.woff2 +0 -0
- package/console-dist/assets/select-CeO4vP0G.js +0 -1
- package/console-dist/assets/select-display-items-CIzY8953.js +0 -1
- package/console-dist/assets/server-D9Kfn8fQ.js +0 -1
- package/console-dist/assets/shallow-6lGjQhtJ.js +0 -1
- package/console-dist/assets/tags-CiXOIHtY.js +0 -4
- package/console-dist/assets/tags-FQCXIxrP.js +0 -1
- package/console-dist/assets/tooltip-HGLF366Q.js +0 -1
- package/console-dist/assets/transition-nav-link-Df4Rk6vV.js +0 -1
- package/console-dist/assets/transition-types-CPlGtM8w.js +0 -1
- package/console-dist/assets/triangle-alert-adNk_sea.js +0 -1
- package/console-dist/assets/use-platform-stream-DGbK1k2L.js +0 -2
- package/console-dist/assets/use-transition-navigate-CCpcWXB0.js +0 -2
- package/console-dist/assets/validation-Blvud9_O.js +0 -1
- package/console-dist/assets/vendor-charts-CAZdaPlq.js +0 -60
- package/console-dist/assets/vendor-table-wd8JuMmT.js +0 -4
- package/console-dist/assets/vendor-ui-ByahnaY0.js +0 -1
- package/console-dist/favicon.svg +0 -37
- package/console-dist/index.html +0 -82
- package/console-dist/miravo-logo.png +0 -0
- package/src/__tests__/integration/executable-methods-runner.ts +0 -262
- package/src/__tests__/integration/executable-methods.integration.ts +0 -2348
- package/src/__tests__/integration/opcua-concurrent-clients.integration.ts +0 -314
- package/src/commands/adapter.ts +0 -249
- package/src/commands/apply.test.ts +0 -62
- package/src/commands/apply.ts +0 -216
- package/src/commands/cleanup.test.ts +0 -34
- package/src/commands/cleanup.ts +0 -201
- package/src/commands/cli-test-setup.ts +0 -91
- package/src/commands/export.test.ts +0 -51
- package/src/commands/export.ts +0 -404
- package/src/commands/fork.ts +0 -219
- package/src/commands/inject.test.ts +0 -57
- package/src/commands/inject.ts +0 -212
- package/src/commands/load.ts +0 -167
- package/src/commands/logs.ts +0 -173
- package/src/commands/models.test.ts +0 -162
- package/src/commands/models.ts +0 -338
- package/src/commands/pause.ts +0 -67
- package/src/commands/platforms.test.ts +0 -186
- package/src/commands/platforms.ts +0 -371
- package/src/commands/ps.ts +0 -116
- package/src/commands/remove.ts +0 -38
- package/src/commands/reset.ts +0 -44
- package/src/commands/rm.ts +0 -97
- package/src/commands/spawn.ts +0 -45
- package/src/commands/speed.ts +0 -40
- package/src/commands/start/adapter-config.ts +0 -157
- package/src/commands/start/catalog-le-dt.test.ts +0 -50
- package/src/commands/start/catalog-le-dt.ts +0 -187
- package/src/commands/start/catalog-model-schema.ts +0 -89
- package/src/commands/start/catalog-template-detail.ts +0 -54
- package/src/commands/start/daemon.ts +0 -255
- package/src/commands/start/display.ts +0 -150
- package/src/commands/start/engine-setup.ts +0 -247
- package/src/commands/start/events.ts +0 -126
- package/src/commands/start/index.ts +0 -897
- package/src/commands/start/protocol-plans.ts +0 -239
- package/src/commands/start/template-loader.ts +0 -197
- package/src/commands/start/template-resolver.ts +0 -185
- package/src/commands/start/types.ts +0 -73
- package/src/commands/start.test.ts +0 -480
- package/src/commands/status.test.ts +0 -20
- package/src/commands/status.ts +0 -470
- package/src/commands/stop.test.ts +0 -84
- package/src/commands/stop.ts +0 -169
- package/src/commands/templates.test.ts +0 -58
- package/src/commands/templates.ts +0 -277
- package/src/index.ts +0 -166
- package/src/lib/admin-auth.ts +0 -157
- package/src/lib/admin-client.test.ts +0 -51
- package/src/lib/admin-client.ts +0 -326
- package/src/lib/admin-platform-routes.ts +0 -1017
- package/src/lib/admin-platform-stream.test.ts +0 -434
- package/src/lib/admin-platform-stream.ts +0 -788
- package/src/lib/admin-responses.ts +0 -211
- package/src/lib/admin-server.test.ts +0 -781
- package/src/lib/admin-server.ts +0 -797
- package/src/lib/auth-store.ts +0 -87
- package/src/lib/daemon-registry.test.ts +0 -429
- package/src/lib/daemon-registry.ts +0 -343
- package/src/lib/le/le-apply.test.ts +0 -591
- package/src/lib/le/le-apply.ts +0 -832
- package/src/lib/le/le-auth.ts +0 -89
- package/src/lib/le/le-cleanup.test.ts +0 -168
- package/src/lib/le/le-cleanup.ts +0 -399
- package/src/lib/le/le-cli-helpers.ts +0 -77
- package/src/lib/le/le-client.ts +0 -184
- package/src/lib/le/le-concurrency.test.ts +0 -157
- package/src/lib/le/le-concurrency.ts +0 -78
- package/src/lib/le/le-connection-test.ts +0 -42
- package/src/lib/le/le-devicehub-properties.test.ts +0 -53
- package/src/lib/le/le-devicehub-properties.ts +0 -33
- package/src/lib/le/le-devicehub.ts +0 -213
- package/src/lib/le/le-digital-twins.ts +0 -285
- package/src/lib/le/le-drivers.ts +0 -23
- package/src/lib/le/le-endpoint.ts +0 -40
- package/src/lib/le/le-environments.test.ts +0 -73
- package/src/lib/le/le-environments.ts +0 -156
- package/src/lib/le/le-markers.ts +0 -87
- package/src/lib/le/le-plan.test.ts +0 -26
- package/src/lib/le/le-plan.ts +0 -109
- package/src/lib/le/le-platform-operations.test.ts +0 -198
- package/src/lib/le/le-platform-operations.ts +0 -340
- package/src/lib/le/le-static-model-schema.ts +0 -78
- package/src/lib/le/le-static-planner.test.ts +0 -255
- package/src/lib/le/le-static-planner.ts +0 -442
- package/src/lib/le/le-template-exporter.test.ts +0 -527
- package/src/lib/le/le-template-exporter.ts +0 -459
- package/src/lib/le/le-value-types.ts +0 -23
- package/src/lib/mqtt-client.ts +0 -115
- package/src/lib/parse.test.ts +0 -123
- package/src/lib/parse.ts +0 -87
- package/src/lib/resolve-simulation.test.ts +0 -118
- package/src/lib/resolve-simulation.ts +0 -181
- package/src/lib/session-store.ts +0 -110
- package/src/lib/shutdown.test.ts +0 -562
- package/src/lib/shutdown.ts +0 -621
- package/src/lib/template-category.test.ts +0 -71
- package/src/lib/template-category.ts +0 -72
- package/src/lib/template-locator.ts +0 -55
- package/src/lib/template-utils.ts +0 -45
- package/src/lib/ws-hub.ts +0 -281
- package/src/logger.test.ts +0 -172
- package/src/logger.ts +0 -402
- package/src/output.test.ts +0 -64
- package/src/output.ts +0 -160
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Response helpers and health-check utilities for the Miravo admin server.
|
|
3
|
-
*
|
|
4
|
-
* Pure functions — no side effects, no server state.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { EngineCoreMetrics } from "@miravo/core";
|
|
8
|
-
import type { EngineCommand } from "@miravo/shared";
|
|
9
|
-
import { EngineCommandSchema } from "@miravo/shared";
|
|
10
|
-
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
// Interfaces
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
|
|
15
|
-
export interface HealthResponseBody {
|
|
16
|
-
readonly status: "ok" | "fail";
|
|
17
|
-
readonly simulationState: EngineCoreMetrics["state"];
|
|
18
|
-
readonly tickCount: number;
|
|
19
|
-
readonly mqttEnabled: boolean;
|
|
20
|
-
readonly mqttConnected: boolean | null;
|
|
21
|
-
readonly opcuaEnabled: boolean;
|
|
22
|
-
readonly opcuaConnected: boolean | null;
|
|
23
|
-
readonly stalled: boolean;
|
|
24
|
-
readonly reason?: string;
|
|
25
|
-
readonly simulationName?: string;
|
|
26
|
-
readonly runId?: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface AdminErrorResponse {
|
|
30
|
-
readonly message: string;
|
|
31
|
-
readonly error: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
interface AdminServerStatus {
|
|
35
|
-
readonly status: "ok" | "fail";
|
|
36
|
-
readonly reason?: string;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
// Low-level response builders
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
|
|
43
|
-
export function jsonResponse(body: unknown, status: number): Response {
|
|
44
|
-
return new Response(JSON.stringify(body), {
|
|
45
|
-
status,
|
|
46
|
-
headers: {
|
|
47
|
-
"content-type": "application/json; charset=utf-8",
|
|
48
|
-
"cache-control": "no-store",
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function yamlResponse(body: string, status: number): Response {
|
|
54
|
-
return new Response(body, {
|
|
55
|
-
status,
|
|
56
|
-
headers: {
|
|
57
|
-
"content-type": "text/yaml; charset=utf-8",
|
|
58
|
-
"cache-control": "no-store",
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function plainResponse(body: string, status: number, allow?: string): Response {
|
|
64
|
-
return new Response(body, {
|
|
65
|
-
status,
|
|
66
|
-
headers: {
|
|
67
|
-
"content-type": "text/plain; charset=utf-8",
|
|
68
|
-
"cache-control": "no-store",
|
|
69
|
-
...(allow ? { allow } : {}),
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/** Require Content-Type: application/json. Returns an error Response or null. */
|
|
75
|
-
export function checkContentType(request: Request): Response | null {
|
|
76
|
-
const ct = request.headers.get("content-type");
|
|
77
|
-
if (ct && ct.split(";")[0]?.trim() === "application/json") return null;
|
|
78
|
-
return jsonResponse(
|
|
79
|
-
{
|
|
80
|
-
message: "Unsupported Media Type.",
|
|
81
|
-
error: "Content-Type must be application/json.",
|
|
82
|
-
},
|
|
83
|
-
415,
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// ---------------------------------------------------------------------------
|
|
88
|
-
// Health / readiness status helpers
|
|
89
|
-
// ---------------------------------------------------------------------------
|
|
90
|
-
|
|
91
|
-
export function livenessStatus(input: {
|
|
92
|
-
readonly core: EngineCoreMetrics;
|
|
93
|
-
readonly stalled: boolean;
|
|
94
|
-
}): AdminServerStatus {
|
|
95
|
-
if (input.core.state === "stopped") {
|
|
96
|
-
return { status: "fail", reason: 'engine state is "stopped"' };
|
|
97
|
-
}
|
|
98
|
-
if (input.stalled) {
|
|
99
|
-
return { status: "fail", reason: "tick loop stalled" };
|
|
100
|
-
}
|
|
101
|
-
return { status: "ok" };
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export function readinessStatus(input: {
|
|
105
|
-
readonly core: EngineCoreMetrics;
|
|
106
|
-
readonly stalled: boolean;
|
|
107
|
-
readonly mqttEnabled: boolean;
|
|
108
|
-
readonly mqttConnected: boolean;
|
|
109
|
-
readonly opcuaEnabled: boolean;
|
|
110
|
-
readonly opcuaConnected: boolean;
|
|
111
|
-
}): AdminServerStatus {
|
|
112
|
-
if (input.core.state !== "running") {
|
|
113
|
-
return { status: "fail", reason: `engine state is "${input.core.state}"` };
|
|
114
|
-
}
|
|
115
|
-
if (input.stalled) {
|
|
116
|
-
return { status: "fail", reason: "tick loop stalled" };
|
|
117
|
-
}
|
|
118
|
-
if (input.mqttEnabled && !input.mqttConnected) {
|
|
119
|
-
return { status: "fail", reason: "mqtt disconnected" };
|
|
120
|
-
}
|
|
121
|
-
if (input.opcuaEnabled && !input.opcuaConnected) {
|
|
122
|
-
return { status: "fail", reason: "opcua disconnected" };
|
|
123
|
-
}
|
|
124
|
-
return { status: "ok" };
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export function buildHealthBody(input: {
|
|
128
|
-
readonly metrics: { readonly core: EngineCoreMetrics };
|
|
129
|
-
readonly stalled: boolean;
|
|
130
|
-
readonly mqttEnabled: boolean;
|
|
131
|
-
readonly mqttConnected: boolean;
|
|
132
|
-
readonly opcuaEnabled: boolean;
|
|
133
|
-
readonly opcuaConnected: boolean;
|
|
134
|
-
}): Omit<HealthResponseBody, "status" | "reason"> {
|
|
135
|
-
return {
|
|
136
|
-
simulationState: input.metrics.core.state,
|
|
137
|
-
tickCount: input.metrics.core.tickCount,
|
|
138
|
-
mqttEnabled: input.mqttEnabled,
|
|
139
|
-
mqttConnected: input.mqttEnabled ? input.mqttConnected : null,
|
|
140
|
-
opcuaEnabled: input.opcuaEnabled,
|
|
141
|
-
opcuaConnected: input.opcuaEnabled ? input.opcuaConnected : null,
|
|
142
|
-
stalled: input.stalled,
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// ---------------------------------------------------------------------------
|
|
147
|
-
// Command parsing helpers
|
|
148
|
-
// ---------------------------------------------------------------------------
|
|
149
|
-
|
|
150
|
-
function extractCorrelationId(payload: unknown): string | undefined {
|
|
151
|
-
if (typeof payload !== "object" || payload === null) {
|
|
152
|
-
return undefined;
|
|
153
|
-
}
|
|
154
|
-
const maybeCorrelationId = (payload as Record<string, unknown>)["correlationId"];
|
|
155
|
-
return typeof maybeCorrelationId === "string" ? maybeCorrelationId : undefined;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function extractCommandType(payload: unknown): string {
|
|
159
|
-
if (typeof payload !== "object" || payload === null) {
|
|
160
|
-
return "unknown";
|
|
161
|
-
}
|
|
162
|
-
const maybeType = (payload as Record<string, unknown>)["type"];
|
|
163
|
-
return typeof maybeType === "string" ? maybeType : "unknown";
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function commandValidationErrorResponse(
|
|
167
|
-
commandType: string,
|
|
168
|
-
correlationId: string | undefined,
|
|
169
|
-
issues: string,
|
|
170
|
-
): Response {
|
|
171
|
-
return jsonResponse(
|
|
172
|
-
{
|
|
173
|
-
success: false,
|
|
174
|
-
command: commandType,
|
|
175
|
-
correlationId,
|
|
176
|
-
message: `Command validation failed: ${issues}`,
|
|
177
|
-
error:
|
|
178
|
-
"Check the command shape. Required: { type, ...fields }. See documentation for valid command types.",
|
|
179
|
-
},
|
|
180
|
-
400,
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export async function parseCommandRequest(request: Request): Promise<Response | EngineCommand> {
|
|
185
|
-
let payload: unknown;
|
|
186
|
-
try {
|
|
187
|
-
payload = await request.json();
|
|
188
|
-
} catch {
|
|
189
|
-
return jsonResponse(
|
|
190
|
-
{
|
|
191
|
-
message: "Invalid JSON in command request body.",
|
|
192
|
-
error: 'Send a valid JSON object. Example: {"type":"pause"}',
|
|
193
|
-
} satisfies AdminErrorResponse,
|
|
194
|
-
400,
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const validation = EngineCommandSchema.safeParse(payload);
|
|
199
|
-
if (!validation.success) {
|
|
200
|
-
const issues = validation.error.issues
|
|
201
|
-
.map((issue) => `${issue.path.join(".")}: ${issue.message}`)
|
|
202
|
-
.join("; ");
|
|
203
|
-
return commandValidationErrorResponse(
|
|
204
|
-
extractCommandType(payload),
|
|
205
|
-
extractCorrelationId(payload),
|
|
206
|
-
issues,
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return validation.data;
|
|
211
|
-
}
|