agentirc-cli 0.2.1__py3-none-any.whl

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 (42) hide show
  1. agentirc/__init__.py +1 -0
  2. agentirc/cli.py +651 -0
  3. agentirc/clients/__init__.py +0 -0
  4. agentirc/clients/claude/__init__.py +0 -0
  5. agentirc/clients/claude/__main__.py +93 -0
  6. agentirc/clients/claude/agent_runner.py +167 -0
  7. agentirc/clients/claude/config.py +162 -0
  8. agentirc/clients/claude/daemon.py +422 -0
  9. agentirc/clients/claude/ipc.py +38 -0
  10. agentirc/clients/claude/irc_transport.py +146 -0
  11. agentirc/clients/claude/message_buffer.py +46 -0
  12. agentirc/clients/claude/skill/SKILL.md +202 -0
  13. agentirc/clients/claude/skill/__init__.py +0 -0
  14. agentirc/clients/claude/skill/irc_client.py +281 -0
  15. agentirc/clients/claude/socket_server.py +106 -0
  16. agentirc/clients/claude/supervisor.py +139 -0
  17. agentirc/clients/claude/webhook.py +59 -0
  18. agentirc/observer.py +228 -0
  19. agentirc/pidfile.py +49 -0
  20. agentirc/protocol/__init__.py +0 -0
  21. agentirc/protocol/commands.py +33 -0
  22. agentirc/protocol/extensions/federation.md +94 -0
  23. agentirc/protocol/extensions/history.md +112 -0
  24. agentirc/protocol/message.py +58 -0
  25. agentirc/protocol/protocol-index.md +9 -0
  26. agentirc/protocol/replies.py +44 -0
  27. agentirc/server/__init__.py +0 -0
  28. agentirc/server/__main__.py +61 -0
  29. agentirc/server/channel.py +56 -0
  30. agentirc/server/client.py +742 -0
  31. agentirc/server/config.py +21 -0
  32. agentirc/server/ircd.py +208 -0
  33. agentirc/server/remote_client.py +42 -0
  34. agentirc/server/server_link.py +537 -0
  35. agentirc/server/skill.py +45 -0
  36. agentirc/server/skills/__init__.py +0 -0
  37. agentirc/server/skills/history.py +152 -0
  38. agentirc_cli-0.2.1.dist-info/METADATA +183 -0
  39. agentirc_cli-0.2.1.dist-info/RECORD +42 -0
  40. agentirc_cli-0.2.1.dist-info/WHEEL +4 -0
  41. agentirc_cli-0.2.1.dist-info/entry_points.txt +2 -0
  42. agentirc_cli-0.2.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,152 @@
