Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
167 commits
Select commit Hold shift + click to select a range
543dbe1
Specify request signing and key directories as Web Bot Auth
KonstantinMirin Oct 1, 2026
bff7451
Let the Broker sign its own re-packaged request instead of chaining
KonstantinMirin Oct 2, 2026
99e67a3
State that the Broker originates discovery and never forwards unchanged
KonstantinMirin Oct 2, 2026
50d862c
Add a pre-signing hook, CallError.code, typed request inputs and iden…
KonstantinMirin Oct 2, 2026
07ea886
Add a typed reason to request-signature refusals
KonstantinMirin Oct 2, 2026
c08610a
Describe the request-signature refusal reason wherever a signature re…
KonstantinMirin Oct 3, 2026
5490526
Make the Broker a purchase party with BrokerService.ExecuteTransaction
KonstantinMirin Oct 3, 2026
7e1db12
Add BrokerClient.Execute and a batch execute form to the three SDKs
KonstantinMirin Oct 3, 2026
6e4c850
Describe purchases through the Broker in the docs and changelogs
KonstantinMirin Oct 3, 2026
ef903d5
Say what WellKnownManifest.health_endpoint means and how a Broker pro…
KonstantinMirin Oct 3, 2026
2fa594d
Publish the generated JSON Schemas, with a strict variant, in the thr…
KonstantinMirin Oct 3, 2026
e5fe79d
Describe validating messages against the published JSON Schemas
KonstantinMirin Oct 3, 2026
867fb0f
Pin ErrorDetail binary decoding and value-before-debug with shared ve…
KonstantinMirin Oct 3, 2026
1053955
Decode ErrorDetail from the binary value in the Python SDK
KonstantinMirin Oct 3, 2026
1612e38
Add raw mode, strict decoding, delivery verification and an AdminClie…
KonstantinMirin Oct 3, 2026
d7b223a
Add a pre-signing hook, raw mode, strict decoding, CallError.Code and…
KonstantinMirin Oct 3, 2026
4ef70eb
Add an AdminClient to the Go SDK
KonstantinMirin Oct 3, 2026
22a61f8
Add identity helpers to the Go SDK
KonstantinMirin Oct 3, 2026
ad906bf
Describe the Go client's harness capabilities and map the new symbols
KonstantinMirin Oct 3, 2026
34329ad
Decode the binary ErrorDetail and expose the Connect code in the Type…
KonstantinMirin Oct 3, 2026
1ec12f8
Add identity helpers to the TypeScript SDK
KonstantinMirin Oct 3, 2026
242871a
Add a pre-signing hook, raw mode, strict decoding and delivery verifi…
KonstantinMirin Oct 3, 2026
33af8f9
Add an admin client to the TypeScript SDK
KonstantinMirin Oct 3, 2026
a663489
Build the TypeScript package with the JSON Schemas strict decoding im…
KonstantinMirin Oct 3, 2026
d058b75
Describe the TypeScript client's harness capabilities in its README
KonstantinMirin Oct 3, 2026
b35b767
Export DEFAULT_KEY_VALIDITY from fora_sdk and regenerate the parity m…
KonstantinMirin Oct 3, 2026
53808f7
Describe the SDK harness capabilities in the docs and changelogs
KonstantinMirin Oct 3, 2026
03b232c
Check error envelopes under strict decoding in the Go client
KonstantinMirin Oct 3, 2026
3d9e958
Check error envelopes under strict decoding in the Python SDK
KonstantinMirin Oct 3, 2026
bd084a1
Check error envelopes under strict decoding in the TypeScript client
KonstantinMirin Oct 3, 2026
429639c
Describe strict decoding of error envelopes in the docs and changelogs
KonstantinMirin Oct 3, 2026
91f2d21
Wait for refused sockets to close in the TypeScript reclaim test
KonstantinMirin Oct 3, 2026
3288f57
Add document readers and a public strict check to the Go SDK
KonstantinMirin Oct 3, 2026
db0cdc9
Add document readers and a public strict check to the Python SDK
KonstantinMirin Oct 3, 2026
6948941
Add document readers and a public strict check to the TypeScript SDK
KonstantinMirin Oct 3, 2026
848309b
Map the document readers and the strict check, and regenerate the par…
KonstantinMirin Oct 3, 2026
229210d
Describe the document readers and the strict check in the docs and ch…
KonstantinMirin Oct 3, 2026
fd3832d
Specify the edge discovery headers in the protocol
KonstantinMirin Oct 3, 2026
f085741
Read the edge discovery headers in the Go SDK
KonstantinMirin Oct 3, 2026
a9a79a1
Read the edge discovery headers in the Python SDK
KonstantinMirin Oct 3, 2026
6d21d4a
Read the edge discovery headers in the TypeScript SDK
KonstantinMirin Oct 3, 2026
e35dbb4
Map the discovery-hint helpers and regenerate the parity matrix
KonstantinMirin Oct 3, 2026
95d7999
Describe the edge discovery headers in the docs and changelogs
KonstantinMirin Oct 3, 2026
cd1c1d2
Mark the two scope-shortfall reasons as never sent in the protocol
KonstantinMirin Oct 3, 2026
7d36584
Stop presenting a scope shortfall as an absence reason in the Go SDK
KonstantinMirin Oct 3, 2026
0d35808
Stop presenting a scope shortfall as an absence reason in the Python SDK
KonstantinMirin Oct 3, 2026
162bdee
Stop presenting a scope shortfall as an absence reason in the TypeScr…
KonstantinMirin Oct 3, 2026
b29c27a
Describe existence hiding for scope shortfalls in the docs and change…
KonstantinMirin Oct 3, 2026
481fc42
Leave delivery URL verification to the edge in the Python SDK
KonstantinMirin Oct 3, 2026
934f7c9
Leave delivery URL verification to the edge in the Go SDK
KonstantinMirin Oct 3, 2026
4c7e25b
Leave delivery URL verification to the edge in the TypeScript SDK
KonstantinMirin Oct 3, 2026
65d52cf
Unmap the delivery verification symbols and regenerate the parity matrix
KonstantinMirin Oct 3, 2026
ddc2d39
Describe delivery URL verification as the edge's job in the docs and …
KonstantinMirin Oct 3, 2026
165c44f
Require a named requester in the protocol
KonstantinMirin Oct 3, 2026
af2103f
Refuse an acceptance that names no requester in the Go SDK
KonstantinMirin Oct 3, 2026
cf5314a
Refuse an acceptance that names no requester in the Python SDK
KonstantinMirin Oct 3, 2026
42d540e
Refuse an acceptance that names no requester in the TypeScript SDK
KonstantinMirin Oct 3, 2026
7bebc64
Map the empty-requester sentinel and regenerate the parity matrix
KonstantinMirin Oct 3, 2026
be28007
Describe the required requester in the docs and changelogs
KonstantinMirin Oct 3, 2026
4cd7028
Require an estimate on a metered offer and settle within a tolerance …
KonstantinMirin Oct 3, 2026
419fc8f
Settle metered usage and refuse an unestimated metered offer in the G…
KonstantinMirin Oct 3, 2026
c17f694
Settle metered usage and refuse an unestimated metered offer in the P…
KonstantinMirin Oct 3, 2026
e122a6f
Settle metered usage and refuse an unestimated metered offer in the T…
KonstantinMirin Oct 3, 2026
adc6b2f
Map the metered settlement symbols and regenerate the parity matrix
KonstantinMirin Oct 3, 2026
0558a48
Describe metered settlement in the docs and changelogs
KonstantinMirin Oct 3, 2026
d78e32f
Answer every per-item purchase denial in the body in the protocol
KonstantinMirin Oct 3, 2026
01b1ea2
Filter offers over the agent's budget at Resolve in the protocol
KonstantinMirin Oct 3, 2026
8feb25c
State the dispute refusal reasons in the protocol
KonstantinMirin Oct 3, 2026
4deaafa
Refuse a usage report for time, never for quantity, in the protocol
KonstantinMirin Oct 3, 2026
9d51bb8
Scope idempotency keys per caller and refuse a reused key in the prot…
KonstantinMirin Oct 3, 2026
04c4605
Leave total_cost unset across currencies in the protocol
KonstantinMirin Oct 3, 2026
8f345fc
Carry an offer's price once in the protocol
KonstantinMirin Oct 3, 2026
6893746
Carry an offer's price once in the Go SDK
KonstantinMirin Oct 3, 2026
0a36fc3
Carry an offer's price once in the Python SDK
KonstantinMirin Oct 3, 2026
dd3ca5b
Carry an offer's price once in the TypeScript SDK
KonstantinMirin Oct 3, 2026
83facf2
Map the one-price symbols and regenerate the parity matrix
KonstantinMirin Oct 3, 2026
e5856ef
Name the provider in the relayed-purchase denial in the protocol
KonstantinMirin Oct 3, 2026
106df98
Read an offer's price from Offer.pricing in the onboarding preview
KonstantinMirin Oct 3, 2026
0679481
Describe the purchase answers, the budget, reports and one offer pric…
KonstantinMirin Oct 3, 2026
55e0b0c
Make a metered offer's estimate optional in the protocol
KonstantinMirin Oct 4, 2026
8d3188c
Settle a metered price without an estimate in the Go SDK
KonstantinMirin Oct 4, 2026
ad72474
Settle a metered price without an estimate in the Python SDK
KonstantinMirin Oct 4, 2026
26e830c
Settle a metered price without an estimate in the TypeScript SDK
KonstantinMirin Oct 4, 2026
a6a2fac
Map the renamed metered-estimate sentinel and regenerate the parity m…
KonstantinMirin Oct 4, 2026
4266c01
Describe a metered offer without an estimate in the docs and changelogs
KonstantinMirin Oct 4, 2026
6b284cb
Leave how a budget is computed to the party that applies it
KonstantinMirin Oct 4, 2026
3647b1e
Charge a metered purchase once, at purchase, in the protocol
KonstantinMirin Oct 4, 2026
3768bba
Drop metered settlement from the Go SDK
KonstantinMirin Oct 4, 2026
288605e
Drop metered settlement from the Python SDK
KonstantinMirin Oct 4, 2026
e1f0614
Drop metered settlement from the TypeScript SDK
KonstantinMirin Oct 4, 2026
e2f4217
Unmap the removed settlement symbols and regenerate the parity matrix
KonstantinMirin Oct 4, 2026
4bae258
Describe the final metered purchase charge in the docs and changelogs
KonstantinMirin Oct 4, 2026
128467d
Refuse a catalog call with a failed signature as request_auth_failure…
KonstantinMirin Oct 4, 2026
f803e8d
State who a critical extension is for, and add UNKNOWN_CRITICAL_EXTEN…
KonstantinMirin Oct 4, 2026
313b230
Forward supported_profiles through the Broker without routing by them
KonstantinMirin Oct 4, 2026
8767e2d
State the catalog push refusals, and add EXCHANGE_NOT_LISTED in the p…
KonstantinMirin Oct 4, 2026
da45588
Refuse a mis-addressed request before processing, for every RPC, in t…
KonstantinMirin Oct 4, 2026
6437680
Name the resources RemoveResources removes by domain and path in the …
KonstantinMirin Oct 4, 2026
040748c
Describe restrictions as declared terms the Exchange never enforces i…
KonstantinMirin Oct 4, 2026
f4f424e
Match term scopes against the requester's signed request in the protocol
KonstantinMirin Oct 4, 2026
9a4dba2
Align the CoMP, self-push and custodied-signing passages in the docs
KonstantinMirin Oct 4, 2026
80e0d99
Deprecate PushResourcesRequest.caller_id as never needed in the protocol
KonstantinMirin Oct 4, 2026
9295ed4
Keep caller_id's deprecation in its comment until implementations sto…
KonstantinMirin Oct 4, 2026
a383c53
Describe a metered purchase's final charge where the SDKs still said …
KonstantinMirin Oct 4, 2026
6c7d47e
Describe only the final state in the Unreleased changelog
KonstantinMirin Oct 4, 2026
78bc9cc
Drop the reservation of a Pricing field that was never released
KonstantinMirin Oct 4, 2026
c090147
Name the admin client factory as the parity matrix's 17th divergence
KonstantinMirin Oct 4, 2026
fb885f4
State that revocation is scoped to the signer, and the redirect rule …
KonstantinMirin Oct 4, 2026
ac1d8df
Merge the Web Bot Auth profile into the SDK harness branch
KonstantinMirin Oct 4, 2026
946df8c
State the Web Bot Auth profile in the proto comments
KonstantinMirin Oct 4, 2026
2789ed8
Answer an agent with no account NOT_FOUND, and pass MCP tool errors t…
KonstantinMirin Oct 4, 2026
8f4ffe6
State that discovery has no side effects, and the report and relayed-…
KonstantinMirin Oct 4, 2026
8519126
Sign and verify Go requests under the Web Bot Auth profile
KonstantinMirin Oct 4, 2026
6445866
Describe the Web Bot Auth profile as shipped, in the changelog and th…
KonstantinMirin Oct 4, 2026
0a810c2
Record the Web Bot Auth readings the SDKs chose in the design history
KonstantinMirin Oct 4, 2026
4927be3
Sign and verify TypeScript requests under the Web Bot Auth profile
KonstantinMirin Oct 4, 2026
1761bbb
Test interop with Cloudflare's web-bot-auth library
KonstantinMirin Oct 4, 2026
4710fb9
Sign and verify Python requests under the Web Bot Auth profile
KonstantinMirin Oct 4, 2026
20b3554
Regenerate the parity matrix for the TypeScript replays
KonstantinMirin Oct 4, 2026
83616dd
Name the resolver, delivery-proof and removed TypeScript changes in t…
KonstantinMirin Oct 4, 2026
514a5f3
Describe the four-header delivery proof in the agent SDK page and par…
KonstantinMirin Oct 4, 2026
b170f25
Name the refusing party, specify the MCP tool error, and state the ho…
KonstantinMirin Oct 5, 2026
47c6939
Verify delivery proofs in Go, accept a superset, and sign at the cloc…
KonstantinMirin Oct 5, 2026
ae80817
Accept a superset delivery proof in Python, and sign at the clock's time
KonstantinMirin Oct 5, 2026
90df509
State the delivery-proof minimum, the clock window and the plaintext-…
KonstantinMirin Oct 5, 2026
e258584
Accept a delivery-proof superset in TypeScript and follow the Go veri…
KonstantinMirin Oct 5, 2026
5766ec1
Typecheck the TypeScript SDK under the Workers types and split an edg…
KonstantinMirin Oct 5, 2026
6cb3902
Remove the plaintext scheme option from the Python key resolver
KonstantinMirin Oct 5, 2026
ace9a15
Fetch WBA directories over https only and pin the proof base-build re…
KonstantinMirin Oct 5, 2026
f66542d
Merge the TypeScript round: delivery-proof superset, edge runtimes an…
KonstantinMirin Oct 5, 2026
f02a0b2
Export the edge resolvers entry from the repository root and record t…
KonstantinMirin Oct 5, 2026
7fd0887
Compile the TypeScript strict validators at build time and pass the E…
KonstantinMirin Oct 5, 2026
1b3eb30
Make the TypeScript edge entry tree-shakeable
KonstantinMirin Oct 5, 2026
91c4c12
Record the build-time strict check, the directory Ed25519 option and …
KonstantinMirin Oct 5, 2026
74b0918
Drop the alg newer Node stamps on an exported Ed25519 JWK before web-…
legendko Oct 9, 2026
ba42c3e
Build the docs site in the local gate, and let the changelog name the…
legendko Oct 9, 2026
585c59e
Answer revocation for one directory's own list, in all three SDKs
legendko Oct 9, 2026
0d27b88
Record directory-scoped revocation in the changelog and design history
legendko Oct 9, 2026
0054f59
Bound every TypeScript document read in the reader, whatever transpor…
legendko Oct 9, 2026
0a63422
Record the TypeScript reader's own bounds in the changelog and design…
legendko Oct 9, 2026
a8d8f4a
Describe the ingestion token estimate as a sizing input, never an off…
legendko Oct 9, 2026
e1c4b9a
State that the hop cap counts every signature and that max_hops is ca…
legendko Oct 9, 2026
86949bc
Drop the forwarding-chain framing from the docs and state the hop cap…
legendko Oct 9, 2026
d069217
State that a Broker purchase item refused with no answer has an unkno…
legendko Oct 9, 2026
1157aec
Answer an unknown critical extension on every RPC that carries ext_cr…
legendko Oct 9, 2026
e98e890
Require the requester on a query and a purchase, in the protocol
legendko Oct 9, 2026
4894877
Tell a relayed request from a direct one by the requester and the sig…
legendko Oct 9, 2026
40b40d7
Make the docs' request samples sign as their requester and read field…
legendko Oct 9, 2026
b9d5f44
Rewrite the operator verification guidance as one ordered checklist t…
legendko Oct 9, 2026
f666e92
List what breaks against v1.0.8 in the changelog
legendko Oct 9, 2026
0249e9a
Merge main into the SDK harness branch
legendko Oct 9, 2026
1623746
Record in the design history why a Broker signs alone
legendko Oct 12, 2026
3085595
Mark the design-history passages the Broker and profile changes super…
legendko Oct 12, 2026
c0fd950
Mark the purchase, price and requester passages superseded in the des…
legendko Oct 12, 2026
fa4fd61
Correct the SDK comments that verified an acceptance against the call…
legendko Oct 12, 2026
750991e
Accept a request, proof or directory signature that carries no alg, i…
legendko Oct 13, 2026
8327cc4
List where the profile departs from Web Bot Auth, and let a verifier …
legendko Oct 13, 2026
b02dad4
Make a purchase a Broker relays the agent's, and its idempotency key …
legendko Oct 13, 2026
b891864
Drop the Broker's report and dispute relay, and bill the agent, in th…
legendko Oct 13, 2026
dc8763c
State that a requester's scopes are its own statement, in the protocol
legendko Oct 13, 2026
a6c7597
Answer a query a Broker originated as if it carried no delegation, in…
legendko Oct 13, 2026
a0b1341
Make the subscription examples state the scope their term requires
legendko Oct 13, 2026
5c84e8b
Name the agent a Broker verified on the queries it originates, and re…
legendko Oct 13, 2026
8bff471
Read a document on a runtime without AbortController, as Fastly Compu…
legendko Oct 14, 2026
006b71b
Record that the TypeScript document read needs no AbortController, in…
legendko Oct 14, 2026
69c7a9a
Name a missing document and a refused redirect in the document reads,…
legendko Oct 14, 2026
3835f96
Record the named read failures and the directory read clocks, in the …
legendko Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 16 additions & 12 deletions .github/workflows/sdk-types-ci.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
name: sdk-types-ci

