elydora 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
elydora-1.0.0/PKG-INFO ADDED
@@ -0,0 +1,252 @@
1
+ Metadata-Version: 2.4
2
+ Name: elydora
3
+ Version: 1.0.0
4
+ Summary: Python SDK for the Elydora tamper-evident audit platform
5
+ License: MIT
6
+ Classifier: Development Status :: 5 - Production/Stable
7
+ Classifier: Intended Audience :: Developers
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Programming Language :: Python :: 3
10
+ Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Typing :: Typed
16
+ Requires-Python: >=3.9
17
+ Description-Content-Type: text/markdown
18
+ Requires-Dist: requests>=2.28.0
19
+ Requires-Dist: aiohttp>=3.8.0
20
+ Requires-Dist: cryptography>=41.0.0
21
+ Requires-Dist: typing_extensions>=4.0.0; python_version < "3.11"
22
+ Provides-Extra: dev
23
+ Requires-Dist: pytest>=7.0; extra == "dev"
24
+ Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
25
+ Requires-Dist: mypy>=1.0; extra == "dev"
26
+
27
+ # Elydora Python SDK
28
+
29
+ Official Python SDK for the [Elydora](https://elydora.com) tamper-evident audit platform. Build cryptographically verifiable audit trails for AI agent operations.
30
+
31
+ ## Installation
32
+
33
+ ```bash
34
+ pip install elydora
35
+ ```
36
+
37
+ Requires Python 3.9+.
38
+
39
+ ## Quick Start
40
+
41
+ ```python
42
+ from elydora import ElydoraClient
43
+
44
+ # Authenticate
45
+ auth = ElydoraClient.login("https://api.elydora.com", "user@example.com", "password")
46
+
47
+ # Create client
48
+ client = ElydoraClient(
49
+ org_id=auth["user"]["org_id"],
50
+ agent_id="my-agent-id",
51
+ private_key="<base64url-encoded-ed25519-seed>",
52
+ base_url="https://api.elydora.com",
53
+ token=auth["token"],
54
+ )
55
+
56
+ # Create and submit an operation
57
+ eor = client.create_operation(
58
+ operation_type="data.access",
59
+ subject={"user_id": "u-123", "resource": "patient-record"},
60
+ action={"type": "read", "scope": "full"},
61
+ payload={"record_id": "rec-456"},
62
+ )
63
+ response = client.submit_operation(eor)
64
+ print("Receipt:", response["receipt"]["receipt_id"])
65
+ ```
66
+
67
+ ## Async Support
68
+
69
+ ```python
70
+ from elydora import AsyncElydoraClient
71
+
72
+ async def main():
73
+ client = AsyncElydoraClient(
74
+ org_id="org-123",
75
+ agent_id="agent-456",
76
+ private_key="<base64url-encoded-ed25519-seed>",
77
+ token="<jwt-token>",
78
+ )
79
+
80
+ eor = client.create_operation(
81
+ operation_type="inference",
82
+ subject={"model": "gpt-4"},
83
+ action={"type": "completion"},
84
+ )
85
+ response = await client.submit_operation(eor)
86
+ await client.close()
87
+ ```
88
+
89
+ ## CLI
90
+
91
+ The SDK includes a CLI for installing audit hooks into AI coding agents.
92
+
93
+ ```bash
94
+ elydora install \
95
+ --agent claudecode \
96
+ --org_id org-123 \
97
+ --agent_id agent-456 \
98
+ --private_key <key> \
99
+ --kid agent-456-key-v1
100
+ ```
101
+
102
+ ### Commands
103
+
104
+ | Command | Description |
105
+ |---------|-------------|
106
+ | `elydora install` | Install Elydora audit hook for a coding agent |
107
+ | `elydora uninstall` | Remove Elydora audit hook for a coding agent |
108
+ | `elydora status` | Show installation status for all agents |
109
+ | `elydora agents` | List supported coding agents |
110
+
111
+ ### Supported Agents
112
+
113
+ | Agent | Key |
114
+ |-------|-----|
115
+ | Claude Code | `claudecode` |
116
+ | Cursor | `cursor` |
117
+ | Gemini CLI | `gemini` |
118
+ | Augment Code | `augment` |
119
+ | Kiro | `kiro` |
120
+ | OpenCode | `opencode` |
121
+
122
+ ## API Reference
123
+
124
+ ### Configuration
125
+
126
+ ```python
127
+ client = ElydoraClient(
128
+ org_id="org-123", # Organization ID
129
+ agent_id="agent-456", # Agent ID
130
+ private_key="<seed>", # Base64url-encoded Ed25519 seed
131
+ base_url="https://...", # API base URL (default: https://api.elydora.com)
132
+ ttl_ms=30000, # Operation TTL in ms (default: 30000)
133
+ max_retries=3, # Max retries on transient failures (default: 3)
134
+ token="<jwt>", # Optional JWT bearer token
135
+ )
136
+ ```
137
+
138
+ ### Authentication
139
+
140
+ ```python
141
+ # Register a new user and organization
142
+ reg = ElydoraClient.register(base_url, email, password, display_name=None, org_name=None)
143
+
144
+ # Login and receive a JWT
145
+ auth = ElydoraClient.login(base_url, email, password)
146
+ ```
147
+
148
+ ### Operations
149
+
150
+ ```python
151
+ # Create a signed EOR locally (no network call)
152
+ eor = client.create_operation(
153
+ operation_type="inference",
154
+ subject={"model": "gpt-4"},
155
+ action={"type": "completion"},
156
+ payload={"prompt": "Hello"},
157
+ )
158
+
159
+ # Submit to API
160
+ response = client.submit_operation(eor)
161
+
162
+ # Retrieve an operation
163
+ op = client.get_operation(operation_id)
164
+
165
+ # Verify integrity
166
+ result = client.verify_operation(operation_id)
167
+ ```
168
+
169
+ ### Agent Management
170
+
171
+ ```python
172
+ # Register a new agent
173
+ agent = client.register_agent({
174
+ "agent_id": "my-agent",
175
+ "display_name": "My Agent",
176
+ "responsible_entity": "team@example.com",
177
+ "keys": [{"kid": "key-v1", "public_key": "<base64url>", "algorithm": "ed25519"}],
178
+ })
179
+
180
+ # Get agent details
181
+ details = client.get_agent(agent_id)
182
+
183
+ # Freeze an agent
184
+ client.freeze_agent(agent_id, reason="security review")
185
+
186
+ # Revoke a key
187
+ client.revoke_key(agent_id, kid, reason="key rotation")
188
+ ```
189
+
190
+ ### Audit
191
+
192
+ ```python
193
+ import time
194
+
195
+ results = client.query_audit(
196
+ agent_id="agent-123",
197
+ operation_type="inference",
198
+ start_time=int(time.time() * 1000) - 86400000,
199
+ end_time=int(time.time() * 1000),
200
+ limit=50,
201
+ )
202
+ ```
203
+
204
+ ### Epochs
205
+
206
+ ```python
207
+ epochs = client.list_epochs()
208
+ epoch = client.get_epoch(epoch_id)
209
+ ```
210
+
211
+ ### Exports
212
+
213
+ ```python
214
+ export = client.create_export(
215
+ start_time=start,
216
+ end_time=end,
217
+ format="json",
218
+ )
219
+
220
+ exports = client.list_exports()
221
+ detail = client.get_export(export_id)
222
+ ```
223
+
224
+ ### JWKS
225
+
226
+ ```python
227
+ jwks = client.get_jwks()
228
+ ```
229
+
230
+ ## Error Handling
231
+
232
+ ```python
233
+ from elydora import ElydoraError
234
+
235
+ try:
236
+ client.submit_operation(eor)
237
+ except ElydoraError as e:
238
+ print(e.code) # e.g. "INVALID_SIGNATURE"
239
+ print(e.message) # Human-readable message
240
+ print(e.status_code) # HTTP status code
241
+ print(e.request_id) # Request ID for support
242
+ ```
243
+
244
+ ## Dependencies
245
+
246
+ - [requests](https://pypi.org/project/requests/) - Sync HTTP client
247
+ - [aiohttp](https://pypi.org/project/aiohttp/) - Async HTTP client
248
+ - [cryptography](https://pypi.org/project/cryptography/) - Ed25519 signing
249
+
250
+ ## License
251
+
252
+ MIT
@@ -0,0 +1,226 @@
1
+ # Elydora Python SDK
2
+
3
+ Official Python SDK for the [Elydora](https://elydora.com) tamper-evident audit platform. Build cryptographically verifiable audit trails for AI agent operations.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pip install elydora
9
+ ```
10
+
11
+ Requires Python 3.9+.
12
+
13
+ ## Quick Start
14
+
15
+ ```python
16
+ from elydora import ElydoraClient
17
+
18
+ # Authenticate
19
+ auth = ElydoraClient.login("https://api.elydora.com", "user@example.com", "password")
20
+
21
+ # Create client
22
+ client = ElydoraClient(
23
+ org_id=auth["user"]["org_id"],
24
+ agent_id="my-agent-id",
25
+ private_key="<base64url-encoded-ed25519-seed>",
26
+ base_url="https://api.elydora.com",
27
+ token=auth["token"],
28
+ )
29
+
30
+ # Create and submit an operation
31
+ eor = client.create_operation(
32
+ operation_type="data.access",
33
+ subject={"user_id": "u-123", "resource": "patient-record"},
34
+ action={"type": "read", "scope": "full"},
35
+ payload={"record_id": "rec-456"},
36
+ )
37
+ response = client.submit_operation(eor)
38
+ print("Receipt:", response["receipt"]["receipt_id"])
39
+ ```
40
+
41
+ ## Async Support
42
+
43
+ ```python
44
+ from elydora import AsyncElydoraClient
45
+
46
+ async def main():
47
+ client = AsyncElydoraClient(
48
+ org_id="org-123",
49
+ agent_id="agent-456",
50
+ private_key="<base64url-encoded-ed25519-seed>",
51
+ token="<jwt-token>",
52
+ )
53
+
54
+ eor = client.create_operation(
55
+ operation_type="inference",
56
+ subject={"model": "gpt-4"},
57
+ action={"type": "completion"},
58
+ )
59
+ response = await client.submit_operation(eor)
60
+ await client.close()
61
+ ```
62
+
63
+ ## CLI
64
+
65
+ The SDK includes a CLI for installing audit hooks into AI coding agents.
66
+
67
+ ```bash
68
+ elydora install \
69
+ --agent claudecode \
70
+ --org_id org-123 \
71
+ --agent_id agent-456 \
72
+ --private_key <key> \
73
+ --kid agent-456-key-v1
74
+ ```
75
+
76
+ ### Commands
77
+
78
+ | Command | Description |
79
+ |---------|-------------|
80
+ | `elydora install` | Install Elydora audit hook for a coding agent |
81
+ | `elydora uninstall` | Remove Elydora audit hook for a coding agent |
82
+ | `elydora status` | Show installation status for all agents |
83
+ | `elydora agents` | List supported coding agents |
84
+
85
+ ### Supported Agents
86
+
87
+ | Agent | Key |
88
+ |-------|-----|
89
+ | Claude Code | `claudecode` |
90
+ | Cursor | `cursor` |
91
+ | Gemini CLI | `gemini` |
92
+ | Augment Code | `augment` |
93
+ | Kiro | `kiro` |
94
+ | OpenCode | `opencode` |
95
+
96
+ ## API Reference
97
+
98
+ ### Configuration
99
+
100
+ ```python
101
+ client = ElydoraClient(
102
+ org_id="org-123", # Organization ID
103
+ agent_id="agent-456", # Agent ID
104
+ private_key="<seed>", # Base64url-encoded Ed25519 seed
105
+ base_url="https://...", # API base URL (default: https://api.elydora.com)
106
+ ttl_ms=30000, # Operation TTL in ms (default: 30000)
107
+ max_retries=3, # Max retries on transient failures (default: 3)
108
+ token="<jwt>", # Optional JWT bearer token
109
+ )
110
+ ```
111
+
112
+ ### Authentication
113
+
114
+ ```python
115
+ # Register a new user and organization
116
+ reg = ElydoraClient.register(base_url, email, password, display_name=None, org_name=None)
117
+
118
+ # Login and receive a JWT
119
+ auth = ElydoraClient.login(base_url, email, password)
120
+ ```
121
+
122
+ ### Operations
123
+
124
+ ```python
125
+ # Create a signed EOR locally (no network call)
126
+ eor = client.create_operation(
127
+ operation_type="inference",
128
+ subject={"model": "gpt-4"},
129
+ action={"type": "completion"},
130
+ payload={"prompt": "Hello"},
131
+ )
132
+
133
+ # Submit to API
134
+ response = client.submit_operation(eor)
135
+
136
+ # Retrieve an operation
137
+ op = client.get_operation(operation_id)
138
+
139
+ # Verify integrity
140
+ result = client.verify_operation(operation_id)
141
+ ```
142
+
143
+ ### Agent Management
144
+
145
+ ```python
146
+ # Register a new agent
147
+ agent = client.register_agent({
148
+ "agent_id": "my-agent",
149
+ "display_name": "My Agent",
150
+ "responsible_entity": "team@example.com",
151
+ "keys": [{"kid": "key-v1", "public_key": "<base64url>", "algorithm": "ed25519"}],
152
+ })
153
+
154
+ # Get agent details
155
+ details = client.get_agent(agent_id)
156
+
157
+ # Freeze an agent
158
+ client.freeze_agent(agent_id, reason="security review")
159
+
160
+ # Revoke a key
161
+ client.revoke_key(agent_id, kid, reason="key rotation")
162
+ ```
163
+
164
+ ### Audit
165
+
166
+ ```python
167
+ import time
168
+
169
+ results = client.query_audit(
170
+ agent_id="agent-123",
171
+ operation_type="inference",
172
+ start_time=int(time.time() * 1000) - 86400000,
173
+ end_time=int(time.time() * 1000),
174
+ limit=50,
175
+ )
176
+ ```
177
+
178
+ ### Epochs
179
+
180
+ ```python
181
+ epochs = client.list_epochs()
182
+ epoch = client.get_epoch(epoch_id)
183
+ ```
184
+
185
+ ### Exports
186
+
187
+ ```python
188
+ export = client.create_export(
189
+ start_time=start,
190
+ end_time=end,
191
+ format="json",
192
+ )
193
+
194
+ exports = client.list_exports()
195
+ detail = client.get_export(export_id)
196
+ ```
197
+
198
+ ### JWKS
199
+
200
+ ```python
201
+ jwks = client.get_jwks()
202
+ ```
203
+
204
+ ## Error Handling
205
+
206
+ ```python
207
+ from elydora import ElydoraError
208
+
209
+ try:
210
+ client.submit_operation(eor)
211
+ except ElydoraError as e:
212
+ print(e.code) # e.g. "INVALID_SIGNATURE"
213
+ print(e.message) # Human-readable message
214
+ print(e.status_code) # HTTP status code
215
+ print(e.request_id) # Request ID for support
216
+ ```
217
+
218
+ ## Dependencies
219
+
220
+ - [requests](https://pypi.org/project/requests/) - Sync HTTP client
221
+ - [aiohttp](https://pypi.org/project/aiohttp/) - Async HTTP client
222
+ - [cryptography](https://pypi.org/project/cryptography/) - Ed25519 signing
223
+
224
+ ## License
225
+
226
+ MIT
@@ -0,0 +1,86 @@
1
+ """Elydora Python SDK — tamper-evident audit trail for AI agents."""
2
+
3
+ from .client import ElydoraClient
4
+ from .async_client import AsyncElydoraClient
5
+ from .errors import ElydoraError
6
+ from .crypto import (
7
+ compute_chain_hash,
8
+ compute_payload_hash,
9
+ jcs_canonicalize,
10
+ sha256_base64url,
11
+ sign_ed25519,
12
+ sign_eor,
13
+ get_public_key_base64url,
14
+ )
15
+ from .utils import base64url_encode, base64url_decode, generate_nonce, generate_uuidv7
16
+ from .types import (
17
+ EOR,
18
+ EAR,
19
+ Agent,
20
+ AgentKey,
21
+ Operation,
22
+ Receipt,
23
+ Epoch,
24
+ Export,
25
+ Organization,
26
+ User,
27
+ RegisterAgentRequest,
28
+ RegisterAgentResponse,
29
+ GetAgentResponse,
30
+ SubmitOperationResponse,
31
+ GetOperationResponse,
32
+ VerifyOperationResponse,
33
+ AuditQueryResponse,
34
+ GetEpochResponse,
35
+ ListEpochsResponse,
36
+ CreateExportResponse,
37
+ GetExportResponse,
38
+ ListExportsResponse,
39
+ JWKSResponse,
40
+ AuthRegisterResponse,
41
+ AuthLoginResponse,
42
+ )
43
+
44
+ __version__ = "1.0.0"
45
+
46
+ __all__ = [
47
+ "ElydoraClient",
48
+ "AsyncElydoraClient",
49
+ "ElydoraError",
50
+ "compute_chain_hash",
51
+ "compute_payload_hash",
52
+ "jcs_canonicalize",
53
+ "sha256_base64url",
54
+ "sign_ed25519",
55
+ "sign_eor",
56
+ "get_public_key_base64url",
57
+ "base64url_encode",
58
+ "base64url_decode",
59
+ "generate_nonce",
60
+ "generate_uuidv7",
61
+ "EOR",
62
+ "EAR",
63
+ "Agent",
64
+ "AgentKey",
65
+ "Operation",
66
+ "Receipt",
67
+ "Epoch",
68
+ "Export",
69
+ "Organization",
70
+ "User",
71
+ "RegisterAgentRequest",
72
+ "RegisterAgentResponse",
73
+ "GetAgentResponse",
74
+ "SubmitOperationResponse",
75
+ "GetOperationResponse",
76
+ "VerifyOperationResponse",
77
+ "AuditQueryResponse",
78
+ "GetEpochResponse",
79
+ "ListEpochsResponse",
80
+ "CreateExportResponse",
81
+ "GetExportResponse",
82
+ "ListExportsResponse",
83
+ "JWKSResponse",
84
+ "AuthRegisterResponse",
85
+ "AuthLoginResponse",
86
+ ]