agentirc-cli 4.3.0__tar.gz → 4.3.2__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.
Files changed (310) hide show
  1. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.github/workflows/pages.yml +6 -5
  2. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.github/workflows/publish.yml +2 -3
  3. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.github/workflows/security-checks.yml +2 -3
  4. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.github/workflows/tests.yml +2 -3
  5. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/CHANGELOG.md +14 -0
  6. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/PKG-INFO +1 -1
  7. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/bots/bot_manager.py +1 -1
  8. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/cli/_helpers.py +52 -32
  9. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/cli/agent.py +102 -103
  10. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/cli/bot.py +20 -12
  11. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/cli/mesh.py +45 -39
  12. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/cli/server.py +96 -94
  13. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/agent_runner.py +35 -29
  14. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/console/client.py +3 -3
  15. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/pyproject.toml +1 -1
  16. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/uv.lock +1 -1
  17. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.claude/skills/pr-review/SKILL.md +0 -0
  18. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.claude/skills/run-tests/SKILL.md +0 -0
  19. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
  20. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.flake8 +0 -0
  21. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.gitignore +0 -0
  22. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.markdownlint-cli2.yaml +0 -0
  23. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.pr_agent.toml +0 -0
  24. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.pre-commit-config.yaml +0 -0
  25. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/.pylintrc +0 -0
  26. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/CLAUDE.md +0 -0
  27. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/CNAME +0 -0
  28. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/Gemfile +0 -0
  29. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/Gemfile.lock +0 -0
  30. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/LICENSE +0 -0
  31. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/README.md +0 -0
  32. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/SECURITY.md +0 -0
  33. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/_config.yml +0 -0
  34. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/_sass/color_schemes/anthropic.scss +0 -0
  35. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/_sass/custom/custom.scss +0 -0
  36. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/__init__.py +0 -0
  37. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/__main__.py +0 -0
  38. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/aio.py +0 -0
  39. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/bots/__init__.py +0 -0
  40. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/bots/bot.py +0 -0
  41. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/bots/config.py +0 -0
  42. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/bots/http_listener.py +0 -0
  43. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/bots/template_engine.py +0 -0
  44. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/bots/virtual_client.py +0 -0
  45. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/cli/__init__.py +0 -0
  46. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/cli/channel.py +0 -0
  47. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/cli/skills.py +0 -0
  48. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/__init__.py +0 -0
  49. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/__init__.py +0 -0
  50. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/config.py +0 -0
  51. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/daemon.py +0 -0
  52. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/ipc.py +0 -0
  53. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/irc_transport.py +0 -0
  54. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/message_buffer.py +0 -0
  55. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/skill/SKILL.md +0 -0
  56. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/skill/__init__.py +0 -0
  57. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/skill/irc_client.py +0 -0
  58. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/socket_server.py +0 -0
  59. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/supervisor.py +0 -0
  60. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/acp/webhook.py +0 -0
  61. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/__init__.py +0 -0
  62. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/__main__.py +0 -0
  63. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/agent_runner.py +0 -0
  64. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/config.py +0 -0
  65. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/daemon.py +0 -0
  66. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/ipc.py +0 -0
  67. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/irc_transport.py +0 -0
  68. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/message_buffer.py +0 -0
  69. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/skill/SKILL.md +0 -0
  70. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/skill/__init__.py +0 -0
  71. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/skill/irc_client.py +0 -0
  72. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/socket_server.py +0 -0
  73. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/supervisor.py +0 -0
  74. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/claude/webhook.py +0 -0
  75. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/__init__.py +0 -0
  76. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/agent_runner.py +0 -0
  77. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/config.py +0 -0
  78. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/daemon.py +0 -0
  79. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/ipc.py +0 -0
  80. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/irc_transport.py +0 -0
  81. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/message_buffer.py +0 -0
  82. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/skill/SKILL.md +0 -0
  83. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/skill/__init__.py +0 -0
  84. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/skill/irc_client.py +0 -0
  85. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/socket_server.py +0 -0
  86. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/supervisor.py +0 -0
  87. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/codex/webhook.py +0 -0
  88. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/__init__.py +0 -0
  89. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/agent_runner.py +0 -0
  90. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/config.py +0 -0
  91. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/daemon.py +0 -0
  92. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/ipc.py +0 -0
  93. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/irc_transport.py +0 -0
  94. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/message_buffer.py +0 -0
  95. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/skill/SKILL.md +0 -0
  96. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/skill/__init__.py +0 -0
  97. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/skill/irc_client.py +0 -0
  98. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/socket_server.py +0 -0
  99. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/supervisor.py +0 -0
  100. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/clients/copilot/webhook.py +0 -0
  101. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/console/__init__.py +0 -0
  102. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/console/app.py +0 -0
  103. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/console/commands.py +0 -0
  104. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/console/widgets/__init__.py +0 -0
  105. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/console/widgets/chat.py +0 -0
  106. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/console/widgets/info_panel.py +0 -0
  107. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/console/widgets/sidebar.py +0 -0
  108. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/credentials.py +0 -0
  109. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/learn_prompt.py +0 -0
  110. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/mesh_config.py +0 -0
  111. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/observer.py +0 -0
  112. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/overview/__init__.py +0 -0
  113. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/overview/collector.py +0 -0
  114. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/overview/model.py +0 -0
  115. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/overview/renderer_text.py +0 -0
  116. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/overview/renderer_web.py +0 -0
  117. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/overview/web/style.css +0 -0
  118. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/persistence.py +0 -0
  119. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/pidfile.py +0 -0
  120. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/__init__.py +0 -0
  121. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/commands.py +0 -0
  122. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/extensions/federation.md +0 -0
  123. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/extensions/history.md +0 -0
  124. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/extensions/icons.md +0 -0
  125. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/extensions/rooms.md +0 -0
  126. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/extensions/tags.md +0 -0
  127. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/extensions/threads.md +0 -0
  128. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/message.py +0 -0
  129. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/protocol-index.md +0 -0
  130. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/protocol/replies.py +0 -0
  131. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/__init__.py +0 -0
  132. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/__main__.py +0 -0
  133. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/channel.py +0 -0
  134. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/client.py +0 -0
  135. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/config.py +0 -0
  136. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/ircd.py +0 -0
  137. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/remote_client.py +0 -0
  138. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/room_store.py +0 -0
  139. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/rooms_util.py +0 -0
  140. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/server_link.py +0 -0
  141. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/skill.py +0 -0
  142. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/skills/__init__.py +0 -0
  143. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/skills/history.py +0 -0
  144. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/skills/icon.py +0 -0
  145. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/skills/rooms.py +0 -0
  146. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/skills/threads.py +0 -0
  147. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/server/thread_store.py +0 -0
  148. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/culture/skills/culture/SKILL.md +0 -0
  149. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/agent-lifecycle.md +0 -0
  150. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/agentic-self-learn.md +0 -0
  151. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/agent-client.md +0 -0
  152. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/agent-harness-spec.md +0 -0
  153. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/design.md +0 -0
  154. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/harness-conformance.md +0 -0
  155. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/index.md +0 -0
  156. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/layer1-core-irc.md +0 -0
  157. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/layer2-attention.md +0 -0
  158. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/layer3-skills.md +0 -0
  159. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/layer4-federation.md +0 -0
  160. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/layer5-agent-harness.md +0 -0
  161. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/server-architecture.md +0 -0
  162. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/architecture/threads.md +0 -0
  163. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/channel-polling.md +0 -0
  164. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/acp/overview.md +0 -0
  165. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/claude/configuration.md +0 -0
  166. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/claude/context-management.md +0 -0
  167. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/claude/irc-tools.md +0 -0
  168. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/claude/overview.md +0 -0
  169. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/claude/setup.md +0 -0
  170. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/claude/supervisor.md +0 -0
  171. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/claude/webhooks.md +0 -0
  172. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/codex/configuration.md +0 -0
  173. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/codex/context-management.md +0 -0
  174. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/codex/irc-tools.md +0 -0
  175. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/codex/overview.md +0 -0
  176. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/codex/setup.md +0 -0
  177. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/codex/supervisor.md +0 -0
  178. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/codex/webhooks.md +0 -0
  179. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/copilot/configuration.md +0 -0
  180. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/copilot/context-management.md +0 -0
  181. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/copilot/irc-tools.md +0 -0
  182. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/copilot/overview.md +0 -0
  183. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/copilot/setup.md +0 -0
  184. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/copilot/supervisor.md +0 -0
  185. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/clients/copilot/webhooks.md +0 -0
  186. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/culture-cli.md +0 -0
  187. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/getting-started.md +0 -0
  188. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/index.md +0 -0
  189. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/SECURITY.md +0 -0
  190. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/bots.md +0 -0
  191. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/ci.md +0 -0
  192. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/cli.md +0 -0
  193. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/docs-site.md +0 -0
  194. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/index.md +0 -0
  195. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/ops-tooling.md +0 -0
  196. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/overview.md +0 -0
  197. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/operations/publishing.md +0 -0
  198. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/resources/github-copilot-sdk-instructions.md +0 -0
  199. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/rooms.md +0 -0
  200. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/server-rename.md +0 -0
  201. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
  202. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
  203. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
  204. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
  205. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
  206. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
  207. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
  208. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
  209. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
  210. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
  211. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
  212. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
  213. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
  214. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
  215. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
  216. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
  217. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
  218. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
  219. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
  220. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
  221. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
  222. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/superpowers/specs/2026-04-07-entity-archiving-design.md +0 -0
  223. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/01-pair-programming.md +0 -0
  224. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/02-code-review-ensemble.md +0 -0
  225. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/03-cross-server-delegation.md +0 -0
  226. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/04-knowledge-propagation.md +0 -0
  227. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/05-the-observer.md +0 -0
  228. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/06-cross-server-ops.md +0 -0
  229. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/07-supervisor-intervention.md +0 -0
  230. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/08-apps-as-agents.md +0 -0
  231. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/09-research-swarm.md +0 -0
  232. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases/10-agent-lifecycle.md +0 -0
  233. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/use-cases-index.md +0 -0
  234. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/docs/what-is-culture.md +0 -0
  235. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/README.md +0 -0
  236. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/config.py +0 -0
  237. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/daemon.py +0 -0
  238. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/ipc.py +0 -0
  239. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/irc_transport.py +0 -0
  240. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/message_buffer.py +0 -0
  241. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/skill/SKILL.md +0 -0
  242. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/skill/irc_client.py +0 -0
  243. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/socket_server.py +0 -0
  244. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/packages/agent-harness/webhook.py +0 -0
  245. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  246. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/plugins/claude-code/skills/culture/SKILL.md +0 -0
  247. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/plugins/claude-code/skills/irc/SKILL.md +0 -0
  248. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
  249. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/sonar-project.properties +0 -0
  250. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/__init__.py +0 -0
  251. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/conftest.py +0 -0
  252. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_acp_daemon.py +0 -0
  253. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_agent_runner.py +0 -0
  254. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_archive.py +0 -0
  255. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_bot.py +0 -0
  256. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_bot_config.py +0 -0
  257. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_bot_manager.py +0 -0
  258. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_bots_integration.py +0 -0
  259. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_channel.py +0 -0
  260. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_codex_daemon.py +0 -0
  261. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_connection.py +0 -0
  262. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_console_client.py +0 -0
  263. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_console_commands.py +0 -0
  264. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_console_connection.py +0 -0
  265. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_console_icons.py +0 -0
  266. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_console_integration.py +0 -0
  267. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_copilot_daemon.py +0 -0
  268. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_daemon.py +0 -0
  269. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_daemon_config.py +0 -0
  270. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_daemon_ipc.py +0 -0
  271. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_discovery.py +0 -0
  272. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_federation.py +0 -0
  273. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_history.py +0 -0
  274. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_http_listener.py +0 -0
  275. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_integration_layer5.py +0 -0
  276. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_ipc.py +0 -0
  277. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_irc_transport.py +0 -0
  278. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_link_reconnect.py +0 -0
  279. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_mention_alias.py +0 -0
  280. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_mention_target_cleanup.py +0 -0
  281. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_mentions.py +0 -0
  282. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_mesh_config.py +0 -0
  283. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_message.py +0 -0
  284. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_message_buffer.py +0 -0
  285. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_messaging.py +0 -0
  286. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_modes.py +0 -0
  287. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_overview_cli.py +0 -0
  288. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_overview_collector.py +0 -0
  289. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_overview_model.py +0 -0
  290. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_overview_renderer.py +0 -0
  291. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_overview_web.py +0 -0
  292. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_persistence.py +0 -0
  293. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_pidfile.py +0 -0
  294. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_poll_loop.py +0 -0
  295. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_room_persistence.py +0 -0
  296. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_rooms.py +0 -0
  297. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_rooms_federation.py +0 -0
  298. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_rooms_integration.py +0 -0
  299. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_server_icon_skill.py +0 -0
  300. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_setup_update_cli.py +0 -0
  301. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_skill_client.py +0 -0
  302. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_skills.py +0 -0
  303. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_socket_server.py +0 -0
  304. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_supervisor.py +0 -0
  305. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_template_engine.py +0 -0
  306. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_thread_buffer.py +0 -0
  307. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_threads.py +0 -0
  308. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_virtual_client.py +0 -0
  309. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_wait_for_port.py +0 -0
  310. {agentirc_cli-4.3.0 → agentirc_cli-4.3.2}/tests/test_webhook.py +0 -0
