200 lines
10 KiB
Markdown
200 lines
10 KiB
Markdown
# Codex Auth Spine Inventory
|
|
|
|
This is the keeper list for the vestigial Codex organ. Anything not justified
|
|
here is suspect until proven otherwise. The organ must stay honest: Epiphany is
|
|
a modified Codex-derived backend with a native CultCache/CultNet body, not a
|
|
clean-room client pretending to be Codex.
|
|
|
|
## Compliance Invariant
|
|
|
|
- Keep Codex-compatible auth identity anchored in vendored Codex-derived
|
|
machinery. Do not fully replace Codex auth with a lookalike native
|
|
implementation unless OpenAI provides an explicit public path or permission
|
|
for that use.
|
|
- It is fine to cut Codex apps, skills, marketplace, plugin UX, broad
|
|
app-server workflow, and generic JSON control surfaces. Those are product and
|
|
workflow organs, not subscription-auth legitimacy.
|
|
- The retained auth/model organ should be brutally thin, but it must be real:
|
|
load/refresh credentials, preserve required client headers/identity,
|
|
respect subscription limits, and call the allowed Codex/OpenAI model route.
|
|
|
|
## Live Spine
|
|
|
|
### Inputs
|
|
|
|
- User authentication material from Codex auth storage or an external auth
|
|
provider.
|
|
- Model name and optional endpoint override from Epiphany-owned request/config
|
|
surfaces.
|
|
- Per-turn model request data: prompt instructions, formatted input, tools,
|
|
output schema, reasoning controls, service tier, and model metadata.
|
|
- Session identity: conversation/thread id, installation id, window id,
|
|
session source, optional turn metadata, and optional parent/subagent headers.
|
|
|
|
### Durable Stores
|
|
|
|
- Codex auth storage under the configured Codex home. The legal/compliance
|
|
authority should remain vendored Codex-derived auth machinery such as
|
|
`vendor/codex/codex-rs/login/src/auth/manager.rs`, even when Epiphany wraps
|
|
it in typed status documents.
|
|
- Auth token state in Codex-compatible auth records, including refreshable
|
|
ChatGPT tokens and account metadata.
|
|
- No durable model/provider state is owned by the current OpenAI spine. The
|
|
model string is request data; catalog/default selection must become a typed
|
|
Epiphany document before it can be keeper machinery.
|
|
|
|
### Transformations
|
|
|
|
- `epiphany-openai-codex-spine` imports the narrow auth types and default-client
|
|
construction it needs directly from vendored `codex-login`, without cloning
|
|
env/file/keyring/token-refresh behavior or wrapping re-exports in another crate.
|
|
Subscription credential authority remains in retained Codex-compatible
|
|
machinery; Epiphany owns only the typed status/request/event/runtime surfaces
|
|
around it.
|
|
- `epiphany-openai-codex-spine` converts `CodexAuth` directly into
|
|
authorization/account headers, chooses the ChatGPT Codex backend or OpenAI API
|
|
base URL from auth mode, builds a local serializable Responses request body,
|
|
opens an HTTP/SSE stream through `codex-client`, and parses Responses frames
|
|
into typed Epiphany stream events.
|
|
- `codex-login` remains in `vendor/codex` and should be treated as keeper
|
|
auth machinery or the source for a thin vendored auth organ. Removing it from
|
|
the native request graph may be an overcut if it makes Epiphany look like an
|
|
impersonating client instead of a modified Codex backend.
|
|
|
|
### Outputs
|
|
|
|
- Bearer-authenticated OpenAI/ChatGPT-compatible model calls.
|
|
- Streaming model response events.
|
|
- No compaction/memory/realtime helper calls are part of this spine unless a
|
|
typed Epiphany caller explicitly earns them later.
|
|
- No model catalog or model metadata store is keeper machinery yet.
|
|
- Auth and transport telemetry/errors needed to recover or report failure.
|
|
|
|
## Keep
|
|
|
|
- `codex-login`: keep as the legal authority for Codex-compatible subscription
|
|
credentials. The Epiphany transport imports only its required auth surface.
|
|
- `codex-client`: keep only as a plain HTTP/SSE transport helper for now. It
|
|
does not own Epiphany request shape, model policy, stream semantics, or durable
|
|
state.
|
|
|
|
## Cut Or Seal
|
|
|
|
- Codex app-server routing is not part of auth/model transport. It can host
|
|
compatibility wrappers while Aquarium/CLI still speak JSON-RPC, but it must
|
|
not be the native Epiphany operator surface.
|
|
- Codex apps, skills, marketplace, plugin UX, and MCP OAuth handlers are not
|
|
required for OpenAI subscription compatibility. MCP may survive as a separate
|
|
CultNet adapter, not as a reason to keep the Codex app-server brain.
|
|
- `codex-core::client` helper calls for memories/realtime/compaction are
|
|
suspicious unless Epiphany deliberately needs that OpenAI endpoint. Keep them
|
|
sealed with the transport until the native adapter split can decide.
|
|
- `codex-api`, `codex-model-provider`, `codex-model-provider-info`,
|
|
`codex-core::client`, and `models-manager` are no longer keeper request-path
|
|
organs. `codex-login` is different: broad login UX can be cut, but the
|
|
vendored Codex auth semantics should remain the anchor for subscription use.
|
|
If a later model catalog is needed, it should be a typed Epiphany catalog
|
|
document, not a revival of the old Codex provider stack.
|
|
- External bearer command auth and agent identity remain inside the retained
|
|
vendored Codex auth organ. Epiphany should expose them only if a concrete
|
|
typed runtime/status need appears; do not clone them into a second authority.
|
|
|
|
## Extract Target
|
|
|
|
Create an outside-vendor adapter with this shape:
|
|
|
|
```text
|
|
EpiphanyOpenAIAuthAdapter
|
|
-> wrap retained Codex-compatible credential loading/refresh
|
|
-> expose account/auth mode/model availability
|
|
|
|
EpiphanyOpenAIModelTransport
|
|
-> accept typed Epiphany model-turn request
|
|
-> call OpenAI Responses API through Codex-compatible auth
|
|
-> emit typed stream events / receipts
|
|
```
|
|
|
|
The adapter may depend on retained `codex-login` auth machinery and
|
|
`codex-client` while the reliquary survives. It must not depend
|
|
on `codex-app-server`, `codex_message_processor`, plugin/app/skill/marketplace
|
|
modules, broad Codex provider/request construction, or Epiphany state
|
|
ownership.
|
|
|
|
## Next Cut
|
|
|
|
The first `epiphany-openai-adapter` crate boundary now exists as a native typed
|
|
surface:
|
|
|
|
- input: typed model-turn request plus adapter config
|
|
- output: typed stream events and terminal usage/error receipt
|
|
- current dependency: no Codex app-server and no Codex transport yet
|
|
- planned internal dependency: Codex auth/model transport only
|
|
- forbidden dependency: Codex app-server or Epiphany JSON-RPC routes
|
|
|
|
The first attempt to wire `codex-core` directly as a standalone path dependency
|
|
escaped the vendored workspace lock and hit transitive ICU/temporal dependency
|
|
skew. Do not paper over that with random version pins.
|
|
|
|
The first workspace-verified wrapper now exists as
|
|
`epiphany-openai-codex-spine`. It depends on the pure typed adapter plus the
|
|
keeper Codex auth types and projects `AuthManager` / `CodexAuth` into a typed
|
|
`EpiphanyOpenAiAdapterStatus`. `epiphany-codex-bridge` re-exports this spine so
|
|
the current app-server compatibility shell can compile it without making the
|
|
pure document crate depend on Codex.
|
|
|
|
The transport wrapper is now also in that spine. It maps typed
|
|
`EpiphanyOpenAiModelRequest` documents into a local serializable Responses
|
|
request body, resolves credentials through vendored `codex-login`, chooses the
|
|
ChatGPT/OpenAI base URL from auth mode, opens an HTTP Responses SSE stream with
|
|
`codex-client`, and converts stream deltas/completion into typed
|
|
`EpiphanyOpenAiStreamEvent` / `EpiphanyOpenAiModelReceipt` documents. It no
|
|
longer imports Codex `ResponsesApiRequest`, `ResponsesClient`,
|
|
`ResponseEvent`, provider config, model-provider, or broad app-server
|
|
workflow. Its narrow direct imports preserve Codex-compatible auth identity
|
|
without letting Codex own Epiphany request/state shape.
|
|
|
|
`schemas/cultnet/` contains publication schemas for OpenAI adapter status,
|
|
model request, stream event, and terminal receipt. Live providers own their
|
|
CultMesh/CultNet catalogs. The native runtime accepts the document types
|
|
registered by the actual CultCache runtime schema; there is no standalone
|
|
hello/catalog CLI or hand-maintained mutation-contract mirror.
|
|
|
|
The native runtime route is the operator and daemon edge.
|
|
`epiphany-openai-adapter` documents
|
|
derive CultCache `DatabaseEntry`, `epiphany-core::runtime_spine_cache`
|
|
registers OpenAI adapter status/request/stream-event/receipt documents, and the
|
|
outside-vendor `epiphany-openai-runtime` crate records typed OpenAI model-turn
|
|
requests, stream events, terminal receipts, runtime sessions, jobs, and job
|
|
results into the native runtime spine. Its `model-turn` command opens the
|
|
Codex-backed transport through the typed spine; its `smoke` command proves the
|
|
CultCache route without touching the network. This is the first native caller
|
|
for the advertised OpenAI CultNet contract.
|
|
|
|
Heartbeat/specialist launches use the atomic
|
|
`epiphany-core::prepare_runtime_spine_heartbeat_job` path. Initialization,
|
|
session admission, job creation, and launch receipts are one prepared CultCache
|
|
mutation rather than a caller-visible sequence.
|
|
|
|
The heartbeat launch plan is native as well:
|
|
`epiphany-core::plan_runtime_spine_heartbeat_launch` validates the launch
|
|
contract and active runtime-link conflicts, then returns the durable job binding
|
|
and runtime link. Vendored `CodexThread` is still a persistence adapter for the
|
|
compatibility route, not the owner of that state mechanics.
|
|
|
|
The Epiphany state-update contract and mutation law have also left vendored
|
|
Codex. `epiphany-core::EpiphanyStateUpdate` now owns the update document used
|
|
by the compatibility `thread/epiphany/update`, promotion, accept, and launch
|
|
paths. `epiphany-core::epiphany_state_update_validation_errors` and
|
|
`epiphany-core::apply_epiphany_state_update` own typed validation and mutation
|
|
application. `codex-core` re-exports the contract only as a compatibility
|
|
alias, and `CodexThread` now calls native state-update functions around its
|
|
remaining revision check, persistence validation, and rollout/session writeback.
|
|
|
|
The credential extraction overcut has been corrected. Codex file/keyring/auto
|
|
auth, env API key handling, ChatGPT token refresh, account metadata parsing,
|
|
and header-client setup remain in vendored `codex-login`. The redundant
|
|
Epiphany re-export crate is gone; the root workspace carries the Codex
|
|
`tokio-tungstenite` / `tungstenite` patches required for standalone builds.
|
|
|
|
The point is ownership: Epiphany calls a model adapter; it does not live inside
|
|
the Codex host brain.
|