Documentation
¶
Overview ¶
Package methods is the single source of truth for Harbor Protocol method names (CLAUDE.md §8: "Method names live in internal/protocol/methods/methods.go. No hardcoded method strings elsewhere."). Other packages reference these constants; no Protocol method string is hardcoded outside this file. A single-source lint formalises this; the layout here lays the foundation so that lint is a no-op formalisation.
The set: the task control surface ¶
Harbor ships the ten canonical task-control method names (RFC §5.2 "Task control" row): `start` plus the nine steering-control entries from the RFC §6.3 control taxonomy. `start` spawns a task; the nine controls map 1:1 onto the nine steering.ControlType values. Later Protocol surfaces (state snapshots, topology, artifacts, traces, metrics — RFC §5.2's other rows) add their method names here in their own phases.
The wire strings are lowercase snake_case — `inject_context`, `user_message` — matching the RFC §5.2 table verbatim. They are NOT the uppercase steering.ControlType wire strings (`INJECT_CONTEXT`, `USER_MESSAGE`): the Protocol method name is the client-facing name, and the protocol.ControlSurface translates a method name into its steering.ControlType. Keeping the two namespaces distinct is deliberate — the Protocol surface owns its own method vocabulary ("the runtime owns the protocol it speaks").
The extension: the streaming-events method-name anchors ¶
The streaming-events extension elevates `events.subscribe` to a canonical method-name constant. The wire-transport route is still `GET /v1/events` (SSE), but the canonical method name is now the contract third-party Console implementations branch on — same pattern as the task-control nine. Harbor adds `events.aggregate` (`POST /v1/events/aggregate`) for time-bucketed event-type counts. `events.subscribe` and `events.aggregate` are streaming-events methods, NOT task-control methods: `IsControlMethod` returns false for both (the predicate stays exclusive to the steering- control nine) and `Methods()` returns the augmented sorted set with the new entries. and
The search cluster ¶
Harbor adds the five `search.*` methods used by the Console command palette and per-section search bars. `search.query` is the pure aggregator that fans out to the per-index methods (`search.sessions`, `search.tasks`, `search.events`, `search.artifacts`). The five methods are NOT control methods: `IsControlMethod` returns false for them (the steering inbox stays exclusive). A separate `IsSearchMethod` predicate lets transport adapters branch the route table. See
The posture cluster ¶
Harbor adds the five read-only `runtime.*` / `metrics.*` posture methods: `runtime.info` (build identity + version + uptime + capabilities), `runtime.health` (per-subsystem readiness rollup), `runtime.counters` (low-cardinality live counters), `runtime.drivers` (configured driver names per persistence-shaped subsystem), and `metrics.snapshot` (a Protocol-shaped projection over the MetricsRegistry). Harbor extends the cluster with the two config- posture methods the Console Settings page consumes: `governance.posture` (the read-only `IdentityTiers` view) and `llm.posture` (the bound LLM provider/model/region + `MockMode` flag). None of the seven methods are control or search methods — `IsControlMethod` / `IsSearchMethod` return false; a dedicated `IsPostureMethod` predicate routes them through the PostureSurface dispatcher, a sibling of the task-control surface, not an extension. They are read-only — no mutation counterpart ships at V1. See
The topology method ¶
Harbor adds `topology.snapshot` — the request-side surface that returns the Runtime engine's canonical TopologyProjection (static node graph + live per-edge queue depth). It is NOT a task-control method (`IsControlMethod` returns false), NOT a streaming-events method, and NOT a search method: `IsTopologyMethod` is its own O(1) predicate. The wire-transport route is the existing `POST /v1/control/{method}` REST surface. The paired in-flight surface — `topology.changed` — is a canonical EVENT, not a method, so it is not in the method registry. See
No registration escape hatch ¶
canonicalMethods is a fixed package-level map, not a write-once registry. The task-control set is closed; a new Protocol method is a new phase that declares a new constant + extends the map + (if reader-facing) updates the master plan / glossary — there is no RegisterMethod seam to drift through. This mirrors the steering taxonomy's fixed-enum posture.
Index ¶
- func IsAgentConfigAdminMethod(m Method) bool
- func IsAgentConfigMethod(m Method) bool
- func IsAgentConfigSessionMethod(m Method) bool
- func IsAgentConfigUserMethod(m Method) bool
- func IsAgentsControlMethod(m Method) bool
- func IsAgentsMethod(m Method) bool
- func IsArtifactsMethod(m Method) bool
- func IsAuthMethod(m Method) bool
- func IsControlMethod(m Method) bool
- func IsEventsListMethod(m Method) bool
- func IsFlowsMethod(m Method) bool
- func IsGovernanceAdminMethod(m Method) bool
- func IsMCPAdminMethod(m Method) bool
- func IsMCPAppsMethod(m Method) bool
- func IsMCPServersMethod(m Method) bool
- func IsMemoryMethod(m Method) bool
- func IsPauseMethod(m Method) bool
- func IsPostureMethod(m Method) bool
- func IsRunsMethod(m Method) bool
- func IsSearchMethod(m Method) bool
- func IsSessionsMethod(m Method) bool
- func IsStateMethod(m Method) bool
- func IsStreamingEventsMethod(m Method) bool
- func IsTasksMethod(m Method) bool
- func IsToolsAdminMethod(m Method) bool
- func IsToolsMethod(m Method) bool
- func IsTopologyMethod(m Method) bool
- func IsValidMethod(m Method) bool
- type Method
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func IsAgentConfigAdminMethod ¶ added in v1.5.0
IsAgentConfigAdminMethod reports whether m is one of the `agent_config.*` capability-mutation verbs that gate on the verified `auth.ScopeAdmin` claim (the agent-config authorization model).
func IsAgentConfigMethod ¶ added in v1.5.0
IsAgentConfigMethod reports whether m is one of the thirty `agent_config.*` methods. The control transport / wire handler branches on this to route the request through the agent-config dispatcher instead of the task-control surface. NOT a control method — a new agent-config method extends THIS predicate, never the steering inbox.
func IsAgentConfigSessionMethod ¶ added in v1.5.0
IsAgentConfigSessionMethod reports whether m is one of the `agent_config.session.*` safe-subset verbs — the non-admin lower tier of the authorization matrix. A session-scoped (non-admin) caller is permitted on these verbs (and ONLY these among the agent-config family); every other `agent_config.*` method requires the admin scope.
func IsAgentConfigUserMethod ¶ added in v1.6.0
IsAgentConfigUserMethod reports whether m is one of the five `agent_config.user.*` verbs — the durable per-user config-variant tier (the middle tier of the authorization matrix). The agent-config wire handler uses it to gate those routes on the verified `auth.ScopeAgentConfigUser` claim (NOT admin). A user method is always an agent-config method and never a session safe-subset or admin method.
func IsAgentsControlMethod ¶ added in v1.3.0
IsAgentsControlMethod reports whether m is one of the five mutating `agents.*` fleet-control verbs (`agents.pause` / `agents.drain` / `agents.restart` / `agents.force_stop` / `agents.deregister`) that require the verified `auth.ScopeAdmin` control claim. The Agents wire handler uses this to decide whether to enforce the gate.
func IsAgentsMethod ¶
IsAgentsMethod reports whether m is one of the thirteen canonical `agents.*` methods (reads + control verbs). The wire handler branches on this to route the request through the agents dispatcher instead of the task-control / search / posture / topology surfaces.
func IsArtifactsMethod ¶
IsArtifactsMethod reports whether m is one of the canonical artifacts methods (— `artifacts.list` / `artifacts.put` / `artifacts.get_ref` — plus the admin `artifacts.delete` mutation). The control transport branches on this to route the request through the artifacts dispatcher instead of the task-control / search / posture surfaces. NOT a control method — a new non-control method extends THIS predicate, never the steering inbox.
func IsAuthMethod ¶
IsAuthMethod reports whether m is one of the canonical `auth.*` methods (— today just `auth.rotate_token`). The stream transport branches on this to route the request through the auth handler instead of the task-control / search / posture surfaces. NOT a control method — a new non-control method extends THIS predicate, never the steering inbox.
func IsControlMethod ¶
IsControlMethod reports whether m is one of the nine steering-control methods — every canonical method except MethodStart AND the streaming-events methods AND the `search.*` cluster AND the `runtime.*` / `metrics.*` posture cluster AND the pause-snapshot method AND the `topology.snapshot` method AND the `memory.*` read cluster (each a separate surface from the steering inbox). The protocol.ControlSurface uses this to branch: a control method maps onto a steering.ControlEvent; MethodStart maps onto the task registry; a streaming-events method routes through the SSE / events-aggregate transport; a search method maps onto the search dispatcher; a posture method maps onto the PostureSurface; a pause-snapshot method maps onto the pause-list handler; a topology method maps onto the topology dispatcher. A new non-control method (state inspection, artifacts — future phases) extends THIS predicate, NOT the steering-control inbox.
func IsEventsListMethod ¶ added in v1.13.0
IsEventsListMethod reports whether m is the canonical `events.list` read (— today just `events.list`). NOT a control / streaming-events method — a new non-control events-read method extends THIS predicate, never the steering inbox.
func IsFlowsMethod ¶
IsFlowsMethod reports whether m is one of the six Flows-page methods. Five are read-only; `flows.run` is the single mutating method. The Flows-page surface is distinct from the steering inbox, the streaming-events surface, the search cluster, and the posture surface — a transport adapter branches on this predicate to route the request through the Flows dispatcher.
func IsGovernanceAdminMethod ¶ added in v1.5.0
IsGovernanceAdminMethod reports whether m is one of the admin-scoped `governance.*` tenant-override verbs (`set_tenant_overrides` / `get_tenant_overrides`). The governance wire handler uses it to apply the admin gate. NOT a posture method — `governance.posture` is read-only and routed through the posture surface.
func IsMCPAdminMethod ¶
IsMCPAdminMethod reports whether m is one of the three `mcp.servers.*` admin verbs (`refresh_binding` / `revoke_binding` / `set_raw_html_trust`) that gate on the `auth.ScopeAdmin` claim. The MCPSurface dispatcher uses it to apply the admin gate.
func IsMCPAppsMethod ¶ added in v1.4.0
IsMCPAppsMethod reports whether m is one of the three MCP Apps host methods (`mcp.servers.read_resource` / `mcp.apps.call_tool` / `mcp.apps.tool_context`). The control transport branches on this to route the request through the AppsSurface dispatcher instead of the task-control / Console-MCP surfaces. NOT a control method — a new MCP Apps method extends THIS predicate, never the steering inbox.
func IsMCPServersMethod ¶
IsMCPServersMethod reports whether m is one of the twelve canonical `mcp.servers.*` methods. The control transport branches on this to route the request through the MCPSurface dispatcher instead of the task-control / search / posture surfaces. NOT a control method — a new non-control method extends THIS predicate, never the steering inbox.
func IsMemoryMethod ¶
IsMemoryMethod reports whether m is one of the canonical `memory.*` methods — the read trio plus the `memory.strategy_trace` read + `memory.put` / `memory.delete` admin mutation pair. The control transport branches on this to route the request through the memory handlers instead of the task-control / search / posture / pause / topology surfaces. NOT a control method — a new non-control memory method extends THIS predicate, never the steering inbox; the mutation methods gate on `admin` at the handler edge.
func IsPauseMethod ¶
IsPauseMethod reports whether m is one of the pause-snapshot methods landed in (currently only MethodPauseList). The pause-snapshot surface is a read-only projection over the unified pause/resume Coordinator; it is NOT a steering control, NOT a streaming-events method, and NOT a search method. A transport adapter branches on this predicate to route the request through the pause-list snapshot handler instead of the task-control surface.
func IsPostureMethod ¶
IsPostureMethod reports whether m is one of the seven read-only posture methods — the five `runtime.*` / `metrics.*` reads and the two `governance.posture` / `llm.posture` config reads. The PostureSurface uses this to branch in transport adapters that want a single route table over all canonical methods.
func IsRunsMethod ¶
IsRunsMethod reports whether m is one of the canonical `runs.*` methods (— today just `runs.set_overrides`). The stream transport branches on this to route the request through the Runs handler instead of the task-control / search / posture / pause / topology / artifacts / memory / mcp / tools / flows / agents / sessions surfaces. NOT a control method — a new non-control method extends THIS predicate, never the steering inbox.
func IsSearchMethod ¶
IsSearchMethod reports whether m is one of the five canonical `search.*` methods. The control transport branches on this to route the request through the search dispatcher instead of the task-control surface.
func IsSessionsMethod ¶
IsSessionsMethod reports whether m is one of the four canonical Sessions-page methods (— `sessions.list`, `sessions.inspect`, `sessions.delete`, `sessions.set_title`). The stream transport branches on this to route the request through the Sessions handler instead of the task-control / search / posture / pause / topology / artifacts / memory / mcp / tools / flows surfaces. NOT a control method — a new non-control method extends THIS predicate, never the steering inbox.
func IsStateMethod ¶ added in v1.6.0
IsStateMethod reports whether m is one of the canonical State-snapshots `state.*` methods (— today just `state.history`). The stream transport branches on this to route the request through the state-history handler instead of the task-control / search / posture / pause / topology / artifacts / memory / mcp / tools / flows / agents / sessions / runs surfaces. NOT a control method — a new non-control state method extends THIS predicate, never the steering inbox.
func IsStreamingEventsMethod ¶
IsStreamingEventsMethod reports whether m is one of the streaming- events methods landed in (MethodEventsSubscribe or MethodEventsAggregate). The transport-side router uses this to classify a method into its routing branch without re-listing the streaming set.
func IsTasksMethod ¶
IsTasksMethod reports whether m is one of the two canonical `tasks.*` methods (— `tasks.list`, `tasks.get`). The stream transport branches on this to route the request through the Tasks dispatcher instead of the task-control / search / posture / topology surfaces. NOT a control method — both are reads; the Console Tasks page consumes the shipped control verbs for mutation.
func IsToolsAdminMethod ¶
IsToolsAdminMethod reports whether m is one of the two mutating `tools.*` methods (`tools.set_approval_policy` / `tools.revoke_oauth`) that require the verified `auth.ScopeAdmin` claim. The Tools wire handler uses this to decide whether to enforce the scope gate.
func IsToolsMethod ¶
IsToolsMethod reports whether m is one of the seven canonical `tools.*` methods. The control transport branches on this to route the request through the Tools dispatcher instead of the task-control / search / posture / topology surfaces. NOT a control method — a new non-control method extends THIS predicate, never the steering inbox.
func IsTopologyMethod ¶
IsTopologyMethod reports whether m is one of the canonical topology-projection methods (— today just `topology.snapshot`). The control transport branches on this to route the request through the topology dispatcher instead of the task-control / search surfaces. NOT a control method — a new non-control method extends THIS predicate, never the steering inbox.
func IsValidMethod ¶
IsValidMethod reports whether m is one of the canonical Protocol method names — the task-control ten plus the streaming-events additions plus the search cluster.
Types ¶
type Method ¶
type Method string
Method is the string-typed enum of canonical Harbor Protocol method names. The wire form is the lowercase snake_case string.
const ( // MethodStart asks the Runtime to spawn a new task / foreground run. // Maps onto tasks.TaskRegistry.Spawn. MethodStart Method = "start" // MethodCancel cancels a run (soft by default; `hard: true` in the // payload propagates a cancellation context). Maps onto the CANCEL // steering control. MethodCancel Method = "cancel" // MethodPause pauses a run at the next planner-step boundary. Maps // onto the PAUSE steering control; the run loop routes it through // the unified pauseresume.Coordinator. MethodPause Method = "pause" // MethodResume resumes a paused run. Maps onto the RESUME steering // control; the run loop routes it through pauseresume.Coordinator. MethodResume Method = "resume" // MethodRedirect rewrites a run's goal. Maps onto the REDIRECT // steering control; the new goal is the payload's `goal` string. MethodRedirect Method = "redirect" // MethodInjectContext appends operator-supplied context to a run's // trajectory, visible on the planner's next step. Maps onto the // INJECT_CONTEXT steering control. MethodInjectContext Method = "inject_context" // MethodApprove approves a HITL-gated step. Maps onto the APPROVE // steering control; the run loop advances the pause via // pauseresume.Coordinator. MethodApprove Method = "approve" // MethodReject rejects a HITL-gated step. Maps onto the REJECT // steering control; the run loop advances the pause and the run // terminates with Finish{ConstraintsConflict}. MethodReject Method = "reject" // MethodPrioritize changes a run's task priority. Maps onto the // PRIORITIZE steering control; the new priority is the payload's // `priority` number. MethodPrioritize Method = "prioritize" // MethodUserMessage injects a user-authored message into a run, // visible on the planner's next step. Maps onto the USER_MESSAGE // steering control; the message is the payload's `message` string. MethodUserMessage Method = "user_message" // MethodEventsSubscribe opens a server-filtered event subscription. // The wire-transport route is `GET /v1/events` // SSE; the canonical method name is the contract a // third-party Console branches on. Identity-mandatory; a request // with `?admin=1` (cross-tenant fan-in) requires the verified // `auth.ScopeAdmin` or `auth.ScopeConsoleFleet` scope claim. // The reject path returns the canonical // `errors.CodeIdentityScopeRequired` Code (HTTP 403). NOT a // task-control method — IsControlMethod returns false; the // control nine stays exclusive. MethodEventsSubscribe Method = "events.subscribe" // MethodEventsAggregate returns time-bucketed event-type counts // over a window. Powers the per-event-type // stacked-area sparkline on the Console Events page. // The wire-transport route is `POST /v1/events/aggregate`. // Identity-mandatory + cross-tenant scope rules apply (same // posture as MethodEventsSubscribe). // // NOT a control method: `IsControlMethod(MethodEventsAggregate)` // returns false. MethodEventsAggregate Method = "events.aggregate" // MethodSearchQuery — the Console palette // dispatcher. Pure aggregator: fans out concurrently to the // runtime-side per-index search methods, merges + paginates the // union. Carries no index of its own. MethodSearchQuery Method = "search.query" // MethodSearchSessions — Server-enforced session-index // search scoped to the caller's identity triple; cross-tenant // requires the `auth.ScopeAdmin` claim. MethodSearchSessions Method = "search.sessions" // MethodSearchTasks — Server-enforced task-index search; // same identity-scope contract as MethodSearchSessions. MethodSearchTasks Method = "search.tasks" // MethodSearchEvents — Server-enforced events-index // search (filters by event type + header fields + time window). // Reuses the EventFilter predicate. Substring search over // event payload contents is post-V1. MethodSearchEvents Method = "search.events" // MethodSearchArtifacts — Server-enforced artifact-index // search; rows always carry a `ref` (artifacts are by-reference by // construction). MethodSearchArtifacts Method = "search.artifacts" // MethodRuntimeInfo — Read-only posture method: // returns the Runtime's build identity (version / commit / Go // toolchain / build date), Protocol version, advertised // capabilities, uptime, instance ID, and operator-configured // display name. NOT a control method; dispatched by PostureSurface. MethodRuntimeInfo Method = "runtime.info" // MethodRuntimeHealth — Read-only posture method: // returns the per-subsystem readiness rollup (`ready` / `degraded` // / `unavailable`) across the runtime's registered subsystems. MethodRuntimeHealth Method = "runtime.health" // MethodRuntimeCounters — Read-only posture method: // returns the low-cardinality live counters the Console footer / // sidebar chips render (events/sec, tasks running, background jobs, // MCP connections, sessions active). Identity-scoped; the response // is the roll-up, never a per-run / per-task breakdown. MethodRuntimeCounters Method = "runtime.counters" // MethodRuntimeDrivers — Read-only posture method: // returns the configured driver names per persistence-shaped // subsystem (`state`, `artifacts`, `memory`, `eventlog`). Returns // the driver name + optional posture mode — never the DSN. MethodRuntimeDrivers Method = "runtime.drivers" // MethodMetricsSnapshot — Read-only posture method: // returns a Protocol-shaped projection over the // MetricsRegistry — counters, histograms, gauges as flat wire // values. NOT an OpenTelemetry SDK re-export. MethodMetricsSnapshot Method = "metrics.snapshot" // MethodGovernancePosture — Returns the // runtime's read-only governance configuration: the consolidated // `IdentityTiers` map (per-tier `BudgetCeilingUSD` + token-bucket // `RateLimit` + `MaxTokens`) plus the `DefaultTier` selector and the // caller-resolved tier. Identity-mandatory; cross-tenant reads // require the `auth.ScopeAdmin` claim. NOT a control method // and NOT a search method — it is a posture method (read-only // runtime-config projection). `IsControlMethod` / `IsSearchMethod` // both return false; `IsPostureMethod` returns true. See MethodGovernancePosture Method = "governance.posture" // MethodLLMPosture — Returns the // runtime's read-only LLM provider posture: provider name, model id, // region/endpoint, and a `MockMode` boolean — `true` iff the runtime // booted with `HARBOR_DEV_ALLOW_MOCK=1`. Identity-mandatory; // cross-tenant reads require the `auth.ScopeAdmin` claim. A // posture method, same posture as MethodGovernancePosture. MethodLLMPosture Method = "llm.posture" // MethodGovernanceSetTenantOverrides — admin verb: sets (or clears) a // tenant's default LLM-parameter overrides (model, additive // extra-instructions, temperature, max-tokens, reasoning-effort) live, // with no redeploy. The change is a desired-state REPLACE and lands on // every session in the tenant on its next run (the RFC §6.15 // `ModelOverride` governance seam). Identity-mandatory; requires the // `auth.ScopeAdmin` claim (a non-admin caller is rejected with // CodeScopeMismatch). NOT a control / search / posture method — // `IsGovernanceAdminMethod` is its own O(1) predicate. The // wire-transport route is `POST /v1/governance/set_tenant_overrides`. MethodGovernanceSetTenantOverrides Method = "governance.set_tenant_overrides" // MethodGovernanceGetTenantOverrides — admin verb: reads a tenant's // current default LLM-parameter override record (the read-back the // Console renders before editing). Identity-mandatory; requires the // `auth.ScopeAdmin` claim. The wire-transport route is // `POST /v1/governance/get_tenant_overrides`. MethodGovernanceGetTenantOverrides Method = "governance.get_tenant_overrides" // MethodGovernanceRotateKey — admin verb: rotates the LLM provider // API key live, with no redeploy. The new key swaps atomically behind // the provider account so the next call uses it and the old key is // invalidated immediately. The key VALUE is a secret carried only on // the request leg — never logged, audited, or echoed; the response + // the `governance.key_rotated` event carry only a non-reversible // fingerprint. Identity-mandatory; requires the `auth.ScopeAdmin` // claim (a non-admin caller is rejected with CodeScopeMismatch). The // wire-transport route is `POST /v1/governance/rotate_key`. MethodGovernanceRotateKey Method = "governance.rotate_key" // MethodGovernanceSetPosture — admin verb: writes the identity-tier // policy table (per tier: budget-ceiling USD / max-tokens cap / // rate-limit capacity, plus the default-tier assignment) live, with no // redeploy. The write is a FULL REPLACE through the shared validator the // `governance.posture` read projects (never a partial merge) — a // submitted table that OMITS or zeroes a ceiling the current effective // policy enforces is rejected fail-closed with CodeInvalidRequest before // any state mutation, never budget-widening. The tier policy graduates // from hot-reloadable boot config to a StateStore-backed record layered // over the config-declared defaults; it round-trips with the read (what // you set is what the next `governance.posture` returns). // Identity-mandatory; requires the `auth.ScopeAdmin` claim ONLY — // explicitly NOT the two-scope (`admin` OR `console:fleet`) set that // gates the read, so a leaked read-only fleet token cannot widen a // budget. A non-admin caller is rejected with CodeScopeMismatch. NOT a // control / search / posture method — `IsGovernanceAdminMethod` is its // own O(1) predicate. The wire-transport route is // `POST /v1/governance/set_posture`. MethodGovernanceSetPosture Method = "governance.set_posture" // MethodAgentConfigGet — reads an agent's current active config // revision (the read-back the Console renders before editing). // Identity-mandatory; requires the verified `auth.ScopeAdmin` claim // (reading the agent-config control plane is a privileged action). // The wire-transport route is `POST /v1/agent_config/get`. MethodAgentConfigGet Method = "agent_config.get" // MethodAgentConfigSetRevision — admin verb: writes a NEW immutable, // content-addressed config revision for an agent and advances the // active pointer. An idempotent re-set of byte-identical canonical // content is a no-op returning the existing revision. The change lands // on the agent's NEXT run (next-turn projection — never mid-flight). // Identity-mandatory; requires the `auth.ScopeAdmin` claim (a // non-admin caller is rejected with CodeScopeMismatch). The // wire-transport route is `POST /v1/agent_config/set_revision`. MethodAgentConfigSetRevision Method = "agent_config.set_revision" // MethodAgentConfigListRevisions — reads an agent's revision chain, // newest-first. Identity-mandatory; requires the `auth.ScopeAdmin` // claim. The wire-transport route is // `POST /v1/agent_config/list_revisions`. MethodAgentConfigListRevisions Method = "agent_config.list_revisions" // MethodAgentConfigDiff — server-side compare of two existing config // revisions (a structured set-diff for the structured sections). // Identity-mandatory; requires the `auth.ScopeAdmin` claim. The // wire-transport route is `POST /v1/agent_config/diff`. MethodAgentConfigDiff Method = "agent_config.diff" // MethodAgentConfigRollback — admin verb: repoints the active pointer // to an existing revision WITHOUT mutating or deleting any revision. // The repoint lands on the agent's NEXT run. Identity-mandatory; // requires the `auth.ScopeAdmin` claim. The wire-transport route is // `POST /v1/agent_config/rollback`. MethodAgentConfigRollback Method = "agent_config.rollback" // MethodAgentConfigSkillsList — reads the agent's skills (metadata // only) — the first consumer of the config-revision registry. // Identity-mandatory; requires the `auth.ScopeAdmin` claim. The // wire-transport route is `POST /v1/agent_config/skills/list`. MethodAgentConfigSkillsList Method = "agent_config.skills.list" // MethodAgentConfigSkillsUpsert — admin verb: upserts a skill into the // agent's store and records the membership change as a config // revision. A pack-origin skill is never silently overwritten — the // refusal surfaces as a typed Protocol error. Identity-mandatory; // requires the `auth.ScopeAdmin` claim. The wire-transport route is // `POST /v1/agent_config/skills/upsert`. MethodAgentConfigSkillsUpsert Method = "agent_config.skills.upsert" // MethodAgentConfigSkillsDelete — admin verb: deletes a skill from the // agent's store and records the membership change as a config // revision. Identity-mandatory; requires the `auth.ScopeAdmin` claim. // The wire-transport route is `POST /v1/agent_config/skills/delete`. MethodAgentConfigSkillsDelete Method = "agent_config.skills.delete" // MethodAgentConfigSetToolExposure — admin verb: sets the agent's // MCP-exposure / per-tool policy (paused servers + disabled tools) as a // desired-state replace of the tool-exposure section and records the // change as a config revision. Pausing a server excludes its tools from // the next run (the live transport stays warm) and rejects its App // callbacks against current state; emits `mcp.connection.paused` / // `.resumed`. Identity-mandatory; requires the `auth.ScopeAdmin` claim. // The wire-transport route is `POST /v1/agent_config/set_tool_exposure`. MethodAgentConfigSetToolExposure Method = "agent_config.set_tool_exposure" // MethodAgentConfigSetPromptLayers — admin verb: sets the agent's // layered system prompt (operator base and/or user layer) as a // desired-state replace of the prompt-layer section and records the // change as a config revision. The base is the run's base system prompt; // the user layer composes above it in the lower-trust guidance position // (it can extend but never replace or weaken the operator base). The // skills + tool-exposure sections are preserved. Applies to the agent's // next run. Identity-mandatory; requires the `auth.ScopeAdmin` claim. // The wire-transport route is `POST /v1/agent_config/set_prompt_layers`. MethodAgentConfigSetPromptLayers Method = "agent_config.set_prompt_layers" // MethodAgentConfigSetLLMParams — admin verb: sets the agent's per-agent // LLM-parameter section (model / temperature / max-tokens / // reasoning-effort) as a desired-state replace of the LLM-params section // and records the change as a config revision. The per-agent params // override the tenant-wide baseline (resolution session › per-agent › // tenant-wide baseline › config default) for the agent's next run. A set // model is validated against the configured ModelProfiles (an unknown // model is rejected). The prompt-layer + skills + tool-exposure + // connection sections are preserved. Identity-mandatory; requires the // `auth.ScopeAdmin` claim. The wire-transport route is // `POST /v1/agent_config/set_llm_params`. MethodAgentConfigSetLLMParams Method = "agent_config.set_llm_params" // MethodAgentConfigAddMCPConnection — admin verb: adds a NEW MCP server // connection (the separable async-dial path). The runtime drives the real // attach lifecycle (dial → initialize handshake → discover → register), // records the non-secret descriptor as a config revision (preserving the // skills + tool-exposure + prompt-layer sections), and emits the // `mcp.connection.pending` then a terminal `mcp.connection.added` / // `.failed` / `.auth_required` lifecycle event. A failure records no // revision and never registers a half-attached server (fail loud). Adding // a stdio server (an RCE surface) is gated beyond admin on an operator // allowlist (fail-closed; argv-form only). An auth-required server parks // on the unified pause/resume primitive (the resume continuation that // re-drives the attach to online is not yet implemented — issue #375). // Identity-mandatory; requires the `auth.ScopeAdmin` claim. The // wire-transport route is `POST /v1/agent_config/add_mcp_connection`. MethodAgentConfigAddMCPConnection Method = "agent_config.add_mcp_connection" // MethodAgentConfigRemoveMCPConnection — admin verb: removes a // runtime-added MCP server connection by name as a NEW revision. The // revision drops the named descriptor AND prunes that server's // tool-exposure residue (paused/disabled/loading entries), carrying every // sibling section (incl. hooks) forward. An unknown name and a // boot-declared (yaml) name each fail loud with a distinct typed error — // the verb governs revisioned state only (a boot-declared server is // edited in yaml + restart). The verb itself never tears anything down: // the physical teardown (deregister the server's tools + close its // transport) happens at the NEXT run-start reconcile. Exposure is // next-turn; teardown is process-global — an in-flight run whose next // step calls the detached server fails loudly (typed not-found / closed // transport), never a hang or a silent success. Identity-mandatory; // requires the `auth.ScopeAdmin` claim. The wire-transport route is // `POST /v1/agent_config/remove_mcp_connection`. MethodAgentConfigRemoveMCPConnection Method = "agent_config.remove_mcp_connection" // MethodAgentConfigSetMCPDiscoveryOrigins — admin verb: FULL-REPLACE writes // a runtime-added MCP connection's OAuth-discovery cross-origin allow-list. // It records a new revision (carrying every sibling section forward) AND // applies the allow-list to the live MCP registry so the very next discovery // uses it; a revoke also prunes the recorded requirement's now-unallowed // authorization-server entries, and a rollback past a grant revokes the // origin live via the owner-scoped run-start reconcile. Origins run the // shared discovery-origin validator (https origin, no path/IP-literal). An // unknown connection, a boot-declared (yaml) name, and a stdio connection // each fail loud with a distinct typed error. The allowance is never an SSRF // hole: a granted origin resolving private/loopback is still refused at dial. // Identity-mandatory; requires the `auth.ScopeAdmin` claim. The // wire-transport route is `POST /v1/agent_config/set_mcp_discovery_origins`. MethodAgentConfigSetMCPDiscoveryOrigins Method = "agent_config.set_mcp_discovery_origins" // MethodAgentConfigSetOAuthProvider — admin verb: installs (upserts) a // ZERO-URL, broker-pull OAuth provider onto the agent-config revision spine // AND into the live owner-tagged provider set so the next MCP attach bound to // it injects the exchanged bearer. The writable descriptor carries only // `{name, driver:"tokenexchange", credential_source:"remote", // credential_broker, scopes?}` — NO URL, NO env-var name, NO secret; every // credential sink is pinned at boot on the named credential broker (a write // carrying `token_url` / `auth_url` / `client_id_env` / `client_secret_env` / // `remote` is rejected BY NAME via DisallowUnknownFields). A name colliding // with a boot-declared provider is refused (boot wins). Identity-mandatory; // requires the `auth.ScopeAdmin` claim. The wire-transport route is // `POST /v1/agent_config/set_oauth_provider`. MethodAgentConfigSetOAuthProvider Method = "agent_config.set_oauth_provider" // MethodAgentConfigRemoveOAuthProvider — admin verb: uninstalls a // Protocol-installed OAuth provider by name as a NEW revision AND uninstalls // it live, which CLOSES the provider — so a still-bound connection's next // call fails LOUD rather than degrading to an unauthenticated dial // (deliberately breaking; the break is confined to the owning owner by the // owner-scoped run-start reconcile). An unknown name and a boot-declared name // each fail loud with a distinct typed error. Identity-mandatory; requires // the `auth.ScopeAdmin` claim. The wire-transport route is // `POST /v1/agent_config/remove_oauth_provider`. MethodAgentConfigRemoveOAuthProvider Method = "agent_config.remove_oauth_provider" // MethodAgentConfigSetLLMProvider — admin verb: installs (upserts) / // rotates a ZERO-URL, broker-pull INFERENCE provider binding onto the // owner-tagged provider set so the runtime's LLM key is sourced from the // named coordinator broker. The writable descriptor carries only // `{name, provider, credential_source:"remote", inference_broker, // model_allow?}` — NO URL, NO env-var name, NO secret; every credential // sink is pinned at boot on the named inference broker (a write carrying // `credential_url` / `token_url` / `*_env` / a secret is rejected BY NAME // via DisallowUnknownFields). A separate method from set_oauth_provider (a // distinct credential plane) — never a relaxation of its // tokenexchange-only allowlist. An unknown broker name is refused loud. // Identity-mandatory; requires the `auth.ScopeAdmin` claim ONLY (a control // write is a strictly more elevated tier than any read — NOT the admin OR // console:fleet set). The wire-transport route is // `POST /v1/agent_config/set_llm_provider`. MethodAgentConfigSetLLMProvider Method = "agent_config.set_llm_provider" // MethodAgentConfigSessionSetUserPrompt — session-safe verb (the // non-admin lower tier): a session-scoped end user sets a user // prompt layer that composes ABOVE the operator base (it can extend the // operator's guidance but never precede, replace, or weaken the base — // the base is unwritable by a session caller). Identity-mandatory; does // NOT require the admin scope (a valid identity is enough). The // wire-transport route is `POST /v1/agent_config/session/set_user_prompt`. MethodAgentConfigSessionSetUserPrompt Method = "agent_config.session.set_user_prompt" // MethodAgentConfigSessionSetSourceDisables — session-safe verb: a // session-scoped end user NARROWS (never widens) source/tool enablement // by naming servers/tools to DISABLE within the admin-allowed set. The // disable set is unioned into the admin exclusion set at run start, so it // can only narrow the admin-allowed exposure — there is no enable path. // Identity-mandatory; does NOT require the admin scope. The wire-transport // route is `POST /v1/agent_config/session/set_source_disables`. MethodAgentConfigSessionSetSourceDisables Method = "agent_config.session.set_source_disables" // MethodAgentConfigSessionSkillsList — session-safe verb: lists the // session's ephemeral personal skills (metadata only) under the caller's // real triple. Identity-mandatory; does NOT require the admin scope. The // wire-transport route is // `POST /v1/agent_config/session/skills/list`. MethodAgentConfigSessionSkillsList Method = "agent_config.session.skills.list" // MethodAgentConfigSessionSkillsUpsert — session-safe verb: upserts an // ephemeral personal skill under the caller's real triple. The skill is // session-scoped and never promotes to the agent/tenant scope. // Identity-mandatory; does NOT require the admin scope. The wire-transport // route is `POST /v1/agent_config/session/skills/upsert`. MethodAgentConfigSessionSkillsUpsert Method = "agent_config.session.skills.upsert" // MethodAgentConfigSessionSkillsDelete — session-safe verb: deletes an // ephemeral personal skill under the caller's real triple. // Identity-mandatory; does NOT require the admin scope. The wire-transport // route is `POST /v1/agent_config/session/skills/delete`. MethodAgentConfigSessionSkillsDelete Method = "agent_config.session.skills.delete" // MethodAgentConfigUserGet — user-tier verb (the middle tier of the // authorization matrix): reads the caller's OWN durable, versioned // config variant — the active revision keyed under their real // (tenant, user). Identity-mandatory; requires the verified // `auth.ScopeAgentConfigUser` claim (NOT admin). The wire-transport route // is `POST /v1/agent_config/user/get`. MethodAgentConfigUserGet Method = "agent_config.user.get" // MethodAgentConfigUserSetRevision — user-tier verb: writes a NEW // immutable revision of the caller's durable config variant from a // structurally-bounded safe-subset payload (user prompt + narrow-only // disables + personal-skill names) — no base / connections / model, so a // user caller physically cannot widen a capability. Requires the verified // `auth.ScopeAgentConfigUser` claim. The wire-transport route is // `POST /v1/agent_config/user/set_revision`. MethodAgentConfigUserSetRevision Method = "agent_config.user.set_revision" // MethodAgentConfigUserListRevisions — user-tier verb: reads the caller's // own variant revision chain, newest-first. Requires the verified // `auth.ScopeAgentConfigUser` claim. The wire-transport route is // `POST /v1/agent_config/user/list_revisions`. MethodAgentConfigUserListRevisions Method = "agent_config.user.list_revisions" // MethodAgentConfigUserDiff — user-tier verb: server-side compare of two // existing revisions of the caller's own variant. Requires the verified // `auth.ScopeAgentConfigUser` claim. The wire-transport route is // `POST /v1/agent_config/user/diff`. MethodAgentConfigUserDiff Method = "agent_config.user.diff" // MethodAgentConfigUserRollback — user-tier verb: repoints the caller's // own variant active pointer to an existing revision WITHOUT mutating any // revision. Requires the verified `auth.ScopeAgentConfigUser` claim. The // wire-transport route is `POST /v1/agent_config/user/rollback`. MethodAgentConfigUserRollback Method = "agent_config.user.rollback" // MethodAgentConfigUserSkillsList — durable-per-user skills verb: lists // the caller's user-scope (durable, cross-session) personal skills under // their real (tenant, user). CLAIM-FREE — a valid identity is enough (NO // admin, NO `auth.ScopeAgentConfigUser`): a personal skill cannot widen // capability (the capability filter is default-deny and the injection-time // redactor scrubs any tool a skill names that is outside the run's allowed // set), so authoring one is as safe as the session-scoped rung. The // wire-transport route is `POST /v1/agent_config/user/skills/list`. MethodAgentConfigUserSkillsList Method = "agent_config.user.skills.list" // MethodAgentConfigUserSkillsUpsert — durable-per-user skills verb: // upserts a DURABLE personal skill at user scope (persists across ALL of // the caller's conversations, keyed (tenant, user)). CLAIM-FREE, forced to // `skills.ScopeUser`. The wire-transport route is // `POST /v1/agent_config/user/skills/upsert`. MethodAgentConfigUserSkillsUpsert Method = "agent_config.user.skills.upsert" // MethodAgentConfigUserSkillsDelete — durable-per-user skills verb: // deletes one of the caller's durable user-scope personal skills. // CLAIM-FREE. The wire-transport route is // `POST /v1/agent_config/user/skills/delete`. MethodAgentConfigUserSkillsDelete Method = "agent_config.user.skills.delete" // MethodPauseList — the paginated, // identity-scope-filtered snapshot of currently-paused runs from // the unified pause/resume Coordinator. Read-only: it // does NOT mutate the registry and does NOT call Resume — resume // actions continue through MethodResume / MethodApprove / // MethodReject. The wire-transport route is // `POST /v1/pause/list`. Identity-mandatory; a cross-tenant filter // requires the verified `auth.ScopeAdmin` claim. NOT a // task-control method — `IsControlMethod(MethodPauseList)` returns // false; the control nine stays exclusive. See MethodPauseList Method = "pause.list" // MethodFlowsList — Returns the // paginated catalog of registered engine-graph flows with aggregate // run metrics (runs-in-window, p50/p95 latency, success rate, last // run, per-flow Budget). Identity-mandatory; a cross-tenant // filter requires the verified `auth.ScopeAdmin` claim. NOT a // task-control method — `IsFlowsMethod` returns true; `IsControlMethod` // returns false. MethodFlowsList Method = "flows.list" // MethodFlowsDescribe — Returns a single flow's full // engine-graph description: nodes + edges + per-node descriptor + // per-node policy + a string source reference (Go path or YAML // descriptor — never executable code) + live Budget // consumption. Identity-mandatory; an unknown flow id fails with // CodeNotFound. MethodFlowsDescribe Method = "flows.describe" // MethodFlowsRunsList — Returns a flow's paginated run // history (per-run status / trigger / timing / cost / identity). // Identity-mandatory; a cross-tenant filter requires the verified // `auth.ScopeAdmin` claim. MethodFlowsRunsList Method = "flows.runs.list" // MethodFlowsRunsDescribe — Returns a single flow run's // per-node execution timeline + final-output reference. Heavy outputs // are shipped by-reference via FlowArtifactRef — NEVER inline // bytes. Identity-mandatory; an unknown run id fails with // CodeNotFound. MethodFlowsRunsDescribe Method = "flows.runs.describe" // MethodFlowsRun — Invokes a one-shot run of a registered // flow. This is the ONLY mutating Flows-page method; it is gated on // identity AND the verified `auth.ScopeAdmin` claim (closed // scope set). A request without the claim is rejected with // CodeScopeMismatch (HTTP 403). Every other Flows-page method is // read-only. MethodFlowsRun Method = "flows.run" // MethodFlowsMetrics — Returns a flow's time-bucketed // sparkline aggregates (runs-per-bucket, p95 latency, success rate, // cost, budget consumption) over a window. Read-only; identity- // mandatory. MethodFlowsMetrics Method = "flows.metrics" // MethodTopologySnapshot — Returns the // canonical TopologyProjection of the Runtime's engine — the static // node graph + live per-edge queue depth. Request → reply (on-demand // cold-start surface); the paired in-flight surface is the // `topology.changed` canonical event. The wire-transport route is // the existing `POST /v1/control/{method}` REST surface. NOT a // task-control method (it reaches the engine's read-only Topology // accessor, not the steering inbox) and NOT a streaming-events or // search method — `IsControlMethod` / `IsStreamingEventsMethod` / // `IsSearchMethod` all return false; `IsTopologyMethod` returns // true. Identity-mandatory; a cross-tenant snapshot requires the // `auth.ScopeAdmin` claim. MethodTopologySnapshot Method = "topology.snapshot" // MethodArtifactsList — Returns the // identity-scope-filtered catalog of artifacts from the runtime's // content-addressed artifact store, with the filter // extensions (mime / source / size-range / created-range / tags) // applied as a Go-side projection. Identity-mandatory; a cross-tenant // list requires the `auth.ScopeAdmin` claim. The wire-transport // route is the existing `POST /v1/control/{method}` REST surface. NOT a // task-control, streaming-events, search, posture, pause, or topology // method — `IsArtifactsMethod` is its own O(1) predicate. See MethodArtifactsList Method = "artifacts.list" // MethodArtifactsPut — The Console (and // Playground) file-upload pipeline: accepts bytes + // PutOpts, routes the payload through `audit.Redactor`, stores it via // `artifacts.ArtifactStore.PutBytes`, and returns the canonical // ArtifactRef. Heavy bytes never travel inline through the LLM edge // the put returns a reference, never echoes the body. // Identity-mandatory; a body whose scope tenant disagrees with the // caller's verified tenant is rejected with CodeScopeMismatch. MethodArtifactsPut Method = "artifacts.put" // MethodArtifactsGetRef — The read-side // presigned-URL resolver: invokes `artifacts.Presigner.PresignGet` via // type-assertion on the underlying ArtifactStore. Drivers that do not // implement `Presigner` (in-mem / fs / sqlite-blob / postgres-blob) // return `CodePresignUnsupported` loudly — no silent fallback. The // Console's Preview / Download / Share / bulk-Download all route // through this single resolver. Identity-mandatory; // expiry is bounded [1m, 7d]. MethodArtifactsGetRef Method = "artifacts.get_ref" // MethodArtifactsDelete — The admin-gated, audited // "evict an artifact" mutation: removes the keyed artifact from the // scope via the shipped `ArtifactStore.Delete` (idempotent). Requires // the verified `admin` scope claim (Delete // is a mutating verb, strictly more than the read scope); fails closed // without it. Emits `artifacts.deleted` for audit. Routes through the // control surface at `POST /v1/control/artifacts.delete`. MethodArtifactsDelete Method = "artifacts.delete" // MethodMemoryList — Returns the // paginated, identity-scope-filtered set of memory records the // Console Memory page renders. Read-only — it composes over the // shipped `MemoryStore.Snapshot` surface and the // `events.aggregate` counters. The wire-transport route // is `POST /v1/memory/list`. Identity-mandatory; a cross-tenant // filter requires the verified `auth.ScopeAdmin` (or // `auth.ScopeConsoleFleet`) claim from the closed two-scope // set — NO new memory scope is minted (audit B1). NOT a control / // search / posture / pause / topology method; `IsMemoryMethod` is // its own O(1) predicate. See MethodMemoryList Method = "memory.list" // MethodMemoryGet — Returns the full detail of a single // memory record: metadata + post-redaction value (below the // heavy-content threshold) OR a by-reference `MemoryArtifactRef` // (at or above the threshold) — NEVER inline bytes above threshold. // The wire-transport route is `POST /v1/memory/get`. Same identity- // scope contract as MethodMemoryList. MethodMemoryGet Method = "memory.get" // MethodMemoryHealth — Returns aggregate memory-health // counters (total records / expiring-in-1h / identity-rejected-24h // / recovery-dropped-24h) plus the per-scope driver mapping. The // 24-h-window counters derive from `events.aggregate` over the // `memory.*` event types. The wire-transport route is // `POST /v1/memory/health`. Same identity-scope contract as // MethodMemoryList. MethodMemoryHealth Method = "memory.health" // MethodMemoryStrategyTrace — Returns the live // read-only projection of how the configured memory strategy is // compacting the caller's session memory right now (the rolling- // summary text + the verbatim-turn count + the token estimate + // health) — the strategy's real `GetLLMContext` + `Health` output, not // a fabricated selection trace. The wire-transport route is // `POST /v1/memory/strategy_trace`. Same identity-scope contract as // MethodMemoryList (read scope; no admin claim). MethodMemoryStrategyTrace Method = "memory.strategy_trace" // MethodMemoryPut — The admin-gated, audited // "add a memory turn" mutation: appends an operator-supplied // conversation turn to the caller's session memory via the shipped // `MemoryStore.AddTurn`. Requires the verified `admin` scope claim; // fails closed without it. The wire-transport route is // `POST /v1/memory/put`. MethodMemoryPut Method = "memory.put" // MethodMemoryDelete — The admin-gated, audited // "evict a memory turn" mutation: removes the keyed turn from the // caller's session memory via a `Snapshot` → drop-turn → `Restore` // read-modify-write on the shipped MemoryStore. Requires the verified // `admin` scope claim; fails closed without it. The // wire-transport route is `POST /v1/memory/delete`. MethodMemoryDelete Method = "memory.delete" // MethodMCPServersList — paged, filterable list of the configured // MCP southbound servers with live state. MethodMCPServersList Method = "mcp.servers.list" // MethodMCPServersGet — single-server detail read. MethodMCPServersGet Method = "mcp.servers.get" // MethodMCPServersResources — list of the resources a server // advertises. MethodMCPServersResources Method = "mcp.servers.resources" // MethodMCPServersPrompts — list of the prompts a server // advertises. MethodMCPServersPrompts Method = "mcp.servers.prompts" // MethodMCPServersRefreshDiscovery — control-plane verb: re-runs // the server's tools/resources/prompts discovery. MethodMCPServersRefreshDiscovery Method = "mcp.servers.refresh_discovery" // MethodMCPServersProbe — control-plane verb: runs a transport // ping / tools-list round-trip. MethodMCPServersProbe Method = "mcp.servers.probe" // MethodMCPServersHealth — handshake-latency sparkline + reconnect // history + transport-error rate. MethodMCPServersHealth Method = "mcp.servers.health" // MethodMCPServersBindingsList — list of a server's OAuth bindings // (metadata only — never token plaintext). MethodMCPServersBindingsList Method = "mcp.servers.bindings.list" // MethodMCPServersPolicy — read-only ToolPolicy projection. MethodMCPServersPolicy Method = "mcp.servers.policy" // MethodMCPServersRefreshBinding — admin verb: initiates an OAuth // (re)connect flow for a binding. Requires the `auth.ScopeAdmin` // claim. MethodMCPServersRefreshBinding Method = "mcp.servers.refresh_binding" // MethodMCPServersRevokeBinding — admin verb: revokes an OAuth // binding. Requires the `auth.ScopeAdmin` claim. MethodMCPServersRevokeBinding Method = "mcp.servers.revoke_binding" // MethodMCPServersSetRawHTMLTrust — admin verb: sets the per-server // raw-HTML opt-in flag and emits the `mcp.raw_html_trust_toggled` // audit event. Requires the `auth.ScopeAdmin` claim. MethodMCPServersSetRawHTMLTrust Method = "mcp.servers.set_raw_html_trust" // MethodMCPReadResource — the MCP Apps host's resource read: fetches // a `ui://` resource's HTML (an MCP App's UI document) scoped to the // request identity triple, heavy-content aware (content at or above // the heavy threshold rides by reference with a loud bypass event, // never inline). NOT a control method; routed through the MCP Apps // dispatcher (`IsMCPAppsMethod`). Identity-mandatory. MethodMCPReadResource Method = "mcp.servers.read_resource" // MethodMCPAppsCallTool — the MCP Apps host's app-tool-call proxy: // an in-iframe MCP App asks the host to invoke an MCP tool, and the // request re-enters the EXISTING identity + approval-gate + tool-side // -OAuth invocation path (no new bypass). An app call to a gated // tool parks on the unified pause primitive exactly as a planner call // does. NOT a control method; routed through the MCP Apps // dispatcher. Identity-mandatory. MethodMCPAppsCallTool Method = "mcp.apps.call_tool" // MethodMCPAppsToolContext — the MCP Apps host's tool-context read: a // rendered MCP App fetches the tool context (the input arguments + the // lowered result) that produced it, keyed by the server source id + the // stable tool-call id carried on the `mcp.app_available` discovery // event. The runtime captures the context at the tool-invocation site // (heavy-aware — a large result rides by reference); the read projects // it inline OR as an artifact reference. An unknown or cross-identity // id fails with CodeNotFound (existence is never revealed across // identities). NOT a control method; routed through the MCP Apps // dispatcher. Identity-mandatory. MethodMCPAppsToolContext Method = "mcp.apps.tool_context" // MethodToolsList — Returns the // catalog of registered tools visible to the caller's identity // scope, with optional facet filters (scope / transport / OAuth // status / approval policy / reliability tier) plus aggregate // counters (Total / Active / Pending approval / Awaiting OAuth) for // the filtered view. Powers the Console Tools page catalog table. // Identity-mandatory; a cross-tenant fan-in requires the // `auth.ScopeAdmin` claim. NOT a control / search / // posture / topology method — `IsToolsMethod` returns true. The // wire-transport route is `POST /v1/tools/list`. See MethodToolsList Method = "tools.list" // MethodToolsGet — Returns a single tool's catalog row // projection by ID. The lighter sibling of `tools.describe` — the // row shape the Console renders in the detail-panel header. MethodToolsGet Method = "tools.get" // MethodToolsDescribe — Returns the full manifest of a // registered tool descriptor: transport, version, scopes, the // argument / output JSON Schemas, examples, OAuth binding scope, // approval policy, and the reliability shell. // Powers the Tools-page Manifest / Inputs / Outputs tabs. MethodToolsDescribe Method = "tools.describe" // MethodToolsMetrics — Returns per-tool error-rate // gauges over a selectable window (1h / 24h / 7d) plus a status // pill (`Healthy` / `Degraded` / `Offline`). Powers the Tools-page // Status + Error-rate right-rail card. MethodToolsMetrics Method = "tools.metrics" // MethodToolsContentStats — Returns the per-tool // distribution of recent result sizes vs the heavy-content // threshold (RFC §6.5) plus the negotiated `DisplayMode` // snapshot. Powers the Tools-page Content-size card. MethodToolsContentStats Method = "tools.content_stats" // MethodToolsSetApprovalPolicy — ADMIN method: updates a // tool's approval policy. Requires the verified `auth.ScopeAdmin` // claim (there is NO `tools.admin` scope — the closed // two-scope set is the only admit surface). Emits an // `audit.admin_scope_used` event through the shipped audit.Redactor. MethodToolsSetApprovalPolicy Method = "tools.set_approval_policy" // MethodToolsRevokeOAuth — ADMIN method: revokes all // OAuth bindings for a tool. Requires the verified `auth.ScopeAdmin` // claim. Emits an `audit.admin_scope_used` event through // the shipped audit.Redactor. MethodToolsRevokeOAuth Method = "tools.revoke_oauth" // MethodTasksList — Returns the // paginated list of tasks visible to the caller's identity scope, // with optional facet filters (status / kind / parent-task / // identity / time-window / error-class / latency-above / free-text) // plus per-status aggregate counters (Pending / Running / Paused / // Failed / Complete / Cancelled) for the filtered view. Powers the // Console Tasks-page kanban board + list-mode table. Identity- // mandatory; a cross-tenant fan-in requires the `auth.ScopeAdmin` // claim. NOT a control / search / posture method — // `IsTasksMethod` returns true. The wire-transport route is // `POST /v1/tasks/list`. See MethodTasksList Method = "tasks.list" // MethodTasksGet — Returns the enriched detail of a // single task: the full Task projection (heavy values via // ArtifactRef), parent-session reference, parent-task // reference (when child), per-step cost rollup aggregated from // `llm.cost.recorded` events, and the planner-checkpoint reference // at spawn time. A cross-tenant TaskID lookup returns CodeNotFound // (existence is never revealed across tenants). The wire-transport // route is `POST /v1/tasks/get`. MethodTasksGet Method = "tasks.get" // MethodAgentsList — Returns the // catalog of agents registered under the caller's identity scope, // with optional facet filters (status / planner type / free-text // search) plus aggregate counters. Powers the Console Agents page // cards grid. Identity-mandatory; a cross-tenant fan-in requires the // `auth.ScopeAdmin` claim. `IsAgentsMethod` returns true. // The wire-transport route is `POST /v1/agents/list`. MethodAgentsList Method = "agents.list" // MethodAgentsGet — Returns one agent's full // registration-identity projection: agent_id / incarnation / // version_hash, hosting, status, health, and the // AgentConfig projection. Powers the Agents detail header + the // Identity / Autonomy tabs. MethodAgentsGet Method = "agents.get" // MethodAgentsTools — Returns the agent's tool bindings // joined to per-binding OAuth status. Powers the Tools tab. MethodAgentsTools Method = "agents.tools" // MethodAgentsMemory — Returns the agent's configured // memory strategy, TTL, and scope. Powers the Memory tab. MethodAgentsMemory Method = "agents.memory" // MethodAgentsGovernance — Returns the agent's // per-identity-tier cost ceilings + spend and rate-limit // posture. Powers the Cost tab. MethodAgentsGovernance Method = "agents.governance" // MethodAgentsSkills — Returns the agent's attached // skills (imported + generated skills). Powers the Skills // tab. MethodAgentsSkills Method = "agents.skills" // MethodAgentsPermissions — Returns the agent's // permission model — V1 default is implicit ("every authenticated // user in the tenant"); an explicit ACL surface is post-V1. MethodAgentsPermissions Method = "agents.permissions" // MethodAgentsMetrics — Returns the registry-wide rollup // (Active Agents / Running Tasks / Total Cost / Total Tokens) for // the caller's identity scope. Powers the Agents page hero numbers. MethodAgentsMetrics Method = "agents.metrics" // MethodAgentsPause — The fleet-control verb that // pauses an agent (stop accepting new tasks until Resume). Wraps the // shipped `registry.Pause` in-process control verb behind a Protocol // method so the Console can drive it. MUTATES registry state and // therefore requires the elevated `auth.ScopeAdmin` control claim; // emits `agent.paused`. `IsAgentsControlMethod` returns true. // Supersedes the earlier deferral. MethodAgentsPause Method = "agents.pause" // MethodAgentsDrain — Gracefully drains an agent (accept // no new tasks, finish existing). Wraps `registry.Drain`; emits // `agent.drained`. Control-scope gated. MethodAgentsDrain Method = "agents.drain" // MethodAgentsRestart — Restarts an agent (bump // incarnation; rehydrate from StateStore). Wraps `registry.Restart`; // emits `agent.restart_requested`. Control-scope gated. MethodAgentsRestart Method = "agents.restart" // MethodAgentsForceStop — Hard-stops an agent. Wraps // `registry.ForceStop`; emits `agent.force_stopped`. Control-scope // gated. MethodAgentsForceStop Method = "agents.force_stop" // MethodAgentsDeregister — Removes an agent from the // registry (irreversible). Wraps `registry.Deregister`; emits // `agent.deregistered`. Control-scope gated. MethodAgentsDeregister Method = "agents.deregister" // MethodAuthRotateToken — Rotates the // operator's current Protocol-auth token: the Runtime re-mints a // JWT for the caller's already-verified `(tenant, user, session)` // identity and returns it once (one-time-reveal). The ONLY net-new // Protocol method Harbor ships — the Console Settings page is // otherwise a pure consumer of the posture methods. ADMIN // method: requires the verified `auth.ScopeAdmin` claim (the // closed two-scope set — there is NO `auth.admin` scope). A request // without the claim is rejected 403 with CodeIdentityScopeRequired. // Every successful rotation emits a redacted `audit.admin_scope_used` // event. NOT a control / search / posture / pause / topology // method — `IsAuthMethod` is its own O(1) predicate. The // wire-transport route is `POST /v1/auth/rotate_token`. See MethodAuthRotateToken Method = "auth.rotate_token" //nolint:gosec // G101 false positive — this is a Protocol method name, not a credential. // MethodSessionsList — Returns the // paginated, identity-scope-filtered projection of the // SessionRegistry the Console Sessions page renders — the // past-and-active durable record of every Harbor execution the // operator has access to. Carries the full filter set (status / // agent / user / tenant / started-window / has-intervention / // has-failed-task / cost-above) plus cursor pagination. Read-only; // identity-mandatory. A cross-tenant filter (a `tenant_ids` entry // outside the caller's verified tenant) requires the verified // `auth.ScopeAdmin` claim (closed two-scope set — NO new // scope is minted). NOT a control / streaming-events / search / // posture / pause / topology / artifacts / memory / mcp / tools / // flows method — `IsSessionsMethod` is its own O(1) predicate. The // wire-transport route is `POST /v1/sessions/list`. See MethodSessionsList Method = "sessions.list" // MethodSessionsInspect — Returns the full per-session // snapshot the Console Sessions detail view renders — the // right-rail Session Summary projection (id / status / started / // duration / events / tasks / agent / user / tenant / cost / last // activity) plus the capped `recent_interventions` / // `recent_artifacts` slices. Read-only; identity-mandatory; same // cross-tenant scope contract as MethodSessionsList. The // wire-transport route is `POST /v1/sessions/inspect`. MethodSessionsInspect Method = "sessions.inspect" // MethodSessionsDelete — the identity-scoped data-lifecycle erasure // method: deletes a whole session and CASCADES deletion of its // scoped State, Memory, and Artifacts. Own-session-only — a caller // erases solely their own verified `(tenant, user, session)`; a body // identity mismatching the verified identity is rejected // `identity_required` before any further logic, and there is NO // admin / cross-tenant erasure path. A session with a RUNNING task is // refused fail-loud with the distinct `session_running` (409) code, // mirroring the GC never-reap-running invariant — no store is touched // on refusal. A successful erasure emits a redacted, content-free // `session.erased` audit event under the actor's observability scope // (never re-persisted under the erased triple). The mutating sibling // of `sessions.list` / `sessions.inspect`; it routes through the same // Sessions handler. Identity-mandatory. The wire-transport route is // `POST /v1/sessions/delete`. MethodSessionsDelete Method = "sessions.delete" // MethodSessionsSetTitle — sets or clears a session's human-readable // title. The write scope is the owning `(tenant, user)` — // the same scope `sessions.list` reads at — NOT own-session-only: // the body `Identity`'s tenant/user MUST equal the verified identity, // but the target `session_id` (a dedicated request field) MAY name a // sibling session of the same owner. The wire verb ALWAYS writes // `manual` provenance (empty title clears both fields to unset); // `auto` provenance is not expressible over the wire. An over-bound // or malformed title fails loud with `CodeInvalidRequest` (400) — // never a silent clamp. Publishes the content-free // `session.title_changed` event on success (identity scope + session // id + source only — never the title string). The mutating sibling // of `sessions.list` / `sessions.inspect` / `sessions.delete`; it // routes through the same Sessions handler. Identity-mandatory. The // wire-transport route is `POST /v1/sessions/set_title`. MethodSessionsSetTitle Method = "sessions.set_title" // MethodRunsSetOverrides — Records the // reasoning-effort / temperature / max-tokens / system-prompt // override the Console Playground page applies to the NEXT message // in a session. The override is session-scoped (keyed by the // identity triple) and one-shot: it applies to the next // `user_message` / `start` and is consumed at that point — it does // NOT apply retroactively to past messages, and a session that sets // an override then never sends drops it. Identity-mandatory // (`session_id` required; tenant / user inferred from the verified // JWT); a cross-session override is rejected with CodeScopeMismatch. // NOT a control / streaming-events / search / posture / pause / // topology / artifacts / memory / mcp / tools / flows / agents / // sessions / tasks method — `IsRunsMethod` is its own O(1) // predicate. The wire-transport route is `POST /v1/runs/set_overrides`. MethodRunsSetOverrides Method = "runs.set_overrides" // MethodStateHistory — the State-snapshots surface's by-id, // identity-scoped, read-only TAIL-FIRST windowed read of a session's // durable event stream. Returns a bounded backward page of flat // `StateEvent` (events with `Sequence < before`, the most-recent K, // oldest-first within the window) plus the discovered head/tail // sequence and a scroll-up cursor; heavy content rides by a routable // `StateArtifactRef`, never inline. Reduction to chat messages stays // client-side. Identity-mandatory: an incomplete triple is rejected // with CodeIdentityRequired; an unknown or cross-identity session is // CodeNotFound (existence is never revealed across identities, // mirroring `tasks.get`); a cross-tenant read requires the verified // `auth.ScopeAdmin` claim on the ctx (the request body carries no // elevation knob). NOT a control / streaming-events / search / // posture / pause / topology / artifacts / memory / mcp / tools / // flows / agents / sessions / tasks / runs method — `IsStateMethod` // is its own O(1) predicate. The wire-transport route is // `POST /v1/state/history`. MethodStateHistory Method = "state.history" // MethodEventsList — the durable, time-ranged, cross-session raw-event // read. It completes the events surface beside `events.subscribe` (the // forward-only live tail) and `events.aggregate` (bucketed counts with // no payloads): `events.list` returns a bounded, tail-first page of the // flat `StateEvent` rows the SSE and `state.history` already project — // the existing `EventFilter` (identity axes + `since`/`until` time // bounds + event-type selector) plus a sequence-based scroll-up cursor // mirroring `state.history`'s paging grammar. Non-widened callers read // only their own identity tuple's rows; a cross-tenant (fleet) read // requires the verified `admin` OR `console:fleet` claim (the closed // two-scope set, matching `events.aggregate`), derived server-side from // the verified session — never the request body — and emits one // `audit.admin_scope_used` per widened request. Heavy payloads ride by // a routable `StateArtifactRef`, never inline (RFC §6.5). NOT a control // / streaming-events / search / posture / pause / topology / artifacts // / memory / mcp / tools / flows / agents / sessions / tasks / runs / // state method — `IsEventsListMethod` is its own O(1) predicate. The // wire-transport route is `POST /v1/events/list`. MethodEventsList Method = "events.list" )
The ten canonical task-control method names (RFC §5.2 "Task control" row + RFC §6.3 control taxonomy) PLUS the two streaming-events method names landed in — `events.subscribe` and `events.aggregate` — the first non-task-control Protocol surface, PLUS the five `search.*` methods landed earlier.