New internal/sessions package with Handler bridging 7 REST endpoints to:
- POST /memory/ingest on poimen-memory:8080 (writes)
- GraphQL hybridSearch/entity on poimen-graphql:8090 (reads)
Adapter registration: X-Service: sessions with resources sessions,
session, milestones, episodes, episode. IDs via query params
(?session_id=, ?episode_id=) — dispatcher does not substitute path params.
episode_id = sha256(session_id+milestone_id+attempt) per §4.14 Q6.
Content JSON-encoded (prevents key:value injection on user fields).
Limit capped at 200. GraphQL error body detected and surfaced as 502.
tracing.NewTransport wired for cross-service trace propagation.
JWT forwarded to both upstreams for auth.
30 tests in handler_test.go covering all 7 handlers + EpisodeID helper.
Closes#50
- New internal/temporal/poimen.go: PoimenHandler with typed REST endpoints
POST /v1/poimen/plan — call PlannerActivity (stub until workflows#23)
POST /v1/poimen/execute — start DAG/Orchestrator/Routing workflows
GET /v1/poimen/executions — list Poimen workflow executions
GET /v1/poimen/executions/:id — describe execution
GET /v1/poimen/executions/:id/history — activity event history
GET /v1/poimen/executions/:id/stream — SSE events (delegates to sse.go)
POST /v1/poimen/executions/:id/signal — pause/resume/cancel
DELETE /v1/poimen/executions/:id — terminate workflow
- New internal/serviceadapter/poimen_adapter.go: ServiceAdapter spec + factory
- Wire PoimenHandler in cmd/gateway/main.go via ServiceAdapter registry
- Workflow type registry: dag->DAGWorkflow, orchestrator->OrchestratorWorkflow,
routing->RoutingWorkflow (all on poimen-worker task queue)
Closes#32Closes#34
Config-loaded adapters (from gateway-config-secret.yaml) were overwriting
code-registered workflow adapter that has internal Handler for JSON-to-gRPC
translation. Now skips config adapters if serviceName already registered.
- Add internal/tracing package with OTel tracer initialization
- HTTP middleware for server-side tracing (request/response attributes)
- Transport wrapper for client-side upstream call tracing
- Update proxy to use tracing transport
- Add OTEL_* env vars to k8s deployment
Traces flow: api-gateway -> otel-collector -> tempo -> grafana
Adapters defined in config.yaml alongside routes and models.
Parsed by existing config loader, populated into registry at startup.
Removed: client-go deps, REST loader, informer, nginx proxy,
CiliumNetworkPolicy, apis/gateway/v1/ (duplicate types).
Kept: merged CI pipeline, imagePullPolicy Always, CA certs in Dockerfile.
- 2.3: unknown model errors (400 + RFC 9457 problem+json with valid_models)
- 2.5: GET /v1/models endpoint (derived from config, not hardcoded)
- 2.6: POST /v1/embeddings passthrough (body-based dispatch, no rewrite)
- 2.7: POST /v1/rerank with path rewrite (/v1/rerank → /rerank)
- wire proxy.Handler in main.go (was using dummy handler)
- 140+ tests passing, race detector clean
- all requests: client → nginx → gateway → upstreams
- ready for config deployment to go live
Baseline for the Kong replacement on api.riotpiao.com. Brings the working
tree under version control for the first time: gateway source, the task
board that drives the agent runs, test fixtures, and K8s manifests.
Anchor the gateway ignore rule to the repo root. Unanchored, "gateway"
also matched the cmd/gateway/ source directory, so the program entrypoint
was excluded from every commit.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>