sondera-harness 0.6.0__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.
- sondera/__init__.py +111 -0
- sondera/__main__.py +4 -0
- sondera/adk/__init__.py +3 -0
- sondera/adk/analyze.py +222 -0
- sondera/adk/plugin.py +387 -0
- sondera/cli.py +22 -0
- sondera/exceptions.py +167 -0
- sondera/harness/__init__.py +6 -0
- sondera/harness/abc.py +102 -0
- sondera/harness/cedar/__init__.py +0 -0
- sondera/harness/cedar/harness.py +363 -0
- sondera/harness/cedar/schema.py +225 -0
- sondera/harness/sondera/__init__.py +0 -0
- sondera/harness/sondera/_grpc.py +354 -0
- sondera/harness/sondera/harness.py +890 -0
- sondera/langgraph/__init__.py +15 -0
- sondera/langgraph/analyze.py +543 -0
- sondera/langgraph/exceptions.py +19 -0
- sondera/langgraph/graph.py +210 -0
- sondera/langgraph/middleware.py +454 -0
- sondera/proto/google/protobuf/any_pb2.py +37 -0
- sondera/proto/google/protobuf/any_pb2.pyi +14 -0
- sondera/proto/google/protobuf/any_pb2_grpc.py +24 -0
- sondera/proto/google/protobuf/duration_pb2.py +37 -0
- sondera/proto/google/protobuf/duration_pb2.pyi +14 -0
- sondera/proto/google/protobuf/duration_pb2_grpc.py +24 -0
- sondera/proto/google/protobuf/empty_pb2.py +37 -0
- sondera/proto/google/protobuf/empty_pb2.pyi +9 -0
- sondera/proto/google/protobuf/empty_pb2_grpc.py +24 -0
- sondera/proto/google/protobuf/struct_pb2.py +47 -0
- sondera/proto/google/protobuf/struct_pb2.pyi +49 -0
- sondera/proto/google/protobuf/struct_pb2_grpc.py +24 -0
- sondera/proto/google/protobuf/timestamp_pb2.py +37 -0
- sondera/proto/google/protobuf/timestamp_pb2.pyi +14 -0
- sondera/proto/google/protobuf/timestamp_pb2_grpc.py +24 -0
- sondera/proto/google/protobuf/wrappers_pb2.py +53 -0
- sondera/proto/google/protobuf/wrappers_pb2.pyi +59 -0
- sondera/proto/google/protobuf/wrappers_pb2_grpc.py +24 -0
- sondera/proto/sondera/__init__.py +0 -0
- sondera/proto/sondera/core/__init__.py +0 -0
- sondera/proto/sondera/core/v1/__init__.py +0 -0
- sondera/proto/sondera/core/v1/primitives_pb2.py +88 -0
- sondera/proto/sondera/core/v1/primitives_pb2.pyi +259 -0
- sondera/proto/sondera/core/v1/primitives_pb2_grpc.py +24 -0
- sondera/proto/sondera/harness/__init__.py +0 -0
- sondera/proto/sondera/harness/v1/__init__.py +0 -0
- sondera/proto/sondera/harness/v1/harness_pb2.py +81 -0
- sondera/proto/sondera/harness/v1/harness_pb2.pyi +192 -0
- sondera/proto/sondera/harness/v1/harness_pb2_grpc.py +498 -0
- sondera/py.typed +0 -0
- sondera/settings.py +20 -0
- sondera/strands/__init__.py +5 -0
- sondera/strands/analyze.py +244 -0
- sondera/strands/harness.py +333 -0
- sondera/tui/__init__.py +0 -0
- sondera/tui/app.py +309 -0
- sondera/tui/screens/__init__.py +5 -0
- sondera/tui/screens/adjudication.py +184 -0
- sondera/tui/screens/agent.py +158 -0
- sondera/tui/screens/trajectory.py +158 -0
- sondera/tui/widgets/__init__.py +23 -0
- sondera/tui/widgets/agent_card.py +94 -0
- sondera/tui/widgets/agent_list.py +73 -0
- sondera/tui/widgets/recent_adjudications.py +52 -0
- sondera/tui/widgets/recent_trajectories.py +54 -0
- sondera/tui/widgets/summary.py +57 -0
- sondera/tui/widgets/tool_card.py +33 -0
- sondera/tui/widgets/violation_panel.py +72 -0
- sondera/tui/widgets/violations_list.py +78 -0
- sondera/tui/widgets/violations_summary.py +104 -0
- sondera/types.py +346 -0
- sondera_harness-0.6.0.dist-info/METADATA +323 -0
- sondera_harness-0.6.0.dist-info/RECORD +77 -0
- sondera_harness-0.6.0.dist-info/WHEEL +5 -0
- sondera_harness-0.6.0.dist-info/entry_points.txt +2 -0
- sondera_harness-0.6.0.dist-info/licenses/LICENSE +21 -0
- sondera_harness-0.6.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sondera-harness
|
|
3
|
+
Version: 0.6.0
|
|
4
|
+
Summary: Sondera Harness SDK for Python - Agent governance and policy enforcement
|
|
5
|
+
Author-email: Sondera AI <sdk@sondera.ai>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/sondera-ai/harness-sdk-python
|
|
8
|
+
Project-URL: Documentation, https://docs.sondera.ai
|
|
9
|
+
Project-URL: Repository, https://github.com/sondera-ai/harness-sdk-python
|
|
10
|
+
Project-URL: Issues, https://github.com/sondera-ai/harness-sdk-python/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/sondera-ai/harness-sdk-python/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: ai,agents,governance,policy,guardrails,llm,langchain,langgraph
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
+
Classifier: Topic :: Security
|
|
22
|
+
Classifier: Typing :: Typed
|
|
23
|
+
Requires-Python: <3.15,>=3.12
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: cedar-python>=0.1.1
|
|
27
|
+
Requires-Dist: click>=8.0.0
|
|
28
|
+
Requires-Dist: click-default-group>=1.2.4
|
|
29
|
+
Requires-Dist: grpcio>=1.76.0
|
|
30
|
+
Requires-Dist: grpcio-tools>=1.76.0
|
|
31
|
+
Requires-Dist: httpx>=0.27.0
|
|
32
|
+
Requires-Dist: pydantic>=2.12.0
|
|
33
|
+
Requires-Dist: pydantic-settings>=2.12.0
|
|
34
|
+
Requires-Dist: textual>=6.11.0
|
|
35
|
+
Provides-Extra: adk
|
|
36
|
+
Requires-Dist: google-adk>=1.22.0; extra == "adk"
|
|
37
|
+
Provides-Extra: langgraph
|
|
38
|
+
Requires-Dist: langchain>=1.2.0; extra == "langgraph"
|
|
39
|
+
Requires-Dist: langgraph>=1.0.5; extra == "langgraph"
|
|
40
|
+
Provides-Extra: strands
|
|
41
|
+
Requires-Dist: strands-agents>=1.21.0; extra == "strands"
|
|
42
|
+
Provides-Extra: all
|
|
43
|
+
Requires-Dist: google-adk>=1.22.0; extra == "all"
|
|
44
|
+
Requires-Dist: langchain>=1.2.0; extra == "all"
|
|
45
|
+
Requires-Dist: langgraph>=1.0.5; extra == "all"
|
|
46
|
+
Requires-Dist: strands-agents>=1.21.0; extra == "all"
|
|
47
|
+
Dynamic: license-file
|
|
48
|
+
|
|
49
|
+
# Sondera Harness SDK for Python
|
|
50
|
+
|
|
51
|
+
[](https://www.python.org/downloads/)
|
|
52
|
+
[](LICENSE)
|
|
53
|
+
|
|
54
|
+
>
|
|
55
|
+
> One step at a time. One action at a time. One trajectory at a time.
|
|
56
|
+
>
|
|
57
|
+
|
|
58
|
+
AI agents systems operate beyond traditional security boundaries, making autonomous decisions, calling tools, and accessing resources based on context that changes with every execution. Sondera SDK provides runtime governance for these agentic systems, answering not just "can this agent do X?" but "should it do X here, now, with this data?" Built for developers deploying agents through LangGraph, Google ADK, and Strands, Sondera enables real-time trajectory tracking, policy-as-code enforcement via Cedar, and behavioral adjudication so you can ship agents with confidence.
|
|
59
|
+
|
|
60
|
+
## Features
|
|
61
|
+
|
|
62
|
+
- **Managed harness-as-a-service** with the Sondera Harness for enterprise policy governance and guardrails
|
|
63
|
+
- **Local policy-as-code** using Cedar policy language in the Cedar Policy Harness
|
|
64
|
+
- **Real-time trajectory** observability, adjudication, and steering
|
|
65
|
+
- **Scaffold integrations** for LangGraph, Google ADK, and Strands
|
|
66
|
+
- **CLI and TUI** for monitoring agent behavior
|
|
67
|
+
|
|
68
|
+
## Installation
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
uv add sondera-harness
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Optional Dependencies
|
|
75
|
+
|
|
76
|
+
Install extras for specific framework integrations:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Google ADK support
|
|
80
|
+
uv add sondera-harness --extra adk
|
|
81
|
+
|
|
82
|
+
# LangGraph support
|
|
83
|
+
uv add sondera-harness --extra langgraph
|
|
84
|
+
|
|
85
|
+
# Strands support
|
|
86
|
+
uv add sondera-harness --extra strands
|
|
87
|
+
|
|
88
|
+
# All integrations
|
|
89
|
+
uv add sondera-harness --all-extras
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Quick Start
|
|
93
|
+
|
|
94
|
+
### Configuration
|
|
95
|
+
|
|
96
|
+
Set your API credentials via environment variables:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
export SONDERA_HARNESS_ENDPOINT="your-harness.sondera.ai:443"
|
|
100
|
+
export SONDERA_API_TOKEN="<YOUR_SONDERA_API_KEY>"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Or create a `.env` file or `~/.sondera/env`:
|
|
104
|
+
|
|
105
|
+
```env
|
|
106
|
+
SONDERA_HARNESS_ENDPOINT=your-harness.sondera.ai:443
|
|
107
|
+
SONDERA_API_TOKEN=<YOUR_SONDERA_API_KEY>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Scaffold Integrations
|
|
111
|
+
|
|
112
|
+
### LangGraph / LangChain
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
from langchain.agents import create_agent
|
|
116
|
+
from sondera.harness import SonderaRemoteHarness
|
|
117
|
+
from sondera.langgraph import SonderaHarnessMiddleware, Strategy, create_agent_from_langchain_tools
|
|
118
|
+
|
|
119
|
+
# Analyze your tools and create agent metadata
|
|
120
|
+
sondera_agent = create_agent_from_langchain_tools(
|
|
121
|
+
tools=my_tools,
|
|
122
|
+
agent_id="langchain-agent",
|
|
123
|
+
agent_name="My LangChain Agent",
|
|
124
|
+
agent_description="An agent that helps with tasks",
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
# Create harness with agent
|
|
128
|
+
harness = SonderaRemoteHarness(agent=sondera_agent)
|
|
129
|
+
|
|
130
|
+
# Create middleware
|
|
131
|
+
middleware = SonderaHarnessMiddleware(
|
|
132
|
+
harness=harness,
|
|
133
|
+
strategy=Strategy.BLOCK, # or Strategy.STEER
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# Create agent with middleware
|
|
137
|
+
agent = create_agent(
|
|
138
|
+
model=my_model,
|
|
139
|
+
tools=my_tools,
|
|
140
|
+
middleware=[middleware],
|
|
141
|
+
)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Google ADK
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
from google.adk.agents import Agent
|
|
148
|
+
from google.adk.runners import Runner
|
|
149
|
+
from sondera.harness import SonderaRemoteHarness
|
|
150
|
+
from sondera.adk import SonderaHarnessPlugin
|
|
151
|
+
|
|
152
|
+
# Create harness
|
|
153
|
+
harness = SonderaRemoteHarness(
|
|
154
|
+
sondera_api_key="<YOUR_SONDERA_API_KEY>",
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# Create plugin
|
|
158
|
+
plugin = SonderaHarnessPlugin(harness=harness)
|
|
159
|
+
|
|
160
|
+
# Create agent
|
|
161
|
+
agent = Agent(
|
|
162
|
+
name="my-adk-agent",
|
|
163
|
+
model="gemini-2.0-flash",
|
|
164
|
+
instruction="Be helpful and safe",
|
|
165
|
+
tools=[...],
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Create runner with plugin
|
|
169
|
+
runner = Runner(
|
|
170
|
+
agent=agent,
|
|
171
|
+
app_name="my-app",
|
|
172
|
+
plugins=[plugin],
|
|
173
|
+
)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Strands Agents
|
|
177
|
+
|
|
178
|
+
```python
|
|
179
|
+
from strands import Agent
|
|
180
|
+
from sondera.harness import SonderaRemoteHarness
|
|
181
|
+
from sondera.strands import SonderaHarnessHook
|
|
182
|
+
|
|
183
|
+
# Create harness
|
|
184
|
+
harness = SonderaRemoteHarness(
|
|
185
|
+
sondera_api_key="<YOUR_SONDERA_API_KEY>",
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Create hook
|
|
189
|
+
hook = SonderaHarnessHook(harness=harness)
|
|
190
|
+
|
|
191
|
+
# Create agent with hook
|
|
192
|
+
agent = Agent(
|
|
193
|
+
system_prompt="You are a helpful assistant",
|
|
194
|
+
model="anthropic.claude-3-5-sonnet-20241022-v2:0",
|
|
195
|
+
hooks=[hook],
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# Run agent (hooks fire automatically)
|
|
199
|
+
response = agent("What is 5 + 3?")
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Custom Scaffold
|
|
203
|
+
|
|
204
|
+
```python
|
|
205
|
+
from sondera import SonderaRemoteHarness, Agent, PromptContent, Role, Stage
|
|
206
|
+
|
|
207
|
+
# Create a harness instance
|
|
208
|
+
harness = SonderaRemoteHarness(
|
|
209
|
+
sondera_harness_endpoint="localhost:50051",
|
|
210
|
+
sondera_api_key="<YOUR_SONDERA_API_KEY>",
|
|
211
|
+
sondera_harness_client_secure=True, # Enable TLS for production
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
# Define your agent
|
|
215
|
+
agent = Agent(
|
|
216
|
+
id="my-agent",
|
|
217
|
+
provider_id="custom",
|
|
218
|
+
name="My Assistant",
|
|
219
|
+
description="A helpful AI assistant",
|
|
220
|
+
instruction="Be helpful, accurate, and safe",
|
|
221
|
+
tools=[],
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# Initialize a trajectory
|
|
225
|
+
await harness.initialize(agent=agent)
|
|
226
|
+
|
|
227
|
+
# Adjudicate user input
|
|
228
|
+
adjudication = await harness.adjudicate(
|
|
229
|
+
Stage.PRE_MODEL,
|
|
230
|
+
Role.USER,
|
|
231
|
+
PromptContent(text="Hello, can you help me?"),
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
if adjudication.is_allowed:
|
|
235
|
+
# Proceed with agent logic
|
|
236
|
+
pass
|
|
237
|
+
elif adjudication.is_denied:
|
|
238
|
+
print(f"Request blocked: {adjudication.reason}")
|
|
239
|
+
|
|
240
|
+
# Finalize the trajectory
|
|
241
|
+
await harness.finalize()
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Remote and Local Harnesses
|
|
245
|
+
|
|
246
|
+
### Cedar Policy Harness (Local Only)
|
|
247
|
+
|
|
248
|
+
For a local harness deployment, you can use the `CedarPolicyHarness` to evaluate Cedar policies:
|
|
249
|
+
|
|
250
|
+
```python
|
|
251
|
+
from sondera.harness import CedarPolicyHarness
|
|
252
|
+
from sondera import Agent
|
|
253
|
+
|
|
254
|
+
# Define Cedar policies
|
|
255
|
+
policies = '''
|
|
256
|
+
@id("forbid-dangerous-bash")
|
|
257
|
+
forbid(
|
|
258
|
+
principal,
|
|
259
|
+
action == Coding_Agent::Action::"Bash",
|
|
260
|
+
resource
|
|
261
|
+
)
|
|
262
|
+
when {
|
|
263
|
+
context has parameters &&
|
|
264
|
+
(context.parameters.command like "*rm -rf /*" ||
|
|
265
|
+
context.parameters.command like "*mkfs*" ||
|
|
266
|
+
context.parameters.command like "*dd if=/dev/zero*" ||
|
|
267
|
+
context.parameters.command like "*> /dev/sda*")
|
|
268
|
+
};
|
|
269
|
+
'''
|
|
270
|
+
|
|
271
|
+
# Create local policy engine
|
|
272
|
+
harness = CedarPolicyHarness(
|
|
273
|
+
policy_set=policies,
|
|
274
|
+
agent=my_agent,
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
await harness.initialize()
|
|
278
|
+
# Use same adjudication API as RemoteHarness
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## CLI & TUI
|
|
282
|
+
|
|
283
|
+
Launch the Sondera TUI for monitoring (note, requires a Sondera account and API key):
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
sondera
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
The TUI provides:
|
|
290
|
+
- Real-time agent and trajectory overview
|
|
291
|
+
- Adjudication history and policy violations
|
|
292
|
+
- Agent details and tool inspection
|
|
293
|
+
|
|
294
|
+
## Examples
|
|
295
|
+
|
|
296
|
+
See the [examples/](examples/) directory for complete demos:
|
|
297
|
+
|
|
298
|
+
- **LangGraph**: Investment chatbot with policy enforcement
|
|
299
|
+
- **ADK**: Payment and healthcare agents
|
|
300
|
+
- **Strands**: Various agent implementations
|
|
301
|
+
|
|
302
|
+
## Environment Variables
|
|
303
|
+
|
|
304
|
+
| Variable | Description | Default |
|
|
305
|
+
|----------|-------------|---------|
|
|
306
|
+
| `SONDERA_HARNESS_ENDPOINT` | Harness service endpoint | `localhost:50051` |
|
|
307
|
+
| `SONDERA_API_TOKEN` | JWT authentication token | Required for remote |
|
|
308
|
+
|
|
309
|
+
## Requirements
|
|
310
|
+
|
|
311
|
+
- Python 3.12 or higher (up to 3.14)
|
|
312
|
+
|
|
313
|
+
## Security
|
|
314
|
+
|
|
315
|
+
See [SECURITY.md](SECURITY.md) for security best practices and vulnerability reporting.
|
|
316
|
+
|
|
317
|
+
## Contributing
|
|
318
|
+
|
|
319
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for contribution guidelines.
|
|
320
|
+
|
|
321
|
+
## License
|
|
322
|
+
|
|
323
|
+
MIT - see [LICENSE](LICENSE) for details.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
sondera/__init__.py,sha256=g6Ewr03q_2JZGIJ9APVs-6MLvZsAEtQJ2dcYEp4a6oc,2695
|
|
2
|
+
sondera/__main__.py,sha256=MNgWvrV4g4Ot653Ngi2D4cAOyRIG19qHAWLzQecsMdg,66
|
|
3
|
+
sondera/cli.py,sha256=owchF-eA6kttYGTSsLl0B7XJMmn9O2n2LFjpfYQvznQ,494
|
|
4
|
+
sondera/exceptions.py,sha256=vtuToFc5tSlzAyVYvayyOatKBcoenisDA1RN2yk9aSI,3584
|
|
5
|
+
sondera/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
sondera/settings.py,sha256=bLB98vT75aXKh5ihYnCd0dTk1AdfUUaGuPkyzhcldE0,459
|
|
7
|
+
sondera/types.py,sha256=T6_vZQwXO4CtOW1B9X9JhuSuN7FvE6qq4T_Li1KLZbc,9556
|
|
8
|
+
sondera/adk/__init__.py,sha256=weoilnJyr8JNBv2HK6s3hhW-6rOBGBcNwwkKk1oHVFE,77
|
|
9
|
+
sondera/adk/analyze.py,sha256=IurwCWPZlNbMkIwi3TGWUu4k-w_VmKCkAnVFbfipbxY,7974
|
|
10
|
+
sondera/adk/plugin.py,sha256=HfVdbzp0bHc4YIs0MjNO-pwrMMex1AsKbQWoQNp7dmI,13047
|
|
11
|
+
sondera/harness/__init__.py,sha256=gK0rFEyixD9X67pFyWKQpcq_oZ6pep6up8K0Y-zvXUc,221
|
|
12
|
+
sondera/harness/abc.py,sha256=hL77Rlzy1B-DjFexhskGm_9j5Sue-TaWdlSnjr-Al70,3548
|
|
13
|
+
sondera/harness/cedar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
+
sondera/harness/cedar/harness.py,sha256=mkskBjz4REVhV79r_zgrRBQjwGqbKom7NlpJr8aM0P8,12128
|
|
15
|
+
sondera/harness/cedar/schema.py,sha256=jDAGdLciK3fQ-7yKrqeFkU4YHQg-KwWvTi1leEuYVxo,7766
|
|
16
|
+
sondera/harness/sondera/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
sondera/harness/sondera/_grpc.py,sha256=wAhk5H3BZvyi72RtUo1nuJFqp-U4UXe44l2eODDJrF8,12504
|
|
18
|
+
sondera/harness/sondera/harness.py,sha256=ueR2Khfmz3R4-fZrQsv_AtjOC7OAN861UEX0D-Okmwg,31710
|
|
19
|
+
sondera/langgraph/__init__.py,sha256=F2eNoPp944tvGbf9a4etNh3-o49WOPrcs9EFVT0OYYw,473
|
|
20
|
+
sondera/langgraph/analyze.py,sha256=1n-1yKr7-kfdFNSBe9JozZ08oJeYvPqKkFttcQ4MXHI,20514
|
|
21
|
+
sondera/langgraph/exceptions.py,sha256=BRdh1gpELb3_WZ9Bh_UUwZsIOcIPrpQCD-7LnnAGeV4,501
|
|
22
|
+
sondera/langgraph/graph.py,sha256=hIF5q_Fbq4E16CDqDksLrCETTEORgKiqPlpqIB5F-Rc,6898
|
|
23
|
+
sondera/langgraph/middleware.py,sha256=q29nATkKlBiPs0bWuDpABkWccgYIBB6voLUnbQi1x0c,16816
|
|
24
|
+
sondera/proto/google/protobuf/any_pb2.py,sha256=W6duyvBgx7RvePFCrJSxWagU7ddj1W9l8CsjarJJPOs,1703
|
|
25
|
+
sondera/proto/google/protobuf/any_pb2.pyi,sha256=SSPWnvAxd1bX9FYZmLrZVmQ-29GsAE5bmgBcJlMaVfw,587
|
|
26
|
+
sondera/proto/google/protobuf/any_pb2_grpc.py,sha256=OVxvViTmAZH370lIhyTfRI29xiCur_xZyAI4VJY1qJg,899
|
|
27
|
+
sondera/proto/google/protobuf/duration_pb2.py,sha256=ot6pGJwRMjEoJE0u-uoXmzqIjCLVVNb3vLSKhsf1w2c,1783
|
|
28
|
+
sondera/proto/google/protobuf/duration_pb2.pyi,sha256=4pSiDSNj4UN0Fj1caArCKXdt_Ij9MoV4_HJrK4Ud0tI,589
|
|
29
|
+
sondera/proto/google/protobuf/duration_pb2_grpc.py,sha256=lli9wwRy8--EIICcCoAVxpH5Dn4cqdOEDtxx5WZrnyY,904
|
|
30
|
+
sondera/proto/google/protobuf/empty_pb2.py,sha256=RtYfjWZz9WAe3fY5vDhjSo3i0M6kwZ8-kX9R_9vmyGc,1669
|
|
31
|
+
sondera/proto/google/protobuf/empty_pb2.pyi,sha256=DLDeT-Le693aw6c767hzP5Fpan6Y7YZW2Ip-DXFPde8,270
|
|
32
|
+
sondera/proto/google/protobuf/empty_pb2_grpc.py,sha256=X55kMZspxJ0pQ2RqfY2DNqBjTj_BmpLlELK6pKQQ3oI,901
|
|
33
|
+
sondera/proto/google/protobuf/struct_pb2.py,sha256=DJ6P0fZe53upcah9J1jDo6BSClobouW9dHdCTItZO1A,2955
|
|
34
|
+
sondera/proto/google/protobuf/struct_pb2.pyi,sha256=zcgmPvKaj6SS6xGyQryKtDcCTyq5pXVxjfQaXM60hQ8,2377
|
|
35
|
+
sondera/proto/google/protobuf/struct_pb2_grpc.py,sha256=mrMY-DTCFZiN98--ByhthQ6QhILVn1U4xduBkYOjQCQ,902
|
|
36
|
+
sondera/proto/google/protobuf/timestamp_pb2.py,sha256=K7Gs_qOn2XAMZTNUUrJ1XcGf4OmYhdt858I_zDtZYzg,1793
|
|
37
|
+
sondera/proto/google/protobuf/timestamp_pb2.pyi,sha256=A9kZVVzcDNol7qL2Mp64BMJ22FaX6PotppQIbdAoGeM,591
|
|
38
|
+
sondera/proto/google/protobuf/timestamp_pb2_grpc.py,sha256=uY7KJGT5TCSOavJ3wBxNKf4WjsVk2BHtd6QWMqta0w8,905
|
|
39
|
+
sondera/proto/google/protobuf/wrappers_pb2.py,sha256=4hQAZRGeaE5DyY6YQ7VfrqozPa_d_LCOBEYjxfQNlKs,2955
|
|
40
|
+
sondera/proto/google/protobuf/wrappers_pb2.pyi,sha256=VFKYI4PCRE3mdJ8r1jorcVwa5gs_MgHRD1DBWzIBVAs,1859
|
|
41
|
+
sondera/proto/google/protobuf/wrappers_pb2_grpc.py,sha256=SO9GezWgSOXwclY-Jjo8lvlZ_DSCu3NfdASR1R9H6lM,904
|
|
42
|
+
sondera/proto/sondera/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
|
+
sondera/proto/sondera/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
+
sondera/proto/sondera/core/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
+
sondera/proto/sondera/core/v1/primitives_pb2.py,sha256=12rqeMQnq7OOVIaQBE3ig7hiMUtOK-ENCuiz-T91nMo,9231
|
|
46
|
+
sondera/proto/sondera/core/v1/primitives_pb2.pyi,sha256=IFzGfoUe2TcQqZJRT-jmyofosmOOmrtWoTRPIqqLa5E,11824
|
|
47
|
+
sondera/proto/sondera/core/v1/primitives_pb2_grpc.py,sha256=YNObfhmUBQVh_n-kRidSAi_V4sPLf2Mo9Jc7hEEHT2s,906
|
|
48
|
+
sondera/proto/sondera/harness/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
+
sondera/proto/sondera/harness/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
sondera/proto/sondera/harness/v1/harness_pb2.py,sha256=V8wR4HVOD9erO2ih5hWx269FTJzgaZOi5r1CvUlHmAE,8919
|
|
51
|
+
sondera/proto/sondera/harness/v1/harness_pb2.pyi,sha256=NiQNpGD9ICD41I9w11yJJwecZG5MJKAif5Qaow8x7rc,9640
|
|
52
|
+
sondera/proto/sondera/harness/v1/harness_pb2_grpc.py,sha256=h5y_HwqqzzpjaqQuaUt5ICy-2B2UJ-jea0gYfXsB6Ig,21845
|
|
53
|
+
sondera/strands/__init__.py,sha256=Tg0l3ERb_uusENXZv9mtZz5tJ-TLK7K8zG2KsKHmUn4,124
|
|
54
|
+
sondera/strands/analyze.py,sha256=yT9_DGieoMIxy5DGma9EdeAl2FVnkFQkdqK8waTphB8,8007
|
|
55
|
+
sondera/strands/harness.py,sha256=CazoBF-grM2D2Ipj68QdYW4BmWw9fdLVy3_ntcylXvs,13100
|
|
56
|
+
sondera/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
|
+
sondera/tui/app.py,sha256=I6Pcyatr5pPqjYwmBZrdTSFY11oR9sWmG90gVbN9pqo,11521
|
|
58
|
+
sondera/tui/screens/__init__.py,sha256=-Yf_mYDWiEmA0lOCay01NhOVPOOCV6EnaFi8ZV7MkDk,186
|
|
59
|
+
sondera/tui/screens/adjudication.py,sha256=w-CTCu5X5qWASkRJxC_kqEaCvpcIiYSfqUfNu030OnY,7151
|
|
60
|
+
sondera/tui/screens/agent.py,sha256=xkMC37YIcDBJahQeZjI1Li8KmE90irF0-6VDvQGyuKY,6125
|
|
61
|
+
sondera/tui/screens/trajectory.py,sha256=QG0HsmfwOuRqDFDldq6Do_3BxK6AGtzb_F862YlxAqA,6145
|
|
62
|
+
sondera/tui/widgets/__init__.py,sha256=_YZKwo90vmod6t6h-6kNnTTVSY1mW-IOPzo7-NufCVk,635
|
|
63
|
+
sondera/tui/widgets/agent_card.py,sha256=-n0HJNhNDjly3hLYEkfLwy3B39vjHdg5Q-han3nNy0s,3606
|
|
64
|
+
sondera/tui/widgets/agent_list.py,sha256=guB7mlQS_I01fHHckK4T6hq8n_6zSAy6dF3F7l6-2ZA,2775
|
|
65
|
+
sondera/tui/widgets/recent_adjudications.py,sha256=6v_ft8Z3RqLYelkxxLWtpiiFfTlP3n8R3dbg-X5bid4,1828
|
|
66
|
+
sondera/tui/widgets/recent_trajectories.py,sha256=phP1Ks9-NLbVWUBtAyb7isgWDJscrtKwzYPLstriZmM,1882
|
|
67
|
+
sondera/tui/widgets/summary.py,sha256=2HSgJ1Qo_femjweguSayVsNQDaoIYA2t7N-ETGTUt_g,2768
|
|
68
|
+
sondera/tui/widgets/tool_card.py,sha256=3yNQcc_umcan4V1S5GiEKd7l4YA_atibwn3HF0n6LiY,1151
|
|
69
|
+
sondera/tui/widgets/violation_panel.py,sha256=fowe4KWb13NXLX0_RAxEPdRqYeyGzlImpRs4_L9y1zI,2933
|
|
70
|
+
sondera/tui/widgets/violations_list.py,sha256=86qICAsQOC6kjQLs64WxK7u59vEJ8kvfiToLVlzFyHM,2866
|
|
71
|
+
sondera/tui/widgets/violations_summary.py,sha256=e2LwqlB1aS8sZ2gEC5clk7siA16NSgePU1mpv8T1iTc,4473
|
|
72
|
+
sondera_harness-0.6.0.dist-info/licenses/LICENSE,sha256=DmSfauhgrslTxZOcDAmcYqsqsKBkMqVh3PYdjPghNbU,1070
|
|
73
|
+
sondera_harness-0.6.0.dist-info/METADATA,sha256=HiP8aqRfKWl5ERBjIYWRUqP6twIMbNK-77705MEFwhk,8899
|
|
74
|
+
sondera_harness-0.6.0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
75
|
+
sondera_harness-0.6.0.dist-info/entry_points.txt,sha256=e9aHpIPUUlP5MPKORk7k6ekUfZLN3RyO1MEJa-nCzK4,44
|
|
76
|
+
sondera_harness-0.6.0.dist-info/top_level.txt,sha256=BR0X8Gq9CCpwbQg5evpQfy5zwp9fTuGnlJhXSNqQ_hA,8
|
|
77
|
+
sondera_harness-0.6.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sondera, Inc.
|
|
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.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sondera
|