Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/intelstream/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,19 @@ async def setup_hook(self) -> None:
await self.add_cog(GitHubCommands(self))
await self.add_cog(GitHubPolling(self))

try:
from intelstream.noosphere.config import NoosphereSettings
from intelstream.noosphere.engine import NoosphereCog

noosphere_settings = NoosphereSettings()
if noosphere_settings.enabled:
await self.add_cog(NoosphereCog(self, noosphere_settings))
logger.info("Noosphere Engine cog loaded")
except ImportError:
logger.debug("Noosphere Engine not loaded (missing dependencies)")
except Exception:
logger.warning("Noosphere Engine failed to load", exc_info=True)

guild = discord.Object(id=self.settings.discord_guild_id)
self.tree.copy_global_to(guild=guild)
await self.tree.sync(guild=guild)
Expand Down
Empty file.
75 changes: 75 additions & 0 deletions src/intelstream/noosphere/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
from __future__ import annotations

from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict


class NoosphereSettings(BaseSettings):
model_config = SettingsConfigDict(
env_prefix="NOOSPHERE_",
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore",
)

enabled: bool = Field(default=False, description="Enable the Noosphere Engine")

# Crystal Room
crystal_room_enabled: bool = Field(default=True, description="Enable Crystal Room feature")
crystal_room_seal_quorum: int = Field(
default=3, ge=2, le=20, description="Minimum members to seal a crystal room"
)
crystal_room_max_per_guild: int = Field(
default=5, ge=1, le=50, description="Maximum crystal rooms per guild"
)

# Ghost Channel
ghost_channel_enabled: bool = Field(default=True, description="Enable Ghost Channel feature")
ghost_oracle_temperature: float = Field(
default=0.9, ge=0.0, le=2.0, description="LLM temperature for ghost oracle"
)
ghost_oracle_top_p: float = Field(
default=0.95, ge=0.0, le=1.0, description="LLM top_p for ghost oracle"
)
ghost_base_interval_hours: float = Field(
default=4.0, ge=0.5, le=48.0, description="Base interval for ghost channel posting"
)
ghost_thread_auto_archive_minutes: int = Field(
default=60, description="Auto-archive ghost threads after N minutes"
)

# Morphogenetic Pulse
pulse_enabled: bool = Field(default=True, description="Enable morphogenetic pulse")
pulse_base_interval_minutes: float = Field(
default=60.0,
ge=5.0,
le=1440.0,
description="Base interval for morphogenetic pulses in minutes",
)

# Serendipity Injector
serendipity_enabled: bool = Field(default=True, description="Enable serendipity injection")
serendipity_noise_sigma: float = Field(
default=0.2,
ge=0.0,
le=1.0,
description="Noise sigma for serendipity scoring",
)
serendipity_similarity_min: float = Field(
default=0.3, ge=0.0, le=1.0, description="Minimum similarity for serendipity bridges"
)
serendipity_similarity_max: float = Field(
default=0.6, ge=0.0, le=1.0, description="Maximum similarity for serendipity bridges"
)

# Mode Manager
default_mode: str = Field(default="integrative", description="Default computation mode")

# Engine
dormancy_threshold_hours: float = Field(
default=48.0,
ge=1.0,
le=720.0,
description="Hours of inactivity before cryptobiosis",
)
65 changes: 65 additions & 0 deletions src/intelstream/noosphere/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import enum
import math

PHI: float = (1 + math.sqrt(5)) / 2
GOLDEN_ANGLE: float = 2 * math.pi / (PHI**2)

FIBONACCI_SEQ: list[int] = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

EMBEDDING_MODEL_MULTILINGUAL: str = "paraphrase-multilingual-MiniLM-L12-v2"
EMBEDDING_MODEL_ENGLISH: str = "all-MiniLM-L6-v2"
EMBEDDING_DIM: int = 384

MIN_MSG_THRESHOLD: int = 20
OUTPUT_GAIN_RECOMPUTE_INTERVAL: float = 300.0
HARD_COOLDOWN_SECONDS: float = 30.0
DEFAULT_ANTHROPHONY_THRESHOLD: float = 0.15
DEFAULT_GAIN_RATIO: float = 4.0

