station-kit 1.1.0 → 2.0.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/.next/standalone/packages/station-kit/.next/BUILD_ID +1 -1
- package/.next/standalone/packages/station-kit/.next/app-build-manifest.json +55 -34
- package/.next/standalone/packages/station-kit/.next/app-path-routes-manifest.json +11 -8
- package/.next/standalone/packages/station-kit/.next/build-manifest.json +2 -2
- package/.next/standalone/packages/station-kit/.next/prerender-manifest.json +73 -25
- package/.next/standalone/packages/station-kit/.next/routes-manifest.json +20 -0
- package/.next/standalone/packages/station-kit/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/_not-found.rsc +8 -8
- package/.next/standalone/packages/station-kit/.next/server/app/beacons/[name]/page.js +2 -0
- package/.next/standalone/packages/station-kit/.next/server/app/beacons/[name]/page.js.nft.json +1 -0
- package/.next/standalone/packages/station-kit/.next/server/app/beacons/[name]/page_client-reference-manifest.js +1 -0
- package/.next/standalone/packages/station-kit/.next/server/app/beacons/page.js +2 -0
- package/.next/standalone/packages/station-kit/.next/server/app/beacons/page.js.nft.json +1 -0
- package/.next/standalone/packages/station-kit/.next/server/app/beacons/page_client-reference-manifest.js +1 -0
- package/.next/standalone/packages/station-kit/.next/server/app/beacons.html +1 -0
- package/.next/standalone/packages/station-kit/.next/server/app/beacons.meta +7 -0
- package/.next/standalone/packages/station-kit/.next/server/app/beacons.rsc +25 -0
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/dyn/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/dyn/[name]/v/[n]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/new.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/new.rsc +9 -9
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/broadcasts.rsc +9 -9
- package/.next/standalone/packages/station-kit/.next/server/app/environment/page.js +2 -0
- package/.next/standalone/packages/station-kit/.next/server/app/environment/page.js.nft.json +1 -0
- package/.next/standalone/packages/station-kit/.next/server/app/environment/page_client-reference-manifest.js +1 -0
- package/.next/standalone/packages/station-kit/.next/server/app/environment.html +1 -0
- package/.next/standalone/packages/station-kit/.next/server/app/environment.meta +7 -0
- package/.next/standalone/packages/station-kit/.next/server/app/environment.rsc +25 -0
- package/.next/standalone/packages/station-kit/.next/server/app/index.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/index.rsc +9 -9
- package/.next/standalone/packages/station-kit/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/playground/expression/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/playground/expression.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/playground/expression.rsc +9 -9
- package/.next/standalone/packages/station-kit/.next/server/app/runs/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/schedules/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/schedules/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/schedules/new.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/schedules/new.rsc +9 -9
- package/.next/standalone/packages/station-kit/.next/server/app/schedules/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/schedules.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/schedules.rsc +9 -9
- package/.next/standalone/packages/station-kit/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/settings.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/settings.rsc +9 -9
- package/.next/standalone/packages/station-kit/.next/server/app/signals/[name]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/signals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/signals.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/app/signals.rsc +9 -9
- package/.next/standalone/packages/station-kit/.next/server/app-paths-manifest.json +11 -8
- package/.next/standalone/packages/station-kit/.next/server/chunks/102.js +1 -1
- package/.next/standalone/packages/station-kit/.next/server/pages/404.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/pages/500.html +1 -1
- package/.next/standalone/packages/station-kit/.next/server/pages-manifest.json +1 -1
- package/.next/standalone/packages/station-kit/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/285-583f23ee7827983f.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/561-05a7ef9669e3921a.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/beacons/[name]/page-eb1f82847734e145.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/beacons/page-64e296346197e44b.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/broadcasts/dyn/[name]/v/[n]/page-15edf07ab26241c9.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/broadcasts/page-b23a03097c8f75c4.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/environment/page-111242bec067fdee.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/layout-e9ac56fcaf7a5ea7.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/page-ef78692958c2fc01.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/playground/expression/page-29294a705dd8f471.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/runs/[id]/page-287bbb8f6dec2e23.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/schedules/page-c869218da203e3b4.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/settings/page-05cf43b6ae6b3187.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/signals/[name]/page-4027803be00c695a.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/signals/page-8e076fc5d0188d72.js +1 -0
- package/.next/standalone/packages/station-kit/.next/static/css/ddb1646dc25ed100.css +1 -0
- package/.next/standalone/packages/station-kit/.next/static/vTGEzSqxhR_E57YAFn9DC/_buildManifest.js +1 -0
- package/.next/standalone/packages/station-kit/package.json +4 -1
- package/dist/config/schema.d.ts +18 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +3 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/server/auth/keys.d.ts +18 -1
- package/dist/server/auth/keys.d.ts.map +1 -1
- package/dist/server/auth/keys.js +38 -6
- package/dist/server/auth/keys.js.map +1 -1
- package/dist/server/auth/session.d.ts.map +1 -1
- package/dist/server/auth/session.js +34 -11
- package/dist/server/auth/session.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +135 -18
- package/dist/server/index.js.map +1 -1
- package/dist/server/metadata.d.ts +2 -0
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/metadata.js.map +1 -1
- package/dist/server/middleware/rate-limit.d.ts.map +1 -1
- package/dist/server/middleware/rate-limit.js +22 -1
- package/dist/server/middleware/rate-limit.js.map +1 -1
- package/dist/server/routes/beacons.d.ts +10 -0
- package/dist/server/routes/beacons.d.ts.map +1 -0
- package/dist/server/routes/beacons.js +98 -0
- package/dist/server/routes/beacons.js.map +1 -0
- package/dist/server/routes/broadcasts.d.ts.map +1 -1
- package/dist/server/routes/broadcasts.js +6 -2
- package/dist/server/routes/broadcasts.js.map +1 -1
- package/dist/server/routes/runs.d.ts.map +1 -1
- package/dist/server/routes/runs.js +19 -59
- package/dist/server/routes/runs.js.map +1 -1
- package/dist/server/routes/signals.d.ts.map +1 -1
- package/dist/server/routes/signals.js +17 -13
- package/dist/server/routes/signals.js.map +1 -1
- package/dist/server/routes/v1/env.d.ts +10 -0
- package/dist/server/routes/v1/env.d.ts.map +1 -0
- package/dist/server/routes/v1/env.js +132 -0
- package/dist/server/routes/v1/env.js.map +1 -0
- package/dist/server/routes/v1/events.js +2 -2
- package/dist/server/routes/v1/events.js.map +1 -1
- package/dist/server/routes/v1/runs.d.ts.map +1 -1
- package/dist/server/routes/v1/runs.js +10 -31
- package/dist/server/routes/v1/runs.js.map +1 -1
- package/dist/server/sse.d.ts +2 -1
- package/dist/server/sse.d.ts.map +1 -1
- package/dist/server/sse.js +5 -1
- package/dist/server/sse.js.map +1 -1
- package/dist/server/subscriber.d.ts +56 -0
- package/dist/server/subscriber.d.ts.map +1 -1
- package/dist/server/subscriber.js +94 -0
- package/dist/server/subscriber.js.map +1 -1
- package/dist/server/ws.d.ts +8 -2
- package/dist/server/ws.d.ts.map +1 -1
- package/dist/server/ws.js +28 -3
- package/dist/server/ws.js.map +1 -1
- package/package.json +11 -8
- package/src/app/beacons/[name]/beacon-detail.tsx +253 -0
- package/src/app/beacons/[name]/page.tsx +6 -0
- package/src/app/beacons/page.tsx +98 -0
- package/src/app/components/shell.tsx +24 -0
- package/src/app/components/status-badge.tsx +13 -1
- package/src/app/environment/page.tsx +415 -0
- package/src/app/globals.css +48 -0
- package/src/app/hooks/use-api.ts +80 -0
- package/src/config/schema.ts +21 -0
- package/src/index.ts +12 -0
- package/src/server/auth/keys.ts +50 -5
- package/src/server/auth/session.ts +38 -11
- package/src/server/index.ts +144 -18
- package/src/server/metadata.ts +2 -0
- package/src/server/middleware/rate-limit.ts +20 -1
- package/src/server/routes/beacons.ts +112 -0
- package/src/server/routes/broadcasts.ts +6 -2
- package/src/server/routes/runs.ts +20 -67
- package/src/server/routes/signals.ts +17 -13
- package/src/server/routes/v1/env.ts +144 -0
- package/src/server/routes/v1/events.ts +2 -2
- package/src/server/routes/v1/runs.ts +11 -35
- package/src/server/sse.ts +7 -2
- package/src/server/subscriber.ts +111 -0
- package/src/server/ws.ts +38 -4
- package/.next/standalone/packages/station-kit/.next/static/THKSkCipW_pj0F6DRXYEG/_buildManifest.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/285-ff198f0a909c4fdd.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/561-33d912169940283e.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/broadcasts/dyn/[name]/v/[n]/page-5eac0507f49a00ec.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/broadcasts/page-dee500ccc01f0821.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/layout-e14e14f3e5b0b8a9.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/page-aac41ef7a470daab.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/playground/expression/page-dc9d91f3f50f4716.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/runs/[id]/page-9e4c4f751a4bea72.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/schedules/page-738d98dc0b63166e.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/settings/page-fc5654b31f57ac21.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/signals/[name]/page-4b1c09a539a1ebcd.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/chunks/app/signals/page-d2f2403dfede87cc.js +0 -1
- package/.next/standalone/packages/station-kit/.next/static/css/0be0e65a5f561f37.css +0 -1
- /package/.next/standalone/packages/station-kit/.next/static/{THKSkCipW_pj0F6DRXYEG → vTGEzSqxhR_E57YAFn9DC}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { SignalSubscriber, Run, Step } from "station-signal";
|
|
2
2
|
import type { BroadcastSubscriber, BroadcastRun, BroadcastNodeRun } from "station-broadcast";
|
|
3
|
+
import type { BeaconSubscriber, BeaconInstance, ExitReason } from "station-beacon";
|
|
3
4
|
import type { WebSocketHub } from "./ws.js";
|
|
4
5
|
import type { SSEHub } from "./sse.js";
|
|
5
6
|
import type { LogBuffer } from "./log-buffer.js";
|
|
6
7
|
import type { LogStore } from "./log-store.js";
|
|
7
8
|
import { type SignalMeta, type BroadcastMeta } from "./metadata.js";
|
|
9
|
+
/** LogStore/LogBuffer key under which a beacon's log lines are stored. */
|
|
10
|
+
export declare function beaconLogKey(beaconName: string): string;
|
|
8
11
|
export declare class StationSignalSubscriber implements SignalSubscriber {
|
|
9
12
|
private hub;
|
|
10
13
|
private logBuffer?;
|
|
@@ -125,4 +128,57 @@ export declare class StationBroadcastSubscriber implements BroadcastSubscriber {
|
|
|
125
128
|
reason: string;
|
|
126
129
|
}): void;
|
|
127
130
|
}
|
|
131
|
+
export declare class StationBeaconSubscriber implements BeaconSubscriber {
|
|
132
|
+
private hub;
|
|
133
|
+
private logBuffer?;
|
|
134
|
+
private logStore?;
|
|
135
|
+
private sseHub?;
|
|
136
|
+
private discovered;
|
|
137
|
+
constructor(hub: WebSocketHub, logBuffer?: LogBuffer, logStore?: LogStore);
|
|
138
|
+
/** Attach an SSE hub so events are also pushed to SSE clients. */
|
|
139
|
+
setSSEHub(sseHub: SSEHub): void;
|
|
140
|
+
private emit;
|
|
141
|
+
private emitInstance;
|
|
142
|
+
onBeaconDiscovered(event: {
|
|
143
|
+
beaconName: string;
|
|
144
|
+
filePath: string;
|
|
145
|
+
}): void;
|
|
146
|
+
onBeaconStarting(event: {
|
|
147
|
+
instance: BeaconInstance;
|
|
148
|
+
}): void;
|
|
149
|
+
onBeaconStarted(event: {
|
|
150
|
+
instance: BeaconInstance;
|
|
151
|
+
}): void;
|
|
152
|
+
onBeaconReady(event: {
|
|
153
|
+
instance: BeaconInstance;
|
|
154
|
+
}): void;
|
|
155
|
+
onBeaconHeartbeat(event: {
|
|
156
|
+
instance: BeaconInstance;
|
|
157
|
+
}): void;
|
|
158
|
+
onBeaconExited(event: {
|
|
159
|
+
instance: BeaconInstance;
|
|
160
|
+
reason: ExitReason;
|
|
161
|
+
code: number | null;
|
|
162
|
+
}): void;
|
|
163
|
+
onBeaconRestartScheduled(event: {
|
|
164
|
+
instance: BeaconInstance;
|
|
165
|
+
delayMs: number;
|
|
166
|
+
nextRestartAt: Date;
|
|
167
|
+
}): void;
|
|
168
|
+
onBeaconStopped(event: {
|
|
169
|
+
instance: BeaconInstance;
|
|
170
|
+
}): void;
|
|
171
|
+
onBeaconErrored(event: {
|
|
172
|
+
instance: BeaconInstance;
|
|
173
|
+
error?: string;
|
|
174
|
+
}): void;
|
|
175
|
+
onBeaconStalled(event: {
|
|
176
|
+
instance: BeaconInstance;
|
|
177
|
+
}): void;
|
|
178
|
+
onBeaconLog(event: {
|
|
179
|
+
instance: BeaconInstance;
|
|
180
|
+
level: "log" | "stdout" | "stderr";
|
|
181
|
+
message: string;
|
|
182
|
+
}): void;
|
|
183
|
+
}
|
|
128
184
|
//# sourceMappingURL=subscriber.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../../src/server/subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAsB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../../src/server/subscriber.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { isSignal } from "station-signal";
|
|
2
2
|
import { isBroadcast } from "station-broadcast";
|
|
3
3
|
import { serializeZodSchema } from "./metadata.js";
|
|
4
|
+
/** LogStore/LogBuffer key under which a beacon's log lines are stored. */
|
|
5
|
+
export function beaconLogKey(beaconName) {
|
|
6
|
+
return `beacon:${beaconName}`;
|
|
7
|
+
}
|
|
8
|
+
function serializeInstance(inst) {
|
|
9
|
+
return {
|
|
10
|
+
...inst,
|
|
11
|
+
startedAt: inst.startedAt?.toISOString(),
|
|
12
|
+
readyAt: inst.readyAt?.toISOString(),
|
|
13
|
+
lastHeartbeatAt: inst.lastHeartbeatAt?.toISOString(),
|
|
14
|
+
lastExitAt: inst.lastExitAt?.toISOString(),
|
|
15
|
+
nextRestartAt: inst.nextRestartAt?.toISOString(),
|
|
16
|
+
createdAt: inst.createdAt?.toISOString(),
|
|
17
|
+
updatedAt: inst.updatedAt?.toISOString(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
4
20
|
function serializeRun(run) {
|
|
5
21
|
return {
|
|
6
22
|
...run,
|
|
@@ -72,6 +88,7 @@ export class StationSignalSubscriber {
|
|
|
72
88
|
maxConcurrency: sig.maxConcurrency ?? null,
|
|
73
89
|
hasSteps: Array.isArray(sig.steps) && sig.steps.length > 0,
|
|
74
90
|
stepNames: sig.steps?.map((s) => s.name) ?? [],
|
|
91
|
+
requiredEnv: Array.isArray(sig.requiredEnv) ? sig.requiredEnv : [],
|
|
75
92
|
});
|
|
76
93
|
break;
|
|
77
94
|
}
|
|
@@ -243,4 +260,81 @@ export class StationBroadcastSubscriber {
|
|
|
243
260
|
});
|
|
244
261
|
}
|
|
245
262
|
}
|
|
263
|
+
export class StationBeaconSubscriber {
|
|
264
|
+
hub;
|
|
265
|
+
logBuffer;
|
|
266
|
+
logStore;
|
|
267
|
+
sseHub;
|
|
268
|
+
discovered = new Map();
|
|
269
|
+
constructor(hub, logBuffer, logStore) {
|
|
270
|
+
this.hub = hub;
|
|
271
|
+
this.logBuffer = logBuffer;
|
|
272
|
+
this.logStore = logStore;
|
|
273
|
+
}
|
|
274
|
+
/** Attach an SSE hub so events are also pushed to SSE clients. */
|
|
275
|
+
setSSEHub(sseHub) {
|
|
276
|
+
this.sseHub = sseHub;
|
|
277
|
+
}
|
|
278
|
+
emit(type, data) {
|
|
279
|
+
const event = { type, timestamp: new Date().toISOString(), data };
|
|
280
|
+
this.hub.broadcast(event);
|
|
281
|
+
this.sseHub?.broadcast(event);
|
|
282
|
+
}
|
|
283
|
+
emitInstance(type, inst, extra) {
|
|
284
|
+
this.emit(type, { instance: serializeInstance(inst), ...extra });
|
|
285
|
+
}
|
|
286
|
+
onBeaconDiscovered(event) {
|
|
287
|
+
this.discovered.set(event.beaconName, event);
|
|
288
|
+
this.emit("beacon:discovered", event);
|
|
289
|
+
}
|
|
290
|
+
onBeaconStarting(event) {
|
|
291
|
+
this.emitInstance("beacon:starting", event.instance);
|
|
292
|
+
}
|
|
293
|
+
onBeaconStarted(event) {
|
|
294
|
+
this.emitInstance("beacon:started", event.instance);
|
|
295
|
+
}
|
|
296
|
+
onBeaconReady(event) {
|
|
297
|
+
this.emitInstance("beacon:ready", event.instance);
|
|
298
|
+
}
|
|
299
|
+
onBeaconHeartbeat(event) {
|
|
300
|
+
this.emitInstance("beacon:heartbeat", event.instance);
|
|
301
|
+
}
|
|
302
|
+
onBeaconExited(event) {
|
|
303
|
+
this.emitInstance("beacon:exited", event.instance, { reason: event.reason, code: event.code });
|
|
304
|
+
}
|
|
305
|
+
onBeaconRestartScheduled(event) {
|
|
306
|
+
this.emitInstance("beacon:restart-scheduled", event.instance, {
|
|
307
|
+
delayMs: event.delayMs,
|
|
308
|
+
nextRestartAt: event.nextRestartAt.toISOString(),
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
onBeaconStopped(event) {
|
|
312
|
+
this.emitInstance("beacon:stopped", event.instance);
|
|
313
|
+
}
|
|
314
|
+
onBeaconErrored(event) {
|
|
315
|
+
this.emitInstance("beacon:errored", event.instance, { error: event.error ?? "" });
|
|
316
|
+
}
|
|
317
|
+
onBeaconStalled(event) {
|
|
318
|
+
this.emitInstance("beacon:stalled", event.instance);
|
|
319
|
+
}
|
|
320
|
+
onBeaconLog(event) {
|
|
321
|
+
const timestamp = new Date().toISOString();
|
|
322
|
+
const entry = {
|
|
323
|
+
runId: beaconLogKey(event.instance.beaconName),
|
|
324
|
+
signalName: event.instance.beaconName,
|
|
325
|
+
level: event.level === "stderr" ? "stderr" : "stdout",
|
|
326
|
+
message: event.message,
|
|
327
|
+
timestamp,
|
|
328
|
+
};
|
|
329
|
+
this.logBuffer?.add(entry);
|
|
330
|
+
this.logStore?.add(entry);
|
|
331
|
+
this.emit("beacon:log", {
|
|
332
|
+
beaconName: event.instance.beaconName,
|
|
333
|
+
incarnation: event.instance.incarnation,
|
|
334
|
+
level: event.level,
|
|
335
|
+
message: event.message,
|
|
336
|
+
timestamp,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
}
|
|
246
340
|
//# sourceMappingURL=subscriber.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../src/server/subscriber.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"subscriber.js","sourceRoot":"","sources":["../../src/server/subscriber.ts"],"names":[],"mappings":"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"}
|
package/dist/server/ws.d.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
import type { Server } from "node:http";
|
|
1
|
+
import type { IncomingMessage, Server } from "node:http";
|
|
2
2
|
export interface StationEvent {
|
|
3
3
|
type: string;
|
|
4
4
|
timestamp: string;
|
|
5
5
|
data: Record<string, unknown>;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Async guard run before completing a WebSocket upgrade. Return false to
|
|
9
|
+
* reject with 401. Event payloads include run inputs/outputs and full job
|
|
10
|
+
* logs, so the stream must enforce the same auth as the HTTP API.
|
|
11
|
+
*/
|
|
12
|
+
export type WsVerifyFn = (req: IncomingMessage) => Promise<boolean> | boolean;
|
|
7
13
|
export declare class WebSocketHub {
|
|
8
14
|
private wss;
|
|
9
15
|
private clients;
|
|
10
|
-
attach(server: Server): void;
|
|
16
|
+
attach(server: Server, verify?: WsVerifyFn): void;
|
|
11
17
|
get clientCount(): number;
|
|
12
18
|
broadcast(event: StationEvent): void;
|
|
13
19
|
close(): void;
|
package/dist/server/ws.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/server/ws.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/server/ws.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAE9E,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,OAAO,CAAwB;IAEvC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI;IAyCjD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IASpC,KAAK,IAAI,IAAI;CAGd"}
|
package/dist/server/ws.js
CHANGED
|
@@ -2,9 +2,13 @@ import { WebSocketServer, WebSocket } from "ws";
|
|
|
2
2
|
export class WebSocketHub {
|
|
3
3
|
wss = null;
|
|
4
4
|
clients = new Set();
|
|
5
|
-
attach(server) {
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
attach(server, verify) {
|
|
6
|
+
// noServer + manual upgrade handling: the `ws` path-matching shortcut
|
|
7
|
+
// would complete the handshake before any auth check could run (Hono
|
|
8
|
+
// middleware never sees upgrade requests).
|
|
9
|
+
const wss = new WebSocketServer({ noServer: true });
|
|
10
|
+
this.wss = wss;
|
|
11
|
+
wss.on("connection", (ws) => {
|
|
8
12
|
this.clients.add(ws);
|
|
9
13
|
ws.on("close", () => {
|
|
10
14
|
this.clients.delete(ws);
|
|
@@ -13,6 +17,27 @@ export class WebSocketHub {
|
|
|
13
17
|
this.clients.delete(ws);
|
|
14
18
|
});
|
|
15
19
|
});
|
|
20
|
+
server.on("upgrade", async (req, socket, head) => {
|
|
21
|
+
const pathname = new URL(req.url ?? "", "http://localhost").pathname;
|
|
22
|
+
if (pathname !== "/api/events") {
|
|
23
|
+
socket.destroy();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
if (verify && !(await verify(req))) {
|
|
28
|
+
socket.write("HTTP/1.1 401 Unauthorized\r\nConnection: close\r\n\r\n");
|
|
29
|
+
socket.destroy();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
socket.destroy();
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
38
|
+
wss.emit("connection", ws, req);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
16
41
|
}
|
|
17
42
|
get clientCount() {
|
|
18
43
|
return this.clients.size;
|
package/dist/server/ws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/server/ws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/server/ws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAgBhD,MAAM,OAAO,YAAY;IACf,GAAG,GAA2B,IAAI,CAAC;IACnC,OAAO,GAAG,IAAI,GAAG,EAAa,CAAC;IAEvC,MAAM,CAAC,MAAc,EAAE,MAAmB;QACxC,sEAAsE;QACtE,qEAAqE;QACrE,2CAA2C;QAC3C,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAa,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;YACrE,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC/B,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,MAAM,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACnC,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;oBACvE,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAC1C,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,KAAmB;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;IACpB,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "station-kit",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Dashboard for station-signal — inspect and control signals and broadcasts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -30,8 +30,9 @@
|
|
|
30
30
|
"tsconfig.next.json"
|
|
31
31
|
],
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"station-
|
|
34
|
-
"station-
|
|
33
|
+
"station-beacon": "2.0.0",
|
|
34
|
+
"station-broadcast": "2.0.0",
|
|
35
|
+
"station-signal": "2.0.0"
|
|
35
36
|
},
|
|
36
37
|
"dependencies": {
|
|
37
38
|
"@hono/node-server": "^1",
|
|
@@ -42,8 +43,9 @@
|
|
|
42
43
|
"react-dom": "^19",
|
|
43
44
|
"tsx": "^4.21.0",
|
|
44
45
|
"ws": "^8",
|
|
45
|
-
"station-
|
|
46
|
-
"station-schedules": "
|
|
46
|
+
"station-env": "2.0.0",
|
|
47
|
+
"station-schedules": "2.0.0",
|
|
48
|
+
"station-expressions": "2.0.0"
|
|
47
49
|
},
|
|
48
50
|
"devDependencies": {
|
|
49
51
|
"@types/node": "^25.3.0",
|
|
@@ -52,9 +54,10 @@
|
|
|
52
54
|
"@types/ws": "^8",
|
|
53
55
|
"better-sqlite3": "^11.9.1",
|
|
54
56
|
"typescript": "^5.9.3",
|
|
55
|
-
"station-
|
|
56
|
-
"station-
|
|
57
|
-
"station-
|
|
57
|
+
"station-adapter-sqlite": "2.0.0",
|
|
58
|
+
"station-beacon": "2.0.0",
|
|
59
|
+
"station-signal": "2.0.0",
|
|
60
|
+
"station-broadcast": "2.0.0"
|
|
58
61
|
},
|
|
59
62
|
"scripts": {
|
|
60
63
|
"build": "tsc && next build && cp -r .next/static .next/standalone/packages/station-kit/.next/static",
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
import { useApi, type BeaconListItem, type BeaconEvent } from "../../hooks/use-api";
|
|
5
|
+
import { useStation } from "../../hooks/use-station";
|
|
6
|
+
import { useBreadcrumb } from "../../hooks/use-breadcrumb";
|
|
7
|
+
import { StatusBadge } from "../../components/status-badge";
|
|
8
|
+
import { JsonViewer } from "../../components/json-viewer";
|
|
9
|
+
|
|
10
|
+
interface LogEntry {
|
|
11
|
+
level: string;
|
|
12
|
+
message: string;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function fmt(v?: string): string {
|
|
17
|
+
return v ? new Date(v).toLocaleString() : "—";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function BeaconDetail({ name }: { name: string }) {
|
|
21
|
+
const api = useApi();
|
|
22
|
+
const { events } = useStation();
|
|
23
|
+
const [item, setItem] = useState<BeaconListItem | null>(null);
|
|
24
|
+
const [beaconEvents, setBeaconEvents] = useState<BeaconEvent[]>([]);
|
|
25
|
+
const [logs, setLogs] = useState<LogEntry[]>([]);
|
|
26
|
+
const [loading, setLoading] = useState(true);
|
|
27
|
+
const [busy, setBusy] = useState<null | "start" | "stop" | "restart">(null);
|
|
28
|
+
const logEndRef = useRef<HTMLDivElement>(null);
|
|
29
|
+
|
|
30
|
+
useBreadcrumb(
|
|
31
|
+
[{ label: "Beacons", href: "/beacons" }, { label: name }],
|
|
32
|
+
"beacons",
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
async function load() {
|
|
37
|
+
try {
|
|
38
|
+
const [b, ev, lg] = await Promise.all([
|
|
39
|
+
api.getBeacon(name),
|
|
40
|
+
api.getBeaconEvents(name),
|
|
41
|
+
api.getBeaconLogs(name),
|
|
42
|
+
]);
|
|
43
|
+
setItem(b.data);
|
|
44
|
+
setBeaconEvents(ev.data);
|
|
45
|
+
setLogs(lg.data.map((l) => ({ level: l.level, message: l.message, timestamp: l.timestamp })));
|
|
46
|
+
} catch (err: unknown) {
|
|
47
|
+
if (err instanceof Error) console.error("Failed to load beacon:", err.message);
|
|
48
|
+
}
|
|
49
|
+
setLoading(false);
|
|
50
|
+
}
|
|
51
|
+
load();
|
|
52
|
+
}, [name]);
|
|
53
|
+
|
|
54
|
+
// Live updates: append logs, reconcile instance + event timeline from WS.
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (events.length === 0) return;
|
|
57
|
+
const latest = events[0];
|
|
58
|
+
if (!latest.type.startsWith("beacon:")) return;
|
|
59
|
+
if (latest.type === "beacon:log") {
|
|
60
|
+
const d = latest.data as Record<string, unknown>;
|
|
61
|
+
if (d.beaconName !== name) return;
|
|
62
|
+
setLogs((prev) => [...prev, {
|
|
63
|
+
level: (d.level as string) ?? "stdout",
|
|
64
|
+
message: (d.message as string) ?? "",
|
|
65
|
+
timestamp: (d.timestamp as string) ?? latest.timestamp,
|
|
66
|
+
}]);
|
|
67
|
+
} else {
|
|
68
|
+
const inst = (latest.data as Record<string, unknown>).instance as BeaconListItem["instance"] | undefined;
|
|
69
|
+
if (!inst || inst.beaconName !== name) return;
|
|
70
|
+
setItem((prev) => (prev ? { ...prev, instance: inst } : prev));
|
|
71
|
+
api.getBeaconEvents(name).then((r) => setBeaconEvents(r.data)).catch(() => {});
|
|
72
|
+
}
|
|
73
|
+
}, [events.length, name]);
|
|
74
|
+
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
logEndRef.current?.scrollIntoView({ behavior: "smooth" });
|
|
77
|
+
}, [logs.length]);
|
|
78
|
+
|
|
79
|
+
async function control(action: "start" | "stop" | "restart") {
|
|
80
|
+
setBusy(action);
|
|
81
|
+
try {
|
|
82
|
+
if (action === "start") await api.startBeacon(name);
|
|
83
|
+
else if (action === "stop") await api.stopBeacon(name);
|
|
84
|
+
else await api.restartBeacon(name);
|
|
85
|
+
const [b, ev] = await Promise.all([api.getBeacon(name), api.getBeaconEvents(name)]);
|
|
86
|
+
setItem(b.data);
|
|
87
|
+
setBeaconEvents(ev.data);
|
|
88
|
+
} catch (err: unknown) {
|
|
89
|
+
if (err instanceof Error) console.error(`${action} failed:`, err.message);
|
|
90
|
+
}
|
|
91
|
+
setBusy(null);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (loading) {
|
|
95
|
+
return (
|
|
96
|
+
<div>
|
|
97
|
+
<h1 className="page-title">Beacon</h1>
|
|
98
|
+
<div className="loading-bar"><div className="loading-bar-fill" /></div>
|
|
99
|
+
</div>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!item) {
|
|
104
|
+
return (
|
|
105
|
+
<div>
|
|
106
|
+
<h1 className="page-title">Beacon</h1>
|
|
107
|
+
<div className="empty-state">
|
|
108
|
+
<p className="empty-state-text">Beacon not found.</p>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const inst = item.instance;
|
|
115
|
+
const canStart = !inst || inst.desiredState === "stopped" || inst.status === "errored" || inst.status === "stopped";
|
|
116
|
+
const canStop = !!inst && inst.desiredState === "running" && inst.status !== "stopped" && inst.status !== "errored";
|
|
117
|
+
const canRestart = !!inst && (inst.status === "running" || inst.status === "starting");
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<div>
|
|
121
|
+
<div className="page-header">
|
|
122
|
+
<div style={{ display: "flex", alignItems: "center", gap: "0.75rem" }}>
|
|
123
|
+
{inst && <StatusBadge status={inst.status} />}
|
|
124
|
+
<h1 className="page-title" style={{ marginBottom: 0 }}>{name}</h1>
|
|
125
|
+
</div>
|
|
126
|
+
<div className="page-header-actions">
|
|
127
|
+
<button className="btn btn--primary" onClick={() => control("start")} disabled={!canStart || busy !== null}>
|
|
128
|
+
{busy === "start" ? "Starting..." : "Start"}
|
|
129
|
+
</button>
|
|
130
|
+
<button className="btn" onClick={() => control("restart")} disabled={!canRestart || busy !== null}>
|
|
131
|
+
{busy === "restart" ? "Restarting..." : "Restart"}
|
|
132
|
+
</button>
|
|
133
|
+
<button className="btn btn--danger" onClick={() => control("stop")} disabled={!canStop || busy !== null}>
|
|
134
|
+
{busy === "stop" ? "Stopping..." : "Stop"}
|
|
135
|
+
</button>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<div className="detail-section">
|
|
140
|
+
<div className="detail-section-label">Metadata</div>
|
|
141
|
+
<div className="detail-grid">
|
|
142
|
+
<span className="detail-label">Status</span>
|
|
143
|
+
<span className="detail-value">{inst ? <StatusBadge status={inst.status} /> : "—"}</span>
|
|
144
|
+
|
|
145
|
+
<span className="detail-label">Desired</span>
|
|
146
|
+
<span className="detail-value mono">{inst?.desiredState ?? "—"}</span>
|
|
147
|
+
|
|
148
|
+
<span className="detail-label">Mode</span>
|
|
149
|
+
<span className="detail-value">{item.mode}</span>
|
|
150
|
+
|
|
151
|
+
<span className="detail-label">Restart policy</span>
|
|
152
|
+
<span className="detail-value mono">{item.restartPolicy}</span>
|
|
153
|
+
|
|
154
|
+
<span className="detail-label">Auto-start</span>
|
|
155
|
+
<span className="detail-value mono">{String(item.autoStart)}</span>
|
|
156
|
+
|
|
157
|
+
<span className="detail-label">Incarnation</span>
|
|
158
|
+
<span className="detail-value mono">{inst?.incarnation ?? 0}</span>
|
|
159
|
+
|
|
160
|
+
<span className="detail-label">Restart count</span>
|
|
161
|
+
<span className="detail-value mono">{inst?.restartCount ?? 0}</span>
|
|
162
|
+
|
|
163
|
+
<span className="detail-label">PID</span>
|
|
164
|
+
<span className="detail-value mono">{inst?.pid ?? "—"}</span>
|
|
165
|
+
|
|
166
|
+
<span className="detail-label">Started</span>
|
|
167
|
+
<span className="detail-value mono">{fmt(inst?.startedAt)}</span>
|
|
168
|
+
|
|
169
|
+
<span className="detail-label">Ready</span>
|
|
170
|
+
<span className="detail-value mono">{fmt(inst?.readyAt)}</span>
|
|
171
|
+
|
|
172
|
+
<span className="detail-label">Last heartbeat</span>
|
|
173
|
+
<span className="detail-value mono">{fmt(inst?.lastHeartbeatAt)}</span>
|
|
174
|
+
|
|
175
|
+
<span className="detail-label">Last exit</span>
|
|
176
|
+
<span className="detail-value mono">
|
|
177
|
+
{inst?.lastExitReason ? `${inst.lastExitReason} @ ${fmt(inst.lastExitAt)}` : "—"}
|
|
178
|
+
</span>
|
|
179
|
+
|
|
180
|
+
<span className="detail-label">Next restart</span>
|
|
181
|
+
<span className="detail-value mono">{fmt(inst?.nextRestartAt)}</span>
|
|
182
|
+
|
|
183
|
+
<span className="detail-label">File</span>
|
|
184
|
+
<span className="detail-value mono" style={{ fontSize: "0.75rem", color: "var(--muted)" }}>{item.filePath}</span>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
{inst?.lastError && (
|
|
189
|
+
<div className="detail-section">
|
|
190
|
+
<div className="detail-section-label">Last error</div>
|
|
191
|
+
<div className="error-block">{inst.lastError}</div>
|
|
192
|
+
</div>
|
|
193
|
+
)}
|
|
194
|
+
|
|
195
|
+
<div className="detail-section">
|
|
196
|
+
<div className="detail-section-label">Config</div>
|
|
197
|
+
<JsonViewer data={inst?.config ?? "{}"} />
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
<div className="detail-section">
|
|
201
|
+
<div className="detail-section-label">Lifecycle events</div>
|
|
202
|
+
{beaconEvents.length === 0 ? (
|
|
203
|
+
<div className="empty-state"><p className="empty-state-text">No events recorded.</p></div>
|
|
204
|
+
) : (
|
|
205
|
+
<table className="station-table">
|
|
206
|
+
<thead>
|
|
207
|
+
<tr>
|
|
208
|
+
<th>Event</th>
|
|
209
|
+
<th>Incarnation</th>
|
|
210
|
+
<th>Detail</th>
|
|
211
|
+
<th>Time</th>
|
|
212
|
+
</tr>
|
|
213
|
+
</thead>
|
|
214
|
+
<tbody>
|
|
215
|
+
{beaconEvents.map((e) => (
|
|
216
|
+
<tr key={e.id}>
|
|
217
|
+
<td className="mono" style={{ fontSize: "0.8125rem" }}>{e.type}</td>
|
|
218
|
+
<td className="mono" style={{ fontSize: "0.8125rem" }}>{e.incarnation}</td>
|
|
219
|
+
<td style={{ color: "var(--muted)", fontSize: "0.8125rem" }}>{e.message ?? "—"}</td>
|
|
220
|
+
<td className="mono" style={{ fontSize: "0.8125rem", color: "var(--muted)" }}>{fmt(e.at)}</td>
|
|
221
|
+
</tr>
|
|
222
|
+
))}
|
|
223
|
+
</tbody>
|
|
224
|
+
</table>
|
|
225
|
+
)}
|
|
226
|
+
</div>
|
|
227
|
+
|
|
228
|
+
<div className="detail-section">
|
|
229
|
+
<div className="detail-section-label">Logs</div>
|
|
230
|
+
<div className="log-container">
|
|
231
|
+
{logs.length === 0 ? (
|
|
232
|
+
<div style={{ padding: "1rem", color: "var(--muted)", fontFamily: "var(--font-mono)", fontSize: "0.75rem" }}>
|
|
233
|
+
No log output captured.
|
|
234
|
+
</div>
|
|
235
|
+
) : (
|
|
236
|
+
logs.map((log, i) => (
|
|
237
|
+
<div
|
|
238
|
+
key={i}
|
|
239
|
+
className="log-line"
|
|
240
|
+
style={{ color: log.level === "stderr" ? "var(--rust)" : "var(--charcoal)" }}
|
|
241
|
+
>
|
|
242
|
+
<span className="log-timestamp">{new Date(log.timestamp).toLocaleTimeString()}</span>
|
|
243
|
+
<span className="log-level" data-level={log.level}>{log.level === "stderr" ? "ERR" : "OUT"}</span>
|
|
244
|
+
<span className="log-message">{log.message}</span>
|
|
245
|
+
</div>
|
|
246
|
+
))
|
|
247
|
+
)}
|
|
248
|
+
<div ref={logEndRef} />
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
);
|
|
253
|
+
}
|