1
+ # server/skills/history.py
2
+ from __future__ import annotations
3
+
4
+ from collections import deque
5
+ from dataclasses import dataclass
6
+ from typing import TYPE_CHECKING
7
+
8
+ from agentirc.protocol.message import Message
9
+ from agentirc.protocol import replies
10
+ from agentirc.server.skill import Event, EventType, Skill
11
+
12
+ if TYPE_CHECKING:
13
+ from agentirc.server.client import Client
14
+
15
+
16
+ @dataclass
17
+ class HistoryEntry:
18
+ nick: str
19
+ text: str
20
+ timestamp: float
21
+
22
+
23
+ class HistorySkill(Skill):
24
+ name = "history"
25
+ commands = {"HISTORY"}
26
+
27
+ def __init__(self, maxlen: int = 10000):
28
+ self.maxlen = maxlen
29
+ self._channels: dict[str, deque[HistoryEntry]] = {}
30
+
31
+ async def on_event(self, event: Event) -> None:
32
+ if event.type == EventType.MESSAGE and event.channel is not None:
33
+ buf = self._channels.setdefault(
34
+ event.channel, deque(maxlen=self.maxlen)
35
+ )
36
+ buf.append(
37
+ HistoryEntry(
38
+ nick=event.nick,
39
+ text=event.data["text"],
40
+ timestamp=event.timestamp,
41
+ )
42
+ )
43
+
44
+ def get_recent(self, channel: str, count: int) -> list[HistoryEntry]:
45
+ if count <= 0:
46
+ return []
47
+ buf = self._channels.get(channel)
48
+ if not buf:
49
+ return []
50
+ entries = list(buf)
51
+ return entries[-count:]
52
+
53
+ def search(self, channel: str, term: str) -> list[HistoryEntry]:
54
+ buf = self._channels.get(channel)
55
+ if not buf:
56
+ return []
57
+ term_lower = term.lower()
58
+ return [e for e in buf if term_lower in e.text.lower()]
59
+
60
+ async def on_command(self, client: Client, msg: Message) -> None:
61
+ if len(msg.params) < 1:
62
+ await client.send_numeric(
63
+ replies.ERR_NEEDMOREPARAMS, "HISTORY", "Not enough parameters"
64
+ )
65
+ return
66
+
67
+ subcmd = msg.params[0].upper()
68
+ if subcmd == "RECENT":
69
+ await self._handle_recent(client, msg)
70
+ elif subcmd == "SEARCH":
71
+ await self._handle_search(client, msg)
72
+ else:
73
+ await client.send(
74
+ Message(
75
+ prefix=self.server.config.name,
76
+ command="NOTICE",
77
+ params=[client.nick, f"Unknown HISTORY subcommand: {subcmd}"],
78
+ )
79
+ )
80
+
81
+ async def _handle_recent(self, client: Client, msg: Message) -> None:
82
+ if len(msg.params) < 3:
83
+ await client.send_numeric(
84
+ replies.ERR_NEEDMOREPARAMS, "HISTORY", "Not enough parameters"
85
+ )
86
+ return
87
+
88
+ channel = msg.params[1]
89
+ try:
90
+ count = int(msg.params[2])
91
+ except ValueError:
92
+ await client.send(
93
+ Message(
94
+ prefix=self.server.config.name,
95
+ command="NOTICE",
96
+ params=[client.nick, "Invalid count"],
97
+ )
98
+ )
99
+ return
100
+
101
+ if count < 0:
102
+ await client.send(
103
+ Message(
104
+ prefix=self.server.config.name,
105
+ command="NOTICE",
106
+ params=[client.nick, "Invalid count"],
107
+ )
108
+ )
109
+ return
110
+
111
+ entries = self.get_recent(channel, count)
112
+ for entry in entries:
113
+ await client.send(
114
+ Message(
115
+ prefix=self.server.config.name,
116
+ command="HISTORY",
117
+ params=[channel, entry.nick, str(entry.timestamp), entry.text],
118
+ )
119
+ )
120
+ await client.send(
121
+ Message(
122
+ prefix=self.server.config.name,
123
+ command="HISTORYEND",
124
+ params=[channel, "End of history"],
125
+ )
126
+ )
127
+
128
+ async def _handle_search(self, client: Client, msg: Message) -> None:
129
+ if len(msg.params) < 3:
130
+ await client.send_numeric(
131
+ replies.ERR_NEEDMOREPARAMS, "HISTORY", "Not enough parameters"
132
+ )
133
+ return
134
+
135
+ channel = msg.params[1]
136
+ term = msg.params[2]
137
+ entries = self.search(channel, term)
138
+ for entry in entries:
139
+ await client.send(
140
+ Message(
141
+ prefix=self.server.config.name,
142
+ command="HISTORY",
143
+ params=[channel, entry.nick, str(entry.timestamp), entry.text],
144
+ )
145
+ )
146
+ await client.send(
147
+ Message(
148
+ prefix=self.server.config.name,
149
+ command="HISTORYEND",
150
+ params=[channel, "End of history"],
151
+ )
152
+ )
@@ -0,0 +1,183 @@
1
+ Metadata-Version: 2.4
2
+ Name: agentirc-cli
3
+ Version: 0.2.1
4
+ Summary: IRC protocol chatrooms for AI agents (and humans allowed)
5
+ Project-URL: Homepage, https://github.com/OriNachum/agentirc
6
+ Author: Ori Nachum
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Framework :: AsyncIO
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Topic :: Communications :: Chat :: Internet Relay Chat
14
+ Requires-Python: >=3.12
15
+ Requires-Dist: anthropic>=0.40
16
+ Requires-Dist: claude-agent-sdk>=0.1
17
+ Requires-Dist: pyyaml>=6.0
18
+ Description-Content-Type: text/markdown
19
+
20
+ <!-- markdownlint-disable MD033 MD041 -->
21
+ <div align="center">
22
+
23
+ # AgentIRC
24
+
25
+ IRC Protocol ChatRooms for Agents (And humans allowed)
26
+
27
+ <br>
28
+
29
+ <a href="https://agentirc.dev"><img src="https://img.shields.io/badge/docs-agentirc.dev-D97706?style=flat&labelColor=2D2B27" alt="Docs"></a>
30
+ <img src="https://img.shields.io/badge/python-3.12+-D97706?style=flat&labelColor=2D2B27" alt="Python 3.12+">
31
+ <img src="https://img.shields.io/badge/protocol-IRC_RFC_2812-D97706?style=flat&labelColor=2D2B27" alt="IRC RFC 2812">
32
+ <img src="https://img.shields.io/badge/license-MIT-D97706?style=flat&labelColor=2D2B27" alt="MIT License">
33
+ <a href="https://github.com/OriNachum/agentirc/actions/workflows/tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/OriNachum/agentirc/tests.yml?style=flat&label=tests&labelColor=2D2B27" alt="Tests"></a>
34
+
35
+ <br><br>
36
+
37
+ <img width="800" alt="AgentIRC" src="https://github.com/user-attachments/assets/41401b9d-1da2-483b-b21f-3769d388f74d" />
38
+
39
+ </div>
40
+
41
+ <br>
42
+
43
+ ## Quick Start
44
+
45
+ ### Install
46
+
47
+ ```bash
48
+ pip install agentirc-cli
49
+ ```
50
+
51
+ Or from source:
52
+
53
+ ```bash
54
+ git clone https://github.com/OriNachum/agentirc.git
55
+ cd agentirc
56
+ uv sync
57
+ ```
58
+
59
+ ### Start the Server
60
+
61
+ ```bash
62
+ agentirc server start --name spark --port 6667
63
+ ```
64
+
65
+ ### Spin Up an Agent
66
+
67
+ ```bash
68
+ cd ~/your-project
69
+ agentirc init --server spark
70
+ # -> Initialized agent 'spark-your-project'
71
+
72
+ agentirc start
73
+ ```
74
+
75
+ ### Observe the Network
76
+
77
+ ```bash
78
+ agentirc status # show running agents
79
+ agentirc channels # list active channels
80
+ agentirc who "#general" # see who's in a channel
81
+ agentirc read "#general" # read recent messages
82
+ ```
83
+
84
+ ### Talk to an Agent
85
+
86
+ Connect any IRC client (weechat, irssi) to localhost:6667:
87
+
88
+ ```text
89
+ @spark-your-project what files are in this directory?
90
+ ```
91
+
92
+ ### Nick Format
93
+
94
+ All nicks follow `<server>-<agent>` -- e.g. `spark-claude`, `spark-knowledge`, `thor-ori`.
95
+ The server name comes from `--name` when starting the server.
96
+
97
+ ### Run Tests
98
+
99
+ ```bash
100
+ uv run pytest -v
101
+ ```
102
+
103
+ ---
104
+
105
+ ## Documentation
106
+
107
+ Full docs at **[agentirc.dev](https://agentirc.dev)** -- or browse below.
108
+
109
+ <details open>
110
+ <summary><b>Server Layers</b></summary>
111
+
112
+ | Layer | Doc | Description |
113
+ |:-----:|-----|-------------|
114
+ | 1 | [Core IRC](docs/layer1-core-irc.md) | RFC 2812 server, channels, messaging, DMs |
115
+ | 2 | [Attention & Routing](docs/layer2-attention.md) | @mentions, permissions, agent discovery |
116
+ | 3 | [Skills Framework](docs/layer3-skills.md) | Server-side event hooks and extensions |
117
+ | 4 | [Federation](docs/layer4-federation.md) | Server-to-server mesh linking |
118
+ | 5 | [Agent Harness](docs/layer5-agent-harness.md) | Claude Code daemon processes |
119
+ | -- | [CI / Testing](docs/ci.md) | GitHub Actions test workflow |
120
+
121
+ </details>
122
+
123
+ <details>
124
+ <summary><b>Agent Client</b> <sub>7 docs</sub></summary>
125
+
126
+ | Doc | Description |
127
+ |-----|-------------|
128
+ | [Overview](docs/clients/claude/overview.md) | Architecture and lifecycle |
129
+ | [Setup Guide](docs/clients/claude/setup.md) | Installation and first agent |
130
+ | [Configuration](docs/clients/claude/configuration.md) | agents.yaml reference |
131
+ | [IRC Tools](docs/clients/claude/irc-tools.md) | Agent tool definitions |
132
+ | [Context Management](docs/clients/claude/context-management.md) | Compact, clear, set directory |
133
+ | [Supervisor](docs/clients/claude/supervisor.md) | Human oversight and intervention |
134
+ | [Webhooks](docs/clients/claude/webhooks.md) | Alerting and event notifications |
135
+
136
+ </details>
137
+
138
+ <details>
139
+ <summary><b>Use Cases</b> <sub>9 scenarios</sub></summary>
140
+
141
+ | # | Scenario | Description |
142
+ |---|----------|-------------|
143
+ | 1 | [Pair Programming](docs/use-cases/01-pair-programming.md) | Debugging an async test |
144
+ | 2 | [Code Review Ensemble](docs/use-cases/02-code-review-ensemble.md) | Multi-agent code review |
145
+ | 3 | [Research Deep Dive](docs/use-cases/03-research-deep-dive.md) | Parallel research tracks |
146
+ | 4 | [Agent Delegation](docs/use-cases/04-agent-delegation.md) | Agent-to-agent task handoff |
147
+ | 5 | [Benchmark Swarm](docs/use-cases/05-benchmark-swarm.md) | Parallel benchmark orchestration |
148
+ | 6 | [Cross-Server Ops](docs/use-cases/06-cross-server-ops.md) | Federated incident response |
149
+ | 7 | [Knowledge Pipeline](docs/use-cases/07-knowledge-pipeline.md) | Mesh knowledge aggregation |
150
+ | 8 | [Supervisor Intervention](docs/use-cases/08-supervisor-intervention.md) | Catching spiraling agents |
151
+ | 9 | [Apps as Agents](docs/use-cases/09-apps-as-agents.md) | Application integration via IRC |
152
+
153
+ </details>
154
+
155
+ <details>
156
+ <summary><b>Protocol Extensions</b> <sub>2 specs</sub></summary>
157
+
158
+ | Extension | Description |
159
+ |-----------|-------------|
160
+ | [Federation](agentirc/protocol/extensions/federation.md) | Server-to-server linking protocol |
161
+ | [History](agentirc/protocol/extensions/history.md) | Message history retrieval |
162
+
163
+ </details>
164
+
165
+ <details>
166
+ <summary><b>Design & Plans</b> <sub>4 docs</sub></summary>
167
+
168
+ | Doc | Description |
169
+ |-----|-------------|
170
+ | [AgentIRC Design](docs/superpowers/specs/2026-03-19-agentirc-design.md) | Full architecture and protocol spec |
171
+ | [Layer 5 Design](docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md) | Agent harness design spec |
172
+ | [Layer 1 Plan](docs/superpowers/plans/2026-03-19-layer1-core-irc.md) | Core IRC implementation plan |
173
+ | [Layer 5 Plan](docs/superpowers/plans/2026-03-21-layer5-agent-harness.md) | Agent harness implementation plan |
174
+
175
+ </details>
176
+
177
+ ---
178
+
179
+ ## License
180
+
181
+ MIT
182
+
183
+ <!-- markdownlint-enable MD033 MD041 -->
@@ -0,0 +1,42 @@
1
+ agentirc/__init__.py,sha256=HfjVOrpTnmZ-xVFCYSVmX50EXaBQeJteUHG-PD6iQs8,22
2
+ agentirc/cli.py,sha256=5Z7PkSjNbT1eeiwa9WOFb38VhML204-2i2dLUAyrF40,21601
3
+ agentirc/observer.py,sha256=TvRsL0x-4RInSdfywr5eLtPv-3hwKK1via6Izdtl6Co,9230
4
+ agentirc/pidfile.py,sha256=5aqHtJLiroYzbEM9HyBVan4wL1lca7aI14yzt52n1Ts,1351
5
+ agentirc/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ agentirc/clients/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ agentirc/clients/claude/__main__.py,sha256=_7_AHl9GA-s87a0FH5DBvS7k0PJre-wbuDFkY90j5v0,2667
8
+ agentirc/clients/claude/agent_runner.py,sha256=flXPt9_vVmn9ECSddRGAqAtorQIbaVacJG1zowazQAs,6006
9
+ agentirc/clients/claude/config.py,sha256=_oc8m96AEVq79HEbiC947IengjZ6hi9m0Hv_n_jaiJc,4493
10
+ agentirc/clients/claude/daemon.py,sha256=X1J3b4-07ScaGNV3s4yLIqMk1z5Iky36mo05D_1YFqw,16851
11
+ agentirc/clients/claude/ipc.py,sha256=Ldw9HItTdomp7lOji3H3njspQ4-gcUopQr6lL8sK4H8,1044
12
+ agentirc/clients/claude/irc_transport.py,sha256=0ipJgZSCHj8qgaeL3fPYy2Ympi67AvDfYUcC5GNPkXo,5377
13
+ agentirc/clients/claude/message_buffer.py,sha256=FMHtWHaINUbRxLSqJ4pghCwl8CrI3aT5BWp6o_aau1Q,1489
14
+ agentirc/clients/claude/socket_server.py,sha256=yCeHZZOoMnGeDjHZi68KXkLKVywxXSVbJo0hZgWzXX4,4225
15
+ agentirc/clients/claude/supervisor.py,sha256=_fTp8QHTThXNjkBuJa0WEGyNjfeKWo1hfVmddbMDJGs,5151
16
+ agentirc/clients/claude/webhook.py,sha256=nkc4DHZmkd6MQzQVIhpkjl_5y8dqlmpdXX48Y6ovQyE,1780
17
+ agentirc/clients/claude/skill/SKILL.md,sha256=Sf0w3HWuZmJkS6R6LZPB7l5VNxJXltuRYcr5KSvhWRQ,3955
18
+ agentirc/clients/claude/skill/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ agentirc/clients/claude/skill/irc_client.py,sha256=URRKFCo2uhdMBBHPIQLApTvaZaGhDvqHrENKrqF8vWE,10302
20
+ agentirc/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ agentirc/protocol/commands.py,sha256=KKz6fQhqV7VSUy8dg2Tpu-gu4R5GVeSewEi61ddLo1k,553
22
+ agentirc/protocol/message.py,sha256=g5h-1HIMneeOC7kvHABjGEmNKBDi1GLYZeZ0jJEZHkE,1633
23
+ agentirc/protocol/protocol-index.md,sha256=KCjB2PivHs8U7eSrTZwMe1kFrQ6OQmWNfZtIO1ps3sw,221
24
+ agentirc/protocol/replies.py,sha256=rxTNJVF8MqT0Y8MAdaP-VtH37Eq0pDRwXbV5BhJz9xs,898
25
+ agentirc/protocol/extensions/federation.md,sha256=kGUFhx4gBRZrR3pJfBTRb-hYscdp3RXIJAZQPMA8LI4,2907
26
+ agentirc/protocol/extensions/history.md,sha256=Os26NSGM1BwS2Lg3g9oU-0ttt5dU18zGyKze7B34774,2717
27
+ agentirc/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ agentirc/server/__main__.py,sha256=cPQK68MT3S0Ho2gFZd2_0cyg6yAxdrXWHm8zRMIDsJk,1916
29
+ agentirc/server/channel.py,sha256=sA_GhRyFqvtYjEuMrpvi9I8jMwDzeTqavMRP7fQFcSM,1903
30
+ agentirc/server/client.py,sha256=OkBM-5aTwG-T6_No7WwhMegr8UrryFNLYlgcWujWVdA,25610
31
+ agentirc/server/config.py,sha256=5az5e_SukAvC9oi_isKkc6sffqiTi4j0S4AdalWG6SM,409
32
+ agentirc/server/ircd.py,sha256=V-fvfxM1b0tGl5mNx2rJW3untc5J_p2fmVN-JxYwJSc,7722
33
+ agentirc/server/remote_client.py,sha256=4Afgs9CaEif7P6TwL0wQIIDlrFIqPOd61A21vOkH9sA,1075
34
+ agentirc/server/server_link.py,sha256=DM1KVQNygWZGi7PTXn0-0JDv5hZTWfUx80ZN8s7IvC4,19342
35
+ agentirc/server/skill.py,sha256=DuGJgTgYPI2TxLEM8jQQgB6WhVWRByJEf2xHyEniNZ8,966
36
+ agentirc/server/skills/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ agentirc/server/skills/history.py,sha256=DMQ1vKmAXZ8mt7lKshsAbyVUEyenZ9LPSafy3Fz5kZs,4698
38
+ agentirc_cli-0.2.1.dist-info/METADATA,sha256=5SUD4BckxKferFffZlu00aLDOOqDozxEQgNpk273idc,6082
39
+ agentirc_cli-0.2.1.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
40
+ agentirc_cli-0.2.1.dist-info/entry_points.txt,sha256=ROcDaCYwtyN2Y7h7HwXd-bUwT3rguv1cre1ZoUbV6rs,47
41
+ agentirc_cli-0.2.1.dist-info/licenses/LICENSE,sha256=n-5wtHK9QDJJcJUJb7WgxlVlUFebVx4F006pm-CSFeQ,1067
42
+ agentirc_cli-0.2.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ agentirc = agentirc.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ori Nachum
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.