versine-agents 0.1.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.
@@ -0,0 +1,97 @@
1
+ # Logs
2
+ logs
3
+ *.log
4
+ .DS_Store
5
+ .source
6
+ npm-debug.log*
7
+
8
+ # Diagnostic reports (https://nodejs.org/api/report.html)
9
+ report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
10
+
11
+ # Runtime data
12
+ pids
13
+ *.pid
14
+ *.seed
15
+ *.pid.lock
16
+
17
+ # Coverage directory used by tools like istanbul
18
+ coverage
19
+ *.lcov
20
+
21
+ # Compiled binary addons (https://nodejs.org/api/addons.html)
22
+ build/Release
23
+
24
+ # Dependency directories
25
+ node_modules/
26
+
27
+ # TypeScript cache
28
+ *.tsbuildinfo
29
+
30
+ # Optional npm cache directory
31
+ .npm
32
+
33
+ # Optional eslint cache
34
+ .eslintcache
35
+
36
+ # Optional REPL history
37
+ .node_repl_history
38
+
39
+ # Output of 'npm pack'
40
+ *.tgz
41
+
42
+ # dotenv environment variable files
43
+ .env
44
+ .env.*
45
+ !.env.example
46
+
47
+ # parcel-bundler cache (https://parceljs.org/)
48
+ .cache
49
+ .parcel-cache
50
+
51
+ # Next.js build output
52
+ .next
53
+ .next-build
54
+ out
55
+ dist
56
+ .output
57
+
58
+ credentials.json
59
+ *.p8
60
+ *.p12
61
+ *service-account*.json
62
+ *serviceAccount*.json
63
+
64
+ # Vite files
65
+ vite.config.js.timestamp-*
66
+ vite.config.ts.timestamp-*
67
+ .vite/
68
+
69
+ # Local service-catalog cache/state (may contain account metadata).
70
+ .projects/
71
+ .vercel
72
+
73
+ # Cloudflare CLI local cache
74
+ .cloudflare/
75
+
76
+ # Turborepo
77
+ .turbo
78
+
79
+ # Playwright
80
+ test-results/
81
+ playwright-report/
82
+ infra/**/.build/
83
+ .terraform/
84
+ # Bootstrap state is local (it creates the state buckets); nothing else is.
85
+ *.tfstate
86
+ *.tfstate.*
87
+ terraform.tfstate.d/
88
+
89
+ # Python
90
+ .venv/
91
+ __pycache__/
92
+ .pytest_cache/
93
+ .mypy_cache/
94
+ .ruff_cache/
95
+
96
+ # Local development data (agent key, credentials)
97
+ .dev/
@@ -0,0 +1,415 @@
1
+ # This Pylint rcfile contains a best-effort configuration to uphold the
2
+ # best-practices and style described in the Google Python style guide:
3
+ # https://google.github.io/styleguide/pyguide.html
4
+ #
5
+ # Its canonical open-source location is:
6
+ # https://google.github.io/styleguide/pylintrc
7
+
8
+ # Copyright 2018 Google LLC
9
+ #
10
+ # Licensed under the Apache License, Version 2.0 (the "License");
11
+ # you may not use this file except in compliance with the License.
12
+ # You may obtain a copy of the License at
13
+ #
14
+ # http://www.apache.org/licenses/LICENSE-2.0
15
+ #
16
+ # Unless required by applicable law or agreed to in writing, software
17
+ # distributed under the License is distributed on an "AS IS" BASIS,
18
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
+ # See the License for the specific language governing permissions and
20
+ # limitations under the License.
21
+
22
+ [MAIN]
23
+
24
+ # Files or directories to be skipped. They should be base names, not paths.
25
+ ignore=third_party
26
+
27
+ # Files or directories matching the regex patterns are skipped. The regex
28
+ # matches against base names, not paths.
29
+ ignore-patterns=
30
+
31
+ # Pickle collected data for later comparisons.
32
+ persistent=no
33
+
34
+ # List of plugins (as comma separated values of python modules names) to load,
35
+ # usually to register additional checkers.
36
+ load-plugins=
37
+
38
+ # Use multiple processes to speed up Pylint.
39
+ jobs=4
40
+
41
+ # Allow loading of arbitrary C extensions. Extensions are imported into the
42
+ # active Python interpreter and may run arbitrary code.
43
+ unsafe-load-any-extension=no
44
+
45
+
46
+ [MESSAGES CONTROL]
47
+
48
+ # Only show warnings with the listed confidence levels. Leave empty to show
49
+ # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
50
+ confidence=
51
+
52
+ # Enable the message, report, category or checker with the given id(s). You can
53
+ # either give multiple identifier separated by comma (,) or put this option
54
+ # multiple time (only on the command line, not in the configuration file where
55
+ # it should appear only once). See also the "--disable" option for examples.
56
+ #enable=
57
+
58
+ # Disable the message, report, category or checker with the given id(s). You
59
+ # can either give multiple identifiers separated by comma (,) or put this
60
+ # option multiple times (only on the command line, not in the configuration
61
+ # file where it should appear only once).You can also use "--disable=all" to
62
+ # disable everything first and then reenable specific checks. For example, if
63
+ # you want to run only the similarities checker, you can use "--disable=all
64
+ # --enable=similarities". If you want to run only the classes checker, but have
65
+ # no Warning level messages displayed, use"--disable=all --enable=classes
66
+ # --disable=W"
67
+ disable=R,
68
+ abstract-method,
69
+ apply-builtin,
70
+ arguments-differ,
71
+ attribute-defined-outside-init,
72
+ backtick,
73
+ bad-option-value,
74
+ basestring-builtin,
75
+ buffer-builtin,
76
+ c-extension-no-member,
77
+ consider-using-enumerate,
78
+ cmp-builtin,
79
+ cmp-method,
80
+ coerce-builtin,
81
+ coerce-method,
82
+ delslice-method,
83
+ div-method,
84
+ eq-without-hash,
85
+ execfile-builtin,
86
+ file-builtin,
87
+ filter-builtin-not-iterating,
88
+ fixme,
89
+ getslice-method,
90
+ global-statement,
91
+ hex-method,
92
+ idiv-method,
93
+ implicit-str-concat,
94
+ import-error,
95
+ import-self,
96
+ import-star-module-level,
97
+ input-builtin,
98
+ intern-builtin,
99
+ invalid-str-codec,
100
+ locally-disabled,
101
+ long-builtin,
102
+ long-suffix,
103
+ map-builtin-not-iterating,
104
+ misplaced-comparison-constant,
105
+ missing-function-docstring,
106
+ metaclass-assignment,
107
+ next-method-called,
108
+ next-method-defined,
109
+ no-absolute-import,
110
+ no-init, # added
111
+ no-member,
112
+ no-name-in-module,
113
+ no-self-use,
114
+ nonzero-method,
115
+ oct-method,
116
+ old-division,
117
+ old-ne-operator,
118
+ old-octal-literal,
119
+ old-raise-syntax,
120
+ parameter-unpacking,
121
+ print-statement,
122
+ raising-string,
123
+ range-builtin-not-iterating,
124
+ raw_input-builtin,
125
+ rdiv-method,
126
+ reduce-builtin,
127
+ relative-import,
128
+ reload-builtin,
129
+ round-builtin,
130
+ setslice-method,
131
+ signature-differs,
132
+ standarderror-builtin,
133
+ suppressed-message,
134
+ sys-max-int,
135
+ trailing-newlines,
136
+ unichr-builtin,
137
+ unicode-builtin,
138
+ unnecessary-pass,
139
+ unpacking-in-except,
140
+ useless-else-on-loop,
141
+ useless-suppression,
142
+ using-cmp-argument,
143
+ wrong-import-order,
144
+ xrange-builtin,
145
+ zip-builtin-not-iterating,
146
+
147
+
148
+ [REPORTS]
149
+
150
+ # Set the output format. Available formats are text, parseable, colorized, msvs
151
+ # (visual studio) and html. You can also give a reporter class, eg
152
+ # mypackage.mymodule.MyReporterClass.
153
+ output-format=text
154
+
155
+ # Tells whether to display a full report or only the messages
156
+ reports=no
157
+
158
+ # Activate the evaluation score.
159
+ score=no
160
+
161
+ # Python expression which should return a note less than 10 (10 is the highest
162
+ # note). You have access to the variables errors warning, statement which
163
+ # respectively contain the number of errors / warnings messages and the total
164
+ # number of statements analyzed. This is used by the global evaluation report
165
+ # (RP0004).
166
+ evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
167
+
168
+ # Template used to display messages. This is a python new-style format string
169
+ # used to format the message information. See doc for all details
170
+ #msg-template=
171
+
172
+
173
+ [BASIC]
174
+
175
+ # Good variable names which should always be accepted, separated by a comma
176
+ good-names=main,_
177
+
178
+ # Bad variable names which should always be refused, separated by a comma
179
+ bad-names=
180
+
181
+ # Colon-delimited sets of names that determine each other's naming style when
182
+ # the name regexes allow several styles.
183
+ name-group=
184
+
185
+ # Include a hint for the correct naming format with invalid-name
186
+ include-naming-hint=no
187
+
188
+ # List of decorators that produce properties, such as abc.abstractproperty. Add
189
+ # to this list to register other decorators that produce valid properties.
190
+ property-classes=abc.abstractproperty,cached_property.cached_property,cached_property.threaded_cached_property,cached_property.cached_property_with_ttl,cached_property.threaded_cached_property_with_ttl
191
+
192
+ # Regular expression matching correct function names
193
+ function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*)|(?P<snake_case>_?[a-z][a-z0-9_]*))$
194
+
195
+ # Regular expression matching correct variable names
196
+ variable-rgx=^[a-z][a-z0-9_]*$
197
+
198
+ # Regular expression matching correct constant names
199
+ const-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
200
+
201
+ # Regular expression matching correct attribute names
202
+ attr-rgx=^_{0,2}[a-z][a-z0-9_]*$
203
+
204
+ # Regular expression matching correct argument names
205
+ argument-rgx=^[a-z][a-z0-9_]*$
206
+
207
+ # Regular expression matching correct class attribute names
208
+ class-attribute-rgx=^(_?[A-Z][A-Z0-9_]*|__[a-z0-9_]+__|_?[a-z][a-z0-9_]*)$
209
+
210
+ # Regular expression matching correct inline iteration names
211
+ inlinevar-rgx=^[a-z][a-z0-9_]*$
212
+
213
+ # Regular expression matching correct class names
214
+ class-rgx=^_?[A-Z][a-zA-Z0-9]*$
215
+
216
+ # Regular expression matching correct module names
217
+ module-rgx=^(_?[a-z][a-z0-9_]*|__init__)$
218
+
219
+ # Regular expression matching correct method names
220
+ method-rgx=(?x)^(?:(?P<exempt>_[a-z0-9_]+__|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass|(test|assert)_*[A-Z0-9][a-zA-Z0-9_]*|next)|(?P<camel_case>_{0,2}[A-Z][a-zA-Z0-9_]*)|(?P<snake_case>_{0,2}[a-z][a-z0-9_]*))$
221
+
222
+ # Regular expression which should only match function or class names that do
223
+ # not require a docstring.
224
+ no-docstring-rgx=(__.*__|main|test.*|.*test|.*Test)$
225
+
226
+ # Minimum line length for functions/classes that require docstrings, shorter
227
+ # ones are exempt.
228
+ docstring-min-length=12
229
+
230
+
231
+ [TYPECHECK]
232
+
233
+ # List of decorators that produce context managers, such as
234
+ # contextlib.contextmanager. Add to this list to register other decorators that
235
+ # produce valid context managers.
236
+ contextmanager-decorators=contextlib.contextmanager,contextlib2.contextmanager
237
+
238
+ # List of module names for which member attributes should not be checked
239
+ # (useful for modules/projects where namespaces are manipulated during runtime
240
+ # and thus existing member attributes cannot be deduced by static analysis. It
241
+ # supports qualified module names, as well as Unix pattern matching.
242
+ ignored-modules=
243
+
244
+ # List of class names for which member attributes should not be checked (useful
245
+ # for classes with dynamically set attributes). This supports the use of
246
+ # qualified names.
247
+ ignored-classes=optparse.Values,thread._local,_thread._local
248
+
249
+ # List of members which are set dynamically and missed by pylint inference
250
+ # system, and so shouldn't trigger E1101 when accessed. Python regular
251
+ # expressions are accepted.
252
+ generated-members=
253
+
254
+
255
+ [FORMAT]
256
+
257
+ # Maximum number of characters on a single line.
258
+ max-line-length=80
259
+
260
+ # TODO(https://github.com/pylint-dev/pylint/issues/3352): Direct pylint to exempt
261
+ # lines made too long by directives to pytype.
262
+
263
+ # Regexp for a line that is allowed to be longer than the limit.
264
+ ignore-long-lines=(?x)(
265
+ ^\s*(\#\ )?<?https?://\S+>?$|
266
+ ^\s*(from\s+\S+\s+)?import\s+.+$)
267
+
268
+ # Allow the body of an if to be on the same line as the test if there is no
269
+ # else.
270
+ single-line-if-stmt=yes
271
+
272
+ # Maximum number of lines in a module
273
+ max-module-lines=99999
274
+
275
+ # String used as indentation unit. The internal Google style guide mandates 2
276
+ # spaces. Google's externaly-published style guide says 4, consistent with
277
+ # PEP 8.
278
+ indent-string=' '
279
+
280
+ # Number of spaces of indent required inside a hanging or continued line.
281
+ indent-after-paren=4
282
+
283
+ # Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
284
+ expected-line-ending-format=
285
+
286
+
287
+ [MISCELLANEOUS]
288
+
289
+ # List of note tags to take in consideration, separated by a comma.
290
+ notes=TODO
291
+
292
+
293
+ [STRING]
294
+
295
+ # This flag controls whether inconsistent-quotes generates a warning when the
296
+ # character used as a quote delimiter is used inconsistently within a module.
297
+ check-quote-consistency=yes
298
+
299
+
300
+ [VARIABLES]
301
+
302
+ # Tells whether we should check for unused import in __init__ files.
303
+ init-import=no
304
+
305
+ # A regular expression matching the name of dummy variables (i.e. expectedly
306
+ # not used).
307
+ dummy-variables-rgx=^\*{0,2}(_$|unused_|dummy_)
308
+
309
+ # List of additional names supposed to be defined in builtins. Remember that
310
+ # you should avoid to define new builtins when possible.
311
+ additional-builtins=
312
+
313
+ # List of strings which can identify a callback function by name. A callback
314
+ # name must start or end with one of those strings.
315
+ callbacks=cb_,_cb
316
+
317
+ # List of qualified module names which can have objects that can redefine
318
+ # builtins.
319
+ redefining-builtins-modules=six,six.moves,past.builtins,future.builtins,functools
320
+
321
+
322
+ [LOGGING]
323
+
324
+ # Logging modules to check that the string format arguments are in logging
325
+ # function parameter format
326
+ logging-modules=logging,absl.logging,tensorflow.io.logging
327
+
328
+
329
+ [SIMILARITIES]
330
+
331
+ # Minimum lines number of a similarity.
332
+ min-similarity-lines=4
333
+
334
+ # Ignore comments when computing similarities.
335
+ ignore-comments=yes
336
+
337
+ # Ignore docstrings when computing similarities.
338
+ ignore-docstrings=yes
339
+
340
+ # Ignore imports when computing similarities.
341
+ ignore-imports=no
342
+
343
+
344
+ [SPELLING]
345
+
346
+ # Spelling dictionary name. Available dictionaries: none. To make it working
347
+ # install python-enchant package.
348
+ spelling-dict=
349
+
350
+ # List of comma separated words that should not be checked.
351
+ spelling-ignore-words=
352
+
353
+ # A path to a file that contains private dictionary; one word per line.
354
+ spelling-private-dict-file=
355
+
356
+ # Tells whether to store unknown words to indicated private dictionary in
357
+ # --spelling-private-dict-file option instead of raising a message.
358
+ spelling-store-unknown-words=no
359
+
360
+
361
+ [IMPORTS]
362
+
363
+ # Deprecated modules which should not be used, separated by a comma
364
+ deprecated-modules=regsub,
365
+ TERMIOS,
366
+ Bastion,
367
+ rexec,
368
+ sets
369
+
370
+ # Create a graph of every (i.e. internal and external) dependencies in the
371
+ # given file (report RP0402 must not be disabled)
372
+ import-graph=
373
+
374
+ # Create a graph of external dependencies in the given file (report RP0402 must
375
+ # not be disabled)
376
+ ext-import-graph=
377
+
378
+ # Create a graph of internal dependencies in the given file (report RP0402 must
379
+ # not be disabled)
380
+ int-import-graph=
381
+
382
+ # Force import order to recognize a module as part of the standard
383
+ # compatibility libraries.
384
+ known-standard-library=
385
+
386
+ # Force import order to recognize a module as part of a third party library.
387
+ known-third-party=enchant, absl
388
+
389
+ # Analyse import fallback blocks. This can be used to support both Python 2 and
390
+ # 3 compatible code, which means that the block might have code that exists
391
+ # only in one or another interpreter, leading to false positives when analysed.
392
+ analyse-fallback-blocks=no
393
+
394
+
395
+ [CLASSES]
396
+
397
+ # List of method names used to declare (i.e. assign) instance attributes.
398
+ defining-attr-methods=__init__,
399
+ __new__,
400
+ setUp
401
+
402
+ # List of member names, which should be excluded from the protected access
403
+ # warning.
404
+ exclude-protected=_asdict,
405
+ _fields,
406
+ _replace,
407
+ _source,
408
+ _make
409
+
410
+ # List of valid names for the first argument in a class method.
411
+ valid-classmethod-first-arg=cls,
412
+ class_
413
+
414
+ # List of valid names for the first argument in a metaclass class method.
415
+ valid-metaclass-classmethod-first-arg=mcs
@@ -0,0 +1 @@
1
+ 3.14
@@ -0,0 +1,52 @@
1
+ Metadata-Version: 2.5
2
+ Name: versine-agents
3
+ Version: 0.1.0
4
+ Summary: Versine SDK for AI agents: sign assertions, verify users, request handshake codes.
5
+ License-Expression: MIT
6
+ Requires-Python: >=3.10
7
+ Requires-Dist: cryptography>=42
8
+ Requires-Dist: httpx>=0.27
9
+ Provides-Extra: aws
10
+ Requires-Dist: boto3>=1.34; extra == 'aws'
11
+ Provides-Extra: azure
12
+ Requires-Dist: azure-identity>=1.15; extra == 'azure'
13
+ Requires-Dist: azure-keyvault-keys>=4.9; extra == 'azure'
14
+ Provides-Extra: gcp
15
+ Requires-Dist: google-cloud-kms>=3; extra == 'gcp'
16
+ Description-Content-Type: text/markdown
17
+
18
+ # versine-agents
19
+
20
+ Server-side SDK for AI agents that integrate Versine.
21
+
22
+ ```sh
23
+ pip install versine-agents
24
+ uv add versine-agents
25
+ poetry add versine-agents
26
+ ```
27
+
28
+ For a key in a cloud key service, add the extra: `versine-agents[aws]`,
29
+ `[gcp]` or `[azure]`.
30
+
31
+ ```python
32
+ import versine_agents
33
+
34
+ with open("versine.pem") as f:
35
+ signer = versine_agents.local_signer(f.read())
36
+ versine = versine_agents.Versine(
37
+ client_id="ac_live_...",
38
+ key_id="key_...",
39
+ signer=signer,
40
+ )
41
+ assertion = versine.create_assertion(
42
+ versine_agents.AgentUser(sub="user_123", email="alice@example.com")
43
+ )
44
+ ```
45
+
46
+ Signers: `local_signer` (PEM or JWK), `versine_agents.aws.AwsKmsSigner`,
47
+ `versine_agents.gcp.GcpKmsSigner`, `versine_agents.azure.AzureKeyVaultSigner`,
48
+ or any object with `sign(data: bytes) -> bytes` returning a 64-byte ES256 signature.
49
+
50
+ The SDK follows the
51
+ [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html);
52
+ `pnpm lint` runs ruff and pylint with Google's pylintrc.
@@ -0,0 +1,35 @@
1
+ # versine-agents
2
+
3
+ Server-side SDK for AI agents that integrate Versine.
4
+
5
+ ```sh
6
+ pip install versine-agents
7
+ uv add versine-agents
8
+ poetry add versine-agents
9
+ ```
10
+
11
+ For a key in a cloud key service, add the extra: `versine-agents[aws]`,
12
+ `[gcp]` or `[azure]`.
13
+
14
+ ```python
15
+ import versine_agents
16
+
17
+ with open("versine.pem") as f:
18
+ signer = versine_agents.local_signer(f.read())
19
+ versine = versine_agents.Versine(
20
+ client_id="ac_live_...",
21
+ key_id="key_...",
22
+ signer=signer,
23
+ )
24
+ assertion = versine.create_assertion(
25
+ versine_agents.AgentUser(sub="user_123", email="alice@example.com")
26
+ )
27
+ ```
28
+
29
+ Signers: `local_signer` (PEM or JWK), `versine_agents.aws.AwsKmsSigner`,
30
+ `versine_agents.gcp.GcpKmsSigner`, `versine_agents.azure.AzureKeyVaultSigner`,
31
+ or any object with `sign(data: bytes) -> bytes` returning a 64-byte ES256 signature.
32
+
33
+ The SDK follows the
34
+ [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html);
35
+ `pnpm lint` runs ruff and pylint with Google's pylintrc.
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "@versine/sdk-python",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "lint": "uv run --frozen ruff check . && uv run --frozen ruff format --check . && uv run --frozen pylint --rcfile=.pylintrc src tests",
7
+ "test": "uv run --frozen pytest -q",
8
+ "typecheck": "uv run --frozen mypy"
9
+ }
10
+ }
@@ -0,0 +1,61 @@
1
+ [project]
2
+ name = "versine-agents"
3
+ version = "0.1.0"
4
+ description = "Versine SDK for AI agents: sign assertions, verify users, request handshake codes."
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ requires-python = ">=3.10"
8
+ dependencies = ["cryptography>=42", "httpx>=0.27"]
9
+
10
+ [project.optional-dependencies]
11
+ aws = ["boto3>=1.34"]
12
+ gcp = ["google-cloud-kms>=3"]
13
+ azure = ["azure-identity>=1.15", "azure-keyvault-keys>=4.9"]
14
+
15
+ [dependency-groups]
16
+ dev = ["pytest>=8", "pytest-asyncio>=0.24", "ruff>=0.8", "mypy>=1.13", "boto3>=1.34", "pylint>=3.3"]
17
+
18
+ [build-system]
19
+ requires = ["hatchling>=1.25"]
20
+ build-backend = "hatchling.build"
21
+
22
+ [tool.hatch.build.targets.wheel]
23
+ packages = ["src/versine_agents"]
24
+
25
+ # The Google Python Style Guide (https://google.github.io/styleguide/pyguide.html):
26
+ # 80 columns, one import per line sorted case-insensitively, Google docstrings.
27
+ # pylint runs with Google's own pylintrc (.pylintrc).
28
+ [tool.ruff]
29
+ line-length = 80
30
+ target-version = "py310"
31
+
32
+ [tool.ruff.lint]
33
+ select = ["E", "F", "I", "N", "UP", "B", "SIM", "RUF", "D", "TID"]
34
+
35
+ [tool.ruff.lint.isort]
36
+ force-single-line = true
37
+ force-sort-within-sections = true
38
+ case-sensitive = false
39
+ order-by-type = false
40
+ single-line-exclusions = ["typing", "collections.abc"]
41
+
42
+ [tool.ruff.lint.pydocstyle]
43
+ convention = "google"
44
+
45
+ [tool.ruff.lint.flake8-tidy-imports]
46
+ ban-relative-imports = "all"
47
+
48
+ [tool.ruff.lint.per-file-ignores]
49
+ # Tests are self-describing; docstrings are optional there.
50
+ "tests/*" = ["D"]
51
+
52
+ [tool.mypy]
53
+ strict = true
54
+ files = ["src"]
55
+
56
+ [[tool.mypy.overrides]]
57
+ module = ["boto3.*", "google.*", "azure.*"]
58
+ ignore_missing_imports = true
59
+
60
+ [tool.pytest.ini_options]
61
+ asyncio_mode = "auto"
@@ -0,0 +1,29 @@
1
+ """Versine SDK for AI agents.
2
+
3
+ The package re-exports its public API so callers can write
4
+ ``import versine_agents`` and use ``versine_agents.Versine``.
5
+ """
6
+
7
+ from versine_agents.client import AgentUser
8
+ from versine_agents.client import AsyncVersine
9
+ from versine_agents.client import Consent
10
+ from versine_agents.client import Versine
11
+ from versine_agents.client import VersineError
12
+ from versine_agents.jwt import sign_jwt
13
+ from versine_agents.signers import der_to_raw_signature
14
+ from versine_agents.signers import local_signer
15
+ from versine_agents.signers import LocalSigner
16
+ from versine_agents.signers import Signer
17
+
18
+ __all__ = [
19
+ "AgentUser",
20
+ "AsyncVersine",
21
+ "Consent",
22
+ "LocalSigner",
23
+ "Signer",
24
+ "Versine",
25
+ "VersineError",
26
+ "der_to_raw_signature",
27
+ "local_signer",
28
+ "sign_jwt",
29
+ ]