///|
/// The endpoint direction of a stable ACP v1 JSON-RPC method.
pub(all) enum AcpV1MethodDirection {
  ClientToAgent
  AgentToClient
  Bidirectional
} derive(Eq, Debug)

///|
/// Whether a stable ACP v1 method expects a response.
pub(all) enum AcpV1MethodKind {
  Request
  Notification
} derive(Eq, Debug)

///|
/// One entry in the stable ACP v1 method manifest.
///
/// `method_name` is the exact JSON-RPC wire name.  The direction and kind are
/// protocol facts, not runtime capability decisions; capability gates are
/// applied by the endpoint layer after method lookup.
pub(all) struct AcpV1Method {
  method_name : String
  direction : AcpV1MethodDirection
  kind : AcpV1MethodKind
} derive(Eq, Debug)

///|
/// Return a fresh, exact manifest for the stable ACP v1 method surface.
///
/// A fresh array on every call keeps the public value free of shared mutable
/// state.  This list follows the fixed v1 table in the implementation plan;
/// v2 and unstable overlays are deliberately absent.
pub fn acp_v1_method_manifest() -> Array[AcpV1Method] {
  [
    // Client -> Agent requests.
    { method_name: "initialize", direction: ClientToAgent, kind: Request, },
    { method_name: "authenticate", direction: ClientToAgent, kind: Request, },
    { method_name: "logout", direction: ClientToAgent, kind: Request, },
    { method_name: "session/new", direction: ClientToAgent, kind: Request, },
    { method_name: "session/load", direction: ClientToAgent, kind: Request, },
    { method_name: "session/resume", direction: ClientToAgent, kind: Request, },
    { method_name: "session/list", direction: ClientToAgent, kind: Request, },
    { method_name: "session/delete", direction: ClientToAgent, kind: Request, },
    { method_name: "session/close", direction: ClientToAgent, kind: Request, },
    {
      method_name: "session/set_mode",
      direction: ClientToAgent,
      kind: Request,
    },
    {
      method_name: "session/set_config_option",
      direction: ClientToAgent,
      kind: Request,
    },
    { method_name: "session/prompt", direction: ClientToAgent, kind: Request, },
    // Client -> Agent notification.
    {
      method_name: "session/cancel",
      direction: ClientToAgent,
      kind: Notification,
    },
    // Agent -> Client requests.
    {
      method_name: "session/request_permission",
      direction: AgentToClient,
      kind: Request,
    },
    {
      method_name: "fs/read_text_file",
      direction: AgentToClient,
      kind: Request,
    },
    {
      method_name: "fs/write_text_file",
      direction: AgentToClient,
      kind: Request,
    },
    { method_name: "terminal/create", direction: AgentToClient, kind: Request, },
    { method_name: "terminal/output", direction: AgentToClient, kind: Request, },
    {
      method_name: "terminal/wait_for_exit",
      direction: AgentToClient,
      kind: Request,
    },
    { method_name: "terminal/kill", direction: AgentToClient, kind: Request, },
    {
      method_name: "terminal/release",
      direction: AgentToClient,
      kind: Request,
    },
    {
      method_name: "elicitation/create",
      direction: AgentToClient,
      kind: Request,
    },
    // Agent -> Client notifications.
    {
      method_name: "session/update",
      direction: AgentToClient,
      kind: Notification,
    },
    {
      method_name: "elicitation/complete",
      direction: AgentToClient,
      kind: Notification,
    },
    // This protocol notification can be sent by either endpoint.
    {
      method_name: "$/cancel_request",
      direction: Bidirectional,
      kind: Notification,
    },
  ]
}

///|
/// Return a fresh manifest for the v1 unstable-overlay method surface this
/// facade implements.  Upstream unstable (RFD session-fork, Draft).
///
/// This is a **deliberate subset** of the pinned v1 unstable overlay
/// (`spec/schema/v1/meta.unstable.json`, vendored): only `session/fork` is
/// implemented.  Unstable overlay methods deliberately stay out of the stable
/// manifest above and out of its exact-set drift gate against the pinned
/// stable `meta.json`/`schema.json` bytes.
pub fn acp_v1_unstable_method_manifest() -> Array[AcpV1Method] {
  [{ method_name: "session/fork", direction: ClientToAgent, kind: Request, }]
}