@@ -5,11 +5,6 @@ on:
5
5
  branches: ["main"]
6
6
  workflow_dispatch:
7
7
 
8
- permissions:
9
- contents: read
10
- pages: write
11
- id-token: write
12
-
13
8
  concurrency:
14
9
  group: "pages"
15
10
  cancel-in-progress: false
@@ -17,6 +12,9 @@ concurrency:
17
12
  jobs:
18
13
  build:
19
14
  runs-on: ubuntu-latest
15
+ permissions:
16
+ contents: read
17
+ pages: write
20
18
  steps:
21
19
  - name: Checkout
22
20
  uses: actions/checkout@v4
@@ -46,6 +44,9 @@ jobs:
46
44
  url: ${{ steps.deployment.outputs.page_url }}
47
45
  runs-on: ubuntu-latest
48
46
  needs: build
47
+ permissions:
48
+ pages: write
49
+ id-token: write
49
50
  steps:
50
51
  - name: Deploy to GitHub Pages
51
52
  id: deployment
@@ -12,12 +12,11 @@ on:
12
12
  - "pyproject.toml"
13
13
  - "culture/**"
14
14
 
15
- permissions:
16
- contents: read
17
-
18
15
  jobs:
19
16
  test:
20
17
  runs-on: ubuntu-latest