# Drift gate for the generated TYPES EXPORT (Pydantic + Zod). Regenerates from the
# proto via scripts/gen-sdk-types.sh and fails if the committed output differs — the
# Drift gate for the generated TYPES EXPORT (Pydantic + Zod) and the published JSON
# Schemas (gen/jsonschema/). Regenerates from the proto via scripts/gen-sdk-types.sh and
# fails if the committed output differs — the
# same regenerate-and-diff contract as the gen/ drift gate, for the SDK types. Runs
# only when the proto, the descriptor, the generators, or the committed output change.
on:
Expand All @@ -16,6 +17,7 @@ on:
- 'conformance/**'
- 'gen/python/**'
- 'gen/ts/**'
- 'gen/jsonschema/**'
- 'sdk/ts/**'
- 'sdk/python/**'
# The repo-root package.json is the map a CONSUMER resolves through (npm has
Expand Down Expand Up @@ -60,17 +62,19 @@ jobs:
- name: regenerate types export
run: ./scripts/gen-sdk-types.sh

# The whole generated wire/ directories, so a NEW generated file (e.g. wire/unique.py)
# is gated the day it is emitted. The untracked sweep is load-bearing: `git diff` cannot
# see a file that was generated but never committed, so a file list alone passes green.
# wire/base.py and wire/base.ts are hand-written seams (never regenerated, so they cannot
# drift); the vocab constants are generated by buf and gated separately.
# The whole generated wire/ directories and the published JSON Schemas, so a NEW
# generated file (e.g. wire/unique.py, or the schema of a new message) is gated the day
# it is emitted. The untracked sweep is load-bearing: `git diff` cannot see a file that
# was generated but never committed, so a file list alone passes green. wire/base.py,
# wire/base.ts, wire/schemas.py and gen/jsonschema/{jsonschema.go,README.md} are
# hand-written (never regenerated, so they cannot drift); the vocab constants are
# generated by buf and gated separately.
- name: assert no drift
run: |
if ! git diff --exit-code -- gen/python/wire gen/ts/wire \
|| [ -n "$(git ls-files --others --exclude-standard -- gen/python/wire gen/ts/wire)" ]; then
echo "::error::Generated types export is out of sync with the proto. Run scripts/gen-sdk-types.sh and commit gen/python/wire/ + gen/ts/wire/."
git status --short -- gen/python/wire gen/ts/wire
if ! git diff --exit-code -- gen/python/wire gen/ts/wire gen/ts/strict gen/jsonschema \
|| [ -n "$(git ls-files --others --exclude-standard -- gen/python/wire gen/ts/wire gen/ts/strict gen/jsonschema)" ]; then
echo "::error::Generated types export is out of sync with the proto. Run scripts/gen-sdk-types.sh and commit gen/python/wire/ + gen/ts/wire/ + gen/ts/strict/ + gen/jsonschema/."
git status --short -- gen/python/wire gen/ts/wire gen/ts/strict gen/jsonschema
exit 1
fi

