@synapsor/runner 1.4.122 → 1.5.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 (61) hide show
  1. package/CHANGELOG.md +71 -19
  2. package/README.md +56 -46
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/local-ui.d.ts.map +1 -1
  5. package/dist/runner.mjs +14531 -8137
  6. package/dist/runtime.d.ts +50 -0
  7. package/dist/runtime.d.ts.map +1 -0
  8. package/dist/runtime.mjs +15066 -0
  9. package/docs/README.md +19 -3
  10. package/docs/capability-authoring.md +17 -1
  11. package/docs/contract-review.md +33 -0
  12. package/docs/database-enforced-scope.md +273 -0
  13. package/docs/dependency-license-inventory.md +6 -2
  14. package/docs/doctor.md +17 -0
  15. package/docs/effect-regression.md +142 -0
  16. package/docs/getting-started-own-database.md +7 -0
  17. package/docs/local-mode.md +7 -3
  18. package/docs/mcp-apps.md +188 -0
  19. package/docs/mcp-audit.md +54 -0
  20. package/docs/mcp-client-setup.md +16 -4
  21. package/docs/mcp-clients.md +8 -0
  22. package/docs/production.md +8 -0
  23. package/docs/release-notes.md +67 -11
  24. package/docs/release-policy.md +9 -5
  25. package/docs/runner-config-reference.md +25 -0
  26. package/docs/schema-api-candidates.md +68 -0
  27. package/docs/security-boundary.md +14 -1
  28. package/docs/shadow-studies.md +198 -0
  29. package/examples/mcp-postgres-billing-app-handler/app-handler.mjs +9 -1
  30. package/examples/mcp-postgres-billing-app-handler/schema.sql +11 -0
  31. package/examples/mcp-postgres-billing-app-handler/synapsor-handler.mjs +3 -0
  32. package/examples/raw-sql-vs-synapsor/Makefile +2 -2
  33. package/examples/raw-sql-vs-synapsor/README.md +6 -4
  34. package/examples/support-billing-agent/Makefile +5 -1
  35. package/examples/support-billing-agent/README.md +39 -5
  36. package/examples/support-billing-agent/db/schema.sql +88 -1
  37. package/examples/support-billing-agent/db/seed.sql +15 -15
  38. package/examples/support-billing-agent/scripts/run-demo.sh +4 -0
  39. package/examples/support-billing-agent/scripts/run-evaluation.sh +62 -0
  40. package/examples/support-billing-agent/shadow-study/cases.jsonl +6 -0
  41. package/examples/support-billing-agent/shadow-study/outcomes.jsonl +2 -0
  42. package/examples/support-billing-agent/synapsor.runner.json +17 -5
  43. package/fixtures/contracts/capability-surface-fitness.contract.json +190 -0
  44. package/fixtures/effects/changed/eff_support_late_fee_v1.result.json +58 -0
  45. package/fixtures/effects/dataset.json +8 -0
  46. package/fixtures/effects/results/eff_support_late_fee_v1.result.json +59 -0
  47. package/fixtures/effects/support-late-fee.effect.json +71 -0
  48. package/fixtures/generators/drizzle/malicious.ts +11 -0
  49. package/fixtures/generators/drizzle/schema.ts +12 -0
  50. package/fixtures/generators/openapi/external-ref.yaml +15 -0
  51. package/fixtures/generators/openapi/openapi.yaml +81 -0
  52. package/fixtures/generators/prisma/schema.prisma +34 -0
  53. package/package.json +13 -2
  54. package/schemas/effect-dataset.schema.json +19 -0
  55. package/schemas/effect-fixture.schema.json +191 -0
  56. package/schemas/effect-result.schema.json +52 -0
  57. package/schemas/mcp-audit-candidates.schema.json +41 -0
  58. package/schemas/mcp-audit-report.schema.json +104 -0
  59. package/schemas/schema-candidate-review.schema.json +167 -0
  60. package/schemas/schema-candidates.schema.json +49 -0
  61. package/schemas/synapsor.runner.schema.json +51 -0
