gargoyle-receipts 0.5.1.dev0__tar.gz → 0.5.2.dev0__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.
- {gargoyle_receipts-0.5.1.dev0/gargoyle_receipts.egg-info → gargoyle_receipts-0.5.2.dev0}/PKG-INFO +2 -2
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/README.md +1 -1
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/entra_login.py +11 -5
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0/gargoyle_receipts.egg-info}/PKG-INFO +2 -2
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/pyproject.toml +1 -1
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_entra_login.py +9 -1
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/LICENSE +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/NOTICE +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/__init__.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/approval.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/approver_cli.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/approver_trust.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/cli.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/consumer.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/envelope.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/evidence.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/execution.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/fs_server.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/identity.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/issuer.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/issuer_service.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/jws.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/key_record_source.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/mcp_server.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/notify.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/opa.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/pending_store.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/policy.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/published_record_source.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/replay_cache.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/rules.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/static/approve.html +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/static/approve.js +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/verifier.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle_receipts.egg-info/SOURCES.txt +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle_receipts.egg-info/dependency_links.txt +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle_receipts.egg-info/entry_points.txt +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle_receipts.egg-info/requires.txt +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle_receipts.egg-info/top_level.txt +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/setup.cfg +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_annotations.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_approver_cli.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_canonical.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_cli.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_console_js.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_consumer.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_entra_identity.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_evidence.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_execution.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_fs_server.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_identity.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_issuer_service.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_jws.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_mcp_proxy.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_mcp_self_issue.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_mcp_server.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_notify.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_opa.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_policy.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_published_record.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_rules.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_stdio_encoding.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_threshold.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_typescript_conformance.py +0 -0
- {gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_wire_spec.py +0 -0
{gargoyle_receipts-0.5.1.dev0/gargoyle_receipts.egg-info → gargoyle_receipts-0.5.2.dev0}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gargoyle-receipts
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2.dev0
|
|
4
4
|
Summary: Signed, single-use, argument-bound receipts and human-approval holds for agent tool calls.
|
|
5
5
|
Author: Justin LaPorte
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -59,7 +59,7 @@ your MCP server and lets through only what both agreed to.
|
|
|
59
59
|
|
|
60
60
|
[](https://pypi.org/project/gargoyle-receipts/)
|
|
61
61
|
|
|
62
|
-
Status: pre-release (`0.5.
|
|
62
|
+
Status: pre-release (`0.5.2.dev0`, on PyPI as `gargoyle-receipts`). The wire format is `gargoyle/3` and may
|
|
63
63
|
still change before the first release; it is specified in [SPEC.md](SPEC.md).
|
|
64
64
|
|
|
65
65
|
## What a receipt gives you
|
|
@@ -21,7 +21,7 @@ your MCP server and lets through only what both agreed to.
|
|
|
21
21
|
|
|
22
22
|
[](https://pypi.org/project/gargoyle-receipts/)
|
|
23
23
|
|
|
24
|
-
Status: pre-release (`0.5.
|
|
24
|
+
Status: pre-release (`0.5.2.dev0`, on PyPI as `gargoyle-receipts`). The wire format is `gargoyle/3` and may
|
|
25
25
|
still change before the first release; it is specified in [SPEC.md](SPEC.md).
|
|
26
26
|
|
|
27
27
|
## What a receipt gives you
|
|
@@ -73,13 +73,19 @@ def public_roots_http():
|
|
|
73
73
|
"""A requests session that trusts the public CA roots (certifi) whatever
|
|
74
74
|
REQUESTS_CA_BUNDLE says. A deployment pins the issuer's private CA with
|
|
75
75
|
that variable; Entra's endpoints are not signed by it, so the two trust
|
|
76
|
-
domains must not share one setting.
|
|
77
|
-
|
|
76
|
+
domains must not share one setting. requests applies the environment
|
|
77
|
+
bundle per request and lets it beat Session.verify, so the override is
|
|
78
|
+
made per request too. Proxies from the environment still apply."""
|
|
78
79
|
import certifi
|
|
79
80
|
import requests
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
|
|
82
|
+
class PublicRootsSession(requests.Session):
|
|
83
|
+
def request(self, method, url, **kwargs):
|
|
84
|
+
if kwargs.get("verify") in (None, True):
|
|
85
|
+
kwargs["verify"] = certifi.where()
|
|
86
|
+
return super().request(method, url, **kwargs)
|
|
87
|
+
|
|
88
|
+
return PublicRootsSession()
|
|
83
89
|
|
|
84
90
|
|
|
85
91
|
def _app(tenant: str, client_id: str, cache: TokenCache, app_factory: Optional[Callable] = None) -> Any:
|
{gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0/gargoyle_receipts.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gargoyle-receipts
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.2.dev0
|
|
4
4
|
Summary: Signed, single-use, argument-bound receipts and human-approval holds for agent tool calls.
|
|
5
5
|
Author: Justin LaPorte
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -59,7 +59,7 @@ your MCP server and lets through only what both agreed to.
|
|
|
59
59
|
|
|
60
60
|
[](https://pypi.org/project/gargoyle-receipts/)
|
|
61
61
|
|
|
62
|
-
Status: pre-release (`0.5.
|
|
62
|
+
Status: pre-release (`0.5.2.dev0`, on PyPI as `gargoyle-receipts`). The wire format is `gargoyle/3` and may
|
|
63
63
|
still change before the first release; it is specified in [SPEC.md](SPEC.md).
|
|
64
64
|
|
|
65
65
|
## What a receipt gives you
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "gargoyle-receipts"
|
|
7
|
-
version = "0.5.
|
|
7
|
+
version = "0.5.2.dev0"
|
|
8
8
|
description = "Signed, single-use, argument-bound receipts and human-approval holds for agent tool calls."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -148,7 +148,15 @@ def test_msal_gets_a_public_roots_http_client_and_is_built_lazily(tmp_path, monk
|
|
|
148
148
|
src = EntraTokenSource("t", "c", "s", str(cache), msal_module=CapturingMsal)
|
|
149
149
|
assert built == [] # constructed nothing yet
|
|
150
150
|
assert src.token() == "at-refreshed"
|
|
151
|
-
assert len(built) == 1
|
|
151
|
+
assert len(built) == 1 # one MSAL app, with our session
|
|
152
|
+
# Through requests' own environment merge: the private CA in REQUESTS_CA_BUNDLE loses.
|
|
153
|
+
import requests
|
|
154
|
+
sent = {}
|
|
155
|
+
def fake_send(self, prep, **kw):
|
|
156
|
+
sent.update(kw); r = requests.Response(); r.status_code = 200; r._content = b"{}"; return r
|
|
157
|
+
monkeypatch.setattr(requests.Session, "send", fake_send)
|
|
158
|
+
built[0].get("https://login.microsoftonline.com/x/v2.0/.well-known/openid-configuration")
|
|
159
|
+
assert sent["verify"] == certifi.where()
|
|
152
160
|
|
|
153
161
|
# A tenant that cannot be reached is a refusal at call time, not a crash at startup.
|
|
154
162
|
class Unreachable(FakeMsal):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle/published_record_source.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/gargoyle_receipts.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_published_record.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gargoyle_receipts-0.5.1.dev0 → gargoyle_receipts-0.5.2.dev0}/tests/test_typescript_conformance.py
RENAMED
|
File without changes
|
|
File without changes
|