This matrix is a delivery contract for Agents Core Web, not a claim of complete OpenAI-hosted service compatibility.
- Current immutable Parsar Core capability baseline:
dadf64a7. This immutable revision retains the Web-used Agent admission, chat, Environment, and trace-observability boundaries, bounded live Workspace file-metadata listing, and the project-owned Source Files upload/retrieve/content/delete lifecycle. It also exposes the operator-gated basic Codex/Dockeropenai_hostedprofile, both supported Environment resource projections, and Environment Files.create for that qualified managed placement.OpenAI-Beta: agents=v1plus the/v1/agents/**resources and Session events endpoint remain the versioned Web/Core contract. Core exposes no public execution-readiness, capability-discovery, or build-version resource. It exposes Codex-only, Session-scopedself_hostedcreation; basic Codex/Dockeropenai_hostedcreation when Core is explicitly configured with a qualified managed provider; Environment retrieval; bounded Files.list; and Source Files. It still exposes no public Environment list or standalone CRUD, template, Source Files list, browser-facing key route, or managed-provider discovery/configuration route. - Upstream resource source:
openai-python3.13.0 beta Agents resources atd7c41efe - Required beta header for
/v1/agents/**:OpenAI-Beta: agents=v1. Source/v1/files**routes deliberately omit it. - Core base: same-origin
/v1through the Web proxy for stock Parsar Core; a direct URL only for a compatible Core or proxy with explicit CORS support
Parsar implements a partial subset of the pinned upstream resource inventory, and its handlers still implement partial request/event semantics. Importing an official SDK or accepting extra fields is not compatibility proof. Unsupported capabilities must fail explicitly.
Requests use Authorization: Bearer <execution-principal key>. Optional
OpenAI-Organization and OpenAI-Project headers, when present, must exactly match
the Core key binding. Agents Core Web's local proxy owns the bearer server-side.
| Resource / behavior | TypeScript client | Initial UI | Notes |
|---|---|---|---|
| Saved Agents create/list | Yes | Yes | Dedicated setup covers model, name, instructions, bounded metadata, the Session-safe text/medium/implicit-reasoning/auto-tier profile, and the strictly bounded Function/service-origin HTTP MCP form profiles; the broader Saved Agent contract is not execution proof |
| Saved Agents retrieve/update/delete | Yes | Yes | Agent details support viewing, editing, and deleting saved Agents; unsupported or saved-only Tool values remain read-only and are omitted from unrelated updates |
| Function form profile | Yes | Yes | Web validates at most 64 non-deferred definitions, unique non-whitespace names of at most 512 UTF-8 bytes, descriptions, and object JSON-Schema parameters before writing |
| HTTP MCP form profile | Yes | Yes | Web writes only HTTP(S), transport.type:http, and connection_origin:service, with optional allow-list and boolean required. Authentication is either anonymous or an exact catalog-resolved Vault static-bearer Credential; arbitrary headers, request metadata, OAuth, stdio, and browser-origin remain unavailable |
| Sessions create/list/retrieve | Yes | Yes | With no meaningful initial input, UI sends a JSON stream:false create for none/self_hosted and receives an idle Session. With meaningful input, and for every openai_hosted create, it consumes the POST SSE while running the required durable refresh, then hands off to the normal events stream. List supports both an all-pages loaded result and a server-side root-Agent scope |
| Root-Agent Session filter | Yes | Yes | Core applies agent_id before pagination, and every page and opaque continuation carries that same scope; All Agents omits it. Web rejects a returned Session whose root Agent does not match the requested scope |
| Session-only Agent overrides | Yes | Yes, finite | Whole-field overrides can replace model, set/clear instructions, replace the supported plain-text configuration, reset saved-only multi_agent, reasoning, or service_tier values to Core defaults, and inherit, clear, or fully replace tools through the bounded Function/HTTP MCP editor. Untouched fields are omitted; there is no arbitrary Agent JSON or patch-style partial Tool update |
| Sessions update/delete | Yes | Yes | Title/string metadata editing and one-Session confirmed deletion; no bulk or Workspace deletion |
| Session live events | Yes | Yes | Authenticated fetch stream, not EventSource; reconciles durable state, projects exact text and command-output deltas, and treats an in-band error as a retryable interruption rather than conversation data |
| Input message / steering | Yes | Yes | Opens SSE before submitting agent.session.input.message; a Session failed projection from its latest failed input/Turn can accept a later message that starts a new Turn, while an exactly observed terminal failed/expired Environment keeps input disabled. Only HTTP 204 is durable admission; Core errors or an unexpected 2xx remain visible and uncertain failures retain the in-memory payload/key for an explicit unchanged manual retry only |
| Active Turn cancel | Yes | Yes | Submitted as a Session event, not a Turn-create endpoint |
| Turn list | Yes | Yes, read-only | Selected Sessions load every page in ascending creation order; no Turn mutation UI |
| Turn retrieve | Yes | No | Reusable client diagnostic method; timeline recovery uses the all-pages list |
| Item list/recovery | Yes | Yes | Authoritative recovery after stream loss |
Parsar apply_patch Item presentation |
Existing function Item fields | Yes, read-only | Parsar extension recognized only for the pinned changes[].{path,kind,diff} shape; not an OpenAI standard Item type |
| Function result/error | Yes | Yes | Supports text agent.session.input.tool_result success/error handoff for exact function_call actions |
| Initial-input creation stream | Yes | Yes, bounded text messages | Accepts an exact non-empty text string or an ordered array of user messages containing input_text parts only. Images, attachments, non-user roles, and other content parts are not supported |
| Environment Files.list | Yes | Operator-gated, explicit read-only | Hidden unless the complete list + managed-create profile is qualified and AGENTS_CORE_WEB_ENVIRONMENT_FILES=1, because Core has no capability-discovery route. For a complete supported projection, lists direct regular-file path and size metadata only; openai_hosted uses /workspace, while self_hosted uses its exact workspace_directory; no automatic load, content, download, recursion, or snapshot guarantee |
| Source Files upload/retrieve/content/delete | Yes | Yes, explicit by ID | Multipart purpose is fixed to user_data; metadata and binary responses are strictly projected; Core has no Source Files list; uncertain writes are never replayed |
| Environment Files.create | Yes | Hosted-gated | The client supports the exact inline/file_id union. UI offers bounded inline or upload → durable file_id copy only after an exact current basic openai_hosted Session projection and same-ID resource read satisfy the non-terminal, empty-installation write gate |
| Artifacts | No | Hidden | Source Files and Environment Files are not an Artifacts API |
| Environment connection action | Yes | Guided, not submitted | environment_connection is distinct from a function call; Web can show an operator-run launcher template but sends no result and never opens the native transport |
| Environment lifecycle events | Yes | Read-only | UI projects pinned pending, ready, connected, disconnected, and failed live snapshots; unknown/malformed status events clear prior live claims and render as unavailable |
| Environment retrieve | Yes | Yes, read-only | Strictly recognizes self_hosted and openai_hosted resource types. Session UI automatically reads the valid current Environment ID for either supported type; hosted write eligibility additionally requires the exact basic hosted projection and same-ID durable resource; there is no standalone Environment create/list/update/delete resource |
| Environment overview | No public list API | No top-level UI | Web does not turn loaded Session projections into a catalog; a selected Session may still show its exact Environment data |
| Environment templates | No | Hidden | No navigation or Create entry is shown without a Core contract |
| Environment keys | No public browser API | Hidden | Operator-issued executor credentials stay on executor compute and never enter browser state, request previews, navigation, or Create actions |
| Vaults and static-bearer Credentials | Yes | Yes, when discovered | Web traverses the Vault and per-Vault Credential page chains to their Core end markers before publishing one loaded metadata result, provides safe lifecycle controls and write-only token create/replace, and deterministically attaches each selected Credential's owning Vault to Session creation. The reads are non-atomic and not a current Core total. Tokens are never returned; catalog success is not runtime proof |
| Protocol Subagents / enabled multi-agent | Later | No | Distinct from storing multiple Agent configurations |
| Usage/observability | Response types | Yes, scoped | Session aggregate and per-Turn token Usage are labelled separately; unavailable measurements remain unknown, not zero |
- The Web creates
environment: {"type":"none"}Sessions by default. The non-secretAGENTS_CORE_WEB_SELF_HOSTED_SESSIONS=1build/dev-server flag exposes a second, Codex-onlyself_hostedchoice for an operator-reviewed Core deployment. The independentAGENTS_CORE_WEB_OPENAI_HOSTED_SESSIONS=1flag exposes only the pinned basic Codex/Dockeropenai_hostedrequest after an operator has qualified Core's managed Runtime provider. Its network choice is omitted/default enabled, explicitly enabled, or explicitly disabled; restricted domains are not exposed. The flag is off by default because Core has no public capability-discovery route. Both flags change Web presentation only; neither is evidence that the connected Core has configured execution, an executor registry, a reachable executor origin, or a ready managed Runtime, native harness, model, or provider. - Environment Files UI is independently hidden unless the operator has qualified the
connected Core and sets
AGENTS_CORE_WEB_ENVIRONMENT_FILES=1. A 404unsupported_operationis reported as an unsupported Core, never as an empty Workspace. Managed reads use/workspace; self-hosted reads are constrained to and send the exact frozenworkspace_directoryreturned by the Session. - Start Session exposes an optional title only. The title is written as
metadata.title; additional creation metadata stays empty and is not exposed in this form. The existing-Session action surface may edit additional string metadata; the complete map follows the pinned 16-pair, 64-character key, and 512-character value limits and must never contain secrets. Initial input accepts an exact non-empty text string or an ordered array of user messages containinginput_textparts only. Message order and grouping are preserved. Each message must contain non-whitespace joined text; images, attachments, non-user roles, and other content parts are not supported. Empty or whitespace-only simple text is omitted. Meaningful input selects streamingPOST /agents/sessions; an omitted input selects JSONstream:falsefornoneandself_hosted, whileopenai_hostedalways uses creation SSE so provisioning can be reconciled before the ordinary events-stream handoff. - Streaming creation must begin with a canonical
agent.session.createdsnapshot. Web buffers subsequent creation events while reconciling the durable Session, all Item pages, and an eligible Environment projection and starts the all-pages Turn read independently. After the POST SSE settles with a known Session, Web performs the required durable refresh and hands live updates toGET /agents/sessions/{session_id}/events; Turn pages apply separately only if their fenced read remains current and do not block the handoff. A failure before a canonical created snapshot leaves the create outcome unconfirmed; a later stream failure reconciles and hands off instead of replaying the POST. - The optional inline
agentobject is a finite, whole-field Session-only override. Web can replacemodel, set or clearinstructions, replace the supported plain-text configuration, reset saved-onlymulti_agent,reasoning, orservice_tiervalues to Core defaults, and inherit, clear, or fully replacetoolsthrough the bounded Function/HTTP MCP editor. Untouched fields are omitted. Admission and Vault derivation use the effective Agent snapshot after applying that override. There is no arbitrary Agent JSON editor or patch-style partial Tool update. Environment creation is limited tonone, the separately enabledself_hostedprofile, and the separately enabled basicopenai_hostedprofile. Managed creation is blocked before persistence when the effective Agent contains MCP because hosted MCP is not qualified. - A failed create is never retried automatically. Its stable recursive fingerprint
contains
agent_id, the finiteagentoverride when present,environment, exact optionalinput, normalizedmetadata,stream, and sorted derivedvault_ids. Object keys are normalized recursively and other array order remains significant. Only an explicit retry with the same complete fingerprint reuses the in-memory idempotency key; any projected request change rotates it. - The Sessions root-Agent filter is a Core query, not a client-side filter over one
loaded page. Core applies
agent_idbefore pagination; the first request and every continuation carry that same scope together with the preserved limit and order. All Agents omitsagent_id. Filter changes abort and fence stale reads, and an accepted filtered page may not contain a Session whose Agent snapshot has another ID. - Message, active-Turn steering, cancel, and function-result/error writes use the
current
agents=v1Session events contract. Web does not add a separate private runtime-readiness gate. The caller creates and retains a non-blank, at-most-128-byte idempotency key before the first event write; the client never retries automatically, and an uncertain explicit retry must reuse the same payload and key. Only exact HTTP 204 denotes durable event admission; every other status, including another 2xx, fails closed. HTTP acceptance, health, Agent creation, and an open SSE stream still do not prove that execution will complete; subsequent durable Session, Turn, and Item state is authoritative. - Product navigation and the global Create menu do not widen the protocol. Agent and Session creation call the existing client methods. The top-level Environments destination and Environment template/key entries are absent because Core exposes no corresponding list or management APIs.
- The Agent setup request preview is derived entirely from editable Agent fields and
the sanitized Core base URL. Its authorization header always contains the literal
${AGENTS_CORE_API_KEY}placeholder; it never reads or renders the connection's server-managed or current-tab bearer. - Saved Agent persistence and Session execution are separate contracts. Parsar
dadf64a7can store explicit reasoning, non-autoservice tiers, and JSON-schema text formats, but rejects each of them before creating a Session. Enabled multi-agent configuration, saved-only tool types, deferred/invalid/duplicate function or MCP identities, and MCP credentials without attached Vaults are rejected at the same boundary. Web resolves every MCPcredential_idagainst the last successfully traversed Vault/Credential page-chain result, requires an exact destination URL match, and derives sorted unique owningvault_ids; missing, stale, URL-mismatched, or ambiguous bindings are deterministic blockers. The Web therefore omits reasoning for new Agents, usesservice_tier:auto, ordinary text, and medium verbosity, and blocks every Session-start entry point for a loaded Agent with a deterministic admission conflict. Existing saved-only values remain inspectable; fields exposed for editing are never silently rewritten. - The Agent form exposes exactly two Tool write profiles. Its Function profile is always non-deferred and enforces a unique non-whitespace name of at most 512 UTF-8 bytes, a description, object JSON Schema parameters, and a maximum of 64 Functions. Function execution remains outside the browser; the existing result handoff uses the exact durable Turn and call identity reported by Core.
- The MCP form profile is service-origin HTTP(S). It supports anonymous access or a
Vault-backed static-bearer Credential selected from the last successfully
traversed Vault/Credential page-chain result.
Selecting a Credential locks the exact destination URL and writes only its
credential_id; the token never enters the Agent form. Arbitrary headers, request metadata, OAuth, stdio, client-origin, unresolved Credentials, and malformed MCP variants remain unsupported/read-only. MCP execution and discovery remain Core-service-owned, including for aself_hostedSession whose Workspace commands are executor-owned. - Other Tool definitions—including
tool_search,programmatic_tool_calling, deferred Functions, unresolved or malformed MCP, and future variants—remain read-only. Web offers no Web Search or Code Mode switch. An unrelated Agent edit omitstools; an attempted Tool edit while a read-only definition remains fails closed instead of deleting, interpreting, or resending unknown JSON. The public contract exposes no Function, MCP, model, provider, or executor readiness resource. - Saved Agent names are limited to 128 Unicode characters. Agent metadata is limited to 16 string pairs, 64 Unicode characters per key, and 512 per value; the Web enforces those limits before a write.
- A selected
environment:noneSession renders no Environment or Workspace panel; absence of that optional UI is not an error and does not block conversation use. Read-only Environment status is shown only for a complete supportedself_hostedor basicopenai_hostedprojection, or as an explicit unavailable state for an unsupported Environment variant that must fail closed. - Parsar Core at the audited revision supports creating a
self_hostedEnvironment only as part of a Codex Session. When the operator flag is enabled, Web can create a Session with an absolute executor-hostworkspace_directoryand exactly emptycapability_directories. It may carry the same optional text input, title metadata, and finite Session-only Agent override asenvironment:none; it is idle only when input is omitted. Web cannot create an Environment independently, choose an executor, or claim the requested Workspace exists. A Core rejection leaves the setup visible and is never retried automatically. The exact failed projected request retains its in-memory idempotency key only for an explicit unchanged retry; the complete fingerprint rules above determine every new operation. - The reusable client distinguishes the admitted
self_hostedrequest fields (workspace_directoryand optionalcapability_directories) from the safe Session response projection (id,remote_url,workspace_directory, and normalizedcapability_directories). Unknown Environment variants remain opaque, inspectable records and are not eligible creation inputs. - A successful self-hosted Session response supplies the Environment ID and
remote_urlused by the connection guide. A runnable launcher template is shown only for a complete known projection with a canonical Environment UUID and a strictly valid HTTPS executor origin or loopback HTTP development origin. The template uses static$REMOTE_URLand$ENVIRONMENT_IDvariables plus credential-file and Codex-binary path placeholders; it never embeds an executor token, caller bearer, provider credential, URL userinfo, query, or fragment. Copying the template does not start an executor. - An optional, default-off local Docker guide is presentation policy layered on that same strict projection; it is not an Agents API resource or executor capability. It is rendered only for a loopback HTTP origin and a complete operator build profile containing non-secret image, API-container, numeric-user, credential-path, and runtime-root strings. The copied block uses an exact Environment UUID, a stable per-Environment container/state directory, and an explicit host-to-Environment Workspace bind. Web never reads the credential, opens Docker, executes the block, retries it, or treats copying/running it as connection or runtime readiness. Existing queued input may execute when the operator connects the Environment.
required_actionsis a discriminated union.function_callcarries call, Turn, function-name, and argument fields;environment_connectioncarries onlyenvironment_id. The initial Web renders the latter as an operator-owned wait and does not expose a Function Result form or claim that the browser can connect it.- Environment resource status and Session Environment event status are distinct
contracts. The durable resource accepts
pending,connected,disconnected,expired, andfailed. Live events acceptpending,ready,connected,disconnected, andfailed, with a nullable structured error.expiredis therefore durable-only andreadyis live-only; neither vocabulary is widened by an unchecked cast. Unknown or malformed values clear any older live claim. - Once a current Session read supplies a valid
self_hostedoropenai_hostedEnvironment ID, the client issues one authenticated, abortableGET /agents/environments/{encoded_environment_id}. It accepts only HTTP 200 and strictly projects exactlyid,object,type,status,files,plugins, andskills, with the matching ID,agent.environmentobject, a knownself_hostedoropenai_hostedtype, a supported durable status, and array-valued installation metadata. Session recovery consumes either supported branch; only the exact basicopenai_hostedbranch can proceed to hosted write eligibility. UUID comparison permits an uppercase request to match Core's lowercase canonical response, and the projected resource retains that canonical response ID. It never writes or retries this read. - Empty
files,plugins, andskillsarrays mean only that Core reports no API-managed installations. They are not the host filesystem, Workspace contents, launcher capabilities, executor inventory, or the data source for Files.list. - For a complete supported
self_hostedor basicopenai_hostedSession Environment projection, Web exposes a user-triggered, authenticatedGET /agents/environments/{encoded_environment_id}/filesread. It never loads files automatically. The UI supplies an absolute directory within the reported Workspace,limit=20, the selectedascordescorder, and Core's opaquepagetoken for continuation while preserving the applied directory, order, and limit. - The client accepts only HTTP 200 and the pinned Parsar page projection
{data,next}. Every entry must have the matching Environment ID,object:"agent.environment.file", a safe absolute path, and a non-negative safe-integersize_bytes. A malformed success rejects the complete page; no partial result is accepted or retried automatically. - Files.list is a live, non-recursive metadata read. Paths remain plain text. It does not read file contents, follow browser links, upload, download, mutate, or create files, and it does not create a Turn. Core may invalidate an opaque continuation when directory paths or sizes change; Web then requires an explicit refresh. Requests are abortable and fenced when the Environment or Workspace changes.
- Source Files are a separate project-owned lifecycle under
/v1/files. Upload is one multipartfileplus fixedpurpose=user_data, with a 512 MiB content bound; metadata retrieve, complete binary download, and delete operate only by the returnedfile-…ID. These routes use the caller bearer but never the Agents beta header. There is no list, expiration, resumable upload, alternate purpose, or browser-persisted inventory. The Web keeps the selected file and returned ID in component memory only and never writes content or IDs to URL, storage, Agent or Session metadata, fixtures, or logs. - Source download accepts only HTTP 200 with
application/octet-stream, an attachment disposition, valid exactContent-Length,Cache-Control:no-store, andX-Content-Type-Options:nosniff; the complete received byte count must match. JSON or truncated content is never saved as a file. Upload has no public idempotency or list-based reconciliation path, so an uncertain outcome is shown as unknown and is not replayed. An uncertain delete performs at most one metadata GET to distinguish currently present from absent, never a second DELETE. - Environment Files.create is a single-attempt exact union: strict standard Base64
inlinebytes or a project-owned Sourcefile_id, plus one canonical file path beneath/workspace/. Source upload is bounded at 512 MiB while destination copy is bounded at 50 MiB. The Web's primary flow is upload → returned Source ID →file_idcopy; it never substitutes a local filename or path for that ID. A missing response can outlive caller cancellation. Web performs at most one read-only directory list as a clue; matching path and size cannot prove byte identity, so the outcome remains unknown and the POST is not replayed. - A hosted write form appears only when the complete current Session projection is
the pinned basic
openai_hostedshape andGET /agents/environments/{id}itself returns the exact same Environment identity, type, a non-terminalpending/connected/disconnectedstatus, and emptyfiles,plugins, andskills. It is never inferred from a Session type, connection event, health, Files.list, Docker configuration, or an error response. Terminalexpired/failed, wrong identity/type, populated installations, templates, restricted networking, or future fields fail closed.self_hostedWorkspace listing remains read-only. - The durable
self_hostedSession Environment projection has no connection-status or error field, so the separate Environment resource read is the only durable status source used by the UI. The UI renders the Session's ID, sanitized HTTP(S) remote URL,workspace_directory, andcapability_directoriesas read-only data. It removes URL userinfo, query, and fragment, renders even safe HTTP(S) executor URLs as non-clickable text, never displays non-HTTP(S) or malformed values, and never turns directory strings intofile://or browser/executor access. Missing fields fail closed as unavailable. A matchingenvironment_connectionaction is labeled as durable Core-required work, never as proof of pending or available execution. - Environment failures render generic copy only; raw error code, type, and message
fields are hidden because they can contain arbitrary credentials, Vault IDs,
paths, or private URLs. Unknown and incomplete required actions block
the composer rather than selecting a guessed form. A valid
environment_connectionnotice remains separate from any simultaneousfunction_callresult form and has no result submission control. - Workspace means the execution directory within this Environment. It is not a
top-level workspaces API, file-content browser, editor, or artifact capability. The UI
links to the immutable pinned Core and caller-started launcher setup documentation.
The path must be absolute and already meaningful on the caller-managed Linux
executor; it is not a browser, Web-server, or daemon-container path. The operator
issues the executor credential outside Web, stores it in a private file on that
compute, and starts
agents-api-codex-executorthere. Web never reads the file, starts a process or container, or connects to daemon/executor transports. - Known Item and Session-event discriminants remain typed. Unknown variants retain their raw fields for inspection, but consumers must treat them as unavailable rather than infer a known rendering or action.
- Parsar maps a Codex
fileChangeobservation to afunction_callnamedapply_patch. The Web enables its read-only diff presentation only when arguments are an object containing a non-emptychangesarray and every change has a stringpath, a stringdiff, and akindobject whosetypeisadd,update, ordelete(with an optional string or nullmove_path). Empty, malformed, string, missing-field, extra-field, and alternate same-name payloads retain the generic JSON function rendering. This is a Parsar extension, not an OpenAI standard Item type, and it grants no browser access to apply, edit, approve, reject, revert, or read file contents from an executor Workspace. - The internal
parsar-daemonWebSocket and the publicself_hostedexecutor transport are different protocols. Neither is a generic Environment Provider. - Docker, E2B, and AWS Bedrock AgentCore Runtime each need an upstream lifecycle and capability contract before the Web can advertise them.
AGENTS_API_ENGINEselectscodexor an operator-enabledclaude_sdkprofile for new Sessions. The pinnedself_hostedprofile is Codex-only; the browser sends a model ID and Workspace path, not an engine or executor selector.- Core has no standard model-catalog or capability-discovery route in this surface.
Web model presets are editable suggestions. Known reasoning, tier, format,
multi-agent, executable-tool-shape, and unattached-credential incompatibilities
are authoritative at Session creation; a real Turn remains necessary to prove
model/provider execution and conditional Codex
low/highverbosity support. Web never sends a paid Turn merely as a capability probe. Claude SDK accepts medium verbosity only.
Environment creation and management beyond the narrow Session-scoped
self_hosted and basic managed openai_hosted creation flows, top-level
Environment list/CRUD, managed-provider selection/configuration, arbitrary
Workspace content mutation, Plugins, Skills, Artifacts, Credential profiles beyond
the bounded Vault static-bearer flow, templates, restricted-domain networking,
hosted MCP, key management, and broader Workspace lifecycle controls remain
unsupported or hidden. The bounded Source lifecycle and strictly gated
Environment file_id copy described above do not imply those broader surfaces.
Parsar's additional pinned handlers are not Web-supported merely because they exist
upstream.
- Dashboard is a Web-derived view over the last successfully traversed Agent and
Session page-chain results for the configured Core access scope. Web follows every
continuation with
limit=100&order=desc, rejects duplicate identities and invalid or cyclic cursors, and allows at most 100 pages per collection. If Core reports that page 101 is required, the refresh fails closed and does not publish the partial result. Dashboard performs no additional Turn, Item, Environment, or execution-readiness requests and makes no writes. - When both top-level collection reads fail through a gateway/network condition,
Dashboard labels the local Agent Core backend as not ready and links the whole
notice to connection recovery. An explicitly configured local Docker guide may
display validated, non-secret
docker startand loopback/healthzcommands for pre-existing database/Core/daemon containers. The same panel distinguishes first-time setup and links the pinned Parsar container/daemon guides plus its non-secret image build command. Web never executes those commands, accesses the Docker socket, creates containers, invents credentials, or treats process health as authenticated API or execution readiness. - A ready Agent or Session result means pagination reached Core's end marker within that safety limit. Loaded counts are exact only for that published page-chain result. Pages may change while they are traversed, so neither count is an atomic snapshot or a current Core total; the Agent and Session reads are also independent. Session-admissible Agents pass Web's known request-shape checks; this does not prove worker, executor, runtime, model, provider, Function, or MCP readiness. Session status counts preserve exact known Core statuses, while unknown values remain unavailable.
- Reported aggregate tokens sum only complete canonical Session Usage snapshots
and state how many of the loaded Sessions reported Usage. Missing or malformed
Usage remains
Unknown, never zero. Needs-attention rows are the five most recentrequires_actionorfailedSessions; Recent Sessions contains at most eight rows ordered by valid Core-reportedlast_active_at. Aself_hostedlabel identifies only the Session profile, not an executor connection. Row actions navigate to the exact loaded Session. - Agent and Session collection states remain independent. A failed refresh may leave an explicitly labelled prior loaded result visible, including a previously confirmed empty result. An initial failed empty collection is unavailable rather than a confirmed zero. Switching Core generations clears both snapshots in the same state transition, and a collection response invalidated by a concurrent local/live revision is reread before it may be labelled ready.
- System presents browser-visible collection request state, the sanitized
configured Core base, the immutable
dadf64a7public capability matrix, and ownership boundaries. Its counts apply only to the last successfully traversed page-chain results and are explicitly not atomic snapshots or current Core totals. Its Core summary is derived from collection reachability; it is not an independent/healthz, build-version, capability-discovery, or execution-readiness probe. Refresh is explicit and user-triggered; System does not poll. The matrix separates restricted Function/MCP configuration and Function result handoff from Vault attachment and unavailable runtime-readiness proof. - System always reports execution readiness as
Not exposed. The self-hosted and managed-hosted build flags control Web presentation only. The optional self-hosted Docker command is an operator launcher aid; Parsar's distinct managed Docker adapter is Core-owned execution placement behindopenai_hosted, never browser Docker control. E2B and AgentCore profiles remain hidden without a supported public admission contract.
- Start Session exposes only the optional display title and writes it as
metadata.title; it does not expose additional creation metadata. The existing-Session action surface can edit additional metadata, where every value must be a string. Web enforces Parsar's pinned limit of 16 pairs, 64 Unicode characters per key, and 512 per value before either write, and explicitly warns that metadata must never contain credentials or secrets. - The Session action surface retrieves the latest durable Session when it opens and again immediately before an update. Every action read must return a complete canonical Session with the exact requested ID; a wrong-ID or malformed HTTP 200 response leaves the current view/draft unchanged and cannot authorize a write or unlock an uncertain deletion retry. Runtime validation covers the Agent snapshot, known Environment shapes, required-action variants, Usage counters, metadata, and timestamps while preserving a structurally safe unknown Environment type as unavailable.
POST /agents/sessions/{session_id}replaces the complete metadata map. To avoid silently erasing concurrent additions, the Web computes the user's changes from the form baseline, applies only non-conflicting changes to the latest retrieved map, and stops before POST when the same key diverged. The latest unrelated pairs are rebased into the preserved draft before a later explicit retry. A confirmed response must be a complete matching Session whose metadata exactly equals the submitted map; only that metadata is merged into the live UI so an overlapping SSE status or Usage snapshot is not regressed.- Update and delete have no idempotency key and are sent at most once per explicit action. A missing Session or deterministic lifecycle conflict remains visible with its draft. A 5xx, timeout, response loss, malformed success, or network failure is treated as an unknown write result: the current Web view remains in place and no write is retried automatically. After an unknown delete, the Web performs exactly one read-only Session retrieval: 404 confirms removal, a canonical Session confirms it is still present and unlocks a later explicitly confirmed delete, and another failed read keeps deletion locked as unknown until the dialog is reopened and a durable retrieval succeeds. A 409 is supported for a compatible Core; pinned Parsar permits active Session metadata updates and does not make 409 the expected active-Session path.
DELETE /agents/sessions/{session_id}removes a row only after the exact canonical{id, object:"agent.session.deleted", deleted:true}confirmation. Deleting the selected Session immediately aborts/fences its fetch stream and pending Session/Item/Turn/Environment reads, clears its local Items, Turns, required actions, Environment observation, send failure, and draft, then selects the next item at the deleted position or the previous item at the end. Deleting an inactive Session does not change the selected ID, stream epoch, composer, or current conversation state.- Parsar deletion is a public server lifecycle operation. It hides the durable public Session/Items/Turns, closes its stream, cancels queued work, and requests asynchronous cancellation of active work. It does not prove immediate native executor quiescence, physical SQL/native-history erasure, or deletion of executor Workspace files.
GET /v1/agents/sessions/{session_id}/events is live-only. The client opens it
before submitting input. A reconnect, including one with Last-Event-ID, does not
replay missed work.
Every accepted replacement stream follows this order:
- reconnect the stream and buffer newly arriving events;
- retrieve the persisted Session and every page of Items while independently starting the all-pages Turn read;
- after the current Session supplies a valid supported Environment ID, retrieve its durable Environment resource;
- apply the durable Session, Items, and Environment snapshot without making a slow or unavailable Turn endpoint block conversation recovery, then release buffered events;
- when the independent Turn read settles, apply it only if its Core, request, and selected Session are still current, merging any newer live Turn snapshot by event revision;
- inspect durable state before resubmitting an uncertain write.
At replacement-stream acceptance the Web clears the previous live Environment
observation before the durable reads. Supported Environment events arriving during
those reads are buffered and applied afterward, so a newer live state wins over the
earlier durable snapshot. Within the same identity and stream epoch, a terminal
failed live observation or terminal failed/expired durable observation is not
regressed by a later valid but stale non-terminal durable read. A malformed,
unavailable, wrong-ID, or wrong-type read still clears the observation to unavailable
instead of retaining a stale claim. A late stream callback or read is fenced by Core
generation, Session ID, Environment ID, Session and Environment request revisions,
Turn and Item event revisions, stream epoch, selection, and abort signal. A missing, unauthorized,
failed, or malformed Environment response clears stale connection claims and renders
status as unavailable without blocking Session, Items, or conversation use. The UI
never infers connected from health, stream state, Agent/model metadata, installation
arrays, or absence of an action.
For a same-ID Turn, a completed, failed, or cancelled snapshot does not
regress to a later-arriving non-terminal snapshot. Durable creation order remains
authoritative while a newer live snapshot can advance the same Turn. For a same-ID
Item, completed, failed, or incomplete beats in_progress
regardless of whether the terminal value came from the durable read or the live
buffer. Otherwise, the later live projection wins while durable ordering remains
authoritative. Duplicate, out-of-order, unknown, and no-op events do not stop later
events. A Session or Core switch aborts its fetch-based stream and durable reads;
generation checks also isolate any late result that could not be cancelled.
Terminal Session (idle, requires_action, failed), Turn (completed, failed,
cancelled), and live Environment (ready, connected, disconnected, failed)
events schedule a coalesced durable Session/Turns/Items/Environment refresh. They do
not restart the stream. The Turn read shares the refresh's abort signal and request
fence but settles independently, so a slow or failed Turn endpoint cannot delay
durable conversation Items or buffered Item events. A Turn-list failure is isolated
to its timeline: the last observed Turns remain visible, and a successful Session/Items
read keeps the existing conversation usable.
- The selected Session loads
GET /agents/sessions/{session_id}/turnswithlimit=100&order=asc, followshas_moreusing the last returned Turn ID when the optional list cursors are absent, and rejects a repeated/cyclic cursor or a Turn scoped to another Session. Reads are abortable and never retried automatically. - Trace keeps the complete Turn timeline in a collapsed Turn diagnostics
disclosure so Conversation remains focused on messages and composing. The
diagnostics present observed Core snapshots for
queued,in_progress,waiting,completed,failed, andcancelled. Its all-pages read supplies the authoritative creation order, while a newer exact lifecycle SSE snapshot may advance a Turn before that read settles. Live projection is limited to exactcreated→queued,in_progress→in_progress,waiting→waiting,completed→completed,failed→failed, andcancelled→cancelledevent/status pairs; Item/output or unknown Turn event names and mismatched snapshots are ignored. The UI therefore does not label the mixed projection as wholly durable. Items are counted against their owning Turn only by the protocolturn_id; unmatched Items remain in the conversation and are explicitly reported rather than hidden or guessed. - Ended wall-clock duration is calculated only when both server
started_atandcompleted_atare valid and ordered.in_progressandwaitingTurns show a live, explicitly labelled running elapsed value from serverstarted_atto the viewer's current clock. Missing, invalid, or reversed timestamps render asUnknown; Itemduration_msvalues are tool progress and are never summed or relabelled as Turn wall-clock time. - A failed Turn's safe public
error.codeanderror.messagerender beside its timeline entry without removing conversation Items. The Web does not expose Core, daemon, provider, or native-harness diagnostics absent from that resource. - The Web displays
input_tokens,output_tokens,total_tokens, cached input tokens, and reasoning output tokens. Session aggregate Usage and each Turn's Usage use separately labelled areas. A null resource, missing nested metric, malformed value, or unavailable measurement renders asUnknown, never inferred zero. - Turn status, timings, Usage, errors, and tool progress are resource-level observability. They are not per-Item timing, monetary cost, provider attribution, or a complete OpenAI Trace waterfall.
- Against the immutable Parsar
dadf64a7capability baseline, the trace workbench is a read-only projection of the selected Session's Agent snapshot, all loaded Turn and Item snapshots, and accepted newer lifecycle events. A Turn can contribute its exact status, start/completion timestamps, and available token totals. An Item can present its exact type, status, role/phase, message content, command, working directory, tool identity, arguments/action, output/error, exit code, and toolduration_mswhen those fields exist. Missing values stay unavailable. Unknown Item types and known discriminants with malformed required fields retain a generic inspectable presentation rather than acquiring a known semantic label. - Conversation uses the same fail-closed discriminator boundary. Unknown
non-message Items render only an inert
Unsupported <type> Itemrow; their arbitrary arguments/output are not treated as Function, MCP, command, or search data and do not create an interactive control. - Exact
agent.output.command_execution_output.deltaevents append only to an already observed, same-Turn, in-progresscommand_executionItem whose current output is string-compatible. Orphan, cross-Turn, malformed, non-string, empty, or late fragments are ignored. A terminal Item snapshot remains authoritative. An in-band SSEerrorbecomes a transient stream failure, triggers the existing durable reconciliation/reconnect path, and is never forwarded as an Item. - Turn rows follow the durable all-pages creation order with the existing exact live
status merge. Items retain their durable order and group under a Turn only by an
exact
turn_id; unmatched Items remain explicit. A function result may be paired with a function call only when the same non-emptycall_ididentifies exactly one call followed by exactly one result within that Turn. Ambiguous or out-of-order snapshots remain separate rows. Sequence labels, Turn/tool counts, bounded local search, and filters are Web-derived views over the currently loaded snapshots. They do not mutate Core state, establish an execution hierarchy, or make a partial or failed read complete. - The instructions available to this view are the Session Agent snapshot's
configured
instructions. They are labelled Configured instructions, not System prompt, because the public contract does not expose the complete prompt assembled by the runtime, daemon, model provider, or native harness. Likewise, the configured model is not proof of the model or provider that executed a Turn. - A function Tool schema is shown only when a known
function_callItem's exact function name has one unambiguous, structurally valid function-tool match in the selected Session's Agent snapshot. Missing, duplicate, malformed, MCP, command, Web-search, and unknown Tool definitions do not receive an inferred schema. - Summary, preview, payload, result, and raw-detail panels project allow-listed fields from those public resource snapshots. A merged function row keeps the call and result as two distinct raw snapshots. The Web does not add request headers, authentication material, daemon/native-harness diagnostics, or provider-private payloads that are absent from the resource. Nested public field values are shown as Core returned them and are not claimed to be recursively redacted. The Session SSE endpoint is live-only and does not replay history, so the assembled trace must not be described as an audit log or lossless record of every intermediate state.
- Core exposes Turn-level
created_at,started_at, andcompleted_at, but no per-Item start/end timestamps, first-token timestamp, model-generation span, throughput, provider attribution, parent span, request/step hierarchy, or subagent relationship in this contract. Itemduration_msremains tool progress only;phase,turn_id, event arrival time, list position, and configured multi-agent fields cannot fill those gaps. Therefore the Web may render an execution-order overview, but it must not draw a time-scaled Input/Model/Tools waterfall or claim TTFT, generation time, tokens-per-second, provider, step, or subagent metrics until Core supplies versioned fields for them.
The client never retries a write automatically. For an input message that receives an unexpected non-204 2xx, loses its network/response, or fails with HTTP 5xx or a transient 408/409/425/429, the Web keeps the original payload and idempotency key in memory. Only a later user-initiated Send of the byte-for-byte unchanged payload reuses that key. Editing the payload, changing Session/Core, a successful response, or a permanent 4xx starts a new operation with a new key. This state is intentionally not stored in browser persistence, and the UI cannot prove whether an uncertain request was accepted until durable Core state reconciles.
HTTP acceptance, /healthz, an open SSE connection, and successful Agent creation
do not prove that a daemon, native harness, model ID, or provider credential can
complete a Turn.
- OpenAI Agents API is the managed-harness API described in the official Agents guide. Parsar implements part of a pinned beta HTTP resource shape with its own runtime.
- OpenAI Agents SDK is an application-hosted orchestration SDK. It is not the wire protocol between this Web and Core.
- Responses API is a lower-level model API and is not this repository's Core contract.
- Parsar daemon protocol is a private reverse-WebSocket execution transport.
- Codex app-server protocol is JSON-RPC 2.0 over stdio/newline-delimited JSON.
Any change to Web-used resources, fields, event variants, defaults, error handling, or reconnect semantics must update this matrix, typed fixtures, and integration evidence against an immutable Core revision.