18
+ permissions:
19
+ contents: read
21
20
  steps:
22
21
  - uses: actions/checkout@v4
23
22
 
@@ -9,13 +9,12 @@ on:
9
9
  - cron: '0 0 * * 0' # Weekly on Sunday at midnight
10
10
  workflow_dispatch:
11
11
 
12
- permissions:
13
- contents: read
14
-
15
12
  jobs:
16
13
  security-scans:
17
14
  name: Security Scans
18
15
  runs-on: ubuntu-latest
16
+ permissions:
17
+ contents: read
19
18
  steps:
20
19
  - uses: actions/checkout@v4
21
20
 
@@ -4,12 +4,11 @@ on:
4
4
  pull_request:
5
5
  branches: [main]
6
6
 
7
- permissions:
8
- contents: read
9
-
10
7
  jobs:
11
8
  test:
12
9
  runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: read
13
12
  steps:
14
13
  - uses: actions/checkout@v4
15
14
 
@@ -4,6 +4,20 @@ 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
+ ## [4.3.2] - 2026-04-07
8
+
9
+
10
+ ### Changed
11
+
12
+ - Reduced cognitive complexity in 13 functions across 6 files by extracting helpers and flattening control flow (SonarCloud S3776)
13
+
14
+ ## [4.3.1] - 2026-04-07
15
+
16
+
17
+ ### Fixed
18
+
19
+ - Remove unnecessary list() wrapping on already-iterable values (SonarCloud S7504/S7494)
20
+
7
21
  ## [4.3.0] - 2026-04-07
