feat: host detail page + FM host context
CI / Lint · Typecheck · Test · Build (push) Successful in 44s
CI / Playwright (smoke) (push) Has been skipped
CI / Build & push images (push) Successful in 1m5s

Add /hosts/:id detail page with unified timeline (HostEvents + FMs + Repairs
+ part arrivals/departures) and a deployed-parts table. Hosts list rows now
link to the page. FM list + detail surface inline State/Stack badges next
to the asset ID, with the asset ID linking to the host page.

HostEvent audit model added; create/update in the hosts service now diff
and log state, stack, and field changes the same way parts.ts does.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-17 14:04:07 -04:00
parent 60255f20bb
commit b0e9c5d1d0
19 changed files with 1228 additions and 91 deletions
+8
View File
@@ -33,6 +33,14 @@ export const PartEventType = z.enum([
]);
export type PartEventType = z.infer<typeof PartEventType>;
export const HostEventType = z.enum([
'CREATED',
'STATE_CHANGED',
'STACK_CHANGED',
'FIELD_UPDATED',
]);
export type HostEventType = z.infer<typeof HostEventType>;
export const FmStatus = z.enum(['OPEN', 'CLOSED']);
export type FmStatus = z.infer<typeof FmStatus>;
+5
View File
@@ -0,0 +1,5 @@
import { z } from 'zod';
import { PaginationQuery } from './pagination.js';
export const HostTimelineQuery = PaginationQuery;
export type HostTimelineQuery = z.infer<typeof HostTimelineQuery>;
+1
View File
@@ -8,6 +8,7 @@ export * from './parts.js';
export * from './env.js';
export * from './pagination.js';
export * from './hosts.js';
export * from './host-events.js';
export * from './fms.js';
export * from './repairs.js';
export * from './custody.js';