agentirc-cli 5.0.4__tar.gz → 6.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/CHANGELOG.md +8 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/CLAUDE.md +3 -3
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/PKG-INFO +12 -2
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/README.md +11 -1
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/__main__.py +2 -2
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/channel.py +4 -4
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/client.py +7 -7
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/ircd.py +15 -15
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/remote_client.py +2 -2
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/server_link.py +3 -3
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skill.py +2 -2
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skills/history.py +3 -3
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skills/icon.py +2 -2
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skills/rooms.py +7 -7
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/skills/threads.py +11 -11
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/bots/bot.py +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/bots/bot_manager.py +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/bots/virtual_client.py +5 -5
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/server.py +2 -2
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/shared/mesh.py +2 -2
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/daemon.py +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/daemon.py +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/daemon.py +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/daemon.py +1 -1
- agentirc_cli-6.0.0/docs/agent-readiness.md +102 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/index.md +3 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/layer1-core-irc.md +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/server-architecture.md +5 -3
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/index.md +2 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +11 -11
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-03-30-rooms-management.md +78 -78
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-02-conversation-threads.md +35 -35
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-02-ops-tooling.md +13 -13
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-04-culture-rename.md +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-06-console-chat.md +17 -17
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +4 -4
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +2 -2
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +3 -3
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/01-pair-programming.md +3 -3
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/pyproject.toml +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/conftest.py +2 -2
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_federation.py +2 -2
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_history.py +7 -7
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_link_reconnect.py +2 -2
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_room_persistence.py +5 -5
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_rooms.py +7 -7
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_skills.py +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_threads.py +2 -2
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/uv.lock +1 -1
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.flake8 +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.github/workflows/pages.yml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.github/workflows/security-checks.yml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.gitignore +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.pr_agent.toml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.pre-commit-config.yaml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/.pylintrc +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/CNAME +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/Gemfile +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/Gemfile.lock +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/LICENSE +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/SECURITY.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/_config.yml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/_includes/head_custom.html +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/assets/images/apple-touch-icon.png +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/assets/images/favicon-16x16.png +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/assets/images/favicon-32x32.png +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/assets/images/favicon.ico +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/__main__.py +0 -0
- {agentirc_cli-5.0.4/culture/bots → agentirc_cli-6.0.0/culture/agentirc}/__init__.py +0 -0
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/config.py +0 -0
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/history_store.py +0 -0
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/room_store.py +0 -0
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/rooms_util.py +0 -0
- {agentirc_cli-5.0.4/culture/cli/shared → agentirc_cli-6.0.0/culture/agentirc/skills}/__init__.py +0 -0
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/agentirc}/thread_store.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/aio.py +0 -0
- {agentirc_cli-5.0.4/culture/clients → agentirc_cli-6.0.0/culture/bots}/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/bots/config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/bots/http_listener.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/bots/template_engine.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/agent.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/bot.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/channel.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/mesh.py +0 -0
- {agentirc_cli-5.0.4/culture/clients/acp → agentirc_cli-6.0.0/culture/cli/shared}/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/shared/constants.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/shared/display.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/shared/formatting.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/shared/ipc.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/shared/process.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/cli/skills.py +0 -0
- {agentirc_cli-5.0.4/culture/clients/acp/skill → agentirc_cli-6.0.0/culture/clients}/__init__.py +0 -0
- {agentirc_cli-5.0.4/culture/clients/claude → agentirc_cli-6.0.0/culture/clients/acp}/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/agent_runner.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/culture.yaml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/ipc.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/irc_transport.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/message_buffer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.4/culture/clients/claude → agentirc_cli-6.0.0/culture/clients/acp}/skill/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/socket_server.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/supervisor.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/acp/webhook.py +0 -0
- {agentirc_cli-5.0.4/culture/clients/codex → agentirc_cli-6.0.0/culture/clients/claude}/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/__main__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/culture.yaml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/ipc.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.4/culture/clients/codex → agentirc_cli-6.0.0/culture/clients/claude}/skill/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/socket_server.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/supervisor.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/claude/webhook.py +0 -0
- {agentirc_cli-5.0.4/culture/clients/copilot → agentirc_cli-6.0.0/culture/clients/codex}/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/culture.yaml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/ipc.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/irc_transport.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.4/culture/clients/copilot → agentirc_cli-6.0.0/culture/clients/codex}/skill/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/socket_server.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/supervisor.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/codex/webhook.py +0 -0
- {agentirc_cli-5.0.4/culture/protocol → agentirc_cli-6.0.0/culture/clients/copilot}/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/culture.yaml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/ipc.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/irc_transport.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.4/culture/server → agentirc_cli-6.0.0/culture/clients/copilot/skill}/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/clients/copilot/webhook.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/console/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/console/app.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/console/client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/console/commands.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/console/widgets/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/console/widgets/chat.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/console/widgets/info_panel.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/console/widgets/sidebar.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/credentials.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/formatting.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/learn_prompt.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/mesh_config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/observer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/overview/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/overview/collector.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/overview/model.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/overview/renderer_text.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/overview/renderer_web.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/overview/web/style.css +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/persistence.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/pidfile.py +0 -0
- {agentirc_cli-5.0.4/culture/server/skills → agentirc_cli-6.0.0/culture/protocol}/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/commands.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/extensions/federation.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/extensions/history.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/extensions/icons.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/extensions/rooms.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/extensions/tags.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/extensions/threads.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/message.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/protocol-index.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/protocol/replies.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/culture/skills/culture/SKILL.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/agent-lifecycle.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/agentic-self-learn.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/agents/decentralized-config.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/agent-client.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/agent-harness-spec.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/harness-conformance.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/layer2-attention.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/layer3-skills.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/layer4-federation.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/layer5-agent-harness.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/architecture/threads.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/channel-polling.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/acp/overview.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/acp/system-prompt.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/claude/configuration.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/claude/context-management.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/claude/irc-tools.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/claude/overview.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/claude/setup.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/claude/supervisor.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/claude/webhooks.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/codex/configuration.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/codex/context-management.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/codex/irc-tools.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/codex/overview.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/codex/setup.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/codex/supervisor.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/codex/webhooks.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/copilot/configuration.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/copilot/context-management.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/copilot/irc-tools.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/copilot/overview.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/copilot/setup.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/copilot/supervisor.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/clients/copilot/webhooks.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/culture-cli.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/getting-started.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/SECURITY.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/bots.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/ci.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/cli.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/docs-site.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/index.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/ops-tooling.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/overview.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/operations/publishing.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/persistent-history.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/reflective-development.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/rooms.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/server-rename.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/plans/2026-04-09-decentralized-agent-config.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-07-reflective-development-reframe-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-08-reflective-development-deepening-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/superpowers/specs/2026-04-09-decentralized-agent-config-design.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases/10-agent-lifecycle.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/use-cases-index.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/docs/what-is-culture.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/favicon.ico +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/culture.yaml +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/daemon.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/irc_transport.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/plugins/claude-code/skills/culture/SKILL.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/sonar-project.properties +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/__init__.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_acp_daemon.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_archive.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_bot.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_bot_config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_bot_manager.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_bots_integration.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_channel.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_channel_cli.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_connection.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_console_client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_console_commands.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_console_connection.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_console_icons.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_console_integration.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_credentials.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_culture_config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_daemon.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_discovery.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_display.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_http_listener.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_ipc.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_learn_prompt.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_mention_alias.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_mention_target_cleanup.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_mention_warning.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_mentions.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_mesh_config.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_mesh_readiness.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_message.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_messaging.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_migrate_cli.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_modes.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_overview_cli.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_overview_collector.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_overview_model.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_overview_renderer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_overview_web.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_persistence.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_pidfile.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_poll_loop.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_register_cli.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_setup_update_cli.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_skill_client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_skill_docs.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_socket_server.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_supervisor.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_template_engine.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_thread_buffer.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_virtual_client.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_wait_for_port.py +0 -0
- {agentirc_cli-5.0.4 → agentirc_cli-6.0.0}/tests/test_webhook.py +0 -0
|
@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/).
|
|
6
6
|
|
|
7
|
+
## [6.0.0] - 2026-04-10
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **BREAKING:** Renamed internal Python package `culture.server` to `culture.agentirc`. All imports must update from `culture.server.*` to `culture.agentirc.*`. CLI command `culture server` and config path `~/.culture/server.yaml` are unchanged.
|
|
13
|
+
- **AgentIRC** is now the official name for the server engine in documentation.
|
|
14
|
+
|
|
7
15
|
## [5.0.4] - 2026-04-10
|
|
8
16
|
|
|
9
17
|
|
|
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
4
4
|
|
|
5
5
|
## Project Overview
|
|
6
6
|
|
|
7
|
-
**culture** — A mesh of IRC servers where AI agents collaborate, share knowledge, and coordinate work. Humans participate as first-class citizens.
|
|
7
|
+
**culture** — A mesh of IRC servers where AI agents collaborate, share knowledge, and coordinate work. Humans participate as first-class citizens. The server engine, **AgentIRC** (`culture/agentirc/`), is a custom async Python IRCd built from scratch. Claude Agent SDK client harnesses connect agents to the mesh.
|
|
8
8
|
|
|
9
9
|
Design spec: `docs/superpowers/specs/2026-03-19-agentirc-design.md`
|
|
10
10
|
|
|
@@ -59,8 +59,8 @@ When implementing features, write a corresponding markdown doc in `docs/` descri
|
|
|
59
59
|
|
|
60
60
|
## Testing
|
|
61
61
|
|
|
62
|
-
-
|
|
63
|
-
- `pytest` + `pytest-asyncio
|
|
62
|
+
- **Always use `/run-tests`** — this is the standard way to run tests. By default it runs in parallel with verbose output. Use `/run-tests --ci` (or `-c`) for coverage. Do not run `pytest` directly; use the skill.
|
|
63
|
+
- Stack: `pytest` + `pytest-asyncio` + `pytest-xdist` — default `/run-tests` uses `-n auto` for parallel execution
|
|
64
64
|
- No mocks for the server — tests spin up real server instances on random ports with real TCP connections
|
|
65
65
|
- Validate each layer with real IRC clients (weechat/irssi)
|
|
66
66
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentirc-cli
|
|
3
|
-
Version:
|
|
3
|
+
Version: 6.0.0
|
|
4
4
|
Summary: Legacy alias for culture — install culture instead
|
|
5
5
|
Project-URL: Homepage, https://github.com/OriNachum/culture
|
|
6
6
|
Author: Ori Nachum
|
|
@@ -30,7 +30,7 @@ Description-Content-Type: text/markdown
|
|
|
30
30
|
**Create the culture you envision.**
|
|
31
31
|
|
|
32
32
|
Human city, beehive, alien hive mind — or something entirely new.<br>
|
|
33
|
-
|
|
33
|
+
An AgentIRC space where humans and AI agents join, collaborate, and grow together.
|
|
34
34
|
|
|
35
35
|
Claude Code · Codex · Copilot · ACP (Cline, Kiro, OpenCode, Gemini, ...)
|
|
36
36
|
|
|
@@ -222,6 +222,16 @@ Full docs at **[culture.dev](https://culture.dev)** — or browse below.
|
|
|
222
222
|
|
|
223
223
|
</details>
|
|
224
224
|
|
|
225
|
+
<details open>
|
|
226
|
+
<summary><b>Project Quality</b></summary>
|
|
227
|
+
|
|
228
|
+
| Doc | Description |
|
|
229
|
+
|-----|-------------|
|
|
230
|
+
| [Agent Readiness](docs/agent-readiness.md) | How the project stays ready for agents — skills, pipelines, testing, [Introspective Development](docs/reflective-development.md) |
|
|
231
|
+
| [CI / Testing](docs/operations/ci.md) | GitHub Actions test workflow |
|
|
232
|
+
|
|
233
|
+
</details>
|
|
234
|
+
|
|
225
235
|
---
|
|
226
236
|
|
|
227
237
|
## License
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
**Create the culture you envision.**
|
|
7
7
|
|
|
8
8
|
Human city, beehive, alien hive mind — or something entirely new.<br>
|
|
9
|
-
|
|
9
|
+
An AgentIRC space where humans and AI agents join, collaborate, and grow together.
|
|
10
10
|
|
|
11
11
|
Claude Code · Codex · Copilot · ACP (Cline, Kiro, OpenCode, Gemini, ...)
|
|
12
12
|
|
|
@@ -198,6 +198,16 @@ Full docs at **[culture.dev](https://culture.dev)** — or browse below.
|
|
|
198
198
|
|
|
199
199
|
</details>
|
|
200
200
|
|
|
201
|
+
<details open>
|
|
202
|
+
<summary><b>Project Quality</b></summary>
|
|
203
|
+
|
|
204
|
+
| Doc | Description |
|
|
205
|
+
|-----|-------------|
|
|
206
|
+
| [Agent Readiness](docs/agent-readiness.md) | How the project stays ready for agents — skills, pipelines, testing, [Introspective Development](docs/reflective-development.md) |
|
|
207
|
+
| [CI / Testing](docs/operations/ci.md) | GitHub Actions test workflow |
|
|
208
|
+
|
|
209
|
+
</details>
|
|
210
|
+
|
|
201
211
|
---
|
|
202
212
|
|
|
203
213
|
## License
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import asyncio
|
|
3
3
|
|
|
4
|
-
from culture.
|
|
5
|
-
from culture.
|
|
4
|
+
from culture.agentirc.config import LinkConfig, ServerConfig
|
|
5
|
+
from culture.agentirc.ircd import IRCd
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def parse_link(value: str) -> LinkConfig:
|
|
@@ -3,8 +3,8 @@ from __future__ import annotations
|
|
|
3
3
|
from typing import TYPE_CHECKING, Union
|
|
4
4
|
|
|
5
5
|
if TYPE_CHECKING:
|
|
6
|
-
from culture.
|
|
7
|
-
from culture.
|
|
6
|
+
from culture.agentirc.client import Client
|
|
7
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
8
8
|
|
|
9
9
|
Member = Union[Client, RemoteClient]
|
|
10
10
|
|
|
@@ -41,15 +41,15 @@ class Channel:
|
|
|
41
41
|
|
|
42
42
|
def _local_members(self) -> set[Client]:
|
|
43
43
|
"""Return only local (non-remote, non-virtual) members."""
|
|
44
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
44
45
|
from culture.bots.virtual_client import VirtualClient
|
|
45
|
-
from culture.server.remote_client import RemoteClient
|
|
46
46
|
|
|
47
47
|
return {m for m in self.members if not isinstance(m, (RemoteClient, VirtualClient))}
|
|
48
48
|
|
|
49
49
|
def add(self, client: Client) -> None:
|
|
50
50
|
# Only grant op to the first LOCAL joiner
|
|
51
51
|
if not self._local_members():
|
|
52
|
-
from culture.
|
|
52
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
53
53
|
|
|
54
54
|
if not isinstance(client, RemoteClient):
|
|
55
55
|
self.operators.add(client)
|
|
@@ -6,14 +6,14 @@ import logging
|
|
|
6
6
|
import re
|
|
7
7
|
from typing import TYPE_CHECKING
|
|
8
8
|
|
|
9
|
+
from culture.agentirc.channel import Channel
|
|
10
|
+
from culture.agentirc.skill import Event, EventType
|
|
9
11
|
from culture.aio import maybe_await
|
|
10
12
|
from culture.protocol import replies
|
|
11
13
|
from culture.protocol.message import Message
|
|
12
|
-
from culture.server.channel import Channel
|
|
13
|
-
from culture.server.skill import Event, EventType
|
|
14
14
|
|
|
15
15
|
if TYPE_CHECKING:
|
|
16
|
-
from culture.
|
|
16
|
+
from culture.agentirc.ircd import IRCd
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class Client:
|
|
@@ -492,7 +492,7 @@ class Client:
|
|
|
492
492
|
)
|
|
493
493
|
|
|
494
494
|
async def _send_to_client(self, target, relay, text, is_notice):
|
|
495
|
-
from culture.
|
|
495
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
496
496
|
|
|
497
497
|
recipient = self.server.get_client(target)
|
|
498
498
|
if not recipient:
|
|
@@ -550,7 +550,7 @@ class Client:
|
|
|
550
550
|
await self._notify_mentions(None, text)
|
|
551
551
|
|
|
552
552
|
async def _notify_mentions(self, channel_name: str | None, text: str) -> None:
|
|
553
|
-
from culture.
|
|
553
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
554
554
|
|
|
555
555
|
mentioned_nicks = re.findall(r"@(\S+)", text)
|
|
556
556
|
if not mentioned_nicks:
|
|
@@ -618,7 +618,7 @@ class Client:
|
|
|
618
618
|
return flags
|
|
619
619
|
|
|
620
620
|
async def _send_who_reply(self, member, channel_name: str, channel=None) -> None:
|
|
621
|
-
from culture.
|
|
621
|
+
from culture.agentirc.remote_client import RemoteClient # noqa: F811
|
|
622
622
|
|
|
623
623
|
flags = self._build_who_flags(member, channel)
|
|
624
624
|
server_name = (
|
|
@@ -660,7 +660,7 @@ class Client:
|
|
|
660
660
|
await self.send_numeric(replies.RPL_ENDOFWHO, target, replies.MSG_ENDOFWHO)
|
|
661
661
|
|
|
662
662
|
async def _handle_whois(self, msg: Message) -> None:
|
|
663
|
-
from culture.
|
|
663
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
664
664
|
|
|
665
665
|
if not msg.params:
|
|
666
666
|
await self.send_numeric(replies.ERR_NONICKNAMEGIVEN, "No nickname given")
|
|
@@ -6,17 +6,17 @@ import logging
|
|
|
6
6
|
from collections import deque
|
|
7
7
|
from typing import TYPE_CHECKING
|
|
8
8
|
|
|
9
|
-
from culture.
|
|
10
|
-
from culture.
|
|
11
|
-
from culture.
|
|
9
|
+
from culture.agentirc.channel import Channel
|
|
10
|
+
from culture.agentirc.config import ServerConfig
|
|
11
|
+
from culture.agentirc.skill import Event, Skill
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
14
14
|
|
|
15
15
|
if TYPE_CHECKING:
|
|
16
|
+
from culture.agentirc.client import Client
|
|
17
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
18
|
+
from culture.agentirc.server_link import ServerLink
|
|
16
19
|
from culture.bots.virtual_client import VirtualClient
|
|
17
|
-
from culture.server.client import Client
|
|
18
|
-
from culture.server.remote_client import RemoteClient
|
|
19
|
-
from culture.server.server_link import ServerLink
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class IRCd:
|
|
@@ -91,10 +91,10 @@ class IRCd:
|
|
|
91
91
|
logger.info("Server ready")
|
|
92
92
|
|
|
93
93
|
async def _register_default_skills(self) -> None:
|
|
94
|
-
from culture.
|
|
95
|
-
from culture.
|
|
96
|
-
from culture.
|
|
97
|
-
from culture.
|
|
94
|
+
from culture.agentirc.skills.history import HistorySkill
|
|
95
|
+
from culture.agentirc.skills.icon import IconSkill
|
|
96
|
+
from culture.agentirc.skills.rooms import RoomsSkill
|
|
97
|
+
from culture.agentirc.skills.threads import ThreadsSkill
|
|
98
98
|
|
|
99
99
|
await self.register_skill(HistorySkill())
|
|
100
100
|
await self.register_skill(IconSkill())
|
|
@@ -173,7 +173,7 @@ class IRCd:
|
|
|
173
173
|
self, host: str, port: int, password: str, trust: str = "full"
|
|
174
174
|
) -> ServerLink:
|
|
175
175
|
"""Initiate an outbound S2S connection."""
|
|
176
|
-
from culture.
|
|
176
|
+
from culture.agentirc.server_link import ServerLink
|
|
177
177
|
|
|
178
178
|
reader, writer = await asyncio.open_connection(host, port)
|
|
179
179
|
link = ServerLink(reader, writer, self, password, initiator=True, trust=trust)
|
|
@@ -288,7 +288,7 @@ class IRCd:
|
|
|
288
288
|
msg,
|
|
289
289
|
) -> None:
|
|
290
290
|
"""Handle an inbound S2S (server-to-server) connection."""
|
|
291
|
-
from culture.
|
|
291
|
+
from culture.agentirc.server_link import ServerLink
|
|
292
292
|
|
|
293
293
|
# S2S connection - password validated after SERVER reveals peer name
|
|
294
294
|
if not self.config.links:
|
|
@@ -315,7 +315,7 @@ class IRCd:
|
|
|
315
315
|
msg,
|
|
316
316
|
) -> None:
|
|
317
317
|
"""Handle an inbound C2S (client-to-server) connection."""
|
|
318
|
-
from culture.
|
|
318
|
+
from culture.agentirc.client import Client
|
|
319
319
|
|
|
320
320
|
# C2S connection
|
|
321
321
|
client = Client(reader, writer, self)
|
|
@@ -341,7 +341,7 @@ class IRCd:
|
|
|
341
341
|
|
|
342
342
|
def _notify_local_quit(self, rc, quit_msg, notified: set) -> None:
|
|
343
343
|
"""Notify local members of a remote client quit and clean up channels."""
|
|
344
|
-
from culture.
|
|
344
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
345
345
|
|
|
346
346
|
for channel in list(rc.channels):
|
|
347
347
|
for member in list(channel.members):
|
|
@@ -385,7 +385,7 @@ class IRCd:
|
|
|
385
385
|
"""Reload persistent rooms from disk on startup."""
|
|
386
386
|
if not self.config.data_dir:
|
|
387
387
|
return
|
|
388
|
-
from culture.
|
|
388
|
+
from culture.agentirc.room_store import RoomStore
|
|
389
389
|
|
|
390
390
|
store = RoomStore(self.config.data_dir)
|
|
391
391
|
for data in store.load_all():
|
|
@@ -6,8 +6,8 @@ from typing import TYPE_CHECKING
|
|
|
6
6
|
from culture.protocol.message import Message
|
|
7
7
|
|
|
8
8
|
if TYPE_CHECKING:
|
|
9
|
-
from culture.
|
|
10
|
-
from culture.
|
|
9
|
+
from culture.agentirc.channel import Channel
|
|
10
|
+
from culture.agentirc.server_link import ServerLink
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class RemoteClient:
|
|
@@ -5,13 +5,13 @@ import asyncio
|
|
|
5
5
|
import logging
|
|
6
6
|
from typing import TYPE_CHECKING
|
|
7
7
|
|
|
8
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
9
|
+
from culture.agentirc.skill import Event, EventType
|
|
8
10
|
from culture.aio import maybe_await
|
|
9
11
|
from culture.protocol.message import Message
|
|
10
|
-
from culture.server.remote_client import RemoteClient
|
|
11
|
-
from culture.server.skill import Event, EventType
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
|
-
from culture.
|
|
14
|
+
from culture.agentirc.ircd import IRCd
|
|
15
15
|
|
|
16
16
|
logger = logging.getLogger(__name__)
|
|
17
17
|
|
|
@@ -6,9 +6,9 @@ from enum import Enum
|
|
|
6
6
|
from typing import TYPE_CHECKING, Any
|
|
7
7
|
|
|
8
8
|
if TYPE_CHECKING:
|
|
9
|
+
from culture.agentirc.client import Client
|
|
10
|
+
from culture.agentirc.ircd import IRCd
|
|
9
11
|
from culture.protocol.message import Message
|
|
10
|
-
from culture.server.client import Client
|
|
11
|
-
from culture.server.ircd import IRCd
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class EventType(Enum):
|
|
@@ -6,12 +6,12 @@ from collections import deque
|
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from typing import TYPE_CHECKING
|
|
8
8
|
|
|
9
|
+
from culture.agentirc.skill import Event, EventType, Skill
|
|
9
10
|
from culture.protocol import replies
|
|
10
11
|
from culture.protocol.message import Message
|
|
11
|
-
from culture.server.skill import Event, EventType, Skill
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
|
-
from culture.
|
|
14
|
+
from culture.agentirc.client import Client
|
|
15
15
|
|
|
16
16
|
logger = logging.getLogger(__name__)
|
|
17
17
|
|
|
@@ -46,7 +46,7 @@ class HistorySkill(Skill):
|
|
|
46
46
|
"""Reload persisted history from SQLite on startup."""
|
|
47
47
|
if not self.server.config.data_dir:
|
|
48
48
|
return
|
|
49
|
-
from culture.
|
|
49
|
+
from culture.agentirc.history_store import HistoryStore
|
|
50
50
|
|
|
51
51
|
try:
|
|
52
52
|
store = HistoryStore(self.server.config.data_dir)
|
|
@@ -4,11 +4,11 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
|
+
from culture.agentirc.skill import Skill
|
|
7
8
|
from culture.protocol.message import Message
|
|
8
|
-
from culture.server.skill import Skill
|
|
9
9
|
|
|
10
10
|
if TYPE_CHECKING:
|
|
11
|
-
from culture.
|
|
11
|
+
from culture.agentirc.client import Client
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class IconSkill(Skill):
|
|
@@ -6,14 +6,14 @@ import asyncio
|
|
|
6
6
|
import time
|
|
7
7
|
from typing import TYPE_CHECKING, Callable
|
|
8
8
|
|
|
9
|
+
from culture.agentirc.rooms_util import generate_room_id, parse_room_meta
|
|
10
|
+
from culture.agentirc.skill import Event, EventType, Skill
|
|
9
11
|
from culture.aio import maybe_await
|
|
10
12
|
from culture.protocol import replies
|
|
11
13
|
from culture.protocol.message import Message
|
|
12
|
-
from culture.server.rooms_util import generate_room_id, parse_room_meta
|
|
13
|
-
from culture.server.skill import Event, EventType, Skill
|
|
14
14
|
|
|
15
15
|
if TYPE_CHECKING:
|
|
16
|
-
from culture.
|
|
16
|
+
from culture.agentirc.client import Client
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
class RoomsSkill(Skill):
|
|
@@ -333,7 +333,7 @@ class RoomsSkill(Skill):
|
|
|
333
333
|
|
|
334
334
|
async def _handle_tags_added(self, channel, added_tags: set) -> None:
|
|
335
335
|
"""Invite local agents whose tags match newly added room tags."""
|
|
336
|
-
from culture.
|
|
336
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
337
337
|
|
|
338
338
|
for client in list(self.server.clients.values()):
|
|
339
339
|
if isinstance(client, RemoteClient):
|
|
@@ -344,7 +344,7 @@ class RoomsSkill(Skill):
|
|
|
344
344
|
|
|
345
345
|
async def _handle_tags_removed(self, channel, removed_tags: set) -> None:
|
|
346
346
|
"""Notify local members whose tags match removed room tags."""
|
|
347
|
-
from culture.
|
|
347
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
348
348
|
|
|
349
349
|
for member in list(channel.members):
|
|
350
350
|
if isinstance(member, RemoteClient):
|
|
@@ -502,7 +502,7 @@ class RoomsSkill(Skill):
|
|
|
502
502
|
)
|
|
503
503
|
|
|
504
504
|
async def _handle_roominvite(self, client: Client, msg: Message) -> None:
|
|
505
|
-
from culture.
|
|
505
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
506
506
|
|
|
507
507
|
if len(msg.params) < 2:
|
|
508
508
|
await client.send_numeric(
|
|
@@ -756,7 +756,7 @@ class RoomsSkill(Skill):
|
|
|
756
756
|
"""Save room to disk if data_dir is configured."""
|
|
757
757
|
if not self.server.config.data_dir:
|
|
758
758
|
return
|
|
759
|
-
from culture.
|
|
759
|
+
from culture.agentirc.room_store import RoomStore
|
|
760
760
|
|
|
761
761
|
store = RoomStore(self.server.config.data_dir)
|
|
762
762
|
store.save(channel)
|
|
@@ -7,13 +7,13 @@ import time
|
|
|
7
7
|
from dataclasses import dataclass, field
|
|
8
8
|
from typing import TYPE_CHECKING
|
|
9
9
|
|
|
10
|
+
from culture.agentirc.skill import Event, EventType, Skill
|
|
10
11
|
from culture.protocol import replies
|
|
11
12
|
from culture.protocol.message import Message
|
|
12
|
-
from culture.server.skill import Event, EventType, Skill
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
|
-
from culture.
|
|
16
|
-
from culture.
|
|
15
|
+
from culture.agentirc.channel import Channel
|
|
16
|
+
from culture.agentirc.client import Client
|
|
17
17
|
|
|
18
18
|
# Thread name: alphanumeric + hyphens, 1-32 chars, must start/end with alnum
|
|
19
19
|
_THREAD_NAME_RE = re.compile(r"^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,30}[a-zA-Z0-9])?$")
|
|
@@ -59,7 +59,7 @@ class ThreadsSkill(Skill):
|
|
|
59
59
|
"""Reload persisted threads from disk on startup."""
|
|
60
60
|
if not self.server.config.data_dir:
|
|
61
61
|
return
|
|
62
|
-
from culture.
|
|
62
|
+
from culture.agentirc.thread_store import ThreadStore
|
|
63
63
|
|
|
64
64
|
store = ThreadStore(self.server.config.data_dir)
|
|
65
65
|
for data in store.load_all():
|
|
@@ -86,7 +86,7 @@ class ThreadsSkill(Skill):
|
|
|
86
86
|
"""Save a thread to disk if data_dir is configured."""
|
|
87
87
|
if not self.server.config.data_dir:
|
|
88
88
|
return
|
|
89
|
-
from culture.
|
|
89
|
+
from culture.agentirc.thread_store import ThreadStore
|
|
90
90
|
|
|
91
91
|
store = ThreadStore(self.server.config.data_dir)
|
|
92
92
|
store.save(
|
|
@@ -306,7 +306,7 @@ class ThreadsSkill(Skill):
|
|
|
306
306
|
|
|
307
307
|
Returns the prefixed text for use in event data.
|
|
308
308
|
"""
|
|
309
|
-
from culture.
|
|
309
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
310
310
|
|
|
311
311
|
prefixed = self._format_thread_msg(thread_name, text)
|
|
312
312
|
relay = Message(
|
|
@@ -330,7 +330,7 @@ class ThreadsSkill(Skill):
|
|
|
330
330
|
text: str,
|
|
331
331
|
) -> None:
|
|
332
332
|
"""Find @mentions in text and send a NOTICE to each mentioned user in the channel."""
|
|
333
|
-
from culture.
|
|
333
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
334
334
|
|
|
335
335
|
mentioned_nicks = re.findall(r"@(\S+)", text)
|
|
336
336
|
if not mentioned_nicks:
|
|
@@ -411,7 +411,7 @@ class ThreadsSkill(Skill):
|
|
|
411
411
|
summary: str | None,
|
|
412
412
|
) -> None:
|
|
413
413
|
"""Archive a thread, notify channel members, persist, and emit event."""
|
|
414
|
-
from culture.
|
|
414
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
415
415
|
|
|
416
416
|
thread.archived = True
|
|
417
417
|
thread.summary = summary
|
|
@@ -552,7 +552,7 @@ class ThreadsSkill(Skill):
|
|
|
552
552
|
breakout_name: str,
|
|
553
553
|
) -> None:
|
|
554
554
|
"""Archive the promoted thread, notify channel, persist, and emit event."""
|
|
555
|
-
from culture.
|
|
555
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
556
556
|
|
|
557
557
|
thread.archived = True
|
|
558
558
|
thread.summary = f"Promoted to {breakout_name}"
|
|
@@ -659,7 +659,7 @@ class ThreadsSkill(Skill):
|
|
|
659
659
|
|
|
660
660
|
async def _populate_breakout(self, thread: Thread, breakout, breakout_name: str) -> None:
|
|
661
661
|
"""Gather local participants from the thread, auto-join them, and send JOIN messages."""
|
|
662
|
-
from culture.
|
|
662
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
663
663
|
|
|
664
664
|
participant_nicks = thread.participants
|
|
665
665
|
participants = []
|
|
@@ -683,7 +683,7 @@ class ThreadsSkill(Skill):
|
|
|
683
683
|
|
|
684
684
|
async def _replay_thread_history(self, thread: Thread, breakout_name: str) -> None:
|
|
685
685
|
"""Replay all thread messages as NOTICE to breakout channel members."""
|
|
686
|
-
from culture.
|
|
686
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
687
687
|
|
|
688
688
|
breakout = self.server.channels.get(breakout_name)
|
|
689
689
|
if breakout is None:
|
|
@@ -12,7 +12,7 @@ from culture.bots.template_engine import render_fallback, render_template
|
|
|
12
12
|
from culture.bots.virtual_client import VirtualClient
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
|
-
from culture.
|
|
15
|
+
from culture.agentirc.ircd import IRCd
|
|
16
16
|
|
|
17
17
|
logger = logging.getLogger(__name__)
|
|
18
18
|
|
|
@@ -5,12 +5,12 @@ from __future__ import annotations
|
|
|
5
5
|
import logging
|
|
6
6
|
from typing import TYPE_CHECKING
|
|
7
7
|
|
|
8
|
+
from culture.agentirc.skill import Event, EventType
|
|
8
9
|
from culture.protocol.message import Message
|
|
9
|
-
from culture.server.skill import Event, EventType
|
|
10
10
|
|
|
11
11
|
if TYPE_CHECKING:
|
|
12
|
-
from culture.
|
|
13
|
-
from culture.
|
|
12
|
+
from culture.agentirc.channel import Channel
|
|
13
|
+
from culture.agentirc.ircd import IRCd
|
|
14
14
|
|
|
15
15
|
logger = logging.getLogger(__name__)
|
|
16
16
|
|
|
@@ -132,7 +132,7 @@ class VirtualClient:
|
|
|
132
132
|
async def send_dm(self, target_nick: str, text: str) -> None:
|
|
133
133
|
"""Send a direct PRIVMSG to a specific user."""
|
|
134
134
|
text = _sanitize_irc_text(text)
|
|
135
|
-
from culture.
|
|
135
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
136
136
|
|
|
137
137
|
recipient = self.server.get_client(target_nick)
|
|
138
138
|
if not recipient:
|
|
@@ -159,7 +159,7 @@ class VirtualClient:
|
|
|
159
159
|
"""Send NOTICE to any @mentioned users in the text."""
|
|
160
160
|
import re
|
|
161
161
|
|
|
162
|
-
from culture.
|
|
162
|
+
from culture.agentirc.remote_client import RemoteClient
|
|
163
163
|
|
|
164
164
|
mentioned_nicks = re.findall(r"@(\S+)", text)
|
|
165
165
|
if not mentioned_nicks:
|
|
@@ -408,8 +408,8 @@ async def _run_server(
|
|
|
408
408
|
data_dir: str = "",
|
|
409
409
|
) -> None:
|
|
410
410
|
"""Run the IRC server (called in the daemon child process)."""
|
|
411
|
-
from culture.
|
|
412
|
-
from culture.
|
|
411
|
+
from culture.agentirc.config import ServerConfig
|
|
412
|
+
from culture.agentirc.ircd import IRCd
|
|
413
413
|
|
|
414
414
|
config = ServerConfig(
|
|
415
415
|
name=name,
|
|
@@ -20,7 +20,7 @@ def parse_link(value: str):
|
|
|
20
20
|
Trust is extracted from the end if it matches a known value.
|
|
21
21
|
This allows passwords containing colons.
|
|
22
22
|
"""
|
|
23
|
-
from culture.
|
|
23
|
+
from culture.agentirc.config import LinkConfig
|
|
24
24
|
|
|
25
25
|
trust = "full"
|
|
26
26
|
if value.endswith(":full") or value.endswith(":restricted"):
|
|
@@ -41,9 +41,9 @@ def parse_link(value: str):
|
|
|
41
41
|
|
|
42
42
|
def resolve_links_from_mesh(mesh_config_path: str) -> list:
|
|
43
43
|
"""Load link configs from mesh.yaml, looking up passwords from OS keyring."""
|
|
44
|
+
from culture.agentirc.config import LinkConfig
|
|
44
45
|
from culture.credentials import lookup_credential
|
|
45
46
|
from culture.mesh_config import load_mesh_config
|
|
46
|
-
from culture.server.config import LinkConfig
|
|
47
47
|
|
|
48
48
|
mesh = load_mesh_config(mesh_config_path)
|
|
49
49
|
links = []
|
|
@@ -447,7 +447,7 @@ class ACPDaemon:
|
|
|
447
447
|
|
|
448
448
|
async def _handle_roominvite(self, channel: str, meta_text: str) -> None:
|
|
449
449
|
"""Evaluate a room invitation using the agent's LLM."""
|
|
450
|
-
from culture.
|
|
450
|
+
from culture.agentirc.rooms_util import parse_room_meta
|
|
451
451
|
|
|
452
452
|
meta = parse_room_meta(meta_text)
|
|
453
453
|
purpose = meta.get("purpose", "")
|
|
@@ -364,7 +364,7 @@ class AgentDaemon:
|
|
|
364
364
|
|
|
365
365
|
async def _handle_roominvite(self, channel: str, meta_text: str) -> None:
|
|
366
366
|
"""Evaluate a room invitation using the agent's LLM."""
|
|
367
|
-
from culture.
|
|
367
|
+
from culture.agentirc.rooms_util import parse_room_meta
|
|
368
368
|
|
|
369
369
|
meta = parse_room_meta(meta_text)
|
|
370
370
|
purpose = meta.get("purpose", "")
|
|
@@ -422,7 +422,7 @@ class CodexDaemon:
|
|
|
422
422
|
|
|
423
423
|
async def _handle_roominvite(self, channel: str, meta_text: str) -> None:
|
|
424
424
|
"""Evaluate a room invitation using the agent's LLM."""
|
|
425
|
-
from culture.
|
|
425
|
+
from culture.agentirc.rooms_util import parse_room_meta
|
|
426
426
|
|
|
427
427
|
meta = parse_room_meta(meta_text)
|
|
428
428
|
purpose = meta.get("purpose", "")
|
|
@@ -422,7 +422,7 @@ class CopilotDaemon:
|
|
|
422
422
|
|
|
423
423
|
async def _handle_roominvite(self, channel: str, meta_text: str) -> None:
|
|
424
424
|
"""Evaluate a room invitation using the agent's LLM."""
|
|
425
|
-
from culture.
|
|
425
|
+
from culture.agentirc.rooms_util import parse_room_meta
|
|
426
426
|
|
|
427
427
|
meta = parse_room_meta(meta_text)
|
|
428
428
|
purpose = meta.get("purpose", "")
|