8
22
 
9
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentirc-cli
3
- Version: 4.3.0
3
+ Version: 4.3.2
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
@@ -86,7 +86,7 @@ class BotManager:
86
86
 
87
87
  def list_bots(self, owner: str | None = None) -> list[Bot]:
88
88
  """List bots, optionally filtered by owner."""
89
- bots = list(self.bots.values())
89
+ bots = self.bots.values()
90
90
  if owner:
91
91
  bots = [b for b in bots if b.config.owner == owner]
92
92
  return sorted(bots, key=lambda b: b.name)
@@ -381,6 +381,25 @@ def print_agent_detail(agent, config_path: str, args: argparse.Namespace) -> Non
381
381
  print(f" Config: {config_path}")
382
382
 
383
383
 
384
+ def _format_agent_status(base_status: str, archived: bool, show_archived_marker: bool) -> str:
385
+ """Format the display status string for an agent."""
386
+ if not archived:
387
+ return base_status
388
+ if show_archived_marker:
389
+ return f"{base_status} (archived)"
390
+ if base_status == "stopped":
391
+ return "archived"
392
+ return base_status
393
+
394
+
395
+ def _fetch_agent_activity(agent) -> str:
396
+ """Fetch activity description from a running agent via IPC."""
397
+ resp = asyncio.run(ipc_request(agent_socket_path(agent.nick), "status"))
398
+ if resp and resp.get("ok"):
399
+ return resp.get("data", {}).get("description", "nothing")
400
+ return "-"
401
+
402
+
384
403
  def print_agents_overview(
385
404
  agents: list, show_activity: bool, show_archived_marker: bool = False
386
405
  ) -> None:
