@stellar-agent-services/protocol 0.0.0-stage → 0.1.0

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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -2
  3. package/dist/canonical-json.d.ts +18 -0
  4. package/dist/canonical-json.d.ts.map +1 -0
  5. package/dist/canonical-json.js +86 -0
  6. package/dist/canonical-json.js.map +1 -0
  7. package/dist/errors.d.ts +85 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +46 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/headers.d.ts +15 -0
  12. package/dist/headers.d.ts.map +1 -0
  13. package/dist/headers.js +29 -0
  14. package/dist/headers.js.map +1 -0
  15. package/dist/index.d.ts +11 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +18 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/jobs.d.ts +62 -0
  20. package/dist/jobs.d.ts.map +1 -0
  21. package/dist/jobs.js +66 -0
  22. package/dist/jobs.js.map +1 -0
  23. package/dist/manifest.d.ts +95 -0
  24. package/dist/manifest.d.ts.map +1 -0
  25. package/dist/manifest.js +144 -0
  26. package/dist/manifest.js.map +1 -0
  27. package/dist/networks.d.ts +19 -0
  28. package/dist/networks.d.ts.map +1 -0
  29. package/dist/networks.js +33 -0
  30. package/dist/networks.js.map +1 -0
  31. package/dist/receipts.d.ts +112 -0
  32. package/dist/receipts.d.ts.map +1 -0
  33. package/dist/receipts.js +35 -0
  34. package/dist/receipts.js.map +1 -0
  35. package/dist/standard.d.ts +25 -0
  36. package/dist/standard.d.ts.map +1 -0
  37. package/dist/standard.js +29 -0
  38. package/dist/standard.js.map +1 -0
  39. package/dist/strkey.d.ts +7 -0
  40. package/dist/strkey.d.ts.map +1 -0
  41. package/dist/strkey.js +56 -0
  42. package/dist/strkey.js.map +1 -0
  43. package/dist/validation-request.d.ts +32 -0
  44. package/dist/validation-request.d.ts.map +1 -0
  45. package/dist/validation-request.js +29 -0
  46. package/dist/validation-request.js.map +1 -0
  47. package/package.json +37 -4
  48. package/schemas/manifest.schema.json +272 -0
  49. package/schemas/validation-request.schema.json +43 -0
  50. package/schemas/verification-receipt.schema.json +149 -0
  51. package/test-vectors/README.md +45 -0
  52. package/test-vectors/binding-hash.json +64 -0
  53. package/test-vectors/canonical-json.json +94 -0
  54. package/test-vectors/challenges.json +245 -0
  55. package/test-vectors/headers.json +37 -0
  56. package/test-vectors/job-states.json +39 -0
  57. package/test-vectors/manifests.json +1322 -0
  58. package/test-vectors/problems.json +15 -0
  59. package/test-vectors/validation-requests.json +98 -0
