1b9aa47 · Slack and Discord adapters, dry-run first · 5 days ago
1
"""Slack adapter. Dry-run needs no SDK. Live import is deferred."""2
3
from __future__ import annotations4
5
from typing import TextIO6
7
from mapping import Mapping8
from scope import ScopeGuard9
10
11
class SlackAdapter:12
def __init__(self, mapping: Mapping, guard: ScopeGuard) -> None:13
self.mapping = mapping14
self.guard = guard15
16
def describe(self, out: TextIO) -> None:17
m = self.mapping18
out.write(f"axiom {m.agent} scope={m.scope} platform=slack\n")19
for ch in m.channels:20
out.write(f" {ch.role:12} {ch.direction:4} {ch.id} {ch.name}\n")21
rooms = m.by_role("room")22
out.write(f"fan-out: {len(rooms)} room(s) wall: {len(self.guard._ids)} id(s)\n")23
24
def run(self, collect_seconds: int) -> None:25
for ch in self.mapping.channels:26
self.guard.require(ch.id, "listen")27
# Live path: slack_sdk WebClient + Socket Mode, filtered by guard.28
raise SystemExit("live Slack requires SLACK_BOT_TOKEN and slack-sdk")29