Expand All @@ -81,7 +85,7 @@ jobs:
# protovalidate by the Go conformance suite (proto-ci) and gated for drift there.
- name: Python (Pydantic) parity
run: |
python -m pip install -q "pydantic>=2.0" pytest
python -m pip install -q "pydantic>=2.0" "jsonschema>=4.23" pytest
PYTHONPATH=gen/python pytest gen/python/tests -q

# `npm test` here typechecks wire/ and vocab/ at target ES2020 with the default
Expand Down
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,23 @@ from wire.models import Offer, Pricing
from vocab import pricingunits
```

### JSON Schema

The same generator run also emits one self-contained JSON Schema (draft 2020-12) per
message under [`gen/jsonschema/`](gen/jsonschema), named by the fully-qualified message
name, in a default and a strict variant. The strict variant refuses unknown fields at
every depth, so a conformance check can catch an unknown or misspelled field. All three
packages ship them: the Go module as that directory (plus `jsonschema.Load` and
`jsonschema.FS` in package `github.com/FORA-Protocol/protocol/gen/jsonschema`), the
Python package through `wire.schemas.load(name, strict=...)`, and the npm package under
`@fora-protocol/sdk/jsonschema/*`. The [schemas' README](gen/jsonschema/README.md)
records how they treat field naming, `google.protobuf.Struct` and 64-bit integers.

```python
from wire import schemas
schema = schemas.load("fora.v1.ResourceResponse", strict=True)
```

## Protocol SDK

Beyond the generated wire types, the repo ships a hand-written **protocol SDK** in all
Expand Down
Loading
Loading