@@ -0,0 +1,15 @@
1
+ {
2
+ "description": "Error codes from provider-standard.md §6. `problems` maps each HTTP error code to its status and whether the response carries Retry-After. `jobFailures` lists the codes a failed job's `error.code` may take.",
3
+ "problems": {
4
+ "invalid_request": { "status": 400, "retryAfter": false },
5
+ "invalid_input": { "status": 400, "retryAfter": false },
6
+ "service_not_found": { "status": 404, "retryAfter": false },
7
+ "job_not_found": { "status": 404, "retryAfter": false },
8
+ "request_in_progress": { "status": 409, "retryAfter": true },
9
+ "payload_too_large": { "status": 413, "retryAfter": false },
10
+ "idempotency_key_reused": { "status": 422, "retryAfter": false },
11
+ "rate_limited": { "status": 429, "retryAfter": true },
12
+ "unavailable": { "status": 503, "retryAfter": true }
13
+ },
14
+ "jobFailures": ["service_failed", "output_invalid", "timeout", "payment_failed"]
15
+ }
@@ -0,0 +1,98 @@
1
+ {
2
+ "description": "Validation request documents (docs/verification.md). requestHash is the lowercase hex SHA-256 of the RFC 8785 canonical JSON of `document`, and requestUri is \"data:application/json;base64,\" followed by those same bytes in base64 (RFC 4648 §4, padded). `canonical` shows the bytes. Each `invalid` case applies `patch` (RFC 6902) to the first case's document, and fails the validation request JSON Schema.",
3
+ "cases": [
4
+ {
5
+ "name": "the example in verification.md",
6
+ "document": {
7
+ "standard": "stellar-agent-services/provider@1",
8
+ "type": "validation-request",
9
+ "agentId": 42,
10
+ "network": "stellar:testnet",
11
+ "manifest": { "url": "https://api.example.com/.well-known/stellar-agent-services.json" },
12
+ "validator": "GBZSBASBFMV5RGKPRIPCB5QQVAJ35IXKMTF2A2766MOA4ZHQ7MLSIPXU",
13
+ "requestedAt": "2026-10-26T10:00:00Z"
14
+ },
15
+ "canonical": "{\"agentId\":42,\"manifest\":{\"url\":\"https://api.example.com/.well-known/stellar-agent-services.json\"},\"network\":\"stellar:testnet\",\"requestedAt\":\"2026-10-26T10:00:00Z\",\"standard\":\"stellar-agent-services/provider@1\",\"type\":\"validation-request\",\"validator\":\"GBZSBASBFMV5RGKPRIPCB5QQVAJ35IXKMTF2A2766MOA4ZHQ7MLSIPXU\"}",
16
+ "requestHash": "da09f810e3a7d9a7d858f6ecc2848bc94352d248a4be859b37660d22f9415a23",
17
+ "requestUri": "data:application/json;base64,eyJhZ2VudElkIjo0MiwibWFuaWZlc3QiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vLndlbGwta25vd24vc3RlbGxhci1hZ2VudC1zZXJ2aWNlcy5qc29uIn0sIm5ldHdvcmsiOiJzdGVsbGFyOnRlc3RuZXQiLCJyZXF1ZXN0ZWRBdCI6IjIwMjYtMTAtMjZUMTA6MDA6MDBaIiwic3RhbmRhcmQiOiJzdGVsbGFyLWFnZW50LXNlcnZpY2VzL3Byb3ZpZGVyQDEiLCJ0eXBlIjoidmFsaWRhdGlvbi1yZXF1ZXN0IiwidmFsaWRhdG9yIjoiR0JaU0JBU0JGTVY1UkdLUFJJUENCNVFRVkFKMzVJWEtNVEYyQTI3NjZNT0E0WkhRN01MU0lQWFUifQ=="
18
+ },
19
+ {
20
+ "name": "key order does not matter",
21
+ "document": {
22
+ "requestedAt": "2026-10-26T10:00:00Z",
23
+ "validator": "GBZSBASBFMV5RGKPRIPCB5QQVAJ35IXKMTF2A2766MOA4ZHQ7MLSIPXU",
24
+ "manifest": { "url": "https://api.example.com/.well-known/stellar-agent-services.json" },
25
+ "network": "stellar:testnet",
26
+ "agentId": 42,
27
+ "type": "validation-request",
28
+ "standard": "stellar-agent-services/provider@1"
29
+ },
30
+ "canonical": "{\"agentId\":42,\"manifest\":{\"url\":\"https://api.example.com/.well-known/stellar-agent-services.json\"},\"network\":\"stellar:testnet\",\"requestedAt\":\"2026-10-26T10:00:00Z\",\"standard\":\"stellar-agent-services/provider@1\",\"type\":\"validation-request\",\"validator\":\"GBZSBASBFMV5RGKPRIPCB5QQVAJ35IXKMTF2A2766MOA4ZHQ7MLSIPXU\"}",
31
+ "requestHash": "da09f810e3a7d9a7d858f6ecc2848bc94352d248a4be859b37660d22f9415a23",
32
+ "requestUri": "data:application/json;base64,eyJhZ2VudElkIjo0MiwibWFuaWZlc3QiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vLndlbGwta25vd24vc3RlbGxhci1hZ2VudC1zZXJ2aWNlcy5qc29uIn0sIm5ldHdvcmsiOiJzdGVsbGFyOnRlc3RuZXQiLCJyZXF1ZXN0ZWRBdCI6IjIwMjYtMTAtMjZUMTA6MDA6MDBaIiwic3RhbmRhcmQiOiJzdGVsbGFyLWFnZW50LXNlcnZpY2VzL3Byb3ZpZGVyQDEiLCJ0eXBlIjoidmFsaWRhdGlvbi1yZXF1ZXN0IiwidmFsaWRhdG9yIjoiR0JaU0JBU0JGTVY1UkdLUFJJUENCNVFRVkFKMzVJWEtNVEYyQTI3NjZNT0E0WkhRN01MU0lQWFUifQ=="
33
+ },
34
+ {
35
+ "name": "the same instant with milliseconds is another request: hash the document as sent",
36
+ "document": {
37
+ "standard": "stellar-agent-services/provider@1",
38
+ "type": "validation-request",
39
+ "agentId": 42,
40
+ "network": "stellar:testnet",
41
+ "manifest": { "url": "https://api.example.com/.well-known/stellar-agent-services.json" },
42
+ "validator": "GBZSBASBFMV5RGKPRIPCB5QQVAJ35IXKMTF2A2766MOA4ZHQ7MLSIPXU",
43
+ "requestedAt": "2026-10-26T10:00:00.000Z"
44
+ },
45
+ "canonical": "{\"agentId\":42,\"manifest\":{\"url\":\"https://api.example.com/.well-known/stellar-agent-services.json\"},\"network\":\"stellar:testnet\",\"requestedAt\":\"2026-10-26T10:00:00.000Z\",\"standard\":\"stellar-agent-services/provider@1\",\"type\":\"validation-request\",\"validator\":\"GBZSBASBFMV5RGKPRIPCB5QQVAJ35IXKMTF2A2766MOA4ZHQ7MLSIPXU\"}",
46
+ "requestHash": "e907d58e3935ea1ee06632896f141c3bfd6c82f95d81a4392bacf44a77923ea4",
47
+ "requestUri": "data:application/json;base64,eyJhZ2VudElkIjo0MiwibWFuaWZlc3QiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vLndlbGwta25vd24vc3RlbGxhci1hZ2VudC1zZXJ2aWNlcy5qc29uIn0sIm5ldHdvcmsiOiJzdGVsbGFyOnRlc3RuZXQiLCJyZXF1ZXN0ZWRBdCI6IjIwMjYtMTAtMjZUMTA6MDA6MDAuMDAwWiIsInN0YW5kYXJkIjoic3RlbGxhci1hZ2VudC1zZXJ2aWNlcy9wcm92aWRlckAxIiwidHlwZSI6InZhbGlkYXRpb24tcmVxdWVzdCIsInZhbGlkYXRvciI6IkdCWlNCQVNCRk1WNVJHS1BSSVBDQjVRUVZBSjM1SVhLTVRGMkEyNzY2TU9BNFpIUTdNTFNJUFhVIn0="
48
+ },
49
+ {
50
+ "name": "a request on pubnet, for a manifest at a path of its own",
51
+ "document": {
52
+ "standard": "stellar-agent-services/provider@1",
53
+ "type": "validation-request",
54
+ "agentId": 7,
55
+ "network": "stellar:pubnet",
56
+ "manifest": { "url": "https://agents.example.org/translate/manifest.json" },
57
+ "validator": "GBH3JLK366N4L5XCLJRCYLE6K6K3PUWBBEOLNBJMLORSKUNR5WY2IRKZ",
58
+ "requestedAt": "2026-11-02T08:30:15.250+03:00"
59
+ },
60
+ "canonical": "{\"agentId\":7,\"manifest\":{\"url\":\"https://agents.example.org/translate/manifest.json\"},\"network\":\"stellar:pubnet\",\"requestedAt\":\"2026-11-02T08:30:15.250+03:00\",\"standard\":\"stellar-agent-services/provider@1\",\"type\":\"validation-request\",\"validator\":\"GBH3JLK366N4L5XCLJRCYLE6K6K3PUWBBEOLNBJMLORSKUNR5WY2IRKZ\"}",
61
+ "requestHash": "80ff768c544ccf2fca83c1d7ddd12fa7b2f1956841b792e508e5e3d9c7076da0",
62
+ "requestUri": "data:application/json;base64,eyJhZ2VudElkIjo3LCJtYW5pZmVzdCI6eyJ1cmwiOiJodHRwczovL2FnZW50cy5leGFtcGxlLm9yZy90cmFuc2xhdGUvbWFuaWZlc3QuanNvbiJ9LCJuZXR3b3JrIjoic3RlbGxhcjpwdWJuZXQiLCJyZXF1ZXN0ZWRBdCI6IjIwMjYtMTEtMDJUMDg6MzA6MTUuMjUwKzAzOjAwIiwic3RhbmRhcmQiOiJzdGVsbGFyLWFnZW50LXNlcnZpY2VzL3Byb3ZpZGVyQDEiLCJ0eXBlIjoidmFsaWRhdGlvbi1yZXF1ZXN0IiwidmFsaWRhdG9yIjoiR0JIM0pMSzM2Nk40TDVYQ0xKUkNZTEU2SzZLM1BVV0JCRU9MTkJKTUxPUlNLVU5SNVdZMklSS1oifQ=="
63
+ },
64
+ {
65
+ "name": "unknown fields are hashed too, as UTF-8",
66
+ "document": {
67
+ "standard": "stellar-agent-services/provider@1",
68
+ "type": "validation-request",
69
+ "agentId": 42,
70
+ "network": "stellar:testnet",
71
+ "manifest": { "url": "https://api.example.com/.well-known/stellar-agent-services.json" },
72
+ "validator": "GBZSBASBFMV5RGKPRIPCB5QQVAJ35IXKMTF2A2766MOA4ZHQ7MLSIPXU",
73
+ "requestedAt": "2026-10-26T10:00:00Z",
74
+ "note": "Doğrulama isteği 🌍"
75
+ },
76
+ "canonical": "{\"agentId\":42,\"manifest\":{\"url\":\"https://api.example.com/.well-known/stellar-agent-services.json\"},\"network\":\"stellar:testnet\",\"note\":\"Doğrulama isteği 🌍\",\"requestedAt\":\"2026-10-26T10:00:00Z\",\"standard\":\"stellar-agent-services/provider@1\",\"type\":\"validation-request\",\"validator\":\"GBZSBASBFMV5RGKPRIPCB5QQVAJ35IXKMTF2A2766MOA4ZHQ7MLSIPXU\"}",
77
+ "requestHash": "393342c8c2e18374ce458f4ea5eeeba82014e912652a52ed2ab6101d96774b41",
78
+ "requestUri": "data:application/json;base64,eyJhZ2VudElkIjo0MiwibWFuaWZlc3QiOnsidXJsIjoiaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vLndlbGwta25vd24vc3RlbGxhci1hZ2VudC1zZXJ2aWNlcy5qc29uIn0sIm5ldHdvcmsiOiJzdGVsbGFyOnRlc3RuZXQiLCJub3RlIjoiRG/En3J1bGFtYSBpc3RlxJ9pIPCfjI0iLCJyZXF1ZXN0ZWRBdCI6IjIwMjYtMTAtMjZUMTA6MDA6MDBaIiwic3RhbmRhcmQiOiJzdGVsbGFyLWFnZW50LXNlcnZpY2VzL3Byb3ZpZGVyQDEiLCJ0eXBlIjoidmFsaWRhdGlvbi1yZXF1ZXN0IiwidmFsaWRhdG9yIjoiR0JaU0JBU0JGTVY1UkdLUFJJUENCNVFRVkFKMzVJWEtNVEYyQTI3NjZNT0E0WkhRN01MU0lQWFUifQ=="
79
+ }
80
+ ],
81
+ "invalid": [
82
+ { "name": "no type", "patch": [{ "op": "remove", "path": "/type" }] },
83
+ { "name": "another type", "patch": [{ "op": "replace", "path": "/type", "value": "verification-receipt" }] },
84
+ { "name": "another major version", "patch": [{ "op": "replace", "path": "/standard", "value": "stellar-agent-services/provider@2" }] },
85
+ { "name": "an agent id above u32", "patch": [{ "op": "replace", "path": "/agentId", "value": 4294967296 }] },
86
+ { "name": "a negative agent id", "patch": [{ "op": "replace", "path": "/agentId", "value": -1 }] },
87
+ { "name": "an agent id as a string", "patch": [{ "op": "replace", "path": "/agentId", "value": "42" }] },
88
+ { "name": "a network the standard does not name", "patch": [{ "op": "replace", "path": "/network", "value": "stellar:futurenet" }] },
89
+ { "name": "the manifest as a bare URL", "patch": [{ "op": "replace", "path": "/manifest", "value": "https://api.example.com/.well-known/stellar-agent-services.json" }] },
90
+ { "name": "a manifest without a URL", "patch": [{ "op": "replace", "path": "/manifest", "value": {} }] },
91
+ { "name": "a manifest served over http://", "patch": [{ "op": "replace", "path": "/manifest/url", "value": "http://api.example.com/.well-known/stellar-agent-services.json" }] },
92
+ { "name": "a manifest URL with a space", "patch": [{ "op": "replace", "path": "/manifest/url", "value": "https://api.example.com/my manifest.json" }] },
93
+ { "name": "a validator that is a contract", "patch": [{ "op": "replace", "path": "/validator", "value": "CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA" }] },
94
+ { "name": "no validator", "patch": [{ "op": "remove", "path": "/validator" }] },
95
+ { "name": "a time that is not RFC 3339", "patch": [{ "op": "replace", "path": "/requestedAt", "value": "26.10.2026 10:00" }] },
96
+ { "name": "no requestedAt", "patch": [{ "op": "remove", "path": "/requestedAt" }] }
97
+ ]
98
+ }