ARCHIVE_BASE_HALF_LIFE_HOURS: float = 168.0
ARCHIVE_REFERENCE_EXTENSION: float = 1.5
ARCHIVE_FIDELITY_FLOOR: float = 0.01


class CrystalRoomMode(str, enum.Enum):
NUMBER_STATION = "number_station"
WHALE = "whale"
GHOST = "ghost"


class CrystalRoomState(str, enum.Enum):
OPEN = "open"
SEALED = "sealed"
BREATHING = "breathing"


class ComputationMode(str, enum.Enum):
SUBTRACTIVE = "subtractive"
BROADCAST = "broadcast"
RESONANT = "resonant"
STIGMERGIC = "stigmergic"
PARASITIC = "parasitic"
PARLIAMENTARY = "parliamentary"
INTEGRATIVE = "integrative"
CRYPTOBIOTIC = "cryptobiotic"
PROJECTIVE = "projective"
TOPOLOGICAL = "topological"


class PathologyType(str, enum.Enum):
CANCER = "non_terminating_pruning"
CYTOKINE_STORM = "receiver_saturation"
SEIZURE = "destructive_sync"
ANT_MILL = "positive_feedback_loop"
ADDICTION = "host_destructive_opt"
AUTOIMMUNE = "perpetual_non_consensus"
GROUPTHINK = "integration_no_diff"
COMA = "irreversible_suspension"
MISUNDERSTANDING = "irrecoverable_dim_loss"
SCHISM = "topological_damage"


class MessageClassification(str, enum.Enum):
ANTHROPHONY = "anthrophony"
BIOPHONY = "biophony"
GEOPHONY = "geophony"
Empty file.
98 changes: 98 additions & 0 deletions src/intelstream/noosphere/crystal_room/access_control.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
from __future__ import annotations

import discord
import structlog

logger = structlog.get_logger(__name__)


async def create_private_channel(
guild: discord.Guild,
name: str,
creator: discord.Member,
category: discord.CategoryChannel | None = None,
) -> discord.TextChannel:
"""Create a private channel visible only to the creator and the bot."""
overwrites: dict[
discord.Role | discord.Member | discord.Object, discord.PermissionOverwrite
] = {
guild.default_role: discord.PermissionOverwrite(read_messages=False),
creator: discord.PermissionOverwrite(
read_messages=True,
send_messages=True,
read_message_history=True,
),
}

if guild.me:
overwrites[guild.me] = discord.PermissionOverwrite(
read_messages=True,
send_messages=True,
manage_channels=True,
manage_messages=True,
read_message_history=True,
)

channel = await guild.create_text_channel(
name=f"crystal-{name}",
overwrites=overwrites,
category=category,
topic="Crystal Room -- sealed discussion space",
)

logger.info(
"Private crystal channel created",
guild_id=str(guild.id),
channel_id=str(channel.id),
creator_id=str(creator.id),
)
return channel


async def grant_access(
channel: discord.TextChannel,
member: discord.Member,
) -> None:
"""Grant a member access to a crystal room channel."""
await channel.set_permissions(
member,
read_messages=True,
send_messages=True,
read_message_history=True,
)
logger.info(
"Access granted to crystal room",
channel_id=str(channel.id),
member_id=str(member.id),
)


async def revoke_access(
channel: discord.TextChannel,
member: discord.Member,
) -> None:
"""Revoke a member's access to a crystal room channel."""
await channel.set_permissions(member, overwrite=None)
logger.info(
"Access revoked from crystal room",
channel_id=str(channel.id),
member_id=str(member.id),
)


async def set_sealed_permissions(
channel: discord.TextChannel,
) -> None:
"""In sealed state, prevent new members from being added externally."""
await channel.edit(
topic="Crystal Room [SEALED] -- no new members",
)


async def set_open_permissions(
channel: discord.TextChannel,
) -> None:
"""Restore open state permissions."""
await channel.edit(
topic="Crystal Room -- sealed discussion space",
)
Loading
Loading