feat(sessions): SessionAdapter — REST CRUD for sessions/milestones/episodes #51

Merged
rock merged 1 commits from harness/50-sessions-adapter into main 2026-09-28 01:53:21 +00:00
Owner

Closes #50

Changes

  • internal/sessions/handler.go — new Handler; 7 endpoints dispatched via X-Upstream-Path; writes to poimen-memory via /memory/ingest; reads from poimen-graphql via GraphQL hybridSearch/entity
  • internal/serviceadapter/session_adapter.go — NewSessionAdapter() + GetSessionSpec() with 5 resources
  • cmd/gateway/main.go — register sessions adapter after memory adapter
  • internal/serviceadapter/adapters.go — add sessions case to factory
  • internal/sessions/handler_test.go — 30 tests, all pass

Design

  • X-Service: sessions + X-Resource: <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 (injection-safe)
  • tracing.NewTransport wired for cross-service trace propagation
  • GraphQL errors array detected, surfaced as 502
  • limit capped at 200
Closes #50 ## Changes - `internal/sessions/handler.go` — new Handler; 7 endpoints dispatched via `X-Upstream-Path`; writes to `poimen-memory` via `/memory/ingest`; reads from `poimen-graphql` via GraphQL `hybridSearch`/`entity` - `internal/serviceadapter/session_adapter.go` — `NewSessionAdapter()` + `GetSessionSpec()` with 5 resources - `cmd/gateway/main.go` — register sessions adapter after memory adapter - `internal/serviceadapter/adapters.go` — add `sessions` case to factory - `internal/sessions/handler_test.go` — 30 tests, all pass ## Design - `X-Service: sessions` + `X-Resource: <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 (injection-safe) - `tracing.NewTransport` wired for cross-service trace propagation - GraphQL `errors` array detected, surfaced as 502 - limit capped at 200
rock added 1 commit 2026-09-28 01:39:36 +00:00
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
rock merged commit a24e4f7174 into main 2026-09-28 01:53:21 +00:00
rock deleted branch harness/50-sessions-adapter 2026-09-28 01:53:25 +00:00
Sign in to join this conversation.