@@ -393,44 +412,45 @@ def print_agents_overview(
393
412
  print("-" * 52)
394
413
 
395
414
  for agent in agents:
396
- archived = getattr(agent, "archived", False)
397
415
  base_status, pid = agent_process_status(agent)
398
- status = base_status
399
- if archived:
400
- if show_archived_marker:
401
- status = f"{base_status} (archived)"
402
- elif base_status == "stopped":
403
- status = "archived"
404
- activity = "-"
405
-
406
- if show_activity and base_status == "running":
407
- resp = asyncio.run(ipc_request(agent_socket_path(agent.nick), "status"))
408
- if resp and resp.get("ok"):
409
- activity = resp.get("data", {}).get("description", "nothing")
410
-
416
+ status = _format_agent_status(
417
+ base_status, getattr(agent, "archived", False), show_archived_marker
418
+ )
419
+ activity = (
420
+ _fetch_agent_activity(agent) if show_activity and base_status == "running" else "-"
421
+ )
411
422
  if show_activity:
412
423
  print(f"{agent.nick:<30} {status:<12} {str(pid or '-'):<10} {activity}")
413
424
  else:
414
425
  print(f"{agent.nick:<30} {status:<12} {str(pid or '-'):<10}")
415
426
 
416
427
 
417
- def print_bot_listing() -> None:
418
- """Print a table of configured bots (if any exist)."""
428
+ def _load_bot_configs() -> list:
429
+ """Load all valid bot configs from the bots directory."""
419
430
  from culture.bots.config import BOTS_DIR, load_bot_config
420
431
 
421
- if BOTS_DIR.is_dir():
422
- bot_configs = []
423
- for bot_dir in sorted(BOTS_DIR.iterdir()):
424
- yaml_path = bot_dir / "bot.yaml"
425
- if yaml_path.is_file():
426
- try:
427
- bot_configs.append(load_bot_config(yaml_path))
428
- except Exception:
429
- pass
430
- if bot_configs:
431
- print()
432
- print(f"{'BOT':<30} {'TRIGGER':<12} {'CHANNELS'}")
433
- print("-" * 60)
434
- for bc in bot_configs:
435
- channels = ", ".join(bc.channels) if bc.channels else "-"
436
- print(f"{bc.name:<30} {bc.trigger_type:<12} {channels}")
432
+ if not BOTS_DIR.is_dir():
433
+ return []
434
+ configs = []
435
+ for bot_dir in sorted(BOTS_DIR.iterdir()):
436
+ yaml_path = bot_dir / "bot.yaml"
437
+ if not yaml_path.is_file():
438
+ continue
439
+ try:
440
+ configs.append(load_bot_config(yaml_path))
441
+ except Exception:
442
+ pass
443
+ return configs
444
+
445
+
446
+ def print_bot_listing() -> None:
447
+ """Print a table of configured bots (if any exist)."""
448
+ bot_configs = _load_bot_configs()
449
+ if not bot_configs:
450
+ return
451
+ print()
452
+ print(f"{'BOT':<30} {'TRIGGER':<12} {'CHANNELS'}")
453
+ print("-" * 60)
454
+ for bc in bot_configs:
455
+ channels = ", ".join(bc.channels) if bc.channels else "-"
456
+ print(f"{bc.name:<30} {bc.trigger_type:<12} {channels}")
@@ -315,52 +315,58 @@ def _cmd_join(args: argparse.Namespace) -> None:
315
315
  # -----------------------------------------------------------------------
316
316
 
317
317
 
318
+ def _get_active_agents(config) -> list:
319
+ """Return non-archived agents."""
320
+ return [a for a in config.agents if not a.archived]
321
+
322
+
323
+ def _resolve_by_nick(config, nick: str):
324
+ """Look up a single agent by nick, exit on error."""
325
+ agent = config.get_agent(nick)
326
+ if not agent:
327
+ print(f"Agent '{nick}' not found in config", file=sys.stderr)
328
+ sys.exit(1)
329
+ if agent.archived:
330
+ print(f"Agent '{nick}' is archived. Unarchive first:", file=sys.stderr)
331
+ print(f" culture agent unarchive {nick}", file=sys.stderr)
332
+ sys.exit(1)
333
+ return agent
334
+
335
+
336
+ def _resolve_auto(config) -> list:
337
+ """Auto-resolve agents when no nick or --all given, exit if ambiguous."""
338
+ active = _get_active_agents(config)
339
+ if len(active) == 1:
340
+ return active
341
+ if len(active) == 0:
342
+ archived_count = sum(1 for a in config.agents if a.archived)
343
+ if archived_count:
344
+ print(
345
+ f"No active agents ({archived_count} archived). "
346
+ "Unarchive an agent or create a new one.",
347
+ file=sys.stderr,
348
+ )
349
+ else:
350
+ print("No agents configured. Run 'culture agent create' first.", file=sys.stderr)
351
+ sys.exit(1)
352
+ print("Multiple agents configured. Specify a nick or use --all.", file=sys.stderr)
353
+ for a in active:
354
+ print(f" {a.nick}", file=sys.stderr)
355
+ sys.exit(1)
356
+
357
+
318
358
  def _resolve_agents_to_start(config, args) -> list:
319
359
  """Return the list of agents to start, or exit with an error message."""
320
360
  if args.all:
321
- # Skip archived agents when starting --all
322
- agents = [a for a in config.agents if not a.archived]
361
+ agents = _get_active_agents(config)
323
362
  elif args.nick:
324
- agent = config.get_agent(args.nick)
325
- if not agent:
326
- print(f"Agent '{args.nick}' not found in config", file=sys.stderr)
327
- sys.exit(1)
328
- if agent.archived:
329
- print(
330
- f"Agent '{args.nick}' is archived. Unarchive first:",
331
- file=sys.stderr,
332
- )
333
- print(f" culture agent unarchive {args.nick}", file=sys.stderr)
334
- sys.exit(1)
335
- agents = [agent]
363
+ agents = [_resolve_by_nick(config, args.nick)]
336
364
  else:
337
- active = [a for a in config.agents if not a.archived]
338
- if len(active) == 1:
339
- agents = active
340
- elif len(active) == 0:
341
- archived_count = sum(1 for a in config.agents if a.archived)
342
- if archived_count:
343
- print(
344
- f"No active agents ({archived_count} archived). "
345
- "Unarchive an agent or create a new one.",
346
- file=sys.stderr,
347
- )
348
- else:
349
- print("No agents configured. Run 'culture agent create' first.", file=sys.stderr)
350
- sys.exit(1)
351
- else:
352
- print(
353
- "Multiple agents configured. Specify a nick or use --all.",
354
- file=sys.stderr,
355
- )
356
- for a in active:
357
- print(f" {a.nick}", file=sys.stderr)
358
- sys.exit(1)
365
+ agents = _resolve_auto(config)
359
366
 
360
367
  if not agents:
361
368
  print("No agents configured", file=sys.stderr)
362
369
  sys.exit(1)
363
-
364
370
  return agents
365
371
 
366
372
 
@@ -448,10 +454,10 @@ async def _run_single_agent(config: DaemonConfig, agent: AgentConfig) -> None:
448
454
  agent="acp",
449
455
  acp_command=getattr(agent, "acp_command", None) or ["opencode", "acp"],
450
456
  directory=agent.directory,
451
- channels=list(agent.channels),
457
+ channels=agent.channels,
452
458
  model=agent.model,
453
459
  system_prompt=agent.system_prompt,
454
- tags=list(agent.tags),
460
+ tags=agent.tags,
455
461
  )