@@ -0,0 +1,191 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://synapsor.ai/schemas/effect-fixture.schema.json",
4
+ "title": "Synapsor effect regression fixture",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "fixture_id",
10
+ "fixture_digest",
11
+ "name",
12
+ "business_request",
13
+ "source",
14
+ "evidence",
15
+ "expected"
16
+ ],
17
+ "properties": {
18
+ "$schema": { "type": "string" },
19
+ "schema_version": { "const": "synapsor.effect-fixture.v1" },
20
+ "fixture_id": { "type": "string", "minLength": 1, "maxLength": 256 },
21
+ "fixture_digest": { "$ref": "#/$defs/sha256" },
22
+ "name": { "type": "string", "minLength": 1, "maxLength": 256 },
23
+ "business_request": { "type": "string", "minLength": 1, "maxLength": 2000 },
24
+ "source": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["kind", "reference_id", "captured_digest"],
28
+ "properties": {
29
+ "kind": { "enum": ["replay", "proposal", "shadow_case"] },
30
+ "reference_id": { "type": "string", "minLength": 1, "maxLength": 256 },
31
+ "proposal_id": { "type": "string", "minLength": 1, "maxLength": 256 },
32
+ "captured_digest": { "$ref": "#/$defs/sha256" }
33
+ }
34
+ },
35
+ "evidence": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": [
39
+ "mode",
40
+ "bundle_ids",
41
+ "query_fingerprints",
42
+ "snapshot",
43
+ "source_reads_during_evaluation"
44
+ ],
45
+ "properties": {
46
+ "mode": { "const": "replay_snapshot" },
47
+ "bundle_ids": {
48
+ "type": "array",
49
+ "maxItems": 100,
50
+ "items": { "type": "string", "minLength": 1, "maxLength": 256 }
51
+ },
52
+ "query_fingerprints": {
53
+ "type": "array",
54
+ "maxItems": 100,
55
+ "items": { "$ref": "#/$defs/sha256" }
56
+ },
57
+ "snapshot": { "type": "array", "maxItems": 1000 },
58
+ "source_reads_during_evaluation": { "const": false }
59
+ }
60
+ },
61
+ "expected": { "$ref": "#/$defs/expected" },
62
+ "baseline_history": {
63
+ "type": "array",
64
+ "maxItems": 50,
65
+ "items": {
66
+ "type": "object",
67
+ "additionalProperties": false,
68
+ "required": [
69
+ "actor",
70
+ "reason",
71
+ "accepted_at",
72
+ "previous_expected_digest",
73
+ "accepted_expected_digest"
74
+ ],
75
+ "properties": {
76
+ "actor": { "type": "string", "minLength": 1, "maxLength": 256 },
77
+ "reason": { "type": "string", "minLength": 1, "maxLength": 2000 },
78
+ "accepted_at": { "type": "string", "format": "date-time" },
79
+ "previous_expected_digest": { "$ref": "#/$defs/sha256" },
80
+ "accepted_expected_digest": { "$ref": "#/$defs/sha256" }
81
+ }
82
+ }
83
+ }
84
+ },
85
+ "$defs": {
86
+ "sha256": {
87
+ "type": "string",
88
+ "pattern": "^sha256:[a-f0-9]{64}$"
89
+ },
90
+ "trusted_context": {
91
+ "type": "object",
92
+ "additionalProperties": false,
93
+ "required": ["tenant_id", "principal"],
94
+ "properties": {
95
+ "tenant_id": { "type": "string", "minLength": 1, "maxLength": 256 },
96
+ "principal": { "type": "string", "minLength": 1, "maxLength": 256 },
97
+ "provenance": {
98
+ "enum": [
99
+ "environment",
100
+ "static_dev",
101
+ "http_claims",
102
+ "cloud_session",
103
+ "trusted_session"
104
+ ]
105
+ }
106
+ }
107
+ },
108
+ "target": {
109
+ "type": "object",
110
+ "additionalProperties": false,
111
+ "required": ["business_object", "object_id"],
112
+ "properties": {
113
+ "business_object": { "type": "string", "minLength": 1, "maxLength": 256 },
114
+ "object_id": { "type": "string", "minLength": 1, "maxLength": 256 }
115
+ }
116
+ },
117
+ "diff_value": {
118
+ "type": "object",
119
+ "additionalProperties": false,
120
+ "properties": {
121
+ "before": { "type": ["string", "number", "boolean", "null"] },
122
+ "proposed": { "type": ["string", "number", "boolean", "null"] }
123
+ }
124
+ },
125
+ "policy": {
126
+ "type": "object",
127
+ "additionalProperties": false,
128
+ "required": ["decision"],
129
+ "properties": {
130
+ "decision": {
131
+ "enum": ["pending_review", "auto_approved", "denied", "not_applicable"]
132
+ },
133
+ "required_role": { "type": "string", "minLength": 1, "maxLength": 256 },
134
+ "required_approvals": { "type": "integer", "minimum": 1, "maximum": 10 },
135
+ "reason_code": { "type": "string", "minLength": 1, "maxLength": 256 }
136
+ }
137
+ },
138
+ "proposal": {
139
+ "type": "object",
140
+ "additionalProperties": false,
141
+ "required": ["result_category", "policy"],
142
+ "properties": {
143
+ "result_category": {
144
+ "enum": [
145
+ "proposal_created",
146
+ "policy_denied",
147
+ "unable_to_propose",
148
+ "stale_conflict",
149
+ "invalid_unsafe_scope_attempt"
150
+ ]
151
+ },
152
+ "capability": { "type": "string", "minLength": 1, "maxLength": 256 },
153
+ "contract_version": { "type": "string", "minLength": 1, "maxLength": 256 },
154
+ "target": { "$ref": "#/$defs/target" },
155
+ "diff": {
156
+ "type": "object",
157
+ "maxProperties": 256,
158
+ "additionalProperties": { "$ref": "#/$defs/diff_value" }
159
+ },
160
+ "policy": { "$ref": "#/$defs/policy" },
161
+ "error_code": { "type": "string", "minLength": 1, "maxLength": 256 }
162
+ }
163
+ },
164
+ "expected": {
165
+ "type": "object",
166
+ "additionalProperties": false,
167
+ "required": [
168
+ "capability_calls",
169
+ "trusted_context",
170
+ "proposal",
171
+ "hidden_fields",
172
+ "source_database_changed"
173
+ ],
174
+ "properties": {
175
+ "capability_calls": {
176
+ "type": "array",
177
+ "maxItems": 100,
178
+ "items": { "type": "string", "minLength": 1, "maxLength": 256 }
179
+ },
180
+ "trusted_context": { "$ref": "#/$defs/trusted_context" },
181
+ "proposal": { "$ref": "#/$defs/proposal" },
182
+ "hidden_fields": {
183
+ "type": "array",
184
+ "maxItems": 256,
185
+ "items": { "type": "string", "minLength": 1, "maxLength": 256 }
186
+ },
187
+ "source_database_changed": { "const": false }
188
+ }
189
+ }
190
+ }
191
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://synapsor.ai/schemas/effect-result.schema.json",
4
+ "title": "Synapsor imported effect result",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "fixture_id",
10
+ "capability_calls",
11
+ "trusted_context",
12
+ "proposal",
13
+ "observed_fields",
14
+ "evidence",
15
+ "source_database_changed"
16
+ ],
17
+ "properties": {
18
+ "$schema": { "type": "string" },
19
+ "schema_version": { "const": "synapsor.effect-result.v1" },
20
+ "fixture_id": { "type": "string", "minLength": 1, "maxLength": 256 },
21
+ "capability_calls": {
22
+ "type": "array",
23
+ "maxItems": 100,
24
+ "items": {
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["name"],
28
+ "properties": {
29
+ "name": { "type": "string", "minLength": 1, "maxLength": 256 },
30
+ "args": { "type": "object" }
31
+ }
32
+ }
33
+ },
34
+ "trusted_context": { "$ref": "effect-fixture.schema.json#/$defs/trusted_context" },
35
+ "proposal": { "$ref": "effect-fixture.schema.json#/$defs/proposal" },
36
+ "observed_fields": {
37
+ "type": "array",
38
+ "maxItems": 1000,
39
+ "items": { "type": "string", "minLength": 1, "maxLength": 256 }
40
+ },
41
+ "evidence": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": ["mode", "new_source_reads"],
45
+ "properties": {
46
+ "mode": { "enum": ["fixture", "live"] },
47
+ "new_source_reads": { "type": "boolean" }
48
+ }
49
+ },
50
+ "source_database_changed": { "type": "boolean" }
51
+ }
52
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://synapsor.ai/schemas/mcp-audit-candidates.schema.json",
4
+ "title": "Synapsor MCP Audit Candidate Directory Marker",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "owner",
10
+ "source_digest",
11
+ "activation",
12
+ "deterministic",
13
+ "files"
14
+ ],
15
+ "properties": {
16
+ "schema_version": {
17
+ "const": "synapsor.audit-candidates.v1"
18
+ },
19
+ "owner": {
20
+ "const": "@synapsor/runner"
21
+ },
22
+ "source_digest": {
23
+ "type": "string",
24
+ "pattern": "^sha256:[a-f0-9]{64}$"
25
+ },
26
+ "activation": {
27
+ "const": "blocked_unreviewed"
28
+ },
29
+ "deterministic": {
30
+ "const": true
31
+ },
32
+ "files": {
33
+ "type": "array",
34
+ "minItems": 1,
35
+ "uniqueItems": true,
36
+ "items": {
37
+ "type": "string"
38
+ }
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,104 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://synapsor.ai/schemas/mcp-audit-report.schema.json",
4
+ "title": "Synapsor MCP Audit Report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "target",
10
+ "disclaimer",
11
+ "generated_at",
12
+ "summary",
13
+ "findings"
14
+ ],
15
+ "properties": {
16
+ "schema_version": {
17
+ "const": "synapsor.mcp-audit.v1"
18
+ },
19
+ "target": {
20
+ "type": "string"
21
+ },
22
+ "disclaimer": {
23
+ "const": "This is a static risk review, not proof that an MCP server is secure."
24
+ },
25
+ "generated_at": {
26
+ "type": "string",
27
+ "format": "date-time"
28
+ },
29
+ "summary": {
30
+ "type": "object",
31
+ "additionalProperties": false,
32
+ "required": [
33
+ "tools_inspected",
34
+ "high",
35
+ "medium",
36
+ "low",
37
+ "total_findings"
38
+ ],
39
+ "properties": {
40
+ "tools_inspected": {
41
+ "type": "integer",
42
+ "minimum": 0
43
+ },
44
+ "high": {
45
+ "type": "integer",
46
+ "minimum": 0
47
+ },
48
+ "medium": {
49
+ "type": "integer",
50
+ "minimum": 0
51
+ },
52
+ "low": {
53
+ "type": "integer",
54
+ "minimum": 0
55
+ },
56
+ "total_findings": {
57
+ "type": "integer",
58
+ "minimum": 0
59
+ }
60
+ }
61
+ },
62
+ "findings": {
63
+ "type": "array",
64
+ "items": {
65
+ "type": "object",
66
+ "additionalProperties": false,
67
+ "required": [
68
+ "severity",
69
+ "code",
70
+ "message",
71
+ "evidence",
72
+ "recommendation"
73
+ ],
74
+ "properties": {
75
+ "severity": {
76
+ "enum": [
77
+ "HIGH",
78
+ "MEDIUM",
79
+ "LOW"
80
+ ]
81
+ },
82
+ "code": {
83
+ "type": "string"
84
+ },
85
+ "tool": {
86
+ "type": "string"
87
+ },
88
+ "message": {
89
+ "type": "string"
90
+ },
91
+ "evidence": {
92
+ "type": "array",
93
+ "items": {
94
+ "type": "string"
95
+ }
96
+ },
97
+ "recommendation": {
98
+ "type": "string"
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,167 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://synapsor.ai/schemas/schema-candidate-review.schema.json",
4
+ "title": "Synapsor Schema/API Candidate Review",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "format",
10
+ "source_digest",
11
+ "activation",
12
+ "summary",
13
+ "warnings",
14
+ "objects"
15
+ ],
16
+ "properties": {
17
+ "schema_version": {
18
+ "const": "synapsor.schema-candidates.v1"
19
+ },
20
+ "format": {
21
+ "enum": [
22
+ "prisma",
23
+ "drizzle",
24
+ "openapi"
25
+ ]
26
+ },
27
+ "source_digest": {
28
+ "type": "string",
29
+ "pattern": "^sha256:[a-f0-9]{64}$"
30
+ },
31
+ "activation": {
32
+ "const": "blocked_unreviewed"
33
+ },
34
+ "summary": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": [
38
+ "objects",
39
+ "fields",
40
+ "capabilities",
41
+ "write_candidates"
42
+ ],
43
+ "properties": {
44
+ "objects": {
45
+ "type": "integer",
46
+ "minimum": 0
47
+ },
48
+ "fields": {
49
+ "type": "integer",
50
+ "minimum": 0
51
+ },
52
+ "capabilities": {
53
+ "type": "integer",
54
+ "minimum": 0
55
+ },
56
+ "write_candidates": {
57
+ "type": "integer",
58
+ "minimum": 0
59
+ }
60
+ }
61
+ },
62
+ "warnings": {
63
+ "type": "array",
64
+ "items": {
65
+ "type": "string"
66
+ }
67
+ },
68
+ "objects": {
69
+ "type": "array",
70
+ "items": {
71
+ "type": "object",
72
+ "additionalProperties": false,
73
+ "required": [
74
+ "name",
75
+ "table",
76
+ "structural_primary_key_candidates",
77
+ "potential_tenant_fields",
78
+ "potential_principal_fields",
79
+ "potential_conflict_fields",
80
+ "potentially_sensitive_fields",
81
+ "suggested_kept_out_fields",
82
+ "suggested_visible_fields",
83
+ "possible_actions",
84
+ "uncertain_assumptions",
85
+ "unsupported_or_dynamic"
86
+ ],
87
+ "properties": {
88
+ "name": {
89
+ "type": "string"
90
+ },
91
+ "table": {
92
+ "type": "string"
93
+ },
94
+ "structural_primary_key_candidates": {
95
+ "$ref": "#/$defs/stringArray"
96
+ },
97
+ "potential_tenant_fields": {
98
+ "$ref": "#/$defs/stringArray"
99
+ },
100
+ "potential_principal_fields": {
101
+ "$ref": "#/$defs/stringArray"
102
+ },
103
+ "potential_conflict_fields": {
104
+ "$ref": "#/$defs/stringArray"
105
+ },
106
+ "potentially_sensitive_fields": {
107
+ "$ref": "#/$defs/stringArray"
108
+ },
109
+ "suggested_kept_out_fields": {
110
+ "$ref": "#/$defs/stringArray"
111
+ },
112
+ "suggested_visible_fields": {
113
+ "$ref": "#/$defs/stringArray"
114
+ },
115
+ "possible_actions": {
116
+ "type": "array",
117
+ "items": {
118
+ "type": "object",
119
+ "additionalProperties": false,
120
+ "required": [
121
+ "name",
122
+ "kind",
123
+ "allowed_field_candidates",
124
+ "requires_business_logic",
125
+ "requires_app_owned_handler"
126
+ ],
127
+ "properties": {
128
+ "name": {
129
+ "type": "string"
130
+ },
131
+ "kind": {
132
+ "enum": [
133
+ "read",
134
+ "proposal"
135
+ ]
136
+ },
137
+ "allowed_field_candidates": {
138
+ "$ref": "#/$defs/stringArray"
139
+ },
140
+ "requires_business_logic": {
141
+ "type": "boolean"
142
+ },
143
+ "requires_app_owned_handler": {
144
+ "type": "boolean"
145
+ }
146
+ }
147
+ }
148
+ },
149
+ "uncertain_assumptions": {
150
+ "$ref": "#/$defs/stringArray"
151
+ },
152
+ "unsupported_or_dynamic": {
153
+ "$ref": "#/$defs/stringArray"
154
+ }
155
+ }
156
+ }
157
+ }
158
+ },
159
+ "$defs": {
160
+ "stringArray": {
161
+ "type": "array",
162
+ "items": {
163
+ "type": "string"
164
+ }
165
+ }
166
+ }
167
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://synapsor.ai/schemas/schema-candidates.schema.json",
4
+ "title": "Synapsor Schema/API Candidate Directory Marker",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema_version",
9
+ "owner",
10
+ "format",
11
+ "source_digest",
12
+ "activation",
13
+ "deterministic",
14
+ "files"
15
+ ],
16
+ "properties": {
17
+ "schema_version": {
18
+ "const": "synapsor.schema-candidates.v1"
19
+ },
20
+ "owner": {
21
+ "const": "@synapsor/runner"
22
+ },
23
+ "format": {
24
+ "enum": [
25
+ "prisma",
26
+ "drizzle",
27
+ "openapi"
28
+ ]
29
+ },
30
+ "source_digest": {
31
+ "type": "string",
32
+ "pattern": "^sha256:[a-f0-9]{64}$"
33
+ },
34
+ "activation": {
35
+ "const": "blocked_unreviewed"
36
+ },
37
+ "deterministic": {
38
+ "const": true
39
+ },
40
+ "files": {
41
+ "type": "array",
42
+ "minItems": 1,
43
+ "uniqueItems": true,
44
+ "items": {
45
+ "type": "string"
46
+ }
47
+ }
48
+ }
49
+ }
@@ -394,6 +394,57 @@
394
394
  "queue_limit": { "type": "integer", "minimum": 0, "maximum": 100000 }
395
395
  }
