Split the shared data types out of core/pipeline
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
调研方向
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.
由索引模型根据 Issue 内容生成。
描述
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.
- 主要语言
- Go
- 星标
- 21
- 派生
- 43
- 平均合并
- 14 小时 25 分钟
- 30 天内合并 PR
- 245
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
rossoctl/cortex 的其他 Issue
-
aiac enhancement
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 80/100
rossoctl/cortex#1546 · 1 条评论 ·
维护者通常 1 天内回复
-
UI shows costs for all sessions even when drilled into a session可能已有人在做 @esnible 于 15 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 70/100
rossoctl/cortex#1116 · 2 条评论 · 已指派 1 人 ·
维护者通常 1 天内回复
-
bug laptop
难度 4/5 3-5 天 新手友好度 42/100
维护者通常 1 天内回复
-
bug: Copied listener and parser code has drifted (hop-by-hop response headers, SSE BOM/CR handling)未关闭bug
难度 4/5 3-5 天 新手友好度 48/100
维护者通常 1 天内回复
相似的 Issue
-
area:web p3
难度 2/5 1-3 小时 新手友好度 72/100
Lets-Parley/Parley#912 ·
维护者通常 1 天内回复
-
enhancement help wanted
难度 2/5 1-3 小时 新手友好度 76/100
Git-Hospital/githealthcheck#61 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
afreidah/s3-orchestrator#1824 ·
维护者通常 1 天内回复
-
Type: Bug
难度 2/5 1-3 小时 新手友好度 72/100
projectdiscovery/notify#569 ·
-
internal
难度 2/5 1-3 小时 新手友好度 70/100
维护者通常 1 天内回复