# `AgentSessionManager.PubSub.Topic`
[🔗](https://github.com/nshkrdotcom/agent_session_manager/blob/v0.8.0/lib/agent_session_manager/pubsub/topic.ex#L1)

Topic naming conventions for ASM PubSub integration.

Topics follow a hierarchical colon-separated scheme:

    {prefix}:session:{session_id}
    {prefix}:session:{session_id}:run:{run_id}
    {prefix}:session:{session_id}:type:{event_type}

The default prefix is `"asm"`.

## Examples

    iex> Topic.build_session_topic("ses_abc123")
    "asm:session:ses_abc123"

    iex> Topic.build_run_topic("ses_abc123", "run_def456")
    "asm:session:ses_abc123:run:run_def456"

    iex> Topic.build(%{session_id: "ses_abc123", run_id: "run_def456"}, scope: :run)
    "asm:session:ses_abc123:run:run_def456"

# `build`

```elixir
@spec build(
  map(),
  keyword()
) :: String.t()
```

Builds a topic string from an event map and options.

## Options

  * `:prefix` - Topic prefix. Default `"asm"`.
  * `:scope` - One of `:session`, `:run`, `:type`. Default `:session`.

# `build_run_topic`

```elixir
@spec build_run_topic(String.t(), String.t(), String.t()) :: String.t()
```

Builds a run-scoped topic.

    iex> Topic.build_run_topic("ses_abc123", "run_def456")
    "asm:session:ses_abc123:run:run_def456"

# `build_session_topic`

```elixir
@spec build_session_topic(String.t(), String.t()) :: String.t()
```

Builds a session-scoped topic.

    iex> Topic.build_session_topic("ses_abc123")
    "asm:session:ses_abc123"

# `build_type_topic`

```elixir
@spec build_type_topic(String.t(), String.t(), atom() | String.t()) :: String.t()
```

Builds a type-scoped topic.

    iex> Topic.build_type_topic("ses_abc123", :tool_call_started)
    "asm:session:ses_abc123:type:tool_call_started"

---

*Consult [api-reference.md](api-reference.md) for complete listing*