396
396
  },
397
+ "database_scope": {
398
+ "description": "Database-side scope enforcement. application uses Runner predicates; postgres_rls also binds trusted context into transaction-local PostgreSQL settings and requires verified RLS policies.",
399
+ "oneOf": [
400
+ {
401
+ "type": "object",
402
+ "additionalProperties": false,
403
+ "required": ["mode"],
404
+ "properties": {
405
+ "mode": { "const": "application" }
406
+ }
407
+ },
408
+ {
409
+ "type": "object",
410
+ "additionalProperties": false,
411
+ "required": ["mode", "tenant_setting", "principal_setting"],
412
+ "properties": {
413
+ "mode": { "const": "postgres_rls" },
414
+ "tenant_setting": {
415
+ "type": "string",
416
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)+$"
417
+ },
418
+ "principal_setting": {
419
+ "type": "string",
420
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)+$"
421
+ }
422
+ }
423
+ }
424
+ ]
425
+ },
426
+ "credential_scope": {
427
+ "description": "Connection authority. tenant_resolver names an application-supplied resolver; it never embeds credentials.",
428
+ "oneOf": [
429
+ {
430
+ "type": "object",
431
+ "additionalProperties": false,
432
+ "required": ["mode"],
433
+ "properties": {
434
+ "mode": { "const": "shared" }
435
+ }
436
+ },
437
+ {
438
+ "type": "object",
439
+ "additionalProperties": false,
440
+ "required": ["mode", "resolver"],
441
+ "properties": {
442
+ "mode": { "const": "tenant_resolver" },
443
+ "resolver": { "$ref": "#/$defs/identifier" }
444
+ }
445
+ }
446
+ ]
447
+ },
397
448
  "receipts": {
398
449
  "type": "object",
399
450
  "additionalProperties": false,