agentirc-cli 9.6.2__tar.gz → 9.7.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-9.7.0/.devague/current +1 -0
- agentirc_cli-9.7.0/.devague/current_plan +1 -0
- agentirc_cli-9.7.0/.devague/frames/agentirc-9-7-0-ships-an-embedded-bot-framework-bot.json +211 -0
- agentirc_cli-9.7.0/.devague/plans/agentirc-9-7-0-ships-an-embedded-bot-framework-bot.json +318 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.gitignore +3 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/CHANGELOG.md +32 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/CLAUDE.md +9 -6
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/PKG-INFO +4 -1
- agentirc_cli-9.7.0/agentirc/_internal/bots/bot_manager.py +33 -0
- agentirc_cli-9.7.0/agentirc/_internal/bots/http_listener.py +33 -0
- agentirc_cli-9.7.0/agentirc/bots/__init__.py +30 -0
- agentirc_cli-9.7.0/agentirc/bots/bot.py +269 -0
- agentirc_cli-9.7.0/agentirc/bots/bot_manager.py +347 -0
- agentirc_cli-9.7.0/agentirc/bots/cli.py +331 -0
- agentirc_cli-9.7.0/agentirc/bots/config.py +199 -0
- agentirc_cli-9.7.0/agentirc/bots/filter_dsl.py +339 -0
- agentirc_cli-9.7.0/agentirc/bots/http_listener.py +131 -0
- agentirc_cli-9.7.0/agentirc/bots/template_engine.py +68 -0
- agentirc_cli-9.7.0/agentirc/bots/virtual_client.py +29 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/cli.py +10 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/ircd.py +14 -11
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/docs/api-stability.md +122 -2
- agentirc_cli-9.7.0/docs/plans/2026-06-12-agentirc-9-7-0-ships-an-embedded-bot-framework-bot.md +86 -0
- agentirc_cli-9.7.0/docs/specs/2026-06-12-agentirc-9-7-0-ships-an-embedded-bot-framework-bot.md +50 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/pyproject.toml +52 -1
- agentirc_cli-9.7.0/tests/bots/test_bot.py +309 -0
- agentirc_cli-9.7.0/tests/bots/test_bot_host.py +77 -0
- agentirc_cli-9.7.0/tests/bots/test_bot_manager.py +302 -0
- agentirc_cli-9.7.0/tests/bots/test_cli_bot.py +272 -0
- agentirc_cli-9.7.0/tests/bots/test_config_bots.py +204 -0
- agentirc_cli-9.7.0/tests/bots/test_filter_dsl.py +260 -0
- agentirc_cli-9.7.0/tests/bots/test_http_listener.py +205 -0
- agentirc_cli-9.7.0/tests/bots/test_public_surface.py +168 -0
- agentirc_cli-9.7.0/tests/bots/test_template_engine.py +86 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/conftest.py +23 -0
- agentirc_cli-9.7.0/tests/telemetry/__init__.py +0 -0
- agentirc_cli-9.7.0/uv.lock +1473 -0
- agentirc_cli-9.6.2/agentirc/_internal/bots/bot_manager.py +0 -38
- agentirc_cli-9.6.2/agentirc/_internal/bots/http_listener.py +0 -36
- agentirc_cli-9.6.2/uv.lock +0 -676
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/cicd/SKILL.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/communicate/SKILL.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/think/SKILL.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills/think/scripts/think.sh +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.claude/skills.local.yaml.example +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/LICENSE +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/README.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/__main__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/aio.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/bots/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/cli_shared/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/cli_shared/constants.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/cli_shared/mesh.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/constants.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/event_subscriptions.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/pidfile.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/protocol/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/protocol/message.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/protocol/replies.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/telemetry/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/telemetry/audit.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/telemetry/context.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/telemetry/metrics.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/telemetry/tracing.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/_internal/virtual_client.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/channel.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/client.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/config.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/events.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/history_store.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/protocol.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/remote_client.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/room_store.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/rooms_util.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/server_link.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/skill.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/skills/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/skills/history.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/skills/icon.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/skills/rooms.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/skills/threads.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/thread_store.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/agentirc/virtual_client.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/docs/cli.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/docs/deployment.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/docs/extension-api.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/docs/steward/onboarding.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/docs/superpowers/specs/2026-04-30-bootstrap-design.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/docs/superpowers/specs/2026-05-01-bot-extension-api-design.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/docs/superpowers/specs/2026-05-01-task14-audit.md +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/_helpers.py +0 -0
- {agentirc_cli-9.6.2/tests/telemetry → agentirc_cli-9.7.0/tests/bots}/__init__.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/_fakes.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/_metrics_helpers.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_audit_emit.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_audit_lifecycle.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_audit_module.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_audit_parse_error.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_config.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_dispatch_span.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_emit_event_span.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_metrics_init.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_metrics_s2s.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_outbound_inject.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_parse_error.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_s2s_relay_span.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_server_init.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_server_link_inject.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/telemetry/test_tracing.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_api_stability_embedding.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_bot_capability.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_channel.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_cli.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_config_loader.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_connection.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_discovery.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_event_subscriptions.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_eventpub.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_events_basic.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_events_catalog.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_events_federation.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_events_history.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_events_lifecycle.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_events_reserved_nick.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_federation.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_history.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_mentions.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_messaging.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_modes.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_protocol_bot_exports.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_skills.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_threads.py +0 -0
- {agentirc_cli-9.6.2 → agentirc_cli-9.7.0}/tests/test_wire_format_envelope.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
agentirc-9-7-0-ships-an-embedded-bot-framework-bot
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
agentirc-9-7-0-ships-an-embedded-bot-framework-bot
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "agentirc-9-7-0-ships-an-embedded-bot-framework-bot",
|
|
3
|
+
"title": "agentirc 9.7.0 ships an embedded bot framework: BotManager + Bot + filter DSL + template engine + YAML bot config live in agentirc/bots/, tested here, so culture can replace its in-tree culture/bots/* with thin forwards in a single cutover PR with no functionality gap",
|
|
4
|
+
"schema_version": 1,
|
|
5
|
+
"status": "exported",
|
|
6
|
+
"created": "2026-06-12T11:19:28Z",
|
|
7
|
+
"updated": "2026-06-12T11:27:23Z",
|
|
8
|
+
"claims": [
|
|
9
|
+
{
|
|
10
|
+
"id": "c1",
|
|
11
|
+
"kind": "announcement",
|
|
12
|
+
"text": "agentirc 9.7.0 ships an embedded bot framework: BotManager + Bot + filter DSL + template engine + YAML bot config live in agentirc/bots/, tested here, so culture can replace its in-tree culture/bots/* with thin forwards in a single cutover PR with no functionality gap",
|
|
13
|
+
"origin": "user",
|
|
14
|
+
"status": "confirmed",
|
|
15
|
+
"honesty_conditions": [
|
|
16
|
+
{
|
|
17
|
+
"id": "h4",
|
|
18
|
+
"text": "agentirc-cli 9.7.0 is published to PyPI with the bot framework importable, and culture's cutover PR replaces culture/bots/* with forwards while keeping its suite green",
|
|
19
|
+
"status": "confirmed"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"hard_questions": [],
|
|
23
|
+
"links": []
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "c2",
|
|
27
|
+
"kind": "audience",
|
|
28
|
+
"text": "culture (the immediate consumer wiring its IRCd to install BotManager + forwarding culture bot CLI verbs) and any standalone agentirc embedder wanting deterministic YAML chatops bots inside their IRCd",
|
|
29
|
+
"origin": "llm",
|
|
30
|
+
"status": "confirmed",
|
|
31
|
+
"honesty_conditions": [
|
|
32
|
+
{
|
|
33
|
+
"id": "h5",
|
|
34
|
+
"text": "culture's cutover PR consumes the published agentirc API (installs BotManager + forwards CLI) without reimplementing bot logic",
|
|
35
|
+
"status": "confirmed"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"hard_questions": [],
|
|
39
|
+
"links": []
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "c3",
|
|
43
|
+
"kind": "before_state",
|
|
44
|
+
"text": "the bot framework lives only in culture/bots/* (~1340 lines incl config.py); agentirc ships only no-op BotManager/http_listener stubs in _internal/bots/; culture cannot slim its front door because deleting bots would lose functionality",
|
|
45
|
+
"origin": "llm",
|
|
46
|
+
"status": "confirmed",
|
|
47
|
+
"honesty_conditions": [
|
|
48
|
+
{
|
|
49
|
+
"id": "h6",
|
|
50
|
+
"text": "the _internal/bots stubs and culture/bots/* line counts are verifiable in the two repos at cutover time",
|
|
51
|
+
"status": "confirmed"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"hard_questions": [],
|
|
55
|
+
"links": []
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "c4",
|
|
59
|
+
"kind": "after_state",
|
|
60
|
+
"text": "manager + Bot + filter_dsl + template_engine + config (YAML BotConfig) live in agentirc, are unit-tested here (filter DSL + template engine edge cases especially), and a documented public API lets an embedder install a BotManager onto a running IRCd and register YAML-spec'd bots",
|
|
61
|
+
"origin": "llm",
|
|
62
|
+
"status": "confirmed",
|
|
63
|
+
"honesty_conditions": [
|
|
64
|
+
{
|
|
65
|
+
"id": "h7",
|
|
66
|
+
"text": "docs/api-stability.md documents the agentirc.bots install/register API with a worked example",
|
|
67
|
+
"status": "confirmed"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"hard_questions": [],
|
|
71
|
+
"links": []
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "c5",
|
|
75
|
+
"kind": "why_it_matters",
|
|
76
|
+
"text": "the bot brain is already bound to agentirc protocol types (filter DSL evaluates Event/EventType; bot host subclasses agentirc.virtual_client.VirtualClient) \u2014 bots have no coherent life without an IRCd, so the framework belongs here, not in culture or a third package",
|
|
77
|
+
"origin": "llm",
|
|
78
|
+
"status": "confirmed",
|
|
79
|
+
"honesty_conditions": [
|
|
80
|
+
{
|
|
81
|
+
"id": "h8",
|
|
82
|
+
"text": "filter_dsl.evaluate runs against real agentirc Event objects in a test, and the bot host resolves agentirc.virtual_client.VirtualClient as its base",
|
|
83
|
+
"status": "confirmed"
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"hard_questions": [],
|
|
87
|
+
"links": []
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "c6",
|
|
91
|
+
"kind": "boundary",
|
|
92
|
+
"text": "NOT in scope: porting culture's system bots (culture/bots/system/*), any LLM/agent-backend bot harness (forbidden by the dependency boundary), and renaming on-disk artifacts (BOTS_DIR stays ~/.culture/bots for culture continuity)",
|
|
93
|
+
"origin": "llm",
|
|
94
|
+
"status": "confirmed",
|
|
95
|
+
"honesty_conditions": [
|
|
96
|
+
{
|
|
97
|
+
"id": "h9",
|
|
98
|
+
"text": "no file under culture/bots/system/ is vendored, no backend SDK is added to pyproject deps, and BOTS_DIR default still resolves under ~/.culture/bots",
|
|
99
|
+
"status": "confirmed"
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"hard_questions": [],
|
|
103
|
+
"links": []
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "c7",
|
|
107
|
+
"kind": "success_signal",
|
|
108
|
+
"text": "pip install agentirc-cli==9.7.0 in a clean venv imports the bot framework; pytest covers filter DSL + template engine + manager lifecycle; culture's cutover PR replaces culture/bots/* with re-export shims and its test suite stays green",
|
|
109
|
+
"origin": "llm",
|
|
110
|
+
"status": "confirmed",
|
|
111
|
+
"honesty_conditions": [
|
|
112
|
+
{
|
|
113
|
+
"id": "h10",
|
|
114
|
+
"text": "a clean-venv install test imports agentirc.bots and the DSL/template/lifecycle tests run green in agentirc CI",
|
|
115
|
+
"status": "confirmed"
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"hard_questions": [],
|
|
119
|
+
"links": []
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "c8",
|
|
123
|
+
"kind": "requirement",
|
|
124
|
+
"text": "the real BotManager must satisfy the existing _internal/bots stub contract (__init__(server), async load_bots, load_system_bots, get_bot(nick), async on_event(event), async stop_all) because IRCd.start() already calls these methods",
|
|
125
|
+
"origin": "llm",
|
|
126
|
+
"status": "confirmed",
|
|
127
|
+
"honesty_conditions": [
|
|
128
|
+
{
|
|
129
|
+
"id": "h1",
|
|
130
|
+
"text": "an IRCd booted in-process with a BotManager installed loads a YAML bot, dispatches a matching Event to it, and the bot replies \u2014 exercised by a test",
|
|
131
|
+
"status": "confirmed"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"hard_questions": [],
|
|
135
|
+
"links": []
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "c9",
|
|
139
|
+
"kind": "requirement",
|
|
140
|
+
"text": "vendored via cite-don't-copy: each moved file gets a [tool.citation] entry (quote/paraphrase/synthesize) with source URL + sha256; culture.bots.* imports rewrite to agentirc.bots.*; bot.py's culture.constants.EVENT_TYPE_RE rewrites to agentirc._internal.constants",
|
|
141
|
+
"origin": "llm",
|
|
142
|
+
"status": "confirmed",
|
|
143
|
+
"honesty_conditions": [
|
|
144
|
+
{
|
|
145
|
+
"id": "h2",
|
|
146
|
+
"text": "cite check passes after the move and the new [tool.citation] entries resolve against real culture source SHAs",
|
|
147
|
+
"status": "confirmed"
|
|
148
|
+
}
|
|
149
|
+
],
|
|
150
|
+
"hard_questions": [],
|
|
151
|
+
"links": []
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "c10",
|
|
155
|
+
"kind": "requirement",
|
|
156
|
+
"text": "no imports back into culture: git grep '^(from|import) culture' over agentirc/ must stay empty after the move",
|
|
157
|
+
"origin": "llm",
|
|
158
|
+
"status": "confirmed",
|
|
159
|
+
"honesty_conditions": [
|
|
160
|
+
{
|
|
161
|
+
"id": "h3",
|
|
162
|
+
"text": "CI's git grep portability check returns nothing for 'from culture'/'import culture' across agentirc/ and tests/",
|
|
163
|
+
"status": "confirmed"
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"hard_questions": [],
|
|
167
|
+
"links": []
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"id": "c11",
|
|
171
|
+
"kind": "decision",
|
|
172
|
+
"text": "version bump is minor (9.7.0): the move is additive \u2014 a new public bot subsystem and CLI verbs, no breaking change to the five existing public modules",
|
|
173
|
+
"origin": "llm",
|
|
174
|
+
"status": "confirmed",
|
|
175
|
+
"honesty_conditions": [],
|
|
176
|
+
"hard_questions": [],
|
|
177
|
+
"links": []
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"id": "c12",
|
|
181
|
+
"kind": "decision",
|
|
182
|
+
"text": "Webhook: port http_listener.py too \u2014 add aiohttp + opentelemetry-instrumentation-aiohttp-server deps, reversing the 9.5.0 deferral; bots ship with full webhook-ingress parity",
|
|
183
|
+
"origin": "llm",
|
|
184
|
+
"status": "confirmed",
|
|
185
|
+
"honesty_conditions": [],
|
|
186
|
+
"hard_questions": [],
|
|
187
|
+
"links": []
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"id": "c13",
|
|
191
|
+
"kind": "decision",
|
|
192
|
+
"text": "Placement: agentirc/bots/ is a PUBLIC, semver-tracked subsystem (6th public surface); embedders import agentirc.bots.BotManager / Bot; _internal/bots stubs become re-export shims or are removed; public API table in CLAUDE.md + docs/api-stability.md gains an agentirc.bots row",
|
|
193
|
+
"origin": "llm",
|
|
194
|
+
"status": "confirmed",
|
|
195
|
+
"honesty_conditions": [],
|
|
196
|
+
"hard_questions": [],
|
|
197
|
+
"links": []
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"id": "c14",
|
|
201
|
+
"kind": "decision",
|
|
202
|
+
"text": "CLI: ship 'agentirc bot create/start/stop/list/inspect/archive/unarchive' verbs in 9.7.0, ported from culture/cli/bot.py, so culture bot can become a thin forward to agentirc.cli.dispatch",
|
|
203
|
+
"origin": "llm",
|
|
204
|
+
"status": "confirmed",
|
|
205
|
+
"honesty_conditions": [],
|
|
206
|
+
"hard_questions": [],
|
|
207
|
+
"links": []
|
|
208
|
+
}
|
|
209
|
+
],
|
|
210
|
+
"open_vagueness": []
|
|
211
|
+
}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "agentirc-9-7-0-ships-an-embedded-bot-framework-bot",
|
|
3
|
+
"title": "agentirc 9.7.0 ships an embedded bot framework: BotManager + Bot + filter DSL + template engine + YAML bot config live in agentirc/bots/, tested here, so culture can replace its in-tree culture/bots/* with thin forwards in a single cutover PR with no functionality gap",
|
|
4
|
+
"frame_slug": "agentirc-9-7-0-ships-an-embedded-bot-framework-bot",
|
|
5
|
+
"schema_version": 1,
|
|
6
|
+
"status": "exported",
|
|
7
|
+
"created": "2026-06-12T11:28:49Z",
|
|
8
|
+
"updated": "2026-06-12T11:32:38Z",
|
|
9
|
+
"targets": [
|
|
10
|
+
{
|
|
11
|
+
"id": "c1",
|
|
12
|
+
"kind": "announcement",
|
|
13
|
+
"text": "agentirc 9.7.0 ships an embedded bot framework: BotManager + Bot + filter DSL + template engine + YAML bot config live in agentirc/bots/, tested here, so culture can replace its in-tree culture/bots/* with thin forwards in a single cutover PR with no functionality gap"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "h4",
|
|
17
|
+
"kind": "honesty",
|
|
18
|
+
"text": "agentirc-cli 9.7.0 is published to PyPI with the bot framework importable, and culture's cutover PR replaces culture/bots/* with forwards while keeping its suite green"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "c2",
|
|
22
|
+
"kind": "audience",
|
|
23
|
+
"text": "culture (the immediate consumer wiring its IRCd to install BotManager + forwarding culture bot CLI verbs) and any standalone agentirc embedder wanting deterministic YAML chatops bots inside their IRCd"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "h5",
|
|
27
|
+
"kind": "honesty",
|
|
28
|
+
"text": "culture's cutover PR consumes the published agentirc API (installs BotManager + forwards CLI) without reimplementing bot logic"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "c3",
|
|
32
|
+
"kind": "before_state",
|
|
33
|
+
"text": "the bot framework lives only in culture/bots/* (~1340 lines incl config.py); agentirc ships only no-op BotManager/http_listener stubs in _internal/bots/; culture cannot slim its front door because deleting bots would lose functionality"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "h6",
|
|
37
|
+
"kind": "honesty",
|
|
38
|
+
"text": "the _internal/bots stubs and culture/bots/* line counts are verifiable in the two repos at cutover time"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "c4",
|
|
42
|
+
"kind": "after_state",
|
|
43
|
+
"text": "manager + Bot + filter_dsl + template_engine + config (YAML BotConfig) live in agentirc, are unit-tested here (filter DSL + template engine edge cases especially), and a documented public API lets an embedder install a BotManager onto a running IRCd and register YAML-spec'd bots"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "h7",
|
|
47
|
+
"kind": "honesty",
|
|
48
|
+
"text": "docs/api-stability.md documents the agentirc.bots install/register API with a worked example"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "c5",
|
|
52
|
+
"kind": "why_it_matters",
|
|
53
|
+
"text": "the bot brain is already bound to agentirc protocol types (filter DSL evaluates Event/EventType; bot host subclasses agentirc.virtual_client.VirtualClient) \u2014 bots have no coherent life without an IRCd, so the framework belongs here, not in culture or a third package"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "h8",
|
|
57
|
+
"kind": "honesty",
|
|
58
|
+
"text": "filter_dsl.evaluate runs against real agentirc Event objects in a test, and the bot host resolves agentirc.virtual_client.VirtualClient as its base"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "c6",
|
|
62
|
+
"kind": "boundary",
|
|
63
|
+
"text": "NOT in scope: porting culture's system bots (culture/bots/system/*), any LLM/agent-backend bot harness (forbidden by the dependency boundary), and renaming on-disk artifacts (BOTS_DIR stays ~/.culture/bots for culture continuity)"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "h9",
|
|
67
|
+
"kind": "honesty",
|
|
68
|
+
"text": "no file under culture/bots/system/ is vendored, no backend SDK is added to pyproject deps, and BOTS_DIR default still resolves under ~/.culture/bots"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "c7",
|
|
72
|
+
"kind": "success_signal",
|
|
73
|
+
"text": "pip install agentirc-cli==9.7.0 in a clean venv imports the bot framework; pytest covers filter DSL + template engine + manager lifecycle; culture's cutover PR replaces culture/bots/* with re-export shims and its test suite stays green"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "h10",
|
|
77
|
+
"kind": "honesty",
|
|
78
|
+
"text": "a clean-venv install test imports agentirc.bots and the DSL/template/lifecycle tests run green in agentirc CI"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "c8",
|
|
82
|
+
"kind": "requirement",
|
|
83
|
+
"text": "the real BotManager must satisfy the existing _internal/bots stub contract (__init__(server), async load_bots, load_system_bots, get_bot(nick), async on_event(event), async stop_all) because IRCd.start() already calls these methods"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "h1",
|
|
87
|
+
"kind": "honesty",
|
|
88
|
+
"text": "an IRCd booted in-process with a BotManager installed loads a YAML bot, dispatches a matching Event to it, and the bot replies \u2014 exercised by a test"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "c9",
|
|
92
|
+
"kind": "requirement",
|
|
93
|
+
"text": "vendored via cite-don't-copy: each moved file gets a [tool.citation] entry (quote/paraphrase/synthesize) with source URL + sha256; culture.bots.* imports rewrite to agentirc.bots.*; bot.py's culture.constants.EVENT_TYPE_RE rewrites to agentirc._internal.constants"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "h2",
|
|
97
|
+
"kind": "honesty",
|
|
98
|
+
"text": "cite check passes after the move and the new [tool.citation] entries resolve against real culture source SHAs"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "c10",
|
|
102
|
+
"kind": "requirement",
|
|
103
|
+
"text": "no imports back into culture: git grep '^(from|import) culture' over agentirc/ must stay empty after the move"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "h3",
|
|
107
|
+
"kind": "honesty",
|
|
108
|
+
"text": "CI's git grep portability check returns nothing for 'from culture'/'import culture' across agentirc/ and tests/"
|
|
109
|
+
}
|
|
110
|
+
],
|
|
111
|
+
"tasks": [
|
|
112
|
+
{
|
|
113
|
+
"id": "t1",
|
|
114
|
+
"summary": "Vendor template_engine.py -> agentirc/bots/template_engine.py (verbatim quote)",
|
|
115
|
+
"origin": "llm",
|
|
116
|
+
"status": "confirmed",
|
|
117
|
+
"acceptance_criteria": [
|
|
118
|
+
"render_template + render_fallback produce identical output to culture's template_engine across a case table incl. missing-key fallback and json-value rendering"
|
|
119
|
+
],
|
|
120
|
+
"deps": [],
|
|
121
|
+
"covers": [
|
|
122
|
+
"c4"
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"id": "t2",
|
|
127
|
+
"summary": "Vendor filter_dsl.py -> agentirc/bots/filter_dsl.py (verbatim quote)",
|
|
128
|
+
"origin": "llm",
|
|
129
|
+
"status": "confirmed",
|
|
130
|
+
"acceptance_criteria": [
|
|
131
|
+
"compile_filter parses every DSL operator; evaluate() returns correct bool against a constructed agentirc Event; malformed filter raises FilterParseError"
|
|
132
|
+
],
|
|
133
|
+
"deps": [],
|
|
134
|
+
"covers": [
|
|
135
|
+
"c5",
|
|
136
|
+
"h8"
|
|
137
|
+
]
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"id": "t3",
|
|
141
|
+
"summary": "Vendor config.py BotConfig + BOTS_DIR -> agentirc/bots/config.py (paraphrase)",
|
|
142
|
+
"origin": "llm",
|
|
143
|
+
"status": "confirmed",
|
|
144
|
+
"acceptance_criteria": [
|
|
145
|
+
"BotConfig loads a valid YAML bot spec; BOTS_DIR default resolves under ~/.culture/bots; malformed YAML rejected without partial state"
|
|
146
|
+
],
|
|
147
|
+
"deps": [],
|
|
148
|
+
"covers": [
|
|
149
|
+
"c4",
|
|
150
|
+
"h9"
|
|
151
|
+
]
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "t4",
|
|
155
|
+
"summary": "Vendor bot-host virtual_client subclass -> agentirc/bots/virtual_client.py (paraphrase)",
|
|
156
|
+
"origin": "llm",
|
|
157
|
+
"status": "confirmed",
|
|
158
|
+
"acceptance_criteria": [
|
|
159
|
+
"agentirc.bots.virtual_client.VirtualClient subclasses agentirc.virtual_client.VirtualClient with no behavioral override; instantiation registers presence in a channel"
|
|
160
|
+
],
|
|
161
|
+
"deps": [],
|
|
162
|
+
"covers": [
|
|
163
|
+
"c5",
|
|
164
|
+
"h8"
|
|
165
|
+
]
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"id": "t5",
|
|
169
|
+
"summary": "Packaging: pyproject deps (aiohttp + opentelemetry-instrumentation-aiohttp-server) + version 9.7.0 + all [tool.citation] entries + uv.lock + CHANGELOG",
|
|
170
|
+
"origin": "llm",
|
|
171
|
+
"status": "confirmed",
|
|
172
|
+
"acceptance_criteria": [
|
|
173
|
+
"pyproject declares both aiohttp deps; agentirc version reads 9.7.0; uv.lock regenerated+staged; [tool.citation] has quote/paraphrase entries for all 8 vendored bot files; no backend SDK added"
|
|
174
|
+
],
|
|
175
|
+
"deps": [],
|
|
176
|
+
"covers": [
|
|
177
|
+
"h4",
|
|
178
|
+
"c6",
|
|
179
|
+
"c9"
|
|
180
|
+
]
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"id": "t6",
|
|
184
|
+
"summary": "Vendor bot.py -> agentirc/bots/bot.py (paraphrase: import rewrites to agentirc.*)",
|
|
185
|
+
"origin": "llm",
|
|
186
|
+
"status": "confirmed",
|
|
187
|
+
"acceptance_criteria": [
|
|
188
|
+
"Bot loads from BotConfig, matches an Event via the filter DSL, renders a reply via the template engine; all imports resolve to agentirc.* with EVENT_TYPE_RE from agentirc._internal.constants; zero culture imports"
|
|
189
|
+
],
|
|
190
|
+
"deps": [
|
|
191
|
+
"t1",
|
|
192
|
+
"t2",
|
|
193
|
+
"t3",
|
|
194
|
+
"t4"
|
|
195
|
+
],
|
|
196
|
+
"covers": [
|
|
197
|
+
"c4",
|
|
198
|
+
"c5",
|
|
199
|
+
"c8",
|
|
200
|
+
"h8"
|
|
201
|
+
]
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"id": "t7",
|
|
205
|
+
"summary": "Vendor bot_manager.py -> agentirc/bots/bot_manager.py satisfying the _internal/bots stub contract",
|
|
206
|
+
"origin": "llm",
|
|
207
|
+
"status": "confirmed",
|
|
208
|
+
"acceptance_criteria": [
|
|
209
|
+
"BotManager matches the stub contract (__init__(server), async load_bots/on_event/stop_all, load_system_bots, get_bot); an in-process IRCd with BotManager installed loads a YAML bot, dispatches a matching Event, and the bot replies \u2014 proven by a test"
|
|
210
|
+
],
|
|
211
|
+
"deps": [
|
|
212
|
+
"t6"
|
|
213
|
+
],
|
|
214
|
+
"covers": [
|
|
215
|
+
"c2",
|
|
216
|
+
"c3",
|
|
217
|
+
"c8",
|
|
218
|
+
"h1"
|
|
219
|
+
]
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"id": "t8",
|
|
223
|
+
"summary": "Vendor http_listener.py -> agentirc/bots/http_listener.py (aiohttp webhook ingress)",
|
|
224
|
+
"origin": "llm",
|
|
225
|
+
"status": "confirmed",
|
|
226
|
+
"acceptance_criteria": [
|
|
227
|
+
"http_listener binds an aiohttp webhook endpoint that dispatches an inbound webhook to a registered bot; a test posts a webhook and asserts the bot fired; otel aiohttp instrumentation wired"
|
|
228
|
+
],
|
|
229
|
+
"deps": [
|
|
230
|
+
"t7"
|
|
231
|
+
],
|
|
232
|
+
"covers": [
|
|
233
|
+
"c4"
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"id": "t9",
|
|
238
|
+
"summary": "Public surface: agentirc/bots/__init__.py exports + convert _internal/bots stubs to deprecation re-export shims",
|
|
239
|
+
"origin": "llm",
|
|
240
|
+
"status": "confirmed",
|
|
241
|
+
"acceptance_criteria": [
|
|
242
|
+
"from agentirc.bots import BotManager, Bot works in a clean session; _internal/bots stubs re-export from agentirc.bots and emit DeprecationWarning"
|
|
243
|
+
],
|
|
244
|
+
"deps": [
|
|
245
|
+
"t7"
|
|
246
|
+
],
|
|
247
|
+
"covers": [
|
|
248
|
+
"c4",
|
|
249
|
+
"h5"
|
|
250
|
+
]
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"id": "t10",
|
|
254
|
+
"summary": "Port culture/cli/bot.py -> agentirc bot CLI verbs wired into agentirc.cli.dispatch",
|
|
255
|
+
"origin": "llm",
|
|
256
|
+
"status": "confirmed",
|
|
257
|
+
"acceptance_criteria": [
|
|
258
|
+
"agentirc bot create/start/stop/list/inspect/archive/unarchive dispatch through agentirc.cli; agentirc bot list runs; flags match culture/cli/bot.py so culture bot can forward"
|
|
259
|
+
],
|
|
260
|
+
"deps": [
|
|
261
|
+
"t7",
|
|
262
|
+
"t9"
|
|
263
|
+
],
|
|
264
|
+
"covers": [
|
|
265
|
+
"c2",
|
|
266
|
+
"h5"
|
|
267
|
+
]
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"id": "t11",
|
|
271
|
+
"summary": "Docs: agentirc.bots in docs/api-stability.md (worked example) + CLAUDE.md public API table row",
|
|
272
|
+
"origin": "llm",
|
|
273
|
+
"status": "confirmed",
|
|
274
|
+
"acceptance_criteria": [
|
|
275
|
+
"docs/api-stability.md gains an agentirc.bots row + worked example installing BotManager onto a running IRCd and registering a YAML bot; CLAUDE.md public API table lists agentirc.bots"
|
|
276
|
+
],
|
|
277
|
+
"deps": [
|
|
278
|
+
"t9"
|
|
279
|
+
],
|
|
280
|
+
"covers": [
|
|
281
|
+
"c4",
|
|
282
|
+
"h7"
|
|
283
|
+
]
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"id": "t12",
|
|
287
|
+
"summary": "Integration gate: cite check + full suite + clean-venv import + portability grep",
|
|
288
|
+
"origin": "llm",
|
|
289
|
+
"status": "confirmed",
|
|
290
|
+
"acceptance_criteria": [
|
|
291
|
+
"cite check passes (entries resolve to real culture SHAs); pytest -n auto green; clean-venv install of built wheel imports agentirc.bots; CI grep finds no 'from culture'/'import culture' in agentirc/+tests/; no culture/bots/system/ file vendored"
|
|
292
|
+
],
|
|
293
|
+
"deps": [
|
|
294
|
+
"t5",
|
|
295
|
+
"t6",
|
|
296
|
+
"t7",
|
|
297
|
+
"t8",
|
|
298
|
+
"t9",
|
|
299
|
+
"t10",
|
|
300
|
+
"t11"
|
|
301
|
+
],
|
|
302
|
+
"covers": [
|
|
303
|
+
"c1",
|
|
304
|
+
"c3",
|
|
305
|
+
"c6",
|
|
306
|
+
"c7",
|
|
307
|
+
"c9",
|
|
308
|
+
"c10",
|
|
309
|
+
"h2",
|
|
310
|
+
"h3",
|
|
311
|
+
"h6",
|
|
312
|
+
"h9",
|
|
313
|
+
"h10"
|
|
314
|
+
]
|
|
315
|
+
}
|
|
316
|
+
],
|
|
317
|
+
"risks": []
|
|
318
|
+
}
|
|
@@ -4,6 +4,38 @@ 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
|
+
## [9.7.0] - 2026-06-12
|
|
8
|
+
|
|
9
|
+
Absorb culture's bot framework into the public `agentirc.bots` subsystem. Closes
|
|
10
|
+
[#33](https://github.com/agentculture/agentirc/issues/33).
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`agentirc.bots` public subsystem** — embeds culture's bot framework directly
|
|
15
|
+
into agentirc as a semver-tracked public API. Eight modules vendored from
|
|
16
|
+
`culture@df50942` via the cite-don't-copy pattern:
|
|
17
|
+
- `agentirc.bots.template_engine` — Jinja2-style template engine for bot
|
|
18
|
+
response rendering (quote from `culture/bots/template_engine.py`).
|
|
19
|
+
- `agentirc.bots.filter_dsl` — filter DSL for routing bot event subscriptions
|
|
20
|
+
(quote from `culture/bots/filter_dsl.py`).
|
|
21
|
+
- `agentirc.bots.config` — bot YAML configuration dataclasses (paraphrase of
|
|
22
|
+
`culture/bots/config.py` with import rewrites).
|
|
23
|
+
- `agentirc.bots.virtual_client` — in-process IRC client for bots to speak
|
|
24
|
+
into a hosted IRCd (paraphrase of `culture/bots/virtual_client.py`).
|
|
25
|
+
- `agentirc.bots.bot` — base `Bot` class with lifecycle hooks and event
|
|
26
|
+
dispatch (paraphrase of `culture/bots/bot.py`).
|
|
27
|
+
- `agentirc.bots.bot_manager` — `BotManager` that owns the bot lifecycle and
|
|
28
|
+
wires bots to the IRCd's event subscription stream (paraphrase of
|
|
29
|
+
`culture/bots/bot_manager.py`).
|
|
30
|
+
- `agentirc.bots.http_listener` — `HttpListener` webhook receiver that
|
|
31
|
+
converts HTTP POST payloads into IRC events (paraphrase of
|
|
32
|
+
`culture/bots/http_listener.py`; requires `aiohttp`).
|
|
33
|
+
- `agentirc.bots.cli` — `bot` subcommand for the `agentirc` CLI (paraphrase
|
|
34
|
+
of `culture/cli/bot.py`).
|
|
35
|
+
- **New runtime dependencies**: `aiohttp>=3.9` (HTTP webhook listener) and
|
|
36
|
+
`opentelemetry-instrumentation-aiohttp-server>=0.43b0` (OTEL tracing for the
|
|
37
|
+
webhook server), consistent with the existing `>=1.22` otel pins.
|
|
38
|
+
|
|
7
39
|
## [9.6.2] - 2026-06-10
|
|
8
40
|
|
|
9
41
|
Resync the vendored steward skills. Closes
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
4
|
|
|
5
|
-
## Current state: bootstrap closed; bot
|
|
5
|
+
## Current state: bootstrap closed; bot framework absorption shipped (9.7.0 released)
|
|
6
6
|
|
|
7
|
-
This repo is the agentirc server-core extraction out of the sibling project [`culture`](https://github.com/agentculture/culture). The bootstrap is closed; 9.0.0 through 9.
|
|
7
|
+
This repo is the agentirc server-core extraction out of the sibling project [`culture`](https://github.com/agentculture/culture). The bootstrap is closed; 9.0.0 through 9.7.0 are live on PyPI. The most recent ship is the bot framework absorption (9.7.0, closed [#33](https://github.com/agentculture/agentirc/issues/33)) — promoting `agentirc.bots` (BotManager, Bot, BotConfig) to public, semver-tracked status so culture and other embedders can register deterministic, YAML-spec'd event-trigger bots against a running `IRCd` in-process. The previous ship was the in-process embedding API (9.6.0, closed [#22](https://github.com/agentculture/agentirc/issues/22)). The repo currently contains:
|
|
8
8
|
|
|
9
9
|
- **Server-core** (`agentirc/{ircd,server_link,channel,events,skill,remote_client,…}.py`, `agentirc/skills/{rooms,threads,history,icon}.py`) — vendored from `culture@df50942` via the `cite-don't-copy` pattern (see `[tool.citation]` in `pyproject.toml`).
|
|
10
10
|
- **Client transport** (`agentirc/client.py`) — vendored from `culture/agentirc/client.py` in PR-B2.
|
|
@@ -14,7 +14,8 @@ This repo is the agentirc server-core extraction out of the sibling project [`cu
|
|
|
14
14
|
- **Bot extension API (9.5.0)** — IRCv3 `agentirc.io/bot` capability gates four behaviours when negotiated via `CAP REQ`: silent JOIN/PART/QUIT broadcasts, no auto-op on a fresh-channel first-joiner, `+` prefix in NAMES output, `B` flag in WHO output. `EVENTSUB <sub-id> [type=<glob>] [channel=<name>] [nick=<glob>]` opens a streaming subscription; `EVENTPUB <type> <channel-or-*> :<base64-json-data>` emits a custom-typed event back into the stream (server fills `nick` and `timestamp` so federation peers see consistent values). Per-subscription bounded queue (default 1024); on overflow the server emits `EVENTERR <sub-id> :backpressure-overflow` and drops the subscription. Quick reference at [`docs/extension-api.md`](docs/extension-api.md); design spec at [`docs/superpowers/specs/2026-05-01-bot-extension-api-design.md`](docs/superpowers/specs/2026-05-01-bot-extension-api-design.md).
|
|
15
15
|
- **Test suite** — 36 tests vendored from `culture@df50942` (~6.5kloc) plus agentirc-native tests in `tests/test_config_loader.py` and `tests/test_wire_format_envelope.py` (the 9.5.0a2 golden-file lock-in). `pytest -n auto` in ~30s on default workers. Three telemetry tests (`test_bot_event_dispatch_span`, `test_bot_run_span`, `test_metrics_bots`) and `test_welcome_bot` stay in culture because they depend on the real `BotManager`.
|
|
16
16
|
- **In-process embedding API (9.6.0)** — `agentirc.ircd.IRCd` and `agentirc.virtual_client.VirtualClient` promoted to the public surface. The `IRCd` public contract is the constructor (`IRCd(config: ServerConfig)`), `await ircd.start()`/`stop()`, `await ircd.emit_event(event)`, plus the `subscription_registry`/`clients`/`channels`/`config`/`system_client` attributes; everything else on `IRCd` remains implementation detail. `VirtualClient` moved from `agentirc/_internal/virtual_client.py` to `agentirc/virtual_client.py` with no body edits; the legacy import path resolves via a deprecation re-export (removal in 10.0.0). Worked example + member breakdown live in [`docs/api-stability.md`](docs/api-stability.md#embedding-agentirc-in-process). Same wire surface as 9.5.0; no protocol changes.
|
|
17
|
-
- **
|
|
17
|
+
- **Bot framework absorption (9.7.0)** — `agentirc.bots` promoted to public surface with `BotManager`, `Bot`, and `BotConfig` as semver-tracked exports. Deterministic, YAML-spec'd event-trigger bots load from `~/.culture/bots/`, register against a running `IRCd` in-process, match events via compiled filter expressions, and respond by sending messages or emitting custom-typed events. Paraphrased from `culture.bots.*` with import paths rewritten; `http_listener` is real aiohttp-backed; system-bot discovery imports culture's module lazily at runtime. Full API reference and worked example live in [`docs/api-stability.md`](docs/api-stability.md#embedding-bots-agentircbots).
|
|
18
|
+
- **Internal support** (`agentirc/_internal/`) — `aio`, `constants`, `protocol/`, `telemetry/`, `pidfile`, `cli_shared/`, `bots/` stubs (backward compat, removal in 10.0.0), `event_subscriptions/` (added 9.5.0). The `_internal/virtual_client.py` module remains as a deprecation re-export of the now-public `agentirc.virtual_client.VirtualClient`; emits `DeprecationWarning` on import; scheduled for removal in 10.0.0.
|
|
18
19
|
- **Bootstrap docs** (PR-B4, 9.4.0) — `docs/api-stability.md` (3 public modules + semver contract), `docs/cli.md` (verb table, flag reference, exit codes, YAML/CLI precedence, agentirc-vs-culture diff table), `docs/deployment.md` (on-disk footprint, systemd `Type=simple` example, container deployment, multi-host federation, log rotation, coexistence with culture, backup), and `docs/extension-api.md` (bot-author quick reference, added 9.5.0). Public-facing `README.md` rewritten for issue [#19](https://github.com/agentculture/agentirc/issues/19).
|
|
19
20
|
|
|
20
21
|
End-to-end verified: `agentirc start --port <p>` boots a real IRCd, TCP NICK/USER handshake returns `001 RPL_WELCOME`, `agentirc stop` shuts cleanly. `agentirc serve --config server.yaml --port 9999` correctly overlays CLI flag on YAML. `pip install agentirc-cli==9.5.0` from real PyPI in a clean venv produces both `agentirc` and `agentirc-cli` binaries; both reach the same `agentirc.cli:main` entry point. Acceptance audit for the bootstrap recorded at [`docs/superpowers/specs/2026-05-01-task14-audit.md`](docs/superpowers/specs/2026-05-01-task14-audit.md). Culture-side cutover unblocked via [agentculture/culture#308](https://github.com/agentculture/culture/issues/308).
|
|
@@ -47,8 +48,9 @@ There are three different names in play. Don't conflate them:
|
|
|
47
48
|
|
|
48
49
|
- **Server-core (here):** `ircd.py`, `server_link.py`, `channel.py`, `config.py`, `events.py`, the stores (`room_store`, `thread_store`, `history_store`), `rooms_util.py`, `skill.py`, `remote_client.py`, and the `skills/` directory (`rooms`, `threads`, `history`, `icon`).
|
|
49
50
|
- **Client transport (here, since 9.2.0):** `client.py` — vendored in PR-B2. Pre-9.2 the bootstrap spec said "stays in culture"; that assumption broke down once we found `client.py` only imports already-vendored modules and that the IRCd needs it at runtime to accept TCP clients.
|
|
50
|
-
- **
|
|
51
|
-
- **
|
|
51
|
+
- **Bot framework (here, since 9.7.0):** `agentirc/bots/{bot_manager.py, bot.py, config.py, template_engine.py, filter_dsl.py, http_listener.py, virtual_client.py}` and `agentirc/bots/system.py` (system bot discovery, culture-supplied at runtime). Public surface: `BotManager`, `Bot`, `BotConfig`. Paraphrased from `culture.bots.*` with import paths rewritten; the `http_listener` is real aiohttp-backed, and system-bot discovery imports culture's module lazily at runtime.
|
|
52
|
+
- **Internal support (here):** `agentirc/_internal/{aio, constants, protocol/, telemetry/, virtual_client, pidfile, cli_shared/}` plus `_internal/bots/` stubs for backward compat (scheduled for removal in 10.0.0).
|
|
53
|
+
- **Stays in culture:** `culture.config` / `culture.bots.config` (agent-manifest concerns beyond agentirc's scope), `culture.cli.shared.{ipc,display,formatting,process}` (CLI ergonomics agentirc doesn't need), `culture.credentials` / `culture.mesh_config` (OS-keyring + mesh.yaml).
|
|
52
54
|
|
|
53
55
|
When migrating tests, the rule is: pure server tests come here, transport tests **also** come here now that we own `client.py`, mixed tests stay in culture and get rewritten to drive `agentirc serve` as a subprocess fixture rather than importing `IRCd` directly. When unsure, **prefer copying the test here** — this repo owns the IRCd and the client transport.
|
|
54
56
|
|
|
@@ -61,7 +63,7 @@ When migrating tests, the rule is: pure server tests come here, transport tests
|
|
|
61
63
|
|
|
62
64
|
## Public API contract (semver-tracked)
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
Six modules are public. Everything else is internal and may be refactored without a major bump.
|
|
65
67
|
|
|
66
68
|
| Module | Members | Since |
|
|
67
69
|
|---|---|---|
|
|
@@ -70,6 +72,7 @@ Five modules are public. Everything else is internal and may be refactored witho
|
|
|
70
72
|
| `agentirc.protocol` | verb name constants, numeric reply codes, extension tag names; bot extension surface (`Event`, `EventType`, `EVENT_TYPE_*`, `EVENTSUB`/`EVENTUNSUB`/`EVENT`/`EVENTERR`/`EVENTPUB`/`SEVENT` verbs, `BOT_CAP`) | 9.2.0 (extended 9.5.0) |
|
|
71
73
|
| `agentirc.ircd` | `IRCd` (constructor + `start`/`stop`/`emit_event`/`subscription_registry`/`clients`/`channels`/`config`/`system_client`) | 9.6.0 |
|
|
72
74
|
| `agentirc.virtual_client` | `VirtualClient` | 9.6.0 |
|
|
75
|
+
| `agentirc.bots` | `BotManager`, `Bot`, `BotConfig` | 9.7.0 |
|
|
73
76
|
|
|
74
77
|
`agentirc.cli.dispatch(argv)` is the function `culture`'s `culture server` shim calls — it must accept the exact same flag set, exit codes, and stderr formatting that `culture server` produces today. Do not "improve" CLI ergonomics during the bootstrap; that breaks the transparency contract culture relies on. `dispatch()` returns `int` on successful command dispatch and lets argparse's `SystemExit` propagate on `--help`/`--version`/parse-errors per Python convention; in-process callers (i.e. culture's shim) must catch `SystemExit` themselves or use `subprocess`.
|
|
75
78
|
|