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.
Files changed (187) hide show
  1. package/LICENSE +199 -0
  2. package/README.md +7 -70
  3. package/bin/miravo.js +84 -0
  4. package/package.json +20 -36
  5. package/console-dist/assets/activity-DsWeRq4h.js +0 -1
  6. package/console-dist/assets/api-4AqKvsm9.js +0 -1
  7. package/console-dist/assets/arrow-right-Ea_UhTNi.js +0 -1
  8. package/console-dist/assets/arrow-up-down-DFSjzzl2.js +0 -1
  9. package/console-dist/assets/blueprint-card-classes-DBFCDy0M.js +0 -1
  10. package/console-dist/assets/box-C1WaoOMF.js +0 -1
  11. package/console-dist/assets/card-BjeP32PN.js +0 -1
  12. package/console-dist/assets/catalog-BJzyzbLR.js +0 -1
  13. package/console-dist/assets/catalog-DKjEm-c4.js +0 -1
  14. package/console-dist/assets/catalog-template-icons-BrUeHaCY.js +0 -1
  15. package/console-dist/assets/checkbox-DZlJXTE4.js +0 -1
  16. package/console-dist/assets/chunk-OE4NN4TA-CEjpfhS6.js +0 -3
  17. package/console-dist/assets/combobox-BGnuCYxO.js +0 -1
  18. package/console-dist/assets/control-CPhvwx9o.js +0 -1
  19. package/console-dist/assets/control-Cg2up9NA.js +0 -1
  20. package/console-dist/assets/copy-button-WkbNkMcd.js +0 -1
  21. package/console-dist/assets/createLucideIcon-Bwxw859K.js +0 -1
  22. package/console-dist/assets/deploy-tab-JeWDwPoZ.js +0 -1
  23. package/console-dist/assets/dist-BhbDML0a.js +0 -1
  24. package/console-dist/assets/dist-Cy8XTNFT.js +0 -2
  25. package/console-dist/assets/download-DQ6NH16U.js +0 -1
  26. package/console-dist/assets/engine-store-CrLnz692.js +0 -1
  27. package/console-dist/assets/events-CXm29Ok4.js +0 -1
  28. package/console-dist/assets/events-D01IxhnP.js +0 -1
  29. package/console-dist/assets/fira-code-cyrillic-ext-wght-normal-DhYMMuQd.woff2 +0 -0
  30. package/console-dist/assets/fira-code-cyrillic-wght-normal-Y3u8pIsh.woff2 +0 -0
  31. package/console-dist/assets/fira-code-greek-ext-wght-normal-wWus70Ix.woff2 +0 -0
  32. package/console-dist/assets/fira-code-greek-wght-normal-B2SviObF.woff2 +0 -0
  33. package/console-dist/assets/fira-code-latin-ext-wght-normal-Dvfvaomy.woff2 +0 -0
  34. package/console-dist/assets/fira-code-latin-wght-normal-CHoedHDv.woff2 +0 -0
  35. package/console-dist/assets/fira-code-symbols2-wght-normal-CE6EOz_n.woff2 +0 -0
  36. package/console-dist/assets/fleet-CfxbKXt9.js +0 -1
  37. package/console-dist/assets/fleet-lotMGVqe.js +0 -1
  38. package/console-dist/assets/format-kXTonpDJ.js +0 -1
  39. package/console-dist/assets/gauge-Ci8zNZlk.js +0 -1
  40. package/console-dist/assets/get-error-message-3Q5Q-2G5.js +0 -1
  41. package/console-dist/assets/index-CVPKSDvJ.js +0 -12
  42. package/console-dist/assets/index-DJkgDeun.css +0 -2
  43. package/console-dist/assets/input-BWEQFptx.js +0 -1
  44. package/console-dist/assets/instance-detail-C5IVwuh3.js +0 -1
  45. package/console-dist/assets/karla-latin-ext-wght-normal-Dq0rrjgs.woff2 +0 -0
  46. package/console-dist/assets/karla-latin-wght-normal-C3-ma4ov.woff2 +0 -0
  47. package/console-dist/assets/label-uephX5ZG.js +0 -1
  48. package/console-dist/assets/layers-CUsLQ1fq.js +0 -1
  49. package/console-dist/assets/login-C3RJli0m.js +0 -126
  50. package/console-dist/assets/models-B_UioWQ5.js +0 -1
  51. package/console-dist/assets/models-_IPlPiZ7.js +0 -1
  52. package/console-dist/assets/not-found-B8gAm08S.js +0 -1
  53. package/console-dist/assets/platform-targets-R3T-4eJ7.js +0 -1
  54. package/console-dist/assets/platforms-BWh0BQ3Y.js +0 -1
  55. package/console-dist/assets/platforms-DStNbtVc.js +0 -1
  56. package/console-dist/assets/proxy-CsnYqnPp.js +0 -9
  57. package/console-dist/assets/query-keys-BvtE7BMs.js +0 -1
  58. package/console-dist/assets/radio-CoHegOv5.js +0 -1
  59. package/console-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
  60. package/console-dist/assets/schibsted-grotesk-latin-ext-wght-normal-hsMS0n0O.woff2 +0 -0
  61. package/console-dist/assets/schibsted-grotesk-latin-wght-normal-Bb8VGrTG.woff2 +0 -0
  62. package/console-dist/assets/select-CeO4vP0G.js +0 -1
  63. package/console-dist/assets/select-display-items-CIzY8953.js +0 -1
  64. package/console-dist/assets/server-D9Kfn8fQ.js +0 -1
  65. package/console-dist/assets/shallow-6lGjQhtJ.js +0 -1
  66. package/console-dist/assets/tags-CiXOIHtY.js +0 -4
  67. package/console-dist/assets/tags-FQCXIxrP.js +0 -1
  68. package/console-dist/assets/tooltip-HGLF366Q.js +0 -1
  69. package/console-dist/assets/transition-nav-link-Df4Rk6vV.js +0 -1
  70. package/console-dist/assets/transition-types-CPlGtM8w.js +0 -1
  71. package/console-dist/assets/triangle-alert-adNk_sea.js +0 -1
  72. package/console-dist/assets/use-platform-stream-DGbK1k2L.js +0 -2
  73. package/console-dist/assets/use-transition-navigate-CCpcWXB0.js +0 -2
  74. package/console-dist/assets/validation-Blvud9_O.js +0 -1
  75. package/console-dist/assets/vendor-charts-CAZdaPlq.js +0 -60
  76. package/console-dist/assets/vendor-table-wd8JuMmT.js +0 -4
  77. package/console-dist/assets/vendor-ui-ByahnaY0.js +0 -1
  78. package/console-dist/favicon.svg +0 -37
  79. package/console-dist/index.html +0 -82
  80. package/console-dist/miravo-logo.png +0 -0
  81. package/src/__tests__/integration/executable-methods-runner.ts +0 -262
  82. package/src/__tests__/integration/executable-methods.integration.ts +0 -2348
  83. package/src/__tests__/integration/opcua-concurrent-clients.integration.ts +0 -314
  84. package/src/commands/adapter.ts +0 -249
  85. package/src/commands/apply.test.ts +0 -62
  86. package/src/commands/apply.ts +0 -216
  87. package/src/commands/cleanup.test.ts +0 -34
  88. package/src/commands/cleanup.ts +0 -201
  89. package/src/commands/cli-test-setup.ts +0 -91
  90. package/src/commands/export.test.ts +0 -51
  91. package/src/commands/export.ts +0 -404
  92. package/src/commands/fork.ts +0 -219
  93. package/src/commands/inject.test.ts +0 -57
  94. package/src/commands/inject.ts +0 -212
  95. package/src/commands/load.ts +0 -167
  96. package/src/commands/logs.ts +0 -173
  97. package/src/commands/models.test.ts +0 -162
  98. package/src/commands/models.ts +0 -338
  99. package/src/commands/pause.ts +0 -67
  100. package/src/commands/platforms.test.ts +0 -186
  101. package/src/commands/platforms.ts +0 -371
  102. package/src/commands/ps.ts +0 -116
  103. package/src/commands/remove.ts +0 -38
  104. package/src/commands/reset.ts +0 -44
  105. package/src/commands/rm.ts +0 -97
  106. package/src/commands/spawn.ts +0 -45
  107. package/src/commands/speed.ts +0 -40
  108. package/src/commands/start/adapter-config.ts +0 -157
  109. package/src/commands/start/catalog-le-dt.test.ts +0 -50
  110. package/src/commands/start/catalog-le-dt.ts +0 -187
  111. package/src/commands/start/catalog-model-schema.ts +0 -89
  112. package/src/commands/start/catalog-template-detail.ts +0 -54
  113. package/src/commands/start/daemon.ts +0 -255
  114. package/src/commands/start/display.ts +0 -150
  115. package/src/commands/start/engine-setup.ts +0 -247
  116. package/src/commands/start/events.ts +0 -126
  117. package/src/commands/start/index.ts +0 -897
  118. package/src/commands/start/protocol-plans.ts +0 -239
  119. package/src/commands/start/template-loader.ts +0 -197
  120. package/src/commands/start/template-resolver.ts +0 -185
  121. package/src/commands/start/types.ts +0 -73
  122. package/src/commands/start.test.ts +0 -480
  123. package/src/commands/status.test.ts +0 -20
  124. package/src/commands/status.ts +0 -470
  125. package/src/commands/stop.test.ts +0 -84
  126. package/src/commands/stop.ts +0 -169
  127. package/src/commands/templates.test.ts +0 -58
  128. package/src/commands/templates.ts +0 -277
  129. package/src/index.ts +0 -166
  130. package/src/lib/admin-auth.ts +0 -157
  131. package/src/lib/admin-client.test.ts +0 -51
  132. package/src/lib/admin-client.ts +0 -326
  133. package/src/lib/admin-platform-routes.ts +0 -1017
  134. package/src/lib/admin-platform-stream.test.ts +0 -434
  135. package/src/lib/admin-platform-stream.ts +0 -788
  136. package/src/lib/admin-responses.ts +0 -211
  137. package/src/lib/admin-server.test.ts +0 -781
  138. package/src/lib/admin-server.ts +0 -797
  139. package/src/lib/auth-store.ts +0 -87
  140. package/src/lib/daemon-registry.test.ts +0 -429
  141. package/src/lib/daemon-registry.ts +0 -343
  142. package/src/lib/le/le-apply.test.ts +0 -591
  143. package/src/lib/le/le-apply.ts +0 -832
  144. package/src/lib/le/le-auth.ts +0 -89
  145. package/src/lib/le/le-cleanup.test.ts +0 -168
  146. package/src/lib/le/le-cleanup.ts +0 -399
  147. package/src/lib/le/le-cli-helpers.ts +0 -77
  148. package/src/lib/le/le-client.ts +0 -184
  149. package/src/lib/le/le-concurrency.test.ts +0 -157
  150. package/src/lib/le/le-concurrency.ts +0 -78
  151. package/src/lib/le/le-connection-test.ts +0 -42
  152. package/src/lib/le/le-devicehub-properties.test.ts +0 -53
  153. package/src/lib/le/le-devicehub-properties.ts +0 -33
  154. package/src/lib/le/le-devicehub.ts +0 -213
  155. package/src/lib/le/le-digital-twins.ts +0 -285
  156. package/src/lib/le/le-drivers.ts +0 -23
  157. package/src/lib/le/le-endpoint.ts +0 -40
  158. package/src/lib/le/le-environments.test.ts +0 -73
  159. package/src/lib/le/le-environments.ts +0 -156
  160. package/src/lib/le/le-markers.ts +0 -87
  161. package/src/lib/le/le-plan.test.ts +0 -26
  162. package/src/lib/le/le-plan.ts +0 -109
  163. package/src/lib/le/le-platform-operations.test.ts +0 -198
  164. package/src/lib/le/le-platform-operations.ts +0 -340
  165. package/src/lib/le/le-static-model-schema.ts +0 -78
  166. package/src/lib/le/le-static-planner.test.ts +0 -255
  167. package/src/lib/le/le-static-planner.ts +0 -442
  168. package/src/lib/le/le-template-exporter.test.ts +0 -527
  169. package/src/lib/le/le-template-exporter.ts +0 -459
  170. package/src/lib/le/le-value-types.ts +0 -23
  171. package/src/lib/mqtt-client.ts +0 -115
  172. package/src/lib/parse.test.ts +0 -123
  173. package/src/lib/parse.ts +0 -87
  174. package/src/lib/resolve-simulation.test.ts +0 -118
  175. package/src/lib/resolve-simulation.ts +0 -181
  176. package/src/lib/session-store.ts +0 -110
  177. package/src/lib/shutdown.test.ts +0 -562
  178. package/src/lib/shutdown.ts +0 -621
  179. package/src/lib/template-category.test.ts +0 -71
  180. package/src/lib/template-category.ts +0 -72
  181. package/src/lib/template-locator.ts +0 -55
  182. package/src/lib/template-utils.ts +0 -45
  183. package/src/lib/ws-hub.ts +0 -281
  184. package/src/logger.test.ts +0 -172
  185. package/src/logger.ts +0 -402
  186. package/src/output.test.ts +0 -64
  187. 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
- }