456
462
  else:
457
463
  acp_agent = agent
@@ -553,6 +559,24 @@ def _cmd_stop(args: argparse.Namespace) -> None:
553
559
  # -----------------------------------------------------------------------
554
560
 
555
561
 
562
+ def _print_archived_info(agent) -> None:
563
+ """Print archive details for an agent."""
564
+ if not agent.archived:
565
+ return
566
+ print(f"\n [archived since {agent.archived_at}]")
567
+ if agent.archived_reason:
568
+ print(f" Reason: {agent.archived_reason}")
569
+
570
+
571
+ def _no_agents_message(config, show_all: bool) -> str:
572
+ """Return appropriate message when no agents to display."""
573
+ if not show_all:
574
+ archived_count = sum(1 for a in config.agents if a.archived)
575
+ if archived_count:
576
+ return f"No active agents ({archived_count} archived, use --all to show)"
577
+ return "No agents configured"
578
+
579
+
556
580
  def _cmd_status(args: argparse.Namespace) -> None:
557
581
  config = load_config_or_default(args.config)
558
582
 
@@ -561,34 +585,19 @@ def _cmd_status(args: argparse.Namespace) -> None:
561
585
  return
562
586
 
563
587
  if args.nick:
564
- agent = None
565
- for a in config.agents:
566
- if a.nick == args.nick:
567
- agent = a
568
- break
588
+ agent = config.get_agent(args.nick)
569
589
  if not agent:
570
590
  print(f"Agent '{args.nick}' not found in config", file=sys.stderr)
571
591
  sys.exit(1)
572
-
573
592
  print_agent_detail(agent, args.config, args)
574
- if agent.archived:
575
- print(f"\n [archived since {agent.archived_at}]")
576
- if agent.archived_reason:
577
- print(f" Reason: {agent.archived_reason}")
593
+ _print_archived_info(agent)
578
594
  return
579
595
 
580
596
  show_all = getattr(args, "all", False)
581
- if show_all:
582
- agents = config.agents
583
- else:
584
- agents = [a for a in config.agents if not a.archived]
597
+ agents = config.agents if show_all else _get_active_agents(config)
585
598
 
586
- if not agents and not show_all:
587
- archived_count = sum(1 for a in config.agents if a.archived)
588
- if archived_count:
589
- print(f"No active agents ({archived_count} archived, use --all to show)")
590
- else:
591
- print("No agents configured")
599
+ if not agents:
600
+ print(_no_agents_message(config, show_all))
592
601
  return
593
602
 
594
603
  print_agents_overview(agents, args.full, show_archived_marker=show_all)
@@ -703,35 +712,39 @@ def _cmd_assign(args: argparse.Namespace) -> None:
703
712
  # -----------------------------------------------------------------------
704
713
 
705
714
 
706
- def _ipc_to_agents(args: argparse.Namespace, msg_type: str, action_verb: str) -> None:
707
- """Send an IPC message (pause/resume) to one or all agents."""
708
- config = load_config_or_default(args.config)
709
-
715
+ def _resolve_ipc_targets(config, args, action_verb: str) -> list:
716
+ """Resolve which agents to send IPC messages to."""
710
717
  if args.nick and args.all:
711
718
  print("Cannot specify both nick and --all", file=sys.stderr)
712
719
  sys.exit(1)
713
-
714
720
  if not args.nick and not args.all:
715
721
  print(f"Usage: culture agent {action_verb} <nick> or --all", file=sys.stderr)
716
722
  sys.exit(1)
723
+ if args.all:
724
+ return config.agents
725
+ for a in config.agents:
726
+ if a.nick == args.nick:
727
+ return [a]
728
+ print(f"Agent '{args.nick}' not found in config", file=sys.stderr)
729
+ sys.exit(1)
730
+
731
+
732
+ def _send_ipc(agent, msg_type: str, action_verb: str) -> None:
733
+ """Send a single IPC message to an agent and print result."""
734
+ socket_path = agent_socket_path(agent.nick)
735
+ resp = asyncio.run(ipc_request(socket_path, msg_type))
736
+ if resp and resp.get("ok"):
737
+ print(f"{agent.nick}: {action_verb}")
738
+ else:
739
+ print(f"{agent.nick}: failed (not running?)", file=sys.stderr)
717
740
 
718
- targets = config.agents if args.all else []
719
- if args.nick:
720
- for a in config.agents:
721
- if a.nick == args.nick:
722
- targets = [a]
723
- break
724
- else:
725
- print(f"Agent '{args.nick}' not found in config", file=sys.stderr)
726
- sys.exit(1)
727
741
 
742
+ def _ipc_to_agents(args: argparse.Namespace, msg_type: str, action_verb: str) -> None:
743
+ """Send an IPC message (pause/resume) to one or all agents."""
744
+ config = load_config_or_default(args.config)
745
+ targets = _resolve_ipc_targets(config, args, action_verb)
728
746
  for agent in targets:
729
- socket_path = agent_socket_path(agent.nick)
730
- resp = asyncio.run(ipc_request(socket_path, msg_type))
731
- if resp and resp.get("ok"):
732
- print(f"{agent.nick}: {action_verb}")
733
- else:
734
- print(f"{agent.nick}: failed (not running?)", file=sys.stderr)
747
+ _send_ipc(agent, msg_type, action_verb)
735
748
 
736
749
 
737
750
  def _cmd_sleep(args: argparse.Namespace) -> None:
@@ -748,38 +761,24 @@ def _cmd_learn(args: argparse.Namespace) -> None:
748
761
  config = load_config_or_default(args.config)
749
762
  cwd = os.getcwd()
750
763
 
751
- agent = None
752
764
  if args.nick:
753
- for a in config.agents:
754
- if a.nick == args.nick:
755
- agent = a
756
- break
765
+ agent = config.get_agent(args.nick)
757
766
  if not agent:
758
767
  print(f"Agent '{args.nick}' not found in config", file=sys.stderr)
759
768
  sys.exit(1)
760
769
  else:
761
- for a in config.agents:
762
- if os.path.realpath(a.directory) == os.path.realpath(cwd):
763
- agent = a
764
- break
770
+ cwd_real = os.path.realpath(cwd)
771
+ agent = next(
772
+ (a for a in config.agents if os.path.realpath(a.directory) == cwd_real),
773
+ None,
774
+ )
765
775
 
776
+ kwargs = {"server": config.server.name, "directory": cwd}
766
777
  if agent:
767
- print(
768
- generate_learn_prompt(
769
- nick=agent.nick,
770
- server=config.server.name,
771
- directory=agent.directory,
772
- backend=agent.agent,
773
- channels=agent.channels,
774
- )
775
- )
776
- else:
777
- print(
778
- generate_learn_prompt(
779
- server=config.server.name,
780
- directory=cwd,
781
- )
778
+ kwargs.update(
779
+ nick=agent.nick, directory=agent.directory, backend=agent.agent, channels=agent.channels
782
780
  )
781
+ print(generate_learn_prompt(**kwargs))
783
782
 
784
783
 
785
784
  # -----------------------------------------------------------------------
@@ -152,13 +152,12 @@ def _bot_stop(args: argparse.Namespace) -> None:
152
152
  print("(Live reload via IPC will be available in a future release.)")
153
153
 
154
154
 
155
- def _bot_list(args: argparse.Namespace) -> None:
155
+ def _load_and_filter_bots(args) -> list:
156
+ """Load bot configs, filtering by owner and archived status."""
156
157
  from culture.bots.config import BOTS_DIR, load_bot_config
157
158
 
158
159
  if not BOTS_DIR.is_dir():
159
- print("No bots configured.")
160
- return
161
-
160
+ return []
162
161
  show_all = getattr(args, "all", False)
163
162
  bots = []
164
163
  for bot_dir in sorted(BOTS_DIR.iterdir()):
@@ -167,14 +166,24 @@ def _bot_list(args: argparse.Namespace) -> None:
167
166
  continue
168
167
  try:
169
168
  config = load_bot_config(yaml_path)
170
- if args.owner and config.owner != args.owner:
171
- continue
172
- if not show_all and config.archived:
173
- continue
174
- bots.append(config)
175
169
  except Exception:
176
170
  continue
171
+ if args.owner and config.owner != args.owner:
172
+ continue
173
+ if not show_all and config.archived:
174
+ continue
175
+ bots.append(config)
176
+ return bots
177
177
 
178
+
179
+ def _bot_list(args: argparse.Namespace) -> None:
180
+ from culture.bots.config import BOTS_DIR
181
+
182
+ if not BOTS_DIR.is_dir():
183
+ print("No bots configured.")
184
+ return
185
+
186
+ bots = _load_and_filter_bots(args)
178
187
  if not bots:
179
188
  if args.owner:
180
189
  print(f"No bots found for owner '{args.owner}'.")
@@ -182,12 +191,11 @@ def _bot_list(args: argparse.Namespace) -> None:
182
191
  print("No bots configured.")
183
192
  return
184
193
 
194
+ show_all = getattr(args, "all", False)
185
195
  print(f"{'NAME':<35} {'TRIGGER':<10} {'CHANNELS':<20} {'OWNER':<20}")
186
196
  for config in bots:
187
197
  channels = ", ".join(config.channels) if config.channels else "-"
188
- name = config.name
189
- if show_all and config.archived:
190
- name = f"{name} [archived]"
198
+ name = f"{config.name} [archived]" if show_all and config.archived else config.name
191
199
  print(f"{name:<35} {config.trigger_type:<10} {channels:<20} {config.owner:<20}")
192
200
 
193
201