Split the shared data types out of core/pipeline
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 35/100
Piste de recherche
Start by reading the listed data files in core/pipeline, especially extensions.go, session.go, promptcontext.go, client.go, and context.go, then trace their imports into core/session and core/cost/event. The issue leaves package boundaries and the transition strategy open, so settle those design questions before moving types. Done means the named session and cost packages build without importing core/pipeline and go test ./... passes in every module.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Part of #1437 (assessment: laptop data plane on Praxis) · prep work, useful to Cortex on its own
Status: there is no shipped Cortex–Praxis integration today (the paused
cmd/cortex-praxisconverter is not one), and the interim path is not decided (LLM traffic to praxis-ai as an inference server, or all traffic through Praxis via #1491). This is a refactor with no behaviour change: it is useful to Cortex on its own, and would make a possible move to Praxis easier whichever path is taken.
Problem
core/pipeline (about 6,900 non-blank lines) holds two different things:
- Shared data types: the parsed request (
InferenceExtension,MCPExtension,A2AExtension), the recorded event (SessionEvent),PromptContext,EventClient. - The plugin engine: the request context
Context, actions, plugin capabilities, redirects, the runner.
46 non-test packages import it (39 in core, plus cmd/cortex, cmd/cortex-envoy, four agentop packages and scripts/readme-demo). Several use only the data half directly:
| Package | Uses from core/pipeline directly |
|---|---|
core/cost/pricing |
InferenceExtension only |
core/session/archive |
SessionEvent, RawJSON |
core/cost/usage |
event and parsed-request types, plus the client and agent-name helpers (ParseUserAgent, IsKnownAgent, AgentName, IsControlRune) |
core/cost/ledger |
event types, plus AgentName, IsControlRune, ParseUserAgent, UnknownClientLabel (pipeline.Context appears only in a test) |
But they also reach the engine indirectly:
core/sessionimports pipeline, and returns*pipeline.SessionViewfromView,ViewTailandViewPage. The archive importscore/session(Recorder,History,Interner,SummaryFold), and the ledger imports it for one compile-time check (var _ session.Recorder,writer.go:335).core/cost/eventimports pipeline (event.go:569,:594), and usage and ledger both import it.
So anything that wants to read or store a Cortex event — the session store, the archive, the cost ledger, agentop — pulls in the whole plugin engine with it.
Proposal
Move the data types into their own package (e.g. core/event or core/model) that imports no engine code, and have core/pipeline re-export or import them.
What moves to the data package:
- the parsed-request types,
SessionEventandsessionEventWirewith its JSON (un)marshalling; PromptContext,EventClient, and the client and agent-name helpers inclient.go;Directionand its constants and JSON methods (they live incontext.go:45);SessionViewand its query methods (session.go:675-787): pure data plus filters over events, andcore/sessionreturns it. Alternatively, have the store return[]SessionEventand leaveSessionViewin the engine;SnapshotInferenceandPluginEventSuffix.
What stays in the engine: Context, SetState/GetState (they take *Context), the *Context helpers in snapshot.go, and Extensions.Custom.
Obstacles found (checked by compiling the data files as a standalone package, with no cycle):
extensions.gomixes data withSetState/GetState, so it has to be split.content.go'sFragments()methods implementcapabilities.ContentSource, and methods can't leave their type's package, so the data package importscore/capabilities(a leaf; no cycle).cost/eventalso has to move off pipeline, and ledger'ssession.Recorderassertion move or go.
Also:
- agentop uses some engine symbols too (
ErrorPolicy*,Metric/MetricsProvider), so it won't drop the engine import entirely. - Unused exported
SessionViewmethods (Intents,ToolCalls,ToolResponses,FailedEvents,LastError) are public API; keep them.
This should land before #1503 and #1504, so their libraries and decision cores can depend on the data package instead of the engine.
Design questions
- One data package, or one per concern (
inference,event,client)? - Type aliases in
core/pipelinefor a transition period, or a single rename across the tree?coreis consumed outside this repo:core/README.mdnames the operator and rossoctl-cli. Today both pin the old module path…/authbridge/authlib, so they break only when they bump, which is a module-path move anyway.- Aliases work for types. Constants and functions need re-declared wrappers.
Done when
core/session,core/session/archive,core/cost/eventandcore/cost/{ledger,usage,pricing}build without importingcore/pipeline(go list -deps).go test ./...passes in every module with no test changed other than imports.
Evidence read at main @ e455a04 (2026-10-25); not built.
- Langage dominant
- Go
- Étoiles
- 21
- Forks
- 43
- Merge moyen
- 13 h 32 min
- PR mergées (30 j)
- 256
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de rossoctl/cortex
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
UI shows costs for all sessions even when drilled into a sessionPeut-être pris @esnible l’a pris il y a 18 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
rossoctl/cortex#1116 · 2 commentaires · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
CodeQL flags r.Host reaching slog in the forward proxy's debug/warn linesPeut-être pris @evaline-ju l’a pris il y a 2 jours. Ouverte
Difficulté 3/5 Une demi-journée Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 Plus d'une semaine Accessibilité débutants 18/100
Les mainteneurs répondent en général sous 1 jour
-
Cost/session layering: ledger snapshot logic in the HTTP layer; import edges point both waysOuverte
Difficulté 3/5 1-2 jours Accessibilité débutants 45/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de rossoctl/cortex
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
-
Response matcher: a changed integer above 2^53 passes because JSON numbers are compared as float64Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour
-
dec2hex rejects integer literals and accepts string literals in SQLPeut-être pris @NopeCharon l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
enhancement tariffs
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
evcc-io/evcc#35698 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour