// loomcycle's gRPC service surface (v0.5.5).
//
// Mirrors the existing HTTP+SSE wire shape exactly — every RPC has a
// 1:1 mapping to an HTTP route under /v1/. Both wire surfaces coexist
// on the same loomcycle process; operators pick one (or both) via
// LOOMCYCLE_GRPC_ADDR / LOOMCYCLE_LISTEN_ADDR.
//
// Compatibility:
//   - The HTTP+SSE surface is the canonical contract for now.
//     Anything that ships there must be expressible here without
//     loss; proto changes follow HTTP+SSE, not the other way.
//   - Field numbers are stable across v0.5.x. Adding a new field is
//     non-breaking; removing or renumbering one is. v0 caveats apply
//     until v1.0 is tagged.
//   - The `status` strings use the same enum the HTTP API uses
//     (running / completed / failed / cancelled) — represented as
//     proto strings, not a typed enum, so adding a new state on the
//     HTTP side doesn't require regenerating gRPC stubs everywhere.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.36.11
// 	protoc        v7.35.1
// source: loomcycle.proto

package loomcyclepb

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type RunRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Agent name from the operator yaml's agents block.
	Agent string `protobuf:"bytes,1,opt,name=agent,proto3" json:"agent,omitempty"`
	// Session ID. Empty → start a fresh session; non-empty → continue
	// the named session (transcript replayed before the new turn).
	// The HTTP equivalent is "set the session_id field on POST /v1/runs".
	SessionId string `protobuf:"bytes,2,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
	// Prompt content blocks (system + user mix). Empty → use the
	// operator-configured agent system_prompt only.
	Segments []*PromptSegment `protobuf:"bytes,3,rep,name=segments,proto3" json:"segments,omitempty"`
	// Per-call tool allowlist, intersected with the agent's tools.
	// Empty → no narrowing (agent's full tool surface).
	Tools []string `protobuf:"bytes,4,rep,name=tools,proto3" json:"tools,omitempty"`
	// Per-call host allowlist for HTTP / WebFetch / WebSearch.
	// Three states (proto3 doesn't support nullable repeated, so we use
	// a wrapper):
	//   - allowed_hosts unset (oneof not selected) — no narrowing
	//   - allowed_hosts.list = [] — deny all (no host reachable)
	//   - allowed_hosts.list = [...] — intersection with operator's list
	AllowedHosts *HostAllowlist `protobuf:"bytes,5,opt,name=allowed_hosts,json=allowedHosts,proto3" json:"allowed_hosts,omitempty"`
	// WebSearch result-narrowing mode. Ignored when allowed_hosts is
	// unset. "drop" (default) filters out non-allowed results;
	// "keep" returns the full set.
	WebSearchFilter string `protobuf:"bytes,6,opt,name=web_search_filter,json=webSearchFilter,proto3" json:"web_search_filter,omitempty"`
	// v0.4+ tracking fields. agent_id is the caller-supplied tracking
	// handle (for cross-process status polls). user_id binds the run
	// to a user for ListUserAgents + cancel-cascade.
	AgentId string `protobuf:"bytes,7,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
	UserId  string `protobuf:"bytes,8,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	// v0.8.x per-run policy fields. Mirror the HTTP wire on
	// POST /v1/runs (handleRuns runRequest in internal/api/http/server.go).
	//
	// tenant_id is recorded on a fresh session; ignored for continuations
	// (server inherits the seed run's tenant). Empty = no tenant tag.
	TenantId string `protobuf:"bytes,9,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"`
	// user_tier (v0.8.2+) is the user-facing tier policy name; maps to
	// cfg.UserTiers[<name>] for provider_priority + per-agent overlay.
	// Server returns InvalidArgument on unknown tier. Empty falls
	// through to cfg.UserTiers["default"] when configured.
	UserTier string `protobuf:"bytes,10,opt,name=user_tier,json=userTier,proto3" json:"user_tier,omitempty"`
	// user_bearer (v0.8.x+) is the per-run MCP bearer token. Substituted
	// into outbound MCP HTTP header values containing `${run.user_bearer}`
	// at request-build time. Charset [A-Za-z0-9._\-+/=]{16,512}. Never
	// persisted, never logged in full. Sub-agents inherit identically.
	UserBearer string `protobuf:"bytes,11,opt,name=user_bearer,json=userBearer,proto3" json:"user_bearer,omitempty"`
	// user_credentials (v1.x RFC F) is the named-credentials map —
	// per-tool/per-MCP-server bearers keyed by operator-chosen name
	// (convention: the `mcp_servers.<name>` yaml key). Substituted into
	// outbound MCP HTTP header values containing
	// `${run.credentials.<name>}` at request-build time. Sub-agents
	// inherit the whole map. Keys match [a-zA-Z0-9_-]{1,64}; values
	// arbitrary strings; empty map valid. Never persisted, never logged.
	// See `docs/PLAN.md` → RFC F and `Context.help per-run-credentials`.
	UserCredentials map[string]string `protobuf:"bytes,12,rep,name=user_credentials,json=userCredentials,proto3" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	// sampling (v0.28.0) is the per-run LLM sampling override, merged
	// per-field over the agent's own sampling (unset fields inherit).
	// Absent = inherit entirely. Mirrors the HTTP /v1/runs `sampling` field.
	Sampling *Sampling `protobuf:"bytes,13,opt,name=sampling,proto3" json:"sampling,omitempty"`
	// compaction (v0.32.0) is the per-run context-compaction override,
	// merged per-field over the agent's own block (unset fields inherit).
	// Absent = inherit entirely. Mirrors the HTTP /v1/runs `compaction` field.
	Compaction *Compaction `protobuf:"bytes,14,opt,name=compaction,proto3" json:"compaction,omitempty"`
	// interactive (RFC AI) starts a PERSISTENT run that parks at end_turn
	// awaiting operator steering instead of terminating. Drive it with the
	// RunInput RPC; re-attach with StreamRun; cancel to end it. Mirrors
	// POST /v1/runs `interactive`.
	Interactive   bool `protobuf:"varint,15,opt,name=interactive,proto3" json:"interactive,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *RunRequest) Reset() {
	*x = RunRequest{}
	mi := &file_loomcycle_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RunRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RunRequest) ProtoMessage() {}

func (x *RunRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RunRequest.ProtoReflect.Descriptor instead.
func (*RunRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{0}
}

func (x *RunRequest) GetAgent() string {
	if x != nil {
		return x.Agent
	}
	return ""
}

func (x *RunRequest) GetSessionId() string {
	if x != nil {
		return x.SessionId
	}
	return ""
}

func (x *RunRequest) GetSegments() []*PromptSegment {
	if x != nil {
		return x.Segments
	}
	return nil
}

func (x *RunRequest) GetTools() []string {
	if x != nil {
		return x.Tools
	}
	return nil
}

func (x *RunRequest) GetAllowedHosts() *HostAllowlist {
	if x != nil {
		return x.AllowedHosts
	}
	return nil
}

func (x *RunRequest) GetWebSearchFilter() string {
	if x != nil {
		return x.WebSearchFilter
	}
	return ""
}

func (x *RunRequest) GetAgentId() string {
	if x != nil {
		return x.AgentId
	}
	return ""
}

func (x *RunRequest) GetUserId() string {
	if x != nil {
		return x.UserId
	}
	return ""
}

func (x *RunRequest) GetTenantId() string {
	if x != nil {
		return x.TenantId
	}
	return ""
}

func (x *RunRequest) GetUserTier() string {
	if x != nil {
		return x.UserTier
	}
	return ""
}

func (x *RunRequest) GetUserBearer() string {
	if x != nil {
		return x.UserBearer
	}
	return ""
}

func (x *RunRequest) GetUserCredentials() map[string]string {
	if x != nil {
		return x.UserCredentials
	}
	return nil
}

func (x *RunRequest) GetSampling() *Sampling {
	if x != nil {
		return x.Sampling
	}
	return nil
}

func (x *RunRequest) GetCompaction() *Compaction {
	if x != nil {
		return x.Compaction
	}
	return nil
}

func (x *RunRequest) GetInteractive() bool {
	if x != nil {
		return x.Interactive
	}
	return false
}

type ContinueRequest struct {
	state           protoimpl.MessageState `protogen:"open.v1"`
	SessionId       string                 `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
	Segments        []*PromptSegment       `protobuf:"bytes,2,rep,name=segments,proto3" json:"segments,omitempty"`
	Tools           []string               `protobuf:"bytes,3,rep,name=tools,proto3" json:"tools,omitempty"`
	AllowedHosts    *HostAllowlist         `protobuf:"bytes,4,opt,name=allowed_hosts,json=allowedHosts,proto3" json:"allowed_hosts,omitempty"`
	WebSearchFilter string                 `protobuf:"bytes,5,opt,name=web_search_filter,json=webSearchFilter,proto3" json:"web_search_filter,omitempty"`
	AgentId         string                 `protobuf:"bytes,6,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"` // fresh tracking handle for this continuation
	// v0.8.x per-call policy fields. Continuations re-supply these each
	// turn (rather than inheriting from the seed run) so a user upgrading
	// mid-session sees the new tier on the next turn. tenant_id is NOT
	// accepted on Continue — the server inherits it from the session.
	UserTier   string `protobuf:"bytes,7,opt,name=user_tier,json=userTier,proto3" json:"user_tier,omitempty"`
	UserBearer string `protobuf:"bytes,8,opt,name=user_bearer,json=userBearer,proto3" json:"user_bearer,omitempty"`
	// v1.x RFC F per-tool credentials map. Same shape + semantics as
	// RunRequest.user_credentials; supplied per-continuation.
	UserCredentials map[string]string `protobuf:"bytes,9,rep,name=user_credentials,json=userCredentials,proto3" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	// v0.28.0 / v0.32.0 per-continuation overrides (mirror RunRequest).
	Sampling   *Sampling   `protobuf:"bytes,10,opt,name=sampling,proto3" json:"sampling,omitempty"`
	Compaction *Compaction `protobuf:"bytes,11,opt,name=compaction,proto3" json:"compaction,omitempty"`
	// interactive (RFC AI) — a continuation can also park at end_turn for
	// operator steering. Mirrors the HTTP continuation `interactive` field.
	Interactive   bool `protobuf:"varint,12,opt,name=interactive,proto3" json:"interactive,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ContinueRequest) Reset() {
	*x = ContinueRequest{}
	mi := &file_loomcycle_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ContinueRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ContinueRequest) ProtoMessage() {}

func (x *ContinueRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[1]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ContinueRequest.ProtoReflect.Descriptor instead.
func (*ContinueRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{1}
}

func (x *ContinueRequest) GetSessionId() string {
	if x != nil {
		return x.SessionId
	}
	return ""
}

func (x *ContinueRequest) GetSegments() []*PromptSegment {
	if x != nil {
		return x.Segments
	}
	return nil
}

func (x *ContinueRequest) GetTools() []string {
	if x != nil {
		return x.Tools
	}
	return nil
}

func (x *ContinueRequest) GetAllowedHosts() *HostAllowlist {
	if x != nil {
		return x.AllowedHosts
	}
	return nil
}

func (x *ContinueRequest) GetWebSearchFilter() string {
	if x != nil {
		return x.WebSearchFilter
	}
	return ""
}

func (x *ContinueRequest) GetAgentId() string {
	if x != nil {
		return x.AgentId
	}
	return ""
}

func (x *ContinueRequest) GetUserTier() string {
	if x != nil {
		return x.UserTier
	}
	return ""
}

func (x *ContinueRequest) GetUserBearer() string {
	if x != nil {
		return x.UserBearer
	}
	return ""
}

func (x *ContinueRequest) GetUserCredentials() map[string]string {
	if x != nil {
		return x.UserCredentials
	}
	return nil
}

func (x *ContinueRequest) GetSampling() *Sampling {
	if x != nil {
		return x.Sampling
	}
	return nil
}

func (x *ContinueRequest) GetCompaction() *Compaction {
	if x != nil {
		return x.Compaction
	}
	return nil
}

func (x *ContinueRequest) GetInteractive() bool {
	if x != nil {
		return x.Interactive
	}
	return false
}

// Sampling mirrors config.Sampling — the per-run LLM sampling override.
// Every field is proto3 `optional` so "unset" (inherit the agent's value)
// is distinguishable from an explicit zero (temperature 0.0 is
// deterministic, NOT "unspecified").
type Sampling struct {
	state            protoimpl.MessageState `protogen:"open.v1"`
	Temperature      *float64               `protobuf:"fixed64,1,opt,name=temperature,proto3,oneof" json:"temperature,omitempty"`
	TopP             *float64               `protobuf:"fixed64,2,opt,name=top_p,json=topP,proto3,oneof" json:"top_p,omitempty"`
	TopK             *int32                 `protobuf:"varint,3,opt,name=top_k,json=topK,proto3,oneof" json:"top_k,omitempty"`
	FrequencyPenalty *float64               `protobuf:"fixed64,4,opt,name=frequency_penalty,json=frequencyPenalty,proto3,oneof" json:"frequency_penalty,omitempty"`
	PresencePenalty  *float64               `protobuf:"fixed64,5,opt,name=presence_penalty,json=presencePenalty,proto3,oneof" json:"presence_penalty,omitempty"`
	Seed             *int32                 `protobuf:"varint,6,opt,name=seed,proto3,oneof" json:"seed,omitempty"`
	Stop             []string               `protobuf:"bytes,7,rep,name=stop,proto3" json:"stop,omitempty"`
	unknownFields    protoimpl.UnknownFields
	sizeCache        protoimpl.SizeCache
}

func (x *Sampling) Reset() {
	*x = Sampling{}
	mi := &file_loomcycle_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Sampling) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Sampling) ProtoMessage() {}

func (x *Sampling) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[2]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Sampling.ProtoReflect.Descriptor instead.
func (*Sampling) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{2}
}

func (x *Sampling) GetTemperature() float64 {
	if x != nil && x.Temperature != nil {
		return *x.Temperature
	}
	return 0
}

func (x *Sampling) GetTopP() float64 {
	if x != nil && x.TopP != nil {
		return *x.TopP
	}
	return 0
}

func (x *Sampling) GetTopK() int32 {
	if x != nil && x.TopK != nil {
		return *x.TopK
	}
	return 0
}

func (x *Sampling) GetFrequencyPenalty() float64 {
	if x != nil && x.FrequencyPenalty != nil {
		return *x.FrequencyPenalty
	}
	return 0
}

func (x *Sampling) GetPresencePenalty() float64 {
	if x != nil && x.PresencePenalty != nil {
		return *x.PresencePenalty
	}
	return 0
}

func (x *Sampling) GetSeed() int32 {
	if x != nil && x.Seed != nil {
		return *x.Seed
	}
	return 0
}

func (x *Sampling) GetStop() []string {
	if x != nil {
		return x.Stop
	}
	return nil
}

// Compaction mirrors config.Compaction — the per-run context-compaction
// override. `optional` preserves unset-vs-explicit (enabled=false is "off",
// absent is "inherit").
type Compaction struct {
	state            protoimpl.MessageState `protogen:"open.v1"`
	Enabled          *bool                  `protobuf:"varint,1,opt,name=enabled,proto3,oneof" json:"enabled,omitempty"`
	TargetPercentage *int32                 `protobuf:"varint,2,opt,name=target_percentage,json=targetPercentage,proto3,oneof" json:"target_percentage,omitempty"`
	KeepLastN        *int32                 `protobuf:"varint,3,opt,name=keep_last_n,json=keepLastN,proto3,oneof" json:"keep_last_n,omitempty"`
	KeepFirst        *bool                  `protobuf:"varint,4,opt,name=keep_first,json=keepFirst,proto3,oneof" json:"keep_first,omitempty"`
	AutocompactAtPct *int32                 `protobuf:"varint,5,opt,name=autocompact_at_pct,json=autocompactAtPct,proto3,oneof" json:"autocompact_at_pct,omitempty"`
	Model            *string                `protobuf:"bytes,6,opt,name=model,proto3,oneof" json:"model,omitempty"`
	unknownFields    protoimpl.UnknownFields
	sizeCache        protoimpl.SizeCache
}

func (x *Compaction) Reset() {
	*x = Compaction{}
	mi := &file_loomcycle_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Compaction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Compaction) ProtoMessage() {}

func (x *Compaction) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[3]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Compaction.ProtoReflect.Descriptor instead.
func (*Compaction) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{3}
}

func (x *Compaction) GetEnabled() bool {
	if x != nil && x.Enabled != nil {
		return *x.Enabled
	}
	return false
}

func (x *Compaction) GetTargetPercentage() int32 {
	if x != nil && x.TargetPercentage != nil {
		return *x.TargetPercentage
	}
	return 0
}

func (x *Compaction) GetKeepLastN() int32 {
	if x != nil && x.KeepLastN != nil {
		return *x.KeepLastN
	}
	return 0
}

func (x *Compaction) GetKeepFirst() bool {
	if x != nil && x.KeepFirst != nil {
		return *x.KeepFirst
	}
	return false
}

func (x *Compaction) GetAutocompactAtPct() int32 {
	if x != nil && x.AutocompactAtPct != nil {
		return *x.AutocompactAtPct
	}
	return 0
}

func (x *Compaction) GetModel() string {
	if x != nil && x.Model != nil {
		return *x.Model
	}
	return ""
}

// BatchSpawnRequest is the input to SpawnRunBatch. Each spawn reuses the
// RunRequest shape (its session_id is ignored — batch children are always
// fresh runs). Capped at 32; the server rejects an over-cap batch.
type BatchSpawnRequest struct {
	state  protoimpl.MessageState `protogen:"open.v1"`
	Spawns []*RunRequest          `protobuf:"bytes,1,rep,name=spawns,proto3" json:"spawns,omitempty"`
	// mode is "join" (default): block until all children settle. "detach"
	// (async run handles) is reserved for a future release and rejected.
	Mode string `protobuf:"bytes,2,opt,name=mode,proto3" json:"mode,omitempty"`
	// timeout_ms optionally caps the join; a child still running when it
	// elapses is cancelled and reported with a cancelled status in-envelope.
	TimeoutMs     int64 `protobuf:"varint,3,opt,name=timeout_ms,json=timeoutMs,proto3" json:"timeout_ms,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *BatchSpawnRequest) Reset() {
	*x = BatchSpawnRequest{}
	mi := &file_loomcycle_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *BatchSpawnRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BatchSpawnRequest) ProtoMessage() {}

func (x *BatchSpawnRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[4]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BatchSpawnRequest.ProtoReflect.Descriptor instead.
func (*BatchSpawnRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{4}
}

func (x *BatchSpawnRequest) GetSpawns() []*RunRequest {
	if x != nil {
		return x.Spawns
	}
	return nil
}

func (x *BatchSpawnRequest) GetMode() string {
	if x != nil {
		return x.Mode
	}
	return ""
}

func (x *BatchSpawnRequest) GetTimeoutMs() int64 {
	if x != nil {
		return x.TimeoutMs
	}
	return 0
}

// SpawnResult mirrors connector.SpawnRunResult — one child's outcome. A
// per-child failure is reported here (status + error), never as an RPC error.
type SpawnResult struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	AgentId       string                 `protobuf:"bytes,1,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
	RunId         string                 `protobuf:"bytes,2,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	SessionId     string                 `protobuf:"bytes,3,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
	Status        string                 `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` // completed | failed | cancelled
	StopReason    string                 `protobuf:"bytes,5,opt,name=stop_reason,json=stopReason,proto3" json:"stop_reason,omitempty"`
	FinalText     string                 `protobuf:"bytes,6,opt,name=final_text,json=finalText,proto3" json:"final_text,omitempty"`
	Usage         *Usage                 `protobuf:"bytes,7,opt,name=usage,proto3" json:"usage,omitempty"`
	Error         string                 `protobuf:"bytes,8,opt,name=error,proto3" json:"error,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *SpawnResult) Reset() {
	*x = SpawnResult{}
	mi := &file_loomcycle_proto_msgTypes[5]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *SpawnResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SpawnResult) ProtoMessage() {}

func (x *SpawnResult) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[5]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SpawnResult.ProtoReflect.Descriptor instead.
func (*SpawnResult) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{5}
}

func (x *SpawnResult) GetAgentId() string {
	if x != nil {
		return x.AgentId
	}
	return ""
}

func (x *SpawnResult) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *SpawnResult) GetSessionId() string {
	if x != nil {
		return x.SessionId
	}
	return ""
}

func (x *SpawnResult) GetStatus() string {
	if x != nil {
		return x.Status
	}
	return ""
}

func (x *SpawnResult) GetStopReason() string {
	if x != nil {
		return x.StopReason
	}
	return ""
}

func (x *SpawnResult) GetFinalText() string {
	if x != nil {
		return x.FinalText
	}
	return ""
}

func (x *SpawnResult) GetUsage() *Usage {
	if x != nil {
		return x.Usage
	}
	return nil
}

func (x *SpawnResult) GetError() string {
	if x != nil {
		return x.Error
	}
	return ""
}

// BatchSpawnResult is the combined "join"-mode outcome; results is
// index-aligned with the request's spawns.
type BatchSpawnResult struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Results       []*SpawnResult         `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
	Spawned       int32                  `protobuf:"varint,2,opt,name=spawned,proto3" json:"spawned,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *BatchSpawnResult) Reset() {
	*x = BatchSpawnResult{}
	mi := &file_loomcycle_proto_msgTypes[6]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *BatchSpawnResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BatchSpawnResult) ProtoMessage() {}

func (x *BatchSpawnResult) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[6]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BatchSpawnResult.ProtoReflect.Descriptor instead.
func (*BatchSpawnResult) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{6}
}

func (x *BatchSpawnResult) GetResults() []*SpawnResult {
	if x != nil {
		return x.Results
	}
	return nil
}

func (x *BatchSpawnResult) GetSpawned() int32 {
	if x != nil {
		return x.Spawned
	}
	return 0
}

type DirectoryUsersRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryUsersRequest) Reset() {
	*x = DirectoryUsersRequest{}
	mi := &file_loomcycle_proto_msgTypes[7]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryUsersRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryUsersRequest) ProtoMessage() {}

func (x *DirectoryUsersRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[7]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryUsersRequest.ProtoReflect.Descriptor instead.
func (*DirectoryUsersRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{7}
}

// DirectoryUser is one DERIVED user: activity only, which is all runs.user_id
// supports. There is no profile because there is no user record.
type DirectoryUser struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Subject       string                 `protobuf:"bytes,1,opt,name=subject,proto3" json:"subject,omitempty"`
	RunningCount  int32                  `protobuf:"varint,2,opt,name=running_count,json=runningCount,proto3" json:"running_count,omitempty"`
	TotalCount    int32                  `protobuf:"varint,3,opt,name=total_count,json=totalCount,proto3" json:"total_count,omitempty"`
	LastStartedAt string                 `protobuf:"bytes,4,opt,name=last_started_at,json=lastStartedAt,proto3" json:"last_started_at,omitempty"` // RFC3339 UTC; empty when never started
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryUser) Reset() {
	*x = DirectoryUser{}
	mi := &file_loomcycle_proto_msgTypes[8]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryUser) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryUser) ProtoMessage() {}

func (x *DirectoryUser) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[8]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryUser.ProtoReflect.Descriptor instead.
func (*DirectoryUser) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{8}
}

func (x *DirectoryUser) GetSubject() string {
	if x != nil {
		return x.Subject
	}
	return ""
}

func (x *DirectoryUser) GetRunningCount() int32 {
	if x != nil {
		return x.RunningCount
	}
	return 0
}

func (x *DirectoryUser) GetTotalCount() int32 {
	if x != nil {
		return x.TotalCount
	}
	return 0
}

func (x *DirectoryUser) GetLastStartedAt() string {
	if x != nil {
		return x.LastStartedAt
	}
	return ""
}

type DirectoryUsersResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Tenant        string                 `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"`
	Users         []*DirectoryUser       `protobuf:"bytes,2,rep,name=users,proto3" json:"users,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryUsersResponse) Reset() {
	*x = DirectoryUsersResponse{}
	mi := &file_loomcycle_proto_msgTypes[9]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryUsersResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryUsersResponse) ProtoMessage() {}

func (x *DirectoryUsersResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[9]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryUsersResponse.ProtoReflect.Descriptor instead.
func (*DirectoryUsersResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{9}
}

func (x *DirectoryUsersResponse) GetTenant() string {
	if x != nil {
		return x.Tenant
	}
	return ""
}

func (x *DirectoryUsersResponse) GetUsers() []*DirectoryUser {
	if x != nil {
		return x.Users
	}
	return nil
}

type DirectoryInspectRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Subject       string                 `protobuf:"bytes,1,opt,name=subject,proto3" json:"subject,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryInspectRequest) Reset() {
	*x = DirectoryInspectRequest{}
	mi := &file_loomcycle_proto_msgTypes[10]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryInspectRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryInspectRequest) ProtoMessage() {}

func (x *DirectoryInspectRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[10]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryInspectRequest.ProtoReflect.Descriptor instead.
func (*DirectoryInspectRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{10}
}

func (x *DirectoryInspectRequest) GetSubject() string {
	if x != nil {
		return x.Subject
	}
	return ""
}

// DirectoryBudget uses `optional` on both fields because nil and zero differ:
// unset is "no ceiling at this tier", zero would be a ceiling refusing every run.
type DirectoryBudget struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	SoftLimit     *int64                 `protobuf:"varint,1,opt,name=soft_limit,json=softLimit,proto3,oneof" json:"soft_limit,omitempty"`
	HardLimit     *int64                 `protobuf:"varint,2,opt,name=hard_limit,json=hardLimit,proto3,oneof" json:"hard_limit,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryBudget) Reset() {
	*x = DirectoryBudget{}
	mi := &file_loomcycle_proto_msgTypes[11]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryBudget) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryBudget) ProtoMessage() {}

func (x *DirectoryBudget) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[11]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryBudget.ProtoReflect.Descriptor instead.
func (*DirectoryBudget) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{11}
}

func (x *DirectoryBudget) GetSoftLimit() int64 {
	if x != nil && x.SoftLimit != nil {
		return *x.SoftLimit
	}
	return 0
}

func (x *DirectoryBudget) GetHardLimit() int64 {
	if x != nil && x.HardLimit != nil {
		return *x.HardLimit
	}
	return 0
}

type DirectoryUsage struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Calls         int64                  `protobuf:"varint,1,opt,name=calls,proto3" json:"calls,omitempty"`
	Cost          float64                `protobuf:"fixed64,2,opt,name=cost,proto3" json:"cost,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryUsage) Reset() {
	*x = DirectoryUsage{}
	mi := &file_loomcycle_proto_msgTypes[12]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryUsage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryUsage) ProtoMessage() {}

func (x *DirectoryUsage) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[12]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryUsage.ProtoReflect.Descriptor instead.
func (*DirectoryUsage) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{12}
}

func (x *DirectoryUsage) GetCalls() int64 {
	if x != nil {
		return x.Calls
	}
	return 0
}

func (x *DirectoryUsage) GetCost() float64 {
	if x != nil {
		return x.Cost
	}
	return 0
}

type DirectoryInspectResponse struct {
	state    protoimpl.MessageState `protogen:"open.v1"`
	Tenant   string                 `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"`
	Subject  string                 `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"`
	Activity *DirectoryUser         `protobuf:"bytes,3,opt,name=activity,proto3" json:"activity,omitempty"`
	Chats    int32                  `protobuf:"varint,4,opt,name=chats,proto3" json:"chats,omitempty"`
	// memory is per-scope rather than one number: a subject's own rows and what a
	// shared agent holds ABOUT them are different things.
	Memory map[string]int64 `protobuf:"bytes,5,rep,name=memory,proto3" json:"memory,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
	// documents is `optional` so "not examined" (no SQL Memory configured) stays
	// distinguishable from "examined, found none".
	Documents *int32           `protobuf:"varint,6,opt,name=documents,proto3,oneof" json:"documents,omitempty"`
	Budget    *DirectoryBudget `protobuf:"bytes,7,opt,name=budget,proto3" json:"budget,omitempty"`
	Usage     *DirectoryUsage  `protobuf:"bytes,8,opt,name=usage,proto3" json:"usage,omitempty"`
	// errors names planes that could not be READ. Non-empty means every count is a
	// lower bound.
	Errors        []string `protobuf:"bytes,9,rep,name=errors,proto3" json:"errors,omitempty"`
	Notes         []string `protobuf:"bytes,10,rep,name=notes,proto3" json:"notes,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryInspectResponse) Reset() {
	*x = DirectoryInspectResponse{}
	mi := &file_loomcycle_proto_msgTypes[13]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryInspectResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryInspectResponse) ProtoMessage() {}

func (x *DirectoryInspectResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[13]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryInspectResponse.ProtoReflect.Descriptor instead.
func (*DirectoryInspectResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{13}
}

func (x *DirectoryInspectResponse) GetTenant() string {
	if x != nil {
		return x.Tenant
	}
	return ""
}

func (x *DirectoryInspectResponse) GetSubject() string {
	if x != nil {
		return x.Subject
	}
	return ""
}

func (x *DirectoryInspectResponse) GetActivity() *DirectoryUser {
	if x != nil {
		return x.Activity
	}
	return nil
}

func (x *DirectoryInspectResponse) GetChats() int32 {
	if x != nil {
		return x.Chats
	}
	return 0
}

func (x *DirectoryInspectResponse) GetMemory() map[string]int64 {
	if x != nil {
		return x.Memory
	}
	return nil
}

func (x *DirectoryInspectResponse) GetDocuments() int32 {
	if x != nil && x.Documents != nil {
		return *x.Documents
	}
	return 0
}

func (x *DirectoryInspectResponse) GetBudget() *DirectoryBudget {
	if x != nil {
		return x.Budget
	}
	return nil
}

func (x *DirectoryInspectResponse) GetUsage() *DirectoryUsage {
	if x != nil {
		return x.Usage
	}
	return nil
}

func (x *DirectoryInspectResponse) GetErrors() []string {
	if x != nil {
		return x.Errors
	}
	return nil
}

func (x *DirectoryInspectResponse) GetNotes() []string {
	if x != nil {
		return x.Notes
	}
	return nil
}

type DirectoryTenantsRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryTenantsRequest) Reset() {
	*x = DirectoryTenantsRequest{}
	mi := &file_loomcycle_proto_msgTypes[14]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryTenantsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryTenantsRequest) ProtoMessage() {}

func (x *DirectoryTenantsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[14]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryTenantsRequest.ProtoReflect.Descriptor instead.
func (*DirectoryTenantsRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{14}
}

type DirectoryTenant struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Tenant        string                 `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"`
	Users         int32                  `protobuf:"varint,2,opt,name=users,proto3" json:"users,omitempty"`
	Runs          int32                  `protobuf:"varint,3,opt,name=runs,proto3" json:"runs,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryTenant) Reset() {
	*x = DirectoryTenant{}
	mi := &file_loomcycle_proto_msgTypes[15]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryTenant) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryTenant) ProtoMessage() {}

func (x *DirectoryTenant) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[15]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryTenant.ProtoReflect.Descriptor instead.
func (*DirectoryTenant) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{15}
}

func (x *DirectoryTenant) GetTenant() string {
	if x != nil {
		return x.Tenant
	}
	return ""
}

func (x *DirectoryTenant) GetUsers() int32 {
	if x != nil {
		return x.Users
	}
	return 0
}

func (x *DirectoryTenant) GetRuns() int32 {
	if x != nil {
		return x.Runs
	}
	return 0
}

type DirectoryTenantsResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Tenants       []*DirectoryTenant     `protobuf:"bytes,1,rep,name=tenants,proto3" json:"tenants,omitempty"`
	Notes         []string               `protobuf:"bytes,2,rep,name=notes,proto3" json:"notes,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DirectoryTenantsResponse) Reset() {
	*x = DirectoryTenantsResponse{}
	mi := &file_loomcycle_proto_msgTypes[16]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DirectoryTenantsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DirectoryTenantsResponse) ProtoMessage() {}

func (x *DirectoryTenantsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[16]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DirectoryTenantsResponse.ProtoReflect.Descriptor instead.
func (*DirectoryTenantsResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{16}
}

func (x *DirectoryTenantsResponse) GetTenants() []*DirectoryTenant {
	if x != nil {
		return x.Tenants
	}
	return nil
}

func (x *DirectoryTenantsResponse) GetNotes() []string {
	if x != nil {
		return x.Notes
	}
	return nil
}

type ErasureReportRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Subject       string                 `protobuf:"bytes,1,opt,name=subject,proto3" json:"subject,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ErasureReportRequest) Reset() {
	*x = ErasureReportRequest{}
	mi := &file_loomcycle_proto_msgTypes[17]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ErasureReportRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ErasureReportRequest) ProtoMessage() {}

func (x *ErasureReportRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[17]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ErasureReportRequest.ProtoReflect.Descriptor instead.
func (*ErasureReportRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{17}
}

func (x *ErasureReportRequest) GetSubject() string {
	if x != nil {
		return x.Subject
	}
	return ""
}

// ErasureTier is one tier's per-plane counts. A key's PRESENCE means the plane
// was examined; its value is the row count. Absence means NOT examined, which
// is a different statement from zero.
type ErasureTier struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Counts        map[string]int64       `protobuf:"bytes,1,rep,name=counts,proto3" json:"counts,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
	Total         int64                  `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ErasureTier) Reset() {
	*x = ErasureTier{}
	mi := &file_loomcycle_proto_msgTypes[18]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ErasureTier) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ErasureTier) ProtoMessage() {}

func (x *ErasureTier) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[18]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ErasureTier.ProtoReflect.Descriptor instead.
func (*ErasureTier) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{18}
}

func (x *ErasureTier) GetCounts() map[string]int64 {
	if x != nil {
		return x.Counts
	}
	return nil
}

func (x *ErasureTier) GetTotal() int64 {
	if x != nil {
		return x.Total
	}
	return 0
}

// ErasureResidue is what a subject-keyed delete cannot reach. sessions_examined
// distinguishes "nothing derives from them" from "nothing to trace from": rows=0
// across sessions=0 means UNKNOWN, not NONE.
type ErasureResidue struct {
	state            protoimpl.MessageState `protogen:"open.v1"`
	Rows             int32                  `protobuf:"varint,1,opt,name=rows,proto3" json:"rows,omitempty"`
	Scopes           []string               `protobuf:"bytes,2,rep,name=scopes,proto3" json:"scopes,omitempty"`
	SessionsExamined int32                  `protobuf:"varint,3,opt,name=sessions_examined,json=sessionsExamined,proto3" json:"sessions_examined,omitempty"`
	Truncated        bool                   `protobuf:"varint,4,opt,name=truncated,proto3" json:"truncated,omitempty"`
	unknownFields    protoimpl.UnknownFields
	sizeCache        protoimpl.SizeCache
}

func (x *ErasureResidue) Reset() {
	*x = ErasureResidue{}
	mi := &file_loomcycle_proto_msgTypes[19]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ErasureResidue) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ErasureResidue) ProtoMessage() {}

func (x *ErasureResidue) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[19]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ErasureResidue.ProtoReflect.Descriptor instead.
func (*ErasureResidue) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{19}
}

func (x *ErasureResidue) GetRows() int32 {
	if x != nil {
		return x.Rows
	}
	return 0
}

func (x *ErasureResidue) GetScopes() []string {
	if x != nil {
		return x.Scopes
	}
	return nil
}

func (x *ErasureResidue) GetSessionsExamined() int32 {
	if x != nil {
		return x.SessionsExamined
	}
	return 0
}

func (x *ErasureResidue) GetTruncated() bool {
	if x != nil {
		return x.Truncated
	}
	return false
}

type ErasureReportResponse struct {
	state          protoimpl.MessageState `protogen:"open.v1"`
	Tenant         string                 `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"`
	Subject        string                 `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"`
	Tier1Covered   *ErasureTier           `protobuf:"bytes,3,opt,name=tier1_covered,json=tier1Covered,proto3" json:"tier1_covered,omitempty"`
	Tier2Uncovered *ErasureTier           `protobuf:"bytes,4,opt,name=tier2_uncovered,json=tier2Uncovered,proto3" json:"tier2_uncovered,omitempty"`
	Tier3Residue   *ErasureResidue        `protobuf:"bytes,5,opt,name=tier3_residue,json=tier3Residue,proto3" json:"tier3_residue,omitempty"`
	Notes          []string               `protobuf:"bytes,6,rep,name=notes,proto3" json:"notes,omitempty"`
	// errors names planes that could not be READ. A plane that failed is not a
	// plane that is empty; when this is non-empty every count is a lower bound.
	Errors        []string `protobuf:"bytes,7,rep,name=errors,proto3" json:"errors,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ErasureReportResponse) Reset() {
	*x = ErasureReportResponse{}
	mi := &file_loomcycle_proto_msgTypes[20]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ErasureReportResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ErasureReportResponse) ProtoMessage() {}

func (x *ErasureReportResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[20]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ErasureReportResponse.ProtoReflect.Descriptor instead.
func (*ErasureReportResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{20}
}

func (x *ErasureReportResponse) GetTenant() string {
	if x != nil {
		return x.Tenant
	}
	return ""
}

func (x *ErasureReportResponse) GetSubject() string {
	if x != nil {
		return x.Subject
	}
	return ""
}

func (x *ErasureReportResponse) GetTier1Covered() *ErasureTier {
	if x != nil {
		return x.Tier1Covered
	}
	return nil
}

func (x *ErasureReportResponse) GetTier2Uncovered() *ErasureTier {
	if x != nil {
		return x.Tier2Uncovered
	}
	return nil
}

func (x *ErasureReportResponse) GetTier3Residue() *ErasureResidue {
	if x != nil {
		return x.Tier3Residue
	}
	return nil
}

func (x *ErasureReportResponse) GetNotes() []string {
	if x != nil {
		return x.Notes
	}
	return nil
}

func (x *ErasureReportResponse) GetErrors() []string {
	if x != nil {
		return x.Errors
	}
	return nil
}

type ErasureExecuteRequest struct {
	state   protoimpl.MessageState `protogen:"open.v1"`
	Subject string                 `protobuf:"bytes,1,opt,name=subject,proto3" json:"subject,omitempty"`
	// optional so UNSET means dry run. A plain bool would make the zero value
	// destructive, which is the one default this operation must not have.
	DryRun *bool `protobuf:"varint,2,opt,name=dry_run,json=dryRun,proto3,oneof" json:"dry_run,omitempty"`
	// must equal subject when dry_run is false.
	Confirm       string `protobuf:"bytes,3,opt,name=confirm,proto3" json:"confirm,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ErasureExecuteRequest) Reset() {
	*x = ErasureExecuteRequest{}
	mi := &file_loomcycle_proto_msgTypes[21]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ErasureExecuteRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ErasureExecuteRequest) ProtoMessage() {}

func (x *ErasureExecuteRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[21]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ErasureExecuteRequest.ProtoReflect.Descriptor instead.
func (*ErasureExecuteRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{21}
}

func (x *ErasureExecuteRequest) GetSubject() string {
	if x != nil {
		return x.Subject
	}
	return ""
}

func (x *ErasureExecuteRequest) GetDryRun() bool {
	if x != nil && x.DryRun != nil {
		return *x.DryRun
	}
	return false
}

func (x *ErasureExecuteRequest) GetConfirm() string {
	if x != nil {
		return x.Confirm
	}
	return ""
}

type ErasureExecuteResponse struct {
	state   protoimpl.MessageState `protogen:"open.v1"`
	Tenant  string                 `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"`
	Subject string                 `protobuf:"bytes,2,opt,name=subject,proto3" json:"subject,omitempty"`
	DryRun  bool                   `protobuf:"varint,3,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"`
	Deleted map[string]int32       `protobuf:"bytes,4,rep,name=deleted,proto3" json:"deleted,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
	// retained is plane -> why it was kept, never empty: an erasure listing only
	// its successes reads as complete.
	Retained      map[string]string `protobuf:"bytes,5,rep,name=retained,proto3" json:"retained,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	Residue       *ErasureResidue   `protobuf:"bytes,6,opt,name=residue,proto3" json:"residue,omitempty"`
	Errors        []string          `protobuf:"bytes,7,rep,name=errors,proto3" json:"errors,omitempty"`
	Notes         []string          `protobuf:"bytes,8,rep,name=notes,proto3" json:"notes,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ErasureExecuteResponse) Reset() {
	*x = ErasureExecuteResponse{}
	mi := &file_loomcycle_proto_msgTypes[22]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ErasureExecuteResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ErasureExecuteResponse) ProtoMessage() {}

func (x *ErasureExecuteResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[22]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ErasureExecuteResponse.ProtoReflect.Descriptor instead.
func (*ErasureExecuteResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{22}
}

func (x *ErasureExecuteResponse) GetTenant() string {
	if x != nil {
		return x.Tenant
	}
	return ""
}

func (x *ErasureExecuteResponse) GetSubject() string {
	if x != nil {
		return x.Subject
	}
	return ""
}

func (x *ErasureExecuteResponse) GetDryRun() bool {
	if x != nil {
		return x.DryRun
	}
	return false
}

func (x *ErasureExecuteResponse) GetDeleted() map[string]int32 {
	if x != nil {
		return x.Deleted
	}
	return nil
}

func (x *ErasureExecuteResponse) GetRetained() map[string]string {
	if x != nil {
		return x.Retained
	}
	return nil
}

func (x *ErasureExecuteResponse) GetResidue() *ErasureResidue {
	if x != nil {
		return x.Residue
	}
	return nil
}

func (x *ErasureExecuteResponse) GetErrors() []string {
	if x != nil {
		return x.Errors
	}
	return nil
}

func (x *ErasureExecuteResponse) GetNotes() []string {
	if x != nil {
		return x.Notes
	}
	return nil
}

type CompactRunRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	RunId         string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	Reason        string                 `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` // optional audit note
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *CompactRunRequest) Reset() {
	*x = CompactRunRequest{}
	mi := &file_loomcycle_proto_msgTypes[23]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CompactRunRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CompactRunRequest) ProtoMessage() {}

func (x *CompactRunRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[23]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CompactRunRequest.ProtoReflect.Descriptor instead.
func (*CompactRunRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{23}
}

func (x *CompactRunRequest) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *CompactRunRequest) GetReason() string {
	if x != nil {
		return x.Reason
	}
	return ""
}

// CompactRunResult mirrors connector.CompactResult.
type CompactRunResult struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	RunId         string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	Compacted     bool                   `protobuf:"varint,2,opt,name=compacted,proto3" json:"compacted,omitempty"`
	BeforeTokens  int32                  `protobuf:"varint,3,opt,name=before_tokens,json=beforeTokens,proto3" json:"before_tokens,omitempty"`
	AfterTokens   int32                  `protobuf:"varint,4,opt,name=after_tokens,json=afterTokens,proto3" json:"after_tokens,omitempty"`
	Applied       string                 `protobuf:"bytes,5,opt,name=applied,proto3" json:"applied,omitempty"` // live | marker | noop
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *CompactRunResult) Reset() {
	*x = CompactRunResult{}
	mi := &file_loomcycle_proto_msgTypes[24]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CompactRunResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CompactRunResult) ProtoMessage() {}

func (x *CompactRunResult) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[24]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CompactRunResult.ProtoReflect.Descriptor instead.
func (*CompactRunResult) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{24}
}

func (x *CompactRunResult) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *CompactRunResult) GetCompacted() bool {
	if x != nil {
		return x.Compacted
	}
	return false
}

func (x *CompactRunResult) GetBeforeTokens() int32 {
	if x != nil {
		return x.BeforeTokens
	}
	return 0
}

func (x *CompactRunResult) GetAfterTokens() int32 {
	if x != nil {
		return x.AfterTokens
	}
	return 0
}

func (x *CompactRunResult) GetApplied() string {
	if x != nil {
		return x.Applied
	}
	return ""
}

type ReplaySessionRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	SessionId     string                 `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` // SOURCE session whose transcript is carried over
	Agent         string                 `protobuf:"bytes,2,opt,name=agent,proto3" json:"agent,omitempty"`                          // target agent the new session binds
	Compress      bool                   `protobuf:"varint,3,opt,name=compress,proto3" json:"compress,omitempty"`                   // collapse the carried history to a summary + recent tail
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ReplaySessionRequest) Reset() {
	*x = ReplaySessionRequest{}
	mi := &file_loomcycle_proto_msgTypes[25]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ReplaySessionRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ReplaySessionRequest) ProtoMessage() {}

func (x *ReplaySessionRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[25]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ReplaySessionRequest.ProtoReflect.Descriptor instead.
func (*ReplaySessionRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{25}
}

func (x *ReplaySessionRequest) GetSessionId() string {
	if x != nil {
		return x.SessionId
	}
	return ""
}

func (x *ReplaySessionRequest) GetAgent() string {
	if x != nil {
		return x.Agent
	}
	return ""
}

func (x *ReplaySessionRequest) GetCompress() bool {
	if x != nil {
		return x.Compress
	}
	return false
}

type ReplaySessionResult struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	NewSessionId  string                 `protobuf:"bytes,1,opt,name=new_session_id,json=newSessionId,proto3" json:"new_session_id,omitempty"`
	SeedRunId     string                 `protobuf:"bytes,2,opt,name=seed_run_id,json=seedRunId,proto3" json:"seed_run_id,omitempty"`
	EventsCopied  int32                  `protobuf:"varint,3,opt,name=events_copied,json=eventsCopied,proto3" json:"events_copied,omitempty"`
	Compacted     bool                   `protobuf:"varint,4,opt,name=compacted,proto3" json:"compacted,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ReplaySessionResult) Reset() {
	*x = ReplaySessionResult{}
	mi := &file_loomcycle_proto_msgTypes[26]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ReplaySessionResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ReplaySessionResult) ProtoMessage() {}

func (x *ReplaySessionResult) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[26]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ReplaySessionResult.ProtoReflect.Descriptor instead.
func (*ReplaySessionResult) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{26}
}

func (x *ReplaySessionResult) GetNewSessionId() string {
	if x != nil {
		return x.NewSessionId
	}
	return ""
}

func (x *ReplaySessionResult) GetSeedRunId() string {
	if x != nil {
		return x.SeedRunId
	}
	return ""
}

func (x *ReplaySessionResult) GetEventsCopied() int32 {
	if x != nil {
		return x.EventsCopied
	}
	return 0
}

func (x *ReplaySessionResult) GetCompacted() bool {
	if x != nil {
		return x.Compacted
	}
	return false
}

// RunInputRequest is one operator steering message for a live run (RFC AI).
type RunInputRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	RunId string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	Text  string                 `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"`
	// source is advisory/forward-compat — the server stamps the authoritative
	// source from the auth boundary (gRPC has no cookie → "api"), never trusts
	// this field.
	Source        string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *RunInputRequest) Reset() {
	*x = RunInputRequest{}
	mi := &file_loomcycle_proto_msgTypes[27]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RunInputRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RunInputRequest) ProtoMessage() {}

func (x *RunInputRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[27]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RunInputRequest.ProtoReflect.Descriptor instead.
func (*RunInputRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{27}
}

func (x *RunInputRequest) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *RunInputRequest) GetText() string {
	if x != nil {
		return x.Text
	}
	return ""
}

func (x *RunInputRequest) GetSource() string {
	if x != nil {
		return x.Source
	}
	return ""
}

// RunInputResponse mirrors the HTTP POST /v1/runs/{run_id}/input reply.
type RunInputResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	RunId         string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	Delivered     bool                   `protobuf:"varint,2,opt,name=delivered,proto3" json:"delivered,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *RunInputResponse) Reset() {
	*x = RunInputResponse{}
	mi := &file_loomcycle_proto_msgTypes[28]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RunInputResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RunInputResponse) ProtoMessage() {}

func (x *RunInputResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[28]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RunInputResponse.ProtoReflect.Descriptor instead.
func (*RunInputResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{28}
}

func (x *RunInputResponse) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *RunInputResponse) GetDelivered() bool {
	if x != nil {
		return x.Delivered
	}
	return false
}

// CancelTurnRequest stops the current turn of a live interactive run (RFC BH).
type CancelTurnRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	RunId         string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	Reason        string                 `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` // optional operator annotation carried on the cancel cause
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *CancelTurnRequest) Reset() {
	*x = CancelTurnRequest{}
	mi := &file_loomcycle_proto_msgTypes[29]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CancelTurnRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CancelTurnRequest) ProtoMessage() {}

func (x *CancelTurnRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[29]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CancelTurnRequest.ProtoReflect.Descriptor instead.
func (*CancelTurnRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{29}
}

func (x *CancelTurnRequest) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *CancelTurnRequest) GetReason() string {
	if x != nil {
		return x.Reason
	}
	return ""
}

// CancelTurnResponse mirrors the HTTP POST /v1/runs/{run_id}/cancel reply.
type CancelTurnResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	RunId         string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	Stopped       bool                   `protobuf:"varint,2,opt,name=stopped,proto3" json:"stopped,omitempty"`
	Parked        bool                   `protobuf:"varint,3,opt,name=parked,proto3" json:"parked,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *CancelTurnResponse) Reset() {
	*x = CancelTurnResponse{}
	mi := &file_loomcycle_proto_msgTypes[30]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CancelTurnResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CancelTurnResponse) ProtoMessage() {}

func (x *CancelTurnResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[30]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CancelTurnResponse.ProtoReflect.Descriptor instead.
func (*CancelTurnResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{30}
}

func (x *CancelTurnResponse) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *CancelTurnResponse) GetStopped() bool {
	if x != nil {
		return x.Stopped
	}
	return false
}

func (x *CancelTurnResponse) GetParked() bool {
	if x != nil {
		return x.Parked
	}
	return false
}

// ResolveInterruptRequest resolves a pending interruption (RFC BH). The
// disposition selects the terminal path: "" / "answer" carry an answer;
// "declined" carries none and skips option validation.
type ResolveInterruptRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	RunId         string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	InterruptId   string                 `protobuf:"bytes,2,opt,name=interrupt_id,json=interruptId,proto3" json:"interrupt_id,omitempty"`
	Kind          string                 `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"`                               // "question" (default when empty)
	Answer        string                 `protobuf:"bytes,4,opt,name=answer,proto3" json:"answer,omitempty"`                           // for the answer disposition
	ResolvedBy    string                 `protobuf:"bytes,5,opt,name=resolved_by,json=resolvedBy,proto3" json:"resolved_by,omitempty"` // audit attribution; server stamps "api" when empty
	Disposition   string                 `protobuf:"bytes,6,opt,name=disposition,proto3" json:"disposition,omitempty"`                 // "" | "answer" | "declined"
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ResolveInterruptRequest) Reset() {
	*x = ResolveInterruptRequest{}
	mi := &file_loomcycle_proto_msgTypes[31]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ResolveInterruptRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResolveInterruptRequest) ProtoMessage() {}

func (x *ResolveInterruptRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[31]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResolveInterruptRequest.ProtoReflect.Descriptor instead.
func (*ResolveInterruptRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{31}
}

func (x *ResolveInterruptRequest) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *ResolveInterruptRequest) GetInterruptId() string {
	if x != nil {
		return x.InterruptId
	}
	return ""
}

func (x *ResolveInterruptRequest) GetKind() string {
	if x != nil {
		return x.Kind
	}
	return ""
}

func (x *ResolveInterruptRequest) GetAnswer() string {
	if x != nil {
		return x.Answer
	}
	return ""
}

func (x *ResolveInterruptRequest) GetResolvedBy() string {
	if x != nil {
		return x.ResolvedBy
	}
	return ""
}

func (x *ResolveInterruptRequest) GetDisposition() string {
	if x != nil {
		return x.Disposition
	}
	return ""
}

// ResolveInterruptResponse mirrors the HTTP resolve reply.
type ResolveInterruptResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	InterruptId   string                 `protobuf:"bytes,1,opt,name=interrupt_id,json=interruptId,proto3" json:"interrupt_id,omitempty"`
	Status        string                 `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // "resolved" | "declined"
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ResolveInterruptResponse) Reset() {
	*x = ResolveInterruptResponse{}
	mi := &file_loomcycle_proto_msgTypes[32]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ResolveInterruptResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResolveInterruptResponse) ProtoMessage() {}

func (x *ResolveInterruptResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[32]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResolveInterruptResponse.ProtoReflect.Descriptor instead.
func (*ResolveInterruptResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{32}
}

func (x *ResolveInterruptResponse) GetInterruptId() string {
	if x != nil {
		return x.InterruptId
	}
	return ""
}

func (x *ResolveInterruptResponse) GetStatus() string {
	if x != nil {
		return x.Status
	}
	return ""
}

// StreamRunRequest re-attaches to a run's event stream by run_id (RFC AI).
type StreamRunRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	RunId         string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	FromSeq       int64                  `protobuf:"varint,2,opt,name=from_seq,json=fromSeq,proto3" json:"from_seq,omitempty"` // replay events with seq > from_seq, then live-tail
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *StreamRunRequest) Reset() {
	*x = StreamRunRequest{}
	mi := &file_loomcycle_proto_msgTypes[33]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *StreamRunRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StreamRunRequest) ProtoMessage() {}

func (x *StreamRunRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[33]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use StreamRunRequest.ProtoReflect.Descriptor instead.
func (*StreamRunRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{33}
}

func (x *StreamRunRequest) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *StreamRunRequest) GetFromSeq() int64 {
	if x != nil {
		return x.FromSeq
	}
	return 0
}

// HostAllowlist wraps a repeated string so the absence-of-list state
// is distinguishable from the empty-list state on the wire.
type HostAllowlist struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	List          []string               `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *HostAllowlist) Reset() {
	*x = HostAllowlist{}
	mi := &file_loomcycle_proto_msgTypes[34]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *HostAllowlist) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HostAllowlist) ProtoMessage() {}

func (x *HostAllowlist) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[34]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HostAllowlist.ProtoReflect.Descriptor instead.
func (*HostAllowlist) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{34}
}

func (x *HostAllowlist) GetList() []string {
	if x != nil {
		return x.List
	}
	return nil
}

// PromptSegment mirrors loop.PromptSegment. Role is "system" | "user"
// | "assistant"; in practice, gRPC callers send only "system" and
// "user" segments and let the loop produce "assistant" turns.
type PromptSegment struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Role          string                 `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"`
	Content       []*PromptContentBlock  `protobuf:"bytes,2,rep,name=content,proto3" json:"content,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *PromptSegment) Reset() {
	*x = PromptSegment{}
	mi := &file_loomcycle_proto_msgTypes[35]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PromptSegment) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PromptSegment) ProtoMessage() {}

func (x *PromptSegment) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[35]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PromptSegment.ProtoReflect.Descriptor instead.
func (*PromptSegment) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{35}
}

func (x *PromptSegment) GetRole() string {
	if x != nil {
		return x.Role
	}
	return ""
}

func (x *PromptSegment) GetContent() []*PromptContentBlock {
	if x != nil {
		return x.Content
	}
	return nil
}

// PromptContentBlock mirrors loop.PromptContentBlock. The trust
// vocabulary stays HTTP-compatible:
//   - "trusted-text" / "user-text" / "tool-output-text" / "third-party-text"
//
// Cacheable=true marks this block for native provider caching
// (Anthropic cache_control). Ignored on providers that don't support it.
type PromptContentBlock struct {
	state     protoimpl.MessageState `protogen:"open.v1"`
	Type      string                 `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	Text      string                 `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"`
	Cacheable bool                   `protobuf:"varint,3,opt,name=cacheable,proto3" json:"cacheable,omitempty"`
	// Image input (type == "image", RFC AT). media_type is a whitelisted
	// image media type (image/png|jpeg|gif|webp); data is the RAW image bytes.
	// Unlike the HTTP/JSON wire (which carries base64 in a string, since JSON
	// has no byte type), gRPC carries the bytes natively here — the server
	// base64-encodes them into the loop's internal representation. There is
	// deliberately no URL form (SSRF — RFC AT §6).
	MediaType     string `protobuf:"bytes,4,opt,name=media_type,json=mediaType,proto3" json:"media_type,omitempty"`
	Data          []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *PromptContentBlock) Reset() {
	*x = PromptContentBlock{}
	mi := &file_loomcycle_proto_msgTypes[36]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PromptContentBlock) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PromptContentBlock) ProtoMessage() {}

func (x *PromptContentBlock) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[36]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PromptContentBlock.ProtoReflect.Descriptor instead.
func (*PromptContentBlock) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{36}
}

func (x *PromptContentBlock) GetType() string {
	if x != nil {
		return x.Type
	}
	return ""
}

func (x *PromptContentBlock) GetText() string {
	if x != nil {
		return x.Text
	}
	return ""
}

func (x *PromptContentBlock) GetCacheable() bool {
	if x != nil {
		return x.Cacheable
	}
	return false
}

func (x *PromptContentBlock) GetMediaType() string {
	if x != nil {
		return x.MediaType
	}
	return ""
}

func (x *PromptContentBlock) GetData() []byte {
	if x != nil {
		return x.Data
	}
	return nil
}

// Event is one frame on the Run/Continue server stream. Mirrors
// providers.Event 1:1 — fields stay nullable (proto3 message-type
// fields default to nil-equivalent) so the wire shape can carry
// "this event is just text" or "this event is a tool_use" or "this
// event is a usage update" without per-type subclassing.
type Event struct {
	state      protoimpl.MessageState `protogen:"open.v1"`
	Type       string                 `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // text | tool_use | tool_result | usage | retry | done | error | host_widened
	Text       string                 `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"`
	ToolUse    *ToolUse               `protobuf:"bytes,3,opt,name=tool_use,json=toolUse,proto3" json:"tool_use,omitempty"`
	Usage      *Usage                 `protobuf:"bytes,4,opt,name=usage,proto3" json:"usage,omitempty"`
	Error      string                 `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"`
	IsError    bool                   `protobuf:"varint,6,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"` // tool_result with execution failure
	Retry      *Retry                 `protobuf:"bytes,7,opt,name=retry,proto3" json:"retry,omitempty"`
	StopReason string                 `protobuf:"bytes,8,opt,name=stop_reason,json=stopReason,proto3" json:"stop_reason,omitempty"` // end_turn | tool_use | max_tokens | stop_sequence
	// host_widening carries the structured payload on type=host_widened
	// frames (v0.8.17+). Emitted once per dispatched tool call whose
	// Pre-hook allow_hosts grant fired. Nil on every other event type.
	HostWidening *HostWidening `protobuf:"bytes,9,opt,name=host_widening,json=hostWidening,proto3" json:"host_widening,omitempty"`
	// awaiting_input carries the payload on type=awaiting_input frames
	// (RFC AI) — a persistent interactive run parked at end_turn. Nil on
	// every other event type.
	AwaitingInput *AwaitingInput `protobuf:"bytes,10,opt,name=awaiting_input,json=awaitingInput,proto3" json:"awaiting_input,omitempty"`
	// user_input carries the payload on type=steer frames (RFC AI) — an
	// operator steering message drained into the conversation. Also emitted
	// by StreamRun re-attach when replaying persisted operator turns
	// (source="replay"). Nil on every other event type.
	UserInput *UserInput `protobuf:"bytes,11,opt,name=user_input,json=userInput,proto3" json:"user_input,omitempty"`
	// limit carries the payload on type=limit frames (RFC AW) — a per-scope
	// token-budget crossing (soft warning at run start, or a soft crossing
	// mid-run). SERVER-generated. Nil on every other event type.
	Limit         *LimitInfo `protobuf:"bytes,12,opt,name=limit,proto3" json:"limit,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Event) Reset() {
	*x = Event{}
	mi := &file_loomcycle_proto_msgTypes[37]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Event) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Event) ProtoMessage() {}

func (x *Event) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[37]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Event.ProtoReflect.Descriptor instead.
func (*Event) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{37}
}

func (x *Event) GetType() string {
	if x != nil {
		return x.Type
	}
	return ""
}

func (x *Event) GetText() string {
	if x != nil {
		return x.Text
	}
	return ""
}

func (x *Event) GetToolUse() *ToolUse {
	if x != nil {
		return x.ToolUse
	}
	return nil
}

func (x *Event) GetUsage() *Usage {
	if x != nil {
		return x.Usage
	}
	return nil
}

func (x *Event) GetError() string {
	if x != nil {
		return x.Error
	}
	return ""
}

func (x *Event) GetIsError() bool {
	if x != nil {
		return x.IsError
	}
	return false
}

func (x *Event) GetRetry() *Retry {
	if x != nil {
		return x.Retry
	}
	return nil
}

func (x *Event) GetStopReason() string {
	if x != nil {
		return x.StopReason
	}
	return ""
}

func (x *Event) GetHostWidening() *HostWidening {
	if x != nil {
		return x.HostWidening
	}
	return nil
}

func (x *Event) GetAwaitingInput() *AwaitingInput {
	if x != nil {
		return x.AwaitingInput
	}
	return nil
}

func (x *Event) GetUserInput() *UserInput {
	if x != nil {
		return x.UserInput
	}
	return nil
}

func (x *Event) GetLimit() *LimitInfo {
	if x != nil {
		return x.Limit
	}
	return nil
}

// AwaitingInput is the type=awaiting_input payload (RFC AI). Mirrors
// providers.AwaitingInputEventInfo.
type AwaitingInput struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	SinceTurn     int32                  `protobuf:"varint,1,opt,name=since_turn,json=sinceTurn,proto3" json:"since_turn,omitempty"` // the iteration the run parked after
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AwaitingInput) Reset() {
	*x = AwaitingInput{}
	mi := &file_loomcycle_proto_msgTypes[38]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AwaitingInput) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AwaitingInput) ProtoMessage() {}

func (x *AwaitingInput) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[38]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AwaitingInput.ProtoReflect.Descriptor instead.
func (*AwaitingInput) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{38}
}

func (x *AwaitingInput) GetSinceTurn() int32 {
	if x != nil {
		return x.SinceTurn
	}
	return 0
}

// UserInput is the type=steer payload (RFC AI). Mirrors
// providers.UserInputEventInfo.
type UserInput struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Text          string                 `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	Source        string                 `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"`               // api | webui | replay
	SeenAt        string                 `protobuf:"bytes,3,opt,name=seen_at,json=seenAt,proto3" json:"seen_at,omitempty"` // RFC3339Nano timestamp the message was drained
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *UserInput) Reset() {
	*x = UserInput{}
	mi := &file_loomcycle_proto_msgTypes[39]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *UserInput) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UserInput) ProtoMessage() {}

func (x *UserInput) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[39]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UserInput.ProtoReflect.Descriptor instead.
func (*UserInput) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{39}
}

func (x *UserInput) GetText() string {
	if x != nil {
		return x.Text
	}
	return ""
}

func (x *UserInput) GetSource() string {
	if x != nil {
		return x.Source
	}
	return ""
}

func (x *UserInput) GetSeenAt() string {
	if x != nil {
		return x.SeenAt
	}
	return ""
}

// HostWidening is the structured payload on EventHostWidened frames
// (v0.8.17+). Operators correlate (tool_call_id, url, hosts_added)
// to detect confused-deputy patterns where the hook is just echoing
// the model's requested host without independent validation.
// Mirrors providers.HostWideningEventInfo on the Go side.
type HostWidening struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	ToolCallId    string                 `protobuf:"bytes,1,opt,name=tool_call_id,json=toolCallId,proto3" json:"tool_call_id,omitempty"` // loop-issued tool_use id; same as the surrounding EventToolCall
	ToolName      string                 `protobuf:"bytes,2,opt,name=tool_name,json=toolName,proto3" json:"tool_name,omitempty"`         // "HTTP" / "WebFetch" / etc.
	Url           string                 `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"`                                   // originating URL the model asked the tool to fetch
	HookOwner     string                 `protobuf:"bytes,4,opt,name=hook_owner,json=hookOwner,proto3" json:"hook_owner,omitempty"`      // (owner, name) identifies the registered hook
	HookName      string                 `protobuf:"bytes,5,opt,name=hook_name,json=hookName,proto3" json:"hook_name,omitempty"`
	HostsAdded    []string               `protobuf:"bytes,6,rep,name=hosts_added,json=hostsAdded,proto3" json:"hosts_added,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *HostWidening) Reset() {
	*x = HostWidening{}
	mi := &file_loomcycle_proto_msgTypes[40]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *HostWidening) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HostWidening) ProtoMessage() {}

func (x *HostWidening) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[40]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HostWidening.ProtoReflect.Descriptor instead.
func (*HostWidening) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{40}
}

func (x *HostWidening) GetToolCallId() string {
	if x != nil {
		return x.ToolCallId
	}
	return ""
}

func (x *HostWidening) GetToolName() string {
	if x != nil {
		return x.ToolName
	}
	return ""
}

func (x *HostWidening) GetUrl() string {
	if x != nil {
		return x.Url
	}
	return ""
}

func (x *HostWidening) GetHookOwner() string {
	if x != nil {
		return x.HookOwner
	}
	return ""
}

func (x *HostWidening) GetHookName() string {
	if x != nil {
		return x.HookName
	}
	return ""
}

func (x *HostWidening) GetHostsAdded() []string {
	if x != nil {
		return x.HostsAdded
	}
	return nil
}

// ToolUse carries one tool_use block emitted by the model. The id is
// the model's correlator (Claude tu_*, OpenAI call_*); name is the
// tool's registered name; input is the raw JSON the model produced.
type ToolUse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Id            string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Name          string                 `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	Input         []byte                 `protobuf:"bytes,3,opt,name=input,proto3" json:"input,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ToolUse) Reset() {
	*x = ToolUse{}
	mi := &file_loomcycle_proto_msgTypes[41]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ToolUse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ToolUse) ProtoMessage() {}

func (x *ToolUse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[41]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ToolUse.ProtoReflect.Descriptor instead.
func (*ToolUse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{41}
}

func (x *ToolUse) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (x *ToolUse) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *ToolUse) GetInput() []byte {
	if x != nil {
		return x.Input
	}
	return nil
}

// Usage is the per-call token accounting. CacheCreation/Read tokens
// surface on Anthropic provider responses; zero on others.
type Usage struct {
	state               protoimpl.MessageState `protogen:"open.v1"`
	InputTokens         int64                  `protobuf:"varint,1,opt,name=input_tokens,json=inputTokens,proto3" json:"input_tokens,omitempty"`
	OutputTokens        int64                  `protobuf:"varint,2,opt,name=output_tokens,json=outputTokens,proto3" json:"output_tokens,omitempty"`
	CacheCreationTokens int64                  `protobuf:"varint,3,opt,name=cache_creation_tokens,json=cacheCreationTokens,proto3" json:"cache_creation_tokens,omitempty"`
	CacheReadTokens     int64                  `protobuf:"varint,4,opt,name=cache_read_tokens,json=cacheReadTokens,proto3" json:"cache_read_tokens,omitempty"`
	Model               string                 `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"`
	unknownFields       protoimpl.UnknownFields
	sizeCache           protoimpl.SizeCache
}

func (x *Usage) Reset() {
	*x = Usage{}
	mi := &file_loomcycle_proto_msgTypes[42]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Usage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Usage) ProtoMessage() {}

func (x *Usage) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[42]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Usage.ProtoReflect.Descriptor instead.
func (*Usage) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{42}
}

func (x *Usage) GetInputTokens() int64 {
	if x != nil {
		return x.InputTokens
	}
	return 0
}

func (x *Usage) GetOutputTokens() int64 {
	if x != nil {
		return x.OutputTokens
	}
	return 0
}

func (x *Usage) GetCacheCreationTokens() int64 {
	if x != nil {
		return x.CacheCreationTokens
	}
	return 0
}

func (x *Usage) GetCacheReadTokens() int64 {
	if x != nil {
		return x.CacheReadTokens
	}
	return 0
}

func (x *Usage) GetModel() string {
	if x != nil {
		return x.Model
	}
	return ""
}

// Retry mirrors providers.RetryInfo. Fired when a provider 429 is
// being retried with backoff; gives adapters live "waiting on rate
// limit" telemetry.
type Retry struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Provider      string                 `protobuf:"bytes,1,opt,name=provider,proto3" json:"provider,omitempty"`
	Attempt       int32                  `protobuf:"varint,2,opt,name=attempt,proto3" json:"attempt,omitempty"`
	WaitMs        int64                  `protobuf:"varint,3,opt,name=wait_ms,json=waitMs,proto3" json:"wait_ms,omitempty"`
	Reason        string                 `protobuf:"bytes,4,opt,name=reason,proto3" json:"reason,omitempty"` // RetryReasonHeader | RetryReasonSchedule
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Retry) Reset() {
	*x = Retry{}
	mi := &file_loomcycle_proto_msgTypes[43]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Retry) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Retry) ProtoMessage() {}

func (x *Retry) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[43]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Retry.ProtoReflect.Descriptor instead.
func (*Retry) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{43}
}

func (x *Retry) GetProvider() string {
	if x != nil {
		return x.Provider
	}
	return ""
}

func (x *Retry) GetAttempt() int32 {
	if x != nil {
		return x.Attempt
	}
	return 0
}

func (x *Retry) GetWaitMs() int64 {
	if x != nil {
		return x.WaitMs
	}
	return 0
}

func (x *Retry) GetReason() string {
	if x != nil {
		return x.Reason
	}
	return ""
}

// LimitInfo is the structured payload on type=limit frames (RFC AW — per-scope
// token budgets). Names which scope tripped, how hard, and where the scope
// stands against its ceiling. No secrets: scope/scope_id are a tenant/subject
// id (already non-secret, like user_id) and the counts are integers. Mirrors
// providers.LimitInfo on the Go side.
type LimitInfo struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Scope         string                 `protobuf:"bytes,1,opt,name=scope,proto3" json:"scope,omitempty"`                    // "operator" | "tenant" | "user"
	ScopeId       string                 `protobuf:"bytes,2,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"` // tenant id (scope=tenant), user subject (scope=user), "" (operator)
	Severity      string                 `protobuf:"bytes,3,opt,name=severity,proto3" json:"severity,omitempty"`              // "soft" | "hard"
	Window        string                 `protobuf:"bytes,4,opt,name=window,proto3" json:"window,omitempty"`                  // "month" (calendar month, UTC) in Phase 1
	Used          int64                  `protobuf:"varint,5,opt,name=used,proto3" json:"used,omitempty"`                     // scope's month-to-date token total at the crossing
	Limit         int64                  `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"`                   // the tier that was crossed (the soft or hard ceiling)
	Message       string                 `protobuf:"bytes,7,opt,name=message,proto3" json:"message,omitempty"`                // human-readable banner (optional)
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *LimitInfo) Reset() {
	*x = LimitInfo{}
	mi := &file_loomcycle_proto_msgTypes[44]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *LimitInfo) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*LimitInfo) ProtoMessage() {}

func (x *LimitInfo) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[44]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use LimitInfo.ProtoReflect.Descriptor instead.
func (*LimitInfo) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{44}
}

func (x *LimitInfo) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *LimitInfo) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *LimitInfo) GetSeverity() string {
	if x != nil {
		return x.Severity
	}
	return ""
}

func (x *LimitInfo) GetWindow() string {
	if x != nil {
		return x.Window
	}
	return ""
}

func (x *LimitInfo) GetUsed() int64 {
	if x != nil {
		return x.Used
	}
	return 0
}

func (x *LimitInfo) GetLimit() int64 {
	if x != nil {
		return x.Limit
	}
	return 0
}

func (x *LimitInfo) GetMessage() string {
	if x != nil {
		return x.Message
	}
	return ""
}

type GetTranscriptRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	SessionId     string                 `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *GetTranscriptRequest) Reset() {
	*x = GetTranscriptRequest{}
	mi := &file_loomcycle_proto_msgTypes[45]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *GetTranscriptRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetTranscriptRequest) ProtoMessage() {}

func (x *GetTranscriptRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[45]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetTranscriptRequest.ProtoReflect.Descriptor instead.
func (*GetTranscriptRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{45}
}

func (x *GetTranscriptRequest) GetSessionId() string {
	if x != nil {
		return x.SessionId
	}
	return ""
}

type Transcript struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Events        []*TranscriptEvent     `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Transcript) Reset() {
	*x = Transcript{}
	mi := &file_loomcycle_proto_msgTypes[46]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Transcript) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Transcript) ProtoMessage() {}

func (x *Transcript) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[46]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Transcript.ProtoReflect.Descriptor instead.
func (*Transcript) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{46}
}

func (x *Transcript) GetEvents() []*TranscriptEvent {
	if x != nil {
		return x.Events
	}
	return nil
}

// TranscriptEvent is one persisted store.Event. The payload is raw
// JSON bytes (matching the HTTP transcript surface) so adapters
// decode the same way regardless of wire choice.
type TranscriptEvent struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Seq           int64                  `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"`
	SessionId     string                 `protobuf:"bytes,2,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
	RunId         string                 `protobuf:"bytes,3,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	Ts            *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=ts,proto3" json:"ts,omitempty"`
	Type          string                 `protobuf:"bytes,5,opt,name=type,proto3" json:"type,omitempty"`
	Payload       []byte                 `protobuf:"bytes,6,opt,name=payload,proto3" json:"payload,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *TranscriptEvent) Reset() {
	*x = TranscriptEvent{}
	mi := &file_loomcycle_proto_msgTypes[47]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *TranscriptEvent) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TranscriptEvent) ProtoMessage() {}

func (x *TranscriptEvent) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[47]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TranscriptEvent.ProtoReflect.Descriptor instead.
func (*TranscriptEvent) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{47}
}

func (x *TranscriptEvent) GetSeq() int64 {
	if x != nil {
		return x.Seq
	}
	return 0
}

func (x *TranscriptEvent) GetSessionId() string {
	if x != nil {
		return x.SessionId
	}
	return ""
}

func (x *TranscriptEvent) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *TranscriptEvent) GetTs() *timestamppb.Timestamp {
	if x != nil {
		return x.Ts
	}
	return nil
}

func (x *TranscriptEvent) GetType() string {
	if x != nil {
		return x.Type
	}
	return ""
}

func (x *TranscriptEvent) GetPayload() []byte {
	if x != nil {
		return x.Payload
	}
	return nil
}

type GetAgentRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	AgentId       string                 `protobuf:"bytes,1,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *GetAgentRequest) Reset() {
	*x = GetAgentRequest{}
	mi := &file_loomcycle_proto_msgTypes[48]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *GetAgentRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetAgentRequest) ProtoMessage() {}

func (x *GetAgentRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[48]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetAgentRequest.ProtoReflect.Descriptor instead.
func (*GetAgentRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{48}
}

func (x *GetAgentRequest) GetAgentId() string {
	if x != nil {
		return x.AgentId
	}
	return ""
}

// Agent mirrors HTTP's agentResponse. Status is a string (running |
// completed | failed | cancelled) so the wire stays compatible with
// future status additions without regen.
type Agent struct {
	state           protoimpl.MessageState `protogen:"open.v1"`
	AgentId         string                 `protobuf:"bytes,1,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
	RunId           string                 `protobuf:"bytes,2,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	SessionId       string                 `protobuf:"bytes,3,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
	UserId          string                 `protobuf:"bytes,4,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	ParentAgentId   string                 `protobuf:"bytes,5,opt,name=parent_agent_id,json=parentAgentId,proto3" json:"parent_agent_id,omitempty"`
	Status          string                 `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"`
	StartedAt       *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"`
	CompletedAt     *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=completed_at,json=completedAt,proto3" json:"completed_at,omitempty"`
	StopReason      string                 `protobuf:"bytes,9,opt,name=stop_reason,json=stopReason,proto3" json:"stop_reason,omitempty"`
	Error           string                 `protobuf:"bytes,10,opt,name=error,proto3" json:"error,omitempty"`
	Usage           *AgentUsage            `protobuf:"bytes,11,opt,name=usage,proto3" json:"usage,omitempty"`
	LastHeartbeatAt *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=last_heartbeat_at,json=lastHeartbeatAt,proto3" json:"last_heartbeat_at,omitempty"`
	// Live = true when the agent is still in the cancel registry (i.e.
	// cancellable). Adapters use this to distinguish "running and
	// cancellable" from "running per the row but the registry doesn't
	// know about it" (process restart leaves the latter).
	Live          bool `protobuf:"varint,13,opt,name=live,proto3" json:"live,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Agent) Reset() {
	*x = Agent{}
	mi := &file_loomcycle_proto_msgTypes[49]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Agent) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Agent) ProtoMessage() {}

func (x *Agent) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[49]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Agent.ProtoReflect.Descriptor instead.
func (*Agent) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{49}
}

func (x *Agent) GetAgentId() string {
	if x != nil {
		return x.AgentId
	}
	return ""
}

func (x *Agent) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *Agent) GetSessionId() string {
	if x != nil {
		return x.SessionId
	}
	return ""
}

func (x *Agent) GetUserId() string {
	if x != nil {
		return x.UserId
	}
	return ""
}

func (x *Agent) GetParentAgentId() string {
	if x != nil {
		return x.ParentAgentId
	}
	return ""
}

func (x *Agent) GetStatus() string {
	if x != nil {
		return x.Status
	}
	return ""
}

func (x *Agent) GetStartedAt() *timestamppb.Timestamp {
	if x != nil {
		return x.StartedAt
	}
	return nil
}

func (x *Agent) GetCompletedAt() *timestamppb.Timestamp {
	if x != nil {
		return x.CompletedAt
	}
	return nil
}

func (x *Agent) GetStopReason() string {
	if x != nil {
		return x.StopReason
	}
	return ""
}

func (x *Agent) GetError() string {
	if x != nil {
		return x.Error
	}
	return ""
}

func (x *Agent) GetUsage() *AgentUsage {
	if x != nil {
		return x.Usage
	}
	return nil
}

func (x *Agent) GetLastHeartbeatAt() *timestamppb.Timestamp {
	if x != nil {
		return x.LastHeartbeatAt
	}
	return nil
}

func (x *Agent) GetLive() bool {
	if x != nil {
		return x.Live
	}
	return false
}

// AgentUsage mirrors agentResponseUsage.
type AgentUsage struct {
	state               protoimpl.MessageState `protogen:"open.v1"`
	InputTokens         int64                  `protobuf:"varint,1,opt,name=input_tokens,json=inputTokens,proto3" json:"input_tokens,omitempty"`
	OutputTokens        int64                  `protobuf:"varint,2,opt,name=output_tokens,json=outputTokens,proto3" json:"output_tokens,omitempty"`
	CacheCreationTokens int64                  `protobuf:"varint,3,opt,name=cache_creation_tokens,json=cacheCreationTokens,proto3" json:"cache_creation_tokens,omitempty"`
	CacheReadTokens     int64                  `protobuf:"varint,4,opt,name=cache_read_tokens,json=cacheReadTokens,proto3" json:"cache_read_tokens,omitempty"`
	Model               string                 `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"`
	unknownFields       protoimpl.UnknownFields
	sizeCache           protoimpl.SizeCache
}

func (x *AgentUsage) Reset() {
	*x = AgentUsage{}
	mi := &file_loomcycle_proto_msgTypes[50]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AgentUsage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AgentUsage) ProtoMessage() {}

func (x *AgentUsage) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[50]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AgentUsage.ProtoReflect.Descriptor instead.
func (*AgentUsage) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{50}
}

func (x *AgentUsage) GetInputTokens() int64 {
	if x != nil {
		return x.InputTokens
	}
	return 0
}

func (x *AgentUsage) GetOutputTokens() int64 {
	if x != nil {
		return x.OutputTokens
	}
	return 0
}

func (x *AgentUsage) GetCacheCreationTokens() int64 {
	if x != nil {
		return x.CacheCreationTokens
	}
	return 0
}

func (x *AgentUsage) GetCacheReadTokens() int64 {
	if x != nil {
		return x.CacheReadTokens
	}
	return 0
}

func (x *AgentUsage) GetModel() string {
	if x != nil {
		return x.Model
	}
	return ""
}

type CancelAgentRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	AgentId       string                 `protobuf:"bytes,1,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
	Reason        string                 `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *CancelAgentRequest) Reset() {
	*x = CancelAgentRequest{}
	mi := &file_loomcycle_proto_msgTypes[51]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CancelAgentRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CancelAgentRequest) ProtoMessage() {}

func (x *CancelAgentRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[51]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CancelAgentRequest.ProtoReflect.Descriptor instead.
func (*CancelAgentRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{51}
}

func (x *CancelAgentRequest) GetAgentId() string {
	if x != nil {
		return x.AgentId
	}
	return ""
}

func (x *CancelAgentRequest) GetReason() string {
	if x != nil {
		return x.Reason
	}
	return ""
}

type CancelAgentResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// cancelled_count is the number of agents (this one plus any
	// descendants reached via parent_agent_id walk) marked cancelled.
	CancelledCount int32 `protobuf:"varint,1,opt,name=cancelled_count,json=cancelledCount,proto3" json:"cancelled_count,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *CancelAgentResponse) Reset() {
	*x = CancelAgentResponse{}
	mi := &file_loomcycle_proto_msgTypes[52]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CancelAgentResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CancelAgentResponse) ProtoMessage() {}

func (x *CancelAgentResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[52]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CancelAgentResponse.ProtoReflect.Descriptor instead.
func (*CancelAgentResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{52}
}

func (x *CancelAgentResponse) GetCancelledCount() int32 {
	if x != nil {
		return x.CancelledCount
	}
	return 0
}

type ListUserAgentsRequest struct {
	state  protoimpl.MessageState `protogen:"open.v1"`
	UserId string                 `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	// Optional status filter ("running" | "completed" | "failed" |
	// "cancelled"). Empty → all statuses.
	Status        string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ListUserAgentsRequest) Reset() {
	*x = ListUserAgentsRequest{}
	mi := &file_loomcycle_proto_msgTypes[53]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ListUserAgentsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListUserAgentsRequest) ProtoMessage() {}

func (x *ListUserAgentsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[53]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListUserAgentsRequest.ProtoReflect.Descriptor instead.
func (*ListUserAgentsRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{53}
}

func (x *ListUserAgentsRequest) GetUserId() string {
	if x != nil {
		return x.UserId
	}
	return ""
}

func (x *ListUserAgentsRequest) GetStatus() string {
	if x != nil {
		return x.Status
	}
	return ""
}

type ListUserAgentsResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Agents        []*Agent               `protobuf:"bytes,1,rep,name=agents,proto3" json:"agents,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ListUserAgentsResponse) Reset() {
	*x = ListUserAgentsResponse{}
	mi := &file_loomcycle_proto_msgTypes[54]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ListUserAgentsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListUserAgentsResponse) ProtoMessage() {}

func (x *ListUserAgentsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[54]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListUserAgentsResponse.ProtoReflect.Descriptor instead.
func (*ListUserAgentsResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{54}
}

func (x *ListUserAgentsResponse) GetAgents() []*Agent {
	if x != nil {
		return x.Agents
	}
	return nil
}

// UsageReportRequest mirrors GET /v1/_usage query params. group_by is a subset
// of {tenant,user,provider,model,source}; an unknown dimension is rejected. from
// / to are RFC3339 (empty = unbounded). tenant is an admin-only focus (ignored
// for a scoped principal, which is confined to its own tenant).
type UsageReportRequest struct {
	state   protoimpl.MessageState `protogen:"open.v1"`
	GroupBy []string               `protobuf:"bytes,1,rep,name=group_by,json=groupBy,proto3" json:"group_by,omitempty"`
	// RFC3339 window bounds (empty = unbounded). Named *_time (not from/to) so the
	// generated Python field names don't collide with the `from` keyword.
	FromTime      string `protobuf:"bytes,2,opt,name=from_time,json=fromTime,proto3" json:"from_time,omitempty"`
	ToTime        string `protobuf:"bytes,3,opt,name=to_time,json=toTime,proto3" json:"to_time,omitempty"`
	Tenant        string `protobuf:"bytes,4,opt,name=tenant,proto3" json:"tenant,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *UsageReportRequest) Reset() {
	*x = UsageReportRequest{}
	mi := &file_loomcycle_proto_msgTypes[55]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *UsageReportRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UsageReportRequest) ProtoMessage() {}

func (x *UsageReportRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[55]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UsageReportRequest.ProtoReflect.Descriptor instead.
func (*UsageReportRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{55}
}

func (x *UsageReportRequest) GetGroupBy() []string {
	if x != nil {
		return x.GroupBy
	}
	return nil
}

func (x *UsageReportRequest) GetFromTime() string {
	if x != nil {
		return x.FromTime
	}
	return ""
}

func (x *UsageReportRequest) GetToTime() string {
	if x != nil {
		return x.ToTime
	}
	return ""
}

func (x *UsageReportRequest) GetTenant() string {
	if x != nil {
		return x.Tenant
	}
	return ""
}

// UsageAggregate is one grouped row; only the grouped dimensions are populated.
type UsageAggregate struct {
	state               protoimpl.MessageState `protogen:"open.v1"`
	TenantId            string                 `protobuf:"bytes,1,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"`
	UserId              string                 `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	Provider            string                 `protobuf:"bytes,3,opt,name=provider,proto3" json:"provider,omitempty"`
	Model               string                 `protobuf:"bytes,4,opt,name=model,proto3" json:"model,omitempty"`
	CredentialSource    string                 `protobuf:"bytes,5,opt,name=credential_source,json=credentialSource,proto3" json:"credential_source,omitempty"`
	InputTokens         int64                  `protobuf:"varint,6,opt,name=input_tokens,json=inputTokens,proto3" json:"input_tokens,omitempty"`
	OutputTokens        int64                  `protobuf:"varint,7,opt,name=output_tokens,json=outputTokens,proto3" json:"output_tokens,omitempty"`
	CacheCreationTokens int64                  `protobuf:"varint,8,opt,name=cache_creation_tokens,json=cacheCreationTokens,proto3" json:"cache_creation_tokens,omitempty"`
	CacheReadTokens     int64                  `protobuf:"varint,9,opt,name=cache_read_tokens,json=cacheReadTokens,proto3" json:"cache_read_tokens,omitempty"`
	Cost                float64                `protobuf:"fixed64,10,opt,name=cost,proto3" json:"cost,omitempty"`
	Currency            string                 `protobuf:"bytes,11,opt,name=currency,proto3" json:"currency,omitempty"`
	CallCount           int64                  `protobuf:"varint,12,opt,name=call_count,json=callCount,proto3" json:"call_count,omitempty"`
	UnpricedCalls       int64                  `protobuf:"varint,13,opt,name=unpriced_calls,json=unpricedCalls,proto3" json:"unpriced_calls,omitempty"`
	unknownFields       protoimpl.UnknownFields
	sizeCache           protoimpl.SizeCache
}

func (x *UsageAggregate) Reset() {
	*x = UsageAggregate{}
	mi := &file_loomcycle_proto_msgTypes[56]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *UsageAggregate) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UsageAggregate) ProtoMessage() {}

func (x *UsageAggregate) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[56]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UsageAggregate.ProtoReflect.Descriptor instead.
func (*UsageAggregate) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{56}
}

func (x *UsageAggregate) GetTenantId() string {
	if x != nil {
		return x.TenantId
	}
	return ""
}

func (x *UsageAggregate) GetUserId() string {
	if x != nil {
		return x.UserId
	}
	return ""
}

func (x *UsageAggregate) GetProvider() string {
	if x != nil {
		return x.Provider
	}
	return ""
}

func (x *UsageAggregate) GetModel() string {
	if x != nil {
		return x.Model
	}
	return ""
}

func (x *UsageAggregate) GetCredentialSource() string {
	if x != nil {
		return x.CredentialSource
	}
	return ""
}

func (x *UsageAggregate) GetInputTokens() int64 {
	if x != nil {
		return x.InputTokens
	}
	return 0
}

func (x *UsageAggregate) GetOutputTokens() int64 {
	if x != nil {
		return x.OutputTokens
	}
	return 0
}

func (x *UsageAggregate) GetCacheCreationTokens() int64 {
	if x != nil {
		return x.CacheCreationTokens
	}
	return 0
}

func (x *UsageAggregate) GetCacheReadTokens() int64 {
	if x != nil {
		return x.CacheReadTokens
	}
	return 0
}

func (x *UsageAggregate) GetCost() float64 {
	if x != nil {
		return x.Cost
	}
	return 0
}

func (x *UsageAggregate) GetCurrency() string {
	if x != nil {
		return x.Currency
	}
	return ""
}

func (x *UsageAggregate) GetCallCount() int64 {
	if x != nil {
		return x.CallCount
	}
	return 0
}

func (x *UsageAggregate) GetUnpricedCalls() int64 {
	if x != nil {
		return x.UnpricedCalls
	}
	return 0
}

type UsageReportResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	GroupBy       []string               `protobuf:"bytes,1,rep,name=group_by,json=groupBy,proto3" json:"group_by,omitempty"`
	Rows          []*UsageAggregate      `protobuf:"bytes,2,rep,name=rows,proto3" json:"rows,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *UsageReportResponse) Reset() {
	*x = UsageReportResponse{}
	mi := &file_loomcycle_proto_msgTypes[57]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *UsageReportResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UsageReportResponse) ProtoMessage() {}

func (x *UsageReportResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[57]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UsageReportResponse.ProtoReflect.Descriptor instead.
func (*UsageReportResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{57}
}

func (x *UsageReportResponse) GetGroupBy() []string {
	if x != nil {
		return x.GroupBy
	}
	return nil
}

func (x *UsageReportResponse) GetRows() []*UsageAggregate {
	if x != nil {
		return x.Rows
	}
	return nil
}

// TokenLimitRequest is the op-based token-budget management RPC (RFC AW),
// mirroring GET/PUT/DELETE /v1/_limits. op ∈ {list,set,delete}:
//   - list:   returns every budget the caller may see (tenant-scoped). scope /
//     scope_id / soft_limit / hard_limit ignored; tenant is an
//     admin-only focus (ignored for a scoped principal).
//   - set:    upserts one budget row for (scope, scope_id). soft_limit /
//     hard_limit are optional — PRESENT sets that tier, ABSENT clears it
//     (unlimited on that axis), so a full-row upsert matches the HTTP
//     PUT semantics (soft_limit:0 is a real zero ceiling ≠ unset).
//   - delete: removes the budget for (scope, scope_id) → that scope is unlimited.
//
// scope is "operator" | "tenant" | "user"; scope_id is the user subject for
// scope=user, empty otherwise. tenant is the target tenant (admin only; a
// scoped caller is confined to its own tenant regardless of this field).
type TokenLimitRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Op            string                 `protobuf:"bytes,1,opt,name=op,proto3" json:"op,omitempty"` // "list" | "set" | "delete"
	Tenant        string                 `protobuf:"bytes,2,opt,name=tenant,proto3" json:"tenant,omitempty"`
	Scope         string                 `protobuf:"bytes,3,opt,name=scope,proto3" json:"scope,omitempty"`
	ScopeId       string                 `protobuf:"bytes,4,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"`
	SoftLimit     *int64                 `protobuf:"varint,5,opt,name=soft_limit,json=softLimit,proto3,oneof" json:"soft_limit,omitempty"` // present = set that tier, absent = unset (unlimited)
	HardLimit     *int64                 `protobuf:"varint,6,opt,name=hard_limit,json=hardLimit,proto3,oneof" json:"hard_limit,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *TokenLimitRequest) Reset() {
	*x = TokenLimitRequest{}
	mi := &file_loomcycle_proto_msgTypes[58]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *TokenLimitRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TokenLimitRequest) ProtoMessage() {}

func (x *TokenLimitRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[58]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TokenLimitRequest.ProtoReflect.Descriptor instead.
func (*TokenLimitRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{58}
}

func (x *TokenLimitRequest) GetOp() string {
	if x != nil {
		return x.Op
	}
	return ""
}

func (x *TokenLimitRequest) GetTenant() string {
	if x != nil {
		return x.Tenant
	}
	return ""
}

func (x *TokenLimitRequest) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *TokenLimitRequest) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *TokenLimitRequest) GetSoftLimit() int64 {
	if x != nil && x.SoftLimit != nil {
		return *x.SoftLimit
	}
	return 0
}

func (x *TokenLimitRequest) GetHardLimit() int64 {
	if x != nil && x.HardLimit != nil {
		return *x.HardLimit
	}
	return 0
}

// TokenLimitEntry is one token_limits row plus its live month-to-date usage.
// soft_limit / hard_limit are optional: absent = that tier unset (no ceiling).
type TokenLimitEntry struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	TenantId      string                 `protobuf:"bytes,1,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"`
	Scope         string                 `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	ScopeId       string                 `protobuf:"bytes,3,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"`
	SoftLimit     *int64                 `protobuf:"varint,4,opt,name=soft_limit,json=softLimit,proto3,oneof" json:"soft_limit,omitempty"`
	HardLimit     *int64                 `protobuf:"varint,5,opt,name=hard_limit,json=hardLimit,proto3,oneof" json:"hard_limit,omitempty"`
	Used          int64                  `protobuf:"varint,6,opt,name=used,proto3" json:"used,omitempty"`                           // scope's current month-to-date token total
	UpdatedAt     string                 `protobuf:"bytes,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` // RFC3339 (empty when unknown)
	UpdatedBy     string                 `protobuf:"bytes,8,opt,name=updated_by,json=updatedBy,proto3" json:"updated_by,omitempty"` // principal subject that last wrote the row
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *TokenLimitEntry) Reset() {
	*x = TokenLimitEntry{}
	mi := &file_loomcycle_proto_msgTypes[59]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *TokenLimitEntry) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TokenLimitEntry) ProtoMessage() {}

func (x *TokenLimitEntry) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[59]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TokenLimitEntry.ProtoReflect.Descriptor instead.
func (*TokenLimitEntry) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{59}
}

func (x *TokenLimitEntry) GetTenantId() string {
	if x != nil {
		return x.TenantId
	}
	return ""
}

func (x *TokenLimitEntry) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *TokenLimitEntry) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *TokenLimitEntry) GetSoftLimit() int64 {
	if x != nil && x.SoftLimit != nil {
		return *x.SoftLimit
	}
	return 0
}

func (x *TokenLimitEntry) GetHardLimit() int64 {
	if x != nil && x.HardLimit != nil {
		return *x.HardLimit
	}
	return 0
}

func (x *TokenLimitEntry) GetUsed() int64 {
	if x != nil {
		return x.Used
	}
	return 0
}

func (x *TokenLimitEntry) GetUpdatedAt() string {
	if x != nil {
		return x.UpdatedAt
	}
	return ""
}

func (x *TokenLimitEntry) GetUpdatedBy() string {
	if x != nil {
		return x.UpdatedBy
	}
	return ""
}

// TokenLimitResponse carries the caller-visible budgets. Always populated for
// op=list; for op=set it echoes the written row; empty for op=delete.
type TokenLimitResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Limits        []*TokenLimitEntry     `protobuf:"bytes,1,rep,name=limits,proto3" json:"limits,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *TokenLimitResponse) Reset() {
	*x = TokenLimitResponse{}
	mi := &file_loomcycle_proto_msgTypes[60]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *TokenLimitResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TokenLimitResponse) ProtoMessage() {}

func (x *TokenLimitResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[60]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TokenLimitResponse.ProtoReflect.Descriptor instead.
func (*TokenLimitResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{60}
}

func (x *TokenLimitResponse) GetLimits() []*TokenLimitEntry {
	if x != nil {
		return x.Limits
	}
	return nil
}

type ConfigRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ConfigRequest) Reset() {
	*x = ConfigRequest{}
	mi := &file_loomcycle_proto_msgTypes[61]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ConfigRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ConfigRequest) ProtoMessage() {}

func (x *ConfigRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[61]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ConfigRequest.ProtoReflect.Descriptor instead.
func (*ConfigRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{61}
}

// ConfigResponse carries the report as raw JSON rather than a typed message.
//
// Two reasons, both structural. The report's `features` values change SHAPE by
// disclosure level — nested objects for an authenticated caller, plain booleans
// for a public one — which no single proto message expresses honestly. And the
// matrix grows as the runtime gains subsystems, so a typed mirror would need a
// proto field per capability, in lockstep, forever; a client that wants a new
// capability's flag would need a regenerated stub to see a boolean. Passing the
// JSON through means gRPC and HTTP cannot serialize the same report differently,
// which is the same anti-drift reason the capability probe itself is shared.
//
// This follows the SubstrateResponse precedent (bytes output_json) already used
// by fourteen RPCs.
type ConfigResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	ConfigJson    []byte                 `protobuf:"bytes,1,opt,name=config_json,json=configJson,proto3" json:"config_json,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ConfigResponse) Reset() {
	*x = ConfigResponse{}
	mi := &file_loomcycle_proto_msgTypes[62]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ConfigResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ConfigResponse) ProtoMessage() {}

func (x *ConfigResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[62]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ConfigResponse.ProtoReflect.Descriptor instead.
func (*ConfigResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{62}
}

func (x *ConfigResponse) GetConfigJson() []byte {
	if x != nil {
		return x.ConfigJson
	}
	return nil
}

type HealthRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *HealthRequest) Reset() {
	*x = HealthRequest{}
	mi := &file_loomcycle_proto_msgTypes[63]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *HealthRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HealthRequest) ProtoMessage() {}

func (x *HealthRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[63]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HealthRequest.ProtoReflect.Descriptor instead.
func (*HealthRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{63}
}

type HealthResponse struct {
	state  protoimpl.MessageState `protogen:"open.v1"`
	Ok     bool                   `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"`
	Commit string                 `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"`
	Built  string                 `protobuf:"bytes,3,opt,name=built,proto3" json:"built,omitempty"`
	// Uptime in seconds since process start.
	UptimeSeconds int64 `protobuf:"varint,4,opt,name=uptime_seconds,json=uptimeSeconds,proto3" json:"uptime_seconds,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *HealthResponse) Reset() {
	*x = HealthResponse{}
	mi := &file_loomcycle_proto_msgTypes[64]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *HealthResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HealthResponse) ProtoMessage() {}

func (x *HealthResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[64]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HealthResponse.ProtoReflect.Descriptor instead.
func (*HealthResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{64}
}

func (x *HealthResponse) GetOk() bool {
	if x != nil {
		return x.Ok
	}
	return false
}

func (x *HealthResponse) GetCommit() string {
	if x != nil {
		return x.Commit
	}
	return ""
}

func (x *HealthResponse) GetBuilt() string {
	if x != nil {
		return x.Built
	}
	return ""
}

func (x *HealthResponse) GetUptimeSeconds() int64 {
	if x != nil {
		return x.UptimeSeconds
	}
	return 0
}

type RegisterHookRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// App UID; (owner, name) is the identity tuple. Re-registering the
	// same pair replaces the prior registration with a fresh id.
	Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner,omitempty"`
	Name  string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// "pre" | "post". Anything else → InvalidArgument.
	Phase string `protobuf:"bytes,3,opt,name=phase,proto3" json:"phase,omitempty"`
	// Agent name globs (exact match or trailing-* prefix). Empty list
	// matches every agent (equivalent to ["*"]).
	Agents []string `protobuf:"bytes,4,rep,name=agents,proto3" json:"agents,omitempty"`
	// Tool name globs (same syntax as agents). Empty matches every tool.
	Tools []string `protobuf:"bytes,5,rep,name=tools,proto3" json:"tools,omitempty"`
	// http:// or https:// endpoint the consumer runs. The dispatcher
	// POSTs PreHookCall / PostHookCall payloads here.
	CallbackUrl string `protobuf:"bytes,6,opt,name=callback_url,json=callbackUrl,proto3" json:"callback_url,omitempty"`
	// "open" (default) | "closed". Open = webhook errors pass through;
	// closed = errors fail the tool call with IsError=true.
	FailMode string `protobuf:"bytes,7,opt,name=fail_mode,json=failMode,proto3" json:"fail_mode,omitempty"`
	// Per-call timeout. 0 = registry default (5 s).
	TimeoutMs     int32 `protobuf:"varint,8,opt,name=timeout_ms,json=timeoutMs,proto3" json:"timeout_ms,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *RegisterHookRequest) Reset() {
	*x = RegisterHookRequest{}
	mi := &file_loomcycle_proto_msgTypes[65]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RegisterHookRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RegisterHookRequest) ProtoMessage() {}

func (x *RegisterHookRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[65]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RegisterHookRequest.ProtoReflect.Descriptor instead.
func (*RegisterHookRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{65}
}

func (x *RegisterHookRequest) GetOwner() string {
	if x != nil {
		return x.Owner
	}
	return ""
}

func (x *RegisterHookRequest) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *RegisterHookRequest) GetPhase() string {
	if x != nil {
		return x.Phase
	}
	return ""
}

func (x *RegisterHookRequest) GetAgents() []string {
	if x != nil {
		return x.Agents
	}
	return nil
}

func (x *RegisterHookRequest) GetTools() []string {
	if x != nil {
		return x.Tools
	}
	return nil
}

func (x *RegisterHookRequest) GetCallbackUrl() string {
	if x != nil {
		return x.CallbackUrl
	}
	return ""
}

func (x *RegisterHookRequest) GetFailMode() string {
	if x != nil {
		return x.FailMode
	}
	return ""
}

func (x *RegisterHookRequest) GetTimeoutMs() int32 {
	if x != nil {
		return x.TimeoutMs
	}
	return 0
}

type RegisterHookResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Loomcycle-assigned id. Caller uses this on DeleteHook.
	Id            string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *RegisterHookResponse) Reset() {
	*x = RegisterHookResponse{}
	mi := &file_loomcycle_proto_msgTypes[66]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RegisterHookResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RegisterHookResponse) ProtoMessage() {}

func (x *RegisterHookResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[66]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RegisterHookResponse.ProtoReflect.Descriptor instead.
func (*RegisterHookResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{66}
}

func (x *RegisterHookResponse) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

type ListHooksRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ListHooksRequest) Reset() {
	*x = ListHooksRequest{}
	mi := &file_loomcycle_proto_msgTypes[67]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ListHooksRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListHooksRequest) ProtoMessage() {}

func (x *ListHooksRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[67]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListHooksRequest.ProtoReflect.Descriptor instead.
func (*ListHooksRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{67}
}

// Hook mirrors hooks.Hook for the wire — the full descriptor as it
// lives in the in-memory registry. The bool `Timeout` is the resolved
// duration; we don't surface it on the wire (callers care about
// timeout_ms which is the source).
type Hook struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Id            string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Owner         string                 `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"`
	Name          string                 `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	Phase         string                 `protobuf:"bytes,4,opt,name=phase,proto3" json:"phase,omitempty"`
	Agents        []string               `protobuf:"bytes,5,rep,name=agents,proto3" json:"agents,omitempty"`
	Tools         []string               `protobuf:"bytes,6,rep,name=tools,proto3" json:"tools,omitempty"`
	CallbackUrl   string                 `protobuf:"bytes,7,opt,name=callback_url,json=callbackUrl,proto3" json:"callback_url,omitempty"`
	FailMode      string                 `protobuf:"bytes,8,opt,name=fail_mode,json=failMode,proto3" json:"fail_mode,omitempty"`
	TimeoutMs     int32                  `protobuf:"varint,9,opt,name=timeout_ms,json=timeoutMs,proto3" json:"timeout_ms,omitempty"`
	RegisteredAt  *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=registered_at,json=registeredAt,proto3" json:"registered_at,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Hook) Reset() {
	*x = Hook{}
	mi := &file_loomcycle_proto_msgTypes[68]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Hook) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Hook) ProtoMessage() {}

func (x *Hook) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[68]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Hook.ProtoReflect.Descriptor instead.
func (*Hook) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{68}
}

func (x *Hook) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (x *Hook) GetOwner() string {
	if x != nil {
		return x.Owner
	}
	return ""
}

func (x *Hook) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Hook) GetPhase() string {
	if x != nil {
		return x.Phase
	}
	return ""
}

func (x *Hook) GetAgents() []string {
	if x != nil {
		return x.Agents
	}
	return nil
}

func (x *Hook) GetTools() []string {
	if x != nil {
		return x.Tools
	}
	return nil
}

func (x *Hook) GetCallbackUrl() string {
	if x != nil {
		return x.CallbackUrl
	}
	return ""
}

func (x *Hook) GetFailMode() string {
	if x != nil {
		return x.FailMode
	}
	return ""
}

func (x *Hook) GetTimeoutMs() int32 {
	if x != nil {
		return x.TimeoutMs
	}
	return 0
}

func (x *Hook) GetRegisteredAt() *timestamppb.Timestamp {
	if x != nil {
		return x.RegisteredAt
	}
	return nil
}

type ListHooksResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Hooks         []*Hook                `protobuf:"bytes,1,rep,name=hooks,proto3" json:"hooks,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ListHooksResponse) Reset() {
	*x = ListHooksResponse{}
	mi := &file_loomcycle_proto_msgTypes[69]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ListHooksResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListHooksResponse) ProtoMessage() {}

func (x *ListHooksResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[69]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListHooksResponse.ProtoReflect.Descriptor instead.
func (*ListHooksResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{69}
}

func (x *ListHooksResponse) GetHooks() []*Hook {
	if x != nil {
		return x.Hooks
	}
	return nil
}

type DeleteHookRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Id            string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DeleteHookRequest) Reset() {
	*x = DeleteHookRequest{}
	mi := &file_loomcycle_proto_msgTypes[70]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DeleteHookRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeleteHookRequest) ProtoMessage() {}

func (x *DeleteHookRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[70]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeleteHookRequest.ProtoReflect.Descriptor instead.
func (*DeleteHookRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{70}
}

func (x *DeleteHookRequest) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

type DeleteHookResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Echoed id of the deleted hook. Empty when no row matched (the
	// RPC returns codes.NotFound in that case; this field is for the
	// success path's audit trail).
	Deleted       string `protobuf:"bytes,1,opt,name=deleted,proto3" json:"deleted,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DeleteHookResponse) Reset() {
	*x = DeleteHookResponse{}
	mi := &file_loomcycle_proto_msgTypes[71]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DeleteHookResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeleteHookResponse) ProtoMessage() {}

func (x *DeleteHookResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[71]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeleteHookResponse.ProtoReflect.Descriptor instead.
func (*DeleteHookResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{71}
}

func (x *DeleteHookResponse) GetDeleted() string {
	if x != nil {
		return x.Deleted
	}
	return ""
}

type PauseRuntimeRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Wait-for-non-idempotent-tools cap, in milliseconds. 0 falls
	// through to LOOMCYCLE_PAUSE_DEFAULT_TIMEOUT_MS (default 30 s).
	// Clamped server-side at pause.MaxPauseTimeout (5 min). int64
	// for consistency with every other _ms field in this proto
	// (duration_ms in PauseRuntimeResponse, wait_ms in Retry) —
	// server clamping makes the larger range unobservable but the
	// type matches.
	TimeoutMs     int64 `protobuf:"varint,1,opt,name=timeout_ms,json=timeoutMs,proto3" json:"timeout_ms,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *PauseRuntimeRequest) Reset() {
	*x = PauseRuntimeRequest{}
	mi := &file_loomcycle_proto_msgTypes[72]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PauseRuntimeRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PauseRuntimeRequest) ProtoMessage() {}

func (x *PauseRuntimeRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[72]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PauseRuntimeRequest.ProtoReflect.Descriptor instead.
func (*PauseRuntimeRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{72}
}

func (x *PauseRuntimeRequest) GetTimeoutMs() int64 {
	if x != nil {
		return x.TimeoutMs
	}
	return 0
}

type PauseRuntimeResponse struct {
	state               protoimpl.MessageState `protogen:"open.v1"`
	Status              string                 `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` // "paused"
	DurationMs          int64                  `protobuf:"varint,2,opt,name=duration_ms,json=durationMs,proto3" json:"duration_ms,omitempty"`
	ForceCancelledCount int32                  `protobuf:"varint,3,opt,name=force_cancelled_count,json=forceCancelledCount,proto3" json:"force_cancelled_count,omitempty"`
	PausedRunsCount     int32                  `protobuf:"varint,4,opt,name=paused_runs_count,json=pausedRunsCount,proto3" json:"paused_runs_count,omitempty"`
	Warnings            []string               `protobuf:"bytes,5,rep,name=warnings,proto3" json:"warnings,omitempty"`
	unknownFields       protoimpl.UnknownFields
	sizeCache           protoimpl.SizeCache
}

func (x *PauseRuntimeResponse) Reset() {
	*x = PauseRuntimeResponse{}
	mi := &file_loomcycle_proto_msgTypes[73]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PauseRuntimeResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PauseRuntimeResponse) ProtoMessage() {}

func (x *PauseRuntimeResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[73]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PauseRuntimeResponse.ProtoReflect.Descriptor instead.
func (*PauseRuntimeResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{73}
}

func (x *PauseRuntimeResponse) GetStatus() string {
	if x != nil {
		return x.Status
	}
	return ""
}

func (x *PauseRuntimeResponse) GetDurationMs() int64 {
	if x != nil {
		return x.DurationMs
	}
	return 0
}

func (x *PauseRuntimeResponse) GetForceCancelledCount() int32 {
	if x != nil {
		return x.ForceCancelledCount
	}
	return 0
}

func (x *PauseRuntimeResponse) GetPausedRunsCount() int32 {
	if x != nil {
		return x.PausedRunsCount
	}
	return 0
}

func (x *PauseRuntimeResponse) GetWarnings() []string {
	if x != nil {
		return x.Warnings
	}
	return nil
}

type ResumeRuntimeRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ResumeRuntimeRequest) Reset() {
	*x = ResumeRuntimeRequest{}
	mi := &file_loomcycle_proto_msgTypes[74]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ResumeRuntimeRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResumeRuntimeRequest) ProtoMessage() {}

func (x *ResumeRuntimeRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[74]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResumeRuntimeRequest.ProtoReflect.Descriptor instead.
func (*ResumeRuntimeRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{74}
}

type ResumeRuntimeResponse struct {
	state           protoimpl.MessageState `protogen:"open.v1"`
	Status          string                 `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` // "running"
	ResumedRunCount int32                  `protobuf:"varint,2,opt,name=resumed_run_count,json=resumedRunCount,proto3" json:"resumed_run_count,omitempty"`
	Warnings        []string               `protobuf:"bytes,3,rep,name=warnings,proto3" json:"warnings,omitempty"`
	unknownFields   protoimpl.UnknownFields
	sizeCache       protoimpl.SizeCache
}

func (x *ResumeRuntimeResponse) Reset() {
	*x = ResumeRuntimeResponse{}
	mi := &file_loomcycle_proto_msgTypes[75]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ResumeRuntimeResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResumeRuntimeResponse) ProtoMessage() {}

func (x *ResumeRuntimeResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[75]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResumeRuntimeResponse.ProtoReflect.Descriptor instead.
func (*ResumeRuntimeResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{75}
}

func (x *ResumeRuntimeResponse) GetStatus() string {
	if x != nil {
		return x.Status
	}
	return ""
}

func (x *ResumeRuntimeResponse) GetResumedRunCount() int32 {
	if x != nil {
		return x.ResumedRunCount
	}
	return 0
}

func (x *ResumeRuntimeResponse) GetWarnings() []string {
	if x != nil {
		return x.Warnings
	}
	return nil
}

type GetRuntimeStateRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *GetRuntimeStateRequest) Reset() {
	*x = GetRuntimeStateRequest{}
	mi := &file_loomcycle_proto_msgTypes[76]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *GetRuntimeStateRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetRuntimeStateRequest) ProtoMessage() {}

func (x *GetRuntimeStateRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[76]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetRuntimeStateRequest.ProtoReflect.Descriptor instead.
func (*GetRuntimeStateRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{76}
}

type RuntimeStateResponse struct {
	state          protoimpl.MessageState `protogen:"open.v1"`
	Status         string                 `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` // "running" | "pausing" | "paused"
	PausedAt       *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=paused_at,json=pausedAt,proto3" json:"paused_at,omitempty"`
	PausedRunCount int32                  `protobuf:"varint,3,opt,name=paused_run_count,json=pausedRunCount,proto3" json:"paused_run_count,omitempty"`
	SnapshotsCount int32                  `protobuf:"varint,4,opt,name=snapshots_count,json=snapshotsCount,proto3" json:"snapshots_count,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *RuntimeStateResponse) Reset() {
	*x = RuntimeStateResponse{}
	mi := &file_loomcycle_proto_msgTypes[77]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RuntimeStateResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RuntimeStateResponse) ProtoMessage() {}

func (x *RuntimeStateResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[77]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RuntimeStateResponse.ProtoReflect.Descriptor instead.
func (*RuntimeStateResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{77}
}

func (x *RuntimeStateResponse) GetStatus() string {
	if x != nil {
		return x.Status
	}
	return ""
}

func (x *RuntimeStateResponse) GetPausedAt() *timestamppb.Timestamp {
	if x != nil {
		return x.PausedAt
	}
	return nil
}

func (x *RuntimeStateResponse) GetPausedRunCount() int32 {
	if x != nil {
		return x.PausedRunCount
	}
	return 0
}

func (x *RuntimeStateResponse) GetSnapshotsCount() int32 {
	if x != nil {
		return x.SnapshotsCount
	}
	return 0
}

type ResolveProbeRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ResolveProbeRequest) Reset() {
	*x = ResolveProbeRequest{}
	mi := &file_loomcycle_proto_msgTypes[78]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ResolveProbeRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResolveProbeRequest) ProtoMessage() {}

func (x *ResolveProbeRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[78]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResolveProbeRequest.ProtoReflect.Descriptor instead.
func (*ResolveProbeRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{78}
}

// ResolverMatrixResponse mirrors the GET /v1/_resolver wire shape —
// the availability matrix captured right after a forced re-probe.
type ResolverMatrixResponse struct {
	state         protoimpl.MessageState                   `protogen:"open.v1"`
	GeneratedAt   *timestamppb.Timestamp                   `protobuf:"bytes,1,opt,name=generated_at,json=generatedAt,proto3" json:"generated_at,omitempty"`
	Providers     map[string]*ResolverProviderAvailability `protobuf:"bytes,2,rep,name=providers,proto3" json:"providers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ResolverMatrixResponse) Reset() {
	*x = ResolverMatrixResponse{}
	mi := &file_loomcycle_proto_msgTypes[79]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ResolverMatrixResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResolverMatrixResponse) ProtoMessage() {}

func (x *ResolverMatrixResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[79]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResolverMatrixResponse.ProtoReflect.Descriptor instead.
func (*ResolverMatrixResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{79}
}

func (x *ResolverMatrixResponse) GetGeneratedAt() *timestamppb.Timestamp {
	if x != nil {
		return x.GeneratedAt
	}
	return nil
}

func (x *ResolverMatrixResponse) GetProviders() map[string]*ResolverProviderAvailability {
	if x != nil {
		return x.Providers
	}
	return nil
}

type ResolverProviderAvailability struct {
	state         protoimpl.MessageState          `protogen:"open.v1"`
	Excluded      bool                            `protobuf:"varint,1,opt,name=excluded,proto3" json:"excluded,omitempty"`
	Reachable     bool                            `protobuf:"varint,2,opt,name=reachable,proto3" json:"reachable,omitempty"`
	Models        map[string]*ResolverModelStatus `protobuf:"bytes,3,rep,name=models,proto3" json:"models,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	LastCheck     *timestamppb.Timestamp          `protobuf:"bytes,4,opt,name=last_check,json=lastCheck,proto3" json:"last_check,omitempty"`
	LastError     string                          `protobuf:"bytes,5,opt,name=last_error,json=lastError,proto3" json:"last_error,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ResolverProviderAvailability) Reset() {
	*x = ResolverProviderAvailability{}
	mi := &file_loomcycle_proto_msgTypes[80]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ResolverProviderAvailability) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResolverProviderAvailability) ProtoMessage() {}

func (x *ResolverProviderAvailability) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[80]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResolverProviderAvailability.ProtoReflect.Descriptor instead.
func (*ResolverProviderAvailability) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{80}
}

func (x *ResolverProviderAvailability) GetExcluded() bool {
	if x != nil {
		return x.Excluded
	}
	return false
}

func (x *ResolverProviderAvailability) GetReachable() bool {
	if x != nil {
		return x.Reachable
	}
	return false
}

func (x *ResolverProviderAvailability) GetModels() map[string]*ResolverModelStatus {
	if x != nil {
		return x.Models
	}
	return nil
}

func (x *ResolverProviderAvailability) GetLastCheck() *timestamppb.Timestamp {
	if x != nil {
		return x.LastCheck
	}
	return nil
}

func (x *ResolverProviderAvailability) GetLastError() string {
	if x != nil {
		return x.LastError
	}
	return ""
}

type ResolverModelStatus struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Listed        bool                   `protobuf:"varint,1,opt,name=listed,proto3" json:"listed,omitempty"`
	Stalled       bool                   `protobuf:"varint,2,opt,name=stalled,proto3" json:"stalled,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ResolverModelStatus) Reset() {
	*x = ResolverModelStatus{}
	mi := &file_loomcycle_proto_msgTypes[81]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ResolverModelStatus) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ResolverModelStatus) ProtoMessage() {}

func (x *ResolverModelStatus) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[81]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ResolverModelStatus.ProtoReflect.Descriptor instead.
func (*ResolverModelStatus) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{81}
}

func (x *ResolverModelStatus) GetListed() bool {
	if x != nil {
		return x.Listed
	}
	return false
}

func (x *ResolverModelStatus) GetStalled() bool {
	if x != nil {
		return x.Stalled
	}
	return false
}

type CreateSnapshotRequest struct {
	state          protoimpl.MessageState `protogen:"open.v1"`
	IncludeHistory bool                   `protobuf:"varint,1,opt,name=include_history,json=includeHistory,proto3" json:"include_history,omitempty"`
	SinceTs        *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=since_ts,json=sinceTs,proto3" json:"since_ts,omitempty"`
	Description    string                 `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// Override LOOMCYCLE_SNAPSHOT_MAX_BYTES for this call. 0 = default.
	MaxBytes      int64 `protobuf:"varint,4,opt,name=max_bytes,json=maxBytes,proto3" json:"max_bytes,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *CreateSnapshotRequest) Reset() {
	*x = CreateSnapshotRequest{}
	mi := &file_loomcycle_proto_msgTypes[82]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *CreateSnapshotRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CreateSnapshotRequest) ProtoMessage() {}

func (x *CreateSnapshotRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[82]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use CreateSnapshotRequest.ProtoReflect.Descriptor instead.
func (*CreateSnapshotRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{82}
}

func (x *CreateSnapshotRequest) GetIncludeHistory() bool {
	if x != nil {
		return x.IncludeHistory
	}
	return false
}

func (x *CreateSnapshotRequest) GetSinceTs() *timestamppb.Timestamp {
	if x != nil {
		return x.SinceTs
	}
	return nil
}

func (x *CreateSnapshotRequest) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

func (x *CreateSnapshotRequest) GetMaxBytes() int64 {
	if x != nil {
		return x.MaxBytes
	}
	return 0
}

// SnapshotDescriptor is the metadata-only view used by CreateSnapshot
// + ListSnapshots. The full JSON envelope lives in GetSnapshot /
// ExportSnapshot responses.
type SnapshotDescriptor struct {
	state           protoimpl.MessageState `protogen:"open.v1"`
	SnapshotId      string                 `protobuf:"bytes,1,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"`
	CreatedAt       *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
	SizeBytes       int64                  `protobuf:"varint,3,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"`
	IncludesHistory bool                   `protobuf:"varint,4,opt,name=includes_history,json=includesHistory,proto3" json:"includes_history,omitempty"`
	SinceTs         *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=since_ts,json=sinceTs,proto3" json:"since_ts,omitempty"`
	Description     string                 `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"`
	FormatVersion   string                 `protobuf:"bytes,7,opt,name=format_version,json=formatVersion,proto3" json:"format_version,omitempty"`
	unknownFields   protoimpl.UnknownFields
	sizeCache       protoimpl.SizeCache
}

func (x *SnapshotDescriptor) Reset() {
	*x = SnapshotDescriptor{}
	mi := &file_loomcycle_proto_msgTypes[83]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *SnapshotDescriptor) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SnapshotDescriptor) ProtoMessage() {}

func (x *SnapshotDescriptor) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[83]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SnapshotDescriptor.ProtoReflect.Descriptor instead.
func (*SnapshotDescriptor) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{83}
}

func (x *SnapshotDescriptor) GetSnapshotId() string {
	if x != nil {
		return x.SnapshotId
	}
	return ""
}

func (x *SnapshotDescriptor) GetCreatedAt() *timestamppb.Timestamp {
	if x != nil {
		return x.CreatedAt
	}
	return nil
}

func (x *SnapshotDescriptor) GetSizeBytes() int64 {
	if x != nil {
		return x.SizeBytes
	}
	return 0
}

func (x *SnapshotDescriptor) GetIncludesHistory() bool {
	if x != nil {
		return x.IncludesHistory
	}
	return false
}

func (x *SnapshotDescriptor) GetSinceTs() *timestamppb.Timestamp {
	if x != nil {
		return x.SinceTs
	}
	return nil
}

func (x *SnapshotDescriptor) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

func (x *SnapshotDescriptor) GetFormatVersion() string {
	if x != nil {
		return x.FormatVersion
	}
	return ""
}

type ListSnapshotsRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ListSnapshotsRequest) Reset() {
	*x = ListSnapshotsRequest{}
	mi := &file_loomcycle_proto_msgTypes[84]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ListSnapshotsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListSnapshotsRequest) ProtoMessage() {}

func (x *ListSnapshotsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[84]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListSnapshotsRequest.ProtoReflect.Descriptor instead.
func (*ListSnapshotsRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{84}
}

type ListSnapshotsResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Snapshots     []*SnapshotDescriptor  `protobuf:"bytes,1,rep,name=snapshots,proto3" json:"snapshots,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ListSnapshotsResponse) Reset() {
	*x = ListSnapshotsResponse{}
	mi := &file_loomcycle_proto_msgTypes[85]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ListSnapshotsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListSnapshotsResponse) ProtoMessage() {}

func (x *ListSnapshotsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[85]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListSnapshotsResponse.ProtoReflect.Descriptor instead.
func (*ListSnapshotsResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{85}
}

func (x *ListSnapshotsResponse) GetSnapshots() []*SnapshotDescriptor {
	if x != nil {
		return x.Snapshots
	}
	return nil
}

type GetSnapshotRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	SnapshotId    string                 `protobuf:"bytes,1,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *GetSnapshotRequest) Reset() {
	*x = GetSnapshotRequest{}
	mi := &file_loomcycle_proto_msgTypes[86]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *GetSnapshotRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GetSnapshotRequest) ProtoMessage() {}

func (x *GetSnapshotRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[86]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GetSnapshotRequest.ProtoReflect.Descriptor instead.
func (*GetSnapshotRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{86}
}

func (x *GetSnapshotRequest) GetSnapshotId() string {
	if x != nil {
		return x.SnapshotId
	}
	return ""
}

// SnapshotEnvelope carries the full row including JSON content.
// Distinct from ExportSnapshotResponse, which is operator-facing
// "where did this land on the host" semantics.
type SnapshotEnvelope struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	SnapshotId    string                 `protobuf:"bytes,1,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"`
	CreatedAt     *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
	Description   string                 `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	FormatVersion string                 `protobuf:"bytes,4,opt,name=format_version,json=formatVersion,proto3" json:"format_version,omitempty"`
	SizeBytes     int64                  `protobuf:"varint,5,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"`
	// Canonical envelope bytes.
	JsonContent   []byte `protobuf:"bytes,6,opt,name=json_content,json=jsonContent,proto3" json:"json_content,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *SnapshotEnvelope) Reset() {
	*x = SnapshotEnvelope{}
	mi := &file_loomcycle_proto_msgTypes[87]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *SnapshotEnvelope) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SnapshotEnvelope) ProtoMessage() {}

func (x *SnapshotEnvelope) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[87]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SnapshotEnvelope.ProtoReflect.Descriptor instead.
func (*SnapshotEnvelope) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{87}
}

func (x *SnapshotEnvelope) GetSnapshotId() string {
	if x != nil {
		return x.SnapshotId
	}
	return ""
}

func (x *SnapshotEnvelope) GetCreatedAt() *timestamppb.Timestamp {
	if x != nil {
		return x.CreatedAt
	}
	return nil
}

func (x *SnapshotEnvelope) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

func (x *SnapshotEnvelope) GetFormatVersion() string {
	if x != nil {
		return x.FormatVersion
	}
	return ""
}

func (x *SnapshotEnvelope) GetSizeBytes() int64 {
	if x != nil {
		return x.SizeBytes
	}
	return 0
}

func (x *SnapshotEnvelope) GetJsonContent() []byte {
	if x != nil {
		return x.JsonContent
	}
	return nil
}

type ExportSnapshotRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	SnapshotId    string                 `protobuf:"bytes,1,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ExportSnapshotRequest) Reset() {
	*x = ExportSnapshotRequest{}
	mi := &file_loomcycle_proto_msgTypes[88]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ExportSnapshotRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExportSnapshotRequest) ProtoMessage() {}

func (x *ExportSnapshotRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[88]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExportSnapshotRequest.ProtoReflect.Descriptor instead.
func (*ExportSnapshotRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{88}
}

func (x *ExportSnapshotRequest) GetSnapshotId() string {
	if x != nil {
		return x.SnapshotId
	}
	return ""
}

type ExportSnapshotResponse struct {
	state      protoimpl.MessageState `protogen:"open.v1"`
	SnapshotId string                 `protobuf:"bytes,1,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"`
	// file_path + checksum are populated when a transport materialises
	// the export to disk first (CLI's --out flag). Otherwise empty —
	// raw_json carries the canonical bytes directly.
	FilePath      string `protobuf:"bytes,2,opt,name=file_path,json=filePath,proto3" json:"file_path,omitempty"`
	Checksum      string `protobuf:"bytes,3,opt,name=checksum,proto3" json:"checksum,omitempty"`
	SizeBytes     int64  `protobuf:"varint,4,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"`
	RawJson       []byte `protobuf:"bytes,5,opt,name=raw_json,json=rawJson,proto3" json:"raw_json,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ExportSnapshotResponse) Reset() {
	*x = ExportSnapshotResponse{}
	mi := &file_loomcycle_proto_msgTypes[89]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ExportSnapshotResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExportSnapshotResponse) ProtoMessage() {}

func (x *ExportSnapshotResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[89]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExportSnapshotResponse.ProtoReflect.Descriptor instead.
func (*ExportSnapshotResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{89}
}

func (x *ExportSnapshotResponse) GetSnapshotId() string {
	if x != nil {
		return x.SnapshotId
	}
	return ""
}

func (x *ExportSnapshotResponse) GetFilePath() string {
	if x != nil {
		return x.FilePath
	}
	return ""
}

func (x *ExportSnapshotResponse) GetChecksum() string {
	if x != nil {
		return x.Checksum
	}
	return ""
}

func (x *ExportSnapshotResponse) GetSizeBytes() int64 {
	if x != nil {
		return x.SizeBytes
	}
	return 0
}

func (x *ExportSnapshotResponse) GetRawJson() []byte {
	if x != nil {
		return x.RawJson
	}
	return nil
}

type RestoreSnapshotRequest struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Exactly one of snapshot_id (same-instance lookup) or raw_json
	// (cross-instance restore from inline bytes) must be non-empty.
	// file_path restore is intentionally not supported on the gRPC
	// surface — supply raw_json inline (CLI reads the file client-side).
	SnapshotId     string `protobuf:"bytes,1,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"`
	RawJson        []byte `protobuf:"bytes,2,opt,name=raw_json,json=rawJson,proto3" json:"raw_json,omitempty"`
	IncludeHistory bool   `protobuf:"varint,3,opt,name=include_history,json=includeHistory,proto3" json:"include_history,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *RestoreSnapshotRequest) Reset() {
	*x = RestoreSnapshotRequest{}
	mi := &file_loomcycle_proto_msgTypes[90]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RestoreSnapshotRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RestoreSnapshotRequest) ProtoMessage() {}

func (x *RestoreSnapshotRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[90]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RestoreSnapshotRequest.ProtoReflect.Descriptor instead.
func (*RestoreSnapshotRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{90}
}

func (x *RestoreSnapshotRequest) GetSnapshotId() string {
	if x != nil {
		return x.SnapshotId
	}
	return ""
}

func (x *RestoreSnapshotRequest) GetRawJson() []byte {
	if x != nil {
		return x.RawJson
	}
	return nil
}

func (x *RestoreSnapshotRequest) GetIncludeHistory() bool {
	if x != nil {
		return x.IncludeHistory
	}
	return false
}

type RestoreSnapshotResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Per-section counters. Reflect rows actually written
	// (ON CONFLICT DO NOTHING — a re-restore reports 0 even though
	// every per-row INSERT "succeeded").
	AgentDefsRestored       int32 `protobuf:"varint,1,opt,name=agent_defs_restored,json=agentDefsRestored,proto3" json:"agent_defs_restored,omitempty"`
	AgentDefActiveRestored  int32 `protobuf:"varint,2,opt,name=agent_def_active_restored,json=agentDefActiveRestored,proto3" json:"agent_def_active_restored,omitempty"`
	MemoryRestored          int32 `protobuf:"varint,3,opt,name=memory_restored,json=memoryRestored,proto3" json:"memory_restored,omitempty"`
	ChannelMessagesRestored int32 `protobuf:"varint,4,opt,name=channel_messages_restored,json=channelMessagesRestored,proto3" json:"channel_messages_restored,omitempty"`
	ChannelCursorsRestored  int32 `protobuf:"varint,5,opt,name=channel_cursors_restored,json=channelCursorsRestored,proto3" json:"channel_cursors_restored,omitempty"`
	EvaluationsRestored     int32 `protobuf:"varint,6,opt,name=evaluations_restored,json=evaluationsRestored,proto3" json:"evaluations_restored,omitempty"`
	PausedRunsRestored      int32 `protobuf:"varint,7,opt,name=paused_runs_restored,json=pausedRunsRestored,proto3" json:"paused_runs_restored,omitempty"`
	// Sessions synthesized for cross-instance restore (paused_runs
	// reference session_ids; restore creates snap_sess_<run_id>
	// entries deterministically when needed).
	SynthesizedSessions        int32    `protobuf:"varint,8,opt,name=synthesized_sessions,json=synthesizedSessions,proto3" json:"synthesized_sessions,omitempty"`
	TranscriptEventsRestored   int32    `protobuf:"varint,9,opt,name=transcript_events_restored,json=transcriptEventsRestored,proto3" json:"transcript_events_restored,omitempty"`
	InteractionHistoryRestored int32    `protobuf:"varint,10,opt,name=interaction_history_restored,json=interactionHistoryRestored,proto3" json:"interaction_history_restored,omitempty"`
	Warnings                   []string `protobuf:"bytes,11,rep,name=warnings,proto3" json:"warnings,omitempty"`
	FormatMigrations           []string `protobuf:"bytes,12,rep,name=format_migrations,json=formatMigrations,proto3" json:"format_migrations,omitempty"`
	unknownFields              protoimpl.UnknownFields
	sizeCache                  protoimpl.SizeCache
}

func (x *RestoreSnapshotResponse) Reset() {
	*x = RestoreSnapshotResponse{}
	mi := &file_loomcycle_proto_msgTypes[91]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RestoreSnapshotResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RestoreSnapshotResponse) ProtoMessage() {}

func (x *RestoreSnapshotResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[91]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RestoreSnapshotResponse.ProtoReflect.Descriptor instead.
func (*RestoreSnapshotResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{91}
}

func (x *RestoreSnapshotResponse) GetAgentDefsRestored() int32 {
	if x != nil {
		return x.AgentDefsRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetAgentDefActiveRestored() int32 {
	if x != nil {
		return x.AgentDefActiveRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetMemoryRestored() int32 {
	if x != nil {
		return x.MemoryRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetChannelMessagesRestored() int32 {
	if x != nil {
		return x.ChannelMessagesRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetChannelCursorsRestored() int32 {
	if x != nil {
		return x.ChannelCursorsRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetEvaluationsRestored() int32 {
	if x != nil {
		return x.EvaluationsRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetPausedRunsRestored() int32 {
	if x != nil {
		return x.PausedRunsRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetSynthesizedSessions() int32 {
	if x != nil {
		return x.SynthesizedSessions
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetTranscriptEventsRestored() int32 {
	if x != nil {
		return x.TranscriptEventsRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetInteractionHistoryRestored() int32 {
	if x != nil {
		return x.InteractionHistoryRestored
	}
	return 0
}

func (x *RestoreSnapshotResponse) GetWarnings() []string {
	if x != nil {
		return x.Warnings
	}
	return nil
}

func (x *RestoreSnapshotResponse) GetFormatMigrations() []string {
	if x != nil {
		return x.FormatMigrations
	}
	return nil
}

type DeleteSnapshotRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	SnapshotId    string                 `protobuf:"bytes,1,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DeleteSnapshotRequest) Reset() {
	*x = DeleteSnapshotRequest{}
	mi := &file_loomcycle_proto_msgTypes[92]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DeleteSnapshotRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeleteSnapshotRequest) ProtoMessage() {}

func (x *DeleteSnapshotRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[92]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeleteSnapshotRequest.ProtoReflect.Descriptor instead.
func (*DeleteSnapshotRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{92}
}

func (x *DeleteSnapshotRequest) GetSnapshotId() string {
	if x != nil {
		return x.SnapshotId
	}
	return ""
}

type DeleteSnapshotResponse struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Always true — DELETE is idempotent (returns ok whether or not
	// the row existed; mirrors HTTP DELETE /v1/_snapshots/{id} = 204).
	Deleted       bool   `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"`
	SnapshotId    string `protobuf:"bytes,2,opt,name=snapshot_id,json=snapshotId,proto3" json:"snapshot_id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *DeleteSnapshotResponse) Reset() {
	*x = DeleteSnapshotResponse{}
	mi := &file_loomcycle_proto_msgTypes[93]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *DeleteSnapshotResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeleteSnapshotResponse) ProtoMessage() {}

func (x *DeleteSnapshotResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[93]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeleteSnapshotResponse.ProtoReflect.Descriptor instead.
func (*DeleteSnapshotResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{93}
}

func (x *DeleteSnapshotResponse) GetDeleted() bool {
	if x != nil {
		return x.Deleted
	}
	return false
}

func (x *DeleteSnapshotResponse) GetSnapshotId() string {
	if x != nil {
		return x.SnapshotId
	}
	return ""
}

// SubstrateRequest carries the substrate tool's input JSON
// verbatim. Shape (op + name + def_id + overlay + ...) is owned
// by the in-process tool; the gRPC layer is content-agnostic.
type SubstrateRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	InputJson     []byte                 `protobuf:"bytes,1,opt,name=input_json,json=inputJson,proto3" json:"input_json,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *SubstrateRequest) Reset() {
	*x = SubstrateRequest{}
	mi := &file_loomcycle_proto_msgTypes[94]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *SubstrateRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SubstrateRequest) ProtoMessage() {}

func (x *SubstrateRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[94]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SubstrateRequest.ProtoReflect.Descriptor instead.
func (*SubstrateRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{94}
}

func (x *SubstrateRequest) GetInputJson() []byte {
	if x != nil {
		return x.InputJson
	}
	return nil
}

// SubstrateResponse carries the tool's output JSON + a flag
// distinguishing successful output from a tool-level refusal.
// `is_error == true` means the call reached the tool but the
// tool refused (scope deny, empty-body, etc.); `output_json`
// then carries the human-readable error text. Transport-level
// failures (auth, malformed input) come back as gRPC status
// codes, not in this body.
type SubstrateResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	OutputJson    []byte                 `protobuf:"bytes,1,opt,name=output_json,json=outputJson,proto3" json:"output_json,omitempty"`
	IsError       bool                   `protobuf:"varint,2,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *SubstrateResponse) Reset() {
	*x = SubstrateResponse{}
	mi := &file_loomcycle_proto_msgTypes[95]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *SubstrateResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SubstrateResponse) ProtoMessage() {}

func (x *SubstrateResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[95]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SubstrateResponse.ProtoReflect.Descriptor instead.
func (*SubstrateResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{95}
}

func (x *SubstrateResponse) GetOutputJson() []byte {
	if x != nil {
		return x.OutputJson
	}
	return nil
}

func (x *SubstrateResponse) GetIsError() bool {
	if x != nil {
		return x.IsError
	}
	return false
}

// ListChannelsRequest is empty — the channel list is global within
// the loomcycle process, no per-call selectors.
type ListChannelsRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ListChannelsRequest) Reset() {
	*x = ListChannelsRequest{}
	mi := &file_loomcycle_proto_msgTypes[96]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ListChannelsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListChannelsRequest) ProtoMessage() {}

func (x *ListChannelsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[96]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListChannelsRequest.ProtoReflect.Descriptor instead.
func (*ListChannelsRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{96}
}

type ListChannelsResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Channels      []*ChannelDescriptor   `protobuf:"bytes,1,rep,name=channels,proto3" json:"channels,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ListChannelsResponse) Reset() {
	*x = ListChannelsResponse{}
	mi := &file_loomcycle_proto_msgTypes[97]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ListChannelsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ListChannelsResponse) ProtoMessage() {}

func (x *ListChannelsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[97]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ListChannelsResponse.ProtoReflect.Descriptor instead.
func (*ListChannelsResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{97}
}

func (x *ListChannelsResponse) GetChannels() []*ChannelDescriptor {
	if x != nil {
		return x.Channels
	}
	return nil
}

type ChannelDescriptor struct {
	state        protoimpl.MessageState `protogen:"open.v1"`
	Name         string                 `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Scope        string                 `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	Semantic     string                 `protobuf:"bytes,3,opt,name=semantic,proto3" json:"semantic,omitempty"`
	Publisher    string                 `protobuf:"bytes,4,opt,name=publisher,proto3" json:"publisher,omitempty"`
	Period       string                 `protobuf:"bytes,5,opt,name=period,proto3" json:"period,omitempty"`
	DefaultTtl   int32                  `protobuf:"varint,6,opt,name=default_ttl,json=defaultTtl,proto3" json:"default_ttl,omitempty"`
	MaxMessages  int32                  `protobuf:"varint,7,opt,name=max_messages,json=maxMessages,proto3" json:"max_messages,omitempty"`
	MessageCount int64                  `protobuf:"varint,8,opt,name=message_count,json=messageCount,proto3" json:"message_count,omitempty"`
	// RFC3339 strings — empty when count == 0.
	OldestVisibleAt string `protobuf:"bytes,9,opt,name=oldest_visible_at,json=oldestVisibleAt,proto3" json:"oldest_visible_at,omitempty"`
	NewestVisibleAt string `protobuf:"bytes,10,opt,name=newest_visible_at,json=newestVisibleAt,proto3" json:"newest_visible_at,omitempty"`
	unknownFields   protoimpl.UnknownFields
	sizeCache       protoimpl.SizeCache
}

func (x *ChannelDescriptor) Reset() {
	*x = ChannelDescriptor{}
	mi := &file_loomcycle_proto_msgTypes[98]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ChannelDescriptor) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChannelDescriptor) ProtoMessage() {}

func (x *ChannelDescriptor) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[98]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChannelDescriptor.ProtoReflect.Descriptor instead.
func (*ChannelDescriptor) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{98}
}

func (x *ChannelDescriptor) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *ChannelDescriptor) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *ChannelDescriptor) GetSemantic() string {
	if x != nil {
		return x.Semantic
	}
	return ""
}

func (x *ChannelDescriptor) GetPublisher() string {
	if x != nil {
		return x.Publisher
	}
	return ""
}

func (x *ChannelDescriptor) GetPeriod() string {
	if x != nil {
		return x.Period
	}
	return ""
}

func (x *ChannelDescriptor) GetDefaultTtl() int32 {
	if x != nil {
		return x.DefaultTtl
	}
	return 0
}

func (x *ChannelDescriptor) GetMaxMessages() int32 {
	if x != nil {
		return x.MaxMessages
	}
	return 0
}

func (x *ChannelDescriptor) GetMessageCount() int64 {
	if x != nil {
		return x.MessageCount
	}
	return 0
}

func (x *ChannelDescriptor) GetOldestVisibleAt() string {
	if x != nil {
		return x.OldestVisibleAt
	}
	return ""
}

func (x *ChannelDescriptor) GetNewestVisibleAt() string {
	if x != nil {
		return x.NewestVisibleAt
	}
	return ""
}

type StreamUserRunStatesRequest struct {
	state  protoimpl.MessageState `protogen:"open.v1"`
	UserId string                 `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	// Optional filter — empty means all transitions match.
	Statuses []string `protobuf:"bytes,2,rep,name=statuses,proto3" json:"statuses,omitempty"`
	// Optional filter — empty means any agent matches.
	Agent         string `protobuf:"bytes,3,opt,name=agent,proto3" json:"agent,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *StreamUserRunStatesRequest) Reset() {
	*x = StreamUserRunStatesRequest{}
	mi := &file_loomcycle_proto_msgTypes[99]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *StreamUserRunStatesRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StreamUserRunStatesRequest) ProtoMessage() {}

func (x *StreamUserRunStatesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[99]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use StreamUserRunStatesRequest.ProtoReflect.Descriptor instead.
func (*StreamUserRunStatesRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{99}
}

func (x *StreamUserRunStatesRequest) GetUserId() string {
	if x != nil {
		return x.UserId
	}
	return ""
}

func (x *StreamUserRunStatesRequest) GetStatuses() []string {
	if x != nil {
		return x.Statuses
	}
	return nil
}

func (x *StreamUserRunStatesRequest) GetAgent() string {
	if x != nil {
		return x.Agent
	}
	return ""
}

// RunStateEvent mirrors the SSE wire shape from the HTTP transport.
// TS is RFC3339 for language-portability.
type RunStateEvent struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	RunId         string                 `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	AgentId       string                 `protobuf:"bytes,2,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"`
	Agent         string                 `protobuf:"bytes,3,opt,name=agent,proto3" json:"agent,omitempty"`
	UserId        string                 `protobuf:"bytes,4,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
	ParentAgentId string                 `protobuf:"bytes,5,opt,name=parent_agent_id,json=parentAgentId,proto3" json:"parent_agent_id,omitempty"`
	Status        string                 `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"`
	StopReason    string                 `protobuf:"bytes,7,opt,name=stop_reason,json=stopReason,proto3" json:"stop_reason,omitempty"`
	Error         string                 `protobuf:"bytes,8,opt,name=error,proto3" json:"error,omitempty"`
	Ts            string                 `protobuf:"bytes,9,opt,name=ts,proto3" json:"ts,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *RunStateEvent) Reset() {
	*x = RunStateEvent{}
	mi := &file_loomcycle_proto_msgTypes[100]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *RunStateEvent) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RunStateEvent) ProtoMessage() {}

func (x *RunStateEvent) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[100]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RunStateEvent.ProtoReflect.Descriptor instead.
func (*RunStateEvent) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{100}
}

func (x *RunStateEvent) GetRunId() string {
	if x != nil {
		return x.RunId
	}
	return ""
}

func (x *RunStateEvent) GetAgentId() string {
	if x != nil {
		return x.AgentId
	}
	return ""
}

func (x *RunStateEvent) GetAgent() string {
	if x != nil {
		return x.Agent
	}
	return ""
}

func (x *RunStateEvent) GetUserId() string {
	if x != nil {
		return x.UserId
	}
	return ""
}

func (x *RunStateEvent) GetParentAgentId() string {
	if x != nil {
		return x.ParentAgentId
	}
	return ""
}

func (x *RunStateEvent) GetStatus() string {
	if x != nil {
		return x.Status
	}
	return ""
}

func (x *RunStateEvent) GetStopReason() string {
	if x != nil {
		return x.StopReason
	}
	return ""
}

func (x *RunStateEvent) GetError() string {
	if x != nil {
		return x.Error
	}
	return ""
}

func (x *RunStateEvent) GetTs() string {
	if x != nil {
		return x.Ts
	}
	return ""
}

type PublishChannelRequest struct {
	state   protoimpl.MessageState `protogen:"open.v1"`
	Channel string                 `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	Scope   string                 `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	ScopeId string                 `protobuf:"bytes,3,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"`
	// payload is raw JSON (bytes so the proto layer doesn't have to
	// model the user's JSON schema). The Go-side connector validates
	// json.Valid + the configured size cap.
	Payload []byte `protobuf:"bytes,4,opt,name=payload,proto3" json:"payload,omitempty"`
	// RFC3339Nano; empty = publish immediately.
	DeliverAt     string `protobuf:"bytes,5,opt,name=deliver_at,json=deliverAt,proto3" json:"deliver_at,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *PublishChannelRequest) Reset() {
	*x = PublishChannelRequest{}
	mi := &file_loomcycle_proto_msgTypes[101]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PublishChannelRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PublishChannelRequest) ProtoMessage() {}

func (x *PublishChannelRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[101]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PublishChannelRequest.ProtoReflect.Descriptor instead.
func (*PublishChannelRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{101}
}

func (x *PublishChannelRequest) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

func (x *PublishChannelRequest) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *PublishChannelRequest) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *PublishChannelRequest) GetPayload() []byte {
	if x != nil {
		return x.Payload
	}
	return nil
}

func (x *PublishChannelRequest) GetDeliverAt() string {
	if x != nil {
		return x.DeliverAt
	}
	return ""
}

type PublishChannelResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	MsgId         string                 `protobuf:"bytes,1,opt,name=msg_id,json=msgId,proto3" json:"msg_id,omitempty"`
	Channel       string                 `protobuf:"bytes,2,opt,name=channel,proto3" json:"channel,omitempty"`
	CreatedAt     string                 `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // RFC3339Nano
	VisibleAt     string                 `protobuf:"bytes,4,opt,name=visible_at,json=visibleAt,proto3" json:"visible_at,omitempty"` // RFC3339Nano; empty when not deferred
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *PublishChannelResponse) Reset() {
	*x = PublishChannelResponse{}
	mi := &file_loomcycle_proto_msgTypes[102]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PublishChannelResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PublishChannelResponse) ProtoMessage() {}

func (x *PublishChannelResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[102]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PublishChannelResponse.ProtoReflect.Descriptor instead.
func (*PublishChannelResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{102}
}

func (x *PublishChannelResponse) GetMsgId() string {
	if x != nil {
		return x.MsgId
	}
	return ""
}

func (x *PublishChannelResponse) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

func (x *PublishChannelResponse) GetCreatedAt() string {
	if x != nil {
		return x.CreatedAt
	}
	return ""
}

func (x *PublishChannelResponse) GetVisibleAt() string {
	if x != nil {
		return x.VisibleAt
	}
	return ""
}

type SubscribeChannelRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Channel       string                 `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	Scope         string                 `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	ScopeId       string                 `protobuf:"bytes,3,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"`
	FromCursor    string                 `protobuf:"bytes,4,opt,name=from_cursor,json=fromCursor,proto3" json:"from_cursor,omitempty"`     // empty = committed cursor; "cur_0" = replay from oldest
	MaxMessages   int32                  `protobuf:"varint,5,opt,name=max_messages,json=maxMessages,proto3" json:"max_messages,omitempty"` // 0 = default 10; capped at 100
	WaitMs        int32                  `protobuf:"varint,6,opt,name=wait_ms,json=waitMs,proto3" json:"wait_ms,omitempty"`                // 0 = poll-and-return; capped by operator's LongPollCapMS
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *SubscribeChannelRequest) Reset() {
	*x = SubscribeChannelRequest{}
	mi := &file_loomcycle_proto_msgTypes[103]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *SubscribeChannelRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SubscribeChannelRequest) ProtoMessage() {}

func (x *SubscribeChannelRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[103]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SubscribeChannelRequest.ProtoReflect.Descriptor instead.
func (*SubscribeChannelRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{103}
}

func (x *SubscribeChannelRequest) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

func (x *SubscribeChannelRequest) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *SubscribeChannelRequest) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *SubscribeChannelRequest) GetFromCursor() string {
	if x != nil {
		return x.FromCursor
	}
	return ""
}

func (x *SubscribeChannelRequest) GetMaxMessages() int32 {
	if x != nil {
		return x.MaxMessages
	}
	return 0
}

func (x *SubscribeChannelRequest) GetWaitMs() int32 {
	if x != nil {
		return x.WaitMs
	}
	return 0
}

type SubscribeChannelResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Channel       string                 `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	Messages      []*ChannelMessage      `protobuf:"bytes,2,rep,name=messages,proto3" json:"messages,omitempty"`
	NextCursor    string                 `protobuf:"bytes,3,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *SubscribeChannelResponse) Reset() {
	*x = SubscribeChannelResponse{}
	mi := &file_loomcycle_proto_msgTypes[104]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *SubscribeChannelResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SubscribeChannelResponse) ProtoMessage() {}

func (x *SubscribeChannelResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[104]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SubscribeChannelResponse.ProtoReflect.Descriptor instead.
func (*SubscribeChannelResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{104}
}

func (x *SubscribeChannelResponse) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

func (x *SubscribeChannelResponse) GetMessages() []*ChannelMessage {
	if x != nil {
		return x.Messages
	}
	return nil
}

func (x *SubscribeChannelResponse) GetNextCursor() string {
	if x != nil {
		return x.NextCursor
	}
	return ""
}

// ChannelMessage is one delivered message. value is the raw JSON
// payload (bytes for the same reason as PublishChannelRequest.payload).
type ChannelMessage struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Id            string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Value         []byte                 `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	PublishedAt   string                 `protobuf:"bytes,3,opt,name=published_at,json=publishedAt,proto3" json:"published_at,omitempty"` // RFC3339Nano
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ChannelMessage) Reset() {
	*x = ChannelMessage{}
	mi := &file_loomcycle_proto_msgTypes[105]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ChannelMessage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChannelMessage) ProtoMessage() {}

func (x *ChannelMessage) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[105]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChannelMessage.ProtoReflect.Descriptor instead.
func (*ChannelMessage) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{105}
}

func (x *ChannelMessage) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (x *ChannelMessage) GetValue() []byte {
	if x != nil {
		return x.Value
	}
	return nil
}

func (x *ChannelMessage) GetPublishedAt() string {
	if x != nil {
		return x.PublishedAt
	}
	return ""
}

type PeekChannelRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Channel       string                 `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	Scope         string                 `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	ScopeId       string                 `protobuf:"bytes,3,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"`
	FromCursor    string                 `protobuf:"bytes,4,opt,name=from_cursor,json=fromCursor,proto3" json:"from_cursor,omitempty"`
	MaxMessages   int32                  `protobuf:"varint,5,opt,name=max_messages,json=maxMessages,proto3" json:"max_messages,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *PeekChannelRequest) Reset() {
	*x = PeekChannelRequest{}
	mi := &file_loomcycle_proto_msgTypes[106]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PeekChannelRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PeekChannelRequest) ProtoMessage() {}

func (x *PeekChannelRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[106]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PeekChannelRequest.ProtoReflect.Descriptor instead.
func (*PeekChannelRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{106}
}

func (x *PeekChannelRequest) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

func (x *PeekChannelRequest) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *PeekChannelRequest) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *PeekChannelRequest) GetFromCursor() string {
	if x != nil {
		return x.FromCursor
	}
	return ""
}

func (x *PeekChannelRequest) GetMaxMessages() int32 {
	if x != nil {
		return x.MaxMessages
	}
	return 0
}

type PeekChannelResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Channel       string                 `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	Messages      []*ChannelMessage      `protobuf:"bytes,2,rep,name=messages,proto3" json:"messages,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *PeekChannelResponse) Reset() {
	*x = PeekChannelResponse{}
	mi := &file_loomcycle_proto_msgTypes[107]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *PeekChannelResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PeekChannelResponse) ProtoMessage() {}

func (x *PeekChannelResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[107]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PeekChannelResponse.ProtoReflect.Descriptor instead.
func (*PeekChannelResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{107}
}

func (x *PeekChannelResponse) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

func (x *PeekChannelResponse) GetMessages() []*ChannelMessage {
	if x != nil {
		return x.Messages
	}
	return nil
}

type AckChannelRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Channel       string                 `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	Scope         string                 `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	ScopeId       string                 `protobuf:"bytes,3,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"`
	Cursor        string                 `protobuf:"bytes,4,opt,name=cursor,proto3" json:"cursor,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AckChannelRequest) Reset() {
	*x = AckChannelRequest{}
	mi := &file_loomcycle_proto_msgTypes[108]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AckChannelRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AckChannelRequest) ProtoMessage() {}

func (x *AckChannelRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[108]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AckChannelRequest.ProtoReflect.Descriptor instead.
func (*AckChannelRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{108}
}

func (x *AckChannelRequest) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

func (x *AckChannelRequest) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *AckChannelRequest) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *AckChannelRequest) GetCursor() string {
	if x != nil {
		return x.Cursor
	}
	return ""
}

type AckChannelResponse struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Ok            bool                   `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AckChannelResponse) Reset() {
	*x = AckChannelResponse{}
	mi := &file_loomcycle_proto_msgTypes[109]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AckChannelResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AckChannelResponse) ProtoMessage() {}

func (x *AckChannelResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[109]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AckChannelResponse.ProtoReflect.Descriptor instead.
func (*AckChannelResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{109}
}

func (x *AckChannelResponse) GetOk() bool {
	if x != nil {
		return x.Ok
	}
	return false
}

// RFC S client twins. AwaitChannels fans IN across `channels`; reads are
// NON-committing. BroadcastChannels fans OUT `payload` to `channels`.
type AwaitChannelsRequest struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Channels      []string               `protobuf:"bytes,1,rep,name=channels,proto3" json:"channels,omitempty"`
	Scope         string                 `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	ScopeId       string                 `protobuf:"bytes,3,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"`
	Mode          string                 `protobuf:"bytes,4,opt,name=mode,proto3" json:"mode,omitempty"` // any | all | at_least; default any
	N             int32                  `protobuf:"varint,5,opt,name=n,proto3" json:"n,omitempty"`      // threshold for at_least (>0)
	FromCursor    string                 `protobuf:"bytes,6,opt,name=from_cursor,json=fromCursor,proto3" json:"from_cursor,omitempty"`
	MaxMessages   int32                  `protobuf:"varint,7,opt,name=max_messages,json=maxMessages,proto3" json:"max_messages,omitempty"`
	WaitMs        int32                  `protobuf:"varint,8,opt,name=wait_ms,json=waitMs,proto3" json:"wait_ms,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AwaitChannelsRequest) Reset() {
	*x = AwaitChannelsRequest{}
	mi := &file_loomcycle_proto_msgTypes[110]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AwaitChannelsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AwaitChannelsRequest) ProtoMessage() {}

func (x *AwaitChannelsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[110]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AwaitChannelsRequest.ProtoReflect.Descriptor instead.
func (*AwaitChannelsRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{110}
}

func (x *AwaitChannelsRequest) GetChannels() []string {
	if x != nil {
		return x.Channels
	}
	return nil
}

func (x *AwaitChannelsRequest) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *AwaitChannelsRequest) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *AwaitChannelsRequest) GetMode() string {
	if x != nil {
		return x.Mode
	}
	return ""
}

func (x *AwaitChannelsRequest) GetN() int32 {
	if x != nil {
		return x.N
	}
	return 0
}

func (x *AwaitChannelsRequest) GetFromCursor() string {
	if x != nil {
		return x.FromCursor
	}
	return ""
}

func (x *AwaitChannelsRequest) GetMaxMessages() int32 {
	if x != nil {
		return x.MaxMessages
	}
	return 0
}

func (x *AwaitChannelsRequest) GetWaitMs() int32 {
	if x != nil {
		return x.WaitMs
	}
	return 0
}

// One fired channel's accumulated messages + the (non-advanced) cursor.
type AwaitChannelEntry struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Messages      []*ChannelMessage      `protobuf:"bytes,1,rep,name=messages,proto3" json:"messages,omitempty"`
	NextCursor    string                 `protobuf:"bytes,2,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AwaitChannelEntry) Reset() {
	*x = AwaitChannelEntry{}
	mi := &file_loomcycle_proto_msgTypes[111]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AwaitChannelEntry) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AwaitChannelEntry) ProtoMessage() {}

func (x *AwaitChannelEntry) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[111]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AwaitChannelEntry.ProtoReflect.Descriptor instead.
func (*AwaitChannelEntry) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{111}
}

func (x *AwaitChannelEntry) GetMessages() []*ChannelMessage {
	if x != nil {
		return x.Messages
	}
	return nil
}

func (x *AwaitChannelEntry) GetNextCursor() string {
	if x != nil {
		return x.NextCursor
	}
	return ""
}

type AwaitChannelsResponse struct {
	state         protoimpl.MessageState        `protogen:"open.v1"`
	Satisfied     bool                          `protobuf:"varint,1,opt,name=satisfied,proto3" json:"satisfied,omitempty"`
	TimedOut      bool                          `protobuf:"varint,2,opt,name=timed_out,json=timedOut,proto3" json:"timed_out,omitempty"`
	Mode          string                        `protobuf:"bytes,3,opt,name=mode,proto3" json:"mode,omitempty"`
	Fired         []string                      `protobuf:"bytes,4,rep,name=fired,proto3" json:"fired,omitempty"`
	TotalMessages int32                         `protobuf:"varint,5,opt,name=total_messages,json=totalMessages,proto3" json:"total_messages,omitempty"`
	Results       map[string]*AwaitChannelEntry `protobuf:"bytes,6,rep,name=results,proto3" json:"results,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AwaitChannelsResponse) Reset() {
	*x = AwaitChannelsResponse{}
	mi := &file_loomcycle_proto_msgTypes[112]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AwaitChannelsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AwaitChannelsResponse) ProtoMessage() {}

func (x *AwaitChannelsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[112]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AwaitChannelsResponse.ProtoReflect.Descriptor instead.
func (*AwaitChannelsResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{112}
}

func (x *AwaitChannelsResponse) GetSatisfied() bool {
	if x != nil {
		return x.Satisfied
	}
	return false
}

func (x *AwaitChannelsResponse) GetTimedOut() bool {
	if x != nil {
		return x.TimedOut
	}
	return false
}

func (x *AwaitChannelsResponse) GetMode() string {
	if x != nil {
		return x.Mode
	}
	return ""
}

func (x *AwaitChannelsResponse) GetFired() []string {
	if x != nil {
		return x.Fired
	}
	return nil
}

func (x *AwaitChannelsResponse) GetTotalMessages() int32 {
	if x != nil {
		return x.TotalMessages
	}
	return 0
}

func (x *AwaitChannelsResponse) GetResults() map[string]*AwaitChannelEntry {
	if x != nil {
		return x.Results
	}
	return nil
}

type BroadcastChannelsRequest struct {
	state    protoimpl.MessageState `protogen:"open.v1"`
	Channels []string               `protobuf:"bytes,1,rep,name=channels,proto3" json:"channels,omitempty"`
	Scope    string                 `protobuf:"bytes,2,opt,name=scope,proto3" json:"scope,omitempty"`
	ScopeId  string                 `protobuf:"bytes,3,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"`
	// payload is raw JSON (bytes, same as PublishChannelRequest.payload).
	Payload       []byte `protobuf:"bytes,4,opt,name=payload,proto3" json:"payload,omitempty"`
	DeliverAt     string `protobuf:"bytes,5,opt,name=deliver_at,json=deliverAt,proto3" json:"deliver_at,omitempty"` // RFC3339Nano; empty = publish immediately
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *BroadcastChannelsRequest) Reset() {
	*x = BroadcastChannelsRequest{}
	mi := &file_loomcycle_proto_msgTypes[113]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *BroadcastChannelsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BroadcastChannelsRequest) ProtoMessage() {}

func (x *BroadcastChannelsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[113]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BroadcastChannelsRequest.ProtoReflect.Descriptor instead.
func (*BroadcastChannelsRequest) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{113}
}

func (x *BroadcastChannelsRequest) GetChannels() []string {
	if x != nil {
		return x.Channels
	}
	return nil
}

func (x *BroadcastChannelsRequest) GetScope() string {
	if x != nil {
		return x.Scope
	}
	return ""
}

func (x *BroadcastChannelsRequest) GetScopeId() string {
	if x != nil {
		return x.ScopeId
	}
	return ""
}

func (x *BroadcastChannelsRequest) GetPayload() []byte {
	if x != nil {
		return x.Payload
	}
	return nil
}

func (x *BroadcastChannelsRequest) GetDeliverAt() string {
	if x != nil {
		return x.DeliverAt
	}
	return ""
}

// One channel's publish outcome. error is set (msg_id empty) when that
// channel's write failed after the pre-flight passed.
type BroadcastChannelEntry struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Channel       string                 `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"`
	MsgId         string                 `protobuf:"bytes,2,opt,name=msg_id,json=msgId,proto3" json:"msg_id,omitempty"`
	CreatedAt     string                 `protobuf:"bytes,3,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // RFC3339Nano
	VisibleAt     string                 `protobuf:"bytes,4,opt,name=visible_at,json=visibleAt,proto3" json:"visible_at,omitempty"` // RFC3339Nano; set when deferred
	Error         string                 `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *BroadcastChannelEntry) Reset() {
	*x = BroadcastChannelEntry{}
	mi := &file_loomcycle_proto_msgTypes[114]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *BroadcastChannelEntry) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BroadcastChannelEntry) ProtoMessage() {}

func (x *BroadcastChannelEntry) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[114]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BroadcastChannelEntry.ProtoReflect.Descriptor instead.
func (*BroadcastChannelEntry) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{114}
}

func (x *BroadcastChannelEntry) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

func (x *BroadcastChannelEntry) GetMsgId() string {
	if x != nil {
		return x.MsgId
	}
	return ""
}

func (x *BroadcastChannelEntry) GetCreatedAt() string {
	if x != nil {
		return x.CreatedAt
	}
	return ""
}

func (x *BroadcastChannelEntry) GetVisibleAt() string {
	if x != nil {
		return x.VisibleAt
	}
	return ""
}

func (x *BroadcastChannelEntry) GetError() string {
	if x != nil {
		return x.Error
	}
	return ""
}

type BroadcastChannelsResponse struct {
	state         protoimpl.MessageState   `protogen:"open.v1"`
	Published     int32                    `protobuf:"varint,1,opt,name=published,proto3" json:"published,omitempty"`
	Failed        int32                    `protobuf:"varint,2,opt,name=failed,proto3" json:"failed,omitempty"`
	Results       []*BroadcastChannelEntry `protobuf:"bytes,3,rep,name=results,proto3" json:"results,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *BroadcastChannelsResponse) Reset() {
	*x = BroadcastChannelsResponse{}
	mi := &file_loomcycle_proto_msgTypes[115]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *BroadcastChannelsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BroadcastChannelsResponse) ProtoMessage() {}

func (x *BroadcastChannelsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_loomcycle_proto_msgTypes[115]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BroadcastChannelsResponse.ProtoReflect.Descriptor instead.
func (*BroadcastChannelsResponse) Descriptor() ([]byte, []int) {
	return file_loomcycle_proto_rawDescGZIP(), []int{115}
}

func (x *BroadcastChannelsResponse) GetPublished() int32 {
	if x != nil {
		return x.Published
	}
	return 0
}

func (x *BroadcastChannelsResponse) GetFailed() int32 {
	if x != nil {
		return x.Failed
	}
	return 0
}

func (x *BroadcastChannelsResponse) GetResults() []*BroadcastChannelEntry {
	if x != nil {
		return x.Results
	}
	return nil
}

var File_loomcycle_proto protoreflect.FileDescriptor

const file_loomcycle_proto_rawDesc = "" +
	"\n" +
	"\x0floomcycle.proto\x12\floomcycle.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"\xbb\x05\n" +
	"\n" +
	"RunRequest\x12\x14\n" +
	"\x05agent\x18\x01 \x01(\tR\x05agent\x12\x1d\n" +
	"\n" +
	"session_id\x18\x02 \x01(\tR\tsessionId\x127\n" +
	"\bsegments\x18\x03 \x03(\v2\x1b.loomcycle.v1.PromptSegmentR\bsegments\x12\x14\n" +
	"\x05tools\x18\x04 \x03(\tR\x05tools\x12@\n" +
	"\rallowed_hosts\x18\x05 \x01(\v2\x1b.loomcycle.v1.HostAllowlistR\fallowedHosts\x12*\n" +
	"\x11web_search_filter\x18\x06 \x01(\tR\x0fwebSearchFilter\x12\x19\n" +
	"\bagent_id\x18\a \x01(\tR\aagentId\x12\x17\n" +
	"\auser_id\x18\b \x01(\tR\x06userId\x12\x1b\n" +
	"\ttenant_id\x18\t \x01(\tR\btenantId\x12\x1b\n" +
	"\tuser_tier\x18\n" +
	" \x01(\tR\buserTier\x12\x1f\n" +
	"\vuser_bearer\x18\v \x01(\tR\n" +
	"userBearer\x12X\n" +
	"\x10user_credentials\x18\f \x03(\v2-.loomcycle.v1.RunRequest.UserCredentialsEntryR\x0fuserCredentials\x122\n" +
	"\bsampling\x18\r \x01(\v2\x16.loomcycle.v1.SamplingR\bsampling\x128\n" +
	"\n" +
	"compaction\x18\x0e \x01(\v2\x18.loomcycle.v1.CompactionR\n" +
	"compaction\x12 \n" +
	"\vinteractive\x18\x0f \x01(\bR\vinteractive\x1aB\n" +
	"\x14UserCredentialsEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xf9\x04\n" +
	"\x0fContinueRequest\x12\x1d\n" +
	"\n" +
	"session_id\x18\x01 \x01(\tR\tsessionId\x127\n" +
	"\bsegments\x18\x02 \x03(\v2\x1b.loomcycle.v1.PromptSegmentR\bsegments\x12\x14\n" +
	"\x05tools\x18\x03 \x03(\tR\x05tools\x12@\n" +
	"\rallowed_hosts\x18\x04 \x01(\v2\x1b.loomcycle.v1.HostAllowlistR\fallowedHosts\x12*\n" +
	"\x11web_search_filter\x18\x05 \x01(\tR\x0fwebSearchFilter\x12\x19\n" +
	"\bagent_id\x18\x06 \x01(\tR\aagentId\x12\x1b\n" +
	"\tuser_tier\x18\a \x01(\tR\buserTier\x12\x1f\n" +
	"\vuser_bearer\x18\b \x01(\tR\n" +
	"userBearer\x12]\n" +
	"\x10user_credentials\x18\t \x03(\v22.loomcycle.v1.ContinueRequest.UserCredentialsEntryR\x0fuserCredentials\x122\n" +
	"\bsampling\x18\n" +
	" \x01(\v2\x16.loomcycle.v1.SamplingR\bsampling\x128\n" +
	"\n" +
	"compaction\x18\v \x01(\v2\x18.loomcycle.v1.CompactionR\n" +
	"compaction\x12 \n" +
	"\vinteractive\x18\f \x01(\bR\vinteractive\x1aB\n" +
	"\x14UserCredentialsEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xcc\x02\n" +
	"\bSampling\x12%\n" +
	"\vtemperature\x18\x01 \x01(\x01H\x00R\vtemperature\x88\x01\x01\x12\x18\n" +
	"\x05top_p\x18\x02 \x01(\x01H\x01R\x04topP\x88\x01\x01\x12\x18\n" +
	"\x05top_k\x18\x03 \x01(\x05H\x02R\x04topK\x88\x01\x01\x120\n" +
	"\x11frequency_penalty\x18\x04 \x01(\x01H\x03R\x10frequencyPenalty\x88\x01\x01\x12.\n" +
	"\x10presence_penalty\x18\x05 \x01(\x01H\x04R\x0fpresencePenalty\x88\x01\x01\x12\x17\n" +
	"\x04seed\x18\x06 \x01(\x05H\x05R\x04seed\x88\x01\x01\x12\x12\n" +
	"\x04stop\x18\a \x03(\tR\x04stopB\x0e\n" +
	"\f_temperatureB\b\n" +
	"\x06_top_pB\b\n" +
	"\x06_top_kB\x14\n" +
	"\x12_frequency_penaltyB\x13\n" +
	"\x11_presence_penaltyB\a\n" +
	"\x05_seed\"\xd6\x02\n" +
	"\n" +
	"Compaction\x12\x1d\n" +
	"\aenabled\x18\x01 \x01(\bH\x00R\aenabled\x88\x01\x01\x120\n" +
	"\x11target_percentage\x18\x02 \x01(\x05H\x01R\x10targetPercentage\x88\x01\x01\x12#\n" +
	"\vkeep_last_n\x18\x03 \x01(\x05H\x02R\tkeepLastN\x88\x01\x01\x12\"\n" +
	"\n" +
	"keep_first\x18\x04 \x01(\bH\x03R\tkeepFirst\x88\x01\x01\x121\n" +
	"\x12autocompact_at_pct\x18\x05 \x01(\x05H\x04R\x10autocompactAtPct\x88\x01\x01\x12\x19\n" +
	"\x05model\x18\x06 \x01(\tH\x05R\x05model\x88\x01\x01B\n" +
	"\n" +
	"\b_enabledB\x14\n" +
	"\x12_target_percentageB\x0e\n" +
	"\f_keep_last_nB\r\n" +
	"\v_keep_firstB\x15\n" +
	"\x13_autocompact_at_pctB\b\n" +
	"\x06_model\"x\n" +
	"\x11BatchSpawnRequest\x120\n" +
	"\x06spawns\x18\x01 \x03(\v2\x18.loomcycle.v1.RunRequestR\x06spawns\x12\x12\n" +
	"\x04mode\x18\x02 \x01(\tR\x04mode\x12\x1d\n" +
	"\n" +
	"timeout_ms\x18\x03 \x01(\x03R\ttimeoutMs\"\xf7\x01\n" +
	"\vSpawnResult\x12\x19\n" +
	"\bagent_id\x18\x01 \x01(\tR\aagentId\x12\x15\n" +
	"\x06run_id\x18\x02 \x01(\tR\x05runId\x12\x1d\n" +
	"\n" +
	"session_id\x18\x03 \x01(\tR\tsessionId\x12\x16\n" +
	"\x06status\x18\x04 \x01(\tR\x06status\x12\x1f\n" +
	"\vstop_reason\x18\x05 \x01(\tR\n" +
	"stopReason\x12\x1d\n" +
	"\n" +
	"final_text\x18\x06 \x01(\tR\tfinalText\x12)\n" +
	"\x05usage\x18\a \x01(\v2\x13.loomcycle.v1.UsageR\x05usage\x12\x14\n" +
	"\x05error\x18\b \x01(\tR\x05error\"a\n" +
	"\x10BatchSpawnResult\x123\n" +
	"\aresults\x18\x01 \x03(\v2\x19.loomcycle.v1.SpawnResultR\aresults\x12\x18\n" +
	"\aspawned\x18\x02 \x01(\x05R\aspawned\"\x17\n" +
	"\x15DirectoryUsersRequest\"\x97\x01\n" +
	"\rDirectoryUser\x12\x18\n" +
	"\asubject\x18\x01 \x01(\tR\asubject\x12#\n" +
	"\rrunning_count\x18\x02 \x01(\x05R\frunningCount\x12\x1f\n" +
	"\vtotal_count\x18\x03 \x01(\x05R\n" +
	"totalCount\x12&\n" +
	"\x0flast_started_at\x18\x04 \x01(\tR\rlastStartedAt\"c\n" +
	"\x16DirectoryUsersResponse\x12\x16\n" +
	"\x06tenant\x18\x01 \x01(\tR\x06tenant\x121\n" +
	"\x05users\x18\x02 \x03(\v2\x1b.loomcycle.v1.DirectoryUserR\x05users\"3\n" +
	"\x17DirectoryInspectRequest\x12\x18\n" +
	"\asubject\x18\x01 \x01(\tR\asubject\"w\n" +
	"\x0fDirectoryBudget\x12\"\n" +
	"\n" +
	"soft_limit\x18\x01 \x01(\x03H\x00R\tsoftLimit\x88\x01\x01\x12\"\n" +
	"\n" +
	"hard_limit\x18\x02 \x01(\x03H\x01R\thardLimit\x88\x01\x01B\r\n" +
	"\v_soft_limitB\r\n" +
	"\v_hard_limit\":\n" +
	"\x0eDirectoryUsage\x12\x14\n" +
	"\x05calls\x18\x01 \x01(\x03R\x05calls\x12\x12\n" +
	"\x04cost\x18\x02 \x01(\x01R\x04cost\"\xec\x03\n" +
	"\x18DirectoryInspectResponse\x12\x16\n" +
	"\x06tenant\x18\x01 \x01(\tR\x06tenant\x12\x18\n" +
	"\asubject\x18\x02 \x01(\tR\asubject\x127\n" +
	"\bactivity\x18\x03 \x01(\v2\x1b.loomcycle.v1.DirectoryUserR\bactivity\x12\x14\n" +
	"\x05chats\x18\x04 \x01(\x05R\x05chats\x12J\n" +
	"\x06memory\x18\x05 \x03(\v22.loomcycle.v1.DirectoryInspectResponse.MemoryEntryR\x06memory\x12!\n" +
	"\tdocuments\x18\x06 \x01(\x05H\x00R\tdocuments\x88\x01\x01\x125\n" +
	"\x06budget\x18\a \x01(\v2\x1d.loomcycle.v1.DirectoryBudgetR\x06budget\x122\n" +
	"\x05usage\x18\b \x01(\v2\x1c.loomcycle.v1.DirectoryUsageR\x05usage\x12\x16\n" +
	"\x06errors\x18\t \x03(\tR\x06errors\x12\x14\n" +
	"\x05notes\x18\n" +
	" \x03(\tR\x05notes\x1a9\n" +
	"\vMemoryEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\x03R\x05value:\x028\x01B\f\n" +
	"\n" +
	"_documents\"\x19\n" +
	"\x17DirectoryTenantsRequest\"S\n" +
	"\x0fDirectoryTenant\x12\x16\n" +
	"\x06tenant\x18\x01 \x01(\tR\x06tenant\x12\x14\n" +
	"\x05users\x18\x02 \x01(\x05R\x05users\x12\x12\n" +
	"\x04runs\x18\x03 \x01(\x05R\x04runs\"i\n" +
	"\x18DirectoryTenantsResponse\x127\n" +
	"\atenants\x18\x01 \x03(\v2\x1d.loomcycle.v1.DirectoryTenantR\atenants\x12\x14\n" +
	"\x05notes\x18\x02 \x03(\tR\x05notes\"0\n" +
	"\x14ErasureReportRequest\x12\x18\n" +
	"\asubject\x18\x01 \x01(\tR\asubject\"\x9d\x01\n" +
	"\vErasureTier\x12=\n" +
	"\x06counts\x18\x01 \x03(\v2%.loomcycle.v1.ErasureTier.CountsEntryR\x06counts\x12\x14\n" +
	"\x05total\x18\x02 \x01(\x03R\x05total\x1a9\n" +
	"\vCountsEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\x03R\x05value:\x028\x01\"\x87\x01\n" +
	"\x0eErasureResidue\x12\x12\n" +
	"\x04rows\x18\x01 \x01(\x05R\x04rows\x12\x16\n" +
	"\x06scopes\x18\x02 \x03(\tR\x06scopes\x12+\n" +
	"\x11sessions_examined\x18\x03 \x01(\x05R\x10sessionsExamined\x12\x1c\n" +
	"\ttruncated\x18\x04 \x01(\bR\ttruncated\"\xbe\x02\n" +
	"\x15ErasureReportResponse\x12\x16\n" +
	"\x06tenant\x18\x01 \x01(\tR\x06tenant\x12\x18\n" +
	"\asubject\x18\x02 \x01(\tR\asubject\x12>\n" +
	"\rtier1_covered\x18\x03 \x01(\v2\x19.loomcycle.v1.ErasureTierR\ftier1Covered\x12B\n" +
	"\x0ftier2_uncovered\x18\x04 \x01(\v2\x19.loomcycle.v1.ErasureTierR\x0etier2Uncovered\x12A\n" +
	"\rtier3_residue\x18\x05 \x01(\v2\x1c.loomcycle.v1.ErasureResidueR\ftier3Residue\x12\x14\n" +
	"\x05notes\x18\x06 \x03(\tR\x05notes\x12\x16\n" +
	"\x06errors\x18\a \x03(\tR\x06errors\"u\n" +
	"\x15ErasureExecuteRequest\x12\x18\n" +
	"\asubject\x18\x01 \x01(\tR\asubject\x12\x1c\n" +
	"\adry_run\x18\x02 \x01(\bH\x00R\x06dryRun\x88\x01\x01\x12\x18\n" +
	"\aconfirm\x18\x03 \x01(\tR\aconfirmB\n" +
	"\n" +
	"\b_dry_run\"\xdf\x03\n" +
	"\x16ErasureExecuteResponse\x12\x16\n" +
	"\x06tenant\x18\x01 \x01(\tR\x06tenant\x12\x18\n" +
	"\asubject\x18\x02 \x01(\tR\asubject\x12\x17\n" +
	"\adry_run\x18\x03 \x01(\bR\x06dryRun\x12K\n" +
	"\adeleted\x18\x04 \x03(\v21.loomcycle.v1.ErasureExecuteResponse.DeletedEntryR\adeleted\x12N\n" +
	"\bretained\x18\x05 \x03(\v22.loomcycle.v1.ErasureExecuteResponse.RetainedEntryR\bretained\x126\n" +
	"\aresidue\x18\x06 \x01(\v2\x1c.loomcycle.v1.ErasureResidueR\aresidue\x12\x16\n" +
	"\x06errors\x18\a \x03(\tR\x06errors\x12\x14\n" +
	"\x05notes\x18\b \x03(\tR\x05notes\x1a:\n" +
	"\fDeletedEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\x05R\x05value:\x028\x01\x1a;\n" +
	"\rRetainedEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" +
	"\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"B\n" +
	"\x11CompactRunRequest\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12\x16\n" +
	"\x06reason\x18\x02 \x01(\tR\x06reason\"\xa9\x01\n" +
	"\x10CompactRunResult\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12\x1c\n" +
	"\tcompacted\x18\x02 \x01(\bR\tcompacted\x12#\n" +
	"\rbefore_tokens\x18\x03 \x01(\x05R\fbeforeTokens\x12!\n" +
	"\fafter_tokens\x18\x04 \x01(\x05R\vafterTokens\x12\x18\n" +
	"\aapplied\x18\x05 \x01(\tR\aapplied\"g\n" +
	"\x14ReplaySessionRequest\x12\x1d\n" +
	"\n" +
	"session_id\x18\x01 \x01(\tR\tsessionId\x12\x14\n" +
	"\x05agent\x18\x02 \x01(\tR\x05agent\x12\x1a\n" +
	"\bcompress\x18\x03 \x01(\bR\bcompress\"\x9e\x01\n" +
	"\x13ReplaySessionResult\x12$\n" +
	"\x0enew_session_id\x18\x01 \x01(\tR\fnewSessionId\x12\x1e\n" +
	"\vseed_run_id\x18\x02 \x01(\tR\tseedRunId\x12#\n" +
	"\revents_copied\x18\x03 \x01(\x05R\feventsCopied\x12\x1c\n" +
	"\tcompacted\x18\x04 \x01(\bR\tcompacted\"T\n" +
	"\x0fRunInputRequest\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12\x12\n" +
	"\x04text\x18\x02 \x01(\tR\x04text\x12\x16\n" +
	"\x06source\x18\x03 \x01(\tR\x06source\"G\n" +
	"\x10RunInputResponse\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12\x1c\n" +
	"\tdelivered\x18\x02 \x01(\bR\tdelivered\"B\n" +
	"\x11CancelTurnRequest\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12\x16\n" +
	"\x06reason\x18\x02 \x01(\tR\x06reason\"]\n" +
	"\x12CancelTurnResponse\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12\x18\n" +
	"\astopped\x18\x02 \x01(\bR\astopped\x12\x16\n" +
	"\x06parked\x18\x03 \x01(\bR\x06parked\"\xc2\x01\n" +
	"\x17ResolveInterruptRequest\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12!\n" +
	"\finterrupt_id\x18\x02 \x01(\tR\vinterruptId\x12\x12\n" +
	"\x04kind\x18\x03 \x01(\tR\x04kind\x12\x16\n" +
	"\x06answer\x18\x04 \x01(\tR\x06answer\x12\x1f\n" +
	"\vresolved_by\x18\x05 \x01(\tR\n" +
	"resolvedBy\x12 \n" +
	"\vdisposition\x18\x06 \x01(\tR\vdisposition\"U\n" +
	"\x18ResolveInterruptResponse\x12!\n" +
	"\finterrupt_id\x18\x01 \x01(\tR\vinterruptId\x12\x16\n" +
	"\x06status\x18\x02 \x01(\tR\x06status\"D\n" +
	"\x10StreamRunRequest\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12\x19\n" +
	"\bfrom_seq\x18\x02 \x01(\x03R\afromSeq\"#\n" +
	"\rHostAllowlist\x12\x12\n" +
	"\x04list\x18\x01 \x03(\tR\x04list\"_\n" +
	"\rPromptSegment\x12\x12\n" +
	"\x04role\x18\x01 \x01(\tR\x04role\x12:\n" +
	"\acontent\x18\x02 \x03(\v2 .loomcycle.v1.PromptContentBlockR\acontent\"\x8d\x01\n" +
	"\x12PromptContentBlock\x12\x12\n" +
	"\x04type\x18\x01 \x01(\tR\x04type\x12\x12\n" +
	"\x04text\x18\x02 \x01(\tR\x04text\x12\x1c\n" +
	"\tcacheable\x18\x03 \x01(\bR\tcacheable\x12\x1d\n" +
	"\n" +
	"media_type\x18\x04 \x01(\tR\tmediaType\x12\x12\n" +
	"\x04data\x18\x05 \x01(\fR\x04data\"\xf5\x03\n" +
	"\x05Event\x12\x12\n" +
	"\x04type\x18\x01 \x01(\tR\x04type\x12\x12\n" +
	"\x04text\x18\x02 \x01(\tR\x04text\x120\n" +
	"\btool_use\x18\x03 \x01(\v2\x15.loomcycle.v1.ToolUseR\atoolUse\x12)\n" +
	"\x05usage\x18\x04 \x01(\v2\x13.loomcycle.v1.UsageR\x05usage\x12\x14\n" +
	"\x05error\x18\x05 \x01(\tR\x05error\x12\x19\n" +
	"\bis_error\x18\x06 \x01(\bR\aisError\x12)\n" +
	"\x05retry\x18\a \x01(\v2\x13.loomcycle.v1.RetryR\x05retry\x12\x1f\n" +
	"\vstop_reason\x18\b \x01(\tR\n" +
	"stopReason\x12?\n" +
	"\rhost_widening\x18\t \x01(\v2\x1a.loomcycle.v1.HostWideningR\fhostWidening\x12B\n" +
	"\x0eawaiting_input\x18\n" +
	" \x01(\v2\x1b.loomcycle.v1.AwaitingInputR\rawaitingInput\x126\n" +
	"\n" +
	"user_input\x18\v \x01(\v2\x17.loomcycle.v1.UserInputR\tuserInput\x12-\n" +
	"\x05limit\x18\f \x01(\v2\x17.loomcycle.v1.LimitInfoR\x05limit\".\n" +
	"\rAwaitingInput\x12\x1d\n" +
	"\n" +
	"since_turn\x18\x01 \x01(\x05R\tsinceTurn\"P\n" +
	"\tUserInput\x12\x12\n" +
	"\x04text\x18\x01 \x01(\tR\x04text\x12\x16\n" +
	"\x06source\x18\x02 \x01(\tR\x06source\x12\x17\n" +
	"\aseen_at\x18\x03 \x01(\tR\x06seenAt\"\xbc\x01\n" +
	"\fHostWidening\x12 \n" +
	"\ftool_call_id\x18\x01 \x01(\tR\n" +
	"toolCallId\x12\x1b\n" +
	"\ttool_name\x18\x02 \x01(\tR\btoolName\x12\x10\n" +
	"\x03url\x18\x03 \x01(\tR\x03url\x12\x1d\n" +
	"\n" +
	"hook_owner\x18\x04 \x01(\tR\thookOwner\x12\x1b\n" +
	"\thook_name\x18\x05 \x01(\tR\bhookName\x12\x1f\n" +
	"\vhosts_added\x18\x06 \x03(\tR\n" +
	"hostsAdded\"C\n" +
	"\aToolUse\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" +
	"\x04name\x18\x02 \x01(\tR\x04name\x12\x14\n" +
	"\x05input\x18\x03 \x01(\fR\x05input\"\xc5\x01\n" +
	"\x05Usage\x12!\n" +
	"\finput_tokens\x18\x01 \x01(\x03R\vinputTokens\x12#\n" +
	"\routput_tokens\x18\x02 \x01(\x03R\foutputTokens\x122\n" +
	"\x15cache_creation_tokens\x18\x03 \x01(\x03R\x13cacheCreationTokens\x12*\n" +
	"\x11cache_read_tokens\x18\x04 \x01(\x03R\x0fcacheReadTokens\x12\x14\n" +
	"\x05model\x18\x05 \x01(\tR\x05model\"n\n" +
	"\x05Retry\x12\x1a\n" +
	"\bprovider\x18\x01 \x01(\tR\bprovider\x12\x18\n" +
	"\aattempt\x18\x02 \x01(\x05R\aattempt\x12\x17\n" +
	"\await_ms\x18\x03 \x01(\x03R\x06waitMs\x12\x16\n" +
	"\x06reason\x18\x04 \x01(\tR\x06reason\"\xb4\x01\n" +
	"\tLimitInfo\x12\x14\n" +
	"\x05scope\x18\x01 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x02 \x01(\tR\ascopeId\x12\x1a\n" +
	"\bseverity\x18\x03 \x01(\tR\bseverity\x12\x16\n" +
	"\x06window\x18\x04 \x01(\tR\x06window\x12\x12\n" +
	"\x04used\x18\x05 \x01(\x03R\x04used\x12\x14\n" +
	"\x05limit\x18\x06 \x01(\x03R\x05limit\x12\x18\n" +
	"\amessage\x18\a \x01(\tR\amessage\"5\n" +
	"\x14GetTranscriptRequest\x12\x1d\n" +
	"\n" +
	"session_id\x18\x01 \x01(\tR\tsessionId\"C\n" +
	"\n" +
	"Transcript\x125\n" +
	"\x06events\x18\x01 \x03(\v2\x1d.loomcycle.v1.TranscriptEventR\x06events\"\xb3\x01\n" +
	"\x0fTranscriptEvent\x12\x10\n" +
	"\x03seq\x18\x01 \x01(\x03R\x03seq\x12\x1d\n" +
	"\n" +
	"session_id\x18\x02 \x01(\tR\tsessionId\x12\x15\n" +
	"\x06run_id\x18\x03 \x01(\tR\x05runId\x12*\n" +
	"\x02ts\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\x02ts\x12\x12\n" +
	"\x04type\x18\x05 \x01(\tR\x04type\x12\x18\n" +
	"\apayload\x18\x06 \x01(\fR\apayload\",\n" +
	"\x0fGetAgentRequest\x12\x19\n" +
	"\bagent_id\x18\x01 \x01(\tR\aagentId\"\xee\x03\n" +
	"\x05Agent\x12\x19\n" +
	"\bagent_id\x18\x01 \x01(\tR\aagentId\x12\x15\n" +
	"\x06run_id\x18\x02 \x01(\tR\x05runId\x12\x1d\n" +
	"\n" +
	"session_id\x18\x03 \x01(\tR\tsessionId\x12\x17\n" +
	"\auser_id\x18\x04 \x01(\tR\x06userId\x12&\n" +
	"\x0fparent_agent_id\x18\x05 \x01(\tR\rparentAgentId\x12\x16\n" +
	"\x06status\x18\x06 \x01(\tR\x06status\x129\n" +
	"\n" +
	"started_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tstartedAt\x12=\n" +
	"\fcompleted_at\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\vcompletedAt\x12\x1f\n" +
	"\vstop_reason\x18\t \x01(\tR\n" +
	"stopReason\x12\x14\n" +
	"\x05error\x18\n" +
	" \x01(\tR\x05error\x12.\n" +
	"\x05usage\x18\v \x01(\v2\x18.loomcycle.v1.AgentUsageR\x05usage\x12F\n" +
	"\x11last_heartbeat_at\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\x0flastHeartbeatAt\x12\x12\n" +
	"\x04live\x18\r \x01(\bR\x04live\"\xca\x01\n" +
	"\n" +
	"AgentUsage\x12!\n" +
	"\finput_tokens\x18\x01 \x01(\x03R\vinputTokens\x12#\n" +
	"\routput_tokens\x18\x02 \x01(\x03R\foutputTokens\x122\n" +
	"\x15cache_creation_tokens\x18\x03 \x01(\x03R\x13cacheCreationTokens\x12*\n" +
	"\x11cache_read_tokens\x18\x04 \x01(\x03R\x0fcacheReadTokens\x12\x14\n" +
	"\x05model\x18\x05 \x01(\tR\x05model\"G\n" +
	"\x12CancelAgentRequest\x12\x19\n" +
	"\bagent_id\x18\x01 \x01(\tR\aagentId\x12\x16\n" +
	"\x06reason\x18\x02 \x01(\tR\x06reason\">\n" +
	"\x13CancelAgentResponse\x12'\n" +
	"\x0fcancelled_count\x18\x01 \x01(\x05R\x0ecancelledCount\"H\n" +
	"\x15ListUserAgentsRequest\x12\x17\n" +
	"\auser_id\x18\x01 \x01(\tR\x06userId\x12\x16\n" +
	"\x06status\x18\x02 \x01(\tR\x06status\"E\n" +
	"\x16ListUserAgentsResponse\x12+\n" +
	"\x06agents\x18\x01 \x03(\v2\x13.loomcycle.v1.AgentR\x06agents\"}\n" +
	"\x12UsageReportRequest\x12\x19\n" +
	"\bgroup_by\x18\x01 \x03(\tR\agroupBy\x12\x1b\n" +
	"\tfrom_time\x18\x02 \x01(\tR\bfromTime\x12\x17\n" +
	"\ato_time\x18\x03 \x01(\tR\x06toTime\x12\x16\n" +
	"\x06tenant\x18\x04 \x01(\tR\x06tenant\"\xc3\x03\n" +
	"\x0eUsageAggregate\x12\x1b\n" +
	"\ttenant_id\x18\x01 \x01(\tR\btenantId\x12\x17\n" +
	"\auser_id\x18\x02 \x01(\tR\x06userId\x12\x1a\n" +
	"\bprovider\x18\x03 \x01(\tR\bprovider\x12\x14\n" +
	"\x05model\x18\x04 \x01(\tR\x05model\x12+\n" +
	"\x11credential_source\x18\x05 \x01(\tR\x10credentialSource\x12!\n" +
	"\finput_tokens\x18\x06 \x01(\x03R\vinputTokens\x12#\n" +
	"\routput_tokens\x18\a \x01(\x03R\foutputTokens\x122\n" +
	"\x15cache_creation_tokens\x18\b \x01(\x03R\x13cacheCreationTokens\x12*\n" +
	"\x11cache_read_tokens\x18\t \x01(\x03R\x0fcacheReadTokens\x12\x12\n" +
	"\x04cost\x18\n" +
	" \x01(\x01R\x04cost\x12\x1a\n" +
	"\bcurrency\x18\v \x01(\tR\bcurrency\x12\x1d\n" +
	"\n" +
	"call_count\x18\f \x01(\x03R\tcallCount\x12%\n" +
	"\x0eunpriced_calls\x18\r \x01(\x03R\runpricedCalls\"b\n" +
	"\x13UsageReportResponse\x12\x19\n" +
	"\bgroup_by\x18\x01 \x03(\tR\agroupBy\x120\n" +
	"\x04rows\x18\x02 \x03(\v2\x1c.loomcycle.v1.UsageAggregateR\x04rows\"\xd2\x01\n" +
	"\x11TokenLimitRequest\x12\x0e\n" +
	"\x02op\x18\x01 \x01(\tR\x02op\x12\x16\n" +
	"\x06tenant\x18\x02 \x01(\tR\x06tenant\x12\x14\n" +
	"\x05scope\x18\x03 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x04 \x01(\tR\ascopeId\x12\"\n" +
	"\n" +
	"soft_limit\x18\x05 \x01(\x03H\x00R\tsoftLimit\x88\x01\x01\x12\"\n" +
	"\n" +
	"hard_limit\x18\x06 \x01(\x03H\x01R\thardLimit\x88\x01\x01B\r\n" +
	"\v_soft_limitB\r\n" +
	"\v_hard_limit\"\x97\x02\n" +
	"\x0fTokenLimitEntry\x12\x1b\n" +
	"\ttenant_id\x18\x01 \x01(\tR\btenantId\x12\x14\n" +
	"\x05scope\x18\x02 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x03 \x01(\tR\ascopeId\x12\"\n" +
	"\n" +
	"soft_limit\x18\x04 \x01(\x03H\x00R\tsoftLimit\x88\x01\x01\x12\"\n" +
	"\n" +
	"hard_limit\x18\x05 \x01(\x03H\x01R\thardLimit\x88\x01\x01\x12\x12\n" +
	"\x04used\x18\x06 \x01(\x03R\x04used\x12\x1d\n" +
	"\n" +
	"updated_at\x18\a \x01(\tR\tupdatedAt\x12\x1d\n" +
	"\n" +
	"updated_by\x18\b \x01(\tR\tupdatedByB\r\n" +
	"\v_soft_limitB\r\n" +
	"\v_hard_limit\"K\n" +
	"\x12TokenLimitResponse\x125\n" +
	"\x06limits\x18\x01 \x03(\v2\x1d.loomcycle.v1.TokenLimitEntryR\x06limits\"\x0f\n" +
	"\rConfigRequest\"1\n" +
	"\x0eConfigResponse\x12\x1f\n" +
	"\vconfig_json\x18\x01 \x01(\fR\n" +
	"configJson\"\x0f\n" +
	"\rHealthRequest\"u\n" +
	"\x0eHealthResponse\x12\x0e\n" +
	"\x02ok\x18\x01 \x01(\bR\x02ok\x12\x16\n" +
	"\x06commit\x18\x02 \x01(\tR\x06commit\x12\x14\n" +
	"\x05built\x18\x03 \x01(\tR\x05built\x12%\n" +
	"\x0euptime_seconds\x18\x04 \x01(\x03R\ruptimeSeconds\"\xe2\x01\n" +
	"\x13RegisterHookRequest\x12\x14\n" +
	"\x05owner\x18\x01 \x01(\tR\x05owner\x12\x12\n" +
	"\x04name\x18\x02 \x01(\tR\x04name\x12\x14\n" +
	"\x05phase\x18\x03 \x01(\tR\x05phase\x12\x16\n" +
	"\x06agents\x18\x04 \x03(\tR\x06agents\x12\x14\n" +
	"\x05tools\x18\x05 \x03(\tR\x05tools\x12!\n" +
	"\fcallback_url\x18\x06 \x01(\tR\vcallbackUrl\x12\x1b\n" +
	"\tfail_mode\x18\a \x01(\tR\bfailMode\x12\x1d\n" +
	"\n" +
	"timeout_ms\x18\b \x01(\x05R\ttimeoutMs\"&\n" +
	"\x14RegisterHookResponse\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\tR\x02id\"\x12\n" +
	"\x10ListHooksRequest\"\xa4\x02\n" +
	"\x04Hook\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" +
	"\x05owner\x18\x02 \x01(\tR\x05owner\x12\x12\n" +
	"\x04name\x18\x03 \x01(\tR\x04name\x12\x14\n" +
	"\x05phase\x18\x04 \x01(\tR\x05phase\x12\x16\n" +
	"\x06agents\x18\x05 \x03(\tR\x06agents\x12\x14\n" +
	"\x05tools\x18\x06 \x03(\tR\x05tools\x12!\n" +
	"\fcallback_url\x18\a \x01(\tR\vcallbackUrl\x12\x1b\n" +
	"\tfail_mode\x18\b \x01(\tR\bfailMode\x12\x1d\n" +
	"\n" +
	"timeout_ms\x18\t \x01(\x05R\ttimeoutMs\x12?\n" +
	"\rregistered_at\x18\n" +
	" \x01(\v2\x1a.google.protobuf.TimestampR\fregisteredAt\"=\n" +
	"\x11ListHooksResponse\x12(\n" +
	"\x05hooks\x18\x01 \x03(\v2\x12.loomcycle.v1.HookR\x05hooks\"#\n" +
	"\x11DeleteHookRequest\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\tR\x02id\".\n" +
	"\x12DeleteHookResponse\x12\x18\n" +
	"\adeleted\x18\x01 \x01(\tR\adeleted\"4\n" +
	"\x13PauseRuntimeRequest\x12\x1d\n" +
	"\n" +
	"timeout_ms\x18\x01 \x01(\x03R\ttimeoutMs\"\xcb\x01\n" +
	"\x14PauseRuntimeResponse\x12\x16\n" +
	"\x06status\x18\x01 \x01(\tR\x06status\x12\x1f\n" +
	"\vduration_ms\x18\x02 \x01(\x03R\n" +
	"durationMs\x122\n" +
	"\x15force_cancelled_count\x18\x03 \x01(\x05R\x13forceCancelledCount\x12*\n" +
	"\x11paused_runs_count\x18\x04 \x01(\x05R\x0fpausedRunsCount\x12\x1a\n" +
	"\bwarnings\x18\x05 \x03(\tR\bwarnings\"\x16\n" +
	"\x14ResumeRuntimeRequest\"w\n" +
	"\x15ResumeRuntimeResponse\x12\x16\n" +
	"\x06status\x18\x01 \x01(\tR\x06status\x12*\n" +
	"\x11resumed_run_count\x18\x02 \x01(\x05R\x0fresumedRunCount\x12\x1a\n" +
	"\bwarnings\x18\x03 \x03(\tR\bwarnings\"\x18\n" +
	"\x16GetRuntimeStateRequest\"\xba\x01\n" +
	"\x14RuntimeStateResponse\x12\x16\n" +
	"\x06status\x18\x01 \x01(\tR\x06status\x127\n" +
	"\tpaused_at\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\bpausedAt\x12(\n" +
	"\x10paused_run_count\x18\x03 \x01(\x05R\x0epausedRunCount\x12'\n" +
	"\x0fsnapshots_count\x18\x04 \x01(\x05R\x0esnapshotsCount\"\x15\n" +
	"\x13ResolveProbeRequest\"\x94\x02\n" +
	"\x16ResolverMatrixResponse\x12=\n" +
	"\fgenerated_at\x18\x01 \x01(\v2\x1a.google.protobuf.TimestampR\vgeneratedAt\x12Q\n" +
	"\tproviders\x18\x02 \x03(\v23.loomcycle.v1.ResolverMatrixResponse.ProvidersEntryR\tproviders\x1ah\n" +
	"\x0eProvidersEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x12@\n" +
	"\x05value\x18\x02 \x01(\v2*.loomcycle.v1.ResolverProviderAvailabilityR\x05value:\x028\x01\"\xe0\x02\n" +
	"\x1cResolverProviderAvailability\x12\x1a\n" +
	"\bexcluded\x18\x01 \x01(\bR\bexcluded\x12\x1c\n" +
	"\treachable\x18\x02 \x01(\bR\treachable\x12N\n" +
	"\x06models\x18\x03 \x03(\v26.loomcycle.v1.ResolverProviderAvailability.ModelsEntryR\x06models\x129\n" +
	"\n" +
	"last_check\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\tlastCheck\x12\x1d\n" +
	"\n" +
	"last_error\x18\x05 \x01(\tR\tlastError\x1a\\\n" +
	"\vModelsEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x127\n" +
	"\x05value\x18\x02 \x01(\v2!.loomcycle.v1.ResolverModelStatusR\x05value:\x028\x01\"G\n" +
	"\x13ResolverModelStatus\x12\x16\n" +
	"\x06listed\x18\x01 \x01(\bR\x06listed\x12\x18\n" +
	"\astalled\x18\x02 \x01(\bR\astalled\"\xb6\x01\n" +
	"\x15CreateSnapshotRequest\x12'\n" +
	"\x0finclude_history\x18\x01 \x01(\bR\x0eincludeHistory\x125\n" +
	"\bsince_ts\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\asinceTs\x12 \n" +
	"\vdescription\x18\x03 \x01(\tR\vdescription\x12\x1b\n" +
	"\tmax_bytes\x18\x04 \x01(\x03R\bmaxBytes\"\xba\x02\n" +
	"\x12SnapshotDescriptor\x12\x1f\n" +
	"\vsnapshot_id\x18\x01 \x01(\tR\n" +
	"snapshotId\x129\n" +
	"\n" +
	"created_at\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12\x1d\n" +
	"\n" +
	"size_bytes\x18\x03 \x01(\x03R\tsizeBytes\x12)\n" +
	"\x10includes_history\x18\x04 \x01(\bR\x0fincludesHistory\x125\n" +
	"\bsince_ts\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\asinceTs\x12 \n" +
	"\vdescription\x18\x06 \x01(\tR\vdescription\x12%\n" +
	"\x0eformat_version\x18\a \x01(\tR\rformatVersion\"\x16\n" +
	"\x14ListSnapshotsRequest\"W\n" +
	"\x15ListSnapshotsResponse\x12>\n" +
	"\tsnapshots\x18\x01 \x03(\v2 .loomcycle.v1.SnapshotDescriptorR\tsnapshots\"5\n" +
	"\x12GetSnapshotRequest\x12\x1f\n" +
	"\vsnapshot_id\x18\x01 \x01(\tR\n" +
	"snapshotId\"\xf9\x01\n" +
	"\x10SnapshotEnvelope\x12\x1f\n" +
	"\vsnapshot_id\x18\x01 \x01(\tR\n" +
	"snapshotId\x129\n" +
	"\n" +
	"created_at\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12 \n" +
	"\vdescription\x18\x03 \x01(\tR\vdescription\x12%\n" +
	"\x0eformat_version\x18\x04 \x01(\tR\rformatVersion\x12\x1d\n" +
	"\n" +
	"size_bytes\x18\x05 \x01(\x03R\tsizeBytes\x12!\n" +
	"\fjson_content\x18\x06 \x01(\fR\vjsonContent\"8\n" +
	"\x15ExportSnapshotRequest\x12\x1f\n" +
	"\vsnapshot_id\x18\x01 \x01(\tR\n" +
	"snapshotId\"\xac\x01\n" +
	"\x16ExportSnapshotResponse\x12\x1f\n" +
	"\vsnapshot_id\x18\x01 \x01(\tR\n" +
	"snapshotId\x12\x1b\n" +
	"\tfile_path\x18\x02 \x01(\tR\bfilePath\x12\x1a\n" +
	"\bchecksum\x18\x03 \x01(\tR\bchecksum\x12\x1d\n" +
	"\n" +
	"size_bytes\x18\x04 \x01(\x03R\tsizeBytes\x12\x19\n" +
	"\braw_json\x18\x05 \x01(\fR\arawJson\"}\n" +
	"\x16RestoreSnapshotRequest\x12\x1f\n" +
	"\vsnapshot_id\x18\x01 \x01(\tR\n" +
	"snapshotId\x12\x19\n" +
	"\braw_json\x18\x02 \x01(\fR\arawJson\x12'\n" +
	"\x0finclude_history\x18\x03 \x01(\bR\x0eincludeHistory\"\x84\x05\n" +
	"\x17RestoreSnapshotResponse\x12.\n" +
	"\x13agent_defs_restored\x18\x01 \x01(\x05R\x11agentDefsRestored\x129\n" +
	"\x19agent_def_active_restored\x18\x02 \x01(\x05R\x16agentDefActiveRestored\x12'\n" +
	"\x0fmemory_restored\x18\x03 \x01(\x05R\x0ememoryRestored\x12:\n" +
	"\x19channel_messages_restored\x18\x04 \x01(\x05R\x17channelMessagesRestored\x128\n" +
	"\x18channel_cursors_restored\x18\x05 \x01(\x05R\x16channelCursorsRestored\x121\n" +
	"\x14evaluations_restored\x18\x06 \x01(\x05R\x13evaluationsRestored\x120\n" +
	"\x14paused_runs_restored\x18\a \x01(\x05R\x12pausedRunsRestored\x121\n" +
	"\x14synthesized_sessions\x18\b \x01(\x05R\x13synthesizedSessions\x12<\n" +
	"\x1atranscript_events_restored\x18\t \x01(\x05R\x18transcriptEventsRestored\x12@\n" +
	"\x1cinteraction_history_restored\x18\n" +
	" \x01(\x05R\x1ainteractionHistoryRestored\x12\x1a\n" +
	"\bwarnings\x18\v \x03(\tR\bwarnings\x12+\n" +
	"\x11format_migrations\x18\f \x03(\tR\x10formatMigrations\"8\n" +
	"\x15DeleteSnapshotRequest\x12\x1f\n" +
	"\vsnapshot_id\x18\x01 \x01(\tR\n" +
	"snapshotId\"S\n" +
	"\x16DeleteSnapshotResponse\x12\x18\n" +
	"\adeleted\x18\x01 \x01(\bR\adeleted\x12\x1f\n" +
	"\vsnapshot_id\x18\x02 \x01(\tR\n" +
	"snapshotId\"1\n" +
	"\x10SubstrateRequest\x12\x1d\n" +
	"\n" +
	"input_json\x18\x01 \x01(\fR\tinputJson\"O\n" +
	"\x11SubstrateResponse\x12\x1f\n" +
	"\voutput_json\x18\x01 \x01(\fR\n" +
	"outputJson\x12\x19\n" +
	"\bis_error\x18\x02 \x01(\bR\aisError\"\x15\n" +
	"\x13ListChannelsRequest\"S\n" +
	"\x14ListChannelsResponse\x12;\n" +
	"\bchannels\x18\x01 \x03(\v2\x1f.loomcycle.v1.ChannelDescriptorR\bchannels\"\xd0\x02\n" +
	"\x11ChannelDescriptor\x12\x12\n" +
	"\x04name\x18\x01 \x01(\tR\x04name\x12\x14\n" +
	"\x05scope\x18\x02 \x01(\tR\x05scope\x12\x1a\n" +
	"\bsemantic\x18\x03 \x01(\tR\bsemantic\x12\x1c\n" +
	"\tpublisher\x18\x04 \x01(\tR\tpublisher\x12\x16\n" +
	"\x06period\x18\x05 \x01(\tR\x06period\x12\x1f\n" +
	"\vdefault_ttl\x18\x06 \x01(\x05R\n" +
	"defaultTtl\x12!\n" +
	"\fmax_messages\x18\a \x01(\x05R\vmaxMessages\x12#\n" +
	"\rmessage_count\x18\b \x01(\x03R\fmessageCount\x12*\n" +
	"\x11oldest_visible_at\x18\t \x01(\tR\x0foldestVisibleAt\x12*\n" +
	"\x11newest_visible_at\x18\n" +
	" \x01(\tR\x0fnewestVisibleAt\"g\n" +
	"\x1aStreamUserRunStatesRequest\x12\x17\n" +
	"\auser_id\x18\x01 \x01(\tR\x06userId\x12\x1a\n" +
	"\bstatuses\x18\x02 \x03(\tR\bstatuses\x12\x14\n" +
	"\x05agent\x18\x03 \x01(\tR\x05agent\"\xf7\x01\n" +
	"\rRunStateEvent\x12\x15\n" +
	"\x06run_id\x18\x01 \x01(\tR\x05runId\x12\x19\n" +
	"\bagent_id\x18\x02 \x01(\tR\aagentId\x12\x14\n" +
	"\x05agent\x18\x03 \x01(\tR\x05agent\x12\x17\n" +
	"\auser_id\x18\x04 \x01(\tR\x06userId\x12&\n" +
	"\x0fparent_agent_id\x18\x05 \x01(\tR\rparentAgentId\x12\x16\n" +
	"\x06status\x18\x06 \x01(\tR\x06status\x12\x1f\n" +
	"\vstop_reason\x18\a \x01(\tR\n" +
	"stopReason\x12\x14\n" +
	"\x05error\x18\b \x01(\tR\x05error\x12\x0e\n" +
	"\x02ts\x18\t \x01(\tR\x02ts\"\x9b\x01\n" +
	"\x15PublishChannelRequest\x12\x18\n" +
	"\achannel\x18\x01 \x01(\tR\achannel\x12\x14\n" +
	"\x05scope\x18\x02 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x03 \x01(\tR\ascopeId\x12\x18\n" +
	"\apayload\x18\x04 \x01(\fR\apayload\x12\x1d\n" +
	"\n" +
	"deliver_at\x18\x05 \x01(\tR\tdeliverAt\"\x87\x01\n" +
	"\x16PublishChannelResponse\x12\x15\n" +
	"\x06msg_id\x18\x01 \x01(\tR\x05msgId\x12\x18\n" +
	"\achannel\x18\x02 \x01(\tR\achannel\x12\x1d\n" +
	"\n" +
	"created_at\x18\x03 \x01(\tR\tcreatedAt\x12\x1d\n" +
	"\n" +
	"visible_at\x18\x04 \x01(\tR\tvisibleAt\"\xc1\x01\n" +
	"\x17SubscribeChannelRequest\x12\x18\n" +
	"\achannel\x18\x01 \x01(\tR\achannel\x12\x14\n" +
	"\x05scope\x18\x02 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x03 \x01(\tR\ascopeId\x12\x1f\n" +
	"\vfrom_cursor\x18\x04 \x01(\tR\n" +
	"fromCursor\x12!\n" +
	"\fmax_messages\x18\x05 \x01(\x05R\vmaxMessages\x12\x17\n" +
	"\await_ms\x18\x06 \x01(\x05R\x06waitMs\"\x8f\x01\n" +
	"\x18SubscribeChannelResponse\x12\x18\n" +
	"\achannel\x18\x01 \x01(\tR\achannel\x128\n" +
	"\bmessages\x18\x02 \x03(\v2\x1c.loomcycle.v1.ChannelMessageR\bmessages\x12\x1f\n" +
	"\vnext_cursor\x18\x03 \x01(\tR\n" +
	"nextCursor\"Y\n" +
	"\x0eChannelMessage\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" +
	"\x05value\x18\x02 \x01(\fR\x05value\x12!\n" +
	"\fpublished_at\x18\x03 \x01(\tR\vpublishedAt\"\xa3\x01\n" +
	"\x12PeekChannelRequest\x12\x18\n" +
	"\achannel\x18\x01 \x01(\tR\achannel\x12\x14\n" +
	"\x05scope\x18\x02 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x03 \x01(\tR\ascopeId\x12\x1f\n" +
	"\vfrom_cursor\x18\x04 \x01(\tR\n" +
	"fromCursor\x12!\n" +
	"\fmax_messages\x18\x05 \x01(\x05R\vmaxMessages\"i\n" +
	"\x13PeekChannelResponse\x12\x18\n" +
	"\achannel\x18\x01 \x01(\tR\achannel\x128\n" +
	"\bmessages\x18\x02 \x03(\v2\x1c.loomcycle.v1.ChannelMessageR\bmessages\"v\n" +
	"\x11AckChannelRequest\x12\x18\n" +
	"\achannel\x18\x01 \x01(\tR\achannel\x12\x14\n" +
	"\x05scope\x18\x02 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x03 \x01(\tR\ascopeId\x12\x16\n" +
	"\x06cursor\x18\x04 \x01(\tR\x06cursor\"$\n" +
	"\x12AckChannelResponse\x12\x0e\n" +
	"\x02ok\x18\x01 \x01(\bR\x02ok\"\xe2\x01\n" +
	"\x14AwaitChannelsRequest\x12\x1a\n" +
	"\bchannels\x18\x01 \x03(\tR\bchannels\x12\x14\n" +
	"\x05scope\x18\x02 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x03 \x01(\tR\ascopeId\x12\x12\n" +
	"\x04mode\x18\x04 \x01(\tR\x04mode\x12\f\n" +
	"\x01n\x18\x05 \x01(\x05R\x01n\x12\x1f\n" +
	"\vfrom_cursor\x18\x06 \x01(\tR\n" +
	"fromCursor\x12!\n" +
	"\fmax_messages\x18\a \x01(\x05R\vmaxMessages\x12\x17\n" +
	"\await_ms\x18\b \x01(\x05R\x06waitMs\"n\n" +
	"\x11AwaitChannelEntry\x128\n" +
	"\bmessages\x18\x01 \x03(\v2\x1c.loomcycle.v1.ChannelMessageR\bmessages\x12\x1f\n" +
	"\vnext_cursor\x18\x02 \x01(\tR\n" +
	"nextCursor\"\xcc\x02\n" +
	"\x15AwaitChannelsResponse\x12\x1c\n" +
	"\tsatisfied\x18\x01 \x01(\bR\tsatisfied\x12\x1b\n" +
	"\ttimed_out\x18\x02 \x01(\bR\btimedOut\x12\x12\n" +
	"\x04mode\x18\x03 \x01(\tR\x04mode\x12\x14\n" +
	"\x05fired\x18\x04 \x03(\tR\x05fired\x12%\n" +
	"\x0etotal_messages\x18\x05 \x01(\x05R\rtotalMessages\x12J\n" +
	"\aresults\x18\x06 \x03(\v20.loomcycle.v1.AwaitChannelsResponse.ResultsEntryR\aresults\x1a[\n" +
	"\fResultsEntry\x12\x10\n" +
	"\x03key\x18\x01 \x01(\tR\x03key\x125\n" +
	"\x05value\x18\x02 \x01(\v2\x1f.loomcycle.v1.AwaitChannelEntryR\x05value:\x028\x01\"\xa0\x01\n" +
	"\x18BroadcastChannelsRequest\x12\x1a\n" +
	"\bchannels\x18\x01 \x03(\tR\bchannels\x12\x14\n" +
	"\x05scope\x18\x02 \x01(\tR\x05scope\x12\x19\n" +
	"\bscope_id\x18\x03 \x01(\tR\ascopeId\x12\x18\n" +
	"\apayload\x18\x04 \x01(\fR\apayload\x12\x1d\n" +
	"\n" +
	"deliver_at\x18\x05 \x01(\tR\tdeliverAt\"\x9c\x01\n" +
	"\x15BroadcastChannelEntry\x12\x18\n" +
	"\achannel\x18\x01 \x01(\tR\achannel\x12\x15\n" +
	"\x06msg_id\x18\x02 \x01(\tR\x05msgId\x12\x1d\n" +
	"\n" +
	"created_at\x18\x03 \x01(\tR\tcreatedAt\x12\x1d\n" +
	"\n" +
	"visible_at\x18\x04 \x01(\tR\tvisibleAt\x12\x14\n" +
	"\x05error\x18\x05 \x01(\tR\x05error\"\x90\x01\n" +
	"\x19BroadcastChannelsResponse\x12\x1c\n" +
	"\tpublished\x18\x01 \x01(\x05R\tpublished\x12\x16\n" +
	"\x06failed\x18\x02 \x01(\x05R\x06failed\x12=\n" +
	"\aresults\x18\x03 \x03(\v2#.loomcycle.v1.BroadcastChannelEntryR\aresults2\xb6%\n" +
	"\tLoomcycle\x126\n" +
	"\x03Run\x12\x18.loomcycle.v1.RunRequest\x1a\x13.loomcycle.v1.Event0\x01\x12@\n" +
	"\bContinue\x12\x1d.loomcycle.v1.ContinueRequest\x1a\x13.loomcycle.v1.Event0\x01\x12P\n" +
	"\rSpawnRunBatch\x12\x1f.loomcycle.v1.BatchSpawnRequest\x1a\x1e.loomcycle.v1.BatchSpawnResult\x12M\n" +
	"\n" +
	"CompactRun\x12\x1f.loomcycle.v1.CompactRunRequest\x1a\x1e.loomcycle.v1.CompactRunResult\x12[\n" +
	"\x0eDirectoryUsers\x12#.loomcycle.v1.DirectoryUsersRequest\x1a$.loomcycle.v1.DirectoryUsersResponse\x12a\n" +
	"\x10DirectoryInspect\x12%.loomcycle.v1.DirectoryInspectRequest\x1a&.loomcycle.v1.DirectoryInspectResponse\x12a\n" +
	"\x10DirectoryTenants\x12%.loomcycle.v1.DirectoryTenantsRequest\x1a&.loomcycle.v1.DirectoryTenantsResponse\x12X\n" +
	"\rErasureReport\x12\".loomcycle.v1.ErasureReportRequest\x1a#.loomcycle.v1.ErasureReportResponse\x12[\n" +
	"\x0eErasureExecute\x12#.loomcycle.v1.ErasureExecuteRequest\x1a$.loomcycle.v1.ErasureExecuteResponse\x12V\n" +
	"\rReplaySession\x12\".loomcycle.v1.ReplaySessionRequest\x1a!.loomcycle.v1.ReplaySessionResult\x12I\n" +
	"\bRunInput\x12\x1d.loomcycle.v1.RunInputRequest\x1a\x1e.loomcycle.v1.RunInputResponse\x12O\n" +
	"\n" +
	"CancelTurn\x12\x1f.loomcycle.v1.CancelTurnRequest\x1a .loomcycle.v1.CancelTurnResponse\x12a\n" +
	"\x10ResolveInterrupt\x12%.loomcycle.v1.ResolveInterruptRequest\x1a&.loomcycle.v1.ResolveInterruptResponse\x12B\n" +
	"\tStreamRun\x12\x1e.loomcycle.v1.StreamRunRequest\x1a\x13.loomcycle.v1.Event0\x01\x12M\n" +
	"\rGetTranscript\x12\".loomcycle.v1.GetTranscriptRequest\x1a\x18.loomcycle.v1.Transcript\x12>\n" +
	"\bGetAgent\x12\x1d.loomcycle.v1.GetAgentRequest\x1a\x13.loomcycle.v1.Agent\x12R\n" +
	"\vCancelAgent\x12 .loomcycle.v1.CancelAgentRequest\x1a!.loomcycle.v1.CancelAgentResponse\x12[\n" +
	"\x0eListUserAgents\x12#.loomcycle.v1.ListUserAgentsRequest\x1a$.loomcycle.v1.ListUserAgentsResponse\x12R\n" +
	"\vUsageReport\x12 .loomcycle.v1.UsageReportRequest\x1a!.loomcycle.v1.UsageReportResponse\x12O\n" +
	"\n" +
	"TokenLimit\x12\x1f.loomcycle.v1.TokenLimitRequest\x1a .loomcycle.v1.TokenLimitResponse\x12C\n" +
	"\x06Health\x12\x1b.loomcycle.v1.HealthRequest\x1a\x1c.loomcycle.v1.HealthResponse\x12C\n" +
	"\x06Config\x12\x1b.loomcycle.v1.ConfigRequest\x1a\x1c.loomcycle.v1.ConfigResponse\x12U\n" +
	"\fRegisterHook\x12!.loomcycle.v1.RegisterHookRequest\x1a\".loomcycle.v1.RegisterHookResponse\x12L\n" +
	"\tListHooks\x12\x1e.loomcycle.v1.ListHooksRequest\x1a\x1f.loomcycle.v1.ListHooksResponse\x12O\n" +
	"\n" +
	"DeleteHook\x12\x1f.loomcycle.v1.DeleteHookRequest\x1a .loomcycle.v1.DeleteHookResponse\x12U\n" +
	"\fPauseRuntime\x12!.loomcycle.v1.PauseRuntimeRequest\x1a\".loomcycle.v1.PauseRuntimeResponse\x12X\n" +
	"\rResumeRuntime\x12\".loomcycle.v1.ResumeRuntimeRequest\x1a#.loomcycle.v1.ResumeRuntimeResponse\x12[\n" +
	"\x0fGetRuntimeState\x12$.loomcycle.v1.GetRuntimeStateRequest\x1a\".loomcycle.v1.RuntimeStateResponse\x12W\n" +
	"\fResolveProbe\x12!.loomcycle.v1.ResolveProbeRequest\x1a$.loomcycle.v1.ResolverMatrixResponse\x12W\n" +
	"\x0eCreateSnapshot\x12#.loomcycle.v1.CreateSnapshotRequest\x1a .loomcycle.v1.SnapshotDescriptor\x12X\n" +
	"\rListSnapshots\x12\".loomcycle.v1.ListSnapshotsRequest\x1a#.loomcycle.v1.ListSnapshotsResponse\x12O\n" +
	"\vGetSnapshot\x12 .loomcycle.v1.GetSnapshotRequest\x1a\x1e.loomcycle.v1.SnapshotEnvelope\x12[\n" +
	"\x0eExportSnapshot\x12#.loomcycle.v1.ExportSnapshotRequest\x1a$.loomcycle.v1.ExportSnapshotResponse\x12^\n" +
	"\x0fRestoreSnapshot\x12$.loomcycle.v1.RestoreSnapshotRequest\x1a%.loomcycle.v1.RestoreSnapshotResponse\x12[\n" +
	"\x0eDeleteSnapshot\x12#.loomcycle.v1.DeleteSnapshotRequest\x1a$.loomcycle.v1.DeleteSnapshotResponse\x12K\n" +
	"\bAgentDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12K\n" +
	"\bSkillDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12O\n" +
	"\fMCPServerDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12N\n" +
	"\vScheduleDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12S\n" +
	"\x10A2AServerCardDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12N\n" +
	"\vA2AAgentDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12M\n" +
	"\n" +
	"WebhookDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12S\n" +
	"\x10MemoryBackendDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12S\n" +
	"\x10OperatorTokenDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12L\n" +
	"\tVolumeDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12J\n" +
	"\aTeamDef\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12G\n" +
	"\x04Path\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12K\n" +
	"\bDocument\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12J\n" +
	"\aHistory\x12\x1e.loomcycle.v1.SubstrateRequest\x1a\x1f.loomcycle.v1.SubstrateResponse\x12U\n" +
	"\fListChannels\x12!.loomcycle.v1.ListChannelsRequest\x1a\".loomcycle.v1.ListChannelsResponse\x12^\n" +
	"\x13StreamUserRunStates\x12(.loomcycle.v1.StreamUserRunStatesRequest\x1a\x1b.loomcycle.v1.RunStateEvent0\x01\x12[\n" +
	"\x0ePublishChannel\x12#.loomcycle.v1.PublishChannelRequest\x1a$.loomcycle.v1.PublishChannelResponse\x12a\n" +
	"\x10SubscribeChannel\x12%.loomcycle.v1.SubscribeChannelRequest\x1a&.loomcycle.v1.SubscribeChannelResponse\x12R\n" +
	"\vPeekChannel\x12 .loomcycle.v1.PeekChannelRequest\x1a!.loomcycle.v1.PeekChannelResponse\x12O\n" +
	"\n" +
	"AckChannel\x12\x1f.loomcycle.v1.AckChannelRequest\x1a .loomcycle.v1.AckChannelResponse\x12X\n" +
	"\rAwaitChannels\x12\".loomcycle.v1.AwaitChannelsRequest\x1a#.loomcycle.v1.AwaitChannelsResponse\x12d\n" +
	"\x11BroadcastChannels\x12&.loomcycle.v1.BroadcastChannelsRequest\x1a'.loomcycle.v1.BroadcastChannelsResponseBLZJgithub.com/denn-gubsky/loomcycle/internal/api/grpc/loomcyclepb;loomcyclepbb\x06proto3"

var (
	file_loomcycle_proto_rawDescOnce sync.Once
	file_loomcycle_proto_rawDescData []byte
)

func file_loomcycle_proto_rawDescGZIP() []byte {
	file_loomcycle_proto_rawDescOnce.Do(func() {
		file_loomcycle_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_loomcycle_proto_rawDesc), len(file_loomcycle_proto_rawDesc)))
	})
	return file_loomcycle_proto_rawDescData
}

var file_loomcycle_proto_msgTypes = make([]protoimpl.MessageInfo, 125)
var file_loomcycle_proto_goTypes = []any{
	(*RunRequest)(nil),                   // 0: loomcycle.v1.RunRequest
	(*ContinueRequest)(nil),              // 1: loomcycle.v1.ContinueRequest
	(*Sampling)(nil),                     // 2: loomcycle.v1.Sampling
	(*Compaction)(nil),                   // 3: loomcycle.v1.Compaction
	(*BatchSpawnRequest)(nil),            // 4: loomcycle.v1.BatchSpawnRequest
	(*SpawnResult)(nil),                  // 5: loomcycle.v1.SpawnResult
	(*BatchSpawnResult)(nil),             // 6: loomcycle.v1.BatchSpawnResult
	(*DirectoryUsersRequest)(nil),        // 7: loomcycle.v1.DirectoryUsersRequest
	(*DirectoryUser)(nil),                // 8: loomcycle.v1.DirectoryUser
	(*DirectoryUsersResponse)(nil),       // 9: loomcycle.v1.DirectoryUsersResponse
	(*DirectoryInspectRequest)(nil),      // 10: loomcycle.v1.DirectoryInspectRequest
	(*DirectoryBudget)(nil),              // 11: loomcycle.v1.DirectoryBudget
	(*DirectoryUsage)(nil),               // 12: loomcycle.v1.DirectoryUsage
	(*DirectoryInspectResponse)(nil),     // 13: loomcycle.v1.DirectoryInspectResponse
	(*DirectoryTenantsRequest)(nil),      // 14: loomcycle.v1.DirectoryTenantsRequest
	(*DirectoryTenant)(nil),              // 15: loomcycle.v1.DirectoryTenant
	(*DirectoryTenantsResponse)(nil),     // 16: loomcycle.v1.DirectoryTenantsResponse
	(*ErasureReportRequest)(nil),         // 17: loomcycle.v1.ErasureReportRequest
	(*ErasureTier)(nil),                  // 18: loomcycle.v1.ErasureTier
	(*ErasureResidue)(nil),               // 19: loomcycle.v1.ErasureResidue
	(*ErasureReportResponse)(nil),        // 20: loomcycle.v1.ErasureReportResponse
	(*ErasureExecuteRequest)(nil),        // 21: loomcycle.v1.ErasureExecuteRequest
	(*ErasureExecuteResponse)(nil),       // 22: loomcycle.v1.ErasureExecuteResponse
	(*CompactRunRequest)(nil),            // 23: loomcycle.v1.CompactRunRequest
	(*CompactRunResult)(nil),             // 24: loomcycle.v1.CompactRunResult
	(*ReplaySessionRequest)(nil),         // 25: loomcycle.v1.ReplaySessionRequest
	(*ReplaySessionResult)(nil),          // 26: loomcycle.v1.ReplaySessionResult
	(*RunInputRequest)(nil),              // 27: loomcycle.v1.RunInputRequest
	(*RunInputResponse)(nil),             // 28: loomcycle.v1.RunInputResponse
	(*CancelTurnRequest)(nil),            // 29: loomcycle.v1.CancelTurnRequest
	(*CancelTurnResponse)(nil),           // 30: loomcycle.v1.CancelTurnResponse
	(*ResolveInterruptRequest)(nil),      // 31: loomcycle.v1.ResolveInterruptRequest
	(*ResolveInterruptResponse)(nil),     // 32: loomcycle.v1.ResolveInterruptResponse
	(*StreamRunRequest)(nil),             // 33: loomcycle.v1.StreamRunRequest
	(*HostAllowlist)(nil),                // 34: loomcycle.v1.HostAllowlist
	(*PromptSegment)(nil),                // 35: loomcycle.v1.PromptSegment
	(*PromptContentBlock)(nil),           // 36: loomcycle.v1.PromptContentBlock
	(*Event)(nil),                        // 37: loomcycle.v1.Event
	(*AwaitingInput)(nil),                // 38: loomcycle.v1.AwaitingInput
	(*UserInput)(nil),                    // 39: loomcycle.v1.UserInput
	(*HostWidening)(nil),                 // 40: loomcycle.v1.HostWidening
	(*ToolUse)(nil),                      // 41: loomcycle.v1.ToolUse
	(*Usage)(nil),                        // 42: loomcycle.v1.Usage
	(*Retry)(nil),                        // 43: loomcycle.v1.Retry
	(*LimitInfo)(nil),                    // 44: loomcycle.v1.LimitInfo
	(*GetTranscriptRequest)(nil),         // 45: loomcycle.v1.GetTranscriptRequest
	(*Transcript)(nil),                   // 46: loomcycle.v1.Transcript
	(*TranscriptEvent)(nil),              // 47: loomcycle.v1.TranscriptEvent
	(*GetAgentRequest)(nil),              // 48: loomcycle.v1.GetAgentRequest
	(*Agent)(nil),                        // 49: loomcycle.v1.Agent
	(*AgentUsage)(nil),                   // 50: loomcycle.v1.AgentUsage
	(*CancelAgentRequest)(nil),           // 51: loomcycle.v1.CancelAgentRequest
	(*CancelAgentResponse)(nil),          // 52: loomcycle.v1.CancelAgentResponse
	(*ListUserAgentsRequest)(nil),        // 53: loomcycle.v1.ListUserAgentsRequest
	(*ListUserAgentsResponse)(nil),       // 54: loomcycle.v1.ListUserAgentsResponse
	(*UsageReportRequest)(nil),           // 55: loomcycle.v1.UsageReportRequest
	(*UsageAggregate)(nil),               // 56: loomcycle.v1.UsageAggregate
	(*UsageReportResponse)(nil),          // 57: loomcycle.v1.UsageReportResponse
	(*TokenLimitRequest)(nil),            // 58: loomcycle.v1.TokenLimitRequest
	(*TokenLimitEntry)(nil),              // 59: loomcycle.v1.TokenLimitEntry
	(*TokenLimitResponse)(nil),           // 60: loomcycle.v1.TokenLimitResponse
	(*ConfigRequest)(nil),                // 61: loomcycle.v1.ConfigRequest
	(*ConfigResponse)(nil),               // 62: loomcycle.v1.ConfigResponse
	(*HealthRequest)(nil),                // 63: loomcycle.v1.HealthRequest
	(*HealthResponse)(nil),               // 64: loomcycle.v1.HealthResponse
	(*RegisterHookRequest)(nil),          // 65: loomcycle.v1.RegisterHookRequest
	(*RegisterHookResponse)(nil),         // 66: loomcycle.v1.RegisterHookResponse
	(*ListHooksRequest)(nil),             // 67: loomcycle.v1.ListHooksRequest
	(*Hook)(nil),                         // 68: loomcycle.v1.Hook
	(*ListHooksResponse)(nil),            // 69: loomcycle.v1.ListHooksResponse
	(*DeleteHookRequest)(nil),            // 70: loomcycle.v1.DeleteHookRequest
	(*DeleteHookResponse)(nil),           // 71: loomcycle.v1.DeleteHookResponse
	(*PauseRuntimeRequest)(nil),          // 72: loomcycle.v1.PauseRuntimeRequest
	(*PauseRuntimeResponse)(nil),         // 73: loomcycle.v1.PauseRuntimeResponse
	(*ResumeRuntimeRequest)(nil),         // 74: loomcycle.v1.ResumeRuntimeRequest
	(*ResumeRuntimeResponse)(nil),        // 75: loomcycle.v1.ResumeRuntimeResponse
	(*GetRuntimeStateRequest)(nil),       // 76: loomcycle.v1.GetRuntimeStateRequest
	(*RuntimeStateResponse)(nil),         // 77: loomcycle.v1.RuntimeStateResponse
	(*ResolveProbeRequest)(nil),          // 78: loomcycle.v1.ResolveProbeRequest
	(*ResolverMatrixResponse)(nil),       // 79: loomcycle.v1.ResolverMatrixResponse
	(*ResolverProviderAvailability)(nil), // 80: loomcycle.v1.ResolverProviderAvailability
	(*ResolverModelStatus)(nil),          // 81: loomcycle.v1.ResolverModelStatus
	(*CreateSnapshotRequest)(nil),        // 82: loomcycle.v1.CreateSnapshotRequest
	(*SnapshotDescriptor)(nil),           // 83: loomcycle.v1.SnapshotDescriptor
	(*ListSnapshotsRequest)(nil),         // 84: loomcycle.v1.ListSnapshotsRequest
	(*ListSnapshotsResponse)(nil),        // 85: loomcycle.v1.ListSnapshotsResponse
	(*GetSnapshotRequest)(nil),           // 86: loomcycle.v1.GetSnapshotRequest
	(*SnapshotEnvelope)(nil),             // 87: loomcycle.v1.SnapshotEnvelope
	(*ExportSnapshotRequest)(nil),        // 88: loomcycle.v1.ExportSnapshotRequest
	(*ExportSnapshotResponse)(nil),       // 89: loomcycle.v1.ExportSnapshotResponse
	(*RestoreSnapshotRequest)(nil),       // 90: loomcycle.v1.RestoreSnapshotRequest
	(*RestoreSnapshotResponse)(nil),      // 91: loomcycle.v1.RestoreSnapshotResponse
	(*DeleteSnapshotRequest)(nil),        // 92: loomcycle.v1.DeleteSnapshotRequest
	(*DeleteSnapshotResponse)(nil),       // 93: loomcycle.v1.DeleteSnapshotResponse
	(*SubstrateRequest)(nil),             // 94: loomcycle.v1.SubstrateRequest
	(*SubstrateResponse)(nil),            // 95: loomcycle.v1.SubstrateResponse
	(*ListChannelsRequest)(nil),          // 96: loomcycle.v1.ListChannelsRequest
	(*ListChannelsResponse)(nil),         // 97: loomcycle.v1.ListChannelsResponse
	(*ChannelDescriptor)(nil),            // 98: loomcycle.v1.ChannelDescriptor
	(*StreamUserRunStatesRequest)(nil),   // 99: loomcycle.v1.StreamUserRunStatesRequest
	(*RunStateEvent)(nil),                // 100: loomcycle.v1.RunStateEvent
	(*PublishChannelRequest)(nil),        // 101: loomcycle.v1.PublishChannelRequest
	(*PublishChannelResponse)(nil),       // 102: loomcycle.v1.PublishChannelResponse
	(*SubscribeChannelRequest)(nil),      // 103: loomcycle.v1.SubscribeChannelRequest
	(*SubscribeChannelResponse)(nil),     // 104: loomcycle.v1.SubscribeChannelResponse
	(*ChannelMessage)(nil),               // 105: loomcycle.v1.ChannelMessage
	(*PeekChannelRequest)(nil),           // 106: loomcycle.v1.PeekChannelRequest
	(*PeekChannelResponse)(nil),          // 107: loomcycle.v1.PeekChannelResponse
	(*AckChannelRequest)(nil),            // 108: loomcycle.v1.AckChannelRequest
	(*AckChannelResponse)(nil),           // 109: loomcycle.v1.AckChannelResponse
	(*AwaitChannelsRequest)(nil),         // 110: loomcycle.v1.AwaitChannelsRequest
	(*AwaitChannelEntry)(nil),            // 111: loomcycle.v1.AwaitChannelEntry
	(*AwaitChannelsResponse)(nil),        // 112: loomcycle.v1.AwaitChannelsResponse
	(*BroadcastChannelsRequest)(nil),     // 113: loomcycle.v1.BroadcastChannelsRequest
	(*BroadcastChannelEntry)(nil),        // 114: loomcycle.v1.BroadcastChannelEntry
	(*BroadcastChannelsResponse)(nil),    // 115: loomcycle.v1.BroadcastChannelsResponse
	nil,                                  // 116: loomcycle.v1.RunRequest.UserCredentialsEntry
	nil,                                  // 117: loomcycle.v1.ContinueRequest.UserCredentialsEntry
	nil,                                  // 118: loomcycle.v1.DirectoryInspectResponse.MemoryEntry
	nil,                                  // 119: loomcycle.v1.ErasureTier.CountsEntry
	nil,                                  // 120: loomcycle.v1.ErasureExecuteResponse.DeletedEntry
	nil,                                  // 121: loomcycle.v1.ErasureExecuteResponse.RetainedEntry
	nil,                                  // 122: loomcycle.v1.ResolverMatrixResponse.ProvidersEntry
	nil,                                  // 123: loomcycle.v1.ResolverProviderAvailability.ModelsEntry
	nil,                                  // 124: loomcycle.v1.AwaitChannelsResponse.ResultsEntry
	(*timestamppb.Timestamp)(nil),        // 125: google.protobuf.Timestamp
}
var file_loomcycle_proto_depIdxs = []int32{
	35,  // 0: loomcycle.v1.RunRequest.segments:type_name -> loomcycle.v1.PromptSegment
	34,  // 1: loomcycle.v1.RunRequest.allowed_hosts:type_name -> loomcycle.v1.HostAllowlist
	116, // 2: loomcycle.v1.RunRequest.user_credentials:type_name -> loomcycle.v1.RunRequest.UserCredentialsEntry
	2,   // 3: loomcycle.v1.RunRequest.sampling:type_name -> loomcycle.v1.Sampling
	3,   // 4: loomcycle.v1.RunRequest.compaction:type_name -> loomcycle.v1.Compaction
	35,  // 5: loomcycle.v1.ContinueRequest.segments:type_name -> loomcycle.v1.PromptSegment
	34,  // 6: loomcycle.v1.ContinueRequest.allowed_hosts:type_name -> loomcycle.v1.HostAllowlist
	117, // 7: loomcycle.v1.ContinueRequest.user_credentials:type_name -> loomcycle.v1.ContinueRequest.UserCredentialsEntry
	2,   // 8: loomcycle.v1.ContinueRequest.sampling:type_name -> loomcycle.v1.Sampling
	3,   // 9: loomcycle.v1.ContinueRequest.compaction:type_name -> loomcycle.v1.Compaction
	0,   // 10: loomcycle.v1.BatchSpawnRequest.spawns:type_name -> loomcycle.v1.RunRequest
	42,  // 11: loomcycle.v1.SpawnResult.usage:type_name -> loomcycle.v1.Usage
	5,   // 12: loomcycle.v1.BatchSpawnResult.results:type_name -> loomcycle.v1.SpawnResult
	8,   // 13: loomcycle.v1.DirectoryUsersResponse.users:type_name -> loomcycle.v1.DirectoryUser
	8,   // 14: loomcycle.v1.DirectoryInspectResponse.activity:type_name -> loomcycle.v1.DirectoryUser
	118, // 15: loomcycle.v1.DirectoryInspectResponse.memory:type_name -> loomcycle.v1.DirectoryInspectResponse.MemoryEntry
	11,  // 16: loomcycle.v1.DirectoryInspectResponse.budget:type_name -> loomcycle.v1.DirectoryBudget
	12,  // 17: loomcycle.v1.DirectoryInspectResponse.usage:type_name -> loomcycle.v1.DirectoryUsage
	15,  // 18: loomcycle.v1.DirectoryTenantsResponse.tenants:type_name -> loomcycle.v1.DirectoryTenant
	119, // 19: loomcycle.v1.ErasureTier.counts:type_name -> loomcycle.v1.ErasureTier.CountsEntry
	18,  // 20: loomcycle.v1.ErasureReportResponse.tier1_covered:type_name -> loomcycle.v1.ErasureTier
	18,  // 21: loomcycle.v1.ErasureReportResponse.tier2_uncovered:type_name -> loomcycle.v1.ErasureTier
	19,  // 22: loomcycle.v1.ErasureReportResponse.tier3_residue:type_name -> loomcycle.v1.ErasureResidue
	120, // 23: loomcycle.v1.ErasureExecuteResponse.deleted:type_name -> loomcycle.v1.ErasureExecuteResponse.DeletedEntry
	121, // 24: loomcycle.v1.ErasureExecuteResponse.retained:type_name -> loomcycle.v1.ErasureExecuteResponse.RetainedEntry
	19,  // 25: loomcycle.v1.ErasureExecuteResponse.residue:type_name -> loomcycle.v1.ErasureResidue
	36,  // 26: loomcycle.v1.PromptSegment.content:type_name -> loomcycle.v1.PromptContentBlock
	41,  // 27: loomcycle.v1.Event.tool_use:type_name -> loomcycle.v1.ToolUse
	42,  // 28: loomcycle.v1.Event.usage:type_name -> loomcycle.v1.Usage
	43,  // 29: loomcycle.v1.Event.retry:type_name -> loomcycle.v1.Retry
	40,  // 30: loomcycle.v1.Event.host_widening:type_name -> loomcycle.v1.HostWidening
	38,  // 31: loomcycle.v1.Event.awaiting_input:type_name -> loomcycle.v1.AwaitingInput
	39,  // 32: loomcycle.v1.Event.user_input:type_name -> loomcycle.v1.UserInput
	44,  // 33: loomcycle.v1.Event.limit:type_name -> loomcycle.v1.LimitInfo
	47,  // 34: loomcycle.v1.Transcript.events:type_name -> loomcycle.v1.TranscriptEvent
	125, // 35: loomcycle.v1.TranscriptEvent.ts:type_name -> google.protobuf.Timestamp
	125, // 36: loomcycle.v1.Agent.started_at:type_name -> google.protobuf.Timestamp
	125, // 37: loomcycle.v1.Agent.completed_at:type_name -> google.protobuf.Timestamp
	50,  // 38: loomcycle.v1.Agent.usage:type_name -> loomcycle.v1.AgentUsage
	125, // 39: loomcycle.v1.Agent.last_heartbeat_at:type_name -> google.protobuf.Timestamp
	49,  // 40: loomcycle.v1.ListUserAgentsResponse.agents:type_name -> loomcycle.v1.Agent
	56,  // 41: loomcycle.v1.UsageReportResponse.rows:type_name -> loomcycle.v1.UsageAggregate
	59,  // 42: loomcycle.v1.TokenLimitResponse.limits:type_name -> loomcycle.v1.TokenLimitEntry
	125, // 43: loomcycle.v1.Hook.registered_at:type_name -> google.protobuf.Timestamp
	68,  // 44: loomcycle.v1.ListHooksResponse.hooks:type_name -> loomcycle.v1.Hook
	125, // 45: loomcycle.v1.RuntimeStateResponse.paused_at:type_name -> google.protobuf.Timestamp
	125, // 46: loomcycle.v1.ResolverMatrixResponse.generated_at:type_name -> google.protobuf.Timestamp
	122, // 47: loomcycle.v1.ResolverMatrixResponse.providers:type_name -> loomcycle.v1.ResolverMatrixResponse.ProvidersEntry
	123, // 48: loomcycle.v1.ResolverProviderAvailability.models:type_name -> loomcycle.v1.ResolverProviderAvailability.ModelsEntry
	125, // 49: loomcycle.v1.ResolverProviderAvailability.last_check:type_name -> google.protobuf.Timestamp
	125, // 50: loomcycle.v1.CreateSnapshotRequest.since_ts:type_name -> google.protobuf.Timestamp
	125, // 51: loomcycle.v1.SnapshotDescriptor.created_at:type_name -> google.protobuf.Timestamp
	125, // 52: loomcycle.v1.SnapshotDescriptor.since_ts:type_name -> google.protobuf.Timestamp
	83,  // 53: loomcycle.v1.ListSnapshotsResponse.snapshots:type_name -> loomcycle.v1.SnapshotDescriptor
	125, // 54: loomcycle.v1.SnapshotEnvelope.created_at:type_name -> google.protobuf.Timestamp
	98,  // 55: loomcycle.v1.ListChannelsResponse.channels:type_name -> loomcycle.v1.ChannelDescriptor
	105, // 56: loomcycle.v1.SubscribeChannelResponse.messages:type_name -> loomcycle.v1.ChannelMessage
	105, // 57: loomcycle.v1.PeekChannelResponse.messages:type_name -> loomcycle.v1.ChannelMessage
	105, // 58: loomcycle.v1.AwaitChannelEntry.messages:type_name -> loomcycle.v1.ChannelMessage
	124, // 59: loomcycle.v1.AwaitChannelsResponse.results:type_name -> loomcycle.v1.AwaitChannelsResponse.ResultsEntry
	114, // 60: loomcycle.v1.BroadcastChannelsResponse.results:type_name -> loomcycle.v1.BroadcastChannelEntry
	80,  // 61: loomcycle.v1.ResolverMatrixResponse.ProvidersEntry.value:type_name -> loomcycle.v1.ResolverProviderAvailability
	81,  // 62: loomcycle.v1.ResolverProviderAvailability.ModelsEntry.value:type_name -> loomcycle.v1.ResolverModelStatus
	111, // 63: loomcycle.v1.AwaitChannelsResponse.ResultsEntry.value:type_name -> loomcycle.v1.AwaitChannelEntry
	0,   // 64: loomcycle.v1.Loomcycle.Run:input_type -> loomcycle.v1.RunRequest
	1,   // 65: loomcycle.v1.Loomcycle.Continue:input_type -> loomcycle.v1.ContinueRequest
	4,   // 66: loomcycle.v1.Loomcycle.SpawnRunBatch:input_type -> loomcycle.v1.BatchSpawnRequest
	23,  // 67: loomcycle.v1.Loomcycle.CompactRun:input_type -> loomcycle.v1.CompactRunRequest
	7,   // 68: loomcycle.v1.Loomcycle.DirectoryUsers:input_type -> loomcycle.v1.DirectoryUsersRequest
	10,  // 69: loomcycle.v1.Loomcycle.DirectoryInspect:input_type -> loomcycle.v1.DirectoryInspectRequest
	14,  // 70: loomcycle.v1.Loomcycle.DirectoryTenants:input_type -> loomcycle.v1.DirectoryTenantsRequest
	17,  // 71: loomcycle.v1.Loomcycle.ErasureReport:input_type -> loomcycle.v1.ErasureReportRequest
	21,  // 72: loomcycle.v1.Loomcycle.ErasureExecute:input_type -> loomcycle.v1.ErasureExecuteRequest
	25,  // 73: loomcycle.v1.Loomcycle.ReplaySession:input_type -> loomcycle.v1.ReplaySessionRequest
	27,  // 74: loomcycle.v1.Loomcycle.RunInput:input_type -> loomcycle.v1.RunInputRequest
	29,  // 75: loomcycle.v1.Loomcycle.CancelTurn:input_type -> loomcycle.v1.CancelTurnRequest
	31,  // 76: loomcycle.v1.Loomcycle.ResolveInterrupt:input_type -> loomcycle.v1.ResolveInterruptRequest
	33,  // 77: loomcycle.v1.Loomcycle.StreamRun:input_type -> loomcycle.v1.StreamRunRequest
	45,  // 78: loomcycle.v1.Loomcycle.GetTranscript:input_type -> loomcycle.v1.GetTranscriptRequest
	48,  // 79: loomcycle.v1.Loomcycle.GetAgent:input_type -> loomcycle.v1.GetAgentRequest
	51,  // 80: loomcycle.v1.Loomcycle.CancelAgent:input_type -> loomcycle.v1.CancelAgentRequest
	53,  // 81: loomcycle.v1.Loomcycle.ListUserAgents:input_type -> loomcycle.v1.ListUserAgentsRequest
	55,  // 82: loomcycle.v1.Loomcycle.UsageReport:input_type -> loomcycle.v1.UsageReportRequest
	58,  // 83: loomcycle.v1.Loomcycle.TokenLimit:input_type -> loomcycle.v1.TokenLimitRequest
	63,  // 84: loomcycle.v1.Loomcycle.Health:input_type -> loomcycle.v1.HealthRequest
	61,  // 85: loomcycle.v1.Loomcycle.Config:input_type -> loomcycle.v1.ConfigRequest
	65,  // 86: loomcycle.v1.Loomcycle.RegisterHook:input_type -> loomcycle.v1.RegisterHookRequest
	67,  // 87: loomcycle.v1.Loomcycle.ListHooks:input_type -> loomcycle.v1.ListHooksRequest
	70,  // 88: loomcycle.v1.Loomcycle.DeleteHook:input_type -> loomcycle.v1.DeleteHookRequest
	72,  // 89: loomcycle.v1.Loomcycle.PauseRuntime:input_type -> loomcycle.v1.PauseRuntimeRequest
	74,  // 90: loomcycle.v1.Loomcycle.ResumeRuntime:input_type -> loomcycle.v1.ResumeRuntimeRequest
	76,  // 91: loomcycle.v1.Loomcycle.GetRuntimeState:input_type -> loomcycle.v1.GetRuntimeStateRequest
	78,  // 92: loomcycle.v1.Loomcycle.ResolveProbe:input_type -> loomcycle.v1.ResolveProbeRequest
	82,  // 93: loomcycle.v1.Loomcycle.CreateSnapshot:input_type -> loomcycle.v1.CreateSnapshotRequest
	84,  // 94: loomcycle.v1.Loomcycle.ListSnapshots:input_type -> loomcycle.v1.ListSnapshotsRequest
	86,  // 95: loomcycle.v1.Loomcycle.GetSnapshot:input_type -> loomcycle.v1.GetSnapshotRequest
	88,  // 96: loomcycle.v1.Loomcycle.ExportSnapshot:input_type -> loomcycle.v1.ExportSnapshotRequest
	90,  // 97: loomcycle.v1.Loomcycle.RestoreSnapshot:input_type -> loomcycle.v1.RestoreSnapshotRequest
	92,  // 98: loomcycle.v1.Loomcycle.DeleteSnapshot:input_type -> loomcycle.v1.DeleteSnapshotRequest
	94,  // 99: loomcycle.v1.Loomcycle.AgentDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 100: loomcycle.v1.Loomcycle.SkillDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 101: loomcycle.v1.Loomcycle.MCPServerDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 102: loomcycle.v1.Loomcycle.ScheduleDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 103: loomcycle.v1.Loomcycle.A2AServerCardDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 104: loomcycle.v1.Loomcycle.A2AAgentDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 105: loomcycle.v1.Loomcycle.WebhookDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 106: loomcycle.v1.Loomcycle.MemoryBackendDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 107: loomcycle.v1.Loomcycle.OperatorTokenDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 108: loomcycle.v1.Loomcycle.VolumeDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 109: loomcycle.v1.Loomcycle.TeamDef:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 110: loomcycle.v1.Loomcycle.Path:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 111: loomcycle.v1.Loomcycle.Document:input_type -> loomcycle.v1.SubstrateRequest
	94,  // 112: loomcycle.v1.Loomcycle.History:input_type -> loomcycle.v1.SubstrateRequest
	96,  // 113: loomcycle.v1.Loomcycle.ListChannels:input_type -> loomcycle.v1.ListChannelsRequest
	99,  // 114: loomcycle.v1.Loomcycle.StreamUserRunStates:input_type -> loomcycle.v1.StreamUserRunStatesRequest
	101, // 115: loomcycle.v1.Loomcycle.PublishChannel:input_type -> loomcycle.v1.PublishChannelRequest
	103, // 116: loomcycle.v1.Loomcycle.SubscribeChannel:input_type -> loomcycle.v1.SubscribeChannelRequest
	106, // 117: loomcycle.v1.Loomcycle.PeekChannel:input_type -> loomcycle.v1.PeekChannelRequest
	108, // 118: loomcycle.v1.Loomcycle.AckChannel:input_type -> loomcycle.v1.AckChannelRequest
	110, // 119: loomcycle.v1.Loomcycle.AwaitChannels:input_type -> loomcycle.v1.AwaitChannelsRequest
	113, // 120: loomcycle.v1.Loomcycle.BroadcastChannels:input_type -> loomcycle.v1.BroadcastChannelsRequest
	37,  // 121: loomcycle.v1.Loomcycle.Run:output_type -> loomcycle.v1.Event
	37,  // 122: loomcycle.v1.Loomcycle.Continue:output_type -> loomcycle.v1.Event
	6,   // 123: loomcycle.v1.Loomcycle.SpawnRunBatch:output_type -> loomcycle.v1.BatchSpawnResult
	24,  // 124: loomcycle.v1.Loomcycle.CompactRun:output_type -> loomcycle.v1.CompactRunResult
	9,   // 125: loomcycle.v1.Loomcycle.DirectoryUsers:output_type -> loomcycle.v1.DirectoryUsersResponse
	13,  // 126: loomcycle.v1.Loomcycle.DirectoryInspect:output_type -> loomcycle.v1.DirectoryInspectResponse
	16,  // 127: loomcycle.v1.Loomcycle.DirectoryTenants:output_type -> loomcycle.v1.DirectoryTenantsResponse
	20,  // 128: loomcycle.v1.Loomcycle.ErasureReport:output_type -> loomcycle.v1.ErasureReportResponse
	22,  // 129: loomcycle.v1.Loomcycle.ErasureExecute:output_type -> loomcycle.v1.ErasureExecuteResponse
	26,  // 130: loomcycle.v1.Loomcycle.ReplaySession:output_type -> loomcycle.v1.ReplaySessionResult
	28,  // 131: loomcycle.v1.Loomcycle.RunInput:output_type -> loomcycle.v1.RunInputResponse
	30,  // 132: loomcycle.v1.Loomcycle.CancelTurn:output_type -> loomcycle.v1.CancelTurnResponse
	32,  // 133: loomcycle.v1.Loomcycle.ResolveInterrupt:output_type -> loomcycle.v1.ResolveInterruptResponse
	37,  // 134: loomcycle.v1.Loomcycle.StreamRun:output_type -> loomcycle.v1.Event
	46,  // 135: loomcycle.v1.Loomcycle.GetTranscript:output_type -> loomcycle.v1.Transcript
	49,  // 136: loomcycle.v1.Loomcycle.GetAgent:output_type -> loomcycle.v1.Agent
	52,  // 137: loomcycle.v1.Loomcycle.CancelAgent:output_type -> loomcycle.v1.CancelAgentResponse
	54,  // 138: loomcycle.v1.Loomcycle.ListUserAgents:output_type -> loomcycle.v1.ListUserAgentsResponse
	57,  // 139: loomcycle.v1.Loomcycle.UsageReport:output_type -> loomcycle.v1.UsageReportResponse
	60,  // 140: loomcycle.v1.Loomcycle.TokenLimit:output_type -> loomcycle.v1.TokenLimitResponse
	64,  // 141: loomcycle.v1.Loomcycle.Health:output_type -> loomcycle.v1.HealthResponse
	62,  // 142: loomcycle.v1.Loomcycle.Config:output_type -> loomcycle.v1.ConfigResponse
	66,  // 143: loomcycle.v1.Loomcycle.RegisterHook:output_type -> loomcycle.v1.RegisterHookResponse
	69,  // 144: loomcycle.v1.Loomcycle.ListHooks:output_type -> loomcycle.v1.ListHooksResponse
	71,  // 145: loomcycle.v1.Loomcycle.DeleteHook:output_type -> loomcycle.v1.DeleteHookResponse
	73,  // 146: loomcycle.v1.Loomcycle.PauseRuntime:output_type -> loomcycle.v1.PauseRuntimeResponse
	75,  // 147: loomcycle.v1.Loomcycle.ResumeRuntime:output_type -> loomcycle.v1.ResumeRuntimeResponse
	77,  // 148: loomcycle.v1.Loomcycle.GetRuntimeState:output_type -> loomcycle.v1.RuntimeStateResponse
	79,  // 149: loomcycle.v1.Loomcycle.ResolveProbe:output_type -> loomcycle.v1.ResolverMatrixResponse
	83,  // 150: loomcycle.v1.Loomcycle.CreateSnapshot:output_type -> loomcycle.v1.SnapshotDescriptor
	85,  // 151: loomcycle.v1.Loomcycle.ListSnapshots:output_type -> loomcycle.v1.ListSnapshotsResponse
	87,  // 152: loomcycle.v1.Loomcycle.GetSnapshot:output_type -> loomcycle.v1.SnapshotEnvelope
	89,  // 153: loomcycle.v1.Loomcycle.ExportSnapshot:output_type -> loomcycle.v1.ExportSnapshotResponse
	91,  // 154: loomcycle.v1.Loomcycle.RestoreSnapshot:output_type -> loomcycle.v1.RestoreSnapshotResponse
	93,  // 155: loomcycle.v1.Loomcycle.DeleteSnapshot:output_type -> loomcycle.v1.DeleteSnapshotResponse
	95,  // 156: loomcycle.v1.Loomcycle.AgentDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 157: loomcycle.v1.Loomcycle.SkillDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 158: loomcycle.v1.Loomcycle.MCPServerDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 159: loomcycle.v1.Loomcycle.ScheduleDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 160: loomcycle.v1.Loomcycle.A2AServerCardDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 161: loomcycle.v1.Loomcycle.A2AAgentDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 162: loomcycle.v1.Loomcycle.WebhookDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 163: loomcycle.v1.Loomcycle.MemoryBackendDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 164: loomcycle.v1.Loomcycle.OperatorTokenDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 165: loomcycle.v1.Loomcycle.VolumeDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 166: loomcycle.v1.Loomcycle.TeamDef:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 167: loomcycle.v1.Loomcycle.Path:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 168: loomcycle.v1.Loomcycle.Document:output_type -> loomcycle.v1.SubstrateResponse
	95,  // 169: loomcycle.v1.Loomcycle.History:output_type -> loomcycle.v1.SubstrateResponse
	97,  // 170: loomcycle.v1.Loomcycle.ListChannels:output_type -> loomcycle.v1.ListChannelsResponse
	100, // 171: loomcycle.v1.Loomcycle.StreamUserRunStates:output_type -> loomcycle.v1.RunStateEvent
	102, // 172: loomcycle.v1.Loomcycle.PublishChannel:output_type -> loomcycle.v1.PublishChannelResponse
	104, // 173: loomcycle.v1.Loomcycle.SubscribeChannel:output_type -> loomcycle.v1.SubscribeChannelResponse
	107, // 174: loomcycle.v1.Loomcycle.PeekChannel:output_type -> loomcycle.v1.PeekChannelResponse
	109, // 175: loomcycle.v1.Loomcycle.AckChannel:output_type -> loomcycle.v1.AckChannelResponse
	112, // 176: loomcycle.v1.Loomcycle.AwaitChannels:output_type -> loomcycle.v1.AwaitChannelsResponse
	115, // 177: loomcycle.v1.Loomcycle.BroadcastChannels:output_type -> loomcycle.v1.BroadcastChannelsResponse
	121, // [121:178] is the sub-list for method output_type
	64,  // [64:121] is the sub-list for method input_type
	64,  // [64:64] is the sub-list for extension type_name
	64,  // [64:64] is the sub-list for extension extendee
	0,   // [0:64] is the sub-list for field type_name
}

func init() { file_loomcycle_proto_init() }
func file_loomcycle_proto_init() {
	if File_loomcycle_proto != nil {
		return
	}
	file_loomcycle_proto_msgTypes[2].OneofWrappers = []any{}
	file_loomcycle_proto_msgTypes[3].OneofWrappers = []any{}
	file_loomcycle_proto_msgTypes[11].OneofWrappers = []any{}
	file_loomcycle_proto_msgTypes[13].OneofWrappers = []any{}
	file_loomcycle_proto_msgTypes[21].OneofWrappers = []any{}
	file_loomcycle_proto_msgTypes[58].OneofWrappers = []any{}
	file_loomcycle_proto_msgTypes[59].OneofWrappers = []any{}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_loomcycle_proto_rawDesc), len(file_loomcycle_proto_rawDesc)),
			NumEnums:      0,
			NumMessages:   125,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_loomcycle_proto_goTypes,
		DependencyIndexes: file_loomcycle_proto_depIdxs,
		MessageInfos:      file_loomcycle_proto_msgTypes,
	}.Build()
	File_loomcycle_proto = out.File
	file_loomcycle_proto_goTypes = nil
	file_loomcycle_proto_depIdxs = nil
}
