Split the shared data types out of core/pipeline
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- Go
- Stelle
- 21
- Fork
- 43
- Merge medio
- 14h 26m
- PR unite (30g)
- 239
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di rossoctl/cortex
-
UI shows costs for all sessions even when drilled into a sessionForse già presa @esnible l’ha presa 14 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
rossoctl/cortex#1116 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
agentop configure codex/opencode can wait on itself when an agent runs itForse già presa @Alan-Cha l’ha presa oggi. Aperta
rossoctl/cortex#1530 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
I maintainer di solito rispondono entro 1 giorno
-
WebSocket turns carry only new input, so conversation-level plugins see less of a Codex sessionForse già presa @Alan-Cha l’ha presa 1 giorno fa. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
rossoctl/cortex#1515 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement laptop
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di rossoctl/cortex
Issue simili
-
VLAgent `spec.k8sCollector.includePodLabels: false` has no effectForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
VictoriaMetrics/operator#2772 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
Gaurav-Gosain/tuios#1316 ·
I maintainer di solito rispondono entro 1 giorno
-
area:auth documentation priority:low
Difficoltà 1/5 1-3 ore Idoneità per principianti 86/100
I maintainer di solito rispondono entro 1 giorno
-
Mend: dependency security vulnerability
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
kube-tarian/sigrun#203 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
kubernetes-csi/csi-driver-iscsi#485 ·
I maintainer di solito rispondono entro 1 giorno