Internal engineering docs
Oxagen Architecture Atlas
What the monorepo is made of and how a request, a run, a credit and a record move through it. Every figure is either generated from a manifest or cites the source it depicts.
Overview
Oxagen governs agents; it does not run them. Every client surface resolves to one capability kernel, and the kernel is the only path to the stores.
System context
- Counts on this page are read from the tree at build time (package manifests, the storage manifest, the capability manifest, route and function sources). If a number here disagrees with the code, the atlas is stale: run
pnpm docs:architecture.
Workspace
A pnpm + Turborepo monorepo: 8 apps, 32 packages and 2 tool workspaces, one version for all of them.
Dependency graph
- Most depended-on:
config(17),database(17),telemetry(16),tenancy(16),oxagen(15),billing(11),crypto(10),ai(8). - Deprecated and tool workspaces are listed in the table but left out of the drawing.
Workspaces
| Package | Directory | Kind | Workspace deps | External deps | Description |
|---|---|---|---|---|---|
@oxagen/agent | packages/agent | package | 16 | 7 | — |
@oxagen/ai | packages/ai | package | 6 | 8 | — |
@oxagen/api | apps/api | app | 21 | 7 | — |
@oxagen/app | apps/app | app | 15 | 11 | — |
@oxagen/app-deprecated | apps/app_deprecated | app | 21 | 33 | — |
@oxagen/auth | packages/auth | package | 6 | 3 | — |
@oxagen/billing | packages/billing | package | 9 | 4 | — |
@oxagen/cli | apps/cli | app | 4 | 2 | Oxagen governance CLI — spend, lineage, grounding, credentials, and audit (agentic coding lives in the stella CLI) |
@oxagen/compliance | packages/compliance | package | 0 | 0 | — |
@oxagen/config | packages/config | package | 0 | 1 | — |
@oxagen/context-provider | packages/context-provider | package | 1 | 1 | — |
@oxagen/crypto | packages/crypto | package | 0 | 2 | — |
@oxagen/database | packages/database | package | 7 | 3 | — |
@oxagen/desktop | apps/desktop | app | 1 | 7 | The Oxagen desktop app: installs the CLI and the Tacho wrapper for Claude Code and Codex, signs a machine in to an org, and lets the operator pick or change the workspace the host reports to. Spec: docs/specs/oxagen-desktop/spec.md. |
@oxagen/docs | apps/docs | app | 1 | 9 | — |
@oxagen/engram | packages/engram | package | 1 | 3 | — |
@oxagen/env-manager | tools/env-manager | tool | 1 | 2 | Local-only web UI to view env/secrets per environment and deploy the right values to the right Vercel project + environment. Requires a per-process access token and binds to 127.0.0.1. |
@oxagen/functions | packages/functions | package | 0 | 0 | — |
@oxagen/github | packages/github | package | 2 | 1 | — |
@oxagen/glob | packages/glob | package | 0 | 0 | — |
@oxagen/handlers | packages/handlers | package | 22 | 8 | — |
@oxagen/iam | packages/iam | package | 5 | 2 | — |
@oxagen/ingestion | packages/ingestion | package | 5 | 2 | — |
@oxagen/inngest-functions | packages/inngest-functions | package | 17 | 6 | — |
@oxagen/mcp | apps/mcp | app | 11 | 12 | — |
@oxagen/mcp-config | packages/mcp-config | package | 0 | 1 | — |
@oxagen/notifications | packages/notifications | package | 2 | 4 | — |
@oxagen/ontology | packages/ontology | package | 3 | 1 | — |
@oxagen/oxagen | packages/oxagen | package | 4 | 3 | — |
@oxagen/plugins | packages/plugins | package | 6 | 10 | — |
@oxagen/rules | packages/rules | package | 4 | 4 | — |
@oxagen/run-evidence | packages/run-evidence | package | 0 | 3 | — |
@oxagen/run-ledger | packages/run-ledger | package | 4 | 4 | Durable run / attempt / event / seal / finalization ledger — the evidence store for governed agent runs (ADR-043). |
@oxagen/scripts | tools/scripts | tool | 12 | 6 | — |
@oxagen/steering-freshness | packages/steering-freshness | package | 0 | 1 | — |
@oxagen/stella-engine-client | packages/stella-engine-client | package | 0 | 0 | — |
@oxagen/storage | packages/storage | package | 1 | 2 | — |
@oxagen/tacho | packages/tacho | package | 0 | 4 | Tacho: the Oxagen wrapper that records, gates, and evidences Claude Code, Claude Agent SDK, and custom agents. Leaf package: no @oxagen/* runtime dependency. |
@oxagen/telemetry | packages/telemetry | package | 4 | 9 | — |
@oxagen/tenancy | packages/tenancy | package | 0 | 0 | — |
@oxagen/ui | packages/ui | package | 0 | 6 | — |
@oxagen/web-v2 | apps/web | app | 0 | 0 | oxagen.sh public website (v2). Hand-authored HTML plus a blog built from MDX content; `pnpm build` assembles the publishable site into dist/. |
Request path
Identity → tenant scope → capability → row-level security. Nothing reaches a table without the three GUCs set, and nothing reaches a handler without passing the kernel's gates.
One org-scoped API request
- An API key wins outright when present: the session cookie is never consulted, and the key's immutable org and workspace scope is copied onto the request, so the slug middlewares return early.
- The three GUCs are set with
set_config(name, value, true), which is transaction-local.app.rls_bypassis always written explicitly so a policy never evaluates a missing setting. withSystemDbis the audited bypass: it sets onlyapp.rls_bypass = 'on', always on the shared plane, and unscoped calls are counted under thedb.query.unscopedmetric.
Source refs (9, verified at build)
apps/api/src/middleware/auth.ts#authMiddlewareapps/api/src/middleware/org.ts#orgMiddlewareapps/api/src/middleware/workspace.ts#workspaceMiddlewareapps/api/src/lib/context.ts#capabilityContextpackages/auth/src/resolvers/api-key.ts#resolveApiKeypackages/auth/src/resolvers/session.ts#resolveSessionpackages/tenancy/src/scope.ts#runInTenantScopepackages/database/src/tenant.ts#withTenantDbpackages/database/atlas/migrations/20260612140000_restore_rls_policies.sql
Tenant data planes (ADR-042)
- The decrypted plane config never leaves the resolver except inside a binding handed to a store client; it is never logged, serialised into an error, or returned by a read capability.
- The resolver itself reads
org.data_planesthroughwithSystemDbon the shared plane, which is why the system path can never be plane-aware without a cycle.
Source refs (3, verified at build)
packages/tenancy/src/data-plane.ts#resolveDataPlanepackages/database/src/data-plane-resolver.tspackages/database/src/data-plane-pool.ts#MAX_DEDICATED_POOLS
Auth tiers in apps/api
Middleware registered per sub-router in apps/api/src/app.ts, in the order Hono runs it.
| Tier | Middleware chain |
|---|---|
| public | * → requestLogger* → corsMiddleware |
| user | * → authMiddleware |
| stella telemetry | * → authMiddleware |
| ledgerIngress | * → authMiddleware |
| tacho host | * → authMiddleware/bundle → tachoControlLimiter/commands → tachoControlLimiter |
| org+workspace | * → authMiddleware, orgMiddleware, workspaceMiddleware/chat/* → chatRateLimiter |
| org | * → authMiddleware, orgMiddleware |
| Tier | Routes | Prefixes |
|---|---|---|
| ledgerIngress | 1 | /v1/run-ingest/ |
| org | 3 | /v1/:org_slug/audit · /v1/:org_slug/onboarding · /v1/:org_slug/workspaces |
| org+workspace | 319 | /v1/:org_slug/:workspace_slug |
| public | 11 | /health · /v1/auth/cli · /v1/cms/book · /v1/cms/leads · /v1/run-exports/download · /v1/tacho/enroll |
| stella telemetry | 2 | /v1/telemetry/stella |
| tacho host | 4 | /v1/tacho/apiKeyId · /v1/tacho/bundle · /v1/tacho/commands · /v1/tacho/events |
| user | 14 | /v1/auth/whoami · /v1/auth/whoamiapiKeyId · /v1/auth/whoamiorgId · /v1/auth/whoamiuserId · /v1/auth/whoamiworkspaceId · /v1/onboarding/state |
API routes
Each route file declares a relative path; the prefix comes from where app.ts mounts it. The capability column is the contract the route hands to invoke().
| Method | Path | Tier | Capability | Route file |
|---|---|---|---|---|
| POST | /v1/run-ingest/ | ledgerIngress | ingest_run_frames | v1/run.frames.ingest.ts |
| POST | /v1/:org_slug/audit/events/export | org | export_audit_events | v1/audit.events.export.ts |
| POST | /v1/:org_slug/onboarding/state | org | get_onboarding_state | v1/onboarding.state.get.ts |
| POST | /v1/:org_slug/workspaces | org | create_workspace | v1/workspace.create.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/approvals/list | org+workspace | list_approvals | v1/agent.approval.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/approvals/resolve | org+workspace | resolve_approval | v1/agent.approval.resolve.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/approvals/resolved | org+workspace | list_resolved_approvals | v1/agent.approval.list_resolved.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/debug/trace/:executionId | org+workspace | debug_execution | v1/agent.debug.trace.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/definitions | org+workspace | list_agent_defs | v1/agent.definition.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/definitions | org+workspace | create_agent_def | v1/agent.definition.create.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/definitions/:agentId | org+workspace | get_agent_def | v1/agent.definition.get.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/definitions/delete | org+workspace | delete_agent_def | v1/agent.definition.delete.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/definitions/publish | org+workspace | publish_agent_def | v1/agent.definition.publish.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/definitions/revise | org+workspace | revise_agent_def | v1/agent.definition.revise.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/definitions/suggest | org+workspace | suggest_agent_def | v1/agent.definition.suggest.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/definitions/summarize | org+workspace | summarize_agent_def | v1/agent.definition.summarize.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/definitions/update | org+workspace | update_agent_def | v1/agent.definition.update.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/deploy | org+workspace | deploy_agent | v1/agent.deploy.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/environment/bind | org+workspace | bind_agent_environment | v1/agent.environment.bind.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/environment/list | org+workspace | list_agent_environments | v1/agent.environment.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/environment/unbind | org+workspace | unbind_agent_environment | v1/agent.environment.unbind.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/execution/record | org+workspace | record_execution | v1/agent.execution.record.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/executions | org+workspace | list_executions | v1/agent.execution.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/mcp-consents | org+workspace | list_mcp_consents | v1/agent.mcp_consent.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/mcp-consents/resolve | org+workspace | resolve_mcp_consent | v1/agent.mcp_consent.resolve.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/mcp-servers | org+workspace | list_mcp_servers | v1/agent.mcp.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/mcp-servers | org+workspace | register_mcp_server | v1/agent.mcp.register.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/mcp-servers/delete | org+workspace | delete_mcp_server | v1/agent.mcp.delete.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/mcp-servers/resolve | org+workspace | resolve_mcp_servers | v1/agent.mcp.resolve.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/mcp-servers/set-enabled | org+workspace | set_mcp_enabled | v1/agent.mcp.set_enabled.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory | org+workspace | write_memory | v1/agent.memory.write.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/citations/list | org+workspace | list_memory_citations | v1/agent.memory_citation.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/citations/stats | org+workspace | get_citation_stats | v1/agent.memory_citation.stats.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/cite | org+workspace | cite_memory | v1/agent.memory.cite.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/delete | org+workspace | delete_memory | v1/agent.memory.delete.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/demote | org+workspace | demote_memory | v1/agent.memory.demote.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/import/commit | org+workspace | commit_memory_import | v1/agent.memory_import.commit.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/import/parse | org+workspace | parse_memory_import | v1/agent.memory_import.parse.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/list | org+workspace | list_memories | v1/agent.memory.list.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/memory/policy | org+workspace | get_memory_policy | v1/agent.memory_policy.read.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/policy | org+workspace | update_memory_policy | v1/agent.memory_policy.write.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/promote | org+workspace | promote_memory | v1/agent.memory.promote.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/recall | org+workspace | recall_memory | v1/agent.memory.recall.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/remember | org+workspace | save_memory | v1/agent.memory.remember.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/memory/update | org+workspace | update_memory | v1/agent.memory.update.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/roles | org+workspace | list_agent_roles | v1/agent.role.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/roles/assign | org+workspace | assign_agent_role | v1/agent.role.assign.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/roles/get | org+workspace | get_agent_role | v1/agent.role.get.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/roles/revoke | org+workspace | revoke_agent_role | v1/agent.role.revoke.ts |
| POST | /v1/:org_slug/:workspace_slug/agent/tools | org+workspace | list_agent_tools | v1/agent.tool.list.ts |
| GET | /v1/:org_slug/:workspace_slug/agent/trace/:executionId | org+workspace | get_execution_trace | v1/agent.trace.get.ts |
| POST | /v1/:org_slug/:workspace_slug/agents | org+workspace | list_agents | v1/agent.list.ts |
| POST | /v1/:org_slug/:workspace_slug/agents/credential/rotate | org+workspace | rotate_agent_credential | v1/agent.credential.rotate.ts |
| POST | /v1/:org_slug/:workspace_slug/agents/definition/commit | org+workspace | commit_agent_definition | v1/agent.definition.commit.ts |
| POST | /v1/:org_slug/:workspace_slug/agents/get | org+workspace | get_agent | v1/agent.get.ts |
| POST | /v1/:org_slug/:workspace_slug/agents/propose | org+workspace | propose_agent | v1/agent.propose.ts |
| POST | /v1/:org_slug/:workspace_slug/agents/register | org+workspace | register_agent | v1/agent.register.ts |
| POST | /v1/:org_slug/:workspace_slug/agents/retire | org+workspace | retire_agent | v1/agent.retire.ts |
| POST | /v1/:org_slug/:workspace_slug/agents/suspend | org+workspace | suspend_agent | v1/agent.suspend.ts |
| POST | /v1/:org_slug/:workspace_slug/agents/toolbelt | org+workspace | get_agent_toolbelt | v1/agent.toolbelt.get.ts |
| GET | /v1/:org_slug/:workspace_slug/api-keys | org+workspace | list_api_keys | v1/api.key.list.ts |
| POST | /v1/:org_slug/:workspace_slug/api-keys | org+workspace | create_api_key | v1/api.key.create.ts |
| DELETE | /v1/:org_slug/:workspace_slug/api-keys/revoke | org+workspace | revoke_api_key | v1/api.key.revoke.ts |
| POST | /v1/:org_slug/:workspace_slug/api-keys/rotate | org+workspace | rotate_api_key | v1/api.key.rotate.ts |
| POST | /v1/:org_slug/:workspace_slug/approval-rules/delete | org+workspace | delete_approval_rule | v1/approval_rule.delete.ts |
| POST | /v1/:org_slug/:workspace_slug/approval-rules/enabled/set | org+workspace | set_approval_rule_enabled | v1/approval_rule.enabled.set.ts |
| POST | /v1/:org_slug/:workspace_slug/approval-rules/list | org+workspace | list_approval_rules | v1/approval_rule.list.ts |
| POST | /v1/:org_slug/:workspace_slug/approval-rules/set | org+workspace | set_approval_rules | v1/approval_rule.set.ts |
| POST | /v1/:org_slug/:workspace_slug/approvals/auto-eligibility | org+workspace | get_auto_eligibility | v1/approval.auto_eligibility.get.ts |
| POST | /v1/:org_slug/:workspace_slug/asset/upload | org+workspace | upload_asset | v1/asset.upload.ts |
| POST | /v1/:org_slug/:workspace_slug/assistant/ask | org+workspace | ask_assistant | v1/assistant.ask.ts |
| GET | /v1/:org_slug/:workspace_slug/assistant/engine | org+workspace | get_assistant_engine | v1/assistant.engine.get.ts |
| POST | /v1/:org_slug/:workspace_slug/audit/events/export | org+workspace | export_audit_events | v1/audit.events.export.ts |
| POST | /v1/:org_slug/:workspace_slug/audit/log/query | org+workspace | query_audit_log | v1/audit.log.query.ts |
| GET | /v1/:org_slug/:workspace_slug/billing/actions/estimate | org+workspace | preview_action_cost | v1/billing.action_estimate.ts |
| GET | /v1/:org_slug/:workspace_slug/billing/actions/rate-card | org+workspace | get_rate_card | v1/billing.action_rate_card.ts |
| PUT | /v1/:org_slug/:workspace_slug/billing/auto-topup | org+workspace | set_auto_topup | v1/billing.auto_topup.set.ts |
| GET | /v1/:org_slug/:workspace_slug/billing/budget | org+workspace | get_spend_budget | v1/billing.budget.get.ts |
| PUT | /v1/:org_slug/:workspace_slug/billing/budget | org+workspace | set_spend_budget | v1/billing.budget.set.ts |
| GET | /v1/:org_slug/:workspace_slug/billing/contract-rate | org+workspace | get_contract_rate | v1/billing.contract_rate.get.ts |
| POST | /v1/:org_slug/:workspace_slug/billing/credits/purchase | org+workspace | purchase_credits | v1/billing.credits.purchase.ts |
| GET | /v1/:org_slug/:workspace_slug/billing/evidence/retention | org+workspace | get_evidence_retention | v1/billing.evidence_retention.ts |
| GET | /v1/:org_slug/:workspace_slug/billing/gau-bucket | org+workspace | get_gau_bucket | v1/billing.gau_bucket.get.ts |
| POST | /v1/:org_slug/:workspace_slug/billing/gau-bucket/purchase | org+workspace | purchase_gau_bucket | v1/billing.gau_bucket.purchase.ts |
| POST | /v1/:org_slug/:workspace_slug/billing/invoices | org+workspace | list_invoices | v1/billing.invoice.list.ts |
| GET | /v1/:org_slug/:workspace_slug/billing/subscription | org+workspace | get_subscription | v1/billing.subscription.read.ts |
| GET | /v1/:org_slug/:workspace_slug/billing/usage/breakdown | org+workspace | get_usage_breakdown | v1/billing.usage.breakdown.ts |
| GET | /v1/:org_slug/:workspace_slug/capability/registry/get | org+workspace | get_capability_registry | v1/capability.registry.get.ts |
| GET | /v1/:org_slug/:workspace_slug/capability/registry/list | org+workspace | list_capability_registry | v1/capability.registry.list.ts |
| POST | /v1/:org_slug/:workspace_slug/chat/messages | org+workspace | send_message | v1/chat.message.send.ts |
| POST | /v1/:org_slug/:workspace_slug/chat/messages/execution | org+workspace | get_message_execution | v1/chat.message.execution.ts |
| POST | /v1/:org_slug/:workspace_slug/chat/stream | org+workspace | ask_assistant | v1/chat.stream.ts |
| POST | /v1/:org_slug/:workspace_slug/command/menu/search | org+workspace | search_command_menu | v1/command.menu.search.ts |
| POST | /v1/:org_slug/:workspace_slug/command/menu/suggest | org+workspace | suggest_commands | v1/command.menu.suggest.ts |
| POST | /v1/:org_slug/:workspace_slug/commands | org+workspace | dispatch_command | v1/tacho.command.dispatch.ts |
| POST | /v1/:org_slug/:workspace_slug/commands/list | org+workspace | list_commands | v1/tacho.command.list.ts |
| POST | /v1/:org_slug/:workspace_slug/configurations/clone | org+workspace | get_clone_draft | v1/configuration.clone.get.ts |
| GET | /v1/:org_slug/:workspace_slug/connections | org+workspace | list_connections | v1/connection.ts |
| POST | /v1/:org_slug/:workspace_slug/connections | org+workspace | create_connection | v1/connection.ts |
| DELETE | /v1/:org_slug/:workspace_slug/connections/:id | org+workspace | delete_connection | v1/connection.ts |
| GET | /v1/:org_slug/:workspace_slug/connections/:id | org+workspace | get_connection | v1/connection.ts |
| PATCH | /v1/:org_slug/:workspace_slug/connections/:id | org+workspace | update_connection | v1/connection.ts |
| GET | /v1/:org_slug/:workspace_slug/connections/:id/mappings | org+workspace | get_connection_mappings | v1/connection.ts |
| PUT | /v1/:org_slug/:workspace_slug/connections/:id/mappings | org+workspace | set_connection_mappings | v1/connection.ts |
| POST | /v1/:org_slug/:workspace_slug/connections/:id/pause | org+workspace | pause_connection | v1/connection.ts |
| GET | /v1/:org_slug/:workspace_slug/connections/:id/preview | org+workspace | preview_connection | v1/connection.ts |
| POST | /v1/:org_slug/:workspace_slug/connections/:id/resync | org+workspace | update_connection | v1/connection.ts |
| POST | /v1/:org_slug/:workspace_slug/connections/:id/suggest-mappings | org+workspace | suggest_connection_mappings | v1/connection.ts |
| POST | /v1/:org_slug/:workspace_slug/context/governance-mode | org+workspace | set_governance_mode | v1/context.governance_mode.set.ts |
| POST | /v1/:org_slug/:workspace_slug/context/proposals | org+workspace | list_proposals | v1/context.proposal.list.ts |
| POST | /v1/:org_slug/:workspace_slug/context/proposals/create | org+workspace | propose_record | v1/context.proposal.create.ts |
| POST | /v1/:org_slug/:workspace_slug/context/proposals/dismiss | org+workspace | dismiss_proposal | v1/context.proposal.dismiss.ts |
| POST | /v1/:org_slug/:workspace_slug/context/prs/get | org+workspace | get_context_pr | v1/context.pr.get.ts |
| POST | /v1/:org_slug/:workspace_slug/context/prs/merge | org+workspace | merge_context_pr | v1/context.pr.merge.ts |
| POST | /v1/:org_slug/:workspace_slug/context/prs/open | org+workspace | open_context_pr | v1/context.pr.open.ts |
| GET | /v1/:org_slug/:workspace_slug/context/record/list | org+workspace | list_context_records | v1/context.record.list.ts |
| POST | /v1/:org_slug/:workspace_slug/context/record/promote | org+workspace | promote_context_record | v1/context.record.promote.ts |
| POST | /v1/:org_slug/:workspace_slug/context/record/publish | org+workspace | publish_context_record | v1/context.record.publish.ts |
| POST | /v1/:org_slug/:workspace_slug/context/record/revise | org+workspace | revise_context_record | v1/context.record.revise.ts |
| POST | /v1/:org_slug/:workspace_slug/context/records | org+workspace | list_records | v1/context.records.list.ts |
| POST | /v1/:org_slug/:workspace_slug/context/records/append | org+workspace | append_record | v1/context.records.append.ts |
| POST | /v1/:org_slug/:workspace_slug/context/records/get | org+workspace | get_record | v1/context.records.get.ts |
| POST | /v1/:org_slug/:workspace_slug/context/steering/freshness | org+workspace | get_steering_freshness | v1/context.steering.freshness.ts |
| POST | /v1/:org_slug/:workspace_slug/conversation/chat | org+workspace | post_conversation_message | v1/conversation.chat.ts |
| GET | /v1/:org_slug/:workspace_slug/conversations | org+workspace | list_conversations | v1/conversation.list.ts |
| GET | /v1/:org_slug/:workspace_slug/conversations/:conversationId/export | org+workspace | export_conversation | v1/conversation.export.ts |
| GET | /v1/:org_slug/:workspace_slug/conversations/:conversationId/files | org+workspace | list_conversation_files | v1/conversation.files.list.ts |
| POST | /v1/:org_slug/:workspace_slug/conversations/archive | org+workspace | archive_conversation | v1/conversation.archive.ts |
| POST | /v1/:org_slug/:workspace_slug/conversations/attachments | org+workspace | add_conversation_attachment | v1/conversation.attachment.add.ts |
| POST | /v1/:org_slug/:workspace_slug/conversations/delete | org+workspace | delete_conversation | v1/conversation.delete.ts |
| POST | /v1/:org_slug/:workspace_slug/conversations/purge | org+workspace | purge_conversations | v1/conversation.purge.ts |
| PATCH | /v1/:org_slug/:workspace_slug/conversations/rename | org+workspace | rename_conversation | v1/conversation.rename.ts |
| POST | /v1/:org_slug/:workspace_slug/cost/price-entries | org+workspace | list_price_entries | v1/cost.price_entry.list.ts |
| POST | /v1/:org_slug/:workspace_slug/cost/price-entries/remove | org+workspace | remove_price_entry | v1/cost.price_entry.remove.ts |
| POST | /v1/:org_slug/:workspace_slug/cost/price-entries/set | org+workspace | set_price_entry | v1/cost.price_entry.set.ts |
| POST | /v1/:org_slug/:workspace_slug/cost/unpriced-models | org+workspace | list_unpriced_models | v1/cost.unpriced_model.list.ts |
| POST | /v1/:org_slug/:workspace_slug/credential-grants | org+workspace | list_credential_grants | v1/credential.grant.list.ts |
| POST | /v1/:org_slug/:workspace_slug/environment/create | org+workspace | create_environment | v1/environment.create.ts |
| POST | /v1/:org_slug/:workspace_slug/environment/delete | org+workspace | delete_environment | v1/environment.delete.ts |
| POST | /v1/:org_slug/:workspace_slug/environment/get | org+workspace | get_environment | v1/environment.get.ts |
| POST | /v1/:org_slug/:workspace_slug/environment/list | org+workspace | list_environments | v1/environment.list.ts |
| POST | /v1/:org_slug/:workspace_slug/environment/set-default | org+workspace | set_default_environment | v1/environment.set_default.ts |
| POST | /v1/:org_slug/:workspace_slug/environment/update | org+workspace | update_environment | v1/environment.update.ts |
| PUT | /v1/:org_slug/:workspace_slug/evidence/disclosure-grain | org+workspace | set_disclosure_grain | v1/evidence.disclosure_grain.set.ts |
| GET | /v1/:org_slug/:workspace_slug/graph/node/get/:nodeId | org+workspace | get_node | v1/graph.node.get.ts |
| POST | /v1/:org_slug/:workspace_slug/graph/node/search | org+workspace | search_nodes | v1/graph.node.search.ts |
| GET | /v1/:org_slug/:workspace_slug/graph/nodes | org+workspace | list_nodes | v1/graph.node.list.ts |
| POST | /v1/:org_slug/:workspace_slug/graph/search | org+workspace | search_graph | v1/graph.search.ts |
| GET | /v1/:org_slug/:workspace_slug/graph/stats | org+workspace | get_graph_stats | v1/graph.stats.ts |
| POST | /v1/:org_slug/:workspace_slug/iam/roles | org+workspace | create_role | v1/iam.role.create.ts |
| POST | /v1/:org_slug/:workspace_slug/iam/roles/delete | org+workspace | delete_role | v1/iam.role.delete.ts |
| POST | /v1/:org_slug/:workspace_slug/iam/roles/grants | org+workspace | set_role_grants | v1/iam.role.grants.set.ts |
| GET | /v1/:org_slug/:workspace_slug/iam/roles/list | org+workspace | list_iam_roles | v1/iam.role.list.ts |
| GET | /v1/:org_slug/:workspace_slug/integrations | org+workspace | list_integrations | v1/integration.ts |
| POST | /v1/:org_slug/:workspace_slug/integrations | org+workspace | install_integration | v1/integration.ts |
| DELETE | /v1/:org_slug/:workspace_slug/integrations/:id | org+workspace | delete_integration | v1/integration.ts |
| GET | /v1/:org_slug/:workspace_slug/integrations/:id | org+workspace | get_integration | v1/integration.ts |
| PATCH | /v1/:org_slug/:workspace_slug/integrations/:id/configure | org+workspace | configure_integration | v1/integration.ts |
| GET | /v1/:org_slug/:workspace_slug/integrations/:id/metrics | org+workspace | get_integration_metrics | v1/integration.ts |
| POST | /v1/:org_slug/:workspace_slug/integrations/:id/sync | org+workspace | sync_integration | v1/integration.ts |
| PUT | /v1/:org_slug/:workspace_slug/kill-switches | org+workspace | set_kill_switch | v1/kill_switch.set.ts |
| POST | /v1/:org_slug/:workspace_slug/kill-switches/list | org+workspace | list_kill_switches | v1/kill_switch.list.ts |
| POST | /v1/:org_slug/:workspace_slug/mandates/get | org+workspace | get_mandate | v1/mandate.get.ts |
| POST | /v1/:org_slug/:workspace_slug/mandates/grant | org+workspace | grant_mandate | v1/mandate.grant.ts |
| POST | /v1/:org_slug/:workspace_slug/mandates/limits/update | org+workspace | update_mandate_limits | v1/mandate.limits.update.ts |
| POST | /v1/:org_slug/:workspace_slug/mandates/list | org+workspace | list_mandates | v1/mandate.list.ts |
| POST | /v1/:org_slug/:workspace_slug/mandates/request | org+workspace | request_mandate | v1/mandate.request.ts |
| POST | /v1/:org_slug/:workspace_slug/mandates/revoke | org+workspace | revoke_mandate | v1/mandate.revoke.ts |
| GET | /v1/:org_slug/:workspace_slug/model/capabilities | org+workspace | list_model_capabilities | v1/model.capability.list.ts |
| GET | /v1/:org_slug/:workspace_slug/notifications | org+workspace | list_notifications | v1/notification.list.ts |
| POST | /v1/:org_slug/:workspace_slug/notifications/mark | org+workspace | mark_notification | v1/notification.mark.ts |
| POST | /v1/:org_slug/:workspace_slug/onboarding/advance | org+workspace | advance_onboarding | v1/onboarding.advance.ts |
| POST | /v1/:org_slug/:workspace_slug/onboarding/first-frame | org+workspace | get_first_frame | v1/onboarding.first_frame.get.ts |
| POST | /v1/:org_slug/:workspace_slug/ontology/neighbors | org+workspace | get_ontology_neighbors | v1/ontology.neighbors.ts |
| POST | /v1/:org_slug/:workspace_slug/ontology/query | org+workspace | query_ontology | v1/ontology.query.ts |
| GET | /v1/:org_slug/:workspace_slug/org/data-plane | org+workspace | get_data_plane | v1/org.data_plane.ts |
| PUT | /v1/:org_slug/:workspace_slug/org/data-plane | org+workspace | set_data_plane | v1/org.data_plane.ts |
| POST | /v1/:org_slug/:workspace_slug/org/invitations/accept | org+workspace | accept_member_invite | v1/org.member_invite.accept.ts |
| POST | /v1/:org_slug/:workspace_slug/org/invitations/decline | org+workspace | decline_member_invite | v1/org.member_invite.decline.ts |
| POST | /v1/:org_slug/:workspace_slug/org/invitations/resend | org+workspace | resend_member_invite | v1/org.member_invite.resend.ts |
| POST | /v1/:org_slug/:workspace_slug/org/invitations/revoke | org+workspace | revoke_member_invite | v1/org.member_invite.revoke.ts |
| POST | /v1/:org_slug/:workspace_slug/org/members | org+workspace | add_org_member | v1/org.member.add.ts |
| DELETE | /v1/:org_slug/:workspace_slug/org/members/remove | org+workspace | remove_org_member | v1/org.member.remove.ts |
| PATCH | /v1/:org_slug/:workspace_slug/org/members/role | org+workspace | change_member_role | v1/org.member_role.change.ts |
| DELETE | /v1/:org_slug/:workspace_slug/org/model-credential | org+workspace | delete_model_credential | v1/org.model_credential.ts |
| GET | /v1/:org_slug/:workspace_slug/org/model-credential | org+workspace | get_model_credential | v1/org.model_credential.ts |
| PUT | /v1/:org_slug/:workspace_slug/org/model-credential | org+workspace | set_model_credential | v1/org.model_credential.ts |
| POST | /v1/:org_slug/:workspace_slug/org/model-credential/verify | org+workspace | verify_model_credential | v1/org.model_credential.ts |
| GET | /v1/:org_slug/:workspace_slug/org/settings | org+workspace | get_org_settings | v1/org.settings.read.ts |
| PATCH | /v1/:org_slug/:workspace_slug/org/settings | org+workspace | update_org_settings | v1/org.settings.write.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/catalog/browse | org+workspace | browse_plugin_catalog | v1/plugin.catalog.browse.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/catalog/get | org+workspace | get_catalog_plugin | v1/plugin.catalog.get.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/catalog/sync | org+workspace | sync_plugin_catalog | v1/plugin.catalog.sync.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/credential/reauth | org+workspace | reauth_plugin_credential | v1/plugin.credential.reauth.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/credential/revoke | org+workspace | revoke_plugin_credential | v1/plugin.credential.revoke.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/org/install | org+workspace | install_plugin | v1/plugin.org.install.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/org/install-bulk | org+workspace | install_plugins_bulk | v1/plugin.org.install_bulk.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/org/list | org+workspace | list_plugins | v1/plugin.org.list.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/org/uninstall | org+workspace | uninstall_plugin | v1/plugin.org.uninstall.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/registries | org+workspace | list_plugin_registries | v1/plugin.registry.list.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/registries/add | org+workspace | add_plugin_registry | v1/plugin.registry.add.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/registries/remove | org+workspace | remove_plugin_registry | v1/plugin.registry.remove.ts |
| POST | /v1/:org_slug/:workspace_slug/plugin/set-enabled | org+workspace | set_plugin_enabled | v1/plugin.set_enabled.ts |
| POST | /v1/:org_slug/:workspace_slug/privacy/erase | org+workspace | erase_data | v1/privacy.data.erase.ts |
| POST | /v1/:org_slug/:workspace_slug/privacy/export | org+workspace | export_data | v1/privacy.data.export.ts |
| GET | /v1/:org_slug/:workspace_slug/privacy/export/:exportId | org+workspace | get_export_status | v1/privacy.data.export.ts |
| GET | /v1/:org_slug/:workspace_slug/privacy/export/:exportId/download | org+workspace | get_export_status | v1/privacy.data.export.ts |
| POST | /v1/:org_slug/:workspace_slug/reference/search | org+workspace | search_references | v1/reference.search.ts |
| PATCH | /v1/:org_slug/:workspace_slug/repos/:id/configure | org+workspace | configure_repo | v1/repo.ts |
| GET | /v1/:org_slug/:workspace_slug/repos/:id/metrics | org+workspace | get_repo_metrics | v1/repo.ts |
| POST | /v1/:org_slug/:workspace_slug/repos/:id/pause | org+workspace | pause_repo | v1/repo.ts |
| POST | /v1/:org_slug/:workspace_slug/repos/:id/resume | org+workspace | resume_repo | v1/repo.ts |
| POST | /v1/:org_slug/:workspace_slug/repos/:id/sync | org+workspace | sync_repo | v1/repo.ts |
| GET | /v1/:org_slug/:workspace_slug/repos/branches | org+workspace | list_branches | v1/repo.ts |
| GET | /v1/:org_slug/:workspace_slug/repos/ci/status | org+workspace | get_ci_status | v1/repo.ts |
| GET | /v1/:org_slug/:workspace_slug/repos/pulls/:number | org+workspace | get_pr | v1/repo.ts |
| GET | /v1/:org_slug/:workspace_slug/repos/pulls/:number/diff | org+workspace | get_pr_diff | v1/repo.ts |
| GET | /v1/:org_slug/:workspace_slug/repositories | org+workspace | list_repositories | v1/repository.list.ts |
| POST | /v1/:org_slug/:workspace_slug/repository/init-pr | org+workspace | open_init_pr | v1/repository.init_pr.open.ts |
| POST | /v1/:org_slug/:workspace_slug/repository/link | org+workspace | link_repository | v1/repository.link.ts |
| GET | /v1/:org_slug/:workspace_slug/repository/main | org+workspace | get_main_repository | v1/repository.main.get.ts |
| POST | /v1/:org_slug/:workspace_slug/repository/main | org+workspace | bind_main_repository | v1/repository.main.bind.ts |
| POST | /v1/:org_slug/:workspace_slug/repository/tree | org+workspace | get_repository_tree | v1/repository.tree.get.ts |
| POST | /v1/:org_slug/:workspace_slug/repository/unlink | org+workspace | unlink_repository | v1/repository.unlink.ts |
| GET | /v1/:org_slug/:workspace_slug/router/policy | org+workspace | get_routing_policy | v1/router.policy.get.ts |
| POST | /v1/:org_slug/:workspace_slug/router/policy/set | org+workspace | set_routing_policy | v1/router.policy.set.ts |
| POST | /v1/:org_slug/:workspace_slug/router/preview | org+workspace | preview_routing_decision | v1/router.decision.preview.ts |
| GET | /v1/:org_slug/:workspace_slug/router/stats | org+workspace | list_routing_stats | v1/router.stats.list.ts |
| POST | /v1/:org_slug/:workspace_slug/runs | org+workspace | list_runs | v1/run.list.ts |
| GET | /v1/:org_slug/:workspace_slug/runs/:run_id/stream | org+workspace | get_run | v1/run.stream.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/bisect | org+workspace | bisect_runs | v1/run.bisect.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/chain | org+workspace | get_run_chain | v1/run.chain.get.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/cost | org+workspace | get_run_cost | v1/run.cost.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/export | org+workspace | export_run | v1/run.export.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/export-status | org+workspace | get_run_export | v1/run.export.get.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/fork | org+workspace | fork_run | v1/run.fork.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/frame-body | org+workspace | get_run_frame_body | v1/run.frame_body.get.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/get | org+workspace | get_run | v1/run.get.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/outputs | org+workspace | get_run_outputs | v1/run.outputs.get.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/proof | org+workspace | get_run_proof | v1/run.proof.get.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/recent | org+workspace | list_recent_runs | v1/run.recent.list.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/summarize | org+workspace | summarize_run | v1/run.summarize.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/token | org+workspace | create_run_token | v1/run.token.issue.ts |
| POST | /v1/:org_slug/:workspace_slug/runs/transcript | org+workspace | get_run_transcript | v1/run.transcript.get.ts |
| GET | /v1/:org_slug/:workspace_slug/schema | org+workspace | list_schemas | v1/schema.ts |
| DELETE | /v1/:org_slug/:workspace_slug/schema/:schemaName/labels/:labelName | org+workspace | delete_schema_label | v1/schema.ts |
| PUT | /v1/:org_slug/:workspace_slug/schema/:schemaName/labels/:labelName | org+workspace | upsert_schema_label | v1/schema.ts |
| DELETE | /v1/:org_slug/:workspace_slug/schema/:schemaName/properties/:ownerKind/:ownerName/:key | org+workspace | delete_schema_property | v1/schema.ts |
| PUT | /v1/:org_slug/:workspace_slug/schema/:schemaName/properties/:ownerKind/:ownerName/:key | org+workspace | upsert_schema_property | v1/schema.ts |
| DELETE | /v1/:org_slug/:workspace_slug/schema/:schemaName/relationships/:relationshipName | org+workspace | delete_schema_relationship | v1/schema.ts |
| PUT | /v1/:org_slug/:workspace_slug/schema/:schemaName/relationships/:relationshipName | org+workspace | upsert_schema_relationship | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/schema/:schemaName/toggle | org+workspace | toggle_schema | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/schema/chat | org+workspace | run_schema_chat | v1/schema.ts |
| GET | /v1/:org_slug/:workspace_slug/schema/export | org+workspace | export_schema | v1/schema.ts |
| GET | /v1/:org_slug/:workspace_slug/schema/recommend | org+workspace | recommend_schema | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/schema/reconcile/dispatch | org+workspace | dispatch_schema_reconcile | v1/schema.ts |
| GET | /v1/:org_slug/:workspace_slug/schema/reconcile/status | org+workspace | get_reconcile_status | v1/schema.ts |
| GET | /v1/:org_slug/:workspace_slug/schema/registry | org+workspace | get_schema_registry | v1/schema.ts |
| PUT | /v1/:org_slug/:workspace_slug/schema/registry/config | org+workspace | get_registry_config | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/schema/setup | org+workspace | setup_schema | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/schema/validate/node | org+workspace | validate_schema_node | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/schema/validate/relationship | org+workspace | validate_schema_relationship | v1/schema.ts |
| GET | /v1/:org_slug/:workspace_slug/schema/versions | org+workspace | list_schema_versions | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/schema/versions | org+workspace | create_schema_version | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/schema/versions/:versionId/pin | org+workspace | pin_schema_version | v1/schema.ts |
| GET | /v1/:org_slug/:workspace_slug/schema/versions/diff | org+workspace | diff_schema_versions | v1/schema.ts |
| POST | /v1/:org_slug/:workspace_slug/secret/export | org+workspace | export_secrets | v1/secret.export.ts |
| POST | /v1/:org_slug/:workspace_slug/secret/import-env | org+workspace | import_env_secrets | v1/secret.import_env.ts |
| POST | /v1/:org_slug/:workspace_slug/secret/key/delete | org+workspace | delete_secret_key | v1/secret.key.delete.ts |
| POST | /v1/:org_slug/:workspace_slug/secret/key/list | org+workspace | list_secret_keys | v1/secret.key.list.ts |
| POST | /v1/:org_slug/:workspace_slug/secret/key/upsert | org+workspace | upsert_secret_key | v1/secret.key.upsert.ts |
| POST | /v1/:org_slug/:workspace_slug/secret/reveal | org+workspace | reveal_secret | v1/secret.reveal.ts |
| POST | /v1/:org_slug/:workspace_slug/secret/value/set | org+workspace | set_secret_value | v1/secret.value.set.ts |
| POST | /v1/:org_slug/:workspace_slug/secret/value/unset | org+workspace | unset_secret_value | v1/secret.value.unset.ts |
| GET | /v1/:org_slug/:workspace_slug/shell/nav-counts | org+workspace | get_nav_counts | v1/shell.nav_counts.get.ts |
| POST | /v1/:org_slug/:workspace_slug/skills | org+workspace | list_skills | v1/skill.list.ts |
| POST | /v1/:org_slug/:workspace_slug/skills/config | org+workspace | get_skill_config | v1/skill.config.get.ts |
| POST | /v1/:org_slug/:workspace_slug/skills/config/update | org+workspace | update_skill_config | v1/skill.config.update.ts |
| POST | /v1/:org_slug/:workspace_slug/skills/propose | org+workspace | propose_skill | v1/skill.propose.ts |
| POST | /v1/:org_slug/:workspace_slug/skills/search/preview | org+workspace | preview_skill_search | v1/skill.search.preview.ts |
| POST | /v1/:org_slug/:workspace_slug/spend | org+workspace | get_spend | v1/spend.get.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/cost-centers | org+workspace | list_cost_centers | v1/cost_center.list.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/cost-centers/create | org+workspace | create_cost_center | v1/cost_center.create.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/cost-centers/delete | org+workspace | delete_cost_center | v1/cost_center.delete.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/cost-centers/set | org+workspace | set_cost_center | v1/cost_center.set.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/drill | org+workspace | get_spend_drill | v1/spend.drill.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/findings | org+workspace | list_findings | v1/finding.list.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/findings/dismiss | org+workspace | dismiss_finding | v1/finding.dismiss.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/findings/evidence | org+workspace | get_finding_evidence | v1/finding.evidence.get.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/findings/fix | org+workspace | record_finding_fix | v1/finding.fix.record.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/statement/export | org+workspace | export_statement | v1/spend.statement.export.ts |
| POST | /v1/:org_slug/:workspace_slug/spend/waste | org+workspace | list_waste | v1/spend.waste.ts |
| POST | /v1/:org_slug/:workspace_slug/system/install-instructions | org+workspace | get_install_instructions | v1/system.install.instructions.ts |
| POST | /v1/:org_slug/:workspace_slug/tacho/enrollment-tokens | org+workspace | create_enrollment_token | v1/tacho.enrollment_token.create.ts |
| POST | /v1/:org_slug/:workspace_slug/tacho/enrollments | org+workspace | create_tacho_enrollment | v1/tacho.enrollment.create.ts |
| POST | /v1/:org_slug/:workspace_slug/tacho/enrollments/revoke | org+workspace | revoke_tacho_enrollment | v1/tacho.enrollment.revoke.ts |
| POST | /v1/:org_slug/:workspace_slug/tacho/hosts | org+workspace | list_tacho_hosts | v1/tacho.host.list.ts |
| POST | /v1/:org_slug/:workspace_slug/tacho/incidents | org+workspace | list_incidents | v1/tacho.incident.list.ts |
| GET | /v1/:org_slug/:workspace_slug/tacho/session-policy | org+workspace | get_tacho_session_policy | v1/tacho.session_policy.read.ts |
| PATCH | /v1/:org_slug/:workspace_slug/tacho/session-policy | org+workspace | update_tacho_session_policy | v1/tacho.session_policy.write.ts |
| POST | /v1/:org_slug/:workspace_slug/tacho/sessions | org+workspace | list_tacho_sessions | v1/tacho.session.list.ts |
| POST | /v1/:org_slug/:workspace_slug/tacho/sessions/get | org+workspace | get_tacho_session | v1/tacho.session.get.ts |
| GET | /v1/:org_slug/:workspace_slug/telemetry/error/cluster | org+workspace | list_error_clusters | v1/telemetry.error.cluster.ts |
| POST | /v1/:org_slug/:workspace_slug/telemetry/stella/enrollments | org+workspace | create_stella_enrollment | v1/telemetry.stella.enroll.ts |
| GET | /v1/:org_slug/:workspace_slug/tool/declaration/list | org+workspace | list_tool_declarations | v1/tool.declaration.list.ts |
| POST | /v1/:org_slug/:workspace_slug/tool/declaration/publish | org+workspace | publish_tool_declaration | v1/tool.declaration.publish.ts |
| POST | /v1/:org_slug/:workspace_slug/tools/import | org+workspace | import_tools | v1/tool.import.ts |
| POST | /v1/:org_slug/:workspace_slug/tools/load | org+workspace | load_tools | v1/tools.load.ts |
| POST | /v1/:org_slug/:workspace_slug/tools/search | org+workspace | search_tools | v1/tools.search.ts |
| POST | /v1/:org_slug/:workspace_slug/tools/versions | org+workspace | list_tool_versions | v1/tool.version.list.ts |
| PUT | /v1/:org_slug/:workspace_slug/tools/versions/classification | org+workspace | set_tool_classification | v1/tool.classification.set.ts |
| GET | /v1/:org_slug/:workspace_slug/workspace/budget-policy | org+workspace | get_budget_policy | v1/workspace.budget_policy.read.ts |
| PATCH | /v1/:org_slug/:workspace_slug/workspace/budget-policy | org+workspace | update_budget_policy | v1/workspace.budget_policy.write.ts |
| POST | /v1/:org_slug/:workspace_slug/workspace/invite/send | org+workspace | send_workspace_invite | v1/workspace.invite.send.ts |
| GET | /v1/:org_slug/:workspace_slug/workspace/member/list | org+workspace | list_members | v1/workspace.member.list.ts |
| GET | /v1/:org_slug/:workspace_slug/workspace/model-settings | org+workspace | get_model_settings | v1/workspace.model_settings.read.ts |
| PATCH | /v1/:org_slug/:workspace_slug/workspace/model-settings | org+workspace | update_model_settings | v1/workspace.model_settings.write.ts |
| GET | /v1/:org_slug/:workspace_slug/workspace/prompt-settings | org+workspace | get_prompt_settings | v1/prompt.settings.read.ts |
| PATCH | /v1/:org_slug/:workspace_slug/workspace/prompt-settings | org+workspace | update_prompt_settings | v1/prompt.settings.write.ts |
| GET | /v1/:org_slug/:workspace_slug/workspace/settings | org+workspace | get_workspace_settings | v1/workspace.settings.read.ts |
| PATCH | /v1/:org_slug/:workspace_slug/workspace/settings | org+workspace | update_workspace_settings | v1/workspace.settings.write.ts |
| POST | /v1/:org_slug/:workspace_slug/workspaces | org+workspace | create_workspace | v1/workspace.create.ts |
| POST | /v1/:org_slug/:workspace_slug/workspaces/archive | org+workspace | archive_workspace | v1/workspace.archive.ts |
| GET | /health | public | — | health.ts |
| POST | /v1/auth/cli/token | public | — | v1/auth.cli.token.ts |
| POST | /v1/cms/book/redeem | public | — | v1/cms.ts |
| POST | /v1/cms/book/resend | public | — | v1/cms.ts |
| POST | /v1/cms/leads | public | — | v1/cms.ts |
| GET | /v1/run-exports/download | public | — | v1/run.export.download.ts |
| POST | /v1/tacho/enroll | public | enroll_host | v1/tacho.host.enroll.ts |
| POST | /v1/telemetry/usage | public | — | v1/telemetry.usage.ts |
| POST | /webhooks/:connectorId/:connectionId | public | — | v1/webhook.ts |
| POST | /webhooks/github/app | public | — | v1/github-webhook.ts |
| POST | /webhooks/stripe | public | — | stripe.ts |
| GET | /v1/telemetry/stella/apiKeyId | stella telemetry | ingest_stella_operational_telemetry | v1/telemetry.stella.ingest.ts |
| POST | /v1/telemetry/stella/operational | stella telemetry | ingest_stella_operational_telemetry | v1/telemetry.stella.ingest.ts |
| GET | /v1/tacho/apiKeyId | tacho host | fetch_commands | v1/tacho.command.fetch.ts |
| POST | /v1/tacho/bundle | tacho host | get_tacho_bundle | v1/tacho.bundle.get.ts |
| POST | /v1/tacho/commands | tacho host | fetch_commands | v1/tacho.command.fetch.ts |
| POST | /v1/tacho/events | tacho host | ingest_tacho_events | v1/tacho.events.ingest.ts |
| GET | /v1/auth/whoami | user | — | v1/auth.whoami.ts |
| GET | /v1/auth/whoamiapiKeyId | user | — | v1/auth.whoami.ts |
| GET | /v1/auth/whoamiorgId | user | — | v1/auth.whoami.ts |
| GET | /v1/auth/whoamiuserId | user | — | v1/auth.whoami.ts |
| GET | /v1/auth/whoamiworkspaceId | user | — | v1/auth.whoami.ts |
| POST | /v1/onboarding/state | user | get_onboarding_state | v1/onboarding.state.get.ts |
| POST | /v1/organizations | user | create_org | v1/org.create.ts |
| GET | /v1/user/budget/read | user | get_user_budget | v1/budget.policy.read.ts |
| PATCH | /v1/user/budget/write | user | update_user_budget | v1/budget.policy.write.ts |
| POST | /v1/user/organizations | user | list_orgs | v1/org.list.ts |
| PATCH | /v1/user/preferences | user | set_preferences | v1/user.preferences.set.ts |
| GET | /v1/user/preferences/read | user | get_user_preferences | v1/user.preferences.read.ts |
| PATCH | /v1/user/profile | user | update_profile | v1/user.profile.update.ts |
| POST | /v1/user/workspaces | user | list_workspaces | v1/workspace.list.ts |
Capability kernel
355 typed contracts, one registry, one invoke(). A contract's dotless snake_case name is its identity (ADR-025); the dotted filename is only where it lives.
How a surface reaches a handler
- 303 of 355 contracts bind a handler in
@oxagen/handlers; the rest register from@oxagen/agent/registeror run inline. - The registry lives on
globalThisunder a symbol so a bundler's double evaluation cannot register twice; duplicates with a different signature warn instead of throwing.
Gate order inside invoke()
- The billing, budget and usage slots are empty until
bootstrapBillingRuntime()fills them once per surface; a surface that forgets to bootstrap runs ungated, which is why the gate is set at boot, not per request. - An IAM throw fails closed regardless of
IAM_ENFORCEMENT_ENABLED. An agent-run invocation whose pinned authorization decision is null also fails closed. - Every failure path exits through the catch block before the accrual step, which is how ADR-052's rule that denials are free is enforced structurally rather than by policy.
Source refs (7, verified at build)
packages/oxagen/src/kernel.ts#_invokeCoreInnerpackages/oxagen/src/kernel.ts#setBillingAdmissionGatepackages/oxagen/src/kernel.ts#setUsageRecorderpackages/iam/src/check-iam.ts#checkIAMpackages/billing/src/metering.ts#assertCanStartTurnpackages/billing/src/spend-budget-gate.ts#assertWithinSpendBudgetpackages/billing/src/bootstrap.ts#bootstrapBillingRuntime
checkIAM decision order
- The audit row stores
payload_hash = sha256(raw input), never the input, andchain_hash = sha256(prev | event_id | capability)per (org, capability) chain. Verification is at range level: two concurrent writes can read the same predecessor. - The audit write is fire-and-forget with three retries; a failed emission is itself captured to the
error_eventstable.
Source refs (4, verified at build)
packages/iam/src/check-iam.ts#checkIAMpackages/iam/src/emit-audit.ts#AuditEventRowpackages/oxagen/src/iam/index.tspackages/run-evidence/src/digest.ts#digestJcs
Domains × surfaces
How many contracts in each domain are exposed on each surface. Read from packages/oxagen/capabilities.manifest.json.
| Domain | Contracts | agent | api | cli | mcp | Handlers |
|---|---|---|---|---|---|---|
agent | 60 | 44 | 60 | 3 | 53 | 16 |
api_key | 4 | 3 | 4 | · | 4 | 4 |
approval_rule | 5 | 3 | 5 | · | 5 | 5 |
asset | 1 | 1 | 1 | · | 1 | 1 |
assistant | 2 | · | 2 | · | 2 | 0 |
audit | 2 | 1 | 2 | 1 | 2 | 2 |
auth | 1 | · | · | · | · | 1 |
billing | 15 | 11 | 14 | 2 | 14 | 15 |
capability | 2 | 2 | 2 | · | 2 | 2 |
chat | 2 | · | 2 | · | 2 | 2 |
command | 2 | 2 | 2 | · | · | 2 |
configuration | 2 | · | 2 | · | 2 | 2 |
connection | 10 | 10 | 10 | · | 10 | 10 |
context | 14 | 6 | 14 | · | 8 | 14 |
control | 3 | · | 3 | · | 2 | 3 |
conversation | 9 | 8 | 9 | · | 9 | 9 |
cost | 4 | · | 4 | 3 | 4 | 4 |
credential | 1 | · | 1 | · | 1 | 1 |
environment | 6 | 6 | 6 | · | 6 | 6 |
evidence | 1 | · | 1 | · | · | 1 |
graph | 6 | 6 | 5 | 3 | 5 | 6 |
iam | 4 | 4 | 4 | · | 4 | 4 |
integration | 7 | 7 | 7 | 6 | 7 | 7 |
kill_switch | 2 | 1 | 2 | · | 2 | 2 |
mandate | 6 | 6 | 6 | · | 6 | 6 |
model | 1 | 1 | 1 | · | 1 | 1 |
notification | 2 | 2 | 2 | · | 2 | 2 |
onboarding | 3 | · | 3 | · | 2 | 3 |
ontology | 2 | 2 | 2 | 2 | 2 | 2 |
org | 18 | 9 | 18 | · | 18 | 16 |
plugin | 19 | 18 | 19 | · | 19 | 19 |
privacy | 3 | 2 | 3 | · | 3 | 3 |
reference | 2 | 2 | 1 | · | 1 | 1 |
repo | 9 | 9 | 9 | 4 | 9 | 9 |
repository | 11 | · | 11 | 6 | 9 | 11 |
router | 4 | · | 4 | 4 | 4 | 4 |
run | 16 | · | 16 | 1 | 9 | 16 |
schema | 23 | 10 | 22 | 21 | 21 | 23 |
secret | 8 | 6 | 8 | · | 8 | 8 |
shell | 1 | · | 1 | · | 1 | 1 |
skill | 6 | · | 5 | · | 4 | 6 |
spend | 13 | 1 | 13 | · | 13 | 13 |
system | 1 | 1 | 1 | · | 1 | 1 |
tacho | 12 | 2 | 12 | 2 | 4 | 12 |
telemetry | 3 | 1 | 3 | · | 1 | 2 |
tool | 5 | 1 | 5 | · | 4 | 5 |
tools | 2 | 2 | 2 | · | 2 | 0 |
user | 7 | 4 | 7 | · | 5 | 7 |
workspace | 13 | 11 | 13 | 1 | 13 | 13 |
Capability catalog
| Name | Domain | Mode | Surfaces | Layers | Handler |
|---|---|---|---|---|---|
assign_agent_role | agent | sync | agent api mcp | api · mcp · unit · docs · app | @oxagen/agent or inline |
attach_memory_evidence | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
bind_agent_environment | agent | sync | agent api mcp | api · mcp · unit · docs | agent.environment.bind.ts |
cite_memory | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
commit_agent_definition | agent | sync | api | schema · api · unit · docs · app | agent.definition.commit.ts |
commit_memory_import | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
create_agent_def | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
debug_execution | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
delete_agent_def | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
delete_mcp_server | agent | sync | api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
delete_memory | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
demote_memory | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
deploy_agent | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
dismiss_memory_promotion | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
get_agent | agent | sync | api cli mcp | schema · api · mcp · unit · docs · app | @oxagen/agent or inline |
get_agent_def | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
get_agent_role | agent | sync | agent api mcp | api · mcp · unit · docs | @oxagen/agent or inline |
get_agent_toolbelt | agent | sync | api mcp | schema · api · mcp · unit · docs · app | agent.toolbelt.get.ts |
get_citation_stats | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
get_execution_trace | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
get_memory_policy | agent | sync | agent api mcp | schema · api · mcp · unit · docs | agent.memory_policy.read.ts |
list_agent_defs | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
list_agent_environments | agent | sync | agent api mcp | api · mcp · unit · docs | agent.environment.list.ts |
list_agent_roles | agent | sync | agent api mcp | api · mcp · unit · docs | @oxagen/agent or inline |
list_agent_tools | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
list_agents | agent | sync | api mcp | schema · api · mcp · unit · docs · app | @oxagen/agent or inline |
list_approvals | agent | sync | api mcp | schema · api · mcp · unit · docs · app | @oxagen/agent or inline |
list_executions | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
list_mcp_consents | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
list_mcp_servers | agent | sync | agent api mcp | schema · api · mcp · unit · docs · app | @oxagen/agent or inline |
list_memories | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
list_memory_citations | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
list_memory_promotions | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
list_resolved_approvals | agent | sync | api cli mcp | schema · api · mcp · unit · docs · app | @oxagen/agent or inline |
parse_memory_import | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
promote_memory | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
propose_agent | agent | sync | api | schema · api · unit · docs · app | agent.propose.ts |
publish_agent_def | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
recall_memory | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
record_execution | agent | sync | api mcp | schema · api · mcp · unit · docs | agent.execution.record.ts |
register_agent | agent | sync | api cli | schema · api · unit · docs · app | agent.register.ts |
register_mcp_server | agent | sync | api mcp | schema · api · mcp · unit · docs · app | @oxagen/agent or inline |
resolve_approval | agent | sync | agent api mcp | schema · api · mcp · unit · docs · app | @oxagen/agent or inline |
resolve_mcp_consent | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
resolve_mcp_servers | agent | sync | api | schema · api | @oxagen/agent or inline |
retire_agent | agent | sync | api | schema · api · unit · docs · app | agent.retire.ts |
revise_agent_def | agent | sync | agent api mcp | schema · api · mcp · docs | agent.definition.revise.ts |
revoke_agent_role | agent | sync | agent api mcp | api · mcp · unit · docs · app | @oxagen/agent or inline |
rotate_agent_credential | agent | sync | api | schema · api · unit · docs · app | agent.credential.rotate.ts |
save_memory | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
set_mcp_enabled | agent | sync | api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
suggest_agent_def | agent | sync | agent api mcp | schema · api · mcp · unit · docs | agent.definition.suggest.ts |
suggest_promotion_rationales | agent | sync | agent api mcp | schema · api · mcp · docs | @oxagen/agent or inline |
summarize_agent_def | agent | sync | agent api mcp | schema · api · mcp · docs | agent.definition.summarize.ts |
suspend_agent | agent | sync | api | schema · api · unit · docs · app | agent.suspend.ts |
unbind_agent_environment | agent | sync | agent api mcp | api · mcp · unit · docs | agent.environment.unbind.ts |
update_agent_def | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
update_memory | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
update_memory_policy | agent | sync | agent api mcp | schema · api · mcp · unit · docs | agent.memory_policy.write.ts |
write_memory | agent | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
create_api_key | api_key | sync | agent api mcp | api · docs · mcp · unit · app | api.key.create.ts |
list_api_keys | api_key | sync | api mcp | api · docs · mcp · unit · app | api.key.list.ts |
revoke_api_key | api_key | sync | agent api mcp | api · docs · mcp · unit · app | api.key.revoke.ts |
rotate_api_key | api_key | sync | agent api mcp | api · docs · mcp · unit · app | api.key.rotate.ts |
delete_approval_rule | approval_rule | sync | agent api mcp | schema · api · mcp · unit · docs · app | approval_rule.delete.ts |
get_auto_eligibility | approval_rule | sync | api mcp | schema · api · mcp · unit · docs · app | approval.auto_eligibility.get.ts |
list_approval_rules | approval_rule | sync | api mcp | schema · api · mcp · unit · docs · app | approval_rule.list.ts |
set_approval_rule_enabled | approval_rule | sync | agent api mcp | schema · api · mcp · unit · docs · app | approval_rule.enabled.set.ts |
set_approval_rules | approval_rule | sync | agent api mcp | schema · api · mcp · unit · docs · app | approval_rule.set.ts |
upload_asset | asset | sync | agent api mcp | schema · api · mcp · unit · docs | asset.upload.ts |
ask_assistant | assistant | async | api mcp | schema · api · mcp · unit · docs · app | @oxagen/agent or inline |
get_assistant_engine | assistant | sync | api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
export_audit_events | audit | sync | api mcp | schema · api · mcp · unit · docs · app | audit.events.export.ts |
query_audit_log | audit | sync | agent api cli mcp | schema · api · mcp · unit · docs · app | audit.log.query.ts |
authorize_cli | auth | sync | schema · unit · docs · app | auth.cli.authorize.ts | |
get_contract_rate | billing | sync | agent api mcp | schema · api · mcp · unit · docs · app | billing.contract_rate.get.ts |
get_evidence_retention | billing | sync | agent api mcp | schema · api · mcp · unit · docs | billing.evidence_retention.ts |
get_gau_bucket | billing | sync | api mcp | schema · api · mcp · unit · docs · app | billing.gau_bucket.get.ts |
get_rate_card | billing | sync | agent api mcp | schema · api · mcp · unit · docs | billing.action_rate_card.ts |
get_spend_budget | billing | sync | agent api cli mcp | schema · api · docs · mcp · unit · app | billing.budget.get.ts |
get_subscription | billing | sync | agent api mcp | schema · api · mcp · unit · docs · app | billing.subscription.read.ts |
get_usage_breakdown | billing | sync | agent api mcp | schema · api · mcp · unit · docs | billing.usage.breakdown.ts |
list_invoices | billing | sync | api mcp | schema · api · mcp · unit · docs · app | billing.invoice.list.ts |
preview_action_cost | billing | sync | agent api mcp | schema · api · mcp · unit · docs | billing.action_estimate.ts |
purchase_credits | billing | sync | agent api mcp | schema · api · mcp · unit · docs · app | billing.credits.purchase.ts |
purchase_gau_bucket | billing | sync | agent api mcp | schema · api · mcp · unit · docs · app | billing.gau_bucket.purchase.ts |
set_auto_topup | billing | sync | api mcp | schema · api · mcp · unit · docs · app | billing.auto_topup.set.ts |
set_org_billing_terms | billing | sync | schema · unit · docs | billing.org_terms.set.ts | |
set_spend_budget | billing | sync | agent api cli mcp | schema · api · docs · mcp · unit · app | billing.budget.set.ts |
start_subscription_upgrade | billing | sync | agent api mcp | schema · api · mcp · unit · docs · app | billing.subscription_upgrade.start.ts |
get_capability_registry | capability | sync | agent api mcp | api · mcp · unit · docs | capability.registry.get.ts |
list_capability_registry | capability | sync | agent api mcp | api · mcp · unit · docs | capability.registry.list.ts |
get_message_execution | chat | sync | api mcp | schema · api · mcp · unit · docs | chat.message.execution.ts |
send_message | chat | async | api mcp | schema · api · mcp · unit · docs | chat.message.send.ts |
search_command_menu | command | sync | agent api | schema · api · unit · docs | command.menu.search.ts |
suggest_commands | command | sync | agent api | schema · api · unit · docs | command.menu.suggest.ts |
get_clone_draft | configuration | sync | api mcp | schema · api · mcp · docs · app | configuration.clone.get.ts |
propose_configuration_clone | configuration | sync | api mcp | schema · api · mcp · docs · app | configuration.clone.propose.ts |
create_connection | connection | sync | agent api mcp | schema · api · mcp · unit · docs · app | connection.create.ts |
delete_connection | connection | async | agent api mcp | schema · api · mcp · unit · docs | connection.delete.ts |
get_connection | connection | sync | agent api mcp | schema · api · mcp · unit · docs · app | connection.get.ts |
get_connection_mappings | connection | sync | agent api mcp | schema · api · mcp · unit · docs | connection.mappings.get.ts |
list_connections | connection | sync | agent api mcp | schema · api · mcp · unit · docs · app | connection.list.ts |
pause_connection | connection | sync | agent api mcp | schema · api · mcp · unit · docs | connection.pause.ts |
preview_connection | connection | sync | agent api mcp | schema · api · mcp · unit · docs | connection.preview.ts |
set_connection_mappings | connection | sync | agent api mcp | schema · api · mcp · unit · docs | connection.mappings.set.ts |
suggest_connection_mappings | connection | sync | agent api mcp | schema · api · mcp · unit · docs | connection.mappings.suggest.ts |
update_connection | connection | sync | agent api mcp | schema · api · mcp · unit · docs | connection.update.ts |
append_record | context | sync | agent api mcp | schema · api · mcp · unit · docs | context.records.append.ts |
dismiss_proposal | context | sync | api | schema · api · unit · docs · app | context.proposal.dismiss.ts |
get_context_pr | context | sync | api mcp | schema · api · mcp · unit · docs · app | context.pr.get.ts |
get_record | context | sync | agent api mcp | schema · api · mcp · unit · docs · app | context.records.get.ts |
get_steering_freshness | context | sync | agent api mcp | schema · api · mcp | context.steering.freshness.ts |
list_context_records | context | sync | agent api mcp | schema · api · docs · mcp · unit | context.record.list.ts |
list_proposals | context | sync | api mcp | schema · api · mcp · unit · docs · app | context.proposal.list.ts |
list_records | context | sync | agent api mcp | schema · api · mcp · unit · docs · app | context.records.list.ts |
merge_context_pr | context | sync | api | schema · api · unit · docs · app | context.pr.merge.ts |
open_context_pr | context | sync | api | schema · api · unit · docs · app | context.pr.open.ts |
promote_context_record | context | sync | api | schema · api · docs · unit | context.record.promote.ts |
propose_record | context | sync | agent api mcp | schema · api · mcp · unit · docs · app | context.proposal.create.ts |
publish_context_record | context | sync | api | schema · api · docs · unit | context.record.publish.ts |
revise_context_record | context | sync | api | schema · api · unit · docs · app | context.record.revise.ts |
dispatch_command | control | sync | api mcp | schema · api · mcp · unit · docs · app | tacho.command.dispatch.ts |
fetch_commands | control | sync | api | schema · api · unit · docs | tacho.command.fetch.ts |
list_commands | control | sync | api mcp | schema · api · mcp · unit · docs | tacho.command.list.ts |
add_conversation_attachment | conversation | sync | agent api mcp | schema · api · mcp · unit · docs | conversation.attachment.add.ts |
archive_conversation | conversation | sync | agent api mcp | schema · api · mcp · unit · docs | conversation.archive.ts |
delete_conversation | conversation | sync | agent api mcp | schema · api · mcp · unit · docs | conversation.delete.ts |
export_conversation | conversation | sync | agent api mcp | schema · api · mcp · unit · docs | conversation.export.ts |
list_conversation_files | conversation | sync | agent api mcp | schema · api · mcp · unit · docs | conversation.files.list.ts |
list_conversations | conversation | sync | agent api mcp | schema · api · mcp · unit · docs | conversation.list.ts |
post_conversation_message | conversation | sync | api mcp | schema · api · docs · mcp | conversation.chat.ts |
purge_conversations | conversation | sync | agent api mcp | schema · api · docs · mcp · unit | conversation.purge.ts |
rename_conversation | conversation | sync | agent api mcp | schema · api · docs · mcp · unit | conversation.rename.ts |
list_price_entries | cost | sync | api cli mcp | schema · api · mcp · app · unit · docs | cost.price_entry.list.ts |
list_unpriced_models | cost | sync | api mcp | schema · api · mcp · app · unit · docs | cost.unpriced_model.list.ts |
remove_price_entry | cost | sync | api cli mcp | schema · api · mcp · app · unit · docs | cost.price_entry.remove.ts |
set_price_entry | cost | sync | api cli mcp | schema · api · mcp · app · unit · docs | cost.price_entry.set.ts |
list_credential_grants | credential | sync | api mcp | schema · api · mcp · unit · docs · app | credential.grant.list.ts |
create_environment | environment | sync | agent api mcp | api · mcp · unit · docs | environment.create.ts |
delete_environment | environment | sync | agent api mcp | api · mcp · unit · docs | environment.delete.ts |
get_environment | environment | sync | agent api mcp | api · mcp · unit · docs | environment.get.ts |
list_environments | environment | sync | agent api mcp | api · mcp · unit · docs | environment.list.ts |
set_default_environment | environment | sync | agent api mcp | api · mcp · unit · docs | environment.set_default.ts |
update_environment | environment | sync | agent api mcp | api · mcp · unit · docs | environment.update.ts |
set_disclosure_grain | evidence | sync | api | schema · api · unit · docs | evidence.disclosure_grain.set.ts |
get_graph_stats | graph | sync | agent api mcp | schema · api · mcp · unit · docs | graph.stats.ts |
get_node | graph | sync | agent api cli mcp | schema · api · mcp · unit · docs | graph.node.get.ts |
get_node_labels | graph | sync | agent | schema · unit · docs | graph.node_label.get.ts |
list_nodes | graph | sync | agent api mcp | schema · api · mcp · unit · docs | graph.node.list.ts |
search_graph | graph | sync | agent api cli mcp | schema · api · mcp · unit · docs | graph.search.ts |
search_nodes | graph | sync | agent api cli mcp | schema · api · mcp · unit · docs | graph.node.search.ts |
create_role | iam | sync | agent api mcp | schema · api · mcp · unit · docs · app | iam.role.create.ts |
delete_role | iam | sync | agent api mcp | schema · api · mcp · unit · docs · app | iam.role.delete.ts |
list_iam_roles | iam | sync | agent api mcp | schema · api · mcp · unit · docs · app | iam.role.list.ts |
set_role_grants | iam | sync | agent api mcp | schema · api · mcp · unit · docs · app | iam.role.grants.set.ts |
configure_integration | integration | sync | agent api cli mcp | schema · api · mcp · unit · docs | integration.configure.ts |
delete_integration | integration | async | agent api cli mcp | schema · api · mcp · unit · docs | integration.delete.ts |
get_integration | integration | sync | agent api cli mcp | schema · api · mcp · unit · docs | integration.get.ts |
get_integration_metrics | integration | sync | agent api mcp | schema · api · mcp · unit · docs | integration.metrics.ts |
install_integration | integration | async | agent api cli mcp | schema · api · mcp · unit · docs | integration.install.ts |
list_integrations | integration | sync | agent api cli mcp | schema · api · mcp · unit · docs | integration.list.ts |
sync_integration | integration | async | agent api cli mcp | schema · api · mcp · unit · docs | integration.sync.ts |
list_kill_switches | kill_switch | sync | api mcp | schema · api · mcp · unit · docs · app | kill_switch.list.ts |
set_kill_switch | kill_switch | sync | agent api mcp | schema · api · mcp · unit · docs · app | kill_switch.set.ts |
get_mandate | mandate | sync | agent api mcp | schema · api · mcp · unit · docs · app | mandate.get.ts |
grant_mandate | mandate | sync | agent api mcp | schema · api · mcp · unit · docs · app | mandate.grant.ts |
list_mandates | mandate | sync | agent api mcp | schema · api · mcp · unit · docs · app | mandate.list.ts |
request_mandate | mandate | sync | agent api mcp | schema · api · mcp · unit · docs · app | mandate.request.ts |
revoke_mandate | mandate | sync | agent api mcp | schema · api · mcp · unit · docs · app | mandate.revoke.ts |
update_mandate_limits | mandate | sync | agent api mcp | schema · api · mcp · unit · docs · app | mandate.limits.update.ts |
list_model_capabilities | model | sync | agent api mcp | api · mcp · unit · docs | model.capability.list.ts |
list_notifications | notification | sync | agent api mcp | api · docs · mcp · unit | notification.list.ts |
mark_notification | notification | sync | agent api mcp | api · docs · mcp · unit | notification.mark.ts |
advance_onboarding | onboarding | sync | api | schema · api · unit · docs · app | onboarding.advance.ts |
get_first_frame | onboarding | sync | api mcp | schema · api · mcp · unit · docs · app | onboarding.first_frame.get.ts |
get_onboarding_state | onboarding | sync | api mcp | schema · api · mcp · unit · docs · app | onboarding.state.get.ts |
get_ontology_neighbors | ontology | sync | agent api cli mcp | schema · api · mcp · unit · docs | ontology.neighbors.ts |
query_ontology | ontology | sync | agent api cli mcp | schema · api · mcp · unit · docs | ontology.query.ts |
accept_member_invite | org | sync | agent api mcp | schema · api · mcp · unit · docs · app | org.member_invite.accept.ts |
add_org_member | org | sync | agent api mcp | schema · api · mcp · unit · docs | org.member.add.ts |
change_member_role | org | sync | agent api mcp | api · docs · mcp · unit · app | org.member_role.change.ts |
create_org | org | sync | agent api mcp | schema · api · mcp · unit · docs · app | org.create.ts |
decline_member_invite | org | sync | agent api mcp | schema · api · mcp · unit · docs · app | org.member_invite.decline.ts |
delete_model_credential | org | sync | api mcp | schema · api · mcp · unit · docs · app | org.model_credential.delete.ts |
get_data_plane | org | sync | api mcp | schema · api · mcp · unit · docs | org.data_plane.get.ts |
get_model_credential | org | sync | api mcp | schema · api · mcp · unit · docs · app | org.model_credential.get.ts |
get_org_settings | org | sync | agent api mcp | schema · api · mcp · unit · docs | org.settings.read.ts |
list_members | org | sync | api mcp | schema · api · mcp · unit · docs · app | workspace.member.list.ts |
list_orgs | org | sync | agent api mcp | schema · api · mcp · unit · docs · app | org.list.ts |
remove_org_member | org | sync | agent api mcp | api · docs · mcp · unit · app | org.member.remove.ts |
resend_member_invite | org | sync | api mcp | schema · api · mcp · docs · app | @oxagen/agent or inline |
revoke_member_invite | org | sync | api mcp | schema · api · mcp · docs · app | @oxagen/agent or inline |
set_data_plane | org | sync | api mcp | schema · api · mcp · unit · docs | org.data_plane.set.ts |
set_model_credential | org | sync | api mcp | schema · api · mcp · unit · docs · app | org.model_credential.set.ts |
update_org_settings | org | sync | agent api mcp | schema · api · mcp · unit · docs | org.settings.write.ts |
verify_model_credential | org | sync | api mcp | schema · api · mcp · unit · docs · app | org.model_credential.verify.ts |
add_plugin_registry | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.registry.add.ts |
browse_plugin_catalog | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.catalog.browse.ts |
get_auth_alerts | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.settings.get_auth_alerts.ts |
get_catalog_plugin | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.catalog.get.ts |
get_plugin_schema | plugin | sync | agent api mcp | schema · api · mcp · unit · docs | plugin.schema.get.ts |
install_plugin | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.org.install.ts |
install_plugins_bulk | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.org.install_bulk.ts |
list_plugin_registries | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.registry.list.ts |
list_plugin_versions | plugin | sync | agent api mcp | schema · api · mcp · unit · docs | plugin.version.list.ts |
list_plugins | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.org.list.ts |
reauth_plugin_credential | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.credential.reauth.ts |
remove_plugin_registry | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.registry.remove.ts |
revoke_plugin_credential | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.credential.revoke.ts |
set_auth_alerts | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.settings.set_auth_alerts.ts |
set_plugin_enabled | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.set_enabled.ts |
set_plugin_secret | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.credential.set_secret.ts |
sync_plugin_catalog | plugin | sync | api mcp | api · mcp · unit · docs | plugin.catalog.sync.handler.ts |
uninstall_plugin | plugin | sync | agent api mcp | api · docs · mcp · unit | plugin.org.uninstall.ts |
validate_plugin_schema | plugin | sync | agent api mcp | schema · api · mcp · unit · docs | plugin.schema.validate.ts |
erase_data | privacy | async | agent api mcp | schema · api · mcp · unit · docs | privacy.data.erase.ts |
export_data | privacy | async | agent api mcp | schema · api · mcp · unit · docs · app | privacy.data.export.ts |
get_export_status | privacy | sync | api mcp | schema · api · mcp · unit · docs · app | privacy.data.export.status.ts |
cite_reference | reference | sync | agent | schema · docs | @oxagen/agent or inline |
search_references | reference | sync | agent api mcp | schema · api · mcp · docs | reference.search.ts |
configure_repo | repo | sync | agent api cli mcp | schema · api · mcp · unit · docs | repo.configure.ts |
get_ci_status | repo | sync | agent api mcp | api · mcp · docs | repo.ci.status.ts |
get_pr | repo | sync | agent api mcp | api · mcp · docs | repo.pr.get.ts |
get_pr_diff | repo | sync | agent api mcp | api · mcp · docs | repo.pr.diff.ts |
get_repo_metrics | repo | sync | agent api mcp | schema · api · mcp · unit · docs | repo.metrics.ts |
list_branches | repo | sync | agent api mcp | api · mcp · unit | repo.branch.list.ts |
pause_repo | repo | sync | agent api cli mcp | schema · api · mcp · unit · docs | repo.pause.ts |
resume_repo | repo | sync | agent api cli mcp | schema · api · mcp · unit · docs | repo.resume.ts |
sync_repo | repo | async | agent api cli mcp | schema · api · mcp · unit · docs | repo.sync.ts |
attach_github_installation | repository | sync | api | schema · api · unit · docs · app | repository.installation.attach.ts |
bind_main_repository | repository | sync | api | schema · api · unit · docs · app | repository.main.bind.ts |
get_main_repository | repository | sync | api mcp | schema · api · mcp · unit · docs · app | repository.main.get.ts |
get_repository_tree | repository | sync | api cli mcp | schema · api · mcp · docs · app | repository.tree.get.ts |
link_repository | repository | sync | api cli mcp | schema · api · mcp · docs · app | repository.link.ts |
list_github_installations | repository | sync | api mcp | schema · api · mcp · unit · docs · app | repository.installation.candidates.ts |
list_installation_repositories | repository | sync | api mcp | schema · api · mcp · unit · docs · app | repository.installation.list.ts |
list_repositories | repository | sync | api cli mcp | schema · api · mcp · docs · app | repository.list.ts |
open_init_pr | repository | sync | api cli mcp | schema · api · mcp · docs · app | repository.init_pr.open.ts |
set_production_branch | repository | sync | api cli mcp | schema · api · mcp · docs · app | repository.production_branch.set.ts |
unlink_repository | repository | sync | api cli mcp | schema · api · mcp · docs · app | repository.unlink.ts |
get_routing_policy | router | sync | api cli mcp | schema · api · mcp · docs | router.policy.get.ts |
list_routing_stats | router | sync | api cli mcp | schema · api · mcp · docs | router.stats.list.ts |
preview_routing_decision | router | sync | api cli mcp | schema · api · mcp · docs | router.decision.preview.ts |
set_routing_policy | router | sync | api cli mcp | schema · api · mcp · docs | router.policy.set.ts |
bisect_runs | run | sync | api mcp | schema · api · mcp · unit · docs · app | run.bisect.ts |
create_run_token | run | sync | api | schema · api · docs | run.token.issue.ts |
export_run | run | async | api | schema · api · unit · docs · app | run.export.ts |
fork_run | run | sync | api | schema · api · unit · docs · app | run.fork.ts |
get_run | run | sync | api mcp | schema · api · mcp · unit · docs · app | run.get.ts |
get_run_chain | run | sync | api mcp | schema · api · mcp · unit · docs · app | run.chain.get.ts |
get_run_cost | run | sync | api mcp | schema · api · mcp · unit · docs · app | run.cost.ts |
get_run_export | run | sync | api cli mcp | schema · api · mcp · cli · unit · docs · app | run.export.get.ts |
get_run_frame_body | run | sync | api mcp | schema · api · mcp · unit · docs · app | run.frame_body.get.ts |
get_run_outputs | run | sync | api | schema · api · app · unit · docs | run.outputs.get.ts |
get_run_proof | run | sync | api | schema · api · unit · docs | run.proof.get.ts |
get_run_transcript | run | sync | api mcp | schema · api · mcp · unit · docs · app | run.transcript.get.ts |
ingest_run_frames | run | sync | api | schema · api · docs | run.frames.ingest.ts |
list_recent_runs | run | sync | api mcp | schema · api · mcp · unit · docs | run.recent.list.ts |
list_runs | run | sync | api mcp | schema · api · mcp · unit · docs · app | run.list.ts |
summarize_run | run | async | api | schema · api · unit · docs · app | run.summarize.ts |
create_schema_version | schema | sync | api cli mcp | schema · api · mcp · docs | schema.version.create.ts |
delete_schema | schema | sync | agent | schema · docs | schema.delete.ts |
delete_schema_label | schema | sync | api cli mcp | schema · api · mcp · docs | schema.label.delete.ts |
delete_schema_property | schema | sync | api cli mcp | schema · api · mcp · docs | schema.property.delete.ts |
delete_schema_relationship | schema | sync | api cli mcp | schema · api · mcp · docs | schema.relationship.delete.ts |
diff_schema_versions | schema | sync | api cli mcp | schema · api · mcp · docs | schema.version.diff.ts |
dispatch_schema_reconcile | schema | async | api cli mcp | schema · api · mcp · docs | schema.reconcile.dispatch.ts |
export_schema | schema | sync | api cli mcp | schema · api · mcp · docs | schema.export.ts |
get_reconcile_status | schema | sync | api cli mcp | schema · api · mcp · docs | schema.reconcile.status.ts |
get_registry_config | schema | sync | api cli mcp | schema · api · mcp · docs | schema.registry.config.ts |
get_schema_registry | schema | sync | api cli mcp | schema · api · mcp · docs | schema.registry.get.ts |
list_schema_versions | schema | sync | api cli mcp | schema · api · mcp · docs | schema.version.list.ts |
list_schemas | schema | sync | agent api cli mcp | schema · api · mcp · docs | schema.list.ts |
pin_schema_version | schema | sync | api cli mcp | schema · api · mcp · docs | schema.version.pin.ts |
recommend_schema | schema | sync | agent api cli mcp | schema · api · mcp · docs | schema.recommend.ts |
run_schema_chat | schema | sync | agent api | schema · api · docs | schema.chat.ts |
setup_schema | schema | sync | agent api cli mcp | schema · api · mcp · docs | schema.setup.ts |
toggle_schema | schema | sync | api cli mcp | schema · api · mcp · docs | schema.toggle.ts |
upsert_schema_label | schema | sync | agent api cli mcp | schema · api · mcp · docs | schema.label.upsert.ts |
upsert_schema_property | schema | sync | agent api cli mcp | schema · api · mcp · docs | schema.property.upsert.ts |
upsert_schema_relationship | schema | sync | agent api cli mcp | schema · api · mcp · docs | schema.relationship.upsert.ts |
validate_schema_node | schema | sync | agent api cli mcp | schema · api · mcp · docs | schema.validate.node.ts |
validate_schema_relationship | schema | sync | agent api cli mcp | schema · api · mcp · docs | schema.validate.relationship.ts |
delete_secret_key | secret | sync | agent api mcp | api · mcp · unit · docs | secret.key.delete.ts |
export_secrets | secret | sync | api mcp | api · mcp · unit · docs | secret.export.ts |
import_env_secrets | secret | sync | agent api mcp | api · mcp · unit · docs | secret.import_env.ts |
list_secret_keys | secret | sync | agent api mcp | api · mcp · unit · docs | secret.key.list.ts |
reveal_secret | secret | sync | api mcp | api · mcp · unit · docs | secret.reveal.ts |
set_secret_value | secret | sync | agent api mcp | api · mcp · unit · docs | secret.value.set.ts |
unset_secret_value | secret | sync | agent api mcp | api · mcp · unit · docs | secret.value.unset.ts |
upsert_secret_key | secret | sync | agent api mcp | api · mcp · unit · docs | secret.key.upsert.ts |
get_nav_counts | shell | sync | api mcp | schema · api · mcp · unit · docs | shell.nav_counts.get.ts |
get_skill_config | skill | sync | api mcp | schema · api · mcp · docs · app | skill.config.get.ts |
list_skills | skill | sync | api mcp | schema · api · mcp · unit · docs · app | skill.list.ts |
preview_skill_search | skill | sync | api | schema · api · docs · app | skill.search.preview.ts |
propose_skill | skill | sync | api | schema · api · unit · docs · app | skill.propose.ts |
summarize_skill_search | skill | sync | mcp | schema · mcp · docs | skill.search.summarize.ts |
update_skill_config | skill | sync | api mcp | schema · api · mcp · docs · app | skill.config.update.ts |
create_cost_center | spend | sync | api mcp | schema · api · mcp · unit · docs · app | cost_center.create.ts |
delete_cost_center | spend | sync | api mcp | schema · api · mcp · unit · docs · app | cost_center.delete.ts |
dismiss_finding | spend | sync | api mcp | schema · api · mcp · unit · docs · app | finding.dismiss.ts |
export_cost_center_statement | spend | sync | api mcp | schema · api · mcp · unit · docs · app | spend.cost_center_statement.export.ts |
export_statement | spend | sync | api mcp | schema · api · mcp · unit · docs · app | spend.statement.export.ts |
get_finding_evidence | spend | sync | api mcp | schema · api · mcp · unit · docs · app | finding.evidence.get.ts |
get_spend | spend | sync | api mcp | schema · api · mcp · unit · docs · app | spend.get.ts |
get_spend_drill | spend | sync | api mcp | schema · api · mcp · unit · docs · app | spend.drill.ts |
list_cost_centers | spend | sync | api mcp | schema · api · mcp · unit · docs · app | cost_center.list.ts |
list_findings | spend | sync | api mcp | schema · api · mcp · unit · docs · app | finding.list.ts |
list_waste | spend | sync | api mcp | schema · api · mcp · unit · docs · app | spend.waste.ts |
record_finding_fix | spend | sync | agent api mcp | schema · api · mcp · unit · docs · app | finding.fix.record.ts |
set_cost_center | spend | sync | api mcp | schema · api · mcp · unit · docs · app | cost_center.set.ts |
get_install_instructions | system | sync | agent api mcp | schema · api · mcp · unit · docs | system.install.instructions.ts |
create_enrollment_token | tacho | sync | api cli | schema · api · unit · docs · app | tacho.enrollment_token.create.ts |
create_tacho_enrollment | tacho | sync | api | schema · api · unit · docs | tacho.enrollment.create.ts |
enroll_host | tacho | sync | api cli | schema · api · unit · docs | tacho.host.enroll.ts |
get_tacho_bundle | tacho | sync | api | schema · api · unit · docs | tacho.bundle.get.ts |
get_tacho_session | tacho | sync | api | schema · api · unit · docs | tacho.session.get.ts |
get_tacho_session_policy | tacho | sync | agent api mcp | schema · api · docs · mcp · unit · app | tacho.session_policy.read.ts |
ingest_tacho_events | tacho | sync | api | schema · api · unit · docs | tacho.events.ingest.ts |
list_incidents | tacho | sync | api mcp | schema · api · mcp · unit · docs · app | tacho.incident.list.ts |
list_tacho_hosts | tacho | sync | api mcp | schema · api · mcp · unit · docs | tacho.host.list.ts |
list_tacho_sessions | tacho | sync | api | schema · api · unit · docs | tacho.session.list.ts |
revoke_tacho_enrollment | tacho | sync | api | schema · api · unit · docs · app | tacho.enrollment.revoke.ts |
update_tacho_session_policy | tacho | sync | agent api mcp | schema · api · docs · mcp · unit · app | tacho.session_policy.write.ts |
create_stella_enrollment | telemetry | sync | api | schema · api | telemetry.stella.enroll.ts |
ingest_stella_operational_telemetry | telemetry | sync | api | schema · api · unit · docs | telemetry.stella.ingest.ts |
list_error_clusters | telemetry | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
import_tools | tool | sync | api mcp | schema · api · mcp · unit · docs · app | tool.import.ts |
list_tool_declarations | tool | sync | agent api mcp | schema · api · docs · mcp · unit | tool.declaration.list.ts |
list_tool_versions | tool | sync | api mcp | schema · api · mcp · unit · docs · app | tool.version.list.ts |
publish_tool_declaration | tool | sync | api | schema · api · docs · unit | tool.declaration.publish.ts |
set_tool_classification | tool | sync | api mcp | schema · api · mcp · unit · docs · app | tool.classification.set.ts |
load_tools | tools | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
search_tools | tools | sync | agent api mcp | schema · api · mcp · unit · docs | @oxagen/agent or inline |
get_user_budget | user | sync | agent api mcp | schema · api · docs · mcp · unit | budget.policy.read.ts |
get_user_preferences | user | sync | agent api mcp | schema · api · docs · mcp · unit · app | user.preferences.read.ts |
get_workspace_user_preferences | user | sync | agent api mcp | schema · api · docs · mcp | user.workspace_preferences.read.ts |
set_preferences | user | sync | api mcp | schema · api · mcp · unit · docs · app | user.preferences.set.ts |
update_profile | user | sync | api | schema · api · unit · docs · app | user.profile.update.ts |
update_user_budget | user | sync | agent api mcp | schema · api · docs · mcp · unit | budget.policy.write.ts |
update_workspace_user_preferences | user | sync | api | schema · api · docs | user.workspace_preferences.write.ts |
archive_workspace | workspace | sync | agent api mcp | schema · api · mcp · unit · docs · app | workspace.archive.ts |
create_workspace | workspace | sync | agent api mcp | schema · api · mcp · unit · docs · app | workspace.create.ts |
get_budget_policy | workspace | sync | agent api mcp | schema · api · docs · mcp · unit | workspace.budget_policy.read.ts |
get_model_settings | workspace | sync | agent api mcp | schema · api · docs · mcp · unit | workspace.model_settings.read.ts |
get_prompt_settings | workspace | sync | agent api mcp | schema · api · docs · mcp · unit | prompt.settings.read.ts |
get_workspace_settings | workspace | sync | agent api mcp | schema · api · mcp · unit · docs | workspace.settings.read.ts |
list_workspaces | workspace | sync | agent api mcp | schema · api · mcp · unit · docs · app | workspace.list.ts |
send_workspace_invite | workspace | sync | api mcp | schema · api · mcp · unit · docs · app | workspace.invite.send.ts |
set_governance_mode | workspace | sync | api cli mcp | schema · api · mcp · cli · unit · docs · app | context.governance_mode.set.ts |
update_budget_policy | workspace | sync | agent api mcp | schema · api · docs · mcp · unit | workspace.budget_policy.write.ts |
update_model_settings | workspace | sync | agent api mcp | schema · api · docs · mcp · unit | workspace.model_settings.write.ts |
update_prompt_settings | workspace | sync | agent api mcp | schema · api · docs · mcp · unit | prompt.settings.write.ts |
update_workspace_settings | workspace | sync | agent api mcp | schema · api · mcp · unit · docs · app | workspace.settings.write.ts |
The governed turn
The one agent loop in this repo is a governed, metered Q&A turn over the fleet record and the knowledge graph. It runs models on stella-serve and tools through invoke().
The governed turn (in-app agent)
- There is no Inngest persistence hop: messages are written inline by the route inside
withTenantDb. Thechat.persist-streamfunction named in older codemaps has no sender and no file. - Role routing inside the provider port: verdict/judge calls use the tier above the worker, summarisation and reflection use
fast, everything else the turn's worker model. - Context records (ADR-051) no longer enter the turn; that ADR is superseded by ADR-043. What rides as a volatile user message today is recalled workspace memory.
Source refs (11, verified at build)
apps/api/src/routes/v1/chat.stream.ts#chatStreamRoutepackages/agent/src/runtime/assistant-recall.ts#recallWorkspaceMemoryMessageapps/api/src/routes/v1/chat-stream-translator.ts#createApiStreamTranslatorpackages/ai/src/funding-source.ts#resolveModelFundingSourcepackages/billing/src/turn-credit-gate.ts#evaluateTurnCreditGatepackages/agent/src/runtime/governed-turn.ts#runGovernedTurnpackages/agent/src/runtime/materialize-tools.ts#materializeToolspackages/agent/src/runtime/tool-budget.ts#assertToolListFitsProviderpackages/agent/src/runtime/engine/provider.ts#createProviderPortpackages/agent/src/runtime/engine/tools.ts#executeToolRequestpackages/ai/src/index.ts#streamAgentReply
Evidence ledger and wrapped agents
Execution evidence arrives from agents Oxagen does not run. The ledger stamps, seals and grades it; it never re-runs anything (ADR-043).
The evidence ledger's record chain
- The stream digest folds only
(attempt_seq, schema_version, event_type, payload_digest), deliberately excluding stage and observed time, so a finalizer can reproduce it from the log alone. - A repeated
(attempt_id, attempt_seq)with a different digest is an integrity error: the insert has noON CONFLICT, the transaction rolls back, andagent_run.event_sequence_conflictis emitted afterwards. - Grants carry no expiry column. The seal binding plus one successful consumption is the limiting authority;
(org_id, submission_id)is the finalization idempotency key.
Source refs (6, verified at build)
packages/run-ledger/src/run-store.ts#ATTEMPT_TERMINAL_STATUSESpackages/run-ledger/src/run-store.ts#runStatusForTerminalpackages/run-ledger/src/finalization-grant.ts#FINALIZATION_GRANT_CAPABILITYpackages/run-ledger/src/event-payload-registry.ts#EVIDENCE_STAGESpackages/run-evidence/src/digest.ts#digestJcspackages/run-evidence/src/limits.ts#MAX_ENVELOPE_JCS_BYTES
Run and attempt status
- Run status values:
pending · running · completed · failed · cancelled. Attempt terminal statuses:completed · failed · cancelled · denied · abandoned.
Source refs (2, verified at build)
packages/run-ledger/src/run-store.ts#ATTEMPT_TERMINAL_STATUSESpackages/run-ledger/src/run-store.ts#runStatusForTerminal
Wrapping: evidencing an agent Oxagen does not run
- Two enforcement tiers: a denial inside a process Oxagen does not own grades as
harness(client-attested); only calls through the governed gateway grade asgateway-enforced. - The ClickHouse DDL for
tacho_eventsis generated from the envelope schema; a test fails when the SQL and the schema disagree.
Source refs (6, verified at build)
packages/tacho/src/envelope.ts#TACHO_ENVELOPE_VERSIONpackages/tacho/src/wire.ts#TACHO_BATCH_SCHEMApackages/handlers/src/tacho.events.ingest.tsapps/api/src/routes/v1/tacho.events.ingest.tsapps/api/src/middleware/distributed-rate-limit.ts#distributedRateLimiterpackages/telemetry/src/tacho-events-ddl.ts
Metering and billing
The governed action is the billable unit. Tokens are reported at full price and billed at zero except when the platform key funds them.
From governed action to GAU bucket debit (ADR-052, ADR-055)
- Stripe idempotency is three-phase: insert into
stripe_eventswithON CONFLICT DO NOTHING; treat as duplicate only if a processing row hasprocessed_at; dispatch, then record the outcome. A prior failed attempt re-dispatches, so a provider retry self-heals. It is not exactly-once. - The only billing background job is
billing.dunning-sweep(02:00 UTC): grace → suspended past the grace end, then a keyset sweep for low-balance notifications. - The
stripe.sync-*events named in older inventories have no sender; the webhook route handles those events inline.
Source refs (12, verified at build)
packages/billing/src/bootstrap.ts#setUsageRecorderpackages/billing/src/action-metering.ts#recordGovernedActionpackages/billing/src/contract-terms.ts#resolveGauEntitlementpackages/billing/src/billing-settings.ts#readOrgBillingSettingspackages/billing/src/gau-bucket.ts#periodForpackages/billing/src/gau-bucket.ts#ensureCurrentBucketpackages/billing/src/gau-bucket.ts#remainingGaupackages/billing/src/gau-settlements.ts#claimAutoTopuppackages/billing/src/webhooks.ts#processStripeEventpackages/billing/src/grants.ts#grantPlanCreditsForInvoicePaidapps/api/src/routes/stripe.tspackages/inngest-functions/src/functions/billing.dunning-sweep.ts
assertCanStartTurn
- The spend-budget gate runs after it with org and workspace ceilings from
billing.spend_budgets; a breach surfaces asbudget_exceeded.
Source refs (2, verified at build)
packages/billing/src/metering.ts#assertCanStartTurnpackages/billing/src/spend-budget-gate.ts#assertWithinSpendBudget
Knowledge graph
Connectors dual-write: Postgres holds the cursor and health, Neo4j holds entities, embeddings and relationships, ClickHouse observes. The ontology is tenant data in the schema registry.
ingestion/entity.received → EntityNode
- Concurrency is capped at 5 per organisation (
concurrency: { key: event.data.orgId }). - Every tenant node also carries the anchor label
GraphNode; it exists to back indexes because Neo4j cannot parameterise labels. Relationship types are tenant data inschema_registry.relationship_types, not a static enum.
Source refs (6, verified at build)
packages/inngest-functions/src/functions/ingestion.pipeline.tspackages/ingestion/src/dedup/resolve.tspackages/ingestion/src/mutations/upsert-entity.tspackages/ingestion/src/pipeline.tspackages/ontology/src/tenant.ts#scopedSessionpackages/ontology/src/schema.cypher
Neo4j labels
From packages/ontology/src/schema.cypher via the storage manifest. Relationship types are not static: each tenant declares them in schema_registry.relationship_types; the only hard-coded fallback is RELATED_TO.
| Label | Domain | Key properties | Constraints / indexes | Org-scoped |
|---|---|---|---|---|
Agent | agent | publicId | agent_public_id | — |
AgentMemory | agent | citation_count, embedding, memory_class, memory_kind, orgId, promotion_dismissed_at, publicId, status | agent_memory_public_id | yes |
AgentVersion | agent | publicId | agent_version_public_id | — |
BackgroundTask | agent | orgId, publicId | background_task_public_id | yes |
Citation | agent | id, orgId | citation_id | yes |
Conversation | chat | publicId | conversation_public_id | — |
Demotion | graph | id, orgId | demotion_id | yes |
Document | content | embedding, orgId, publicId | document_public_id | yes |
EntityNode | ingestion | connectionId, embedding, entityType, naturalKey, workspaceId | entity_node_connection,entity_node_natural_key,entity_node_workspace | — |
Evidence | agent | id, orgId | evidence_id | yes |
Execution | agent | orgId, publicId | execution_public_id | yes |
Fanout | agent | orgId, publicId | fanout_public_id | yes |
GraphNode | graph | embedding, label, orgId, publicId, workspaceId | graph_node_public_id | yes |
Message | chat | conversationId, embedding, publicId | message_public_id | — |
Plan | agent | publicId | plan_public_id | — |
Playbook | workflow | publicId | playbook_public_id | — |
PlaybookVersion | workflow | publicId | playbook_version_public_id | — |
Promotion | agent | id, orgId | promotion_id | yes |
Skill | agent | publicId | skill_public_id | — |
SkillVersion | agent | publicId | skill_version_public_id | — |
SourceConnection | ingestion | id, orgId | source_connection_id | yes |
SubagentFanout | graph | orgId, publicId | subagent_fanout_public_id | yes |
SubagentRun | graph | orgId, publicId | subagent_run_public_id | yes |
Tenant | org | publicId | tenant_public_id | — |
Tool | agent | orgId, publicId | tool_public_id | yes |
ToolVersion | agent | publicId | tool_version_public_id | — |
User | auth | publicId | user_public_id | — |
Workspace | workspace | publicId | workspace_public_id | — |
Vector indexes
All 1536-dimensional cosine. graph_node_embedding_index is the universal one because every tenant node also carries the GraphNode anchor label.
| Index | Label | Property |
|---|---|---|
document_embedding_index | Document | embedding |
entity_node_embedding_index | EntityNode | embedding |
graph_node_embedding_index | GraphNode | embedding |
memory_embedding_index | AgentMemory | embedding |
message_embedding_index | Message | embedding |
Datastores
Four stores, one storage manifest (ADR-031) that the gate keeps byte-stable. Postgres is transactional truth under forced row-level security; ClickHouse is append-only telemetry; Neo4j is the graph; Blob holds bytes the Postgres row points at.
| Store | Tables | Purpose | Domains |
|---|---|---|---|
postgres | 141 | Transactional state — users, orgs, permissions, billing, configs, durable application state. | agent ai auth billing chat cms content cost environments evidence iam ingestion mcp notification org plugin privacy ratelimit schema_registry security skills tacho tools workspace |
clickhouse | 11 | Append-only runtime events — execution events, logs, metrics, traces, token analytics, telemetry. | agent billing eval telemetry |
neo4j | 28 | Graph data — ontology/entity relationships, workflow lineage, agent memory, semantic retrieval. | agent auth chat content graph ingestion org workflow workspace |
blob | 4 | Binary assets — avatars, generated media, uploads; the Postgres row (URL + metadata) is source of truth. | content |
Domains across stores
Rows are the platform's storage domains; a cell counts the tables (or labels) that domain owns in each store.
| Domain | postgres | clickhouse | neo4j | blob |
|---|---|---|---|---|
agent | 19 | 2 | 14 | · |
ai | 1 | · | · | · |
auth | 9 | · | 1 | · |
billing | 18 | 2 | · | · |
chat | 2 | · | 2 | · |
cms | 3 | · | · | · |
content | 1 | · | 1 | 4 |
cost | 6 | · | · | · |
environments | 5 | · | · | · |
eval | · | 3 | · | · |
evidence | 5 | · | · | · |
graph | · | · | 4 | · |
iam | 9 | · | · | · |
ingestion | 12 | · | 2 | · |
mcp | 7 | · | · | · |
notification | 1 | · | · | · |
org | 8 | · | 1 | · |
plugin | 1 | · | · | · |
privacy | 2 | · | · | · |
ratelimit | 1 | · | · | · |
schema_registry | 7 | · | · | · |
security | 3 | · | · | · |
skills | 2 | · | · | · |
tacho | 10 | · | · | · |
telemetry | · | 4 | · | · |
tools | 2 | · | · | · |
workflow | · | · | 2 | · |
workspace | 7 | · | 1 | · |
Postgres schemas
- Tenancy columns come from mixins (
orgScopeMixin,auditMixin,softDeleteMixin), so they are not literal in the table bodies but are present in every drawn card. - Tables without
org_idare isolated transitively through a policied parent or are shared catalogs; the RLS badge on each card names its policy class fromtenant-policy.manifest.ts.
Entity relationships by schema
◆ marks a primary key, → a referencing column, ? a nullable column. Composite primary keys are not visible to the manifest and show no ◆.
agent (19 tables)
ai (1 tables)
auth (9 tables)
billing (18 tables)
chat (2 tables)
cms (3 tables)
content (1 tables)
cost (6 tables)
environments (5 tables)
evidence (5 tables)
iam (9 tables)
ingestion (12 tables)
mcp (7 tables)
notification (1 tables)
org (8 tables)
plugin (1 tables)
privacy (2 tables)
ratelimit (1 tables)
schema_registry (7 tables)
security (3 tables)
skills (2 tables)
tacho (10 tables)
tools (2 tables)
workspace (7 tables)
ClickHouse
Replayed the way packages/telemetry/src/migrate.ts does: schema.sql first, then every numbered migration, honouring drops. The storage manifest only sees schema.sql, so this list is the fuller one.
| Table | Engine | ORDER BY | Columns | Defined in |
|---|---|---|---|---|
audit_events | ReplacingMergeTree(occurred_at) | (org_id, occurred_at, event_id) | 18 | migrations/0003_iam_audit.sql |
claude_sessions | ReplacingMergeTree(inserted_at) | (user_email, session_id, timestamp, entry_uuid) | 34 | migrations/0007_claude_sessions.sql |
dev_logs | MergeTree() | (dev_session, service, ts) | 7 | schema.sql |
error_events | MergeTree() | (org_id, source, created_at) | 14 | migrations/0020_error_events.sql |
eval_item_results | MergeTree() | (org_id, workspace_id, run_id, item_id, created_at) | 21 | migrations/0020_eval_item_results.sql |
eval_results | MergeTree() | (harness, suite, task_id, agent_version, created_at) | 20 | schema.sql |
eval_runs | ReplacingMergeTree(updated_at) | (harness, suite, agent_name, agent_version, run_id) | 28 | schema.sql |
events | MergeTree() | (org_id, event_type, emitted_at) | 8 | schema.sql |
execution_logs | MergeTree() | (org_id, execution_id, created_at) | 8 | schema.sql |
graph_observed_labels | MergeTree() | (org_id, workspace_id, target_kind, label_or_type, occurred_at) | 9 | migrations/0013_graph_observed_labels.sql |
memory_changes | MergeTree() | (org_id, memory_id, occurred_at) | 9 | migrations/0016_memory_changes.sql |
router_outcomes | MergeTree() | (org_id, task_class, model, created_at) | 15 | migrations/0025_router_outcomes.sql |
sandbox_log_events | MergeTree() | (org_id, workspace_id, session_id, ts) | 11 | migrations/0024_sandbox_log_events.sql |
schema_conformance_events | ReplacingMergeTree(occurred_at) | (org_id, workspace_id, version_id, node_label, event_id) | 16 | migrations/0021_schema_conformance_events_idempotency.sql |
skill_loads | MergeTree() | (org_id, workspace_id, skill_id, created_at) | 9 | migrations/0008_skill_loads.sql |
stella_operational_events | ReplacingMergeTree(received_at) | (org_id, workspace_id, event_id) | 17 | migrations/0026_stella_operational_events.sql |
tacho_events | ReplacingMergeTree(received_at) | (org_id, workspace_id, session_uuid, seq) | 383 | migrations/0027_tacho_events.sql |
token_usage | MergeTree() | (org_id, created_at, execution_step_id) | 18 | schema.sql |
tool_invocations | MergeTree() | (org_id, capability_name, created_at) | 22 | schema.sql |
usage_events | MergeTree() | (command, timestamp) | 19 | migrations/0019_usage_events.sql |
Blob
| Asset kind | Description | Access | Driver |
|---|---|---|---|
avatar | Public profile/logo images; the blob URL is stored on the owning entity's avatar_url column (no generated_assets row). | public | vercel-blob |
evidence_body | Frame bodies (Mission Control spec §8.2): redacted, content-addressed, envelope-encrypted bytes under evidence/<org>/<workspace>/bodies/<key id>/<sha256>; agent_run_events.body_ref and ClickHouse tacho_events.bytes_ref hold the reference (ADR-058). | private | vercel-blob |
evidence_segment | Per-seal archive segments (frame envelopes as zstd NDJSON, written once at seal) and export bundles; the seal's archive_segment_ref and run_exports.bundle_ref hold the reference (ADR-058). | private | vercel-blob |
generated_asset | Generated + uploaded media (chat attachments, exports, agent output); content.generated_assets is the source-of-truth reference row. | private | vercel-blob |
Background jobs
33 Inngest functions served at /api/inngest on apps/api. Trigger events are parsed with the same scanner the gate uses to prove every event has a sender.
Event → function → event
- Functions are declared through a local
createFunctionadapter that can return an on-failure companion, which is why some exports destructure two functions.
Functions
| Id | Trigger | Sends | Retries | File |
|---|---|---|---|---|
approval/resume | * * * * * | — | 3 | approval.resume.ts |
auth/session-expiry-audit | 0 * * * * | — | 3 | auth.session-expiry-audit.ts |
billing.dunning-sweep | 0 2 * * * | — | 3 | billing.dunning-sweep.ts |
billing.gau-close | 10 * * * * | — | 3 | billing.gau-close.ts |
billing.usage-delivery | * * * * * | — | 3 | billing.usage-delivery.ts |
cost.daily-rollup | 0 1 * * * | — | 3 | cost.daily-rollup.ts |
cost.findings | 0 2 * * * | — | 3 | cost.findings.ts |
cost.price-book-reprice | cost/findings.requested | 3 | cost.price-book-reprice.ts | |
cost.price-book-sync | 0 * * * * | — | 3 | cost.price-book-sync.ts |
cost.run-rollup | cost/run.sealed | cost/findings.requested | 5 | cost.run-rollup.ts |
evidence.frame-compaction | 0 4 3 * * | — | 3 | evidence.frame-compaction.ts |
evidence.run-export | — | 2 | evidence.run-export.ts | |
ingestion-connection-poll | ingestion/connection.poll | ingestion/entity.received | 2 | ingestion.connection-poll.ts |
ingestion-delete-connection | ingestion/connection.delete | — | 2 | ingestion.delete.ts |
ingestion-github-initial-sync | ingestion/github.initial-sync | ingestion/entity.received | 3 | ingestion.github-initial-sync.ts |
ingestion-oauth-refresh | 0 * * * * | — | 2 | ingestion.oauth-refresh.ts |
ingestion-pipeline | ingestion/entity.received | ingestion/entity.createdingestion/entity.updated | 3 | ingestion.pipeline.ts |
ingestion-poll-scheduler | */5 * * * * | ingestion/connection.poll | 2 | ingestion.poll-scheduler.ts |
ingestion-sync-requested | ingestion/sync.requested | ingestion/github.initial-sync | 3 | ingestion.sync-requested.ts |
ingestion-webhook-provision | ingestion/webhook.provision | — | 3 | ingestion.webhook-provision.ts |
ingestion-webhook-renew | 0 * * * * | — | 2 | ingestion.webhook-renew.ts |
mandate/expiry | 0 * * * * | — | 3 | mandate.expiry.ts |
mcp.credential-grant-retention | 30 4 * * 0 | — | 3 | mcp.credential-grant-retention.ts |
mcp.tool-snapshot-retention | 0 4 2 * * | — | 3 | mcp.tool-snapshot-retention.ts |
memory.decay-pass | 0 4 * * * | — | 3 | memory.decay-pass.ts |
observability.capture-failure | inngest/function.failed | — | 0 | observability.capture-failure.ts |
plugin.catalog-sync | 0 */6 * * * | — | 1 | plugin.catalog-sync.ts |
plugin.oauth-refresh-watcher | */30 * * * * | — | 0 | plugin.oauth-refresh-watcher.ts |
privacy.erasure-execute | privacy/erasure.execute | — | 3 | privacy.erasure.execute.ts |
privacy.export-process | privacy/export.process | — | 2 | privacy.export.process.ts |
run.summarize | — | 2 | run.summarize.ts | |
schema-reconcile | schema/reconcile.start | — | 2 | schema.reconcile.ts |
security.audit-partition-rollover | 0 3 * * * | — | 3 | security.audit-partition-rollover.ts |
CLI and MCP surfaces
The CLI speaks HTTP to apps/api and mirrors response shapes by hand; the MCP server exposes one tool per contract whose surfaces include mcp, named exactly after the contract.
MCP tools
308 tool files under apps/mcp/src/tools, 307 contracts declare the mcp surface. Tool files with no matching contract stem: _schema-test-helpers.
CLI commands
From apps/cli/src/program.ts, the side-effect-free Commander tree.
| Command | Description |
|---|---|
agent | Govern the workspace's registered agents |
agent enroll | Wrap this machine: device key, host credential, tachod service, harness hooks. A single-use enrollment token (oxe_1time_…) enrolls it as that registered agent's host; anything else uses a platform API token or the logged-in session |
agent env | Bind an agent to an environment |
agent env bind | Bind an agent to an environment (promotes to primary if it is the agent's first) |
agent env list | List an agent's environment bindings |
agent env unbind | Remove an agent's binding to an environment |
agent register | Register an agent identity and print its credential once — Owner/Admin only |
agent status | — |
agent unenroll | — |
approvals | Read the workspace's approval ledger |
approvals resolved | List resolved approvals, most recently resolved first, including a call a decision rule auto-approved with no person |
asset | Ingest and manage binary assets in object storage |
asset upload | Ingest an asset from a public URL. With --conversation, records it as a |
budget | Hard period-to-date spend ceilings that gate agent runs — org + workspace |
budget set | Set (create or replace) a spend ceiling — Owner/Admin/Billing only |
budget show | Show configured spend ceilings with their live burn |
context | Steering: record a proposal on a lineage |
context propose | Record a proposal (the record it should become, why); its Context PR is opened and merged in Oxagen |
conversation | Export and inspect chat conversations |
conversation export | Export a conversation's active branch as Markdown (stdout/file) or a |
cost | Project model cost from the baked-in rate card (observed spend: `budget show`) |
env | Manage workspace environments |
env create | Create an environment |
env get | Show one environment |
env list | List environments in the active workspace |
env rm | Delete an environment (not the default) |
env set-default | Promote an environment to the workspace default |
env update | Update an environment |
graph | Query the knowledge graph |
graph search | Semantic (vector) search across the customer context graph |
init | Link this project to an Oxagen org + workspace (writes .oxagen/workspace.json) |
login | Authenticate the CLI — opens a browser by default (interactive). Use --token for CI/headless. |
logout | Clear the stored Oxagen session from ~/.config/oxagen/config.json. |
logs | See and debug the CLI's log (~/.oxagen/logs/cli.output). Captures invocations, |
memory | Manage the workspace's agent memories (list, show, edit, salience, promote, candidates, rm) |
memory candidates | List the top OBSERVATION memories by citation pressure ripe for promotion |
memory citations | Workspace citation analytics: totals, influence/compliance, most-cited / least-useful / most-violated memories and nodes |
memory demote | Demote a memory to RULE or OBSERVATION, recording an auditable demotion event (target must be below the current class) |
memory dismiss | Dismiss a memory from the promotion candidate queue (or restore it with --restore) |
memory edit | Edit a memory's lesson, kind, or source |
memory import | Bulk-import markdown skill files / rule docs as memories (previews unless --yes) |
memory list | List the workspace's memories, sorted by recency or citation count |
memory promote | Promote a memory to RULE or FACT, recording an auditable promotion event (FACT requires human confirmation) |
memory rm | Permanently delete a memory by id |
memory salience | Adjust a memory's confidence/enforcement scores or lifecycle status (class changes go through `memory promote`) |
memory show | Show one memory in full detail (by id or publicId) |
price | The organization's negotiated rates in the price book — what runs are billed at |
price list | Read current prices and optionally scheduled negotiated rates |
price remove | End a negotiated rate so the model returns to the list price — Owner/Admin/Billing only |
price set | Set a negotiated rate for one model and token class — Owner/Admin/Billing only |
remember | Capture a memory — infers its class + kind and saves it to the workspace graph |
repo | The workspace's repositories: one main repository, bound at creation, and the linked ones its agents work on |
repo branch | Confirm or change a repository's production branch; the branch must exist on GitHub |
repo governance | Set the steering governance mode: who may merge a Context PR in this workspace |
repo init | Open the pull request that adds .oxagen/ to a repository; it never writes to the production branch |
repo link | Link a GitHub repository the workspace's GitHub App installation reaches as a linked repository |
repo list | Every repository the workspace binds, main first, with each one's approved default ref and binding id |
repo tree | What a repository holds under .oxagen/ on its production branch, read from GitHub now |
repo unlink | Unlink a linked repository by its binding id; the main repository is refused |
router | Verified-Outcome Market Router — learned, economic model routing |
router policy | Get or set the governed market-router policy |
router policy get | Show the effective policy and its provenance |
router policy set | Update the policy (org Owner/Admin) — changes spend behavior |
router preview | Dry-run the routing decision for a prompt (changes nothing) |
router stats | Observed outcomes per (task class, model) + cheapest-clearing model per class |
run | The recorded run: its chain and seal, and its signed evidence bundle |
run chain | Show what makes a run's record tamper-evident: the hash rule, the root, the checkpoints, the gaps, and the replay ladder |
run download | Download a ready run export and check its sha256 against the recorded digest |
run export | Queue the signed, offline-verifiable evidence bundle for a sealed run — Owner/Admin only |
run export-status | Show where a run export stands and, once it is ready, its download link |
secret | Manage the workspace credential vault |
secret export | Export resolved secrets as .env (recorded to the access log) |
secret import | Import .env text (preview unless --yes) |
secret list | List vault keys (masked metadata) |
secret reveal | Reveal a secret's plaintext value (recorded to the access log) |
secret rm | Delete a key, or just an environment override with --env |
secret set | Set a secret's default value, or an override with --env |
steering | Steering freshness: whether .oxagen/ carries the records merged on the production branch |
steering gate | The pre-prompt check an agent harness calls. Exit 0 allows, exit 2 refuses with the reason on stderr |
steering hooks | — |
steering status | Compare .oxagen/ against the remote production branch and show the two gates |
steering sync | Take .oxagen/ from the remote production branch; refuses while it holds uncommitted or unmerged work |
telemetry | Inspect or control anonymous CLI usage telemetry (on by default — see TELEMETRY.md) |
trace | — |
verify | Check a run export bundle offline: each frame's digest and link, the Merkle root, and each signature |
Retired commands
Kept as stubs that explain where the capability went.
| Command | Was |
|---|---|
a2a | The Agent2Agent protocol surface |
agents | The fleet agents screen |
code | Local code diff/patch/format utilities |
command | User-defined slash commands |
config | The local CLI config file |
daemon | The local context daemon |
eval | Eval datasets and runs |
file-lock | Agent file locks |
fleet | The session fleet |
import | Foreign-platform artifact import |
lineage | The subagent dispatch-tree explorer |
mcp | Local MCP server configuration |
models | On-device model runtime selection |
pr | Pull-request CI watching and merging |
prompt | Saved prompt snippets |
recover | Agent commit-ledger recovery |
replay | Local turn replay |
rules | Local agent rule files |
sandbox | Agent sandbox sessions |
sandbox-template | Sandbox template management |
settings | The local settings.json driver |
skill | Loadable skill bundles |
solve | Best-of-N task solving |
view | The agent-work dashboard |
Deployment
One AWS account, OpenTofu stacks under infra/stacks-new, a single application node behind an ALB, Aurora for Postgres, and GitHub Actions deploying over OIDC.
Production topology (AWS account 916294258235)
- Only the ALB terminates TLS (ACM, DNS-validated). The node has no public IP and no SSH key; administration is SSM Session Manager, and Neo4j's ports never leave loopback.
- The deploy job runs one service at a time on an ARM runner;
stella-serveis first in the matrix so it is up before the services that call it. A commit that is no longer the tip ofmainrefuses to ship. - Nothing migrates production automatically. Postgres migrations run from the node over SSM (
infra/tools/run-db-migrations.sh); ClickHouse and Neo4j through the manualstore-migrateworkflow. - Logs go CloudWatch → Kinesis Firehose → S3 archive; high-severity log lines fan into an EventBridge bus through a Lambda publisher. The ingestion KMS key wraps connector credentials.
Source refs (10, verified at build)
infra/stacks-new/oxagen/main.tfinfra/stacks-new/oxagen/data-services.tf#aws_rds_clusterinfra/modules/app-node/main.tfinfra/modules/network/main.tfinfra/modules/static-site/main.tfinfra/tools/caddy/Caddyfile.albinfra/stacks-new/ci-deploy/infra-apply.tf.github/actions/ship-to-node/action.ymltools/scripts/package-for-node.shtools/scripts/build-env.ts
Caddy host routing on the node
Read from infra/tools/caddy/Caddyfile.alb.
| Host | Upstream |
|---|---|
api.oxagen.sh | 127.0.0.1:4000 |
app.oxagen.sh | 127.0.0.1:3000 |
docs.oxagen.sh | 127.0.0.1:3002 |
internal.oxagen.sh | 127.0.0.1:3003 |
mcp.oxagen.sh | 127.0.0.1:4100 |
stella.oxagen.sh | 127.0.0.1:3001 |
CI job graph (CI)
- Deploys refuse to ship a commit that is no longer the tip of
main, so a superseded queued run stays green without publishing.
Workflows
| File | Name | Triggers | Jobs |
|---|---|---|---|
ci-image.yml | ci-image | workflow_dispatch | 1 |
db-migrate.yml | DB Migrate (manual) | workflow_dispatch | 2 |
desktop-rig.yml | Desktop install rig | pull_request | 1 |
desktop.yml | Desktop | push | 3 |
dod-check.yml | dod-check | workflow_call | 1 |
dod-close-guard.yml | dod-close-guard | workflow_call | 1 |
dod-recheck.yml | dod-recheck | workflow_call issues | 1 |
infra-drift.yml | infra drift | schedule | 1 |
infra.yml | infra | pull_request | 3 |
linear-release.yml | Linear Release | release | 1 |
main-verified.yml | main-verified | push | 1 |
migration-label.yml | migration-label | pull_request_target | 1 |
nightly.yml | ci-nightly | schedule | 2 |
pipeline.yml | CI | pull_request | 11 |
release.yml | Release | workflow_dispatch | 2 |
scr-corpus-check.yml | scr-corpus-check | schedule workflow_dispatch push | 1 |
store-migrate-drift.yml | Store Drift (scheduled) | schedule | 1 |
store-migrate.yml | Store Migrate (manual) | workflow_dispatch | 1 |
stripe-sync.yml | Stripe Sync (manual) | workflow_dispatch | 1 |
triage-guard.yml | triage-guard | issues | 1 |
vision-gate.yml | Vision Gate | pull_request | 1 |
where-is-production.yml | where-is-production | workflow_dispatch | 1 |
Local development stack
Services from docker-compose.dev.yml; Postgres listens on 5433 to avoid colliding with other checkouts.
| Service | Image |
|---|---|
postgres | postgres:16-alpine |
stella-serve | ghcr.io/macanderson/stella-serve:${STELLA_SERVE_IMAGE_TAG:-0.9.414} |
neo4j | neo4j:5.24-community |
clickhouse | clickhouse/clickhouse-server:24.8-alpine |
Configuration contract
Every deployable surface's environment, declared once and generated everywhere else.
178 variables from packages/config/src/registry.ts, the single source for .env.example, the env-manager catalog and the CI env checker. A dot marks a service that needs the variable; R marks environments where it is required.
Agent engine
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
STELLA_SERVE_TOKEN secret | ● | ● | · | · | · | · | P | manual | Bearer token the Stella engine was started with. The same value the engine's own container reads under its prefix; without it the assistant reports the engine as unavailable. |
STELLA_SERVE_URL | ● | ● | · | · | · | · | P | static | Where the Stella engine (stella-serve) listens. The in-app agent's turns run there; every model call and tool call comes back to this process to answer (ADR-053). Loopback on the node. |
AI providers
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
AI_GATEWAY_API_KEY secret | ● | ● | ● | · | · | · | P P | manual | Vercel AI Gateway token — the platform's default AI auth. @oxagen/ai routes image, embeddings and video through the gateway always, and text too unless OXAGEN_MODEL_PROVIDER opts that deployment out, so this is required wherever AI runs. |
ANTHROPIC_API_KEY secret | · | · | · | · | · | · | — | manual | CLI-only BYOK fallback: when no AI_GATEWAY_API_KEY exists anywhere, the CLI runs anthropic/* models directly against the Anthropic API with this key (other vendors and embeddings stay unavailable). The gateway key always wins when both are set. Never read by deployed services — platform AI is gateway-only. |
OPENROUTER_API_KEY secret | ● | ● | ● | · | · | · | — | manual | OpenRouter token for language models. Read only when OXAGEN_MODEL_PROVIDER=openrouter; every other deployment stays valid without it. |
OPENROUTER_MANAGEMENT_KEY secret | ● | ● | ● | · | · | · | — | manual | OpenRouter provisioning key, not an inference key (ADR-131). Mints one capped token per organisation so the vendor reports usage per customer. It can create, read, disable and delete every key in the account, so it is read in one module and never reaches a provider client or a log. Unset means no key is minted and every organisation serves on the shared key. Read only when OXAGEN_MODEL_PROVIDER=openrouter: a minted key cannot serve on a gateway deployment, so none is minted there (ADR-131 §9). |
OPENROUTER_ORG_KEY_DAILY_LIMIT_USD | ● | ● | ● | · | · | · | — | manual | Daily USD ceiling on each organisation's minted OpenRouter key. A blast radius, not a budget: the credit gate bounds what a customer may spend, and this stops one runaway loop draining the account every other customer's assistant depends on. A key that hits it stops answering until midnight UTC, so set it well above a heavy legitimate day. Unset falls back to 25, which is the ceiling ADR-131 reasons about. |
OXAGEN_LLM_BALANCED | ● | ● | ● | · | · | · | — | static | Balanced text tier ("Oxagen Balanced") — gateway model id for the balanced tier. |
OXAGEN_LLM_FAST | ● | ● | ● | · | · | · | — | static | Fast text tier ("Oxagen Fast") — the gateway model id @oxagen/ai resolves for the fast tier. The ask-page default. |
OXAGEN_LLM_PRECISE | ● | ● | ● | · | · | · | — | static | Precise text tier ("Oxagen Precise") — gateway model id for the precise tier. |
OXAGEN_MODEL_PROVIDER | ● | ● | ● | · | · | · | — | static | Which provider serves language models: the gateway (default, and the metered path) or 'openrouter' for a deployment that cannot reach the gateway. Never an automatic fallback — an operator opts out explicitly, because a silent failover would move spend to another vendor's bill and skip metering. Image, video and embeddings stay on the gateway either way. The per-organisation keys ADR-131 mints are OpenRouter keys, so they are minted and consulted only when this is 'openrouter' (ADR-131 §9). |
Better Auth
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
AUTH_TOKEN_ENCRYPTION_KEY secret | ● | ● | ● | · | · | · | P P | manual | Base64 256-bit KEK that wraps OAuth token encryption keys. Required in preview+production (enforced by the auth startup guard); blank locally disables it. Generate with `openssl rand -base64 32`. |
BETTER_AUTH_SECRET secret | ● | ● | · | · | · | · | D P P | generate | Session/cookie signing secret (≥32 chars). Minted once per env and applied identically to api + app so sessions validate across both. |
BETTER_AUTH_TRUSTED_ORIGINS | ● | ● | · | · | · | · | — | static | Comma-separated origins allowed cross-origin access to the auth API. |
BETTER_AUTH_URL | ● | ● | · | · | · | · | D P P | static | Auth base URL (the app origin). |
OAUTH_PROXY_PRODUCTION_URL | ● | ● | · | · | · | · | — | static | Canonical production origin the shared social-login OAuth app's callback is registered against (OAuth Proxy productionURL). Preview deployments relay social login through this origin. Defaults to the production app URL when unset. |
OAUTH_PROXY_SECRET secret | ● | ● | · | · | · | · | — | manual | Dedicated secret the OAuth Proxy uses to encrypt/decrypt the relay payload between production and preview deployments. MUST be set to the SAME value in production AND preview for preview social login to work (production alone only passes through). Kept separate from BETTER_AUTH_SECRET to limit blast radius. Generate with `openssl rand -base64 32`. |
Billing
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
OXAGEN_METER_MARKUP | ● | ● | ● | · | · | · | — | manual | Optional pinned solved meter markup (≥1). Leave unset to derive from OXAGEN_TARGET_MARGIN + the code config. |
OXAGEN_PRICE_OVERRIDES secret | ● | ● | ● | · | · | · | — | manual | Negotiated model rates as inline JSON, in USD per one million tokens: {"claude-sonnet-5":{"inputPer1M":2.40,"outputPer1M":12.00,"cachedInputPer1M":0.24,"cacheWrite5mPer1M":3.00}}. Leave unset unless you have negotiated rates with a model provider. |
OXAGEN_PRICE_OVERRIDES_FILE | ● | ● | ● | · | · | · | — | manual | Path to a JSON file of negotiated model rates, same shape as OXAGEN_PRICE_OVERRIDES. Wins over the inline value when both are set, so a mounted secret does not need the variable cleared. |
OXAGEN_TARGET_MARGIN | ● | ● | ● | · | · | · | D P P | static | Target blended gross margin in (0,1). Drives the usage-meter markup; keep in sync with Stripe via `pnpm billing:stripe-sync --apply`. |
OXAGEN_USAGE_DISCOUNT_CEILING_USD | ● | ● | ● | ● | ● | ● | D P P | static | Usage volume discount: purchase amount (USD) at which the discount caps; above this it stays flat at the max. 3% per $50 up to $250 ⇒ 15% max. |
OXAGEN_USAGE_DISCOUNT_INCREMENT | ● | ● | ● | ● | ● | ● | D P P | static | Usage volume discount: dollar increment that earns one OXAGEN_USAGE_DISCOUNT_PERCENT step (e.g. 50 = a discount step every $50 purchased). |
OXAGEN_USAGE_DISCOUNT_PERCENT | ● | ● | ● | ● | ● | ● | D P P | static | Usage volume discount: percent off per OXAGEN_USAGE_DISCOUNT_INCREMENT dollars of usage credits purchased (e.g. 3 = 3% per increment ⇒ 15% at the $250 ceiling). |
Circuit breaker
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
CIRCUIT_BREAKER_FAILURE_THRESHOLD | ● | ● | ● | · | · | · | — | manual | Consecutive failures before a breaker opens for a wrapped dependency call (Neo4j / Stripe / ClickHouse). Optional — defaults to 5 in packages/config/src/env.ts. |
CIRCUIT_BREAKER_RESET_TIMEOUT_MS | ● | ● | ● | · | · | · | — | manual | Milliseconds an open breaker waits before allowing a trial (half-open) request. Optional — defaults to 30000 in packages/config/src/env.ts. |
CIRCUIT_BREAKER_SUCCESS_THRESHOLD | ● | ● | ● | · | · | · | — | manual | Consecutive successes required in the half-open state before a breaker closes. Optional — defaults to 1 in packages/config/src/env.ts. |
CLI
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
DO_NOT_TRACK | · | · | · | · | · | · | — | manual | Cross-tool opt-out convention (https://consoledonottrack.com): set to '1' to disable CLI usage telemetry. Checked before OXAGEN_TELEMETRY and the persisted telemetry.enabled config. |
OXAGEN_ALLOW_STDIO_MCP | · | · | · | · | · | · | — | manual | Set to '1' or 'true' to allow stdio-transport MCP servers to be SPAWNED as child processes from workspace file-mcp plugin configs (packages/agent file-mcp.ts). Spawning is OFF by default because a workspace-scoped config could otherwise execute arbitrary commands on the API host — enable only for a trusted local/CLI runtime, never on shared server deployments. HTTP MCP transports are unaffected and always processed. |
OXAGEN_API_TOKEN secret | · | · | · | · | · | · | — | manual | API token used by the CLI to authenticate requests; falls back to the value stored in ~/.oxagen/config.json. |
OXAGEN_API_URL | · | · | · | · | · | · | — | static | Base URL for the Oxagen REST API, consumed by the CLI. Falls back to the default production API URL when unset. |
OXAGEN_APP_URL | · | · | · | · | · | · | — | static | Base URL for the Oxagen web app, where `oxagen login` opens the browser authorize page. Falls back to the default production app URL when unset. |
OXAGEN_CLI_DEBUG | · | · | · | · | · | · | — | manual | Set to 1 or true to write the CLI's debug log to ~/.oxagen/logs (apps/cli/src/lib/debug-log.ts). Developer tooling, never set on a deployed service. |
OXAGEN_DEBUG | · | · | · | · | · | · | — | manual | When set, the CLI prints extra diagnostics (e.g. context-engine memory open failures) to stderr. |
OXAGEN_ORG_ID | · | · | · | · | · | · | — | manual | Default org slug for CLI commands; falls back to the value stored in ~/.oxagen/config.json. |
OXAGEN_STEERING_FRESHNESS | · | · | · | · | · | · | — | manual | Set to 0, off, false or no to suspend the steering-freshness gates (`oxagen steering gate`) for this shell only: no auto-sync and no refusal on stale steering. The escape hatch exists so a gate cannot wedge someone when a remote is unreachable, and it is deliberately environment-only so it cannot be committed and cannot outlive the shell that set it. Never set on a deployed service. |
OXAGEN_TELEMETRY | · | · | · | · | · | · | — | manual | Set to '0' to disable CLI usage telemetry for this invocation (equivalent to `oxagen telemetry off`). DO_NOT_TRACK=1 also disables it and takes precedence. |
OXAGEN_WORKSPACE_ID | · | · | · | · | · | · | — | manual | Default workspace slug for CLI commands; falls back to the value stored in ~/.oxagen/config.json. |
ClickHouse
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
CLICKHOUSE_DATABASE | ● | ● | ● | · | · | · | — | static | ClickHouse database name. |
CLICKHOUSE_PASSWORD secret | ● | ● | ● | · | · | · | — | manual | ClickHouse password (empty for local Docker). |
CLICKHOUSE_URL | ● | ● | ● | · | · | · | D P P | manual | ClickHouse HTTPS endpoint. |
CLICKHOUSE_USERNAME | ● | ● | ● | · | · | · | D P P | manual | ClickHouse user. |
Context provider
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
ENGRAM_DUCKDB_PATH | · | · | · | · | · | · | — | manual | The engram DuckDB file @oxagen/context-provider reads. Unset means an in-memory store, so every query answers with nothing — the right answer for a misconfigured process, rather than someone else's memory. DuckDB opens a file as a single writer, so the process that writes this database and the process that serves it must be different. |
OXAGEN_CONTEXT_ORG | · | · | · | · | · | · | — | manual | The organisation whose memory @oxagen/context-provider serves. Required, with no default: the Context Graph Protocol carries no tenant, so one process serves one workspace and which one is a deployment decision. A process started without it refuses rather than guessing. |
OXAGEN_CONTEXT_WORKSPACE | · | · | · | · | · | · | — | manual | The workspace whose memory @oxagen/context-provider serves. Required, with no default, for the reason OXAGEN_CONTEXT_ORG is. |
CRM
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
ATTIO_API_KEY secret | ● | · | · | · | · | · | — | manual | Attio API access token. When set, apps/api upserts every lead captured by /v1/cms/leads into Attio as a person (and a company by email domain) with a note carrying the form details. Unset disables the sync; leads stay in cms.leads. Needs the record_permission:read-write, object_configuration:read and note:read-write scopes. |
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
SMTP_FROM_EMAIL | ● | ● | ● | · | ● | ● | — | static | Default sender address. Its domain must be verified at the provider. |
SMTP_FROM_NAME | ● | ● | ● | · | ● | ● | — | static | Default sender display name. |
SMTP_HOST | ● | ● | ● | · | ● | ● | — | static | SMTP server host (Resend: smtp.resend.com). |
SMTP_PASSWORD secret | ● | ● | ● | · | ● | ● | — | manual | SMTP password — for Resend this is an API key (re_…). |
SMTP_PORT | ● | ● | ● | · | ● | ● | — | static | SMTP port. 465 = implicit TLS; 587 = STARTTLS (TLS enforced). |
SMTP_USERNAME | ● | ● | ● | · | ● | ● | — | static | SMTP username (Resend: the literal "resend"). |
env-manager tooling
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
ENV_MANAGER_PORT | · | · | · | · | · | · | — | static | Local port for the env-manager web UI. |
VERCEL_TEAM_ID | · | · | · | · | · | · | — | manual | Vercel team id (defaults to the oxagen team). |
VERCEL_TEAM_SLUG | · | · | · | · | · | · | — | manual | Vercel team slug for `pnpm env:pull` --scope (e.g. "oxagen"). Optional — when unset, the CLI resolves the team from each project's linked .vercel/project.json. |
VERCEL_TOKEN secret | · | · | · | · | · | · | — | manual | Vercel API token (admin) the env-manager uses to read/write project env vars. |
Error alerting
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
ALERT_WEBHOOK_URL secret | ● | ● | ● | · | · | · | — | manual | When set, high-severity/unhandled server errors are POSTed as a Slack-compatible `{ text, blocks }` JSON payload here (Slack/Mattermost/Discord incoming webhook, or any compatible endpoint). BYO webhook — no vendor SDK. When unset, errors are still recorded to the ClickHouse error_events table; only the webhook alert is skipped. |
File storage
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
BLOB_READ_WRITE_TOKEN secret | · | ● | · | · | · | · | — | manual | Vercel Blob read/write token. Authenticates @oxagen/storage (avatar/image uploads). Swap-point for S3/R2. |
STORAGE_DRIVER | · | ● | · | · | · | · | — | manual | Selects the @oxagen/storage backend: 'vercel-blob' (default, prod) or 'fs' (local/CI filesystem driver, no token needed). The swap-point for an S3/R2 driver. |
STORAGE_FS_ROOT | · | ● | · | · | · | · | — | manual | Root directory for the 'fs' storage driver. Only read when STORAGE_DRIVER=fs. Absolute path used as-is; a relative path is anchored at process.cwd(); unset falls back to an OS-tmp directory. |
github
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
GITHUB_APP_CLIENT_ID | ● | ● | ● | · | · | · | — | manual | GitHub App OAuth client id — used for the data-connector OAuth flow. Also read in-process by apps/app's Workspace settings dialog and by apps/mcp's get_main_repository tool (envGithubUrls in packages/handlers/src/repository.main.get.ts, invoked through the kernel's invoke() rather than an HTTP call), so it must reach both of those services too, not only the callback route in api. |
GITHUB_APP_CLIENT_SECRET secret | ● | ● | ● | · | · | · | — | manual | GitHub App OAuth client secret — what the public callback in api exchanges the returned code with. envGithubUrls (see GITHUB_APP_CLIENT_ID) also checks this is set in app and mcp, before publishing a Connect URL that api's callback could not finish without it. |
GITHUB_APP_ID | ● | ● | ● | · | · | · | — | manual | GitHub App numeric ID. Required (with GITHUB_APP_PRIVATE_KEY) for the installation-token path in resolveGitHubToken(). Find it on the GitHub App settings page. Also required in-process by app: repository.main.bind.ts and repository.installation.list.ts mint installation tokens directly when invoked from the Workspace settings dialog, not only from api/mcp. |
GITHUB_APP_INSTALL_STATE_SECRET secret | ● | ● | ● | · | · | · | — | manual | HMAC secret used to sign the OAuth state parameter for GitHub App installs. Signed and verified by api's callback, and also signed by envGithubUrls (see GITHUB_APP_CLIENT_ID) minting the same URLs in-process from app and mcp. |
GITHUB_APP_PRIVATE_KEY secret | ● | ● | ● | · | · | · | — | manual | PEM-encoded RSA private key for the GitHub App. Required (with GITHUB_APP_ID) for the installation-token path in resolveGitHubToken(). Generate in the GitHub App settings → Private keys. Also required in-process by app — see GITHUB_APP_ID. |
GITHUB_APP_SLUG | ● | ● | ● | · | · | · | — | manual | GitHub App public slug (the path segment in https://github.com/apps/<slug>). Used to deep-link users to GitHub's install/configure page so they can add or remove orgs and repos. Optional — when unset the connection dialog derives the slug from an existing installation. Also minted by envGithubUrls (see GITHUB_APP_CLIENT_ID) in-process from app and mcp. |
GITHUB_APP_WEBHOOK_SECRET secret | ● | · | · | · | · | · | — | manual | GitHub App webhook signing secret — validates inbound webhook payloads. |
GITHUB_PERSONAL_ACCESS_TOKEN secret | ● | · | · | · | · | · | — | manual | Personal access token (PAT) used by GitHub write capabilities (repo.create, repo.file.put, repo.fork, repo.branch.create, repo.pr.open) as a LOCAL/DEMO-ONLY fallback. Per-workspace credential resolution is now live (GitHub App installation token + KMS-encrypted per-workspace OAuth — see resolveGitHubToken in packages/handlers/src/lib/github-token.ts), so this MUST NOT be set in production: a shared PAT bypasses per-workspace scoping. resolveGitHubToken logs a loud warning when it is used while NODE_ENV=production. |
GITHUB_WEBHOOK_SECRET secret | ● | · | · | · | · | · | — | manual | Webhook signing secret for the SECOND GitHub App (oxagen-sh, app id 4055615), which delivers to the same /webhooks/github/app endpoint as oxagen-code-agent. Optional: unset means that App's deliveries are rejected. |
Infrastructure
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
AURORA_ENDPOINT | · | · | · | · | · | · | — | manual | Aurora writer endpoint for run-db-migrations.sh. Set it to skip the AWS lookup the script otherwise does. |
AURORA_PORT | · | · | · | · | · | · | — | manual | Port for AURORA_ENDPOINT. Defaults to 5432. |
DATA_NODE_NAME | · | · | · | · | · | · | — | manual | Name tag of the data-plane EC2 instance the DB-client tunnel scripts target. Defaults to oxagen-data. |
EVENT_BUS_NAME | · | · | · | · | · | · | — | manual | EventBridge bus the log-event-publisher Lambda puts events on. The stack sets it on the function; the handler refuses to import without it. |
NODE_NAME | · | · | · | · | · | · | — | manual | Name tag of the EC2 instance the infra/tools scripts target. Defaults to oxagen-app. |
Ingestion
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
AWS_KMS_INGESTION_KEY_ARN | ● | ● | ● | · | · | · | — | manual | AWS KMS key ARN for credential encryption (INGESTION_CRYPTO_PROVIDER=kms). Also required in-process by app and mcp — see INGESTION_CRYPTO_PROVIDER. |
INGESTION_CRYPTO_PROVIDER | ● | ● | ● | · | · | · | — | static | Credential encryption backend for ingestion: 'env' (AES-256-GCM via INGESTION_ENCRYPTION_KEY) or 'kms' (AWS KMS). Also read in-process by app and mcp: resolveGitHubToken's stored-OAuth-token path (packages/github/src/workspace-token.ts) decrypts through resolveIngestionCryptoAdapterForKeyId whenever repository.main.bind.ts or repository.installation.list.ts falls back off the installation-token path, and resolveWorkspaceGithubUserToken opens the stored token that backs the list_github_installations tool. |
INGESTION_ENCRYPTION_KEY secret | ● | ● | ● | · | · | · | P P | manual | Base64-encoded 32-byte master key for AES-256-GCM credential encryption (INGESTION_CRYPTO_PROVIDER=env). Also required in-process by app and mcp — see INGESTION_CRYPTO_PROVIDER. |
MICROSOFT_DATA_CLIENT_ID | ● | · | · | · | · | · | — | manual | Microsoft DATA OAuth client id for token refresh (ingestion cron; MS Graph offline_access). |
MICROSOFT_DATA_CLIENT_SECRET secret | ● | · | · | · | · | · | — | manual | Microsoft DATA OAuth client secret for token refresh (ingestion cron). |
SALESFORCE_DATA_CLIENT_ID | ● | · | · | · | · | · | — | manual | Salesforce DATA OAuth client id for token refresh (ingestion cron). |
SALESFORCE_DATA_CLIENT_SECRET secret | ● | · | · | · | · | · | — | manual | Salesforce DATA OAuth client secret for token refresh (ingestion cron). |
SLACK_DATA_CLIENT_ID | ● | · | · | · | · | · | — | manual | Slack DATA OAuth client id for token refresh (ingestion cron). Token rotation must be enabled in the Slack app. |
SLACK_DATA_CLIENT_SECRET secret | ● | · | · | · | · | · | — | manual | Slack DATA OAuth client secret for token refresh (ingestion cron). |
ZOOM_DATA_CLIENT_ID | ● | · | · | · | · | · | — | manual | Zoom DATA OAuth client id for token refresh (ingestion cron). Zoom rotates the refresh token on each use. |
ZOOM_DATA_CLIENT_SECRET secret | ● | · | · | · | · | · | — | manual | Zoom DATA OAuth client secret for token refresh (ingestion cron). |
Inngest
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
CURSOR_CONFIG_DIR | · | · | · | · | · | · | — | manual | Overrides where the Tacho host writes Cursor's `hooks.json` and `mcp.json`. Read on the operator's machine, not the server, and never a deployment value: it exists because Cursor can be installed against a non-default config directory, and enrolling the wrong one leaves the session unwrapped and silently unrecorded. |
INNGEST_EVENT_KEY secret | ● | ● | · | · | · | · | P P | manual | Inngest event key. Required in preview+production. |
INNGEST_SIGNING_KEY secret | ● | ● | · | · | · | · | P P | manual | Inngest signing key. Required in preview+production. |
STELLA_ENROLLMENT_SIGNING_SECRET secret | · | · | · | · | · | · | — | generate | HMAC secret this deployment signs Stella enterprise-telemetry enrollments with (create_stella_enrollment). A managed Stella install verifies the signature against its own copy of the same secret, named by the enrollment document's verification_secret_env — the two are distributed out of band. Unset means the capability refuses to mint rather than issuing an enrollment no install could verify. |
STELLA_TELEMETRY_INGEST_ENDPOINTS | · | · | · | · | · | · | — | manual | Comma-separated HTTPS ingest endpoints this deployment serves for Stella operational telemetry. create_stella_enrollment refuses to sign an enrollment pointing anywhere else, so an operator cannot mint a valid document aiming a fleet of installs at a third party. Defaults to the public endpoint; plaintext entries are dropped. |
TACHO_BUNDLE_SIGNING_PRIVATE_KEY secret | ● | · | · | · | · | · | — | manual | Ed25519 private key (PKCS#8 PEM, newlines as \n) this deployment signs Tacho policy bundles with (get_tacho_bundle) and attests run exports with (export_run, ADR-058). The matching public key travels to each host at enrollment so tacho-hook verifies a cached bundle offline and fails closed on one it cannot verify, and into every export bundle so its verifier runs offline. Unset means enrollment, bundle and export refuse. |
TACHO_ENROLLMENT_SIGNING_SECRET secret | ● | · | · | · | · | · | — | manual | HMAC secret this deployment signs Tacho host enrollments with (create_tacho_enrollment). The collector on an enrolled host verifies the enrollment document against its own copy of the same secret, named by the document's verification_secret_env; the two are distributed out of band. Unset means the capability refuses to enrol a host. |
TACHO_INGEST_ENDPOINTS | ● | · | · | · | · | · | — | manual | Comma-separated HTTPS base URLs of this deployment's Tacho machine endpoints (the /v1/tacho prefix). create_tacho_enrollment refuses to sign an enrollment pointing anywhere else, so an operator cannot aim a fleet of hosts at a third party. Defaults to the public endpoint; plaintext entries are dropped. |
TACHO_LOCAL_TOKEN secret | · | · | · | · | · | · | — | manual | The per-install bearer the Tacho collector's loopback listener requires. Written into each wrapped harness's settings and into a connected app's MCP config by `tacho enroll`, and read back by the hook and the `tacho mcp-stdio` shim. Never set by hand and never a deployment value: it is minted per machine at enrollment and lives in host.json. |
TACHO_MCP_ENDPOINT | · | · | · | · | · | · | — | manual | Overrides the workspace MCP endpoint the Tacho collector's local gateway proxies to (ADR-078). Read on the host, not the server: it is how a local stack points the gateway at 127.0.0.1:4100 instead of the deployment's MCP host. Unset, the gateway uses the endpoints.mcp claim from the enrollment, then derives one from api_url. |
XDG_CONFIG_HOME | · | · | · | · | · | · | — | manual | The XDG base directory the Tacho host falls back to when locating Cursor's config on Linux, after CURSOR_CONFIG_DIR and before ~/.cursor. Set by the operator's own environment rather than by Oxagen, and ignored on macOS and Windows, which do not follow the XDG layout. |
Linear
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
LINEAR_API_KEY secret | · | · | · | · | · | · | — | manual | Linear API key (tooling/provenance; not read by deployed apps). |
LINEAR_PROJECT_ID | · | · | · | · | · | · | — | static | Linear project id for the oxagen-v2 project (tooling-only). |
MCP
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
MCP_OAUTH_FETCH_TIMEOUT_MS | · | ● | · | · | · | · | — | manual | Per-request timeout (ms) for the app MCP OAuth authorize/callback flows when the MCP SDK fetches a third-party authorization server well-known / token endpoints. Bounds a hung server so it cannot stall the serverless function. Optional — defaults to 10000 in lib/mcp-oauth/safe-fetch.ts. |
Neo4j
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
NEO4J_DATABASE | ● | ● | ● | · | · | · | — | static | Neo4j database. |
NEO4J_ORG_PROVISIONER | ● | ● | ● | · | · | · | — | static | Graph provisioner for paid organisations (ADR-098): pooled (Community, dev, CI), cypher (self-managed Enterprise: CREATE DATABASE org-<namespace>), aura (not implemented; refused). |
NEO4J_PASSWORD secret | ● | ● | ● | · | · | · | D P P | manual | Neo4j password. |
NEO4J_URI | ● | ● | ● | · | · | · | D P P | manual | Neo4j bolt(+s) URI. |
NEO4J_USERNAME | ● | ● | ● | · | · | · | D P P | manual | Neo4j user. |
Node
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
NODE_ENV | · | · | · | · | · | · | — | static | Runtime mode. Vercel/Next set this automatically per deploy. |
OAuth providers
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
GITHUB_LOGIN_CLIENT_ID | ● | ● | · | · | · | · | P P | manual | GitHub LOGIN OAuth App client id (social sign-in; minimal scopes). Not the GitHub App. Checklist: docs/specs/social-login-oauth-apps.md. |
GITHUB_LOGIN_CLIENT_SECRET secret | ● | ● | · | · | · | · | P P | manual | GitHub LOGIN OAuth App client secret. Checklist: docs/specs/social-login-oauth-apps.md. |
GOOGLE_DATA_CLIENT_ID | ● | ● | · | · | · | · | — | manual | Google DATA OAuth client id (Workspace data scopes; future connection). |
GOOGLE_DATA_CLIENT_SECRET secret | ● | ● | · | · | · | · | — | manual | Google DATA OAuth client secret. |
GOOGLE_LOGIN_CLIENT_ID | ● | ● | · | · | · | · | P P | manual | Google LOGIN OAuth client id (social sign-in; minimal scopes). Checklist: docs/specs/social-login-oauth-apps.md. |
GOOGLE_LOGIN_CLIENT_SECRET secret | ● | ● | · | · | · | · | P P | manual | Google LOGIN OAuth client secret. Checklist: docs/specs/social-login-oauth-apps.md. |
MCP_OAUTH_PREREGISTERED_CLIENTS secret | ● | ● | · | · | · | · | — | manual | Pre-registered OAuth clients for MCP authorization servers that do NOT support RFC 7591 dynamic client registration (GitHub MCP, notably). JSON object mapping the MCP server's endpoint HOST to the client registered with that provider, e.g. {"api.githubcopilot.com":{"client_id":"…","client_secret":"…"}}. Each provider app must list <app-origin>/api/v1/mcp/oauth/callback as its callback URL. When a host is absent the flow falls back to dynamic client registration as before. |
Observability
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
KNOWLEDGE_GRAPH_ENABLED | ● | ● | ● | · | · | · | — | static | Feature flag — set "false" to disable the Neo4j knowledge-graph writes. |
LOG_LEVEL | ● | ● | ● | · | · | · | — | static | Pino log level for service loggers. |
MCP_PORT | · | · | ● | · | · | · | — | manual | HTTP port for the xmcp server. |
OpenTelemetry
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT | ● | ● | ● | · | · | · | — | manual | OTLP HTTP collector URL (e.g. https://otel.example.com/v1/traces). When unset the SDK does not start and all spans are no-ops — safe for all envs. Rollback = leave unset. |
OTEL_EXPORTER_OTLP_HEADERS secret | ● | ● | ● | · | · | · | — | manual | Standard OTEL comma-separated `key=value` header list sent to the collector (e.g. "authorization=Bearer xxx,x-tenant=oxagen"). Optional — for collectors that require auth headers. Parsed by packages/telemetry/src/tracer.ts. |
OTEL_SERVICE_NAME | ● | ● | ● | · | · | · | — | manual | Service name tag on OTEL span resources (default: oxagen). Optional — leave unset to use the default. |
Operator scripts
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
ADMIN_DATABASE_URL secret | · | · | · | · | · | · | — | manual | Superuser Postgres connection used by provision-rls-role.ts to create the least-privilege app role. Kept separate from DATABASE_URL so the provisioning step cannot silently run through the restricted connection it is about to create. |
APPLE_SIGNING_IDENTITY | · | · | · | · | · | · | — | manual | The Developer ID tauri signs the macOS bundle with. `-` signs ad hoc, which `pnpm dist:local` and desktop.yml use when no Developer ID is configured. |
BLOG_DRAFTS | · | · | · | · | · | · | — | manual | Set to 1 to include draft posts when building the static research blog (apps/web/scripts/build.mjs). Unset in every deploy, so drafts never ship. |
CONTEXT_GRAPH_PROTOCOL_DIR | · | · | · | · | · | · | — | manual | Path to a local context-graph-protocol checkout. check-contextgraph-fixtures.ts verifies the vendored profile against it when set. |
DB_LINT_BASE_REF | · | · | · | · | · | · | — | manual | The ref `pnpm db:lint-migrations` compares new Atlas migrations against for its git-aware ordering check (#3387): a migration added since the merge base with this ref must sort after every migration already there. Defaults to origin/main. |
DB_LINT_HEAD_REF | · | · | · | · | · | · | — | manual | The ref `pnpm db:lint-migrations` treats as the branch's own tip for its git-aware ordering check (#3387). CI's pull_request checkout puts HEAD on GitHub's synthetic merge commit, not the PR branch itself, which collapses the merge-base fail/warn distinction into one tier; the pipeline sets this to github.event.pull_request.head.sha to compare against the real PR head. Defaults to HEAD, which is correct everywhere else (a push checkout, a local branch). |
DB_MIGRATE_STORES | · | · | · | · | · | · | — | manual | Comma-separated stores `pnpm db:migrate` should migrate. Defaults to clickhouse,neo4j — Postgres is Atlas's job and is deliberately not in the list. |
GCP_PROJECT | · | · | · | · | · | · | — | manual | Google Cloud project the env-manager pulls Secret Manager secrets from. Defaults to oxagen-490023. |
INNGEST_DEV | · | · | · | · | · | · | — | manual | Set to 1 to point the Inngest SDK at a local dev server instead of Inngest Cloud. tools/scripts/inngest-dev.ts sets it for every child turbo spawns. |
MAIN_VERIFIED_GRACE_MINUTES | · | · | · | · | · | · | — | manual | How long after a commit lands check-main-verified.mjs refuses to conclude it has no run. The workflow races the registration of the run it looks for. Defaults to 10. |
MAIN_VERIFIED_MAX_WAIT_MINUTES | · | · | · | · | · | · | — | manual | Upper bound on how long check-main-verified.mjs sleeps waiting the grace out before re-reading. Must stay below the workflow job's timeout-minutes. Defaults to 12. |
MAIN_VERIFIED_WINDOW | · | · | · | · | · | · | — | manual | How many recent commits on main check-main-verified.mjs asks about. Defaults to 10. |
NPM_TOKEN secret | · | · | · | · | · | · | — | manual | npm automation token used to publish the CLI package. Unset skips the npm publish step of `pnpm release` rather than failing it. |
OXAGEN_BRAND_KIT | · | · | · | · | · | · | — | manual | Path to the house brand kit checkout (oxagenai/oxagen-brand) sync-brand-assets.mjs copies marks and the branding skill from. Defaults to ../oxagen-brand. |
OXAGEN_HOUSE_BRAND | · | · | · | · | · | · | — | manual | Deprecated alias for OXAGEN_BRAND_KIT, accepted for one transition release. |
OXAGEN_INSTALL_BASE | · | · | · | · | · | · | — | manual | Base URL the published install.sh downloads CLI release archives from. Set it to install from a staging bucket instead of cli.oxagen.sh. |
OXAGEN_INSTALL_DIR | · | · | · | · | · | · | — | manual | Directory install.sh puts the oxagen binary in. Defaults to ~/.local/bin. |
PGSUPERPASS secret | · | · | · | · | · | · | — | manual | Password for PGSUPERUSER. |
PGSUPERUSER | · | · | · | · | · | · | — | manual | Superuser on the cluster tools/scripts/rds-sim-check.sh simulates RDS against. The script refuses to run without it. |
PRODUCTION_ANALYTICS_PASSWORD secret | · | · | · | · | · | · | — | manual | Password for PRODUCTION_ANALYTICS_USER. |
PRODUCTION_ANALYTICS_URL | · | · | · | · | · | · | — | manual | Production ClickHouse endpoint tools/scripts/backfill-claude-telemetry.ts writes backfilled session rows to. |
PRODUCTION_ANALYTICS_USER | · | · | · | · | · | · | — | manual | Username for PRODUCTION_ANALYTICS_URL. |
PRODUCTION_DATABASE_URL secret | · | · | · | · | · | · | — | manual | Migration connection for Atlas's `prod` env (packages/database/atlas.hcl), read by db-migrate.yml and no other workflow. Holds a role that may run DDL against pre-existing schemas: the app role may only CREATE in schemas it owns, so migrating through DATABASE_URL fails 42501 on billing and friends. |
SCR_OWNER | · | · | · | · | · | · | — | manual | GitHub owner whose repos the SCR corpus check reads. Defaults to macanderson. |
STALE_MERGE_BASE_REF | · | · | · | · | · | · | — | manual | Ref the stale-merge-base check (#3237) treats as main's current tip. Defaults to origin/main. |
STALE_MERGE_BRANCH_REF | · | · | · | · | · | · | — | manual | Ref the stale-merge-base check (#3237) treats as the branch under review. Defaults to HEAD. |
STANDALONE | · | · | · | · | · | · | — | manual | Set to 1 to build apps/app or apps/docs with Next's standalone output. tools/scripts/package-for-node.sh sets it for the self-hosted node bundle; Vercel builds leave it unset and get the default output. |
TAURI_SIGNING_PRIVATE_KEY secret | · | · | · | · | · | · | — | manual | The desktop app's updater signing key (minisign; contents or a path). `pnpm dist:local` reads ~/.tauri/oxagen-desktop.key when this is unset; desktop.yml holds it as a secret. Unset builds carry no updater artifacts. |
TAURI_SIGNING_PRIVATE_KEY_PASSWORD secret | · | · | · | · | · | · | — | manual | Password of TAURI_SIGNING_PRIVATE_KEY. The key has none, so this is set to the empty string: an absent variable makes tauri prompt for one. |
USER_EMAIL | · | · | · | · | · | · | — | manual | Email stamped on rows the Claude telemetry backfill writes, so a backfilled session is attributable to whoever ran the script. |
VISION_GATE_BASE | · | · | · | · | · | · | — | manual | Ref the vision gate diffs against. Defaults to origin/main. |
VISION_GATE_MODEL | · | · | · | · | · | · | — | manual | Model the vision gate judges a diff with. |
VISION_GATE_STRICT | · | · | · | · | · | · | — | manual | Set to 1 to make a drifts verdict fail the vision gate instead of only printing it. |
WEB_PORT | · | · | · | · | · | · | — | manual | Port for the apps/web static dev server (apps/web/scripts/dev.mjs). Defaults to 5500; local convenience only, never read by a deploy. |
WRITE_MANIFEST_IMAGE | · | · | · | · | · | · | — | manual | Container image the packaged node bundle's run manifest names. Defaults to node:24.21.0-alpine. |
Postgres
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
DATABASE_URL secret | ● | ● | ● | · | · | ● | D P P | manual | Neon Postgres connection string. Prod = live branch; preview/dev = dev branch. |
Privacy
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
PRIVACY_ERASURE_GRACE_DAYS | ● | · | · | · | · | · | — | static | Grace period in days before a hard-delete erasure job runs (GDPR Art.17). Set to 0 for immediate erasure in test envs. |
Public URLs
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
APP_URL | ● | ● | ● | · | · | · | — | static | Server-side app origin used to build plugin OAuth authorize/callback URLs (falls back to NEXT_PUBLIC_APP_URL). Not browser-exposed. |
MARKETING_URL | ● | · | · | · | · | · | — | static | Public marketing website origin (oxagen.sh). The /v1/cms/* lead routes use it to build the emailed reader link and CORS allows it as a cross-origin caller. Not browser-exposed. |
MCP_URL | ● | ● | ● | · | · | · | — | static | MCP server origin used to build install instructions and client connections. |
NEXT_PUBLIC_API_URL client | ● | ● | ● | · | ● | · | D P P | static | Public api origin (browser-exposed). The api and mcp read it too: the Inngest serve host, and the absolute download URL get_run_export mints. |
NEXT_PUBLIC_APP_URL client | · | ● | · | · | ● | · | D P P | static | Public app origin (browser-exposed). |
NEXT_PUBLIC_CHAT_UX_V2 client | · | ● | · | · | · | · | — | manual | chat_ux_v2 feature flag (apps/app chat UX overhaul, browser-exposed). "1" enables the new session-settings chat surface environment-wide; unset/anything else = off. A per-browser cookie override (?chat_ux_v2=1|0) wins over this default. Validated as an optional "0"|"1" enum by baseEnvSchema. |
NEXT_PUBLIC_DOCS_URL client | · | ● | · | · | · | · | — | manual | Optional override for the docs site origin (browser-exposed). When unset, apps/app resolves the correct URL per environment automatically (dev → http://localhost:3300; prod → https://docs.oxagen.sh, per apps/app/src/lib/docs-url.ts). Set only to test a custom docs deployment. Validated as an optional URL by baseEnvSchema. |
Rate limiting
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
RATE_LIMIT_CHAT_PER_MIN | ● | · | · | · | · | · | — | manual | Max chat send/stream requests per minute per workspace (fallback: per org, then per IP) on /v1/**/chat/*. Optional — defaults to 60 in packages/config/src/env.ts. |
TRUST_EDGE_CLIENT_IP_HEADER | ● | ● | ● | · | · | · | — | manual | Whether the x-oxagen-client-ip header written by the edge is believed. Optional — defaults to false. Set to "true" only AFTER the Caddy config that SETS that header (infra/tools/caddy/Caddyfile.alb) is uploaded and reloaded; until then the old config forwards a caller-supplied copy of it unchanged and the value would be attacker-controlled (ADR-083). Once that config is live it is what attributes the caller, because the same config rewrites x-forwarded-for to a single client address and leaves no proxy entry for TRUSTED_PROXY_CIDRS to vouch with. |
TRUSTED_PROXY_CIDRS | ● | ● | ● | · | · | · | — | manual | Comma-separated CIDRs or addresses of the proxies in front of apps/api. With the edge header (TRUST_EDGE_CLIENT_IP_HEADER) this is how a client address is attributed: the walk goes right through x-forwarded-for while each entry is a named proxy and stops at the first that is not, so a caller padding the header cannot move the result. NAME THE PROXIES' OWN SUBNETS, never an RFC1918 supernet like 10.0.0.0/8: a list wide enough to contain a caller makes the walk skip that caller as though it were a proxy and return an entry further left, which is one the caller wrote — the exact bypass this form exists to close. Once set it decides alone, and it returns nothing when no named proxy vouched for an entry, so it does not belong in a deployment whose edge rewrites x-forwarded-for to a single client address (ADR-083). Unset, no client address is derived at all, and the two things that read one both fail safe — the IAM ip_ranges / ip_allow conditions deny, and the pre-authentication IP ceilings on the Tacho and Stella machine routes skip rather than pooling every caller into one bucket. Empty by default, which means those IP controls are OFF and say so in the log. |
Release / build metadata
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
PLATFORM_VERSION | ● | ● | ● | · | · | · | — | manual | Platform version string surfaced by @oxagen/config platformVersion(). Written by `pnpm release:*` and synced to every oxagen-v2-* Vercel project. Declared in turbo.json globalEnv so a version change busts the build cache. LOCAL: leave unset → falls back to package.json version. PROD/PREVIEW: the released semver. NOTE: read via raw process.env in @oxagen/config — not yet in baseEnvSchema (tracked). |
Security
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
AUDIT_EXPORT_SIGNING_SECRET secret | ● | ● | ● | · | · | · | — | generate | HMAC-SHA256 secret for signing audit-log export tokens, so exported files can be verified as untampered. OPTIONAL: baseEnvSchema declares it `.optional()` and the audit export route falls back to BETTER_AUTH_SECRET when it is unset. Setting a dedicated value changes the signing key and invalidates outstanding export download URLs. Generate with `openssl rand -base64 32`. |
SERVER_ACTIONS_ALLOWED_ORIGINS | · | ● | · | · | · | · | — | manual | Extra hosts allowed to POST a Next server action to apps/app, comma-separated. Next rejects a server action whose Origin is not the deployment's own host, so a custom domain in front of the app has to be named here or every mutation 403s. |
TENANT_RLS_ENFORCEMENT_ENABLED | ● | ● | ● | · | · | · | — | manual | When true, Postgres RLS policies filter by org/workspace. Fail-closed: when UNSET it defaults ON in production (NODE_ENV/VERCEL_ENV=production) and OFF in dev/test/preview. A production process refuses to boot if this is forced to false (assertRlsEnforcedInProduction). Local dev override: set false in .env.local only if seeding/migration scripts need to bypass RLS; revert before running app code against the DB. |
Stripe
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY client | · | ● | · | · | · | · | — | manual | Browser-exposed Stripe publishable key for Stripe.js init. Inlined into the app bundle at build, so a rotation needs a rebuild. Sandbox pk_test_ in every environment until the production cutover. |
STRIPE_PUBLISHABLE_KEY | · | · | · | · | · | · | — | manual | Stripe publishable key. Every environment, production included, is the sandbox's pk_test_ key until the production cutover. Provisioning-only: no service reads it. The browser reads the NEXT_PUBLIC_ prefixed name, and env-manager pulls this one from the secret store so the two stay in step. |
STRIPE_SECRET_KEY secret | ● | ● | · | · | · | · | D P P | manual | Stripe secret key. Every environment, production included, binds to the shared Stripe sandbox (sk_test_) until the maintainer cuts production over to live keys; see docs/ops/stripe-sandbox-mode.md. |
STRIPE_TAX_ENABLED | ● | ● | · | · | · | · | — | manual | When 'true', enables Stripe Tax automatic_tax on all checkout sessions. Ships dark; flip on only after Stripe Tax is registered/active in the dashboard. |
STRIPE_WEBHOOK_SECRET secret | ● | ● | · | · | · | · | D P P | manual | Stripe webhook signing secret (whsec_) of the endpoint registered on the shared sandbox for this environment's API URL; production's is the sandbox endpoint for https://api.oxagen.sh/webhooks/stripe until the cutover. |
Testing / e2e
| Variable | api | app | mcp | docs | website | admin | Required | Origin | Description |
|---|---|---|---|---|---|---|---|---|---|
E2E_TEST | · | ● | · | · | · | · | — | manual | The exact string "true" on the e2e webServer (apps/app/playwright.config.ts) and the e2e seed (apps/app seed:e2e): packages/auth relaxes email verification, secure cookies and rate limiting on that value, off-Vercel only (local-env.ts). Declared in turbo.json test:e2e env. Not for dev/preview/prod. NOTE: read via raw process.env — not in baseEnvSchema (test-only). |
OXAGEN_LOCAL_DEV | · | · | · | · | · | · | — | manual | Set to "1" by tools/scripts/dev.ts for the local dev stack. Consumed by packages/auth to make local-env detection deterministic instead of racing NODE_ENV at module-load time. Ignored on real Vercel deployments (VERCEL=1 guards it). NOTE: read via raw process.env — not in baseEnvSchema (dev-tooling only). |
PLAYWRIGHT_BASE_URL | · | ● | · | · | · | · | — | manual | Base URL of the deprecated Playwright suite (apps/app_deprecated/playwright.config.ts, deleted with that app in WL-50). The rev1 harness (apps/app/playwright.config.ts) reads NEXT_PUBLIC_APP_URL and does not read this. NOTE: read via raw process.env — not in baseEnvSchema (test-only). |
STRIPE_E2E | · | ● | · | · | · | · | — | manual | Whether the e2e job resolved a Stripe test key: "1" when STRIPE_TEST_SECRET_KEY was mapped into STRIPE_SECRET_KEY, "0" on a fork pull request without one (pay.spec.ts skips). Set by the e2e webServer env (apps/app/playwright.config.ts) and the CI job (WL-48). NOTE: read via raw process.env — not in baseEnvSchema (test-only). |
Decisions
The architecture decision records, grouped by the epic that produced them.
146 records under docs/adr. ADRs are immutable once accepted; a change of mind is a new ADR that supersedes the old one, which is why superseded entries stay listed.
Foundations
| # | Title | Status | Date |
|---|---|---|---|
| ADR-001 | — Drizzle as Postgres ORM | Accepted | 2026-05-27 |
| ADR-002 | — Inngest as job orchestration | Accepted | 2026-05-27 |
| ADR-003 | — Neo4j as vector store | Accepted | 2026-05-27 |
| ADR-004 | — Environment variables, not Google Secret Manager | Accepted | 2026-05-28 |
| ADR-005 | — Single-version monorepo via Changesets | Accepted | 2026-05-27 |
| ADR-006 | — Better Auth bound to canonical `auth.users` | Accepted | 2026-05-27 |
Agent Runtime
| # | Title | Status | Date |
|---|---|---|---|
| ADR-007 | — Docker as vendor-neutral code sandbox | Accepted | 2026-05-28 |
| ADR-008 | — Skills as filesystem-first with DB augmentation | Accepted, retired by ADR-043; amended 2026-09-18 by ADR-093 | 2026-05-28 |
| ADR-009 | — Unified capability/tool model via `surfaces` | Accepted | 2026-05-28 |
| ADR-010 | — Subagent fanout via Inngest invoke | Accepted | 2026-05-28 |
| ADR-011 | — Vercel Sandbox driver for Vercel Functions | Accepted | 2026-05-31 |
Marketplace
| # | Title | Status | Date |
|---|---|---|---|
| ADR-012 | — Connector dual-write pattern: Postgres (durability) + Neo4j (index) | Accepted | 2026-06-09 |
| ADR-013 | — Oxagen Plugins: first-party capability packs as a fourth plugin type | Accepted | 2026-06-12 |
| ADR-014 | — Workspace-scoped MCP registries with a single-default state machine | Accepted | 2026-06-17 |
Developer workflow
| # | Title | Status | Date |
|---|---|---|---|
| ADR-015 | — Graph-edge-driven git hooks (Vitest import-graph) + Biome formatting | Superseded in part | 2026-06-21 |
CLI & Local Agent Runtime
| # | Title | Status | Date |
|---|---|---|---|
| ADR-016 | — Oxagen CLI daemon: a live code-graph memory fed by coding-agent hooks | Proposed | 2026-06-24 |
Unfiled
| # | Title | Status | Date |
|---|---|---|---|
| ADR-017 | — OpenTelemetry Distributed Tracing | Accepted | 2026-06-26 |
| ADR-018 | CLI ↔ Workspace Graph Bidirectional Sync | Superseded | 2026-06-27 |
| ADR-019 | Unified agent engine — one brain across CLI and platform | Accepted | 2026-06-27 |
| ADR-020 | Per-workspace GitHub write credentials | Accepted | 2026-06-28 |
| ADR-021 | Inference doctrine — deterministic-first, cache-aligned, structured-tool agentic coding | Proposed | 2026-07-06 |
| ADR-022 | Capability & tool naming standard | Accepted | 2026-07-06 |
| ADR-023 | — CLI fleet: sessions as append-only event logs, views as renderers | Accepted | 2026-07-06 |
| ADR-024 | — Namespaced, immutable agent identity (`org_ns.workspace_ns.agent_slug`) | Accepted | 2026-07-07 |
| ADR-025 | Verb-first snake_case capability naming | Accepted | 2026-07-08 |
| ADR-026 | — Mobile feature parity is law, enforced by a manifest gate | Accepted | 2026-07-08 |
| ADR-027 | Multi-tenant GitHub App connect (identity leg + installation registry) | Accepted | 2026-07-09 |
| ADR-028 | — Time-travel replay: deterministic session records, bisect, resume, and failure→eval distillation | Accepted | 2026-07-11 |
| ADR-029 | The mutation verifier gate — every green turn must prove its tests witness the fix | Accepted | 2026-07-10 |
| ADR-030 | Speculative tool execution — prefetch the model's next reads while it thinks | Accepted | 2026-07-11 |
| ADR-031 | Platform Storage Ontology — a drift-aware, machine-readable self-model of the platform's storage layer | Accepted | 2026-07-13 |
| ADR-032 | — Unified chat session state (chat_ux_v2) | Accepted | 2026-07-14 |
| ADR-033 | Adopt the Stella Rust engine as the platform agent core | Proposed | 2026-07-18 |
| ADR-034 | Customer-built capability packages (`.cap`) | Proposed | 2026-07-18 |
| ADR-035 | Consume the Context Graph Protocol directly via pinned conformance fixtures | Accepted | 2026-07-22 |
| ADR-036 | Adopt the official CGP TypeScript SDK as the canonical type source | Accepted | 2026-07-23 |
| ADR-037 | A test double must fail when the thing it doubles moves | Accepted | 2026-08-24 |
| ADR-038 | Adopt org standing decisions as a Steering Context Record corpus | Accepted | 2026-09-22 |
| ADR-039 | Centralize SCR enforcement in oxagen rather than replicating it | Accepted | 2026-08-26 |
| ADR-040 | Refocus Oxagen as an engine-agnostic governance plane | Accepted | 2026-08-29 |
| ADR-041 | Canonical JSON — one rule, not one implementation | Accepted | 2026-09-06 |
| ADR-042 | Organisation-scoped data planes — every store switches at the tenant | Accepted | 2026-09-07 |
| ADR-043 | Excise the agent runtime — Oxagen governs agents, it does not run them | Accepted; amended 2026-09-18 by ADR-096 | 2026-09-18 |
| ADR-044 | Every field of a memory record has a merge rule | Accepted | 2026-09-07 |
| ADR-045 | Cross-repo reusable workflows are pinned to a commit | Accepted | 2026-09-07 |
| ADR-046 | A push to main gets its own CI concurrency group | Accepted | 2026-09-07 |
| ADR-047 | No provider-posture matrix; handle divergence at the gateway | Accepted | 2026-09-07 |
| ADR-048 | One path glob, in a package with no dependencies | Accepted | 2026-09-07 |
| ADR-049 | The DoD recheck re-runs the old run rather than reporting a new check | Accepted | 2026-09-07 |
| ADR-050 | Privileged secret access is recorded in the main audit log, not only beside it | Accepted | 2026-09-07 |
| ADR-051 | A workspace's context records enter the turn as volatile policy, not as prefix | Superseded by ADR-043; amended 2026-09-18 by ADR-093 and ADR-094 | 2026-09-18 |
| ADR-052 | The governed action is the billable unit; tokens are reported, never billed | Accepted | 2026-09-08 |
| ADR-053 | The in-app agent runs on Stella's headless engine, and a token is billed only when Oxagen paid for it | Accepted | 2026-09-09 |
| ADR-054 | The migration connection carries the RLS bypass; the policy is not changed | Accepted | 2026-09-11 |
| ADR-055 | Subscriptions carry monthly buckets of governed action units, bought in unit quantities at a per-customer contracted rate | Accepted | 2026-09-13 |
| ADR-056 | Run control connection points and the model-proxy decision | Accepted; amended 2026-09-15 | 2026-09-15 |
| ADR-057 | Agents: the definition of record, budgets in micros, enrollment | Accepted | 2026-09-14 |
| ADR-058 | Run record placement, retention default and `digest_only` | Accepted | 2026-09-14 |
| ADR-059 | Mandates: consequence roles, the decision seam and the ledger | Accepted | 2026-09-14 |
| ADR-060 | Spend: the price book as data, the rollup store, budgets in micros | Accepted | 2026-09-14 |
| ADR-061 | Steering: governance mode, thresholds, the reflector | Accepted | 2026-09-15 |
| ADR-062 | Findings: providers, fix application, the counterfactual rule | Accepted | 2026-09-15 |
| ADR-063 | Organization: the permission catalogue | Accepted | 2026-09-15 |
| ADR-064 | Proof: the witness runner plane | Accepted; amended 2026-09-18 by ADR-096 | 2026-09-18 |
| ADR-065 | Onboarding: gate shape, installer path, provisional workspace | Accepted | 2026-09-15 |
| ADR-066 | Oxagen has two names, the agent control plane and agent fleet management, and the agent asks for the keys | Accepted; the two names are superseded by ADR-067, the access rule stands | 2026-09-15 |
| ADR-067 | Mission Control leads, the agent control plane is the category, and every claim states its scope | Accepted | 2026-09-15 |
| ADR-068 | One org-only workspace sentinel, shared by every surface | Accepted | 2026-09-15 |
| ADR-069 | Roles are editable on every tier | Accepted | 2026-09-15 |
| ADR-070 | Auto-approval rules: the policy matrix, the rule store, standing approvals | Accepted | 2026-09-16 |
| ADR-071 | A kill switch outlives its target — deleting what it names is refused | Accepted | 2026-09-16 |
| ADR-072 | Tools: classification vocabulary, assurance hosting, observed-schema source | Accepted | 2026-09-15 |
| ADR-073 | An API key names a workspace, and so does the page that mints it | Accepted | 2026-09-16 |
| ADR-074 | A read under the org-only workspace sentinel is checked against the policy manifest | Accepted; **decision 3 superseded by | 2026-09-17 |
| ADR-075 | — One writer for the account preference row | Accepted | 2026-09-16 |
| ADR-076 | — A general run's spec states what the run did | Accepted | 2026-09-16 |
| ADR-077 | Attribution columns are `<verb>_by_id` | Accepted | 2026-09-15 |
| ADR-078 | Wrapped and connected are two enforcement tiers, and neither dominates the other | Accepted; §1 amended 2026-09-18 by ADR-095 | 2026-09-18 |
| ADR-079 | An `oxagen login` key acts for its creator on Tacho host enrollment | Accepted | 2026-09-15 |
| ADR-080 | Stella is wrapped through its hooks until it speaks the Tacho contract natively | Accepted | 2026-09-15 |
| ADR-081 | The `app` layer is retired at the Mission Control cutover for every capability rev1 does not surface | Accepted | 2026-09-16 |
| ADR-082 | A rate limiter that cannot reach its counters degrades rather than denies | Accepted | 2026-09-17 |
| ADR-083 | One client-IP derivation, and the edge rewrites the header it is not allowed to trust | Accepted | 2026-09-17 |
| ADR-084 | The person behind a Tacho session is a principal Oxagen issues, and nothing derived from the reported address is stored | Accepted | 2026-09-17 |
| ADR-085 | A refunded or disputed GAU purchase withdraws what is left, and records what it could not recover | Accepted | 2026-09-17 |
| ADR-086 | An org-only read of a workspace-scoped table raises, and the static check retires | Accepted | 2026-09-17 |
| ADR-087 | The Neo4j tenancy seam constructs scoping rather than validating it | Proposed | 2026-09-17 |
| ADR-088 | A credential follows the service that reads it, and `apps/app` reads the GitHub App's private key | Accepted | 2026-09-18 |
| ADR-089 | An on-demand read lives in a `"use server"` module, beside the write | Accepted | 2026-09-17 |
| ADR-090 | Oxagen governs skill resolution, and the 2026-09-15 narrowing is reversed | Accepted; amended 2026-09-18 by ADR-097 and ADR-093 | 2026-09-15 |
| ADR-091 | One record steers one agent — steering rides the bundle's `context.system` | Accepted | 2026-09-18 |
| ADR-092 | An abandoned assistant turn is owned to completion, not cancelled | Accepted | 2026-09-18 |
| ADR-093 | One assembler decides what reaches the agent, and records what it cut | Accepted | 2026-09-18 |
| ADR-094 | tachod grows into the gateway: a loopback model proxy and an MCP aggregator | Accepted | 2026-09-18 |
| ADR-095 | The tier ladder is four words, computed from what was routed | Accepted | 2026-09-18 |
| ADR-096 | Oxagen may contain the process that runs turns: the contained tier | Accepted | 2026-09-18 |
| ADR-097 | Steering and gating are two planes, authored on one surface and compiled twice | Accepted | 2026-09-18 |
| ADR-098 | Organisation graphs are placed by one provisioning interface, and pooled is the default | Accepted | 2026-09-18 |
| ADR-099 | A workspace is born with its main repository, and a repository is main for at most one workspace | Accepted | 2026-09-18 |
| ADR-100 | Frame bodies are captured by default, redacted where they are produced, capped, and released by retention | Accepted | 2026-09-18 |
| ADR-101 | Claude Code, Codex, Cursor and Stella are the four first-class harnesses | Accepted | 2026-09-18 |
| ADR-102 | A limit change merges under the mandate's row lock, and replacement stays for callers that hold the record | Accepted | 2026-09-19 |
| ADR-102 | Restore the marketing ebook lead gate | Accepted | 2026-09-19 |
| ADR-103 | The price book records its own initialization | Accepted | 2026-09-19 |
| ADR-104 | A harness label round-trips whatever it holds | Accepted | 2026-09-19 |
| ADR-105 | An archived workspace accepts no machine credential | Accepted | 2026-09-19 |
| ADR-106 | Retirement revokes what it scoped, rather than refusing while it exists | Accepted | 2026-09-19 |
| ADR-107 | `list_mandates` and `get_mandate` admit the roles `request_mandate` admits | Accepted | — |
| ADR-108 | A mandate limit carries its own measure kind, worked out once at write time | Accepted | 2026-09-19 |
| ADR-109 | A resolved approval is read back through a sibling capability, not the security event stream | Accepted | — |
| ADR-109 | The book has one manuscript, and its editions and migration are generated | Accepted | 2026-09-19 |
| ADR-110 | Review main integrations and report stale-base overlap | Accepted, mechanism corrected by #3485 | 2026-09-19 |
| ADR-111 | An amount measure's unit is refused at declaration, not widened at `Money` | Accepted | 2026-09-19 |
| ADR-111 | Website leads sync to Attio after the row commits, with the outcome on the row | Accepted | 2026-09-19 |
| ADR-112 | The two §2.1 renames land on the surfaces, behind aliases, in phases | Accepted | 2026-09-19 |
| ADR-113 | Workforce management leads, and Mission Control is retired as a product name | Accepted | 2026-09-19 |
| ADR-114 | One version across every manifest, and a publish flow that runs from a laptop | Accepted | 2026-09-19 |
| ADR-115 | `resolve_approval` is the one billed action of the approvals surface | Accepted | 2026-09-19 |
| ADR-116 | ClickHouse reads scope the source and migrations share a lock | Accepted | 2026-09-20 |
| ADR-117 | Bound GitHub retries and use managed graph transactions | Proposed | — |
| ADR-118 | Approved built-in calls resume once | Accepted | 2026-09-19 |
| ADR-119 | Tool changes invalidate approval rules | Accepted | 2026-09-19 |
| ADR-120 | Shared organization rows require organization scope to write | Accepted | 2026-09-19 |
| ADR-121 | Preserve GitHub record identity across repositories | Accepted | 2026-09-19 |
| ADR-122 | External MCP calls enter the decision-rules gate | Accepted | 2026-09-19 |
| ADR-123 | Production migrations run platform seeds | Accepted | 2026-09-19 |
| ADR-125 | Audit partition maintenance and telemetry boundaries | Accepted for implementation | — |
| ADR-126 | Keep frame bodies in the WAL and record bounded redaction details | Accepted | 2026-09-19 |
| ADR-127 | Keep sealed events when body storage fails | Accepted | 2026-09-19 |
| ADR-128 | Local ARP checkpoints prepare external runs | Accepted | 2026-09-19 |
| ADR-128 | Source identifiers determine draft filenames | Accepted | 2026-09-19 |
| ADR-130 | Spend and operator feedback lead the app | Accepted | 2026-09-20 |
| ADR-131 | One OpenRouter key per organisation, and funding is decided with the model | Accepted | 2026-09-20 |
| ADR-132 | The mockup's CSS is the app's design of record | Accepted | 2026-09-20 |
| ADR-133 | The governance mode in force decides how it may be changed | Accepted | 2026-09-21 |
| ADR-134 | Durable AI usage settlement | Accepted for implementation | — |
| ADR-135 | Rev1 console scope and cutover evidence | Accepted decisions consolidated from the maintainer record | 2026-09-20 |
| ADR-136 | Clone and retire immutable configuration identities | Accepted | 2026-09-20 |
| ADR-137 | Standing decisions are workspace context records, stored once | Accepted | 2026-09-22 |
| ADR-138 | An external tool's identity is case-folded at the decision gate | Accepted | 2026-09-22 |
| ADR-139 | One store for a run's content on the host | Accepted | 2026-09-22 |
| ADR-140 | One tool call seals one frame, sealed by the source that reports it first | Accepted | 2026-09-22 |
| ADR-141 | What counts as an installed Cursor, and where a Cursor steer lands | Accepted | 2026-09-22 |
| ADR-142 | Cost-center chargeback on Spend | Accepted | 2026-09-22 |
| ADR-143 | The gateway brokers the vendor credential: a wrapped harness holds a run token | Accepted | 2026-09-22 |
| ADR-147 | A merge queue runs the full gate before a PR lands on main | Accepted | 2026-09-23 |
About this atlas
Generated, not written. The docs build regenerates it from the tree; pnpm docs:architecture --check proves the cited sources still exist and the output is deterministic.
Inputs
apps/*/package.json,packages/*/package.json,tools/*/package.json— the workspace graph.packages/database/storage-manifest.json— the ADR-031 platform storage ontology (content hash4c3b1ee210ab7d1d…), kept byte-stable bypnpm schema:manifest:check.packages/database/src/relations.ts,schema/_schemas.ts,tenant-policy.manifest.ts— logical edges, schema namespaces, RLS classes.packages/telemetry/src/schema.sql+migrations/*.sql— ClickHouse, replayed in order.packages/ontology/src/schema.cypher— Neo4j vector indexes (labels arrive via the manifest).packages/oxagen/capabilities.manifest.jsonandpackages/handlers/src/register.ts— contracts and handler bindings.apps/api/src/app.ts+routes/**— mounted routes, tiers, middleware chains.apps/mcp/src/tools,apps/cli/src/program.ts— the other two surfaces.packages/inngest-functions/src/functions/*.ts— scanned with the exported helpers ofcheck-inngest-senders.ts.packages/config/src/registry.ts—ENV_REGISTRY, imported directly..github/workflows/*.yml,docs/adr/*.md,infra/tools/caddy/Caddyfile.alb,docker-compose.dev.yml.
Curated flows
12 mechanism diagrams are hand-described in tools/scripts/lib/archdocs/flows.ts because they encode order, which no manifest records. Each cites the files and symbols it depicts (78 references); the generator fails when any cited file or symbol is missing, so a flow cannot outlive the code it draws.
Determinism
No timestamps, no random ids, no network. Two builds of the same tree produce identical bytes. The output is not committed: apps/docs regenerates it as a prebuild step, so the published atlas always matches the tree it shipped with, and CI's --check guards the two things that can rot, cited sources and determinism.