Files
suaveplan/openspec/changes/enterprise-api-plugin-port-tracking/proposal.md
2026-05-27 23:29:53 +01:00

2.8 KiB

OpenSpec Change: enterprise-api-plugin-port-tracking

  • Change ID: enterprise-api-plugin-port-tracking
  • Package: @suaveplan/api-plugin-port-tracking
  • Category: api/logistics
  • Target path: api/logistics/api-plugin-port-tracking
  • Status: PROPOSED
  • Date: 2026-04-24
  • Reference spec: /mnt/s/web/suaveplan/enterprise/api-plugin-port-tracking.md

Summary

Deliver @suaveplan/api-plugin-port-tracking on the genesis branch from scratch at enterprise quality. Maritime port and vessel tracking plugin: vessel position (AIS data ingestion via pluggable AisAdapter), port arrival/departure tracking, berth scheduling, cargo manifest management, estimated-time-of-arrival (ETA) calculations, and integration with @suaveplan/api-plugin-logistics for sea-freight shipment correlation. Routes under /port-tracking. Per-table SurrealQL. Events: port:vessel:arrived, port:vessel:departed, port:ais:update.


Available workspace deps on genesis

Package Role
@suaveplan/api (workspace:^) definePlugin
@suaveplan/api-shared (workspace:^) Helpers
@suaveplan/api-plugin-auth (workspace:^) requireAuth
@suaveplan/api-plugin-database (workspace:^) SurrealDB
@suaveplan/api-plugin-logistics (workspace:^) Shipment correlation
@suaveplan/datetime (workspace:^) ETA calculations
@suaveplan/events (workspace:^) Event bus
@suaveplan/error (workspace:^) PortTrackingError hierarchy
hono + @hono/zod-openapi + zod Routes
@opentelemetry/api OTel

Public API surface

function createPortTrackingPlugin(aisAdapter?: AisAdapter, config?: PortTrackingConfig): PluginDescriptor

interface AisAdapter {
  getVesselPosition(mmsi: string): Promise<VesselPosition>
  subscribePositionUpdates(mmsi: string, callback: (pos: VesselPosition) => void): () => void
}

// Routes: GET /port-tracking/vessels/:mmsi, GET /port-tracking/ports/:portCode,
//         GET /port-tracking/ports/:portCode/arrivals, GET /port-tracking/manifests/:id

Error codes

type PortTrackingErrorCode =
  | "PORT_VESSEL_NOT_FOUND"
  | "PORT_AIS_UNAVAILABLE"
  | "PORT_CODE_NOT_FOUND"
  | "PORT_BERTH_CONFLICT"

File layout

api/logistics/api-plugin-port-tracking/
  package.json  tsconfig.json  vitest.config.ts
  surql/ (vessel, port, berth, arrival, cargo_manifest tables)
  src/
    index.ts  events.ts  types/  errors/
    adapters/ais.port.ts
    services/vessel/  services/port/  services/berth/  services/manifest/  services/eta/
    routes/port-tracking/
  tests/integration.test.ts

Impact

Prerequisites: @suaveplan/api, @suaveplan/api-plugin-auth, @suaveplan/api-plugin-database, @suaveplan/api-plugin-logistics, @suaveplan/datetime.